📄 main.asl
字号:
+ 1 ;****************************************************************;
+ 2 ; MOUSE-hourse
+ 3 ; Version 1.0
+ 4 ;
+ 5 ; MCU Body: KB 89C21(89R21)
+ 6 ; ROM size: 16K Bytes
+ 7 ; RAM size: 512 Bytes
+ 8 ; Interrupt: three timer and two external interrupt
+ 9 ; Clock: Dual,Fast,Slow clock (4M, set temporarily)
+ 10 ; Operating Mode: Dual,Fast,Slow,Idle,Sleep
+ 11 ; Built-in WATCH DOG TIMER
+ 12 ; 16 bi-directional I/O pins
+ 13 ;; Written by: lixy
+ 14 ; Date: 2004-02-16
+ 15 ; chagen by :he qingrang
+ 16 ; date: 2004-06-25
+ 17 ;****************************************************************;
+ 18
+ 19 ;================================================================;
+ 20 ;CONSTANT AREA
+ 21 ;================================================================;
00EF 22 c_sp equ #0efh ;the sp address
00FF 23 c_ram equ #0ffh ;the maximum ram size
0000 24 c_t1h equ #00h ;set timer1 frequency 8KHz,(slow clock)32K/8K-1=3=0003h
0003 25 c_t1l equ #03h
0022 26 c_t2h equ #22h ;set timer2 frequency 300Hz,(fast clock)4M/1.5/300-1=8888=22b8h
00B8 27 c_t2l equ #0b8h
001C 28 c_op1 equ #00011100b ;R_OP1: bit7:DRDY, bit6:STOP, bit5:SLOW, bit4:INTE
+ 29 ; bit3:T2E, bit2:T1E, bit1:Z, bit0:C
+ 30 ;c_ier equ #00110b ;R_IER: bit4:TB, bit3:INT1, bit2:T1, bit1:T2, bit0:INT2
0007 31 c_ier equ #00111b ;R_IER: bit4:TB, bit3:INT1, bit2:T1, bit1:T2, bit0:INT2
0004 32 c_ier_en_t1 equ #00100b ;R_IER: bit4:TB, bit3:INT1, bit2:T1, bit1:T2, bit0:INT2
0002 33 c_ier_en_t2 equ #00010b ;R_IER: bit4:TB, bit3:INT1, bit2:T1, bit1:T2, bit0:INT2
0001 34 c_ier_en_int2 equ #00001b ;R_IER: bit4:TB, bit3:INT1, bit2:T1, bit1:T2, bit0:INT2
0003 35 c_init_point_h equ #03h
00E7 36 c_init_point_l equ #0e7h ;999=03e7H
0005 37 c_fail_loop equ #5 ;when fail,play fail voice and lcd flash times
0078 38 c_point_dec_intvl equ #120 ;120/300=400ms
0006 39 c_play_v_normal_intvl equ #6 ;(c_point_dec_intvl/300)*c_play_voice_intvl
0001 40 c_play_v_fast_intvl equ #1
0032 41 c_fast_voice equ #50 ;<255 and >50,fast voice
0064 42 c_over_sound_rum equ #100 ;
+ 43 ;================================================================;
+ 44 ;DATA AREA
+ 45 ;================================================================;
+B 00 01
+ 46 .area main_var(data)
+ 47
0000 48 flg_new_random:: .ds 1 ;the flag of generating new random number
+ 49 ;"0" not generate new random number
+ 50 ;"1" generate new random number in free movement course
+ 51 ;"2" generate new random number when received IR
0001 52 cnt_point:: .ds 2 ;point counter,it will decrease 1 each interval
0003 53 cnt_fail_loop:: .ds 1
0004 54 cnt_play_v_intvl:: .ds 1 ;play voice interval,(c_point_dec_intvl/300)*cnt_play_v_intvl,
0005 55 cnt_over_sound_rum:: .ds 1 ;play gameover song times
+ 56 ;================================================================;
+ 57 ;CODE AREA
+ 58 ;================================================================;
+B 00 02
+ 59 .area main_code(code,abs)
+ 60 .org 0x00
0000 02 00 16 61 br start_initial
+ 62 .org 0x06 ;Int1(prtd.6) entry
0006 02 00 15 63 br int1_isr
+ 64 .org 0x09 ;Timer1 entry
0009 02 00 00 65 br t1_isr
+ 66 .org 0x0c ;Timer2 entry
000C 02 00 00 67 br t2_isr
+ 68 .org 0x0f ;Int2(prtd.7) entry
000F 02 00 00 69 br INT2_isr
+ 70 .org 0x12 ;Time base entry
0012 02 00 15 71 br tb_isr
+ 72
0015 73 int1_isr:
+ 74 ;t1_isr:
+ 75 ;t2_isr:
+ 76 ;int2_isr:
0015 77 tb_isr:
0015 25 78 reti
+ 79 ;----------------------------------------------------------------;
+ 80 ;Start Initial
+ 81 ;----------------------------------------------------------------;
0016 82 start_initial:
0016 F3 EF 83 lda #c_sp ;set stack pointer
0018 FC 18 84 sta r_sp
001A F3 FF 85 lda #11111111b
001C FC 32 86 sta r_prtd ;set i/o prtd
001E F3 FF 87 lda #11111111b ;set prtc[0,1,2] "0" when initial, IR driver circuit worked at high level.
0020 FC 31 88 sta r_prtc ;set i/o prtc
0022 89 clear_memory: ;clear sram(page0)其中包括显存(f0h-ffh)
0022 F3 00 90 lda #00h
0024 FC 21 91 sta r_dp
0026 92 clr_m:
0026 F3 00 93 lda #00h
0028 FE 94 sta i
0029 F0 21 95 lda r_dp
002B A7 FF 96 cmpe #c_ram
002D 06 00 34 97 brz clr_end
0030 18 98 incdp
0031 02 00 26 99 br clr_m
0034 100 clr_end:
+ 101 ;----------------------------------------------------------------;
+ 102 ;Set Timer1 Frequency Subroutine
+ 103 ;----------------------------------------------------------------;
0034 F3 00 104 lda #c_t1h ;set timer1
0036 FC 11 105 sta r_t1h
0038 F3 03 106 lda #c_t1l
003A FC 08 107 sta r_t1l
003C F3 22 108 lda #c_t2h ;set timer2
003E FC 14 109 sta r_t2h
0040 F3 B8 110 lda #c_t2l
0042 FC 12 111 sta r_t2l
+ 112 ;Initial Registor Subroutine
+ 113 ;----------------------------------------------------------------;
0044 F3 00 114 lda #00h
0046 FC 54 115 sta r_tpp
0048 FC 02 116 sta r_tph
004A FC 01 117 sta r_tpl
004C FC 28 118 sta r_pp
004E FC 48 119 sta r_voc
0050 FC 34 120 sta r_pwmc
0052 F3 00 121 lda #00000000b ;set normal mode,close int,t1,t2,tb
0054 FC 22 122 sta r_op1
0056 FC 24 123 sta r_op2
0058 F3 00 124 lda #00000b ;disable all interrupt
005A FC 04 125 sta r_ier
+ 126 ; lda #01h
+ 127 ; sta r_lcdc ;点亮LCD
005C 28 128 clrint
005D F3 03 129 lda #c_init_point_h ;lcd display initial "999"
005F FD 02 130 sta cnt_point+1
0061 F3 E7 131 lda #c_init_point_l
0063 FD 01 132 sta cnt_point
0065 F3 1C 133 lda #c_op1 ;#00011100b,normal mode, open interrupt,enable timer1
0067 FC 22 134 sta r_op1 ; R_OP1: bit7:DRDY, bit6:STOP, bit5:SLOW, bit4:INTE
0069 F3 02 135 lda #c_ier_en_t2 ;enable timer2
006B FC 04 136 sta r_ier
006D DB 04 137 ora #c_ier_en_t1 ;enable timer1
006F FC 04 138 sta r_ier
0071 DB 01 139 ora #c_ier_en_int2 ;enable int2
0073 FC 04 140 sta r_ier
+ 141 ;----------------------------------------------------------------;
+ 142 ;Wait for nose key pressed, if nose key is pressed and released,the mouse start run
+ 143 ;----------------------------------------------------------------;
0075 20 00 00 144 call scan_key_start
0078 145 main:
0078 29 146 clrwdt ;add Watch Dog function
+ 147 ;-----------------------------------------------------------------------
+ 148 ;judge if touched sign is received, if yes, the game will over
+ 149 ;-----------------------------------------------------------------------
0079 20 00 88 150 call if_gameover
+ 151 ;calculating the points and display it,play the sound
007C 20 00 CD 152 call cal_point
+ 153 ;-----------------------------------------------------------------------
+ 154 ;scan stall,nose,trap key
007F 20 00 00 155 call scan_key
+ 156 ;-----------------------------------------------------------------------
0082 20 00 00 157 call Run
0085 02 00 78 158 br main
+ 159
+ 160 ;//***********************Game Over*************************************
0088 161 if_gameover::
0088 F1 00 162 lda flg_rcv_touched
008A A7 01 163 cmpe #1 ;touched the cheese
008C 06 00 90 164 brz gameover
008F 24 165 ret
0090 166 gameover:
0090 20 00 00 167 call select_sound_gameover
0093 F3 00 168 lda #0
0095 FD 05 169 sta cnt_over_sound_rum
0097 170 gameover_song:
0097 29 171 clrwdt
0098 F3 FF 172 lda #0ffh
009A A5 00 173 cmpe M_stopbit
009C 07 00 97 174 brnz gameover_song
009F 20 00 00 175 call debounce
00A2 20 00 00 176 call select_sound_gameover
00A5 177 gameover_song1:
00A5 29 178 clrwdt
+ 179 ; lda #0ffh
+ 180 ; cmpe M_stopbit
+ 181 ; brnz gameover_song1
00A6 F1 05 182 lda cnt_over_sound_rum
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -