AS V1.41r8 - source file mmlplay.asm - page 1 - 7/14/2004 21:53:16
1/ 0 : ;$Id: mmlplay.asm,v 1.11 2004/07/12 11:09:35 runner Exp $
2/ 0 :
3/ 0 : ;mmlplayer
4/ 0 : ; mmlsyntax
5/ 0 : ; '[{<>}]{cdefgabr}[{+}{1248}][.]'
6/ 0 : ; <:octave down,continue default 0 octave in 0 1 2
7/ 0 : ; >:octave up, continue
8/ 0 : ; CDEFGAG:oto data
9/ 0 : ; +:#
10/ 0 : ; /:Repeat
11/ 0 : ; 01248:otono nagasa default=4
12/ 0 : ; .:futen
13/ 0 : ;
14/ 0 : ; P1[0-7] - LED -GND
15/ 0 : ; P25 - CrystalBuzzer - GND
16/ 0 : ; clock = 6MHz = 2.5us/MachieCycle
17/ 0 :
18/ 0 : page 0
19/ 0 : cpu 8048
20/ 0 :
21/ 0 : =20H _P25ON equ (1<<5)
22/ 0 : =DFH _P25OFF equ (0ffH ! _P25ON)
23/ 0 :
24/ 0 : org 0
25/ 0 : 23 FF mov a,#0ffh
26/ 2 :
27/ 2 : BE 00 mov R6,#0 ;R6:Octave(Default 0)
28/ 4 : BF 00 mov R7,#0 ;R7:mmldata pointer
29/ 6 : loop:
30/ 6 : BD 34 mov R5,#'4' ;R5:MML('0'-'9').default 4bu onpu
31/ 8 : FF mov a,R7
32/ 9 : 1F inc R7
33/ A : E3 movp3 a,@a ;get mml
34/ B : AC mov R4,a ;save mml
35/ C : D3 2F xrl a,#'/' ;check '/' halt
36/ E : C6 59 jz hlt
37/ 10 : FC mov a,R4
38/ 11 : D3 3C xrl a,#'<' ;check '<' Octave down.
39/ 13 : 96 18 jnz L1
40/ 15 : ;MML '<'
41/ 15 : CE dec R6
42/ 16 : 04 06 jmp loop
43/ 18 : FC L1 mov a,R4
44/ 19 : D3 3E xrl a,#'>' ;check '>' Octave Up.
45/ 1B : 96 20 jnz L2
46/ 1D : ;MML '>'
47/ 1D : 1E inc R6
48/ 1E : 04 06 jmp loop
49/ 20 : FC L2 mov a,R4
50/ 21 : 34 39 call fixuptone ;convert MML to vector
51/ 23 : AC mov R4,a ;R4:fixuped value
52/ 24 : FF mov a,R7
53/ 25 : E3 movp3 a,@a
54/ 26 : D3 2B xrl a,#'+' ;check '+'
55/ 28 : 96 2C jnz L3
56/ 2A : 1C inc R4
57/ 2B : 1F inc R7
58/ 2C : FF L3 mov a,R7
59/ 2D : E3 movp3 a,@a
60/ 2E : 03 D0 add a,#(256-'0') ;check < '0'
61/ 30 : E6 3C jnc L4
62/ 32 : FF mov a,R7
63/ 33 : E3 movp3 a,@a
64/ 34 : 03 C6 add a,#(255-'9') ;check > '9'
65/ 36 : F6 3C jc L4
66/ 38 : ;MML '0' - '9'
67/ 38 : FF mov a,R7
68/ 39 : E3 movp3 a,@a
69/ 3A : AD mov R5,a ;R5:MML('0'-'9')
70/ 3B : 1F inc R7
71/ 3C : FF L4 mov a,R7
72/ 3D : E3 movp3 a,@a
73/ 3E : D3 2E xrl a,#'.' ;check '.'
74/ 40 : 96 47 jnz L99
75/ 42 : ;MML '.'
76/ 42 : FD mov a,R5
77/ 43 : 43 80 orl a,#80h
78/ 45 : AD mov R5,a
79/ 46 : 1F inc R7
80/ 47 : L99: ;to play
81/ 47 : ;display led start
82/ 47 : FE mov a,R6
83/ 48 : 47 swap a
84/ 49 : 53 F0 anl a,#0f0h
85/ 4B : 4C orl a,R4
86/ 4C : 37 cpl a
87/ 4D : 39 outl P1,a ;P1:LED display MML
88/ 4E : ;display led end
89/ 4E : FD mov a,R5
90/ 4F : 34 0E call fixuplen
91/ 51 : A9 mov R1,a ;convert MML(length) to R1
92/ 52 : FC mov a,R4 ;convert MML(TONE) to value
93/ 53 : 34 52 call gettone
94/ 55 : 34 00 call play
95/ 57 : 04 06 jmp loop
96/ 59 :
97/ 59 : 04 00 hlt: jmp 0
98/ 5B :
99/ 100 : org ($/256+1)*256
100/ 100 : play:
101/ 100 : ;play sound (R1-1)times play, 1times is mute.
102/ 100 : ;@param a tone value for tone20ms or 0=mute.
103/ 100 : ;@param R1 repeat N(20ms)
104/ 100 : ;@broken R1
105/ 100 : C9 dec R1
106/ 101 : play_loop
107/ 101 : C6 07 jz play_mute
108/ 103 : 34 96 call tone20ms
109/ 105 : 24 09 jmp play_while
110/ 107 : play_mute
111/ 107 : 34 8C call mute20ms
112/ 109 : play_while
113/ 109 : E9 01 djnz R1,play_loop
114/ 10B : 34 8C call mute20ms
115/ 10D : 93 retr
116/ 10E :
117/ 10E : fixuplen:
118/ 10E : ;convert MML length
119/ 10E : ;@param a '0' '1' '2' '4' '8' '9' < 80H < '0' '1' '2' '4' '8' '9'
120/ 10E : ;@return=A 160 80 40 20 10 5 240 120 60 30 15 7
121/ 10E : ;@broken R0
122/ 10E : A8 mov R0,a
123/ 10F : 53 80 anl a,#80h
124/ 111 : 96 1B jnz fixuplen2
125/ 113 : F8 mov a,R0
126/ 114 : 03 D0 add a,#(256-'0') ;sub '0'
127/ 116 : B8 25 mov R0,#(fixuplen_data & 0ffh)
128/ 118 : 68 add a,R0
129/ 119 : A3 movp a,@a
130/ 11A : 93 retr
131/ 11B : fixuplen2
132/ 11B : F8 mov a,R0
133/ 11C : 53 7F anl a,#7fh
134/ 11E : 03 D0 add a,#(256-'0') ;sub '0'
135/ 120 : B8 2F mov R0,#(fixuplen2_data & 0ffh)
136/ 122 : 68 add a,R0
137/ 123 : A3 movp a,@a
138/ 124 : 93 retr
139/ 125 :
140/ 125 : ;Normal Onpu
141/ 125 : fixuplen_data:
142/ 125 : A0 db 160 ;0
143/ 126 : 50 db 80 ;1
144/ 127 : 28 db 40 ;2
145/ 128 : 00 db 0
146/ 129 : 14 db 20 ;4
147/ 12A : 00 db 0
148/ 12B : 00 db 0
149/ 12C : 00 db 0
150/ 12D : 0A db 10 ;8
151/ 12E : 05 db 5 ;9(16)
152/ 12F :
153/ 12F : ; Futen Onpu
154/ 12F : fixuplen2_data:
155/ 12F : F0 db 240 ;0
156/ 130 : 78 db 120 ;1
157/ 131 : 3C db 60 ;2
158/ 132 : 00 db 0
159/ 133 : 1E db 30 ;4
160/ 134 : 00 db 0
161/ 135 : 00 db 0
162/ 136 : 00 db 0
163/ 137 : 0F db 15 ;8
164/ 138 : 07 db 7 ;9(16)
165/ 139 :
166/ 139 : fixuptone:
167/ 139 : ;MML to vector number
168/ 139 : ;@param a 'c' 'd' 'e' 'f' 'g' 'a' 'b' 'r'
169/ 139 : ;@return=A 0 2 4 5 7 9 11 0
170/ 139 : ;@broken R0
171/ 139 : 03 9F add a,#(256-'a') ;sub 'A'
172/ 13B : B8 40 mov R0,#(fixuptone_data & 0ffh)
173/ 13D : 68 add a,R0
174/ 13E : A3 movp a,@a
175/ 13F : 93 retr
176/ 140 : fixuptone_data:
177/ 140 : 09 db 9 ;a
178/ 141 : 0B db 11 ;b
179/ 142 : 00 db 0 ;c
180/ 143 : 02 db 2 ;d
181/ 144 : 04 db 4 ;e
182/ 145 : 05 db 5 ;f
183/ 146 : 07 db 7 ;g
184/ 147 : FF db 255 ;h
185/ 148 : FF db 255 ;i
186/ 149 : FF db 255 ;j
187/ 14A : FF db 255 ;k
188/ 14B : FF db 255 ;l
189/ 14C : FF db 255 ;m
190/ 14D : FF db 255 ;n
191/ 14E : FF db 255 ;o
192/ 14F : FF db 255 ;p
193/ 150 : FF db 255 ;q
194/ 151 : FF db 255 ;r
195/ 152 :
196/ 152 : gettone:
197/ 152 : ;get tone value for tone20ms
198/ 152 : ;param a 0=C(do) 1=C#(do#) 2=D(re) 3=D#(re#) 4=E(mi) ...255=mute
199/ 152 : ;param R6 octave 0 or 1 or 2
200/ 152 : ;return a TONE VALLUE(mute=0)
201/ 152 : ;broken R0
202/ 152 : 17 inc a
203/ 153 : C6 67 jz gettone_end
204/ 155 : 07 dec a
205/ 156 : 2E xch a,R6
206/ 157 : A8 mov R0,a
207/ 158 : 2E xch a,R6 ;R0=Octave
208/ 159 : 17 inc a
209/ 15A : 17 inc a
210/ 15B : 17 inc a ;skip from beepvalue.dat A,A#,B
211/ 15C : 18 inc R0
212/ 15D : 24 61 jmp $+4
213/ 15F : 03 0C add a,#12
214/ 161 : E8 5F djnz R0,$-2
215/ 163 : B8 68 mov R0,#(gettone_value & 0ffh);
216/ 165 : 68 add a,R0
217/ 166 : A3 movp a,@a
218/ 167 : gettone_end
219/ 167 : 93 retr
220/ 168 : gettone_value:
221/ 168 : E1 db 225 ;A 440.00Hz t=2272.73us val=224.77
222/ 169 : D4 db 212 ;A# 466.16Hz t=2145.17us val=212.02
223/ 16A : C8 db 200 ;B 493.88Hz t=2024.77us val=199.98
224/ 16B : BD db 189 ;C 523.25Hz t=1911.13us val=188.61
225/ 16C : B2 db 178 ;C# 554.37Hz t=1803.86us val=177.89
226/ 16D : A8 db 168 ;D 587.33Hz t=1702.62us val=167.76
227/ 16E : 9E db 158 ;D# 622.25Hz t=1607.06us val=158.21
228/ 16F : 95 db 149 ;E 659.26Hz t=1516.86us val=149.19
229/ 170 : 8D db 141 ;F 698.46Hz t=1431.73us val=140.67
230/ 171 : 85 db 133 ;F# 739.99Hz t=1351.37us val=132.64
231/ 172 : 7D db 125 ;G 783.99Hz t=1275.53us val=125.05
232/ 173 : 76 db 118 ;G# 830.61Hz t=1203.94us val=117.89
233/ 174 : 6F db 111 ;A 880.00Hz t=1136.36us val=111.14
234/ 175 : 69 db 105 ;A# 932.33Hz t=1072.58us val=104.76
235/ 176 : 63 db 99 ;B 987.77Hz t=1012.38us val=98.74
236/ 177 : 5D db 93 ;C 1046.50Hz t=955.56us val=93.06
237/ 178 : 58 db 88 ;C# 1108.73Hz t=901.93us val=87.69
238/ 179 : 53 db 83 ;D 1174.66Hz t=851.31us val=82.63
239/ 17A : 4E db 78 ;D# 1244.51Hz t=803.53us val=77.85
240/ 17B : 49 db 73 ;E 1318.51Hz t=758.43us val=73.34
241/ 17C : 45 db 69 ;F 1396.91Hz t=715.86us val=69.09
242/ 17D : 41 db 65 ;F# 1479.98Hz t=675.69us val=65.07
243/ 17E : 3D db 61 ;G 1567.98Hz t=637.76us val=61.28
244/ 17F : 3A db 58 ;G# 1661.22Hz t=601.97us val=57.70
245/ 180 : 36 db 54 ;A 1760.00Hz t=568.18us val=54.32
246/ 181 : 33 db 51 ;A# 1864.66Hz t=536.29us val=51.13
247/ 182 : 30 db 48 ;B 1975.53Hz t=506.19us val=48.12
248/ 183 : 2D db 45 ;C 2093.00Hz t=477.78us val=45.28
249/ 184 : 2B db 43 ;C# 2217.46Hz t=450.97us val=42.60
250/ 185 : 28 db 40 ;D 2349.32Hz t=425.66us val=40.07
251/ 186 : 26 db 38 ;D# 2489.02Hz t=401.77us val=37.68
252/ 187 : 23 db 35 ;E 2637.02Hz t=379.22us val=35.42
253/ 188 : 21 db 33 ;F 2793.83Hz t=357.93us val=33.29
254/ 189 : 1F db 31 ;F# 2959.96Hz t=337.84us val=31.28
255/ 18A : 1D db 29 ;G 3135.96Hz t=318.88us val=29.39
256/ 18B : 1C db 28 ;G# 3322.44Hz t=300.98us val=27.60
257/ 18C :
258/ 18C : mute20ms:
259/ 18C : ;mute 20ms
260/ 18C : ;@param none
261/ 18C : ;@broken R0,TIMER
262/ 18C : 28 xch a,R0
263/ 18D : 27 clr a
264/ 18E : 62 mov T,a
265/ 18F : 55 strt t
266/ 190 : mute20ms_loop
267/ 190 : 16 94 jtf mute20ms_end
268/ 192 : 24 90 jmp mute20ms_loop
269/ 194 : mute20ms_end
270/ 194 : 65 stop tcnt
271/ 195 : 93 retr
272/ 196 :
273/ 196 : tone20ms:
274/ 196 : ;BEEP to P25 while 20ms
275/ 196 : ;@param a:tone control 25+10N (us)
276/ 196 : ;@broken R0,TIMER
277/ 196 : 28 xch a,R0
278/ 197 : 27 clr a
279/ 198 : 62 mov T,a
280/ 199 : 55 strt t
281/ 19A : 28 xch a,R0
282/ 19B : tone20ms_loop: ;5+2*(N-1)+5+2*(N-1)+4 Machine Cycle.
283/ 19B : 8A 20 orl P2,#_P25ON ;=14+4*(N-1) = 10+4N = 25+10N(us)
284/ 19D : A8 mov R0,a ;Ex. 440Hz = 2273us = (2273-25)/10N ... N=225
285/ 19E : E8 9E djnz R0,$
286/ 1A0 : 9A DF anl P2,#_P25OFF
287/ 1A2 : A8 mov R0,a
288/ 1A3 : E8 A3 djnz R0,$
289/ 1A5 : 16 A9 jtf tone20ms_end
290/ 1A7 : 24 9B jmp tone20ms_loop
291/ 1A9 : tone20ms_end
292/ 1A9 : 65 stop tcnt
293/ 1AA : 93 retr
294/ 1AB :
295/ 300 : org 0300h ;8048 Page 3
296/ 300 : mmldata:
297/ 300 :
298/ 300 : ; ;EIGA KINJIRARETA ASOBI
299/ 300 : ; db "aaaagffeddfa>ddddcc+ddddcc+c+c+ddddc+cddddcc+ee8ecd8.e9d8c8dd8dde8.f9e8d8e4.r8"
64 64 65 38 2E 66
39 65 38 64 38 65
34 2E 72 38
310/ 32D : 3C 67 38 3E 65 65 db "ee8ecd8.e9d8c8dd8d8r8e8r8c2r4"
64 38 72 38 65 38
72 38 63 32 72 34
312/ 357 : db ""
313/ 357 : 63 38 3C 62 38 61 db "c8c8c8cce8d8c2r4"
38 63 63 65 38 64
38 3C 62 38 3E 63
32 72 34
315/ 381 : 64 38 65 38 66 38 db "d8e8f8fff8e8d8e8.a8.>c8c4r4"
66 66 66 38 65 38
64 38 65 38 2E 61
38 2E 3E 63 38 63
34 72 34
316/ 39C : 3C 61 32 61 38 62 db "ee8ecd8.e9d8c8dd8dde8.f9e8d8e4.r8"
64 64 65 38 2E 66
39 65 38 64 38 65
34 2E 72 38
320/ 3D6 : 3C 67 38 3E 65 65 db "ee8ecd8.e9d8c8dd8d8r8e8r8c1<"
64 38 72 38 65 38
72 38 63 31 3C
322/ 3FF : db ""
323/ 3FF : 72 31 db "r1"
324/ 401 : 2F db "/"
325/ 402 :
326/ 402 :
327/ 402 : end
AS V1.41r8 - source file mmlplay.asm - page 2 - 7/14/2004 21:53:16
symbol table (* = unused):
------------------------
*ARCHITECTURE : i386-unknown-freebsd - |
*BIGENDIAN : 0 - | *BRANCHEXT : 0 - |
*CASESENSITIVE : 0 - | *CONSTPI : 3.141592653589793 - |
*DATE : 7/14/2004 - | *FALSE : 0 - |
FIXUPLEN : 10E C | FIXUPLEN2 : 11B C |
FIXUPLEN2_DATA : 12F C | FIXUPLEN_DATA : 125 C |
FIXUPTONE : 139 C | FIXUPTONE_DATA : 140 C |
*FULLPMMU : 1 - | GETTONE : 152 C |
GETTONE_END : 167 C | GETTONE_VALUE : 168 C |
*HAS64 : 1 - | *HASFPU : 0 - |
*HASPMMU : 0 - | HLT : 59 C |
*INEXTMODE : 0 - | *INLWORDMODE : 0 - |
*INMAXMODE : 0 - | *INSRCMODE : 0 - |
*INSUPMODE : 0 - | L1 : 18 C |
L2 : 20 C | L3 : 2C C |
L4 : 3C C | L99 : 47 C |
*LISTON : 1 - | LOOP : 6 C |
*MACEXP : 1 - | *MMLDATA : 300 C |
*MOMCPU : 8048 - | *MOMCPUNAME : 8048 - |
MUTE20MS : 18C C | MUTE20MS_END : 194 C |
MUTE20MS_LOOP : 190 C | *PADDING : 1 - |
PLAY : 100 C | PLAY_LOOP : 101 C |
PLAY_MUTE : 107 C | PLAY_WHILE : 109 C |
*RELAXED : 0 - | *TIME : 21:53:16 - |
TONE20MS : 196 C | TONE20MS_END : 1A9 C |
TONE20MS_LOOP : 19B C | *TRUE : 1 - |
*VERSION : 1418 - | _P25OFF : DF - |
_P25ON : 20 - |
54 symbols
26 unused symbols
AS V1.41r8 - source file mmlplay.asm - page 3 - 7/14/2004 21:53:16
codepages:
----------
STANDARD (0 changed characters)
0.11 seconds assembly time
329 lines source file
2 passes
0 errors
0 warnings