PROGRAM LISTING: 87-04/MUSICIAN.M65
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