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

📄 listen.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; ***************************************************************************
; * Project    : Electronic Dictionary                                      *
; * Date       : 2004.5                                                     *
; * File Name  : Listen.Asm       (听力测试/听歌测听力)                       *
; * Programmer : Y.L							    *
; ***************************************************************************
        Pw      128
        Case    Off
        Argchk  Off
        Externs On

Putsioa
	Macro	Arg
	Lda	Arg
	Tax
	Jsr     Ljsr
	Dw      Biosbank
	Dw      Sendbyte-1
	Endm

        Include St2202.Def             ; Include St2100 I/O
        Include Data.Def               ; Data Ram Define.
        Include Bios.H
        Include Graphics.H
        Include Keydef.Def
        Include Graph.Def
        Include Study.Def
        Include	Listen.Inc
        Include Song.H
        Include Talkword.Def
        Include Study.H
        Include Extract.H
        Include 5000Lib.Ref
        Include Xyhaddr.H
        Include St2202.Mac             ; Include St2100 I/O

	Public	Song_Load
	Public	Song_Keyin

edata	equ	800h

Ds0     .Section                       ; Data Rom Location 10000H(Bank#2)
	Include	Spkbmp.Asm

Song_Help_New:
	Db	'按[',0F8H,0Ceh,']`[',0F8H,0Cfh,']翻看歌词;',0Dh
	Db	'按[',0F8H,0D2H,']`[',0F8H,0B9H,']移动光标, 在空白处填入缺写字母;',0Dh
	db	'按[发声]键听歌曲;',0dh
	Db	'按[输入]键查看成绩;',0Dh
	Db	'再次按[输入]键浏览正确歌词.',0

Sys_String:
	Db	'       成  绩',0Dh
	Db	'     空白数:',0Dh
	Db	'     正  确:',0Dh
	Db	'     错  误:',0Dh,0

sys_yesno:
	db	0dh
	db	'    确定完成?',0dh
	db	'   是(Y),否(N)',0dh,0

; ***************************************************************************
Bankno	Equ	Ch_Dic_Bank

Ps0D	.Section

; ***************************************************************************
;        		听歌测听力 (歌词填空)
; ***************************************************************************
Song_Keytab:
	Db	Akey,Bkey,Ckey,Dkey,Ekey,Fkey,Gkey
	Db	Hkey,Ikey,Jkey,Kkey,Lkey,Mkey,Nkey
	Db	Okey,Pkey,Qkey,Rkey,Skey,Tkey
	Db	Ukey,Vkey,Wkey,Xkey,Ykey,Zkey
	Db	Enterkey,Esckey,Pgdown,Pgup,Leftkey
        Db      Rightkey,Spacekey,TALK_KEY,Nullkey        ;用Spacekey暂时代替Talk_Key

;----------------------------------------------------------------------------------
Song_Keyin_Char:
	Db	'abcdefghijklmnopqrstuvwxyz'
Song_Keyin_Prog:
	Dw	Song_Enter-1
	Dw	Song_Esc-1
	Dw	Song_Pgdn-1
	Dw	Song_Pgup-1
	Dw	Song_Left-1
	Dw	Song_Right-1
	Dw	Song_Talk-1
	Dw	Song_Talk-1
;----------------------------------------------------------------------------------
Song_Keyin:
	Lda	Mysysflag
	Beq	Song_Keyin_Input		;开始答题,听歌曲
	Cmp	#1
	beq	?1
	cmp	#2
	Bne	Fdfslfsjd
	bra	?2
?1:
	JMP	song_keyin_yesno		;确认是否完成测试?
?2:
	JMP	Song_Keyin_Scan			;显示标准答案,听歌曲

Fdfslfsjd:
	Jmp	Go_Lmainu

Song_Keyin_Input:
	Ldy	#0Ffh
Song_Keyin0:
	Iny
	Lda	Song_Keytab,Y
	Bmi	Song_Keyin_End
	Cmp	<Keyno
	Bne	Song_Keyin0
	Tya
	Sec
	Sbc	#26
	Bcs	Song_Keyin1

	lda	my_flag
	beq	Song_Keyin_End

	Jsr	Get_Currtextbuffor_Loca
	Lda	Song_Keyin_Char,Y
	Pha
	Jsr	Get_Currtextbuffor_Loca
	Pla
	Sta	Textbuffor,X
	Phx
	Ldx	Spacenum_Movepos
	Sta	Answerbuffor_User,X
	Plx
	Jmp	Song_Right
Song_Keyin1:
	Asl
	Tay
	Lda	Song_Keyin_Prog+1,Y
	Pha
	Lda	Song_Keyin_Prog,Y
	Pha
	Rts
Song_Keyin_End:
	Jmp	Go_Lmainu

;----------------------------------------------------------------------------------
Song_Load:
	;startuart
	Lda	#0
	Sta	Mysysflag
        Lsetcursorsize	1		;粗光标

	Stz	<Newflag
	Lda	#<Song_Load-1
	Sta	Helprtprc
	Lda	#>Song_Load-1
	Sta	Helprtprc+1
	Lda	#Ds0Help
	Sta	<Helpoffset
        Lda	#>Song_Help_New
        Sta	Helptextph
        Lda	#<Song_Help_New
        Sta	Helptextpl

	lcls
	jsr	CALL_LUpdateScreen

	Lda	Which_Song
	Jsr	Get_Songtxt
DISPSONG_START:
	Lda	#0
	Sta	Which_Page
	jsr	light_icon_pgup_or_pgdown
	Jsr	Disp_Where_Page_Sth
	Jsr	Get_Spacenumpos_Pgdn
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
Song_Enter:
	Jsr	Write_Textbuffor2New
	Lcursoroff
	Lsetscreen	14
	Lcls
	Lprint	Sys_YESNO
	jsr	CALL_LUpdateScreen
	LDA	#1
	STA	Mysysflag
	Jmp	Go_Lmainu


;----------------------------------------------------------------------------------
Song_Esc:
	Lcursoroff
	Jmp	Studyload_Ret
;----------------------------------------------------------------------------------
Song_Pgdn:
	Lda	Which_Page
	Cmp	Page_Count
	Bne	Song_Pgdn0
	Jmp	Go_Lmainu
Song_Pgdn0:
	Jsr	Write_Textbuffor2New
	Inc	Which_Page

	jsr	light_icon_pgup_or_pgdown

	Jsr	Disp_Where_Page_Sth
	Jsr	Get_Spacenumpos_Pgdn
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
Song_Pgup:
	Lda	Which_Page
	Bne	Song_Pgup0
	Jmp	Go_Lmainu
Song_Pgup0:
	Jsr	Write_Textbuffor2New
	Dec	Which_Page
	jsr	light_icon_pgup_or_pgdown
	Jsr	Disp_Where_Page_Sth
	Jsr	Get_Spacenumpos_Pgup
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
Song_Left:
	Jsr	Get_Last_Cursorxy
        Jmp	Song_Direction
;----------------------------------------------------------------------------------
Song_Right:
	Jsr	Get_Next_Cursorxy
Song_Direction:
	lda	which_page
	bne	?11
	lupdatescreen_except2
	bra	?12
?11:
	jsr	CALL_LUpdateScreen
?12:
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
Song_Talk:
	ldx	#0
?00:	lda	textbuffor,x
	sta	textbuffor_bak0,x
	inx
	cpx	#100
	bne	?00

	LDA	<INSL
	PHA
	LDA	<INSH
	PHA
	LDA	<INDL
	PHA
	LDA	<INDH
	PHA

        JSR     LJSR
        DW      CardBank
        DW      RESET_SP104-1

        JSR     LJSR
        DW      CardBank
        DW      SP140_WakeUp-1

	;putsio	#'a'
	;putsio	Song_Binaddrl
	;putsio	Song_Binaddrm
	;putsio	Song_Binaddrh
	;putsio	Song_Binlengthl
	;putsio	Song_Binlengthm
	;putsio	Song_Binlengthh

	Lda	Song_Binaddrl
	Sta	Voicenol
	Lda	Song_Binaddrm
	Sta	Voicenom
	Lda	Song_Binaddrh
	Sta	Voicenoh

	Lda	Song_Binlengthl
	Sta	R_Tts1Datalength
	Lda	Song_Binlengthm
	Sta	R_Tts1Datalength+1
	Lda	Song_Binlengthh
	Sta	R_Tts1Datalength+2

	ADDL_C	VoiceNoL,SONGBIN_ADDR

	;putsio	#'a'
	;putsio	Voicenol
	;putsio	Voicenom
	;putsio	Voicenoh
	;putsio	R_Tts1Datalength
	;putsio	R_Tts1Datalength+1
	;putsio	R_Tts1Datalength+2

	JSR     LJSR
        DW      CardBank
        DW      PLAY_ADPCM-1

	PLA
	STA	<INDH
	PLA
	STA	<INDL
	PLA
	STA	<INSH
	PLA
	STA	<INSL

	;putsio	#77h

	ldx	#0
?01:	lda	textbuffor_bak0,x
	sta	textbuffor,x
	inx
	cpx	#100
	bne	?01

	Jmp	Go_Lmainu

; ***************************************************************************
;        		听歌测听力(确认完成歌词填空)
; ***************************************************************************
Song_Keytab_yesno:
	Db	ykey,nkey,nullkey

Song_keyin_prog_yesno:
	dw	song_yesno_yes-1
	dw	song_yesno_no-1

song_keyin_yesno:
	Ldy	#0Ffh
song_keyin_yesno0:
	Iny
	Lda	Song_Keytab_yesno,Y
	Bpl	song_keyin_yesno1
	Jmp	Go_Lmainu
song_keyin_yesno1:
	Cmp	<Keyno
	Bne	song_keyin_yesno0
	Tya
	Asl
	Tay
	Lda	Song_keyin_prog_yesno+1,Y
	Pha
	Lda	Song_keyin_prog_yesno,Y
	Pha
	Rts

song_yesno_yes:
	Jsr	Let_Answertonewlocabuffor
	Stz	Wrongnum
	Stz	Rightnum
	Ldx	#0
Aaa:	Lda	Answerbuffor,X
	Beq	Ccc
	Cmp	Answerbuffor_User,X
	Beq	Bbb
	Inc	Wrongnum
	Inx
	Bra	Aaa
Bbb:
	Inc	Rightnum
	Inx
	Bra	Aaa
Ccc:
	Lcursoroff
	Lsetscreen	14
	Lcls
	Lprint	Sys_String
	Jsr	Sub_Print_Num
	jsr	CALL_LUpdateScreen

	Jsr	Ljsr
	Dw	Studybank
	Dw	Music_8Times_Off-1
	Lda	#2
	Sta	Mysysflag
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
song_yesno_no:
	Lda	#0
	Sta	Mysysflag

	JMP	DISPSONG_START

; ***************************************************************************
;        		听歌测听力(浏览歌词)
; ***************************************************************************
Song_Keytab_Scan:
        Db      Enterkey,Esckey,Pgdown,Pgup,Spacekey,TALK_KEY,Nullkey     ;用Spacekey暂时代替Talk_Key
Song_Keyin_Prog_Scan:
	Dw	Song_Scan_Enter-1
	Dw	Song_Esc-1
	Dw	Song_Scan_Pgdn-1
	Dw	Song_Scan_Pgup-1
	Dw	Song_Talk-1
	Dw	Song_Talk-1
;----------------------------------------------------------------------------------
Song_Keyin_Scan:
	Ldy	#0Ffh
Song_Keyin_Scan0:
	Iny
	Lda	Song_Keytab_Scan,Y
	Bpl	Song_Keyin_Scan1
	Jmp	Go_Lmainu
Song_Keyin_Scan1:
	Cmp	<Keyno
	Bne	Song_Keyin_Scan0
	Tya
	Asl
	Tay
	Lda	Song_Keyin_Prog_Scan+1,Y
	Pha
	Lda	Song_Keyin_Prog_Scan,Y
	Pha
	Rts
;----------------------------------------------------------------------------------
Song_Scan_Enter:
	Jsr	Let_Answertonewlocabuffor
	Lda	#0
	Sta	Which_Page
	jsr	light_icon_pgup_or_pgdown
	Jsr	Get_Currpage_Offset
	Jsr	Let_Loca2Textbuffor
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
Song_Scan_Pgdn:
	Lda	Which_Page
	Cmp	Page_Count
	Bne	Song_Scan_Pgdn0
	Jmp	Go_Lmainu
Song_Scan_Pgdn0:
	Inc	Which_Page
	jsr	light_icon_pgup_or_pgdown
	Jsr	Get_New
	Jmp	Go_Lmainu
;----------------------------------------------------------------------------------
Song_Scan_Pgup:
	Lda	Which_Page
	Bne	Song_Scan_Pgup0
	Jmp	Go_Lmainu
Song_Scan_Pgup0:
	Dec	Which_Page
	jsr	light_icon_pgup_or_pgdown
	Jsr	Get_New
	Jmp	Go_Lmainu

; #######################################################################################
; #       		子程序 Start							#
; #######################################################################################

;========================================================================================
;Fun:	重新调入准备显示的页内容,并将光标指向第一个'_'
;Input:	Which_Page,Locabuffor_Old
;Output:Textbuffor,Curx,Cury
;===================================================================================
Page_Startvalue:
	Dw	00H,064H,0C8H,12Ch,190H
Disp_Where_Page_Sth:
	Jsr	Get_Currpage_Offset
	Jsr	Let_Loca2Textbuffor
	Jsr	Need_Cursor
	Lda	My_Flag
	Bne	?00
	Lcursoroff
	Rts
?00:
	Lda	Textbuffor_Bak
	Cmp	#'_'
	Beq	?01
        Lda	#0
        Sta	<Curx
        Sta	<Cury
	Jsr	Get_Next_Cursorxy
        Rts
?01:
        Lda	#0
        Sta	<Curx
        Sta	<Cury
        Lcursoron
	Rts

;得到当前页在Locabuffor_Old/New中的偏移值
Get_Currpage_Offset:
	Lda	Which_Page
	Asl
	Tax
	Lda	Page_Startvalue,X
	Sta	Song_Txtlong
	Lda	Page_Startvalue+1,X
	Sta	Song_Txtlongh
	Rts

;复制相关的内容到相关的buffor
Let_Loca2Textbuffor:
	Jsr	Get_Addressold	;(Strinxl),供移动光标
	Jsr	Get_Addressnew	;(Index),供显示
	Ldy	#0
?00:	Lda	(Indxd),Y
	Sta	Textbuffor,Y
	Lda	(Strinxl),Y
	Sta	Textbuffor_Bak,Y
	Iny
	Cpy	#100
	Bne	?00
	jsr	CALL_LUpdateScreen
	lda	which_page
	bne	?11
	jsr	disp_spkbmp
?11:	Rts

;===================================================================================
;Fun	:将当前页中显示的内容(Textbuffor),回写至Locabuffor_New中(用作显示)
;	:而Locabuffor_Old,Textbuffor_Bak内容永远不变(用作光标移动)
;Input	:Textbuffor_Bak,X
;Output	:Curx,Cury
;===================================================================================
Write_Textbuffor2New:	;在按翻页前调用
	Jsr	Get_Currpage_Offset
	Jsr	Get_Addressnew
	Ldy	#0
?00:	Lda	Textbuffor,Y
	Sta	(Indxd),Y
	Iny
	Cpy	#100
	Bne	?00
	Rts

;===================================================================================
;Fun	:计算当前页中'_'的个数
;Input	:
;Output	:Spacenum
;===================================================================================
Get_Spacenum:
	Lda	#0
	Sta	Spacenum
	Ldx	#0
?00:
	Lda	Textbuffor_Bak,X
	Cmp	#'_'
	Beq	?01
?02:	Inx
	Cpx	#100
	Bne	?00
	Rts
?01:	Inc	Spacenum
	Bra	?02

;===================================================================================
;Fun	:寻找当前页中第一个'_'对应于Answerbuffor的哪个位置,'_'的个数
;Input	:
;Output	:Spacenum_Pos,Spacenum
;===================================================================================
Get_Spacenumpos_Pgup:
	Lda	Which_Page
	Beq	Get_Spacenumpos_Page0
	Jsr	Get_Spacenum
	Sec
	Lda	Spacenum_Pos
	Sbc	Spacenum
	Sta	Spacenum_Pos
	Sta	Spacenum_Movepos
	Rts
Get_Spacenumpos_Page0:
	Lda	#0
	Sta	Spacenum_Pos
	Sta	Spacenum_Movepos
	Jsr	Get_Spacenum
	Rts

Get_Spacenumpos_Pgdn:
	Lda	Which_Page
	Beq	Get_Spacenumpos_Page0
	Clc
	Lda	Spacenum_Pos
	Adc	Spacenum
	Sta	Spacenum_Pos
	Sta	Spacenum_Movepos
	Jsr	Get_Spacenum
	Rts

;===================================================================================
;Fun	:得到想要的地址和:Locabuffor_Old+Song_Txtlong
;	:		Locabuffor_New+Song_Txtlong
;Input	:Locabuffor_Old,Song_Txtlong
;Output	:Strinxl
;===================================================================================
Get_Addressold:	;Locabuffor_Old+Song_Txtlong
	Lda	#<Locabuffor_Old
	Sta	Strinxl
	Lda	#>Locabuffor_Old
	Sta	Strinxl+1
	Clc
	Lda	Strinxl

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -