home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol058
/
edit4.sqc
/
EDIT4.SRC
Wrap
Text File
|
1985-02-09
|
12KB
|
358 lines
; SONG DISPLAY PROCEDURES
; A BOOLEAN VALUE IS EXPECTED IN A
SHOW$PAGE:
CPI TRUE ; IF X OR
JZ SHPG01
DCP LINE,TOS ; (DESC.LINE<TOS) OR
JM SHPG01
LHLD MXROW ; (TOS+(MXROW-2)<=DESC.LINE)
DCX H
DCX H
XCHG
LHLD TOS
DAD D
XCHG
LHLD LINE
CALL CPHLDE
JP SHPG01
MCPI MODE,'X'
RNZ
CALL GET$LINE
MVI A,TRUE
CALL SHOW$LINE
RET
SHPG01: ; THEN BEGIN
DMOV SAVE$CURR,CURR ; SAVE_CURR:=DESC.CURR;
DMOV SAVE$LINE,LINE ; SAVE_LINE:=DESC.LINE;
LHLD MXROW ; WORK:=MXROW/2;
ORA A
MOV A,L
RAR
MOV L,A
SHLD SHPGW2
MCPI MODE,'X' ; IF MODE='X'
JNZ SHPG01A
DCP LINE,TOS ; AND (LINE>TOS) THEN
JM SHPG01A
DMOV TOS,LINE ; TOS:=LINE
JMP SHPG03
SHPG01A: ; ELSE
DCP LINE,SHPGW2 ; IF LINE>=WORK THEN
JM SHPG02
DSUB TOS,SAVE$LINE,SHPGW2 ; TOS:=SAVE_LINE-WORK
JMP SHPG03
SHPG02: ; ELSE
DMVI TOS,0 ; TOS:=0;
SHPG03:
DADI I,TOS,1 ; FOR I:=TOS+1 TO SAVE_LINE DO
SHPG04:
CALL LAST$LINE ; LAST_LINE;
NEXT SHPG04,I,SAVE$LINE ; (*END OF FOR*)
CALL CLR$SCR ; CLEAR THE SCREEN;
DMVI I,0 ; I:=0;
LHLD MXROW ; WORK:=MXROW-1
DCX H
SHLD SHPGW2
SHPG05: ; REPEAT
CALL GET$LINE ; GET_LINE;
MVI A,TRUE ; SHOW_LINE(TRUE);
CALL SHOW$LINE
CALL NEXT$LINE ; NEXT_LINE;
DINC I ; I:=I+1
MCPI EOS,TRUE ; UNTIL EOS
JZ SHPG06 ; OR
DCP I,SHPGW2 ; (I>=WORK);
JM SHPG05
SHPG06:
CALL LEGEND ; LEGEND;
DMOV CURR,SAVE$CURR ; DESC.CURR:=SAVE_CURR;
DMOV LINE,SAVE$LINE ; DESC.LINE:=SAVE_LINE
RET ; END
SHPGW2: DW 0
; EXPECTS BOOLEAN VALUE IN A
SHOW$LINE:
PUSH PSW
DSUB ROW,LINE,TOS ; ROW:=DESC.LINE-TOS+1;
DINC ROW
POP PSW
CPI TRUE ; IF X OR
JZ SHLN01
DCP ROW,MXROW ; (ROW>=MXROW) OR
JP SHLN01
MCPI MODE,'N' ; (MODE='N')
JNZ SHLN07 ; THEN BEGIN
SHLN01:
DCP ROW,MXROW ; IF ROW>=MXROW THEN BEGIN
JM SHLN02
DADD TOS,TOS,ROW ; TOS:=TOS+ROW-MXROW+1;
DSUB TOS,TOS,MXROW
DINC TOS
DMOV ROW,MXROW ; ROW:=MXROW-1;
DDEC ROW
LDA ROW ; GOTOXY(0,ROW);
MVI B,0
CALL GOTOXY
WRTLN SHLNL1 ; WRITELN
CALL LEGEND
SHLN02: ; END;
CALL SHLN06 ; CLEAR LINE;
MCPI SONG$LINE,'.' ; IF SONG_LINE[0,0]='.'
JNZ SHLN05 ; THEN BEGIN
INTSTR LINE,SHLNL2+2,4 ; WRITE(' ',DESC.LINE);
WRTLN SHLNL2
MOVI SONG$LINE,SPACE ; SONG_LINE[0,0]:=SPACE;
DMVI X2,11 ; X2:=MXCOL-11;
DSUB X2,MXCOL,X2
DADI SHLNX2,HI$VOICE,1
DDIV X2,X2,SHLNX2 ; OFFSET:=X2 DIV HI_VOICE+1;
MOVI COLUMN,7 ; COLUMN:=7;
DMVI SHLNX2,0 ; FOR SHLNX2:=0 TO HI_VOICE
SHLN03: ; DO BEGIN
IF PERCUSSION
DCP SHLNX2,HI$VOICE ; IF SHLNX2=HI_VOICE THEN BEGIN
JNZ SHLN03C
XGET SONG$LINE-1,LSIZE ; IF SONG_LINE[PERC,0]<>NILL
STA SHLNX3 ; THEN
ORA A ; BEGIN
JZ SHLN04
DMVI SHLNX1,PER$TAB ; SHLNX1:=0;
SHLN03A:
XGET PKEY,SHLNX1 ; WHILE PER_TAB[SHLNX1].KEY<>0FFH DO BEGIN
CPI TRUE
JZ SHLN04
LDA SHLNX3 ; IF SONG$LINE[PERC,0] AND
MOV B,A
XGET PMSK,SHLNX1 ; PER_TAB[SHLNX1].MSK THEN BEGIN
ANA B
JZ SHLN03B
XGET PATTR,SHLNX1 ; GOTOXY(COLUMN+PER_TAB[SHLNX1].ATTR,ROW);
MOV B,A
LDA COLUMN
ADD B
MOV B,A
LDA ROW
CALL GOTOXY
XGET PKEY,SHLNX1 ; WRITE(PER_TAB[SHLNX1].KEY)
CALL FWTCH
SHLN03B:
DADI SHLNX1,SHLNX1,3 ; SHLNX1:=SHLNX1+1
JMP SHLN03A
ENDIF
SHLN03C:
LXI H,SONG$LINE ; IF SONG_LINE[SHLNX2,1]<>SPACE
LDA SHLNX2 ; THEN BEGIN
MVI E,1
CALL COMP$SONG
MOV A,M
CPI SPACE
JZ SHLN04
LDA COLUMN ; GOTOXY(COLUMN,ROW);
MOV B,A
LDA ROW
CALL GOTOXY
LXI H,SONG$LINE ; WRITE(SONG_LINE[I,0],
LDA SHLNX2
MVI E,0
CALL COMP$SONG
MOV A,M
STA SHLNL3
INX H ; SONG_LINE[SHLNX2,1],
MOV A,M
STA SHLNL3+1
INX H ; SONG_LINE[SHLNX2,2])
MOV A,M
STA SHLNL3+2
WRTLN SHLNL3
SHLN04:
DADD COLUMN,COLUMN,X2 ; COLUMN:=COLUMN+OFFSET
NEXT SHLN03,SHLNX2,HI$VOICE ; END(*OF FOR*)
MOVI SONG$LINE,'.' ; SONG_LINE[0,0]:='.'
MADI COLUMN,COLUMN,3
RET ; END
SHLN05: ; ELSE
MCPI SONG$LINE,'*' ; IF SONG_LINE[0,0]='*'
RNZ ; THEN BEGIN
LDA ROW ; GOTOXY(7,ROW);
MVI B,7
CALL GOTOXY
LHLD LSIZE ; SONG$LINE[LSIZE]:=
LXI D,SONG$LINE ; '$';
DAD D
MVI M,'$'
WRTLN SONG$LINE ; WRITE(SONG$LINE)
LHLD LSIZE ; SONG$LINE[LSIZE]:=
LXI D,SONG$LINE ; SPACE;
DAD D
MVI M,SPACE
MOVI COLUMN,22
RET ; END
SHLN06: ; ELSE BEGIN
LDA ROW
CALL CLEOL ; CLEAR THE LINE
LDA ROW ; GOTOXY(0,ROW);
MVI B,0
CALL GOTOXY
MOVI COLUMN,0
RET
SHLN07: ; ELSE
CALL SHOW$CURSOR ; SHOW_CURSOR
RET ; END
SHLNX1: DW 0
SHLNX2: DW 0
SHLNX3: DB 0
IF TRS80
SHLNL1: DB 13,10,'$'
ELSE
SHLNL1: DB 10,'$'
ENDIF
SHLNL2: DB ' XXXX','$'
SHLNL3: DB 'NAO','$'
SHOW$CURSOR:
GTXY 0,0 ; GOTOXY(0,0);
WRITE DIRECTION ; WRITE(DIRECTION);
DSUB ROW,LINE,TOS ; ROW:=DESC_LINE-TOS+1;
DINC ROW
DMVI X2,11 ; X2:=MXCOL-11;
DSUB X2,MXCOL,X2
DADI SHCRX2,HI$VOICE,1
DDIV X2,X2,SHCRX2 ; COLUMN:=((X2 DIV HI_VOICE+1)*
DMUL X2,X2,VOICE ; VOICE)+ATTR+7;
DADD X2,X2,ATTR
DADI COLUMN,X2,7
MCPI VOICE,0 ; IF VOICE=0 THEN
JNZ SHCR01
DINC COLUMN ; COLUMN:=COLUMN+1;
SHCR01:
MCPI VOICE,0 ; IF VOICE<0 THEN
JP SHCR02
DMVI COLUMN,0 ; COLUMN:=0;
SHCR02:
LDA COLUMN ; GOTOXY(COLUMN,ROW)
MOV B,A
LDA ROW
CALL GOTOXY
RET ; END
SHCRX2: DW 0
LEGEND:
XRA A
CALL CLEOL ; CLEAR THE LINE;
GTXY 0,0 ; GOTOXY(0,0);
MCPI MODE,SPACE ; IF MODE=SPACE
JNZ LGND02 ; THEN BEGIN
MOVE LGNDL1,DIRECTION ; LGNDL1:=DIRECTION;
WRTLN LGNDL1 ; WRITE(UPDN,'EDIT..)
RET ; END
LGND02: ; ELSE
CPI 'N' ; IF MODE='N'
JNZ LGND03 ; THEN BEGIN
MOVE LGNDL2,DIRECTION ; LGNDL2:=DIRECTION;
WRTLN LGNDL2 ; WRITE(UPDN,'INSERT..)
RET ; END
LGND03: ; ELSE BEGIN
MOVE LGNDL3,DIRECTION ; LGNDL3:=DIRECTION;
WRTLN LGNDL3 ; WRITE(UPDN,'XCISE..)
RET ; END
LGNDL1: DB ' EDIT: text, cursors, I(nsert, X(cise, '
DB 'O(ptions, M(easure, quit','$'
LGNDL2: DB ' INSERT: text, cursors, M(easure, quit','$'
LGNDL3: DB ' EXCISE: up, down or quit.','$'
; PROCEDURE TO GET NAME FOR OPTIONS
GET$NAME:
REDLN WNAM,8 ; READLN(WNAM);
LXI H,WNAM ; MOVELEFT(WNAM,SONG$LINE+3,WNAM-1)
LXI D,SONG$LINE+3
LDA WNAM-1
ORA A
CNZ MOVELEFT
RET
; PROCEDURE TO COMPUTE ADDRESS IN SONG/SEED LINE
; INPUTS: HL = @(X$LINE)
; A = VOICE
; E = ATTR
; OUTPUTS: HL = @(S$LINE[VOICE,ATTR])
COMP$SONG:
PUSH D
MOV D,A
ORA A ; HL:=HL+3*A+E
RAL
ADD D
ADD E
MVI D,0
MOV E,A
DAD D
POP D
RET
; ERROR MESSAGE DISPLAY PROCEDURE
; INPUTS: DE = @(ERROR MESSAGE)
ERROR:
PUSH D
ERR01:
CALL BEEP
XRA A
CALL CLEOL ; CLEAR TOP LINE OF SCREEN
MVI A,0 ; GOTOXY(0,0);
MVI B,0
CALL GOTOXY
POP D ; WRITE ERROR MESSAGE;
PUSH D
XCHG
CALL FWRTLN
WRTLN ERMSG ; WRITE(ERMSG);
IF TRS80
CALL BEEP
ENDIF
READ CH ; READ(CH)
CPI SPACE ; UNTIL CH=SPACE
JNZ ERR01
POP D
RET
ERMSG: DB 'Type <space> to continue.','$'
; PROCEDURE TO FIND BIT POSITION OF ELEMENT IN SET
; WHERE ELEMENT IN ['A'..'G'] AND SET IS
; SHARP OR FLAT
; INPUTS: A = ELEMENT OF SET
; B = SET
; OUTPUTS: A = ELEMENT MASK
FIND$BIT:
CPI 'R'
JZ FDBT01
CPI 'S'
JNZ FDBT02
FDBT01:
XRA A
RET
FDBT02:
PUSH B
ANI 0FH
MOV C,A
MVI A,1
FDBT03:
ORA A
RAL
DCR C
JNZ FDBT03
POP B
RET