0100 ;MUSICIAN 0110 ;BY MIKE EGGERS AND MATT LOVELESS 0120 ;(c) 1987, ANTIC PUBLISHING 0130 .TITLE "MUSICIAN -- Music Player" 0140 ; 0150 AUDC1 = $D201 ;Control reg for 0160 ; sounds 0170 AUDF1 = $D200 ;Tone frequency 0180 ; reg. 0190 CLOCK = $14 ;Last byte of 0200 ; real-time clock 0210 TEMPO = $D6 ;Tempo index 0220 ; number*4 0230 OCTAVE = $D7 ;Octave of note 0240 ; (3-6). 0250 DURATN = $D8 ;Tone duration 0211 ; index. 0260 ; index 0270 POS = $D9 ;Current pos. 0280 ; in string. 0290 ADDR = $DA ;Location of 0300 ; string. 0310 TONES = $DC ;Addr of string 0320 ; w/note info. 0330 TIME = $DE ;Addr of string with duration info 0340 ; ; w/duration inf 0350 ; 0360 *= $0600 0370 ; 0380 TOP 0390 LDA #0 ;Set default 0400 STA TEMPO ; tempo, 0410 STA DURATN ; duration, 0420 STA POS ; position 0430 LDA #2 ; & octave. 0440 STA OCTAVE 0450 PLA ;Ignore argument 0460 ; count. 0470 PLA ;get addr 0480 ; of string. 0490 STA ADDR+1 0500 PLA 0510 STA ADDR 0520 PLA ;Get addr of 0530 ; tone variable. 0540 STA TONES+1 0550 PLA 0560 STA TONES 0570 PLA ;Get addr of 0580 ; time variable. 0590 STA TIME+1 0600 PLA 0610 STA TIME 0620 PLA ;Ignore hi-byte 0630 ; of volume. 0640 PLA ;Get low-byte 0650 ; of volume, 0660 ORA #$A0 ;OR w/distortion 0670 ; value, 0680 STA AUDC1 ; init sound. 0690 INC1 0700 LDY POS ;Find index into 0710 ; string. 0720 INC POS ;Move right 0730 LDA (ADDR),Y ;Get current 0740 ; character. 0750 TAX ; Save it. 0760 INY ; Increase again 0770 LDA (ADDR),Y ;Get operand 0780 ; (if any) 0790 TAY ;Save it. 0800 SEC ;Make operand 0810 ; into an index 0820 SBC #$31 ; by subtracting 0830 ; a "1". 0840 CPX #$54 ;Is it a tempo 0850 ; command? 0860 BNE TSTDUR ;No. Try again. 0870 ; 0880 ASL A ;Multiply by 4 0890 ; for an index 0900 ASL A ; into table. 0910 STA TEMPO ;Done. 0920 ; 0930 TSTDUR 0940 CPX #$4C ;A duration cmd? 0950 BNE TSTOCT ;No. Try again. 0960 ; 0970 STA DURATN ;Save new 0980 ; dur. index. 0990 TSTOCT 1000 CPX #$4F ;Is it an "O" 1010 ; (An Octave?) 1020 BNE TSTPER ;No. Try again. 1030 ; 1040 SEC ;subtract two to 1050 SBC #$02 ; find total of 1060 ; "3" 1070 STA OCTAVE ; and save it. 1080 TSTPER 1090 CPX #$2E ;Is it a period? 1100 BNE TSTCOM ;No. 1110 ; 1120 RTS 1130 ; 1140 TSTCOM 1150 CPX #$2C ;Is it a delay? 1160 BNE TSTSEM ;No. 1170 ; 1180 LDA TEMPO ;1st duration 1190 ; for this tempo 1200 CLC ; and branch. 1210 BCC DELAY2 ;UNCONDITIONAL! 1220 ; 1230 TSTSEM 1240 CPX #$3B ;Is it a " ; "? 1250 BNE TSTNOTE ;No. Try again. 1260 ; 1270 LDA #5 ;Delay for 1/12 1280 ; of a second. 1290 BNE DELAY3 ;UNCONDITIONAL! 1300 ; 1310 TSTNOTE 1320 CPX #$41 ;Less than "A" ? 1330 BMI INC1 ;Yes... 1340 ; 1350 CPX #$48 ;Gr. than "G" ? 1360 BCS INC1 ;Yes, so note 1370 ; is illegal. 1380 ; 1390 TXA ;Convert note to 1400 ; an index 1410 SEC ; by subtracting 1420 ; an "A" 1430 SBC #$41 1440 ASL A ;Multiply by two 1450 CPY #$23 ;Is next char. 1460 ; a "#" ? 1470 BNE FLAT ;No. Try again. 1480 ; 1490 CLC ;get flat of nxt 1500 ; higher note. 1510 ADC #3 1520 FLAT 1530 CPY #$2D ;Is next char a 1540 ; "-" ? 1550 BNE TIMES4 ;No. Try again. 1560 ; 1570 CLC ;Point to Flat 1580 ; value. 1590 ADC #1 1600 TIMES4 1610 CMP #$0F ;Is Note greater 1620 ; than G# ? 1630 BCC TIMES5 ;No. Try again. 1640 ; 1650 LDA #1 ;Yes. Go back to 1660 ; A-flat. 1670 TIMES5 1680 ASL A ;Multiply note 1690 ; by 4 to get a 1700 ASL A ; table index. 1710 CLC ;Add octave for 1720 ADC OCTAVE ; position of 1730 ; sound vlue 1740 TAY ;Prepare to LOAD 1750 LDA (TONES),Y ;get actual 1760 ; sound value 1770 STA AUDF1 ; & start note. 1780 DELAY 1790 LDA TEMPO ;Figure tone 1800 ; duration by 1810 CLC ; by adding 1820 ; duration to 1830 ; TEMPO*4 1840 ADC DURATN ; to get index. 1850 DELAY2 1860 TAY ;Prepare to LOAD 1870 LDA (TIME),Y ;Get actual 1880 ; tone duration. 1890 DELAY3 1900 LDY #0 ;Reset clock 1910 STY CLOCK 1920 WAIT 1930 CMP CLOCK ;Time up? 1940 BCS WAIT ;No. Continue. 1950 ; 1960 STY AUDF1 ;Turn off sound. 1970 CLC 1980 BCC INC1 ;UNCONDITIONAL! 1990 ; 2000 .END
Back to previous page