📄 extract.asm
字号:
;;function:计算码长最大为三字节比较后的库地址&<bitcount
;;input;;<bitcount&<bitcmp&当前库地址
;;output:库地址&<bitcount
;;==========================================
jisuan_threeByte:
clc ;;计算出从大库取字节的地址和开始字节
lda <bitcount
adc <bitcmp
sta <bitcount
cmp #8
bcs ?_chaoguooneByte
jsr dec3_indxd
rts
?_chaoguooneByte:
cmp #16
bcs ?getbitcount
sec
sbc #8
sta <bitcount
jsr dec2_indxd
rts
?getbitcount:
cmp #24
bcs ?getbitcount1
sec
sbc #16
sta <bitcount
jsr dec1_indxd
rts
?getbitcount1:
sec
sbc #24
sta <bitcount
rts
;;=========================================
;;function:解压解释(中文)一个字节
;;input:<indxd & <bitcount
;;output:指向下一字节的<indxd & <bitcount
;;=========================================
extract_jieshich_oneByte:
lda <indxd+2
sta <DrrL
lda <indxd+3
sta <DrrH
lda (<indxd)
sta <byteL
jsr inc1_indxd
lda (<indxd)
sta <byteM
jsr inc1_indxd
lda (<indxd)
sta <byteH
jsr inc1_indxd
lda (<indxd)
sta <byteP
lda <bitcount
beq ?_Noneedturn
?_turn:
asl <ByteP
rol <byteH
rol <byteM
rol <ByteL
dec
bne ?_turn
?_Noneedturn:
lda #jieshistarNum
sta <bitcmp
lda <ByteL
sta <byteLsave
lda <ByteM
sta <byteMsave
lda <ByteH
sta <byteHsave
?_0:
ldy <bitcmp
?_getmashuloop:
lda jieshich,y
bne ?_getdaimashu ;;找到了此码长的个数
inc <bitcmp
iny
bra ?_getmashuloop
?_getdaimashu:
tax ;;将此数位码的个数-->x
cpy #9
bcs ?_twobyte
lda and_tab,y
and <ByteL
sta <BYteL
tya
asl
tay
lda jieshichtab,y
sta <INSL
iny
lda jieshichtab,y
sta <INSH
ldy #0
?_cmploop:
lda (<INS),y
cmp <ByteL
beq ?_finddaimaOk
dex
beq ?_addonebit ;;此位数比较完毕,位数加一
iny
iny
bra ?_cmploop
?_addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
bra ?_0
?_finddaimaOk:
jmp ?_jieshichEnd
?_twobyte: ;;比较两字节
lda <byteMsave
sta <ByteM
cpy #17
bcs ?_ThreeByte
phy
tya
sec
sbc #8
tay
lda and_tab,y
and <ByteM
sta <BYteM
ply
tya
asl
tay
lda jieshichtab,y
sta <INSL
iny
lda jieshichtab,y
sta <INSH
ldy #0
?_comptwobit:
lda (<INS),y
cmp <ByteL
beq ?_cmpnextbyte
dex
beq ?Addonebit
iny
iny
iny
bra ?_comptwobit
?Addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
jmp ?_0
?_cmpnextbyte:
iny
lda (<INS),y
cmp <ByteM
beq ?_FindmaOK
dex
beq ?Addonebit
iny
iny
bra ?_comptwobit
?_ThreeByte: ;;比较三字节
lda <byteHsave
sta <ByteH
phy
tya
sec
sbc #16
tay
lda and_tab,y
and <ByteH
sta <BYteH
ply
tya
asl
tay
lda jieshichtab,y
sta <INSL
iny
lda jieshichtab,y
sta <INSH
ldy #0
?_compthreeByte:
lda (<INS),y
cmp <ByteL
beq ?cmpnextbyte
dex
beq ?Addtoonebit
iny
iny
iny
iny
bra ?_compthreeByte
?Addtoonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
jmp ?_0
?cmpnextbyte:
iny
lda (<INS),y
cmp <ByteM
beq ?_cmpnextnextbyte
dex
beq ?Addtoonebit
iny
iny
iny
bra ?_compthreeByte
?_cmpnextnextbyte:
iny
lda (<INS),y
cmp <ByteH
beq ?_FindmaOK
dex
beq ?Addtoonebit
iny
iny
bra ?_compthreeByte
?_FindmaOK:
?_jieshichEnd:
iny
lda (<INS),y
sta <CharL
jsr jisuan_threeByte
rts
;;=========================================
;;function:解压解释(英文)一个字节
;;input:<indxd & <bitcount
;;output:指向下一字节的<indxd & <bitcount
;;=========================================
extract_jieshien_oneByte:
lda <indxd+2
sta <DrrL
lda <indxd+3
sta <DrrH
lda (<indxd)
sta <byteL
jsr inc1_indxd
lda (<indxd)
sta <byteM
jsr inc1_indxd
lda (<indxd)
sta <byteH
jsr inc1_indxd
lda (<indxd)
sta <byteP
lda <bitcount
beq ?_Noneedturn
?_turn:
asl <ByteP
rol <byteH
rol <byteM
rol <ByteL
dec
bne ?_turn
?_Noneedturn:
; lda #jieshistarNum
lda #jieshienstarNum
sta <bitcmp
lda <ByteL
sta <byteLsave
lda <ByteM
sta <byteMsave
lda <ByteH
sta <byteHsave
?_0:
ldy <bitcmp
?_getmashuloop:
lda jieshien,y
bne ?_getdaimashu ;;找到了此码长的个数
inc <bitcmp
iny
bra ?_getmashuloop
?_getdaimashu:
tax ;;将此数位码的个数-->x
cpy #9
bcs ?_twobyte
lda and_tab,y
and <ByteL
sta <BYteL
tya
asl
tay
lda jieshientab,y
sta <INSL
iny
lda jieshientab,y
sta <INSH
ldy #0
?_cmploop:
lda (<INS),y
cmp <ByteL
beq ?_finddaimaOk
dex
beq ?_addonebit ;;此位数比较完毕,位数加一
iny
iny
bra ?_cmploop
?_addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
bra ?_0
?_finddaimaOk:
jmp ?_jieshienEnd
?_twobyte: ;;比较两字节
lda <byteMsave
sta <ByteM
cpy #17
bcs ?_ThreeByte
phy
tya
sec
sbc #8
tay
lda and_tab,y
and <ByteM
sta <BYteM
ply
tya
asl
tay
lda jieshientab,y
sta <INSL
iny
lda jieshientab,y
sta <INSH
ldy #0
?_comptwobit:
lda (<INS),y
cmp <ByteL
beq ?_cmpnextbyte
dex
beq ?Addonebit
iny
iny
iny
bra ?_comptwobit
?Addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
jmp ?_0
?_cmpnextbyte:
iny
lda (<INS),y
cmp <ByteM
beq ?_FindmaOK
dex
beq ?Addonebit
iny
iny
bra ?_comptwobit
?_ThreeByte: ;;比较三字节
lda <byteHsave
sta <ByteH
phy
tya
sec
sbc #16
tay
lda and_tab,y
and <ByteH
sta <BYteH
ply
tya
asl
tay
lda jieshientab,y
sta <INSL
iny
lda jieshientab,y
sta <INSH
ldy #0
?_compthreeByte:
lda (<INS),y
cmp <ByteL
beq ?cmpnextbyte
dex
beq ?Addtoonebit
iny
iny
iny
iny
bra ?_compthreeByte
?Addtoonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
jmp ?_0
?cmpnextbyte:
iny
lda (<INS),y
cmp <ByteM
beq ?_cmpnextnextbyte
dex
beq ?Addtoonebit
iny
iny
iny
bra ?_compthreeByte
?_cmpnextnextbyte:
iny
lda (<INS),y
cmp <ByteH
beq ?_FindmaOK
dex
beq ?Addtoonebit
iny
iny
bra ?_compthreeByte
?_FindmaOK:
?_jieshienEnd:
iny
lda (<INS),y
sta <CharL
jsr jisuan_threeByte
rts
;;=========================================
;;function:解压解释(音标)一个字节
;;input:<indxd & <bitcount
;;output:指向下一字节的<indxd & <bitcount
;;=========================================
extract_jieshiph_oneByte:
lda <indxd+2
sta <DrrL
lda <indxd+3
sta <DrrH
lda (<indxd)
sta <byteL
jsr inc1_indxd
lda (<indxd)
sta <byteM
jsr inc1_indxd
lda (<indxd)
sta <byteH
lda <bitcount
beq ?_Noneedturn
?_turn:
asl <byteH
rol <byteM
rol <ByteL
dec
bne ?_turn
?_Noneedturn:
lda #PhoneticstarNum
sta <bitcmp
lda <ByteL
sta <byteLsave
lda <ByteM
sta <byteMsave
?_0:
ldy <bitcmp
?_getmashuloop:
lda jieshiph,y
bne ?_getdaimashu ;;找到了此码长的个数
inc <bitcmp
iny
bra ?_getmashuloop
?_getdaimashu:
tax ;;将此数位码的个数-->x
cpy #9
bcs ?_twobyte
lda and_tab,y
and <ByteL
sta <BYteL
tya
asl
tay
lda jieshiphtab,y
sta <INSL
iny
lda jieshiphtab,y
sta <INSH
ldy #0
?_cmploop:
lda (<INS),y
cmp <ByteL
beq ?_finddaimaOk
dex
beq ?_addonebit ;;此位数比较完毕,位数加一
iny
iny
bra ?_cmploop
?_addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
bra ?_0
?_finddaimaOk:
jmp ?_jieshiphEnd
?_twobyte: ;;比较两字节
lda <byteMsave
sta <ByteM
phy
tya
sec
sbc #8
tay
lda and_tab,y
and <ByteM
sta <BYteM
ply
tya
asl
tay
lda jieshiphtab,y
sta <INSL
iny
lda jieshiphtab,y
sta <INSH
ldy #0
?_comptwobit:
lda (<INS),y
cmp <ByteL
beq ?_cmpnextbyte
dex
beq ?Addonebit
iny
iny
iny
bra ?_comptwobit
?Addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
jmp ?_0
?_cmpnextbyte:
iny
lda (<INS),y
cmp <ByteM
beq ?_FindmaOK
dex
beq ?Addonebit
iny
iny
bra ?_comptwobit
?_FindmaOK:
?_jieshiphEnd:
iny
lda (<INS),y
sta <CharL
clc ;;计算出从大库取字节的地址和开始字节
lda <bitcount
adc <bitcmp
sta <bitcount
cmp #8
bcs ?_exceedoneByte
jsr dec2_indxd
rts
?_exceedoneByte:
cmp #16
bcs ?_getbitcount
sec
sbc #8
sta <bitcount
jsr dec1_indxd
rts
?_getbitcount:
sec
sbc #16
sta <bitcount
rts
;;============================================
;;function:解压例句的中文部分
;;input:指向中文开始的地址<indxd &<bitcount
;;output:指向中文的地址<indxd & <bitcount
;;===========================================
extract_lijuch:
?_extractloop:
lda <indxd+2
sta <DrrL
lda <indxd+3
sta <DrrH
lda (<indxd)
sta <byteL
jsr inc1_indxd
lda (<indxd)
sta <byteM
jsr inc1_indxd
lda (<indxd)
sta <byteH
jsr inc1_indxd
lda (<indxd)
sta <byteP
lda <bitcount
beq ?_Noneedturn
?_turn:
asl <ByteP
rol <byteH
rol <byteM
rol <ByteL
dec
bne ?_turn
?_Noneedturn:
lda #EnStrstarNum
sta <bitcmp
lda <ByteL
sta <byteLsave
lda <ByteM
sta <byteMsave
lda <ByteH
sta <byteHsave
?_0:
ldy <bitcmp
?_getmashuloop:
lda lijuch,y
bne ?_getdaimashu ;;找到了此码长的个数
inc <bitcmp
iny
bra ?_getmashuloop
?_getdaimashu:
tax ;;将此数位码的个数-->x
cpy #9
bcs ?_twobyte
lda and_tab,y
and <ByteL
sta <BYteL
tya
asl
tay
lda lijuchtab,y
sta <INSL
iny
lda lijuchtab,y
sta <INSH
ldy #0
?_cmploop:
lda (<INS),y
cmp <ByteL
beq ?_finddaimaOk
dex
beq ?_addonebit ;;此位数比较完毕,位数加一
iny
iny
bra ?_cmploop
?_addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
bra ?_0
?_finddaimaOk:
iny
lda (<INS),y
cmp #lijufenge ;;英文与中文的分隔
bne ?notlijuchend
jmp ?_lijuchEnd
?notlijuchend:
sta (<IND)
jsr inc1_IND
jsr jisuan_twoByte
jmp ?_extractloop
?_twobyte: ;;比较两字节
lda <byteMsave
sta <ByteM
cpy #17
bcs ?_ThreeByte
phy
tya
sec
sbc #8
tay
lda and_tab,y
and <ByteM
sta <BYteM
ply
tya
asl
tay
lda lijuchtab,y
sta <INSL
iny
lda lijuchtab,y
sta <INSH
ldy #0
?_comptwobit:
lda (<INS),y
cmp <ByteL
beq ?_cmpnextbyte
dex
beq ?Addonebit
iny
iny
iny
bra ?_comptwobit
?Addonebit:
inc <bitcmp
lda <byteLsave
sta <ByteL
jmp ?_0
?_cmpnextbyte:
iny
lda (<INS),y
cmp <ByteM
beq ?_FindmaOK
dex
beq ?Addonebit
iny
iny
bra ?_comptwobit
?_ThreeByte: ;;比较三字节
lda <byteHsave
sta <ByteH
phy
tya
sec
sbc #16
tay
lda and_tab,y
and <ByteH
sta <BYteH
ply
tya
asl
tay
lda lijuchtab,y
sta <INSL
iny
lda lijuchtab,y
sta <INSH
ldy #0
?_compthreeByte:
lda (<INS),y
cmp <ByteL
beq ?cmpnextbyte
dex
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -