📄 listen.asm
字号:
; ***************************************************************************
; * 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 + -