📄 unzip.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2003.9 *
; * File Name : UNZIP.ASM *
; ***************************************************************************
case off
PW 128 ; .LST's page width = 128 character.
EXTERNS ON ; Make all labels public.
include ST2202.def ; Include ST2100 I/O define.
include Data.def ; Data RAM define.
include Bios.h
include Graphics.h
include Keydef.def
include Graph.def
INCLUDE ST2202.MAC
INCLUDE CNDICT.INC
INCLUDE XYHADDR.H
; ***************************************************************************
PUBLIC UNZIP_A_CHWORD
PUBLIC UNZIP_N_CHWORD
PUBLIC BACKUP_CHWORD_PTR
PUBLIC RESTORE_CHWORD_PTR
PUBLIC RECORD_UZ_PTR
PUBLIC LOAD_UZ_PTR
PUBLIC BACKUP_FPTR
PUBLIC RESTORE_FPTR
PUBLIC UNZIP_GET_ADDR
PUBLIC UNZIP_GET_ADDRA
PUBLIC UNZIP_LEMMA_HEAD
PUBLIC FIND_IDIOM_ADDR
PUBLIC UNZIP_A_IDIOM
; ***************************************************************************
UNZIP_ONE_AT_ONCE EQU 1
DEBUGGING EQU 0
; ***************************************************************************
CODE
PS0d .Section
BankNo EQU CH_Idiom_Bank
; ***************************************************************************
; * Decompressed a Chinese word. *
; * INPUT: _UNZIP_CH_H,_UNZIP_CH_L *
; * OUTPUT: *
; ***************************************************************************
; ***************************************************************************
UNZIP_b_TO_B:
DB 0,0,0,0,02,02,02,02,02,03,03,03,03,03,03,03,03,04,04,04
; 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19
; ***************************************************************************
UNZIP_GET_ADDR:
SEC ;
LDA <_UNZIP_CH_H ;
SBC #$B0 ;
STA <_MATH_OPER0_L ; OPER0 = CH_H-0xB0;
STZ <_MATH_OPER0_H ;
LDA #94 ;
STA <_MATH_OPER1_L ; OPER1 = 94.
STZ <_MATH_OPER1_H ;
JSR __uint_mult_uint ; _uint_mult_uint();
SEC ;
LDA <_UNZIP_CH_L ; CH_L -= 0xA1;
SBC #$A1 ;
CLC ;
ADC <_MATH_RESULT_0 ;
STA <_MATH_OPER0_L ;
LDA <_MATH_RESULT_1 ;
ADC #0 ;
STA <_MATH_OPER0_H ; OPER0 = MATH_RESULT+CH_L;
LDA #3 ;
STA <_MATH_OPER1_L ;
STZ <_MATH_OPER1_H ; OPER1 = 3;
JSR __uint_mult_uint ; _uint_mult_uint;
LOAD_LONG_FROM_CONST <_UNZIP_FPTR_0,CHINDEX_ADDR
LONG_ADD_WORD <_UNZIP_FPTR_0,<_MATH_RESULT_0
UNZIP_GET_ADDRA:
LONG_2_DDR_REG <_UNZIP_FPTR_0
LDA <_UNZIP_FPTR_0+2
STA <_DRRL
LDA <_UNZIP_FPTR_0+3
STA <_DRRH
JSR GET_FPTR_BYTE
STA <_UNZIP_PTR_B0
JSR GET_FPTR_BYTE
STA <_UNZIP_PTR_B1
JSR GET_FPTR_BYTE
STA <_UNZIP_PTR_B2
STZ <_UNZIP_PTR_B3
;startuart
;putsio <_Unzip_Ptr_B0
;putsio <_Unzip_Ptr_B0+1
;putsio <_Unzip_Ptr_B0+2
;putsio <_Unzip_Ptr_B0+3
;putsio #77h
;putsio #77h
;putsio #77h
;putsio #77h
RTS
; ***************************************************************************
UNZIP_LEMMA_HEAD:
JSR BACKUP_CHWORD_PTR
LONG_ADD_CONST <_UNZIP_PTR_B0,CHIDIOM_ADDR
LONG_2_DDR_REG <_UNZIP_PTR_B0
LDA <_UNZIP_PTR_B2
STA <_DRRL
LDA <_UNZIP_PTR_B3
STA <_DRRH
JSR GET_BPTR_BYTE
STA <_DATA_SIZE_0
STA BK_DATA_SIZE_0
JSR GET_BPTR_BYTE
STA <_DATA_SIZE_1
STA BK_DATA_SIZE_1
JSR GET_BPTR_BYTE
STA BBK_DATA_SIZE_0
JSR GET_BPTR_BYTE
STA BBK_DATA_SIZE_1
STZ <_BIT_SIZE
STZ <_ZIPPED_DATA
STZ <_ZIPPED_CODE_L
STZ <_ZIPPED_CODE_M
STZ <_ZIPPED_CODE_H
STZ <_UNZIP_COUNT
RTS
; ***************************************************************************
UNZIP_A_CHWORD:
?UNZIP_A_CHWORD_0: ;
JSR GET_BPTR_BYTE ;
STA <_ZIPPED_DATA ; _ZIPPED_DATA = *_UNZIP_PTR_B0;
LDX #8 ; X = 8;
STX <_UNZIP_LOOP_X ;
?UNZIP_A_CHWORD_000: ;
ASL <_ZIPPED_DATA ;
ROL <_ZIPPED_CODE_L ;
ROL <_ZIPPED_CODE_M ;
ROL <_ZIPPED_CODE_H ; CODE_H <- CODE_M <- CODE_L <- D <- 0
INC <_BIT_SIZE ; _BIT_SIZE++;
LDY <_BIT_SIZE ; Y = _BIT_SIZE;
LDA chidiom,Y ; A = chidiom[Y];
BNE ?UNZIP_A_CHWORD_001 ; if (!A) continue;
JMP ?UNZIP_A_CHWORD_00X ;
?UNZIP_A_CHWORD_001: ;
STA <_ZIP_CODE_NUM ; _ZIP_CODE_NUM = A;
LDA UNZIP_b_TO_B,Y ;
STA <_ZIP_CODE_SIZE ; _ZIP_CODE_SIZE = UNZIP_b_TO_B[Y];
LDA <_BIT_SIZE ;
ASL A ;
TAY ;
LDA chidiomtab,Y ;
STA <_CODE_PTR_L ;
LDA chidiomtab+1,Y ; _CODE_PTR = chidiomtab[_BIT_SIZE];
STA <_CODE_PTR_H ;
?UNZIP_A_CHWORD_002: ;
LDA <_ZIP_CODE_SIZE
SEC
SBC #2
ASL A
TAX
JMP (?UNZIP_A_CHWORD_CMP_PROC,X)
?UNZIP_A_CHWORD_CMP_PROC:
DW ?UNZIP_A_CHWORD_CMP_1B
DW ?UNZIP_A_CHWORD_CMP_2B
DW ?UNZIP_A_CHWORD_CMP_3B
?UNZIP_A_CHWORD_CMP_1B:
LDA <_ZIPPED_CODE_L
CMP (_CODE_PTR_L)
BEQ ?UNZIP_A_CHWORD_CMP_1BY
WORD_ADD_BYTE _CODE_PTR_L,_ZIP_CODE_SIZE
DEC <_ZIP_CODE_NUM
BNE ?UNZIP_A_CHWORD_CMP_1B
?UNZIP_A_CHWORD_CMP_1BX:
JMP ?UNZIP_A_CHWORD_00X
?UNZIP_A_CHWORD_CMP_1BY:
LDY #1
JSR UNZIP_CODE_LOOK
.if UNZIP_ONE_AT_ONCE=1
CMP #3
BEQ ?UNZIP_A_CHWORD_CMP_1BY0
RTS
?UNZIP_A_CHWORD_CMP_1BY0:
JMP ?UNZIP_A_CHWORD_00X
.else
JMP ?UNZIP_A_CHWORD_00X
.endif
?UNZIP_A_CHWORD_CMP_2B:
LDA <_ZIPPED_CODE_M
CMP (_CODE_PTR_L)
BNE ?UNZIP_A_CHWORD_CMP_2B1
LDY #1
LDA <_ZIPPED_CODE_L
CMP (_CODE_PTR_L),Y
BEQ ?UNZIP_A_CHWORD_CMP_2BY
?UNZIP_A_CHWORD_CMP_2B1:
WORD_ADD_BYTE _CODE_PTR_L,_ZIP_CODE_SIZE
DEC <_ZIP_CODE_NUM
BNE ?UNZIP_A_CHWORD_CMP_2B
?UNZIP_A_CHWORD_CMP_2BX:
JMP ?UNZIP_A_CHWORD_00X
?UNZIP_A_CHWORD_CMP_2BY:
LDY #2
JSR UNZIP_CODE_LOOK
.if UNZIP_ONE_AT_ONCE=1
CMP #3
BEQ ?UNZIP_A_CHWORD_CMP_2BY0
RTS
?UNZIP_A_CHWORD_CMP_2BY0:
JMP ?UNZIP_A_CHWORD_00X
.else
JMP ?UNZIP_A_CHWORD_00X
.endif
?UNZIP_A_CHWORD_CMP_3B:
LDA <_ZIPPED_CODE_H
CMP (_CODE_PTR_L)
BNE ?UNZIP_A_CHWORD_CMP_3B1
LDY #1
LDA <_ZIPPED_CODE_M
CMP (_CODE_PTR_L),Y
BNE ?UNZIP_A_CHWORD_CMP_3B1
INY
LDA <_ZIPPED_CODE_L
CMP (_CODE_PTR_L),Y
BEQ ?UNZIP_A_CHWORD_CMP_3BY
?UNZIP_A_CHWORD_CMP_3B1:
WORD_ADD_BYTE _CODE_PTR_L,_ZIP_CODE_SIZE
DEC <_ZIP_CODE_NUM
BNE ?UNZIP_A_CHWORD_CMP_3B
?UNZIP_A_CHWORD_CMP_3BX:
JMP ?UNZIP_A_CHWORD_00X
?UNZIP_A_CHWORD_CMP_3BY:
LDY #3
JSR UNZIP_CODE_LOOK
.if UNZIP_ONE_AT_ONCE=1
CMP #3
BEQ ?UNZIP_A_CHWORD_CMP_3BY0
RTS
?UNZIP_A_CHWORD_CMP_3BY0:
.endif
?UNZIP_A_CHWORD_00X:
DEC <_UNZIP_LOOP_X
LDA <_UNZIP_LOOP_X
BEQ ?UNZIP_A_CHWORD_00Y
JMP ?UNZIP_A_CHWORD_000
?UNZIP_A_CHWORD_00Y:
DEC_WORD _DATA_SIZE_0
LDA <_DATA_SIZE_0
ORA <_DATA_SIZE_1
BEQ ?UNZIP_A_CHWORD_0X
JMP ?UNZIP_A_CHWORD_0
?UNZIP_A_CHWORD_0X:
LDA #0
RTS
; ***************************************************************************
JMP ?UNZIP_A_CHWORD_000
JMP ?UNZIP_A_CHWORD_00X
UNZIP_N_CHWORD:
BRA UNZIP_N_CHWORD-3
UNZIP_A_IDIOM:
BRA UNZIP_N_CHWORD-6
; ***************************************************************************
; ***************************************************************************
; RETURN: 1 UNZIP A BYTE
; 2 UNZIP ONE WORD
; 3 UNZIP HALF WORD
;
UNZIP_CODE_LOOK:
STZ <_ZIPPED_CODE_H
STZ <_ZIPPED_CODE_M
STZ <_ZIPPED_CODE_L
STZ <_BIT_SIZE
LDA <_UNZIP_DATA_L
STA <_UNZIP_DATA_H
LDA (_CODE_PTR_L),Y
STA <_UNZIP_DATA_L
CMP #$80
BCS ?UNZIP_CODE_LOOK0
CMP #$09
BNE ?UNZIP_CODE_LOOKB
LDA #' '
?UNZIP_CODE_LOOKB:
STA <_UNZIP_CH_L ;
LDA #1
RTS
?UNZIP_CODE_LOOK0:
INC <_UNZIP_COUNT
LDA <_UNZIP_COUNT
CMP #2
BCS ?UNZIP_CODE_LOOK1
LDA #3
RTS
?UNZIP_CODE_LOOK1:
STZ <_UNZIP_COUNT
_PUSH_DRR
SEC
LDA <_UNZIP_DATA_H
SBC #$80
STA <_MATH_OPER0_L
STZ <_MATH_OPER0_H
LDA #$53
STA <_MATH_OPER1_L
STZ <_MATH_OPER1_H
JSR __uint_mult_uint
SEC
LDA <_MATH_RESULT_0
SBC #$80
STA <_MATH_RESULT_0
LDA <_MATH_RESULT_1
SBC #0
STA <_MATH_RESULT_1
CLC
LDA <_MATH_RESULT_0
ADC <_UNZIP_DATA_L
STA <_MATH_RESULT_0
LDA <_MATH_RESULT_1
ADC #0
STA <_MATH_RESULT_1
ASL <_MATH_RESULT_0
ROL <_MATH_RESULT_1
INC_WORD _MATH_RESULT_0
STZ <_MATH_RESULT_2
STZ <_MATH_RESULT_3
LONG_ADD_CONST <_MATH_RESULT_0,CH_ICON_ADDR
LONG_2_DDR_REG <_MATH_RESULT_0
LDA <_MATH_RESULT_2
STA <_DRRL
LDA <_MATH_RESULT_3
STA <_DRRH
LDA <_MATH_RESULT_0
STA <_UNZIP_FPTR_0
LDA <_MATH_RESULT_1
STA <_UNZIP_FPTR_1
JSR GET_FPTR_BYTE
STA <_UNZIP_CH_L ;
JSR GET_FPTR_BYTE
STA <_UNZIP_CH_H ;
POP_DRR
LDA <_UNZIP_CH_L
CMP #$A8
BNE ?_EXIT
LDA <_UNZIP_CH_H
SEC
SBC #$20
STA <_UNZIP_CH_L
LDA #1
RTS
?_EXIT:
LDA #2
RTS
; ***************************************************************************
CALC_PAGE_PTR:
LDA CNDICT_PAGE_IDX
LDX CNDICT_PAGE_IDX
STZ CNDICT_PAGE_IDX+1
ASL CNDICT_PAGE_IDX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -