home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / util1.sqc / UTIL1.SRC
Encoding:
Text File  |  1985-02-10  |  22.0 KB  |  936 lines

  1. ;       UTILITY - Musicraft Development System
  2.  
  3.         IF      NOT TRS80
  4.         ORG     100H
  5.         ELSE
  6.         ORG     7000H
  7.         ENDIF
  8.  
  9. MAIN$LINE:
  10.         JMP     RESTART
  11. BOOTER: JMP     SYSTEM
  12.         DB      'copyright 1981 by computercraft'
  13.         
  14.         ORG     MAIN$LINE+80H
  15. RESTART:
  16.         LXI     SP,STACK
  17.         MOVI    STATE,0
  18.         MOVI    OLD$SW,FALSE
  19.         MOVI    STO$SW,FALSE
  20.         CALL    BEGIN
  21.         CALL    INIT$UART
  22. MNLN01:
  23.         CALL    CLR$SCR
  24.         WRTLN   MAIN$MENU
  25.         GTCH    CH
  26.         MOV     B,A
  27.         MIFI    'J',JUKE$BOX,MNLN01
  28.         MIFI    'P',PRNT$SONG,MNLN01
  29.         MIFI    'T',RS232,MNLN01
  30.         MIFI    'D',DISK$OPS,MNLN01
  31.         MIFI    'U',OLD$NEW,MNLN01
  32.         MIFI    'B',BASIC,MNLN01
  33.         MIFI    'Q',BOOT,MNLN01
  34.         JMP     MNLN01
  35.  
  36. MAIN$MENU:
  37.         DB      13,10
  38.         DB      'Type a...'
  39.         DB      13,10
  40.         DB      '  J to edit a jukebox menu'
  41.         DB      13,10
  42.         DB      '  P to print a song from memory'
  43.         DB      13,10
  44.         DB      '  T to transfer between memory and RS232'
  45.         DB      13,10
  46.         DB      '  D to transfer between memory and diskette'
  47.         DB      13,10
  48.         DB      '  U to convert old format to new format'
  49.         DB      13,10
  50.         DB      '  B to convert BASIC output to proper format'
  51.         DB      13,10
  52.         DB      '  Q to quit the utility program'
  53.         DB      13,10
  54.         DB      '  ...>'
  55.         DB      '$'
  56.  
  57. JUKE$BOX:
  58.         CALL    GET$NAME
  59.         CALL    CLEAR$MENU
  60.         CALL    LOAD$MENU
  61.         CALL    DSPL$MENU
  62.         JC      JUKE02
  63. JUKE01:
  64.         CALL    EDIT$MENU
  65.         CALL    DSPL$MENU
  66.         JNC     JUKE01
  67. JUKE02:
  68.         CALL    SAVE$MENU
  69.         RET
  70.  
  71. GET$NAME:
  72.         CALL    CLR$SCR
  73.         WRTLN   GTNML1
  74.         REDLN   MENU$NAME,32
  75.         RET
  76. GTNML1: DB      13,10,'Enter name of menu to edit  >','$'
  77.         DB      32,0
  78. MENU$NAME: DS   32
  79.  
  80. CLEAR$MENU:
  81.         LXI     H,MENU
  82.         MVI     D,10
  83. CLMN01:
  84.         MVI     M,0FFH
  85.         INX     H
  86.         MVI     E,56
  87. CLMN02:
  88.         MVI     M,SPACE
  89.         INX     H
  90.         DCR     E
  91.         JNZ     CLMN02
  92.         MVI     M,'$'
  93.         INX     H
  94.         DCR     D
  95.         JNZ     CLMN01
  96.         RET
  97.  
  98. LOAD$MENU:
  99.         RESET   FCB,MENU$NAME,'S','C','D'
  100.         RC
  101.         READF   FCB,CH
  102.         MCPI    CH,'M'          ; CHECK FOR MENU
  103.         JNZ     LDMN03
  104.         LXI     H,MENU
  105.         MVI     D,10
  106. LDMN01:
  107.         MVI     E,58
  108. LDMN02:
  109.         PUSH    H
  110.         PUSH    D
  111.         READF   FCB,CH
  112.         POP     D
  113.         POP     H
  114.         RC
  115.         MOV     M,A
  116.         INX     H
  117.         DCR     E
  118.         JNZ     LDMN02
  119.         DCR     D
  120.         JNZ     LDMN01
  121.         RET
  122. LDMN03:
  123.         WRTLN   LDMNL1
  124.         GTCH    CH
  125.         POP     H
  126.         RET
  127. LDMNL1: DB      13,10,'File specified is not a menu file.'
  128.         DB      13,10,'Press any key to continue  >','$'
  129.  
  130. DSPL$MENU:
  131.         CALL    CLR$SCR
  132.         DMVI    I,MENU
  133.         DMVI    J,0
  134.         WRTLN   DSMNL1          ; WRITE LEGEND
  135. DSMN01:
  136.         INTSTR  J,DSMNR,1       ; DISPLAY LINE NUMBER
  137.         WRTLN   DSMNL2
  138.         XGET    0,I             ; DISPLAY KEY
  139.         ORA     A
  140.         JP      DSMN02
  141.         MVI     A,SPACE
  142. DSMN02:
  143.         CALL    FWTCH
  144.         DINC    I
  145.         MVI     A,SPACE
  146.         CALL    FWTCH
  147.         MVI     B,16            ; DISPLAY FILE NAME
  148. DSMN03:
  149.         XGET    0,I
  150.         PUSH    B
  151.         CALL    FWTCH
  152.         POP     B
  153.         DINC    I
  154.         DCR     B
  155.         JNZ     DSMN03
  156.         MVI     A,SPACE
  157.         CALL    FWTCH
  158.         LHLD    I               ; DISPLAY MENU TEXT
  159.         CALL    FWRTLN
  160.         DADI    I,I,41
  161.         NXTI    DSMN01,J,9
  162. DSMN04:
  163.         WRTLN   DSMNL3          ; ASK FOR EDIT
  164.         READ    CH
  165.         MCPI    CH,'N'
  166.         STC
  167.         RZ
  168.         MCPI    CH,'Y'
  169.         STC
  170.         CMC
  171.         RZ
  172.         CALL    BEEP
  173.         MVI     A,7
  174.         CALL    FWTCH
  175.         JMP     DSMN04
  176. DSMNL1: DB      13,10,'L K Filename (<=16)  '
  177.         DB      'Menutext (<=40)'
  178.         DB      13,10,'$'
  179. DSMNL2: DB      13,10
  180. DSMNR:  DB      '  ','$'
  181. DSMNL3: DB      13,10,'Do you wish to edit a line (y/n)?  >','$'
  182.  
  183. EDIT$MENU:
  184.         WRTLN   EDMNL1          ; GET LINE NUMBER
  185.         READ    CH
  186.         MCPI    CH,'0'
  187.         JM      EDIT$MENU
  188.         MCPI    CH,':'
  189.         JP      EDIT$MENU
  190.         ANI     0FH
  191.         MOV     L,A
  192.         MVI     H,0
  193.         SHLD    I
  194.         DMLI    I,I,58
  195.         DADI    I,I,MENU
  196.         WRTLN   EDMNL2          ; GET IDENTIFIER
  197.         READ    CH
  198.         CPI     SPACE           ; CHECK FOR
  199.         JM      EDMN01          ; DELETE
  200.         LHLD    I
  201.         MOV     M,A
  202.         INX     H
  203.         SHLD    I
  204.         WRTLN   EDMNL3          ; GET FILE NAME
  205.         REDLN   EDMNL4,16
  206.         LHLD    I
  207.         XCHG
  208.         LXI     H,EDMNL4
  209.         MVI     A,16
  210.         CALL    MOVE$LEFT
  211.         DADI    I,I,16
  212.         WRTLN   EDMNL5          ; GET MENU TEXT
  213.         REDLN   EDMNL6,40
  214.         LHLD    I
  215.         XCHG
  216.         LXI     H,EDMNL6
  217.         MVI     A,40
  218.         CALL    MOVE$LEFT
  219.         RET
  220. EDMN01:
  221.         LHLD    I               ; CLEAR ENTRY
  222.         MVI     M,0FFH
  223.         INX     H
  224.         MVI     E,56
  225. EDMN02:
  226.         MVI     M,SPACE
  227.         INX     H
  228.         DCR     E
  229.         JNZ     EDMN02
  230.         RET
  231. EDMNL1: DB      13,10,13,10,'Enter line number (0..9)  >','$'
  232. EDMNL2: DB      13,10,'Enter song select key  >','$'
  233. EDMNL3: DB      13,10,'Enter song file name (<=16 char)  >','$'
  234.         DB      32,0
  235. EDMNL4: DS      32
  236. EDMNL5: DB      13,10,'Enter song prompt text (<=40 char)  >','$'
  237.         DB      40,0
  238. EDMNL6: DS      40
  239.  
  240. SAVE$MENU:
  241.         DELETE  FCB,MENU$NAME,'S','C','D'
  242.         REWRT   FCB,MENU$NAME,'S','C','D'
  243.         LXI     D,FCB
  244.         MVI     A,'M'
  245.         CALL    FWRIT
  246.         LXI     H,MENU
  247.         MVI     D,10
  248. SVMN01:
  249.         MVI     E,58
  250. SVMN02:
  251.         PUSH    H
  252.         PUSH    D
  253.         MOV     A,M
  254.         LXI     D,FCB
  255.         CALL    FWRIT
  256.         POP     D
  257.         POP     H
  258.         INX     H
  259.         DCR     E
  260.         JNZ     SVMN02
  261.         DCR     D
  262.         JNZ     SVMN01
  263.         WRTFI   FCB,0
  264.         WRTFI   FCB,0
  265.         CLOSE   FCB
  266.         RET
  267.  
  268. PRNT$SONG:
  269.         MCPI    STATE,1
  270.         RNZ
  271.         CALL    GET$DATE
  272.         DMVI    SONG$CNT,0
  273.         DMVI    LINE$CNT,99
  274.         DMVI    J,0
  275. PRSG01:
  276.         CALL    PRNT$LINE
  277.         DCP     I,J
  278.         JP      PRSG01
  279.         MCPI    PAGE$FEED,0
  280.         RZ
  281.         CALL    PRINT
  282.         RET
  283.  
  284. GET$DATE:
  285.         CALL    CLR$SCR
  286.         WRTLN   GTDTL1
  287.         REDLN   DATE,32
  288.         RET
  289.  
  290. GTDTL1:
  291.         DB      13,10
  292.         DB      13,10
  293.         DB      'Enter date for heading  >','$'
  294.         DS      2
  295. DATE:   DS      33
  296.  
  297. PRNT$LINE:
  298.         LHLD    J
  299.         LXI     D,SONG$TABLE
  300.         DAD     D
  301.         LXI     D,PRLN+4
  302.         LDA     LSIZE
  303.         CALL    MOVELEFT
  304.         IF      PERCUSSION
  305.         CALL    CNVRT$PRC
  306.         ENDIF
  307.         DADD    J,J,LSIZE
  308.         DINC    SONG$CNT
  309.         DINC    LINE$CNT
  310.         MCP     LINE$CNT,PAGE$HEIGHT
  311.         CP      PRNT$HEAD
  312.         MCPI    PRLN+4,'*'
  313.         JZ      PRNT$OPTION
  314.         INTSTR  SONG$CNT,PRLN,4
  315.         DMVI    D$PNT,PRLN
  316.         DMVI    C$PNT,SP$LINE
  317.         DMOV    COUNT,LSIZE
  318.         DADI    COUNT,COUNT,4
  319.         IF      PERCUSSION
  320.         DADI    COUNT,COUNT,8
  321.         ENDIF
  322.         CALL    PRNT$DATA
  323.         CALL    NEW$PRLN
  324.         RET
  325.  
  326.         IF      PERCUSSION
  327. CNVRT$PRC:
  328.         XGET    PRLN-1,LSIZE    ; GET
  329.         STA     CPX2            ; PERCUSSION
  330.         DMVI    CPX1,PER$TAB    ; CPX1:=0;
  331. CP01:
  332.         XGET    PKEY,CPX1       ; WHILE PER_TAB[CPX1].KEY<>0FFH DO BEGIN
  333.         CPI     TRUE
  334.         RZ
  335.         MVI     C,SPACE
  336.         LDA     CPX2            ; IF PERCUSSION AND
  337.         MOV     B,A
  338.         XGET    PMSK,CPX1       ; PER_TAB[CPX1].MSK THEN BEGIN
  339.         ANA     B
  340.         JZ      CP02
  341.         XGET    PKEY,CPX1       ; WRITE(PER_TAB[CPX1].KEY)
  342.         MOV     C,A
  343. CP02:
  344.         XGET    PATTR,CPX1
  345.         MOV     E,A
  346.         MVI     D,0
  347.         LXI     H,PRLN+16
  348.         DAD     D
  349.         MOV     M,C
  350.         DADI    CPX1,CPX1,3 
  351.         JMP     CP01
  352.  
  353. CPX1:   DW      0
  354. CPX2:   DB      0
  355.  
  356. PKEY    EQU     0
  357. PMSK    EQU     1
  358. PATTR   EQU     2
  359. PER$TAB:
  360.         DB      'A',80H,0
  361.         DB      'B',40H,1
  362.         DB      'C',20H,2
  363.         DB      'D',10H,3
  364.         DB      'E',08H,4
  365.         DB      'F',04H,5
  366.         DB      'G',02H,6
  367.         DB      0FFH
  368.         ENDIF
  369.  
  370. PRNT$HEAD:
  371.         MCPI    PAGE$FEED,0
  372.         JNZ     PRHD01
  373.         MCPI    PAGE$SPACE,0
  374.         RZ
  375. PRHD01:
  376.         MCPI    PAGE$CNT,0
  377.         JZ      PRHD04
  378.         MCPI    PAGE$FEED,0
  379.         JZ      PRHD02
  380.         CALL    PRINT
  381.         JMP     PRHD04
  382. PRHD02:
  383.         MOVE    X,PAGE$SPACE
  384.         MOVI    X+1,0
  385. PRHD03:
  386.         CALL    NEW$PRLN
  387.         DDEC    X
  388.         MOV     A,H
  389.         ORA     L
  390.         JNZ     PRHD03
  391. PRHD04:
  392.         DMVI    LINE$CNT,0
  393.         LMVI    FILE$NAME,HEDNG,12
  394.         LMOV    DATE,HEDNG+12,DATE-1
  395.         DINC    PAGE$CNT
  396.         INTSTR  PAGE$CNT,HPAGE+4,2
  397.         DMVI    D$PNT,HEDNG
  398.         DMVI    C$PNT,SP$HEAD
  399.         DMVI    COUNT,46
  400.         CALL    PRNT$DATA
  401.         CALL    NEW$PRLN
  402.         CALL    NEW$PRLN
  403.         DMVI    D$PNT,LEGEND
  404.         DMVI    C$PNT,SP$LEGEND
  405.         IF      PERCUSSION
  406.         DMVI    COUNT,44
  407.         ELSE
  408.         DMVI    COUNT,36
  409.         ENDIF
  410.         CALL    PRNT$DATA
  411.         CALL    NEW$PRLN
  412.         CALL    NEW$PRLN
  413.         RET
  414.         
  415. PRNT$OPTION:
  416.         DMVI    D$PNT,PRLN+4
  417.         DMVI    C$PNT,SP$OPT
  418.         DMVI    COUNT,15
  419.         CALL    PRNT$DATA
  420.         CALL    NEW$PRLN
  421.         RET
  422.         
  423. PRNT$DATA:
  424.         DMVI    X,1
  425. PRDT01:
  426.         LHLD    C$PNT
  427.         MOV     A,M
  428.         ORA     A
  429.         JM      PRDT02
  430.         CALL    PRNT$SPACE
  431.         LHLD    D$PNT
  432.         MOV     A,M
  433.         CALL    PRINT
  434. PRDT02:
  435.         DINC    D$PNT
  436.         DINC    C$PNT
  437.         NEXT    PRDT01,X,COUNT
  438.         RET
  439.  
  440. PRNT$SPACE:
  441.         ORA     A
  442.         RZ
  443.         STA     W
  444.         XRA     A
  445.         STA     W+1
  446.         DMVI    Y,1
  447. PRSP01:
  448.         MVI     A,SPACE
  449.         CALL    PRINT
  450.         NEXT    PRSP01,Y,W
  451.         RET
  452.  
  453. NEW$PRLN:
  454.         MVI     A,0DH
  455.         CALL    PRINT
  456.         MVI     A,0AH
  457.         CALL    PRINT
  458.         CALL    PRNT$NULL
  459.         CALL    PRNT$NULL
  460.         CALL    PRNT$NULL
  461. PRNT$NULL:
  462.         MVI     A,0
  463.         CALL    PRINT
  464.         RET
  465. PRINT:
  466.         IF      NOT TRS80
  467.         MOV     E,A
  468.         MVI     C,5
  469.         CALL    CPM
  470.         RET
  471.         ELSE
  472.         LXI     H,37E8H
  473. PRNT$LOOP:
  474.         MOV     D,M
  475.         DB      0CBH,7AH        ; BIT 7,D
  476.         JNZ     PRNT$LOOP
  477.         MOV     M,A
  478.         RET
  479.         ENDIF
  480. W:      DW      0
  481. X:      DW      0
  482. Y:      DW      0
  483. D$PNT:  DW      0
  484. C$PNT:  DW      0
  485. SONG$CNT: DW    0
  486. LINE$CNT: DW    99
  487. COUNT:  DW      0
  488. PAGE$CNT: DW    0
  489.  
  490. HEDNG:  DB      '        '
  491.         DB      '                                '
  492. HPAGE:  DB      'PAGE  '
  493. SP$HEAD: DB     10,0,0,0,0,0,0,0
  494.         DB      2,0,0,0,0,0,0,0
  495.         DB      0,0,0,0,0,0,0,0
  496.         DB      0,0,0,0,0,0,0,0
  497.         DB      0,0,0,0,0,0,0,0
  498.         DB      2,0,0,0,1,0
  499.         IF      NOT PERCUSSION
  500. LEGEND: DB      'LINEDURATIONVOICE1VOICE2VOICE3VOICE4'
  501. SP$LEGEND: DB   10,0,0,0
  502.         DB      3,0,0,0,0,0,0,0
  503.         DB      3,0,0,0,0,0
  504.         DB      3,0,0,0,0,0
  505.         DB      3,0,0,0,0,0
  506.         DB      3,0,0,0,0,0
  507. PRLN:   DB      'LLLLDDDWWWXXXYYYZZZ'
  508. SP$LINE: DB     10,0,0,0
  509.         DB      128,6,0
  510.         DB      7,0,0
  511.         DB      6,0,0
  512.         DB      6,0,0
  513.         DB      6,0,0
  514.         ELSE
  515. LEGEND: DB      'LINEDURATIONVOICE1VOICE2VOICE3VOICE4ABCDEFG'
  516. SP$LEGEND: DB   10,0,0,0
  517.         DB      3,0,0,0,0,0,0,0
  518.         DB      3,0,0,0,0,0
  519.         DB      3,0,0,0,0,0
  520.         DB      3,0,0,0,0,0
  521.         DB      3,0,0,0,0,0
  522.         DB      3,0,0,0,0,0,0,0
  523. PRLN:   DB      'LLLLDDDWWWXXXYYYZZZ       '
  524. SP$LINE: DB     10,0,0,0
  525.         DB      128,6,0
  526.         DB      7,0,0
  527.         DB      6,0,0
  528.         DB      6,0,0
  529.         DB      6,0,0
  530.         DB      3,0,0,0,0,0,0,0
  531.         ENDIF
  532. SP$OPT: DB      17,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  533.  
  534. RS232:
  535.         CALL    CLR$SCR
  536.         WRTLN   RSL1
  537.         GTCH    CH
  538.         MOV     B,A
  539.         MIFI    '1',RCEV$SONG,RS01
  540.         MIFI    '2',XMIT$SONG,RS01
  541.         MIFI    '3',RCEV$WAVE,RS01
  542.         MIFI    '4',XMIT$WAVE,RS01
  543.         MIFI    '5',SET$BAUD,RS01
  544. RS01:   RET
  545.  
  546. RSL1:   DB      13,10
  547.         DB      'RS232:'
  548.         DB      13,10
  549.         DB      '    Type a...'
  550.         DB      13,10
  551.         DB      '      1 to receive a song'
  552.         DB      13,10
  553.         DB      '      2 to send a song'
  554.         DB      13,10
  555.         DB      '      3 to receive a waveform'
  556.         DB      13,10
  557.         DB      '      4 to send a waveform'
  558.         DB      13,10
  559.         DB      '      5 to change the baud'
  560.         DB      13,10
  561.         DB      '      ...>'
  562.         DB      '$'
  563.  
  564. RCEV$SONG:
  565.         WRTLN   RCSGL1
  566.         DMVI    I,0
  567. RCSG01:
  568.         CALL    GTCHAR
  569.         CPI     7FH
  570.         JZ      RCSG02
  571.         XPUT    SONG$TABLE,I
  572.         DINC    I
  573.         JMP     RCSG01
  574. RCSG02:
  575.         DDEC    I
  576.         MOVI    STATE,1
  577.         RET
  578.  
  579. RCSGL1:
  580.         DB      13,10
  581.         DB      13,10
  582.         DB      'Receiving song. Please stand by.'
  583.         DB      '$'
  584.  
  585. XMIT$SONG:
  586.         MCPI    STATE,1
  587.         RNZ
  588.         WRTLN   XMSGL1
  589.         GTCH    CH
  590.         CPI     SPACE
  591.         RNZ
  592.         WRTLN   XMSGL2
  593.         DDEC    I
  594.         DMVI    J,0
  595. XMSG01:
  596.         XGET    SONG$TABLE,J
  597.         CALL    PTCHAR
  598.         NEXT    XMSG01,J,I
  599.         MVI     A,7FH
  600.         CALL    PTCHAR
  601.         RET
  602.  
  603. XMSGL1:
  604.         DB      13,10
  605.         DB      13,10
  606.         DB      'Type <space> when ready to transmit  >'
  607.         DB      '$'
  608. XMSGL2:
  609.         DB      13,10
  610.         DB      13,10
  611.         DB      'Transmitting song. Please stand by.'
  612.         DB      '$'
  613.  
  614. RCEV$WAVE:
  615.         WRTLN   RCWVL1
  616.         DMVI    I,0
  617. RCWV01:
  618.         CALL    GTBYTE
  619.         XPUT    WAVE$TABLE,I
  620.         NXTI    RCWV01,I,591
  621.         MOVI    STATE,2
  622.         RET
  623.  
  624. RCWVL1:
  625.         DB      13,10
  626.         DB      13,10
  627.         DB      'Receiving waveform. Please stand by.'
  628.         DB      '$'
  629.  
  630. XMIT$WAVE:
  631.         MCPI    STATE,2
  632.         RNZ
  633.         WRTLN   XMWVL1
  634.         GTCH    CH
  635.         CPI     SPACE
  636.         RNZ
  637.         WRTLN   XMWVL2
  638.         DMVI    I,0
  639. XMWV01:
  640.         XGET    WAVE$TABLE,I
  641.         CALL    PTBYTE
  642.         NXTI    XMWV01,I,591
  643.         RET
  644.  
  645. XMWVL1:
  646.         DB      13,10
  647.         DB      13,10
  648.         DB      'Press <space> when ready to transmit  >'
  649.         DB      '$'
  650. XMWVL2:
  651.         DB      13,10
  652.         DB      13,10
  653.         DB      'Transmitting waveform. Please stand by.'
  654.         DB      '$'
  655.  
  656. SET$BAUD:
  657.         WRTLN   STBDL1
  658.         GTCH    CH
  659.         CPI     '1'
  660.         JM      SET$BAUD
  661.         CPI     '8'
  662.         JP      SET$BAUD
  663.         ANI     07H
  664.         DCR     A
  665.         MVI     B,0
  666.         MOV     C,A
  667.         CALL    INIT$BAUD
  668.         RET
  669.  
  670. STBDL1:
  671.         DB      13,10
  672.         DB      13,10
  673.         DB      'Type a...'
  674.         DB      13,10
  675.         DB      '  1 for 110'
  676.         DB      13,10
  677.         DB      '  2 for 300'
  678.         DB      13,10
  679.         DB      '  3 for 600'
  680.         DB      13,10
  681.         DB      '  4 for 1200'
  682.         DB      13,10
  683.         DB      '  5 for 2400'
  684.         DB      13,10
  685.         DB      '  6 for 4800'
  686.         DB      13,10
  687.         DB      '  7 for 9600'
  688.         DB      13,10
  689.         DB      '  ...>'
  690.         DB      '$'
  691.  
  692. DISK$OPS:
  693.         CALL    CLR$SCR
  694.         WRTLN   DKOPL1
  695.         GTCH    CH
  696.         MOV     B,A
  697.         MIFI    '1',LOAD$SONG,DKOP01
  698.         MIFI    '2',SAVE$SONG,DKOP01
  699.         MIFI    '3',LOAD$WAVE,DKOP01
  700.         MIFI    '4',SAVE$WAVE,DKOP01
  701. DKOP01: RET
  702.  
  703. DKOPL1:
  704.         DB      13,10
  705.         DB      'Diskette:'
  706.         DB      13,10
  707.         DB      '    Type a...'
  708.         DB      13,10
  709.         DB      '      1 to load a song'
  710.         DB      13,10
  711.         DB      '      2 to save a song'
  712.         DB      13,10
  713.         DB      '      3 to load a waveform'
  714.         DB      13,10
  715.         DB      '      4 to save a waveform'
  716.         DB      13,10
  717.         DB      '      ...>'
  718.         DB      '$'
  719.  
  720. LOAD$SONG:
  721.         WRTLN   LDSGL1
  722.         REDLN   FILE$NAME,32
  723.         RESET   FCB,FILE$NAME,'S','N','G'
  724.         JC      LDSG02
  725.         WRTLN   LDSGL2
  726.         DMVI    I,0
  727.         DMVI    J,0
  728. LDSG01:
  729.         READF   FCB,CH
  730.         JC      LDSG03
  731.         MCPI    STO$SW,TRUE             ; THIS CODE
  732.         JNZ     LDSG01A                 ; DELETES
  733.         MCPI    CH,13                   ; CHARACTERS
  734.         JZ      LDSG01                  ; USED BY
  735.         MCPI    CH,10                   ; CBASIC
  736.         JZ      LDSG01                  ; PROGRAMS
  737.         MCPI    CH,'"'                  ; FOR FORMAT
  738.         JZ      LDSG01                  ; CONTROL
  739.         
  740.         MCPI    CH,63                   ; USED TO
  741.         JNZ     LDSG01A                 ; INDICATE
  742.         MOVI    CH,0                    ; PERCUSSION
  743. LDSG01A:
  744.         MCPI    CH,0
  745.         JZ      LDSG01B
  746.         MCPI    CH,SPACE
  747.         JM      LDSG03
  748. LDSG01B:
  749.         XPUT    SONG$TABLE,I
  750.         DINC    I
  751.         DINC    J
  752.         MCPI    OLD$SW,TRUE             ; IF CONVERSION
  753.         JNZ     LDSG01                  ; OF OLD SONG
  754.         DCPI    J,15                    ; TO NEW FORMAT
  755.         JNZ     LDSG01                  ; ADD EXTRA ZERO
  756.         DMVI    J,0                     ; EVERY 15 BYTES
  757.         MOVI    CH,0
  758.         XPUT    SONG$TABLE,I
  759.         DINC    I
  760.         JMP     LDSG01
  761. LDSG02:
  762.         WRTLN   LDSGL3
  763.         CALL    BEEP
  764.         GTCH    CH
  765.         RET
  766. LDSG03:
  767.         MOVI    STATE,1
  768.         DDEC    I
  769.         RET
  770.  
  771. LDSGL1:
  772.         DB      13,10
  773.         DB      13,10
  774.         DB      'Enter input song name  >'
  775.         DB      '$'
  776. LDSGL2:
  777.         DB      13,10
  778.         DB      13,10
  779.         DB      'Loading song from disk. Please stand by.'
  780.         DB      '$'
  781. LDSGL3:
  782.         DB      13,10
  783.         DB      13,10,7
  784.         DB      'Song name not recognized.'
  785.         DB      13,10
  786.         DB      'Press any key to continue  >'
  787.         DB      '$'
  788.  
  789. SAVE$SONG:
  790.         MCPI    STATE,1
  791.         RNZ
  792.         WRTLN   SVSGL1
  793.         REDLN   FILE$NAME,32
  794.         DELETE  FCB,FILE$NAME,'S','N','G'
  795.         REWRT   FCB,FILE$NAME,'S','N','G'
  796.         JC      SVSG02
  797.         WRTLN   SVSGL2
  798.         DMVI    J,0
  799. SVSG01:
  800.         XGET    SONG$TABLE,J
  801.         LXI     D,FCB
  802.         CALL    FWRIT
  803.         JC      SVSG02
  804.         NEXT    SVSG01,J,I
  805.         CLOSE   FCB
  806.         RET
  807. SVSG02:
  808.         WRTLN   SVSGL3
  809.         CALL    BEEP
  810.         GTCH    CH
  811.         JMP     SAVE$SONG
  812.  
  813. SVSGL1:
  814.         DB      13,10
  815.         DB      13,10
  816.         DB      'Enter name of output song  >'
  817.         DB      '$'
  818. SVSGL2:
  819.         DB      13,10
  820.         DB      13,10
  821.         DB      'Saving song on disk. Please stand by.'
  822.         DB      '$'
  823. SVSGL3:
  824.         DB      13,10
  825.         DB      13,10,7
  826.         DB      'No space on disk for song.'
  827.         DB      13,10
  828.         DB      'Mount new disk and press any'
  829.         DB      13,10
  830.         DB      'key to continue  >'
  831.         DB      '$'
  832.  
  833. LOAD$WAVE:
  834.         WRTLN   LDWVL1
  835.         REDLN   FILE$NAME,32
  836.         RESET   FCB,FILE$NAME,'W','A','V'
  837.         JC      LDWV02
  838.         WRTLN   LDWVL2
  839.         DMVI    I,0
  840. LDWV01:
  841.         LXI     D,FCB
  842.         CALL    FREAD
  843.         JC      LDWV02
  844.         XPUT    WAVE$TABLE,I
  845.         NXTI    LDWV01,I,591
  846.         MOVI    STATE,2
  847.         RET
  848. LDWV02:
  849.         WRTLN   LDWVL3
  850.         CALL    BEEP
  851.         GTCH    CH
  852.         RET
  853.  
  854. LDWVL1:
  855.         DB      13,10
  856.         DB      13,10
  857.         DB      'Enter name of input waveform  >'
  858.         DB      '$'
  859. LDWVL2:
  860.         DB      13,10
  861.         DB      13,10
  862.         DB      'Loading waveform from disk. Please stand by.'
  863.         DB      '$'
  864. LDWVL3:
  865.         DB      13,10
  866.         DB      13,10,7
  867.         DB      'Waveform name not recognized.'
  868.         DB      13,10
  869.         DB      'Press any key to continue  >'
  870.         DB      '$'
  871.  
  872. SAVE$WAVE:
  873.         MCPI    STATE,2
  874.         RNZ
  875.         WRTLN   SVWVL1
  876.         REDLN   FILE$NAME,32
  877.         DELETE  FCB,FILE$NAME,'W','A','V'
  878.         REWRT   FCB,FILE$NAME,'W','A','V'
  879.         JC      SVWV02
  880.         WRTLN   SVWVL2
  881.         DMVI    I,0
  882. SVWV01:
  883.         XGET    WAVE$TABLE,I
  884.         LXI     D,FCB
  885.         CALL    FWRIT
  886.         NXTI    SVWV01,I,591
  887.         CLOSE   FCB
  888.         RET
  889. SVWV02:
  890.         WRTLN   SVWVL3
  891.         CALL    BEEP
  892.         GTCH    CH
  893.         JMP     SAVE$WAVE
  894.         
  895. SVWVL1:
  896.         DB      13,10
  897.         DB      13,10
  898.         DB      'Enter name of output waveform  >'
  899.         DB      '$'
  900. SVWVL2:
  901.         DB      13,10
  902.         DB      13,10
  903.         DB      'Saving waveform on disk. Please stand by.'
  904.         DB      '$'
  905. SVWVL3:
  906.         DB      13,10
  907.         DB      13,10,7
  908.         DB      'No space on disk for waveform.'
  909.         DB      13,10
  910.         DB      'Mount new disk and press any'
  911.         DB      13,10
  912.         DB      'key to continue  >'
  913.         DB      '$'
  914.  
  915. BASIC:
  916.         CALL    CLR$SCR
  917.         MOVI    STO$SW,TRUE
  918.         CALL    LOAD$SONG
  919.         CALL    SAVE$SONG
  920.         MOVI    STO$SW,FALSE
  921.         RET
  922. STO$SW: DB      FALSE
  923.  
  924. OLD$NEW:
  925.         CALL    CLR$SCR
  926.         MOVI    OLD$SW,TRUE
  927.         CALL    LOAD$SONG
  928.         STRINT  SONG$TABLE+3,J
  929.         DADI    J,J,1
  930.         INTSTR  J,SONG$TABLE+3,1
  931.         CALL    SAVE$SONG
  932.         MOVI    OLD$SW,FALSE
  933.         RET
  934. OLD$SW: DB      FALSE
  935.  
  936.