home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / edit1.sqc / EDIT1.SRC
Text File  |  1985-02-09  |  21KB  |  685 lines

  1. ;       EDITOR - Musicraft Development System
  2.  
  3.  
  4. ;               copyright 1981 by COMPUTERCRAFT
  5.  
  6. ;               This program allows the user to create and maintain
  7. ;               song files on floppy disk.  A song file (with a '.sng'
  8. ;               type) is read into the work buffer in main memory for
  9. ;               editing.  After changes have been made, a new song file
  10. ;               is created using the same name and type as the input
  11. ;               file.  The original input file type is changed to '.sbk'
  12. ;               to provide a backup.
  13.  
  14.         IF      NOT TRS80
  15.         ORG     100H
  16.         ELSE
  17.         ORG     7000H
  18.         ENDIF
  19.  
  20. MAIN$LINE:
  21.         JMP     RESTART
  22. BOOTER: JMP     SYSTEM
  23.         DB      'copyright 1981 by computercraft'
  24.         
  25.         ORG     MAIN$LINE+80H
  26. RESTART:
  27.         LXI     SP,STACK
  28.         CALL    INITIALIZE      ; INITIALIZE;
  29.         CALL    LOAD$SONG       ; LOAD_SONG;
  30.         MCPI    START,TRUE      ; IF START THEN NEW_SONG;
  31.         CZ      NEW$SONG
  32.         CALL    EDIT$MODE       ; EDIT_MODE;
  33.         CALL    SAVE$SONG       ; SAVE_SONG
  34.         JMP     BOOT            ; END
  35.  
  36. ;               INITIALIZATION PROCEDURES
  37.  
  38. INITIALIZE:
  39.         IF      NOT TRS80
  40.         LMVI    TBUF,SONG$NAME,20
  41.         CALL    BEGIN
  42.         LMVI    SONG$NAME,TBUF,20
  43.         ENDIF
  44.         CALL    CLR$SCR
  45.         CALL    INIT$SONG
  46.         DMVI    MSR$CNT,1
  47.         IF      NOT TRS80
  48.         LDA     TBUF            ; OBTAIN
  49.         ORA     A               ; SONG
  50.         JZ      INIT01          ; NAME
  51.         STA     SONG$NAME-1
  52.         LMOV    TBUF+1,SONG$NAME,TBUF
  53.         RET
  54. INIT01:
  55.         ENDIF
  56.         WRTLN   INITL1          ; WRITELN(INITL1);
  57.         REDLN   SONG$NAME,12    ; READLN(SONG_NAME)
  58.         RET                     ; END
  59. INITL1: DB      13,10,'Enter name of song  >','$'
  60.  
  61. LOAD$SONG:
  62.         CALL    CLR$SCR         ; CLR_SCR;
  63.         RESET   FCB,SONG$NAME,'S','N','G'
  64.         MOVI    START,TRUE      ; START := TRUE;
  65.         RC
  66.  
  67. ;               SONG IS ON FILE AND CAN BE LOADED
  68.  
  69.         MOVI    START,FALSE     ; START := FALSE;
  70.         WRTLN   LDSGL1          ; WRITELN(LDSGL1);
  71.         CALL    HEAD$SONG
  72.         MOVI    EOF,FALSE
  73.         JMP     LDSG04          ; READ FIRST LINE OF SONG
  74. LDSG01:
  75.         MCPI    EOF,TRUE        ; WHILE NOT EOF DO BEGIN
  76.         RZ
  77.         MCPI    SONG$LINE,'*'
  78.         JNZ     LDSG03
  79.         MCPI    SONG$LINE+1,'M'
  80.         JZ      LDSG02
  81.         CPI     'V'
  82.         JNZ     LDSG03
  83.         STRINT  SONG$LINE+3,HI$VOICE
  84.         JMP     LDSG04          ; READ NEXT LINE
  85. LDSG02:
  86.         STRINT  SONG$LINE+3,MSR$CNT ; MSR_CNT:=STR_INT(3)+1
  87.         DINC    MSR$CNT
  88. LDSG03:
  89.         CALL    NSRT$LINE       ; INSERT SONG LINE
  90.         CALL    PUT$LINE        ; INTO BUFFER
  91. LDSG04:
  92.         FCHR    SONG$LINE,LSIZE,SPACE
  93. LDSG04A:
  94.         READF   FCB,CH
  95.         JC      LDSG06
  96.         CPI     1AH
  97.         JZ      LDSG06
  98.         CPI     '.'
  99.         JZ      LDSG04B
  100.         CPI     '*'
  101.         JNZ     LDSG06
  102. LDSG04B:
  103.         STA     SONG$LINE
  104.         DMVI    I,2             ; FOR I := 2 TO LSIZE DO BEGIN
  105. LDSG05:
  106.         READF   FCB,CH          ; READ(FCB,CH);
  107.         JC      LDSG06
  108. LDSG05A:
  109.         XPUT    SONG$LINE-1,I   ; SONG$LINE[I]:=CH
  110.         NEXT    LDSG05,I,LSIZE  ; END(*OF FOR *)
  111.         JMP     LDSG01
  112. LDSG06:
  113.         MOVI    EOF,TRUE
  114.         JMP     LDSG01
  115. LDSGL1: DB      'Loading song. Please stand by.','$'
  116.  
  117. ;               SONG IS NEW
  118.  
  119. NEW$SONG:
  120.         INTSTR  MXVCE,NWSGL1A,1
  121.         WRTLN   NWSGL1
  122.         LHLD    MXVCE
  123.         CALL    GET$INT
  124.         INX     H
  125.         SHLD    HI$VOICE
  126.         RET
  127. NWSGL1: DB      13,10,'This is a new song. '
  128.         DB      'Please enter number of voices (1..'
  129. NWSGL1A: DB     '  )  >','$'
  130.  
  131. SAVE$SONG:
  132.         CALL    CLR$SCR
  133.         MCPI    START,TRUE      ; IF START<>TRUE THEN
  134.         JZ      SVSG01
  135.  
  136.         IF      NOT TRS80
  137.         DELETE  FCB,SONG$NAME,'S','B','K'
  138.         LXI     H,FCB
  139.         LXI     D,FCB+16
  140.         MVI     A,12
  141.         CALL    MOVELEFT
  142.         MOVI    FCB+9,'S'
  143.         MOVI    FCB+10,'N'
  144.         MOVI    FCB+11,'G'
  145.         LXI     D,FCB           ; RENAME(SONG_IN,SONG_BAK);
  146.         CALL    FSW             ; (SET FOR PROPER DRIVE)
  147.         MVI     C,23
  148.         CALL    CPM
  149.         LXI     D,FCB
  150.         CALL    FSW             ; (REVERT TO DEFAULT DRIVE)
  151.         ELSE
  152.         WRTLN   SVSGL1
  153.         REDLN   SONG$NAME,32
  154.         ENDIF
  155.  
  156. SVSG01:
  157.         REWRT   FCB,SONG$NAME,'S','N','G'
  158.         JC      SVSG07
  159.         WRTLN   SVSGL2
  160.         FCHR    SONG$LINE,LSIZE,SPACE
  161.         LXI     H,SONG$LINE
  162.         MVI     M,'*'
  163.         INX     H
  164.         MVI     M,'V'
  165.         INTSTR  HI$VOICE,SONG$LINE+3,1
  166.         CALL    HEAD$SONG
  167.         DMVI    MSR$CNT,1
  168. SVSG02:
  169.         CALL    SVSG04          ; OUTPUT SONG LINE
  170.         CALL    NEXT$LINE
  171.         CALL    GET$LINE
  172.         DCP     CURR,TAIL
  173.         JZ      SVSG03
  174.         
  175.         MCPI    SONG$LINE,'*'   ; IF SONG$LINE[0] = '*'
  176.         JNZ     SVSG02
  177.         MCPI    SONG$LINE+1,'M' ; AND SONG$LINE[1] = 'M'
  178.         JNZ     SVSG02
  179.         
  180.         INTSTR  MSR$CNT,SONG$LINE+3,4
  181.         DINC    MSR$CNT
  182.         JMP     SVSG02
  183. SVSG03:
  184.         CLOSE   FCB             ; CLOSE(G,LOCK);
  185.         RET
  186. SVSG04:
  187.         DMVI    I,1             ; FOR I:=1 TO LSIZE DO BEGIN
  188.         DMVI    J,SONG$LINE-1
  189. SVSG05:
  190.         DINC    J               ; WRITE(FCB,SONG$LINE[I]);
  191.         MOV     A,M
  192.         LXI     D,FCB
  193.         CALL    FWRIT
  194.         JC      SVSG06
  195.         NEXT    SVSG05,I,LSIZE  ; END(*OF FOR*)
  196.         RET
  197. SVSG06:
  198.         WRTLN   SVSGL4
  199.         GTCH    CH
  200.         DELETE  FCB,SONG$NAME,'S','N','G'
  201.         JMP     SAVE$SONG
  202. SVSG07:
  203.         IF      TRS80
  204.         WRTLN   SVSGL3
  205.         GTCH    CH
  206.         MCPI    CH,'Y'
  207.         JNZ     SAVE$SONG
  208.         DELETE  FCB,SONG$NAME,'S','N','G'
  209.         JMP     SVSG01
  210.         ELSE
  211.         JMP     BOOT
  212.         ENDIF
  213.         IF      TRS80
  214. SVSGL1: DB      'Enter name of output song  >','$'
  215. SVSGL3: DB      13,10,'Song exists. Replace it(y/n)?','$'
  216.         ENDIF
  217. SVSGL2: DB      13,10,'Saving song. Please stand by.','$'
  218. SVSGL4: DB      13,10,'No space on disk for song.'
  219.         DB      13,10,'Mount new disk and press'
  220.         DB      13,10,'any key to continue.','$'
  221.  
  222. ;               EDIT MODE PROCEDURES
  223.  
  224. EDIT$MODE:
  225.         CALL    HEAD$SONG       ; HEAD_SONG;
  226.         MVI     A,TRUE          ; SHOW_PAGE(TRUE);
  227.         CALL    SHOW$PAGE
  228. EDMD01:                         ; REPEAT
  229.         CALL    SHOW$CURSOR     ; SHOW_CURSOR;
  230.         GTCH    CH              ; GET_CHAR(CH);
  231.         MOV     B,A
  232.         MIFI    '?',CNTR$PAGE,EDMD01
  233.         MIF     HOME,HOME$SONG,EDMD01
  234.         MIFI    'P',PAGE$PROC,EDMD01
  235.         MIFI    'N',NEXT$MEASURE,EDMD01
  236.         MIF     UP$ARROW,UP$PROC,EDMD01
  237.         MIF     DOWN$ARROW,DOWN$PROC,EDMD01
  238.         MIF     RETURN,DOWN$PROC,EDMD01
  239.         MIF     LEFT$ARROW,LEFT$PROC,EDMD01
  240.         MIF     RITE$ARROW,RITE$PROC,EDMD01
  241.         MIFI    SPACE,SPC$PROC,EDMD01
  242.         MIFI    '<',UP$DIR,EDMD01
  243.         MIFI    '>',DN$DIR,EDMD01
  244.         MIFI    'M',MEASURE,EDMD01
  245.         MIFI    'I',INSERT$MODE,EDMD01
  246.         MIFI    'X',EXCISE$MODE,EDMD01
  247.         MIFI    'O',OPTIONS$MODE,EDMD01
  248.         MIF     QUIT,QUIT$PROC,EDMD01
  249.         CALL    NSRTATTR
  250.         JMP     EDMD01
  251.  
  252. CNTR$PAGE:
  253.         MVI     A,TRUE
  254.         CALL    SHOW$PAGE
  255.         RET
  256.  
  257. HOME$SONG:
  258.         MCPI    DIRECTION,UP
  259.         JNZ     HMSG01
  260.         
  261.         MOVI    DIRECTION,DOWN
  262.         CALL    HEAD$SONG
  263.         JMP     HMSG02
  264. HMSG01:
  265.         MOVI    DIRECTION,UP
  266.         CALL    TAIL$SONG
  267. HMSG02:
  268.         XRA     A               ; SHOW_PAGE(FALSE)
  269.         CALL    SHOW$PAGE
  270.         RET
  271.  
  272. PAGE$PROC:
  273.         MOVI    EOS,FALSE
  274.         DMVI    I,2
  275. PGPR01:                         ; FOR I := 2 TO MXROW DO BEGIN
  276.         MCPI    DIRECTION,UP    ; IF DIRECTION = UP THEN
  277.         JNZ     PGPR02
  278.         
  279.         CALL    LAST$LINE       ; LAST_LINE
  280.         JMP     PGPR03
  281. PGPR02:
  282.         CALL    NEXT$LINE       ; ELSE NEXT_LINE
  283. PGPR03:
  284.         NEXT    PGPR01,I,MXROW  ; END(*OF FOR*)
  285.         
  286.         DCP     CURR,HEAD       ; IF CURR=HEAD THEN
  287.         JNZ     PGPR04
  288.         MOVI    DIRECTION,DOWN  ; DIRECTION:=DOWN
  289.         JMP     PGPR05
  290. PGPR04:                         ; ELSE
  291.         DCP     CURR,TAIL       ; IF CURR=TAIL THEN
  292.         JNZ     PGPR05
  293.         MOVI    DIRECTION,UP    ; DIRECTION:=UP;
  294. PGPR05:
  295.         XRA     A               ; SHOW_PAGE(FALSE)
  296.         CALL    SHOW$PAGE
  297.         RET
  298.  
  299. NEXT$MEASURE:
  300.         MCPI    DIRECTION,UP    ; IF DIRECTION = UP THEN
  301.         JNZ     NXMR01
  302.         CALL    LAST$LINE       ; LAST_LINE
  303.         JMP     NXMR02
  304. NXMR01:                         ; ELSE
  305.         CALL    NEXT$LINE       ; NEXT_LINE;
  306. NXMR02:
  307.         MCPI    EOS,TRUE        ; WHILE NOT EOS DO BEGIN
  308.         JZ      NXMR05
  309.         
  310.         CALL    GET$LINE        ; GET_LINE;
  311.         MCPI    SONG$LINE,'*'   ; IF SONG$LINE[0] = '*'
  312.         JNZ     NXMR03
  313.         MCPI    SONG$LINE+1,'M' ; AND SONG$LINE[1] = 'M' THEN
  314.         JZ      NXMR07          ; "EXIT"
  315. NXMR03:
  316.         MCPI    DIRECTION,UP    ; IF DIRECTION = UP THEN
  317.         JNZ     NXMR04
  318.         CALL    LAST$LINE       ; LAST_LINE
  319.         JMP     NXMR02
  320. NXMR04:                         ; ELSE
  321.         CALL    NEXT$LINE       ; NEXT_LINE
  322.         JMP     NXMR02          ; END;
  323. NXMR05:
  324.         DCP     CURR,HEAD       ; IF CURR=HEAD THEN
  325.         JNZ     NXMR06
  326.         MOVI    DIRECTION,DOWN  ; DIRECTION:=DOWN
  327.         JMP     NXMR07
  328. NXMR06:                         ; ELSE
  329.         DCP     CURR,TAIL       ; IF CURR=TAIL THEN BEGIN
  330.         JNZ     NXMR07
  331.         MOVI    DIRECTION,UP    ; DIRECTION:=UP;
  332. NXMR07:
  333.         XRA     A               ; SHOW_PAGE(FALSE)
  334.         CALL    SHOW$PAGE
  335.         RET
  336.  
  337. UP$PROC:
  338.         CALL    LAST$LINE       ; LAST_LINE;
  339.         XRA     A               ; SHOW_PAGE(FALSE);
  340.         CALL    SHOW$PAGE
  341.         DCP     CURR,HEAD       ; IF CURR=HEAD THEN
  342.         RNZ
  343.         MOVI    DIRECTION,DOWN  ; DIRECTION:=DOWN
  344.         RET
  345.  
  346. DOWN$PROC:
  347.         CALL    NEXT$LINE       ; NEXT_LINE;
  348.         CALL    GET$LINE        ; GET_LINE;
  349.         MOVI    ATTR,0          ; ATTR:=0;
  350.         MVI     A,FALSE         ; SHOW_LINE(FALSE);
  351.         CALL    SHOW$LINE
  352.         
  353.         DCP     CURR,TAIL       ; IF CURR=TAIL THEN
  354.         RNZ
  355.         MOVI    DIRECTION,UP    ; DIRECTION:=UP
  356.         RET
  357.  
  358. LEFT$PROC:
  359.         CALL    LAST$ATTR
  360.         RET
  361.  
  362. RITE$PROC:
  363.         MOVI    ATTR,0          ; ATTR:=0;
  364.         MINC    VOICE           ; VOICE:=VOICE+1;
  365.         MCP     HI$VOICE,VOICE  ; IF VOICE>HI$VOICE
  366.         RP                      ; THEN
  367.         MOVI    VOICE,0         ; VOICE:=0
  368.         RET                     ; END
  369.  
  370. SPC$PROC:
  371.         CALL    NEXT$ATTR       ; NEXT_ATTR
  372.         RET                     ; END
  373.  
  374. UP$DIR:
  375.         MOVI    DIRECTION,UP
  376.         RET
  377.  
  378. DN$DIR:
  379.         MOVI    DIRECTION,DOWN
  380.         RET
  381.  
  382. QUIT$PROC:
  383.         CALL    CLR$SCR
  384.         WRTLN   QTPRL1
  385.         GTCH    CH
  386.         CPI     'Y'
  387.         JNZ     QTPR02
  388. QTPR01:
  389.         CALL    NEXT$LINE
  390.         POP     H
  391.         RET
  392. QTPR02:
  393.         MVI     A,TRUE
  394.         CALL    SHOW$PAGE
  395.         RET
  396.  
  397. QTPRL1: DB      'Are you sure? (y,n)  >'
  398.         DB      '$'
  399.  
  400. ;               INSERT MODE PROCEDURES
  401.  
  402. INSERT$MODE:
  403.         CALL    GET$LINE        ; GET_LINE;
  404.         MOVI    MODE,'N'        ; MODE:='N';
  405.         CALL    LEGEND          ; LEGEND;
  406.         MOVI    ATTR,0          ; ATTR:=0;
  407.         MOVI    SNG$MODE,FALSE  ; SONG_MODE:=FALSE;
  408.         MCPI    SONG$LINE,'.'   ; IF (SONG$LINE[0,0]<>'.') OR
  409.         JNZ     NSMD01
  410.         LXI     H,SONG$LINE     ; (SONG$LINE[VOICE,1]<>' ')
  411.         LDA     VOICE
  412.         MVI     E,1
  413.         CALL    COMP$SONG
  414.         MOV     A,M
  415.         CPI     SPACE
  416.         JZ      NSMD02
  417. NSMD01:                         ; THEN BEGIN
  418.         MOVI    SNG$MODE,TRUE   ; SNG_MODE:=TRUE;
  419.         CALL    LAST$LINE       ; LAST_LINE;
  420.         CALL    NSRT$LINE       ; NSRT_LINE;
  421.         FCHR    SONG$LINE,LSIZE,SPACE
  422.  
  423.         IF      PERCUSSION
  424.         MVI     A,0             ; SONG$LINE[HI$VOICE,0]:=NILL;
  425.         XPUT    SONG$LINE-1,LSIZE
  426.         ENDIF
  427.  
  428.         LXI     H,SONG$LINE
  429.         MVI     M,'.'
  430.         CALL    PUT$LINE        ; PUT_LINE
  431. NSMD02:                         ; END;
  432.         FCHR    SEED$LINE,LSIZE,SPACE
  433.  
  434.         IF      PERCUSSION
  435.         MVI     A,0             ; SEED$LINE[HI$VOICE,0]:=NILL;
  436.         XPUT    SEED$LINE-1,LSIZE
  437.         ENDIF
  438.  
  439.         LXI     H,SEED$LINE     ; SEED_LINE[0,0]:='.';
  440.         MVI     M,'.'
  441.         MCPI    SNG$MODE,TRUE   ; IF SNG_MODE THEN
  442.         JNZ     NSMD03
  443.         MVI     A,TRUE          ; SHOW_LINE(TRUE);
  444.         CALL    SHOW$LINE
  445.         IF      TRS80
  446.         LDA     MXROW
  447.         MOV     B,A
  448.         LDA     ROW
  449.         INR     A
  450.         CMP     B
  451.         CM      CLEOS
  452.         ELSE
  453.         LDA     ROW
  454.         INR     A
  455.         CALL    CLEOS           ; CLR_EOS;
  456.         ENDIF
  457. NSMD03:                         ; REPEAT
  458.         CALL    SHOW$CURSOR     ; SHOW_CURSOR;
  459.         GTCH    CH              ; GET_CHAR(CH);
  460.         MOV     B,A
  461.         MIFI    '?',NS$CNTR$PAGE,NSMD03
  462.         MIF     LEFT$ARROW,NS$LEFT$PROC,NSMD03
  463.         MIF     DOWN$ARROW,NS$DOWN$PROC,NSMD03
  464.         MIF     RITE$ARROW,NS$RITE$PROC,NSMD03
  465.         MIF     RETURN,NS$DOWN$PROC,NSMD03
  466.         MIFI    SPACE,NS$SPC$PROC,NSMD03
  467.         MIFI    'M',MEASURE,NSMD03
  468.         MIF     QUIT,NS$QUIT$PROC,NSMD03
  469.         CALL    NSRTATTR
  470.         JMP     NSMD03
  471.  
  472. NS$CNTR$PAGE:
  473.         MVI     A,TRUE
  474.         CALL    SHOW$PAGE
  475.         MCPI    SNG$MODE,TRUE   ; IF SNG_MODE THEN
  476.         CZ      CLEOS
  477.         RET
  478.  
  479. NS$LEFT$PROC:
  480.         CALL    LAST$ATTR       ; LAST_ATTR
  481.         RET                     ; END
  482.  
  483. NS$DOWN$PROC:
  484.         MCPI    SNG$MODE,TRUE
  485.         JNZ     NDNP01
  486.         CALL    NSRT$LINE       ; NSRT_LINE;
  487.         FCHR    SONG$LINE,LSIZE,SPACE
  488.         LXI     H,SONG$LINE
  489.         MVI     M,'.'
  490.         
  491.         IF      PERCUSSION
  492.         MVI     A,0
  493.         XPUT    SONG$LINE-1,LSIZE
  494.         ENDIF
  495.         
  496.         JMP     NDNP05          ; SONG_LINE[0,0]:='.'
  497.                                 ; END
  498. NDNP01:                         ; ELSE BEGIN
  499.         CALL    NEXT$LINE       ; NEXT_LINE;
  500.         CALL    GET$LINE        ; GET_LINE;
  501.         MCPI    SONG$LINE,'.'   ; IF (SONG_LINE[0,0] <> '.') OR
  502.         JNZ     NDNP02
  503.         LXI     H,SONG$LINE     ; (SONG_LINE[VOICE,1]<>' ')
  504.         LDA     VOICE
  505.         MVI     E,1
  506.         CALL    COMP$SONG
  507.         MOV     A,M
  508.         CPI     SPACE           ; THEN BEGIN
  509.         JNZ     NDNP04
  510.         JMP     NDNP05
  511. NDNP02:
  512.         LDA     SONG$LINE+1     ; (*CHECK FOR END*)
  513.         CPI     'd'
  514.         JZ      NDNP04
  515.         CPI     'M'             ; (*CHECK FOR MEASURE*)
  516.         JNZ     NDNP03
  517.         MOVE    M$SHARP,SHARP
  518.         MOVE    M$FLAT,FLAT
  519. NDNP03:
  520.         MVI     A,TRUE
  521.         CALL    SHOW$LINE
  522.         JMP     NDNP01
  523. NDNP04:
  524.         LXI     D,NDNPL1        ; ERROR(NDNPL1);
  525.         CALL    ERROR
  526.         MOVI    MODE,SPACE      ; MODE := SPACE;
  527.         MVI     A,TRUE          ; SHOW_PAGE(TRUE);
  528.         CALL    SHOW$PAGE
  529.         MOVE    M$SHARP,SHARP   ; M_SHARP:=SHARP;
  530.         MOVE    M$FLAT,FLAT     ; M_FLAT:=FLAT;
  531.         POP     H               ; EXIT (INSERT_MODE)
  532.         RET                     ; END
  533. NDNP05:
  534.         DMVI    I,0             ; FOR I := 0 TO 2 DO
  535. NDNP06:
  536.         LXI     H,SEED$LINE     ; SONG_LINE[VOICE,I]:=
  537.         LDA     I
  538.         MOV     E,A
  539.         LDA     VOICE
  540.         CALL    COMP$SONG
  541.         MOV     A,M
  542.         STA     X1              ; SEED_LINE[VOICE,I];
  543.         LXI     H,SONG$LINE
  544.         LDA     I
  545.         MOV     E,A
  546.         LDA     VOICE
  547.         CALL    COMP$SONG
  548.         LDA     X1
  549.         MOV     M,A
  550.         NXTI    NDNP06,I,2      ; (*END OF FOR*)
  551.         MOVI    ATTR,0          ; ATTR := 0;
  552.         CALL    PUT$LINE        ; PUT_LINE;
  553.         MVI     A,TRUE          ; SHOW_LINE(TRUE)
  554.         CALL    SHOW$LINE
  555.         RET                     ; END
  556. NDNPL1: DB      7,'Must quit Insert_mode.  ','$'
  557.  
  558. NS$RITE$PROC:
  559.         MOVI    ATTR,0          ; ATTR := 0;
  560.         MCP     VOICE,HI$VOICE  ; IF VOICE = HI_VOICE THEN
  561.         JNZ     NRTP01
  562.         MOVI    VOICE,0         ; VOICE := 0
  563.         RET
  564. NRTP01:                         ; ELSE
  565.         MINC    VOICE           ; VOICE := VOICE + 1
  566.         RET                     ; END
  567.  
  568. NS$SPC$PROC:
  569.         CALL    NEXT$ATTR       ; NEXT_ATTR
  570.         RET                     ; END
  571.  
  572. NS$QUIT$PROC:
  573.         MOVI    MODE,SPACE      ; MODE:=SPACE;
  574.         MVI     A,TRUE          ; SHOW_PAGE(TRUE);
  575.         CALL    SHOW$PAGE
  576.         MOVE    M$SHARP,SHARP   ; M_SHARP:=SHARP;
  577.         MOVE    M$FLAT,FLAT     ; M_FLAT:=FLAT;
  578.         POP     H               ; EXIT(INSERT_MODE)
  579.         RET                     ; END
  580.  
  581. ;               EXCISE MODE PROCEDURES
  582.  
  583. EXCISE$MODE:
  584.         DCP     CURR,HEAD       ; IF (CURR<>HEAD)
  585.         JZ      EXMD08
  586.         DCP     CURR,TAIL       ; AND (CURR<>TAIL)
  587.         JZ      EXMD08          ; THEN BEGIN
  588.         MOVI    MODE,'X'        ; MODE:='X';
  589.         MOVE    SAVE$DIR,DIRECTION ; SAVE_DIR:=DIRECTION;
  590.         MOVE    SAVE$VOICE,VOICE ; SAVE_VOICE := VOICE;
  591.         MOVE    SAVE$ATTR,ATTR  ; SAVE_ATTR := ATTR;
  592.         MOVI    VOICE,-1        ; VOICE := -1;
  593.         CALL    LEGEND          ; LEGEND;
  594.         DMOV    DELIN,LINE      ; DELIN:=LINE;
  595. EXMD01:                         ; REPEAT
  596.         CALL    SHOW$CURSOR     ; SHOW_CURSOR;
  597.         GTCH    CH              ; GET_CHAR(CH);
  598.         MCP     CH,DOWN$ARROW   ; IF (CH = DOWN_ARROW) OR
  599.         JZ      EXMD02
  600.         MCP     CH,RETURN       ; (CH = RETURN) THEN BEGIN
  601.         JNZ     EXMD04
  602. EXMD02:
  603.         MOVI    DIRECTION,DOWN  ; DIRECTION:=DOWN;
  604.         DCP     CURR,TAIL       ; IF CURR<>TAIL
  605.         JZ      EXMD01          ; AND
  606.         DCP     CURR,HEAD       ; CURR<>HEAD
  607.         CNZ     MARK            ; THEN MARK;
  608.         CALL    NEXT$LINE       ; NEXT_LINE
  609.         JMP     EXMD01          ; END
  610. EXMD04:                         ; ELSE
  611.         MCP     CH,UP$ARROW     ; IF CH = UP_ARROW THEN BEGIN
  612.         JNZ     EXMD06
  613.         MOVI    DIRECTION,UP    ; DIRECTION:=UP;
  614.         CALL    LAST$LINE       ; LAST_LINE;
  615.         DCP     CURR,HEAD       ; IF CURR<>HEAD
  616.         JZ      EXMD01          ; AND
  617.         DCP     CURR,TAIL       ; CURR<>TAIL
  618.         JZ      EXMD01          ; THEN
  619.         CALL    MARK            ; MARK
  620.         JMP     EXMD01          ; END
  621. EXMD06:                         ; ELSE
  622.         MCP     CH,QUIT         ; IF CH <> QUIT THEN
  623.         JZ      EXMD07
  624.         LXI     D,EXMDL1        ; ERROR(EXMDL1);
  625.         CALL    ERROR
  626.         CALL    LEGEND          ; LEGEND
  627.         JMP     EXMD01          ; UNTIL CH=QUIT;
  628. EXMD07:
  629.         CALL    DELET
  630.         MOVE    VOICE,SAVE$VOICE ; VOICE:=SAVE_VOICE;
  631.         MOVE    ATTR,SAVE$ATTR  ; ATTR:=SAVE_ATTR;
  632.         MOVE    DIRECTION,SAVE$DIR ; DIRECTION:=SAVE$DIR;
  633.         MOVI    MODE,SPACE      ; MODE:=SPACE;
  634.         MVI     A,TRUE          ; SHOW_PAGE(TRUE)
  635.         CALL    SHOW$PAGE
  636.         RET                     ; END
  637. EXMD08:
  638.         LXI     D,EXMDL2        ; ERROR(EXMDL2);
  639.         CALL    ERROR
  640.         MVI     A,TRUE          ; SHOW$PAGE(TRUE)
  641.         CALL    SHOW$PAGE
  642.         RET                     ; END
  643. EXMDL1: DB      7,'Input not <up>, <down> or <esc>.  ','$'
  644. EXMDL2: DB      7,'Cannot excise terminal lines.  ','$'
  645.  
  646. MARK:
  647.         DCP     DELIN,LINE
  648.         JP      MARK01
  649.         DMOV    DELIN,LINE
  650. MARK01:
  651.         CALL    GET$LINE
  652.         LDA     SONG$LINE
  653.         XRI     80H
  654.         STA     SONG$LINE
  655.         CALL    PUT$LINE
  656.         MVI     A,FALSE
  657.         CALL    SHOW$PAGE
  658.         RET
  659.  
  660. DELET:
  661.         MOVI    DIRECTION,DOWN
  662.         MOVI    DELX1,FALSE
  663.         CALL    HEAD$SONG
  664. DEL01:
  665.         MCPI    DELX1,TRUE
  666.         RZ
  667.         CALL    NEXT$LINE
  668. DEL02:
  669.         DCP     DELIN,LINE
  670.         RM
  671.         MCPI    EOS,TRUE
  672.         RZ
  673.         CALL    GET$LINE
  674.         LDA     SONG$LINE
  675.         ANI     80H
  676.         JZ      DEL01
  677.         MOVI    DELX1,TRUE
  678.         CALL    DLET$LINE
  679.         JMP     DEL02
  680. DELX1:  DB      0
  681. DELIN: DW      0
  682.  
  683.  
  684.  
  685.