
 1000  *---------------------------------
 1010  *      DUAL TONE, AND TONE WITH VOLUME CONTROL
 1020  *---------------------------------
 1030  *      WRITTEN BY MARK KRIEGSMAN.......5-22-81
 1040  *      REVISED BY BOB SANDER-CEDERLOF..5-29-81
 1050  *---------------------------------
 1060         .OR $300
 1070         .TF B.AMPERTONES
 1080  *---------------------------------
 1090  *      ROM SUBROUTINES USED
 1100  *---------------------------------
 1110  CHKCOM .EQ $DEBE    MUST SEE COMMA
 1120  SYNERR .EQ $DEC9    SYNTAX ERROR
 1130  GTBYTC .EQ $E6F5    EAT CHAR, GET BYTE IN X
 1140  GETNUM .EQ $E746    GET TWO-BYTE VALUE IN $50,51
 1150  *                   THEN COMMA AND ONE-BYTE VALUE IN X
 1160  *---------------------------------
 1170  *      PAGE-ZERO VARIABLES
 1180  *---------------------------------
 1190  DURATION   .EQ $50 AND $51
 1200  TONE1.CNT  .EQ $FB
 1210  TONE2.CNT  .EQ $FC
 1220  TONE1      .EQ $FD
 1230  TONE2      .EQ $FE
 1240  VOLUME     .EQ $FF
 1250  *---------------------------------
 1260  *      I/O ADDRESSES
 1270  *---------------------------------
 1280  SPKR       .EQ $C030
 1290  *---------------------------------
 1300  AMPERSAND.VECTOR    .EQ $3F5 THRU $3F7
 1310  *---------------------------------
 1320  *      INITIALIZE AMPERSAND VECTOR
 1330  *---------------------------------
 1340  INIT   LDA #$4C     JMP OPCODE
 1350         STA AMPERSAND.VECTOR
 1360         LDA #AMPERTONE
 1370         STA AMPERSAND.VECTOR+1
 1380         LDA /AMPERTONE
 1390         STA AMPERSAND.VECTOR+2
 1400         RTS
 1410  *---------------------------------
 1420  *      AMPERSAND ENTRY POINT
 1430  *---------------------------------
 1440  AMPERTONE
 1450         CMP #'T      IS IT TONE?
 1460         BEQ SINGLE.TONE
 1470         CMP #'D      IS IT DUAL?
 1480         BEQ DUAL.TONES
 1490         JMP SYNERR   NEITHER, SO SYNTAX ERROR
 1500  *---------------------------------
 1510  *      &T <TONE>,<DURATION>,<VOLUME>
 1520  *---------------------------------
 1530  SINGLE.TONE
 1540         JSR GET.PARAMS
 1550         TXA          LIMIT VOLUME
 1560         AND #15      TO 0-15
 1570         STA VOLUME
 1580         LDA TONE1
 1590         STA TONE1.CNT
 1600  .1     DEC TONE1.CNT
 1610         BNE .5
 1620         LDA SPKR     TOGGLE SPEAKER
 1630         LDA TONE1    RESET COUNTER
 1640         STA TONE1.CNT
 1650         LDY VOLUME
 1660  .3     NOP
 1670         NOP
 1680         DEY
 1690         BPL .3
 1700         LDA SPKR     TOGGLE SPEAKER AGAIN
 1710         LDY VOLUME   EQUALIZE VOLUME DELAY
 1720  .4     NOP
 1730         INY
 1740         CPY #16
 1750         BCC .4
 1760  .5     LDY #10      SHORT ADDITIONAL DELAY
 1770  .6     DEY
 1780         BNE .6
 1790         JSR DECREMENT.DURATION
 1800         BCC .1
 1810         RTS
 1820  *---------------------------------
 1830  *      &D <TONE1>,<DURATION>,<TONE2>
 1840  *---------------------------------
 1850  DUAL.TONES
 1860         JSR GET.PARAMS
 1870         STX TONE2
 1880         LDA TONE1
 1890         STA TONE1.CNT
 1900         LDA TONE2
 1910         STA TONE2.CNT
 1920  .1     DEC TONE1.CNT
 1930         BEQ .2       TIME TO TOGGLE
 1940         LSR VOLUME   TO EQUALIZE TIME
 1950         LDA VOLUME   TO EQUALIZE TIME
 1960         BPL .3       ...ALWAYS
 1970  .2     LDA SPKR     TOGGLE SPEAKER
 1980         LDA TONE1    RESET COUNTER
 1990         STA TONE1.CNT
 2000  .3     DEC TONE2.CNT
 2010         BEQ .4
 2020         LSR VOLUME   TO EQUALIZE TIME
 2030         LDA VOLUME   TO EQUALIZE TIME
 2040         BPL .5       ...ALWAYS
 2050  .4     LDA SPKR     TOGGLE SPEAKER
 2060         LDA TONE2    RESET COUNTER
 2070         STA TONE2.CNT
 2080  .5     JSR DECREMENT.DURATION
 2090         BCC .1
 2100         RTS
 2110  *---------------------------------
 2120  *      GET THREE PARAMETERS AFTER &T OR &D
 2130  *      1. 8-BIT VALUE, STORE IN TONE1
 2140  *      2. COMMA
 2150  *      3. 16-BIT VALUE, STORE IN DURATION
 2160  *      4. COMMA
 2170  *      5. 8-BIT VALUE, RETURN IN X-REGISTER
 2180  *---------------------------------
 2190  GET.PARAMS
 2200         JSR GTBYTC   GET TONE
 2210         STX TONE1
 2220         JSR CHKCOM
 2230         JMP GETNUM   GET DURATION AND VOLUME
 2240  *---------------------------------
 2250  *      DECREMENT DURATION
 2260  *      RETURN CARRY CLEAR IF NOT FINISHED
 2270  *---------------------------------
 2280  DECREMENT.DURATION
 2290         LDA DURATION FINISHED YET?
 2300         BNE .2
 2310         LDA DURATION+1
 2320         BNE .1
 2330         SEC
 2340         RTS          FINISHED
 2350  .1     DEC DURATION+1
 2360  .2     DEC DURATION
 2370         CLC
 2380         RTS

