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

📄 extract.asm

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