⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unzip.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; ***************************************************************************
; *     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 + -