📄 extract.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2003.9 *
; * File Name : EXTRACT.ASM *
; ***************************************************************************
pw 128
case off
externs on
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 extract.h
;========>>subroutine declare<<<==========================
public extract_word
public extract_yinbiao
public extract_jieshiCh_oneByte
public extract_jieshiEn_oneByte
public extract_jieshiph_oneByte
public extract_lijuCh
public extract_lijuEn
public extract_Hychword
;public extract_Hyenword
;;;==============常量定义=================
EnStrstarNum equ 3 ;;词条的最短码长
PhoneticstarNum equ 2 ;;音标的最短码长
jieshienstarNum equ 2 ;;解释的最短码长
jieshistarNum equ 3 ;;解释的最短码长
Fenge equ 9 ;;解释中的分隔符&词条与音标的分隔符
lijufenge equ 10;;例句英文与中文的分隔符
;oddcodeNum equ 0aah;;碰到此代码仍掉解压下一个
Hyyingfenge equ 10;;汉英词典中文和英文的分隔及英文结尾
hyhuiche equ 09;;汉英中的回车
;=====================================================
PS9 .SECTION ; Program ROM location 0080h
BANKNO EQU ExtractBank
include xyhcode.asm
include hycode.asm
;;======================================
;;function:extract one word
;;input:大库的地址<indxd &<Drr &开始字节数bitcount
;;output:结果存入cdict_result ;<bitcount ;<bitcmp
;;=====================================
extract_word:
rmb0 <newflag ;清除结尾标志
rmb6 <newflag ;清除有'<'&'>'标志
;;=======新英汉补丁=========
; LAmendxyhLib
;;=======新英汉补丁=========
?_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
bne ?_NolibEnd
;checkLibEnd: 检查是否词典结尾四个0检查三个
lda <ByteH
bne ?_NolibEnd
lda <ByteM
bne ?_NolibEnd
jsr inc1_indxd
lda (<indxd)
bne ?_NolibEnd
jsr dec3_indxd
jsr dec1_indxd
lda #0
sta (<IND)
jsr inc1_IND
lda #0
sta (<IND)
jsr inc1_IND
lda #0
sta (<IND)
smb0 <newflag
rts ;;是结尾退出
?_NolibEnd:
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 citiao,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 citiaotab,y
sta <INSL
iny
lda citiaotab,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 #Fenge ;;词条与音标的分割符
bne ?notcitiaoend
jmp ?_citiaoEnd
?notcitiaoend:
cmp #'<'
bne ?_Notfirstjiankuohao
jsr dealfirstjiankuohao
bra ?_skipit
?_Notfirstjiankuohao:
cmp #'>'
bne ?_Notendjiankuohao
jsr dealendjiankuohao
bra ?_skipit
?_Notendjiankuohao:
sta (<IND)
jsr inc1_IND
?_skipit:
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 citiaotab,y
sta <INSL
iny
lda citiaotab,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 citiaotab,y
sta <INSL
iny
lda citiaotab,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:
iny
lda (<INS),y
cmp #Fenge ;;词条与音标的分割符
beq ?_citiaoEnd
cmp #'<'
bne ?_Notfirstjiankuohao1
jsr dealfirstjiankuohao
?_Notfirstjiankuohao1:
cmp #'>'
bne ?_Notendjiankuohao1
jsr dealendjiankuohao
?_Notendjiankuohao1:
sta (<IND)
jsr inc1_IND
?_skipit1:
jsr jisuan_threeByte
jmp ?_extractloop
?_citiaoEnd:
;;==========补丁=======
bbr0 <AmendFlag,?_exit
;jsr store_CitiaoBug J.A. 5-13
?_exit:
;;==========补丁=======
rts
;;=================================
;;function:保存词条
;;input:<AmendFlag <AmendAddrL,<AmendaddrH
;;output:<IND
;;=================================
store_CitiaoBug:
lda #<Cdict_result
sta <INDL
lda #>Cdict_result
sta <INDH
lda #AmendLibaddr>>24 ;补丁地址
sta <DrrH
lda #AmendLibaddr>>16
sta <DrrL
?_loop:
lda (<AmendaddrL)
beq ?_OK
sta (<IND)
jsr inc1_IND
jsr inc1_Amendaddr
bra ?_loop
?_OK:
rts
inc1_Amendaddr:
inc <AmendaddrL
bne ?_0
inc <AmendaddrH
?_0:
rts
;;=======================================
;;function:计算<出现的值
;;input:<INDL
;;output:Jianstart
;;=======================================
dealfirstjiankuohao:
bbs6 <newflag,?_exit
sec
lda <INDL
sbc #<cdict_result
sta Jianstart
?_exit:
rts
;;=======================================
;;function:计算<出现的值
;;input:<INDL
;;output:Jianend
;;=======================================
dealendjiankuohao:
bbs6 <newflag,?_exit
smb6 <newflag
sec
lda <INDL
sbc #<cdict_result
sta Jianend
?_exit:
rts
inc1_IND:
inc <INDL
bne ?_0
inc <INDH
?_0: rts
and_tab:
db 0,10000000b,11000000b,11100000b,11110000b
db 11111000b,11111100b,11111110b,11111111b
;;======================================
;;function;解压出音标
;;input;;从解压词条出来的<bitcount&<bitcmp&大库地址
;;output;解压结果存入cdict_result(<IND),<bitcount,<bitcmp
;;======================================
extract_yinbiao:
lda #0dh ;;在音标前补上换行符和"["
sta (<IND)
jsr inc1_IND
lda #'['
sta (<IND)
jsr inc1_IND
?_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 #PhoneticstarNum
sta <bitcmp
lda <ByteL
sta <byteLsave
lda <ByteM
sta <byteMsave
lda <ByteH
sta <byteHsave
?_0:
ldy <bitcmp
?_getmashuloop:
lda yinbiao,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 yinbiaotab,y
sta <INSL
iny
lda yinbiaotab,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 #Fenge ;;词条与音标的分割符
bne ?notyinbiaoend
jmp ?_yinbiaoEnd
?notyinbiaoend:
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 yinbiaotab,y
sta <INSL
iny
lda yinbiaotab,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 yinbiaotab,y
sta <INSL
iny
lda yinbiaotab,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:
iny
lda (<INS),y
cmp #Fenge ;;词条与音标的分割符
beq ?_yinbiaoEnd
sta (<IND)
jsr inc1_IND
jsr jisuan_threeByte
jmp ?_extractloop
?_yinbiaoEnd:
lda #']' ;音标结尾加上结尾符
sta (<IND)
jsr inc1_IND
lda #0dh
sta (<IND)
jsr inc1_IND
jsr jisuan_threeByte
;;==========补丁=======
bbr2 <AmendFlag,?_exit
; jsr store_YinbiaoBug J.A. 5-13
?_exit:
;;==========补丁=======
rts ;exit
;;=================================
;;function:保存词条
;;input:<AmendFlag <AmendAddrL,<AmendaddrH
;;output:<IND
;;=================================
store_YinbiaoBug:
lda #<Cdict_result
sta <INDL
lda #>Cdict_result
sta <INDH
?_loop1:
jsr inc1_IND
lda (<IND)
cmp #'['
bne ?_loop1
jsr inc1_IND
lda #AmendLibaddr>>24 ;补丁地址
sta <DrrH
lda #AmendLibaddr>>16
sta <DrrL
?_loop:
lda (<AmendaddrL)
beq ?_OK
sta (<IND)
jsr inc1_IND
jsr inc1_Amendaddr
bra ?_loop
?_OK:
lda #']'
sta (<IND)
jsr inc1_IND
lda #0dh
sta (<IND)
jsr inc1_IND
rts
;;==========================================
;;function:计算码长最大为两字节比较后的库地址&<bitcount
;;input;;<bitcount&<bitcmp&当前库地址
;;output:库地址&<bitcount (为读四字节)
;;==========================================
jisuan_twobyte:
clc ;;计算出从大库取字节的地址和开始字节
lda <bitcount
adc <bitcmp
sta <bitcount
cmp #8
bcs ?_exceedoneByte
jsr dec3_indxd
rts
?_exceedoneByte:
cmp #16
bcs ?_getbitcount
sec
sbc #8
sta <bitcount
jsr dec2_indxd
rts
?_getbitcount:
sec
sbc #16
sta <bitcount
jsr dec1_indxd
rts
;;====================================
;;Function: <indxd++ include Drr
;;Input:<indxd
;;Output:<indxd
;;====================================
inc1_indxd:
inc <indxd
bne ?_0
inc <indxd+1
bne ?_0
smb7 <indxd+1
inc <indxd+2
beq ?_1
lda <indxd+2
sta <DrrL
rts
?_1:
inc <indxd+3
lda <indxd+3
sta <DrrH
lda <indxd+2
sta <DrrL
?_0:
rts
dec3_indxd:
sec
lda <indxd
sbc #3
sta <indxd
lda <indxd+1
sbc #0
sta <indxd+1
bbs7 <indxd+1,?_exit
smb7 <indxd+1
sec
lda <indxd+2
sbc #1
sta <indxd+2
lda <indxd+3
sbc #0
sta <indxd+3
?_Exit:
rts
dec2_indxd:
sec
lda <indxd
sbc #2
sta <indxd
lda <indxd+1
sbc #0
sta <indxd+1
bbs7 <indxd+1,?_exit
smb7 <indxd+1
sec
lda <indxd+2
sbc #1
sta <indxd+2
lda <indxd+3
sbc #0
sta <indxd+3
?_Exit:
rts
dec1_indxd:
sec
lda <indxd
sbc #1
sta <indxd
lda <indxd+1
sbc #0
sta <indxd+1
bbs7 <indxd+1,?_exit
smb7 <indxd+1
sec
lda <indxd+2
sbc #1
sta <indxd+2
lda <indxd+3
sbc #0
sta <indxd+3
?_Exit:
rts
;;==========================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -