home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG029.ARK / MUSIC.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  418 lines

  1. ;    ALPHA-NUMERIC MUSIC WITH AMPLITUDE CONTROL
  2. ;
  3. ;    COPYRIGHT 1975 BY MALCOLM T. WRIGHT
  4. ;
  5. ;    AVAILABLE FROM: PEOPLE'S COMPUTER COMPANY
  6. ;            BOX 310
  7. ;            MENLO PARK, CALIFORNIA 94025
  8. ;
  9. PORT    EQU    02H        ;PARALLEL OUTPUT PORT
  10. ;
  11.     ORG    100H
  12.     LXI    H,TABLE        ;START OF MUSIC TABLE
  13. NEXT    INX    H
  14.     MOV    A,M
  15.     ANI    7FH        ;ERASE PARITY
  16.     LXI    D,NEXT        ;LOAD STACK WITH RETURN ADDR
  17.     PUSH    D        ;FOR CHARACTER SEARCH
  18.     NOP
  19.     CPI    'L'        ;IS THE CHARACTER AN 'L' ?
  20.     JNZ    CTRLA
  21. LEAVE    INX    SP
  22.     INX    SP
  23.     RET            ;RETURN TO SUPERVISOR PROG.
  24. CTRLA    CPI    'A'-40H        ;IS IT A CONTROL A ?
  25.     JNZ    CTRLE
  26.     STA    SAVEF        ;SAVE CTRL-A AS FLAG
  27.     RET            ;RETURN TO NEXT
  28. CTRLE    CPI    'E'-40H        ;IS IT A CONTROL-E ?
  29.     JZ    ENVEL        ;GO TO ENVELOPE ROUTINE
  30.     CPI    'V'-40H        ;IS IT A CONTROL-V ?
  31.     JZ    VOL        ;GO TO VOLUME ROUTINE
  32.     CPI    'T'-40H        ;IS IT A CONTROL-T ?
  33.     JZ    TEMPO        ;GO TO TEMPO ROUTINE
  34.     CPI    'R'-40H        ;IS IT A CONTROL-R ?
  35.     JZ    REP        ;GO TO REPEAT ROUTINE
  36.     CPI    'J'-40H        ;IS IT A CONTROL-J ?
  37.     JZ    JOUT        ;GO TO JUMP-OUT ROUTINE
  38.     CPI    'S'-40H        ;IS IT A CONTROL-S ?
  39.     JZ    STOP        ;GO TO STOP-REPEAT ROUTINE
  40.     CPI    'R'        ;IS IT AN 'R' ?
  41.     JZ    REST        ;GO TO REST ROUTINE
  42.     MOV    B,A
  43.     IN    01H
  44.     CPI    'S'        ;IS IT AN 'S' ?
  45.     MOV    A,B
  46.     JZ    LEAVE        ;LEAVE MUSIC PROG
  47.     DI
  48.     CPI    '1'        ;IS IT A '1' ? OCTAVE # SEARCH
  49.     JC    DURA
  50.     CPI    '7'        ;IS IT A '7' ?
  51.     JNC    DURA
  52.     ANI    07H        ;SAVE LS 3 BITS
  53.     STA    SAVEO
  54.     PUSH    H        ;SAVE MUSIC TABLE ADDR
  55.     CPI    04H        ;IS IT THE 4TH OCTAVE
  56.     JC    CHGLP
  57.     LXI    H,LOOP1
  58.     JMP    INSTR
  59. CHGLP    LXI    H,SLOW
  60. INSTR    SHLD    JUMP        ;LOAD IN NEW JUMP ADDR
  61.     POP    H
  62.     RET            ;RETURN TO NEXT
  63. DURA    MVI    B,01H        ;DURATION CHARACTER SEARCH
  64.     LXI    D,ADDR1
  65.     PUSH    D
  66.     CPI    'W'        ;IS IT A 'W' ?
  67.     RZ
  68.     INR    B
  69.     CPI    'H'        ;IS IT AN 'H' ?
  70.     RZ
  71.     INR    B
  72.     CPI    'Q'        ;IS IT A 'Q' ?
  73.     RZ
  74.     INR    B
  75.     CPI    'O'        ;IS IT AN 'O' ?
  76.     RZ
  77.     INR    B
  78.     CPI    'S'        ;IS IT AN 'S' ?
  79.     RZ
  80.     INR    B
  81.     CPI    'T'        ;IS IT A 'T' ?
  82.     RET
  83. ADDR1    JNZ    NOTE
  84.     MOV    A,B
  85.     STA    SAVED
  86.     XRA    A        ;ZERO ACC
  87.     STA    SAVEF        ;ERASE CONTROL-A FLAG
  88.     RET            ;RETURN TO NEXT
  89. NOTE    MVI    B,01H        ;NOTE CHARACTER SEARCH
  90.     LXI    D,ADDR2
  91.     PUSH    D
  92.     CPI    'C'        ;IS IT A 'C' ?
  93.     RZ
  94.     INR    B
  95.     INR    B
  96.     CPI    'D'        ;IS IT A 'D' ?
  97.     RZ
  98.     INR    B
  99.     INR    B
  100.     CPI    'E'        ;IS IT AN 'E' ?
  101.     RZ
  102.     INR    B
  103.     CPI    'F'        ;IS IT AN 'F' ?
  104.     RZ
  105.     INR    B
  106.     INR    B
  107.     CPI    'G'        ;IS IT A 'G' ?
  108.     RZ
  109.     INR    B
  110.     INR    B
  111.     CPI    'A'        ;IS IT AN 'A' ?
  112.     RZ
  113.     INR    B
  114.     INR    B
  115.     CPI    'B'        ;IS IT A 'B' ?
  116.     RET            ;TO ADDR2
  117. ADDR2    RNZ            ;TO NEXT
  118.     INX    H
  119.     MOV    A,M
  120.     CPI    '!'        ;IS IT AN EXCLAMATION (FLAT) ?
  121.     JNZ    SNOTE
  122.     DCR    B
  123.     JMP    STONOTE
  124. SNOTE    CPI    '#'        ;IS IT A '#' ?
  125.     JNZ    NOTFD
  126.     INR    B
  127.     JMP    STONOTE
  128. NOTFD    DCX    H
  129. STONOTE    MOV    A,B
  130.     STA    SAVEN
  131.     PUSH    H
  132.     LDA    SAVEO        ;START FREQ LOOK-UP
  133.     MOV    B,A
  134.     LXI    H,FREQ        ;1ST ADDR OF FREQ TABLE
  135.     LXI    D,0EH        ;# OF BYTES IN AN OCTAVE
  136. BAK1    DCR    B
  137.     JZ    GETN
  138.     DAD    D
  139.     JMP    BAK1
  140. GETN    LDA    SAVEN
  141.     MOV    E,A
  142.     DAD    D
  143.     MOV    A,M
  144.     STA    FREQ1        ;SAVE FREQ VALUE IN PLAY-NOTE
  145.     MOV    B,A
  146.     LDA    SAVEO
  147.     CPI    04H
  148.     MOV    A,B
  149.     JC    LOW        ;JUMP IF OCTAVE 1,2, OR 3
  150.     SUI    04H        ;SUBTRACT 4 FROM FREQ VALUE
  151.     DB    21H        ;LXI    H,
  152.     DCR    C
  153.     DCR    C
  154.     JMP    STORE        ;TO TWO DCR C
  155. LOW    DCR    A
  156.     DB    21H        ;LXI    H,
  157.     NOP            ;CHANGE PLAY-NOTE INSTRUCTION
  158.     NOP
  159. STORE    STA    FREQ2        ;TO TWO NOPS AND STORE IT
  160.     SHLD    CHGT
  161. OPMET    LDA    SAVET        ;START TEMPO LOOK-UP
  162.     MOV    B,A
  163.     LXI    H,TEMPO        ;1ST ADDR OF TEMPO TABLE
  164.     LXI    D,1CH        ;# OF BYTES IN AN OCTAVE
  165. BAK2    DCR    B
  166.     JZ    GETD
  167.     DAD    D
  168.     JMP    BAK2
  169. GETD    LDA    SAVEN        ;NOTE DURATION SEARCH
  170.     RLC            ;MULTIPLY BY TWO ACC
  171.     MOV    E,A
  172.     DAD    D
  173.     MOV    E,M        ;GET LOWER HALF OF DURATION
  174.     INX    H
  175.     MOV    D,M        ;GET UPPER HALF OF DURATION
  176.     LDA    SAVEO
  177.     CMA            ;CONVERT 1-6 TO 6-1
  178.     ANI    07H
  179.     MOV    B,A
  180. BAK3    DCR    B
  181.     JZ    CONT1
  182.     CALL    DPSR        ;DOUBLE PRECISION SHIFT RIGHT
  183.     JMP    BAK3
  184. DPSR    XRA    A        ;RESET CARRY
  185.     MOV    A,D
  186.     RAR
  187.     MOV    D,A
  188.     MOV    A,E
  189.     RAR
  190.     MOV    E,A
  191.     RET
  192. CONT1    LDA    SAVED
  193.     MOV    B,A
  194. BAK4    DCR    B
  195.     JZ    GETF
  196.     CALL    DPSR
  197.     JMP    BAK4
  198. GETF    LDA    SAVEF
  199.     CPI    'A'-40H        ;IS IT A CONTROL 'A' ?
  200.     LXI    H,0000H        ;CLEAR HL
  201.     JNZ    NOFG
  202.     DAD    D        ;SET HL = DE
  203.     CALL    DPSR
  204. NOFG    DAD    D
  205.     XCHG            ;SET DE = HL
  206.     XRA    A        ;ZERO ACC
  207.     CMP    D        ;DON'T LET D AND E = 0
  208.     JNZ    INRD
  209.     CMP    E
  210.     JNZ    INRD
  211.     INR    E
  212. INRD    INR    D
  213.     XCHG            ;PUT DE INTO HL
  214.     SHLD    DUR1+1
  215.     SHLD    DUR2+1
  216.     CALL    PLAY
  217.     DB    21H        ;LXI    H,
  218.     OUT    PORT        ;LOAD HL WITH OUTPUT INSTR
  219.     SHLD    OUT1
  220.     SHLD    OUT2
  221.     POP    H        ;RESTORE HL TO MUSIC TABLE
  222.     RET            ;TO NEXT
  223. ENVEL    INX    H        ;ENVELOPE ROUTINE
  224.     MOV    A,M
  225.     ANI    0FH
  226.     INR    A
  227.     STA    SAVEE
  228.     CALL    SPENV        ;CONSTRUCT SPECIAL ENVELOPE
  229.     RET            ;TO NEXT
  230. SPENV    PUSH    H
  231.     LXI    D,09H        ;LOAD LENGTH OF ENVELOPE
  232.     LXI    H,ENVELO    ;1ST ADDR OF ENVELOPE TABLE
  233.     LDA    SAVEE
  234.     MOV    B,A
  235.     BAK5    DCR    B
  236.     JZ    CONT2
  237.     DAD    D
  238.     JMP    BAK5
  239. CONT2    LXI    D,SPEC        ;1ST ADDR OF SPECIAL TABLE
  240.     LDA    SAVEV
  241.     MOV    B,A
  242.     MOV    C,B
  243.     MOV    A,M        ;GET ENVELOPE VALUE
  244. BAK6    DCR    B
  245.     JNZ    CONT3
  246.     ORA    A        ;CLEAR CARRY
  247.     RAL
  248.     JMP    BAK6
  249. CONT3    STAX    D
  250.     MOV    B,C
  251.     INX    D
  252.     INX    H
  253.     MOV    A,M
  254.     ORA    A        ;SET PARITY FLAG
  255.     JPE    CONT4
  256.     JMP    BAK6
  257. CONT4    POP    H
  258.     RET
  259. VOL    INX    H        ;VOLUME ROUTINE
  260.     MOV    A,M
  261.     ANI    07H
  262.     STA    SAVEV
  263.     CALL    SPENV
  264.     RET            ;TO NEXT
  265. TEM    INX    H        ;TEMPO ROUTINE
  266.     MOV    A,M
  267.     ANI    07H
  268.     STA    SAVET
  269.     RET            ;TO NEXT
  270.     NOP
  271. REP    INX    H        ;REPEAT ROUTINE
  272.     MOV    A,M
  273.     ANI    0FH
  274.     INR    A
  275.     STA    SAVER
  276.     SHLD    STAR
  277.     RET            ;TO NEXT
  278. JOUT    LDA    SAVER        ;JUMP OUT ROUTINE
  279.     DCR    A
  280.     STA    SAVER        ;REPEAT # -1
  281.     CPI    00H
  282.     JNZ    CONT5
  283.     LHLD    ENDT
  284. CONT5    RET            ;TO NEXT
  285. STOP    SHLD    ENDT        ;STOP-REPEAT ROUTINE
  286.     LDA    SAVER
  287.     DCR    A
  288.     STA    SAVER        ;REPEAT # -1
  289.     CPI    00H
  290.     JZ    CONT6
  291.     LHLD    STAR
  292. CONT6    RET            ;TO NEXT
  293. REST    PUSH    H        ;REST ROUTINE
  294.     LXI    H,0000H        ;CLEAR HL
  295.     SHLD    OUT1
  296.     SHLD    OUT2
  297.     JMP    OPMET
  298. ;
  299. ;    SAVE TABLE
  300. ;
  301. SAVET    DS    1        ;TEMPO #
  302. SAVEV    DS    1        ;VOLUME #
  303. SAVEE    DS    1        ;ENVELOPE #
  304. SAVEO    DS    1        ;OCTAVE #
  305. SAVED    DS    1        ;DURATION #
  306. SAVEN    DS    1        ;HALF-TONE #
  307. SAVEF    DS    1        ;CONTROL-A FLAG
  308. SAVER    DS    1        ;REPEAT #
  309. STAR    DS    2        ;STORE FOR HL
  310. ENDT    DS    2        ;STORE FOR HL
  311.     NOP
  312. ;
  313. ;    PLAY NOTE ROUTINE
  314. ;
  315. PLAY    LXI    H,SPEC        ;START OF SPECIAL TABLE
  316.     MVI    B,09H        ;# OF SEGMENTS
  317.     MOV    A,M
  318. DUR1    LXI    D,016FH        ;DURATION OF NOTE
  319. LOOP2    MOV    A,A        ;TIME EQUALIZER
  320.     JMP    CYCLE        ;TIME EQUALIZER
  321. CYCLE    DB    0EH        ;MVI    C,
  322. FREQ1    DB    0A3H
  323. OUT1    OUT    PORT
  324. LOOP1    DCR    C
  325.     DB    0C2H        ;JNZ
  326. JUMP    DW    LOOP1
  327.     XRA    M
  328.     DCR    E
  329.     JNZ    LOOP2
  330.     DCR    D
  331.     JNZ    CYCLE
  332.     ORI    00H        ;TIME EQUALIZER
  333. OUT2    OUT    PORT
  334.     INX    H
  335.     DCR    B
  336.     JZ    EXIT
  337. DUR2    LXI    D,016FH
  338.     DB    0EH        ;MVI    C,
  339. FREQ2    DB    9FH        ;TIME EQUALIZER
  340.     CPI    00H        ;EVEN-ODD CYCLE TESTER
  341.     MVI    A,00H
  342.     JZ    LOOP1
  343. CHGT    DCR    C        ;TIME EQUALIZER
  344.     DCR    C        ;TIME EQUALIZER
  345.     NOP            ;TIME EQUALIZER
  346.     MOV    A,M
  347.     JMP    LOOP1
  348. EXIT    RET
  349.     NOP
  350. SLOW    PUSH    PSW
  351.     MVI    A,02H
  352. COUNT    DCR    A
  353.     JNZ    COUNT
  354.     POP    PSW
  355.     JMP    LOOP1
  356. ;
  357. ;    TEMPO TABLE
  358. ;
  359. ;    100 BEATS PER MINUTE
  360. TEMPO    DB    0FH,02H,2EH,02H,4FH,02H,72H,02H,98H,02H,0BFH
  361.     DB    02H,0E9H,02H,15H,03H,44H,03H,76H,03H,0ABH
  362.     DB    03H,0E2H,03H,1DH,04H,5CH,04H
  363. ;    125 BEATS PER MINUTE
  364.     DB    0A5H,01H,0BFH,01H,0D9H,01H,0F5H,01H,13H,02H
  365.     DB    033H,02H,54H,02H,77H,02H,9DH,02H,0C5H,02H,0EFH
  366.     DB    02H,1CH,03H,4BH,03H,7DH,03H
  367. ;    150 BEATS PER MINUTE
  368.     DB    5FH,01H,74H,01H,84H,01H,0A2H,01H,0BAH,01H
  369.     DB    0D5H,01H,0F1H,01H,0EH,02H,2EH,02H,4FH,02H,72H
  370.     DB    02H,97H,02H,0BEH,02H,0E8H,02H
  371. ;    SPARE TEMPO
  372.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0
  373.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0
  374. ;
  375. ;    FREQUENCY TABLE
  376. ;
  377. ;    1ST OCTAVE
  378. FREQ    DB    0FAH,0ECH,0DFH,0D3H,0C7H,0BBH,0B1H,0A7H
  379.     DB    9EH,95H,8CH,84H,7DH,76H
  380. ;    2ND OCTAVE
  381.     DB    7DH,76H,6FH,69H
  382.     DB    63H,5DH,58H,53H,4EH,4AH,46H,42H,3EH,3BH
  383. ;    3RD OCTAVE
  384.     DB    3EH,3BH,37H,34H,31H,2EH,2CH,29H,27H,25H
  385.     DB    23H,21H,1FH,1DH
  386. ;    4TH OCTAVE
  387.     DB    0ADH,0A3H,99H,9DH,88H,80H
  388.     DB    79H,72H,68H,65H,5FH,5AH,54H,50H
  389. ;    5TH OCTAVE
  390.     DB    54H,50H,4BH,46H,42H,3EH,38H
  391.     DB    37H,34H,31H,2EH,2BH,28H,26H
  392. ;    6TH OCTAVE
  393.     DB    28H,26H,24H,21H,1FH,1DH,1CH
  394.     DB    1AH,18H,17H,15H,14H,12H,11H
  395. ;
  396. ;    SPECIAL TABLE
  397. ;
  398. SPEC    DB    07H,07H,07H,07H,07H,07H,07H,07H,00H
  399. ;
  400. ;    ENVELOPE TABLE
  401. ;
  402. ENVELO    DB    07H,07H,07H,07H,07H,07H,07H,07H,00H    ;^E-0
  403.     DB    07H,07H,07H,07H,80H,80H,80H,80H,00H    ;^E-1
  404.     DB    07H,07H,80H,07H,07H,80H,07H,07H,00H    ;^E-2
  405.     DB    07H,86H,85H,04H,83H,02H,01H,80H,00H    ;^E-3
  406.     DB    01H,02H,83H,04H,85H,86H,07H,80H,00H    ;^E-4
  407.     DB    01H,02H,85H,07H,07H,85H,02H,01H,00H    ;^E-5
  408.     DB    0,0,0,0,0,0,0,0,0            ;SPARE
  409.     DB    0,0,0,0,0,0,0,0,0            ;SPARE
  410.     DB    0,0,0,0,0,0,0,0,0            ;SPARE
  411.     DB    0,0,0,0,0,0,0,0,0            ;SPARE
  412. ;
  413. ;    MUSIC TABLE
  414. ;    START OF USER WRITTEN MUSIC
  415. ;
  416. TABLE    DS    100
  417.     END
  418.