home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol058
/
edit1.sqc
/
EDIT1.SRC
Wrap
Text File
|
1985-02-09
|
21KB
|
685 lines
; EDITOR - Musicraft Development System
; copyright 1981 by COMPUTERCRAFT
; This program allows the user to create and maintain
; song files on floppy disk. A song file (with a '.sng'
; type) is read into the work buffer in main memory for
; editing. After changes have been made, a new song file
; is created using the same name and type as the input
; file. The original input file type is changed to '.sbk'
; to provide a backup.
IF NOT TRS80
ORG 100H
ELSE
ORG 7000H
ENDIF
MAIN$LINE:
JMP RESTART
BOOTER: JMP SYSTEM
DB 'copyright 1981 by computercraft'
ORG MAIN$LINE+80H
RESTART:
LXI SP,STACK
CALL INITIALIZE ; INITIALIZE;
CALL LOAD$SONG ; LOAD_SONG;
MCPI START,TRUE ; IF START THEN NEW_SONG;
CZ NEW$SONG
CALL EDIT$MODE ; EDIT_MODE;
CALL SAVE$SONG ; SAVE_SONG
JMP BOOT ; END
; INITIALIZATION PROCEDURES
INITIALIZE:
IF NOT TRS80
LMVI TBUF,SONG$NAME,20
CALL BEGIN
LMVI SONG$NAME,TBUF,20
ENDIF
CALL CLR$SCR
CALL INIT$SONG
DMVI MSR$CNT,1
IF NOT TRS80
LDA TBUF ; OBTAIN
ORA A ; SONG
JZ INIT01 ; NAME
STA SONG$NAME-1
LMOV TBUF+1,SONG$NAME,TBUF
RET
INIT01:
ENDIF
WRTLN INITL1 ; WRITELN(INITL1);
REDLN SONG$NAME,12 ; READLN(SONG_NAME)
RET ; END
INITL1: DB 13,10,'Enter name of song >','$'
LOAD$SONG:
CALL CLR$SCR ; CLR_SCR;
RESET FCB,SONG$NAME,'S','N','G'
MOVI START,TRUE ; START := TRUE;
RC
; SONG IS ON FILE AND CAN BE LOADED
MOVI START,FALSE ; START := FALSE;
WRTLN LDSGL1 ; WRITELN(LDSGL1);
CALL HEAD$SONG
MOVI EOF,FALSE
JMP LDSG04 ; READ FIRST LINE OF SONG
LDSG01:
MCPI EOF,TRUE ; WHILE NOT EOF DO BEGIN
RZ
MCPI SONG$LINE,'*'
JNZ LDSG03
MCPI SONG$LINE+1,'M'
JZ LDSG02
CPI 'V'
JNZ LDSG03
STRINT SONG$LINE+3,HI$VOICE
JMP LDSG04 ; READ NEXT LINE
LDSG02:
STRINT SONG$LINE+3,MSR$CNT ; MSR_CNT:=STR_INT(3)+1
DINC MSR$CNT
LDSG03:
CALL NSRT$LINE ; INSERT SONG LINE
CALL PUT$LINE ; INTO BUFFER
LDSG04:
FCHR SONG$LINE,LSIZE,SPACE
LDSG04A:
READF FCB,CH
JC LDSG06
CPI 1AH
JZ LDSG06
CPI '.'
JZ LDSG04B
CPI '*'
JNZ LDSG06
LDSG04B:
STA SONG$LINE
DMVI I,2 ; FOR I := 2 TO LSIZE DO BEGIN
LDSG05:
READF FCB,CH ; READ(FCB,CH);
JC LDSG06
LDSG05A:
XPUT SONG$LINE-1,I ; SONG$LINE[I]:=CH
NEXT LDSG05,I,LSIZE ; END(*OF FOR *)
JMP LDSG01
LDSG06:
MOVI EOF,TRUE
JMP LDSG01
LDSGL1: DB 'Loading song. Please stand by.','$'
; SONG IS NEW
NEW$SONG:
INTSTR MXVCE,NWSGL1A,1
WRTLN NWSGL1
LHLD MXVCE
CALL GET$INT
INX H
SHLD HI$VOICE
RET
NWSGL1: DB 13,10,'This is a new song. '
DB 'Please enter number of voices (1..'
NWSGL1A: DB ' ) >','$'
SAVE$SONG:
CALL CLR$SCR
MCPI START,TRUE ; IF START<>TRUE THEN
JZ SVSG01
IF NOT TRS80
DELETE FCB,SONG$NAME,'S','B','K'
LXI H,FCB
LXI D,FCB+16
MVI A,12
CALL MOVELEFT
MOVI FCB+9,'S'
MOVI FCB+10,'N'
MOVI FCB+11,'G'
LXI D,FCB ; RENAME(SONG_IN,SONG_BAK);
CALL FSW ; (SET FOR PROPER DRIVE)
MVI C,23
CALL CPM
LXI D,FCB
CALL FSW ; (REVERT TO DEFAULT DRIVE)
ELSE
WRTLN SVSGL1
REDLN SONG$NAME,32
ENDIF
SVSG01:
REWRT FCB,SONG$NAME,'S','N','G'
JC SVSG07
WRTLN SVSGL2
FCHR SONG$LINE,LSIZE,SPACE
LXI H,SONG$LINE
MVI M,'*'
INX H
MVI M,'V'
INTSTR HI$VOICE,SONG$LINE+3,1
CALL HEAD$SONG
DMVI MSR$CNT,1
SVSG02:
CALL SVSG04 ; OUTPUT SONG LINE
CALL NEXT$LINE
CALL GET$LINE
DCP CURR,TAIL
JZ SVSG03
MCPI SONG$LINE,'*' ; IF SONG$LINE[0] = '*'
JNZ SVSG02
MCPI SONG$LINE+1,'M' ; AND SONG$LINE[1] = 'M'
JNZ SVSG02
INTSTR MSR$CNT,SONG$LINE+3,4
DINC MSR$CNT
JMP SVSG02
SVSG03:
CLOSE FCB ; CLOSE(G,LOCK);
RET
SVSG04:
DMVI I,1 ; FOR I:=1 TO LSIZE DO BEGIN
DMVI J,SONG$LINE-1
SVSG05:
DINC J ; WRITE(FCB,SONG$LINE[I]);
MOV A,M
LXI D,FCB
CALL FWRIT
JC SVSG06
NEXT SVSG05,I,LSIZE ; END(*OF FOR*)
RET
SVSG06:
WRTLN SVSGL4
GTCH CH
DELETE FCB,SONG$NAME,'S','N','G'
JMP SAVE$SONG
SVSG07:
IF TRS80
WRTLN SVSGL3
GTCH CH
MCPI CH,'Y'
JNZ SAVE$SONG
DELETE FCB,SONG$NAME,'S','N','G'
JMP SVSG01
ELSE
JMP BOOT
ENDIF
IF TRS80
SVSGL1: DB 'Enter name of output song >','$'
SVSGL3: DB 13,10,'Song exists. Replace it(y/n)?','$'
ENDIF
SVSGL2: DB 13,10,'Saving song. Please stand by.','$'
SVSGL4: DB 13,10,'No space on disk for song.'
DB 13,10,'Mount new disk and press'
DB 13,10,'any key to continue.','$'
; EDIT MODE PROCEDURES
EDIT$MODE:
CALL HEAD$SONG ; HEAD_SONG;
MVI A,TRUE ; SHOW_PAGE(TRUE);
CALL SHOW$PAGE
EDMD01: ; REPEAT
CALL SHOW$CURSOR ; SHOW_CURSOR;
GTCH CH ; GET_CHAR(CH);
MOV B,A
MIFI '?',CNTR$PAGE,EDMD01
MIF HOME,HOME$SONG,EDMD01
MIFI 'P',PAGE$PROC,EDMD01
MIFI 'N',NEXT$MEASURE,EDMD01
MIF UP$ARROW,UP$PROC,EDMD01
MIF DOWN$ARROW,DOWN$PROC,EDMD01
MIF RETURN,DOWN$PROC,EDMD01
MIF LEFT$ARROW,LEFT$PROC,EDMD01
MIF RITE$ARROW,RITE$PROC,EDMD01
MIFI SPACE,SPC$PROC,EDMD01
MIFI '<',UP$DIR,EDMD01
MIFI '>',DN$DIR,EDMD01
MIFI 'M',MEASURE,EDMD01
MIFI 'I',INSERT$MODE,EDMD01
MIFI 'X',EXCISE$MODE,EDMD01
MIFI 'O',OPTIONS$MODE,EDMD01
MIF QUIT,QUIT$PROC,EDMD01
CALL NSRTATTR
JMP EDMD01
CNTR$PAGE:
MVI A,TRUE
CALL SHOW$PAGE
RET
HOME$SONG:
MCPI DIRECTION,UP
JNZ HMSG01
MOVI DIRECTION,DOWN
CALL HEAD$SONG
JMP HMSG02
HMSG01:
MOVI DIRECTION,UP
CALL TAIL$SONG
HMSG02:
XRA A ; SHOW_PAGE(FALSE)
CALL SHOW$PAGE
RET
PAGE$PROC:
MOVI EOS,FALSE
DMVI I,2
PGPR01: ; FOR I := 2 TO MXROW DO BEGIN
MCPI DIRECTION,UP ; IF DIRECTION = UP THEN
JNZ PGPR02
CALL LAST$LINE ; LAST_LINE
JMP PGPR03
PGPR02:
CALL NEXT$LINE ; ELSE NEXT_LINE
PGPR03:
NEXT PGPR01,I,MXROW ; END(*OF FOR*)
DCP CURR,HEAD ; IF CURR=HEAD THEN
JNZ PGPR04
MOVI DIRECTION,DOWN ; DIRECTION:=DOWN
JMP PGPR05
PGPR04: ; ELSE
DCP CURR,TAIL ; IF CURR=TAIL THEN
JNZ PGPR05
MOVI DIRECTION,UP ; DIRECTION:=UP;
PGPR05:
XRA A ; SHOW_PAGE(FALSE)
CALL SHOW$PAGE
RET
NEXT$MEASURE:
MCPI DIRECTION,UP ; IF DIRECTION = UP THEN
JNZ NXMR01
CALL LAST$LINE ; LAST_LINE
JMP NXMR02
NXMR01: ; ELSE
CALL NEXT$LINE ; NEXT_LINE;
NXMR02:
MCPI EOS,TRUE ; WHILE NOT EOS DO BEGIN
JZ NXMR05
CALL GET$LINE ; GET_LINE;
MCPI SONG$LINE,'*' ; IF SONG$LINE[0] = '*'
JNZ NXMR03
MCPI SONG$LINE+1,'M' ; AND SONG$LINE[1] = 'M' THEN
JZ NXMR07 ; "EXIT"
NXMR03:
MCPI DIRECTION,UP ; IF DIRECTION = UP THEN
JNZ NXMR04
CALL LAST$LINE ; LAST_LINE
JMP NXMR02
NXMR04: ; ELSE
CALL NEXT$LINE ; NEXT_LINE
JMP NXMR02 ; END;
NXMR05:
DCP CURR,HEAD ; IF CURR=HEAD THEN
JNZ NXMR06
MOVI DIRECTION,DOWN ; DIRECTION:=DOWN
JMP NXMR07
NXMR06: ; ELSE
DCP CURR,TAIL ; IF CURR=TAIL THEN BEGIN
JNZ NXMR07
MOVI DIRECTION,UP ; DIRECTION:=UP;
NXMR07:
XRA A ; SHOW_PAGE(FALSE)
CALL SHOW$PAGE
RET
UP$PROC:
CALL LAST$LINE ; LAST_LINE;
XRA A ; SHOW_PAGE(FALSE);
CALL SHOW$PAGE
DCP CURR,HEAD ; IF CURR=HEAD THEN
RNZ
MOVI DIRECTION,DOWN ; DIRECTION:=DOWN
RET
DOWN$PROC:
CALL NEXT$LINE ; NEXT_LINE;
CALL GET$LINE ; GET_LINE;
MOVI ATTR,0 ; ATTR:=0;
MVI A,FALSE ; SHOW_LINE(FALSE);
CALL SHOW$LINE
DCP CURR,TAIL ; IF CURR=TAIL THEN
RNZ
MOVI DIRECTION,UP ; DIRECTION:=UP
RET
LEFT$PROC:
CALL LAST$ATTR
RET
RITE$PROC:
MOVI ATTR,0 ; ATTR:=0;
MINC VOICE ; VOICE:=VOICE+1;
MCP HI$VOICE,VOICE ; IF VOICE>HI$VOICE
RP ; THEN
MOVI VOICE,0 ; VOICE:=0
RET ; END
SPC$PROC:
CALL NEXT$ATTR ; NEXT_ATTR
RET ; END
UP$DIR:
MOVI DIRECTION,UP
RET
DN$DIR:
MOVI DIRECTION,DOWN
RET
QUIT$PROC:
CALL CLR$SCR
WRTLN QTPRL1
GTCH CH
CPI 'Y'
JNZ QTPR02
QTPR01:
CALL NEXT$LINE
POP H
RET
QTPR02:
MVI A,TRUE
CALL SHOW$PAGE
RET
QTPRL1: DB 'Are you sure? (y,n) >'
DB '$'
; INSERT MODE PROCEDURES
INSERT$MODE:
CALL GET$LINE ; GET_LINE;
MOVI MODE,'N' ; MODE:='N';
CALL LEGEND ; LEGEND;
MOVI ATTR,0 ; ATTR:=0;
MOVI SNG$MODE,FALSE ; SONG_MODE:=FALSE;
MCPI SONG$LINE,'.' ; IF (SONG$LINE[0,0]<>'.') OR
JNZ NSMD01
LXI H,SONG$LINE ; (SONG$LINE[VOICE,1]<>' ')
LDA VOICE
MVI E,1
CALL COMP$SONG
MOV A,M
CPI SPACE
JZ NSMD02
NSMD01: ; THEN BEGIN
MOVI SNG$MODE,TRUE ; SNG_MODE:=TRUE;
CALL LAST$LINE ; LAST_LINE;
CALL NSRT$LINE ; NSRT_LINE;
FCHR SONG$LINE,LSIZE,SPACE
IF PERCUSSION
MVI A,0 ; SONG$LINE[HI$VOICE,0]:=NILL;
XPUT SONG$LINE-1,LSIZE
ENDIF
LXI H,SONG$LINE
MVI M,'.'
CALL PUT$LINE ; PUT_LINE
NSMD02: ; END;
FCHR SEED$LINE,LSIZE,SPACE
IF PERCUSSION
MVI A,0 ; SEED$LINE[HI$VOICE,0]:=NILL;
XPUT SEED$LINE-1,LSIZE
ENDIF
LXI H,SEED$LINE ; SEED_LINE[0,0]:='.';
MVI M,'.'
MCPI SNG$MODE,TRUE ; IF SNG_MODE THEN
JNZ NSMD03
MVI A,TRUE ; SHOW_LINE(TRUE);
CALL SHOW$LINE
IF TRS80
LDA MXROW
MOV B,A
LDA ROW
INR A
CMP B
CM CLEOS
ELSE
LDA ROW
INR A
CALL CLEOS ; CLR_EOS;
ENDIF
NSMD03: ; REPEAT
CALL SHOW$CURSOR ; SHOW_CURSOR;
GTCH CH ; GET_CHAR(CH);
MOV B,A
MIFI '?',NS$CNTR$PAGE,NSMD03
MIF LEFT$ARROW,NS$LEFT$PROC,NSMD03
MIF DOWN$ARROW,NS$DOWN$PROC,NSMD03
MIF RITE$ARROW,NS$RITE$PROC,NSMD03
MIF RETURN,NS$DOWN$PROC,NSMD03
MIFI SPACE,NS$SPC$PROC,NSMD03
MIFI 'M',MEASURE,NSMD03
MIF QUIT,NS$QUIT$PROC,NSMD03
CALL NSRTATTR
JMP NSMD03
NS$CNTR$PAGE:
MVI A,TRUE
CALL SHOW$PAGE
MCPI SNG$MODE,TRUE ; IF SNG_MODE THEN
CZ CLEOS
RET
NS$LEFT$PROC:
CALL LAST$ATTR ; LAST_ATTR
RET ; END
NS$DOWN$PROC:
MCPI SNG$MODE,TRUE
JNZ NDNP01
CALL NSRT$LINE ; NSRT_LINE;
FCHR SONG$LINE,LSIZE,SPACE
LXI H,SONG$LINE
MVI M,'.'
IF PERCUSSION
MVI A,0
XPUT SONG$LINE-1,LSIZE
ENDIF
JMP NDNP05 ; SONG_LINE[0,0]:='.'
; END
NDNP01: ; ELSE BEGIN
CALL NEXT$LINE ; NEXT_LINE;
CALL GET$LINE ; GET_LINE;
MCPI SONG$LINE,'.' ; IF (SONG_LINE[0,0] <> '.') OR
JNZ NDNP02
LXI H,SONG$LINE ; (SONG_LINE[VOICE,1]<>' ')
LDA VOICE
MVI E,1
CALL COMP$SONG
MOV A,M
CPI SPACE ; THEN BEGIN
JNZ NDNP04
JMP NDNP05
NDNP02:
LDA SONG$LINE+1 ; (*CHECK FOR END*)
CPI 'd'
JZ NDNP04
CPI 'M' ; (*CHECK FOR MEASURE*)
JNZ NDNP03
MOVE M$SHARP,SHARP
MOVE M$FLAT,FLAT
NDNP03:
MVI A,TRUE
CALL SHOW$LINE
JMP NDNP01
NDNP04:
LXI D,NDNPL1 ; ERROR(NDNPL1);
CALL ERROR
MOVI MODE,SPACE ; MODE := SPACE;
MVI A,TRUE ; SHOW_PAGE(TRUE);
CALL SHOW$PAGE
MOVE M$SHARP,SHARP ; M_SHARP:=SHARP;
MOVE M$FLAT,FLAT ; M_FLAT:=FLAT;
POP H ; EXIT (INSERT_MODE)
RET ; END
NDNP05:
DMVI I,0 ; FOR I := 0 TO 2 DO
NDNP06:
LXI H,SEED$LINE ; SONG_LINE[VOICE,I]:=
LDA I
MOV E,A
LDA VOICE
CALL COMP$SONG
MOV A,M
STA X1 ; SEED_LINE[VOICE,I];
LXI H,SONG$LINE
LDA I
MOV E,A
LDA VOICE
CALL COMP$SONG
LDA X1
MOV M,A
NXTI NDNP06,I,2 ; (*END OF FOR*)
MOVI ATTR,0 ; ATTR := 0;
CALL PUT$LINE ; PUT_LINE;
MVI A,TRUE ; SHOW_LINE(TRUE)
CALL SHOW$LINE
RET ; END
NDNPL1: DB 7,'Must quit Insert_mode. ','$'
NS$RITE$PROC:
MOVI ATTR,0 ; ATTR := 0;
MCP VOICE,HI$VOICE ; IF VOICE = HI_VOICE THEN
JNZ NRTP01
MOVI VOICE,0 ; VOICE := 0
RET
NRTP01: ; ELSE
MINC VOICE ; VOICE := VOICE + 1
RET ; END
NS$SPC$PROC:
CALL NEXT$ATTR ; NEXT_ATTR
RET ; END
NS$QUIT$PROC:
MOVI MODE,SPACE ; MODE:=SPACE;
MVI A,TRUE ; SHOW_PAGE(TRUE);
CALL SHOW$PAGE
MOVE M$SHARP,SHARP ; M_SHARP:=SHARP;
MOVE M$FLAT,FLAT ; M_FLAT:=FLAT;
POP H ; EXIT(INSERT_MODE)
RET ; END
; EXCISE MODE PROCEDURES
EXCISE$MODE:
DCP CURR,HEAD ; IF (CURR<>HEAD)
JZ EXMD08
DCP CURR,TAIL ; AND (CURR<>TAIL)
JZ EXMD08 ; THEN BEGIN
MOVI MODE,'X' ; MODE:='X';
MOVE SAVE$DIR,DIRECTION ; SAVE_DIR:=DIRECTION;
MOVE SAVE$VOICE,VOICE ; SAVE_VOICE := VOICE;
MOVE SAVE$ATTR,ATTR ; SAVE_ATTR := ATTR;
MOVI VOICE,-1 ; VOICE := -1;
CALL LEGEND ; LEGEND;
DMOV DELIN,LINE ; DELIN:=LINE;
EXMD01: ; REPEAT
CALL SHOW$CURSOR ; SHOW_CURSOR;
GTCH CH ; GET_CHAR(CH);
MCP CH,DOWN$ARROW ; IF (CH = DOWN_ARROW) OR
JZ EXMD02
MCP CH,RETURN ; (CH = RETURN) THEN BEGIN
JNZ EXMD04
EXMD02:
MOVI DIRECTION,DOWN ; DIRECTION:=DOWN;
DCP CURR,TAIL ; IF CURR<>TAIL
JZ EXMD01 ; AND
DCP CURR,HEAD ; CURR<>HEAD
CNZ MARK ; THEN MARK;
CALL NEXT$LINE ; NEXT_LINE
JMP EXMD01 ; END
EXMD04: ; ELSE
MCP CH,UP$ARROW ; IF CH = UP_ARROW THEN BEGIN
JNZ EXMD06
MOVI DIRECTION,UP ; DIRECTION:=UP;
CALL LAST$LINE ; LAST_LINE;
DCP CURR,HEAD ; IF CURR<>HEAD
JZ EXMD01 ; AND
DCP CURR,TAIL ; CURR<>TAIL
JZ EXMD01 ; THEN
CALL MARK ; MARK
JMP EXMD01 ; END
EXMD06: ; ELSE
MCP CH,QUIT ; IF CH <> QUIT THEN
JZ EXMD07
LXI D,EXMDL1 ; ERROR(EXMDL1);
CALL ERROR
CALL LEGEND ; LEGEND
JMP EXMD01 ; UNTIL CH=QUIT;
EXMD07:
CALL DELET
MOVE VOICE,SAVE$VOICE ; VOICE:=SAVE_VOICE;
MOVE ATTR,SAVE$ATTR ; ATTR:=SAVE_ATTR;
MOVE DIRECTION,SAVE$DIR ; DIRECTION:=SAVE$DIR;
MOVI MODE,SPACE ; MODE:=SPACE;
MVI A,TRUE ; SHOW_PAGE(TRUE)
CALL SHOW$PAGE
RET ; END
EXMD08:
LXI D,EXMDL2 ; ERROR(EXMDL2);
CALL ERROR
MVI A,TRUE ; SHOW$PAGE(TRUE)
CALL SHOW$PAGE
RET ; END
EXMDL1: DB 7,'Input not <up>, <down> or <esc>. ','$'
EXMDL2: DB 7,'Cannot excise terminal lines. ','$'
MARK:
DCP DELIN,LINE
JP MARK01
DMOV DELIN,LINE
MARK01:
CALL GET$LINE
LDA SONG$LINE
XRI 80H
STA SONG$LINE
CALL PUT$LINE
MVI A,FALSE
CALL SHOW$PAGE
RET
DELET:
MOVI DIRECTION,DOWN
MOVI DELX1,FALSE
CALL HEAD$SONG
DEL01:
MCPI DELX1,TRUE
RZ
CALL NEXT$LINE
DEL02:
DCP DELIN,LINE
RM
MCPI EOS,TRUE
RZ
CALL GET$LINE
LDA SONG$LINE
ANI 80H
JZ DEL01
MOVI DELX1,TRUE
CALL DLET$LINE
JMP DEL02
DELX1: DB 0
DELIN: DW 0