📄 unzip.asm
字号:
ROL CNDICT_PAGE_IDX+1
ASL CNDICT_PAGE_IDX
ROL CNDICT_PAGE_IDX+1
ASL CNDICT_PAGE_IDX
ROL CNDICT_PAGE_IDX+1
ASL A
CLC
ADC CNDICT_PAGE_IDX
STA CNDICT_PAGE_IDX
LDA CNDICT_PAGE_IDX+1
ADC #0
STA CNDICT_PAGE_IDX+1
LDY #<CNDICT_PAGE_DATA
STY <_DATA_PTR_L
LDY #>CNDICT_PAGE_DATA
STY <_DATA_PTR_H
CLC
LDA <_DATA_PTR_L
ADC CNDICT_PAGE_IDX
STA <_DATA_PTR_L
LDA <_DATA_PTR_H
ADC CNDICT_PAGE_IDX+1
STA <_DATA_PTR_H
STX CNDICT_PAGE_IDX
RTS
; ***************************************************************************
RECORD_UZ_PTR:
JSR CALC_PAGE_PTR
LDA <_UNZIP_PTR_B0
STA (_DATA_PTR_L)
LDY #1
LDA <_UNZIP_PTR_B1
STA (_DATA_PTR_L),Y
INY
LDA <_DRRL
STA (_DATA_PTR_L),Y
INY
LDA <_DRRH
STA (_DATA_PTR_L),Y
INY
LDA <_ZIPPED_DATA
STA (_DATA_PTR_L),Y
INY
LDA <_UNZIP_LOOP_X
STA (_DATA_PTR_L),Y
INY
LDA <_UZ_LAST_WORD
STA (_DATA_PTR_L),Y
INY
LDA <_UZ_LAST_WORD+1
STA (_DATA_PTR_L),Y
INY
LDA <_DATA_SIZE_0
STA (_DATA_PTR_L),Y
INY
LDA <_DATA_SIZE_1
STA (_DATA_PTR_L),Y
RTS
; ***************************************************************************
LOAD_UZ_PTR:
JSR CALC_PAGE_PTR
LDA (_DATA_PTR_L)
STA <_UNZIP_PTR_B0
LDY #1
LDA (_DATA_PTR_L),Y
STA <_UNZIP_PTR_B1
INY
LDA (_DATA_PTR_L),Y
STA <_DRRL
INY
LDA (_DATA_PTR_L),Y
STA <_DRRH
INY
LDA (_DATA_PTR_L),Y
STA <_ZIPPED_DATA
INY
LDA (_DATA_PTR_L),Y
STA <_UNZIP_LOOP_X
INY
LDA (_DATA_PTR_L),Y
STA <_UZ_LAST_WORD
INY
LDA (_DATA_PTR_L),Y
STA <_UZ_LAST_WORD+1
INY
LDA (_DATA_PTR_L),Y
STA <_DATA_SIZE_0
INY
LDA (_DATA_PTR_L),Y
STA <_DATA_SIZE_1
RTS
; ***************************************************************************
BACKUP_FPTR:
LDA <_UNZIP_FPTR_0
STA BK_FPTR_0
LDA <_UNZIP_FPTR_1
STA BK_FPTR_1
LDA <_UNZIP_FPTR_2
STA BK_FPTR_2
LDA <_UNZIP_FPTR_3
STA BK_FPTR_3
RTS
; ***************************************************************************
RESTORE_FPTR:
LDA BK_FPTR_0
STA <_UNZIP_FPTR_0
LDA BK_FPTR_1
STA <_UNZIP_FPTR_1
LDA BK_FPTR_2
STA <_UNZIP_FPTR_2
LDA BK_FPTR_3
STA <_UNZIP_FPTR_3
RTS
; ***************************************************************************
BACKUP_CHWORD_PTR:
LDA <_UNZIP_PTR_B0
STA BK_WORD_PTR_0
LDA <_UNZIP_PTR_B1
STA BK_WORD_PTR_1
LDA <_UNZIP_PTR_B2
STA BK_WORD_PTR_2
LDA <_UNZIP_PTR_B3
STA BK_WORD_PTR_3
RTS
; ***************************************************************************
RESTORE_CHWORD_PTR:
LDA BK_WORD_PTR_0
STA <_UNZIP_PTR_B0
LDA BK_WORD_PTR_1
STA <_UNZIP_PTR_B1
LDA BK_WORD_PTR_2
STA <_UNZIP_PTR_B2
LDA BK_WORD_PTR_3
STA <_UNZIP_PTR_B3
RTS
; ***************************************************************************
INCLUDE CHIDIOM.ASM
INCLUDE MATH.ASM
; ***************************************************************************
PUBLIC INIT_UART
INIT_UART:
RTS
; ***************************************************************************
; * *
; ***************************************************************************
TOTAL_NUMOF_IDIOM EQU ((CHIDIOM_ADDR-IDIOM_ADDR)/3)
; ***************************************************************************
FIND_IDIOM_ADDR:
LDA CNDICT_BUFFER ;
STA <_UNZIP_CH_H ;
LDA CNDICT_BUFFER+1 ;
STA <_UNZIP_CH_L ;
JSR UNZIP_GET_ADDR ; _UNZIP_PTR_B3
ASL <_UNZIP_PTR_B0 ;
ROL <_UNZIP_PTR_B1 ;
ROL <_UNZIP_PTR_B2 ;
ASL <_UNZIP_PTR_B0 ;
ROL <_UNZIP_PTR_B1 ;
ROL <_UNZIP_PTR_B2 ;
ASL <_UNZIP_PTR_B0 ;
ROL <_UNZIP_PTR_B1 ;
ROL <_UNZIP_PTR_B2 ; <_UNZIP_PTR_B *= 8;
STZ TEMP_P0 ;
STZ TEMP_P0+1 ;
LDA #<(TOTAL_NUMOF_IDIOM-1) ;
STA TEMP_P1 ;
LDA #>(TOTAL_NUMOF_IDIOM-1) ;
STA TEMP_P1+1 ;
?TARGETCKINGADDR:
CLC
LDA TEMP_P0
ADC TEMP_P1
STA TEMP_PP
LDA TEMP_P0+1
ADC TEMP_P1+1
STA TEMP_PP+1
LSR TEMP_PP+1
ROR TEMP_PP
LDA TEMP_PP
CMP TEMP_P0
BNE ?TARGETCKINGADDR0
LDA TEMP_PP+1
CMP TEMP_P0+1
BNE ?TARGETCKINGADDR0
JMP ?TARGETGOTADDR
?TARGETCKINGADDR0:
LDA TEMP_PP
CMP TEMP_P1
BNE ?TARGETCKINGADDR1
LDA TEMP_PP+1
CMP TEMP_P1+1
BNE ?TARGETCKINGADDR1
JMP ?TARGETGOTADDR
?TARGETCKINGADDR1:
LOAD_LONG_FROM_CONST <_UNZIP_FPTR_0,IDIOM_ADDR
LONG_ADD_WORD <_UNZIP_FPTR_0,TEMP_PP
LONG_ADD_WORD <_UNZIP_FPTR_0,TEMP_PP
LONG_ADD_WORD <_UNZIP_FPTR_0,TEMP_PP
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 CNDICT_TEMP
SEC
LDA <_UNZIP_PTR_B0
SBC CNDICT_TEMP
LDA <_UNZIP_PTR_B1
PHA
PHP
JSR GET_FPTR_BYTE
STA CNDICT_TEMP
PLP
PLA
SBC CNDICT_TEMP
LDA <_UNZIP_PTR_B2
PHA
PHP
JSR GET_FPTR_BYTE
STA CNDICT_TEMP
PLP
PLA
SBC CNDICT_TEMP
BCC ?TARGETSMALLER
?TARGETBIGGER:
LDA TEMP_PP
STA TEMP_P0
LDA TEMP_PP+1
STA TEMP_P0+1
BRA ?TARGETCOMPARED
?TARGETSMALLER:
LDA TEMP_PP
STA TEMP_P1
LDA TEMP_PP+1
STA TEMP_P1+1
?TARGETCOMPARED:
JMP ?TARGETCKINGADDR
?TARGETGOTADDR:
?TARGETGOTADDRS0:
LOAD_LONG_FROM_CONST <_UNZIP_FPTR_0,IDIOM_ADDR
LONG_ADD_WORD <_UNZIP_FPTR_0,TEMP_P1
LONG_ADD_WORD <_UNZIP_FPTR_0,TEMP_P1
LONG_ADD_WORD <_UNZIP_FPTR_0,TEMP_P1
LDA <_UNZIP_FPTR_0
STA CNIDIOM_ADDR
LDA <_UNZIP_FPTR_0+1
STA CNIDIOM_ADDR+1
LDA <_UNZIP_FPTR_0+2
STA CNIDIOM_ADDR+2
LDA <_UNZIP_FPTR_0+3
STA CNIDIOM_ADDR+3
?FETCHIDIOMADDR:
LONG_2_DDR_REG <_UNZIP_FPTR_0
LDA <_UNZIP_FPTR_0+2
STA <_DRRL
LDA <_UNZIP_FPTR_0+3
STA <_DRRH
?TARGETGOTADDRS1:
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
STZ <_BIT_SIZE
LSR <_UNZIP_PTR_B2
ROR <_UNZIP_PTR_B1
ROR <_UNZIP_PTR_B0
ROR <_BIT_SIZE
LSR <_UNZIP_PTR_B2
ROR <_UNZIP_PTR_B1
ROR <_UNZIP_PTR_B0
ROR <_BIT_SIZE
LSR <_UNZIP_PTR_B2
ROR <_UNZIP_PTR_B1
ROR <_UNZIP_PTR_B0
ROR <_BIT_SIZE
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
LSR <_BIT_SIZE ;
LSR <_BIT_SIZE ;
LSR <_BIT_SIZE ;
LSR <_BIT_SIZE ;
LSR <_BIT_SIZE ;
JSR GET_BPTR_BYTE
STA <_ZIPPED_DATA ; _ZIPPED_DATA = *_UNZIP_PTR_B0;
SEC ;
LDA #8 ;
SBC <_BIT_SIZE ;
STA <_UNZIP_LOOP_X ;
LDX <_BIT_SIZE ;
CPX #0
BEQ ?TARGETGOTADDR1
?TARGETGOTADDR0: ;
ASL <_ZIPPED_DATA ;
DEX ;
BNE ?TARGETGOTADDR0 ;
?TARGETGOTADDR1: ;
STZ <_ZIPPED_CODE_L ;
STZ <_ZIPPED_CODE_M ;
STZ <_ZIPPED_CODE_H ;
STZ <_BIT_SIZE ;
STZ <_UNZIP_COUNT ;
LDA #$FF ;
STA <_DATA_SIZE_0 ;
STA <_DATA_SIZE_1 ;
RTS ;
; ***************************************************************************
JMP ?FETCHIDIOMADDR
PUBLIC FETCHIDIOMADDR
FETCHIDIOMADDR:
BRA FETCHIDIOMADDR-3
; ***************************************************************************
GET_FPTR_BYTE:
LDA (_UNZIP_FPTR_0)
TAX
INC_WORD <_UNZIP_FPTR_0
LDA <_UNZIP_FPTR_0
ORA <_UNZIP_FPTR_1
BNE ?GET_FPTR_BYTEX
INC_WORD <_DRRL
LDA #$80
STA <_UNZIP_FPTR_1
?GET_FPTR_BYTEX:
TXA
RTS
; ***************************************************************************
GET_BPTR_BYTE:
LDA (_UNZIP_PTR_B0)
TAX
INC_WORD <_UNZIP_PTR_B0
LDA <_UNZIP_PTR_B0
ORA <_UNZIP_PTR_B1
BNE ?GET_FPTR_BYTEX
INC_WORD <_DRRL
LDA #$80
STA <_UNZIP_PTR_B1
?GET_FPTR_BYTEX:
TXA
RTS
; ***************************************************************************
ENDS
; ***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -