home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / edit4.sqc / EDIT4.SRC
Text File  |  1985-02-09  |  12KB  |  358 lines

  1.  
  2. ;       SONG DISPLAY PROCEDURES
  3.  
  4. ;               A BOOLEAN VALUE IS EXPECTED IN A
  5.  
  6. SHOW$PAGE:
  7.         CPI     TRUE            ; IF X OR
  8.         JZ      SHPG01
  9.         DCP     LINE,TOS        ; (DESC.LINE<TOS) OR
  10.         JM      SHPG01
  11.         LHLD    MXROW           ; (TOS+(MXROW-2)<=DESC.LINE)
  12.         DCX     H
  13.         DCX     H
  14.         XCHG
  15.         LHLD    TOS
  16.         DAD     D
  17.         XCHG
  18.         LHLD    LINE
  19.         CALL    CPHLDE
  20.         JP      SHPG01
  21.         MCPI    MODE,'X'
  22.         RNZ
  23.         CALL    GET$LINE
  24.         MVI     A,TRUE
  25.         CALL    SHOW$LINE
  26.         RET
  27. SHPG01:                         ; THEN BEGIN
  28.         DMOV    SAVE$CURR,CURR  ; SAVE_CURR:=DESC.CURR;
  29.         DMOV    SAVE$LINE,LINE  ; SAVE_LINE:=DESC.LINE;
  30.         LHLD    MXROW           ; WORK:=MXROW/2;
  31.         ORA     A
  32.         MOV     A,L
  33.         RAR
  34.         MOV     L,A
  35.         SHLD    SHPGW2
  36.         MCPI    MODE,'X'        ; IF MODE='X'
  37.         JNZ     SHPG01A
  38.         DCP     LINE,TOS        ; AND (LINE>TOS) THEN
  39.         JM      SHPG01A
  40.         DMOV    TOS,LINE        ; TOS:=LINE
  41.         JMP     SHPG03
  42. SHPG01A:                        ; ELSE
  43.         DCP     LINE,SHPGW2     ; IF LINE>=WORK THEN
  44.         JM      SHPG02
  45.         DSUB    TOS,SAVE$LINE,SHPGW2 ; TOS:=SAVE_LINE-WORK
  46.         JMP     SHPG03
  47. SHPG02:                         ; ELSE
  48.         DMVI    TOS,0           ; TOS:=0;
  49. SHPG03:
  50.         DADI    I,TOS,1         ; FOR I:=TOS+1 TO SAVE_LINE DO
  51. SHPG04:
  52.         CALL    LAST$LINE       ; LAST_LINE;
  53.         NEXT    SHPG04,I,SAVE$LINE ; (*END OF FOR*)
  54.         CALL    CLR$SCR         ; CLEAR THE SCREEN;
  55.         DMVI    I,0             ; I:=0;
  56.         LHLD    MXROW           ; WORK:=MXROW-1
  57.         DCX     H
  58.         SHLD    SHPGW2
  59. SHPG05:                         ; REPEAT
  60.         CALL    GET$LINE        ; GET_LINE;
  61.         MVI     A,TRUE          ; SHOW_LINE(TRUE);
  62.         CALL    SHOW$LINE
  63.         CALL    NEXT$LINE       ; NEXT_LINE;
  64.         DINC    I               ; I:=I+1
  65.         MCPI    EOS,TRUE        ; UNTIL EOS
  66.         JZ      SHPG06          ; OR
  67.         DCP     I,SHPGW2        ; (I>=WORK);
  68.         JM      SHPG05
  69. SHPG06:
  70.         CALL    LEGEND          ; LEGEND;
  71.         DMOV    CURR,SAVE$CURR  ; DESC.CURR:=SAVE_CURR;
  72.         DMOV    LINE,SAVE$LINE  ; DESC.LINE:=SAVE_LINE
  73.         RET                     ; END
  74. SHPGW2: DW      0
  75.  
  76. ;               EXPECTS BOOLEAN VALUE IN A
  77.  
  78. SHOW$LINE:
  79.         PUSH    PSW
  80.         DSUB    ROW,LINE,TOS    ; ROW:=DESC.LINE-TOS+1;
  81.         DINC    ROW
  82.         POP     PSW
  83.         CPI     TRUE            ; IF X OR
  84.         JZ      SHLN01
  85.         DCP     ROW,MXROW       ; (ROW>=MXROW) OR
  86.         JP      SHLN01
  87.         MCPI    MODE,'N'        ; (MODE='N')
  88.         JNZ     SHLN07          ; THEN BEGIN
  89. SHLN01:
  90.         DCP     ROW,MXROW       ; IF ROW>=MXROW THEN BEGIN
  91.         JM      SHLN02
  92.         DADD    TOS,TOS,ROW     ; TOS:=TOS+ROW-MXROW+1;
  93.         DSUB    TOS,TOS,MXROW
  94.         DINC    TOS
  95.         DMOV    ROW,MXROW       ; ROW:=MXROW-1;
  96.         DDEC    ROW
  97.         LDA     ROW             ; GOTOXY(0,ROW);
  98.         MVI     B,0
  99.         CALL    GOTOXY
  100.         WRTLN   SHLNL1          ; WRITELN
  101.         CALL    LEGEND
  102. SHLN02:                         ; END;
  103.         CALL    SHLN06          ; CLEAR LINE;
  104.         MCPI    SONG$LINE,'.'   ; IF SONG_LINE[0,0]='.'
  105.         JNZ     SHLN05          ; THEN BEGIN
  106.         INTSTR  LINE,SHLNL2+2,4 ; WRITE('  ',DESC.LINE);
  107.         WRTLN   SHLNL2
  108.         MOVI    SONG$LINE,SPACE ; SONG_LINE[0,0]:=SPACE;
  109.         DMVI    X2,11           ; X2:=MXCOL-11;
  110.         DSUB    X2,MXCOL,X2
  111.         DADI    SHLNX2,HI$VOICE,1
  112.         DDIV    X2,X2,SHLNX2    ; OFFSET:=X2 DIV HI_VOICE+1;
  113.         MOVI    COLUMN,7        ; COLUMN:=7;
  114.         DMVI    SHLNX2,0        ; FOR SHLNX2:=0 TO HI_VOICE
  115. SHLN03:                         ; DO BEGIN
  116.         
  117.         IF      PERCUSSION
  118.         DCP     SHLNX2,HI$VOICE ; IF SHLNX2=HI_VOICE THEN BEGIN
  119.         JNZ     SHLN03C
  120.         XGET    SONG$LINE-1,LSIZE ; IF SONG_LINE[PERC,0]<>NILL
  121.         STA     SHLNX3          ; THEN
  122.         ORA     A               ; BEGIN
  123.         JZ      SHLN04
  124.         DMVI    SHLNX1,PER$TAB  ; SHLNX1:=0;
  125. SHLN03A:
  126.         XGET    PKEY,SHLNX1     ; WHILE PER_TAB[SHLNX1].KEY<>0FFH DO BEGIN
  127.         CPI     TRUE
  128.         JZ      SHLN04
  129.         LDA     SHLNX3          ; IF SONG$LINE[PERC,0] AND
  130.         MOV     B,A
  131.         XGET    PMSK,SHLNX1     ; PER_TAB[SHLNX1].MSK THEN BEGIN
  132.         ANA     B
  133.         JZ      SHLN03B
  134.         XGET    PATTR,SHLNX1    ; GOTOXY(COLUMN+PER_TAB[SHLNX1].ATTR,ROW);
  135.         MOV     B,A
  136.         LDA     COLUMN
  137.         ADD     B
  138.         MOV     B,A
  139.         LDA     ROW
  140.         CALL    GOTOXY
  141.         XGET    PKEY,SHLNX1     ; WRITE(PER_TAB[SHLNX1].KEY)
  142.         CALL    FWTCH
  143. SHLN03B:
  144.         DADI    SHLNX1,SHLNX1,3 ; SHLNX1:=SHLNX1+1
  145.         JMP     SHLN03A
  146.         ENDIF
  147.  
  148. SHLN03C:
  149.         LXI     H,SONG$LINE     ; IF SONG_LINE[SHLNX2,1]<>SPACE
  150.         LDA     SHLNX2          ; THEN BEGIN
  151.         MVI     E,1
  152.         CALL    COMP$SONG
  153.         MOV     A,M
  154.         CPI     SPACE
  155.         JZ      SHLN04
  156.         LDA     COLUMN          ; GOTOXY(COLUMN,ROW);
  157.         MOV     B,A
  158.         LDA     ROW
  159.         CALL    GOTOXY
  160.         LXI     H,SONG$LINE     ; WRITE(SONG_LINE[I,0],
  161.         LDA     SHLNX2
  162.         MVI     E,0
  163.         CALL    COMP$SONG
  164.         MOV     A,M
  165.         STA     SHLNL3
  166.         INX     H               ; SONG_LINE[SHLNX2,1],
  167.         MOV     A,M
  168.         STA     SHLNL3+1
  169.         INX     H               ; SONG_LINE[SHLNX2,2])
  170.         MOV     A,M
  171.         STA     SHLNL3+2
  172.         WRTLN   SHLNL3
  173. SHLN04:
  174.         DADD    COLUMN,COLUMN,X2 ; COLUMN:=COLUMN+OFFSET
  175.         NEXT    SHLN03,SHLNX2,HI$VOICE  ; END(*OF FOR*)
  176.         MOVI    SONG$LINE,'.'   ; SONG_LINE[0,0]:='.'
  177.         MADI    COLUMN,COLUMN,3
  178.         RET                     ; END
  179. SHLN05:                         ; ELSE
  180.         MCPI    SONG$LINE,'*'   ; IF SONG_LINE[0,0]='*'
  181.         RNZ                     ; THEN BEGIN
  182.         LDA     ROW             ; GOTOXY(7,ROW);
  183.         MVI     B,7
  184.         CALL    GOTOXY
  185.         LHLD    LSIZE           ; SONG$LINE[LSIZE]:=
  186.         LXI     D,SONG$LINE     ;   '$';
  187.         DAD     D
  188.         MVI     M,'$'
  189.         WRTLN   SONG$LINE       ; WRITE(SONG$LINE)
  190.         LHLD    LSIZE           ; SONG$LINE[LSIZE]:=
  191.         LXI     D,SONG$LINE     ;   SPACE;
  192.         DAD     D
  193.         MVI     M,SPACE
  194.         MOVI    COLUMN,22
  195.         RET                     ; END
  196. SHLN06:                         ; ELSE BEGIN
  197.         LDA     ROW
  198.         CALL    CLEOL           ; CLEAR THE LINE
  199.         LDA     ROW             ; GOTOXY(0,ROW);
  200.         MVI     B,0
  201.         CALL    GOTOXY
  202.         MOVI    COLUMN,0
  203.         RET
  204. SHLN07:                         ; ELSE
  205.         CALL    SHOW$CURSOR     ; SHOW_CURSOR
  206.         RET                     ; END
  207. SHLNX1: DW      0
  208. SHLNX2: DW      0
  209. SHLNX3: DB      0
  210.         IF      TRS80
  211. SHLNL1: DB      13,10,'$'
  212.         ELSE
  213. SHLNL1: DB      10,'$'
  214.         ENDIF
  215. SHLNL2: DB      '  XXXX','$'
  216. SHLNL3: DB      'NAO','$'
  217.  
  218. SHOW$CURSOR:
  219.         GTXY    0,0             ; GOTOXY(0,0);
  220.         WRITE   DIRECTION       ; WRITE(DIRECTION);
  221.         DSUB    ROW,LINE,TOS    ; ROW:=DESC_LINE-TOS+1;
  222.         DINC    ROW
  223.         DMVI    X2,11           ; X2:=MXCOL-11;
  224.         DSUB    X2,MXCOL,X2
  225.         DADI    SHCRX2,HI$VOICE,1
  226.         DDIV    X2,X2,SHCRX2    ; COLUMN:=((X2 DIV HI_VOICE+1)*
  227.         DMUL    X2,X2,VOICE     ; VOICE)+ATTR+7;
  228.         DADD    X2,X2,ATTR
  229.         DADI    COLUMN,X2,7
  230.         MCPI    VOICE,0         ; IF VOICE=0 THEN
  231.         JNZ     SHCR01
  232.         DINC    COLUMN          ; COLUMN:=COLUMN+1;
  233. SHCR01:
  234.         MCPI    VOICE,0         ; IF VOICE<0 THEN
  235.         JP      SHCR02
  236.         DMVI    COLUMN,0        ; COLUMN:=0;
  237. SHCR02:
  238.         LDA     COLUMN          ; GOTOXY(COLUMN,ROW)
  239.         MOV     B,A
  240.         LDA     ROW    
  241.         CALL    GOTOXY
  242.         RET                     ; END
  243. SHCRX2: DW      0
  244.  
  245. LEGEND:
  246.         XRA     A
  247.         CALL    CLEOL           ; CLEAR THE LINE;
  248.         GTXY    0,0             ; GOTOXY(0,0);
  249.         MCPI    MODE,SPACE      ; IF MODE=SPACE
  250.         JNZ     LGND02          ; THEN BEGIN
  251.         MOVE    LGNDL1,DIRECTION ; LGNDL1:=DIRECTION;
  252.         WRTLN   LGNDL1          ; WRITE(UPDN,'EDIT..)
  253.         RET                     ; END
  254. LGND02:                         ; ELSE
  255.         CPI     'N'             ; IF MODE='N'
  256.         JNZ     LGND03          ; THEN BEGIN
  257.         MOVE    LGNDL2,DIRECTION ; LGNDL2:=DIRECTION;
  258.         WRTLN   LGNDL2          ; WRITE(UPDN,'INSERT..)
  259.         RET                     ; END
  260. LGND03:                         ; ELSE BEGIN
  261.         MOVE    LGNDL3,DIRECTION ; LGNDL3:=DIRECTION;
  262.         WRTLN   LGNDL3          ; WRITE(UPDN,'XCISE..)
  263.         RET                     ; END
  264. LGNDL1: DB      ' EDIT: text, cursors, I(nsert, X(cise, '
  265.         DB      'O(ptions, M(easure, quit','$'
  266. LGNDL2: DB      ' INSERT: text, cursors, M(easure, quit','$'
  267. LGNDL3: DB      ' EXCISE: up, down or quit.','$'
  268.  
  269. ;               PROCEDURE TO GET NAME FOR OPTIONS
  270.  
  271. GET$NAME:
  272.         REDLN   WNAM,8          ; READLN(WNAM);
  273.         LXI     H,WNAM          ; MOVELEFT(WNAM,SONG$LINE+3,WNAM-1)
  274.         LXI     D,SONG$LINE+3
  275.         LDA     WNAM-1
  276.         ORA     A
  277.         CNZ     MOVELEFT
  278.         RET
  279.  
  280. ;               PROCEDURE TO COMPUTE ADDRESS IN SONG/SEED LINE
  281.  
  282. ;               INPUTS:         HL = @(X$LINE)
  283. ;                               A = VOICE
  284. ;                               E = ATTR
  285. ;               OUTPUTS:        HL = @(S$LINE[VOICE,ATTR])
  286.  
  287. COMP$SONG:
  288.         PUSH    D
  289.         MOV     D,A
  290.         ORA     A               ; HL:=HL+3*A+E
  291.         RAL
  292.         ADD     D
  293.         ADD     E
  294.         MVI     D,0
  295.         MOV     E,A
  296.         DAD     D
  297.         POP     D
  298.         RET
  299.  
  300. ;               ERROR MESSAGE DISPLAY PROCEDURE
  301.  
  302. ;               INPUTS:         DE = @(ERROR MESSAGE)
  303.  
  304. ERROR:
  305.         PUSH    D
  306. ERR01:
  307.         CALL    BEEP
  308.         XRA     A
  309.         CALL    CLEOL           ; CLEAR TOP LINE OF SCREEN
  310.         MVI     A,0             ; GOTOXY(0,0);
  311.         MVI     B,0
  312.         CALL    GOTOXY
  313.         POP     D               ; WRITE ERROR MESSAGE;
  314.         PUSH    D
  315.         XCHG
  316.         CALL    FWRTLN
  317.         WRTLN   ERMSG           ; WRITE(ERMSG);
  318.         IF      TRS80
  319.         CALL    BEEP
  320.         ENDIF
  321.         READ    CH              ; READ(CH)
  322.         CPI     SPACE           ; UNTIL CH=SPACE
  323.         JNZ     ERR01
  324.         POP     D
  325.         RET
  326. ERMSG:  DB      'Type <space> to continue.','$'
  327.  
  328. ;               PROCEDURE TO FIND BIT POSITION OF ELEMENT IN SET
  329. ;                       WHERE ELEMENT IN ['A'..'G'] AND SET IS
  330. ;                       SHARP OR FLAT
  331.  
  332. ;               INPUTS:         A = ELEMENT OF SET
  333. ;                               B = SET
  334. ;               OUTPUTS:        A = ELEMENT MASK
  335.  
  336. FIND$BIT:
  337.         CPI     'R'
  338.         JZ      FDBT01
  339.         CPI     'S'
  340.         JNZ     FDBT02
  341. FDBT01:
  342.         XRA     A
  343.         RET
  344. FDBT02:
  345.         PUSH    B
  346.         ANI     0FH
  347.         MOV     C,A
  348.         MVI     A,1
  349. FDBT03:
  350.         ORA     A
  351.         RAL
  352.         DCR     C
  353.         JNZ     FDBT03
  354.         POP     B
  355.         RET
  356.  
  357.  
  358.