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

📄 extract.asm

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