Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 68K/1.2 SOURCE/15/EDS.SA
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

411 lines
11 KiB
Plaintext

/*SPLH*/ /*$TITLE='CP/M-86 2.0 --- ED' */
ED:
DO;
/* MODIFIED FOR .PRL OPERATION MAY, 1979 */
/* MODIFIED FOR OPERATION WITH CP/M 2.0 AUGUST 1979 */
/* MODIFIED FOR MP/M 2.0 JUNE 1981 */
/* MODIFIED FOR CP/M 1.1 OCT 1981 */
/* MODIFIED FOR CP/M-68K JULY 1982 BY H.CHAKI */
DECLARE
MPMPRODUCT LITERALLY '01H', /* REQUIRES MP/M */
CPM3 LITERALLY '30H'; /* REQUIRES 3.0 CP/M */
/* DECLARE 8080 INTERFACE
JMP EDCOMMAND - 3 (TO ADDRESS LXI SP)
EDJMP BYTE DATA(0C3H),
EDADR ADDRESS DATA(.EDCOMMAND-3); */
/**************************************
* *
* B D O S INTERFACE *
* *
**************************************/
MON1:
PROCEDURE (FUNC,INFO) EXTERNAL;
DECLARE FUNC BYTE;
DECLARE INFO ADDRESS;
END MON1;
MON2:
PROCEDURE (FUNC,INFO) BYTE EXTERNAL;
DECLARE FUNC BYTE;
DECLARE INFO ADDRESS;
END MON2;
MON3:
PROCEDURE (FUNC,INFO) ADDRESS EXTERNAL;
DECLARE FUNC BYTE;
DECLARE INFO ADDRESS;
END MON3;
MON5 : PROC(FN,IN) EXT ;
DCL FN BYTE;
DCL IN POINTER ;
END;
MON6 : PROC(FN,IN) BYTE EXT ;
DCL FN BYTE;
DCL IN POINTER ;
END ;
MON7 : PROC(FN,IN) ADDR EXT;
DCL FN BYTE ;
DCL IN POINTER;
END ;
/* DECLARE CMDRV BYTE EXTERNAL; /* COMMAND DRIVE */
DECLARE FCB (128) BYTE EXTERNAL; /* 1ST DEFAULT FCB */
DECLARE FCB16 (128) BYTE EXTERNAL; /* 2ND DEFAULT FCB */
/* DECLARE PASS0 ADDRESS EXTERNAL; /* 1ST PASSWORD PTR */
/* DECLARE LEN0 BYTE EXTERNAL; /* 1ST PASSWD LENGTH */
/* DECLARE PASS1 ADDRESS EXTERNAL; /* 2ND PASSWORD PTR */
/* DECLARE LEN1 BYTE EXTERNAL; /* 2ND PASSWD LENGTH */
DECLARE TBUFF (128) BYTE EXTERNAL; /* DEFAULT DMA BUFFER */
DECLARE
/* BDISK BYTE EXTERNAL, /* BOOT DISK 0004H */
MAXB ADDRESS EXTERNAL, /* MAX BASE 0006H */
BUFF (128)BYTE EXTERNAL, /* BUFFER 0080H */
SECTSHF LITERALLY '7', /* SHL(1,SECTSHF) = SECTSIZE */
SECTSIZE LITERALLY '80H'; /* SECTOR SIZE */
/* 68K */ DCL DUM1P POINTER,DUM1L LONG AT(@DUM1P);
/* 68K */ DCL DUM2P POINTER,DUM2L LONG AT(@DUM2P);
BOOT: PROCEDURE PUBLIC;
CALL MON1(0,0); /* CHANGED FOR MP/M-86 VERSION */
/* SYSTEM REBOOT */
END BOOT;
/*SPLH*/ /*$EJECT */
/* E D : T H E C P / M C O N T E X T E D I T O R */
/* COPYRIGHT (C) 1976, 1977, 1978, 1979, 1980, 1981
DIGITAL RESEARCH
BOX 579 PACIFIC GROVE
CALIFORNIA 93950
REVISED:
07 APRIL 81 BY THOMAS ROLANDER
21 JULY 81 BY DOUG HUSKEY
29 OCT 81 BY DOUG HUSKEY
10 NOV 81 BY DOUG HUSKEY
31 JULY 81 BY H.CHAKI
*/
/*SPLH*/ /*$EJECT */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * GLOBAL VARIABLES * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
DECLARE /* LIT LITERALLY 'LITERALLY',
DCL LIT 'DECLARE',
PROC LIT 'PROCEDURE',
ADDR LIT 'ADDRESS', */
CTLL LIT '0CH',
CTLR LIT '12H', /* REPEAT LINE IN INSERT MODE */
CTLU LIT '15H', /* LINE DELETE IN INSERT MODE */
CTLX LIT '18H', /* EQUIVALENT TO CTLU */
CTLH LIT '08H', /* BACKSPACE */
TAB LIT '09H', /* TAB CHARACTER */
LCA LIT '110$0001B', /* LOWER CASE A */
LCZ LIT '111$1010B', /* LOWER CASE Z */
ESC LIT '1BH', /* ESCAPE CHARACTER */
ENDFILE LIT '1AH'; /* CP/M END OF FILE */
DECLARE
TRUE LITERALLY '1',
FALSE LITERALLY '0',
FOREVER LITERALLY 'WHILE TRUE',
CTRL$C LITERALLY '3',
CR LITERALLY '13',
LF LITERALLY '10',
WHAT LITERALLY '63';
DECLARE
US LITERALLY '8', /* FILE FROM USER 0 */
RO LITERALLY '9', /* R/O FILE INDICATOR */
SY LITERALLY '10', /* SYSTEM FILE ATTRIBUTE */
EX LITERALLY '12', /* EXTENT NUMBER POSITION */
UB LITERALLY '13', /* UNFILLED BYTES */
CK LITERALLY '13', /* CHECKSUM */
MD LITERALLY '14', /* MODULE NUMBER POSITION */
NR LITERALLY '32', /* NEXT RECORD FIELD */
FS LITERALLY '33', /* FCB SIZE */
XFERON BYTE EXT INIT, /* TRUE IF XFER ACTIVE */
PASSWORD (16) BYTE EXT INIT; /* SOURCE PASSWORD */
DECLARE
LIBFCB (12) BYTE EXT DATA ;/* DEFAULT LIB NAME */
DECLARE
PRINTSUPPR BYTE EXT INIT; /* TRUE IF PRINT SUPPRESSED */
DECLARE
COLUMN BYTE EXT; /* CONSOLE COLUMN POSITION */
/* COMMAND BUFFER */
DCL DCNT BYTE EXT ;
DECLARE (MAXLEN,COMLEN) BYTE EXT, COMBUFF(128) BYTE EXT,
(TCBP,CBP) BYTE EXT ;
/* MP/M PARSE FUNCTION CALL */
DECLARE
PARSE$FN STRUCTURE(
BUFF$ADR POINTER,
FCB$ADR POINTER);
DECLARE
LPP LIT '23', /* LINES PER PAGE */
FORWARD LIT '1',
BACKWARD LIT '0',
RUBOUT LIT '07FH',
POUND LIT '23H',
MACSIZE LIT '128', /* MAX MACRO SIZE */
SCRSIZE LIT '100', /* SCRATCH BUFFER SIZE */
COMSIZE LIT 'ADDRESS'; /* DETERMINES MAX COMMAND NUMBER*/
DCL FLAG BYTE EXT;
DCL RESET LABEL EXT;
DECLARE
EOS LITERALLY '0FFH';
/*SPLH*/ /*$EJECT */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * CP/M INTERFACE ROUTINES * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* IO SECTION */
READCHAR: PROCEDURE BYTE PUBLIC; RETURN MON2(1,0);
END READCHAR;
CONIN:
PROCEDURE BYTE PUBLIC;
RETURN MON2(6,0FDH);
END CONIN;
PRINTCHAR: PROCEDURE(CHAR) PUBLIC;
DECLARE CHAR BYTE;
IF PRINTSUPPR THEN RETURN;
CALL MON1(2,CHAR);
END PRINTCHAR;
TTYCHAR: PROCEDURE(CHAR) PUBLIC;
DECLARE CHAR BYTE;
IF CHAR >= ' ' THEN COLUMN = COLUMN + 1;
IF CHAR = LF THEN COLUMN = 0;
CALL PRINTCHAR(CHAR);
END TTYCHAR;
BACKSPACE: PROCEDURE PUBLIC;
/* MOVE BACK ONE POSITION */
IF COLUMN = 0 THEN RETURN;
CALL TTYCHAR(CTLH); /* COLUMN = COLUMN - 1 */
CALL TTYCHAR(' ' ); /* COLUMN = COLUMN + 1 */
CALL TTYCHAR(CTLH); /* COLUMN = COLUMN - 1 */
COLUMN = COLUMN - 2;
END BACKSPACE;
PRINTABS: PROCEDURE(CHAR) PUBLIC ;
DECLARE (CHAR,I,J) BYTE;
I = CHAR = TAB AND 7 - (COLUMN AND 7);
IF CHAR = TAB THEN CHAR = ' ';
DO J = 0 TO I;
CALL TTYCHAR(CHAR);
END;
END PRINTABS;
GRAPHIC: PROCEDURE(C) BYTE PUBLIC;
DECLARE C BYTE;
/* RETURN TRUE IF GRAPHIC CHARACTER */
IF C >= ' ' THEN RETURN TRUE;
RETURN C = CR OR C = LF OR C = TAB;
END GRAPHIC;
PRINTC: PROCEDURE(C) PUBLIC;
DECLARE C BYTE;
IF NOT GRAPHIC(C) THEN
DO; CALL PRINTABS('^');
C = C + '@';
END;
CALL PRINTABS(C);
END PRINTC;
CRLF: PROCEDURE PUBLIC;
CALL PRINTC(CR); CALL PRINTC(LF);
END CRLF;
PRINTM: PROCEDURE(A) PUBLIC;
DECLARE A POINTER;
CALL MON5(9,A);
END PRINTM;
PRINT: PROCEDURE(A) PUBLIC;
DECLARE A POINTER;
CALL CRLF;
CALL PRINTM(A);
END PRINT;
READ: PROCEDURE(A) PUBLIC;
DECLARE A POINTER;
CALL MON5(10,A);
END READ;
/* USED FOR LIBRARY FILES */
OPEN: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
IF MON6(15,FCB) = 255 THEN DO;
FLAG = 'O';
GO TO RESET;
END;
END OPEN;
/* USED FOR MAIN SOURCE FILE */
OPEN$FILE: PROCEDURE(FCB) ADDRESS PUBLIC;
DECLARE FCB POINTER;
RETURN MON7(15,FCB);
END OPEN$FILE;
CLOSE: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
DCNT = MON6(16,FCB);
END CLOSE;
SEARCH: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
DCNT = MON6(17,FCB);
END SEARCH;
DELETE: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
DCNT = MON6(19,FCB);
END DELETE;
DISKREAD: PROCEDURE(FCB) BYTE PUBLIC ;
DECLARE FCB POINTER;
RETURN MON6(20,FCB);
END DISKREAD;
DISKWRITE: PROCEDURE(FCB) BYTE PUBLIC;
DECLARE FCB POINTER;
RETURN MON6(21,FCB);
END DISKWRITE;
MAKE: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
DCNT = MON6(22,FCB);
END MAKE;
RENAME: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
CALL MON5(23,FCB);
END RENAME;
READCOM: PROCEDURE PUBLIC;
MAXLEN = 128; CALL READ(@MAXLEN);
END READCOM;
BREAK$KEY: PROCEDURE BYTE PUBLIC;
IF MON2(11,0) THEN
DO; /* CLEAR CHAR */
IF MON2(1,0) = CTRL$C THEN
RETURN TRUE;
END;
RETURN FALSE;
END BREAK$KEY;
CSELECT: PROCEDURE BYTE PUBLIC;
/* RETURN CURRENT DRIVE NUMBER */
RETURN MON2(25,0);
END CSELECT;
SELECT: PROCEDURE(DISK) PUBLIC;
DECLARE DISK BYTE;
/* SET DRIVE NUMBER */
CALL MON1(14,DISK);
END SELECT;
SETDMA: PROCEDURE(A) PUBLIC;
DECLARE A POINTER;
/* SET DMA ADDRESS */
CALL MON5(26,A);
END SETDMA;
SET$ATTRIBU: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
CALL MON5(30,FCB);
END SET$ATTRIBU;
/* THIS ROUTINE IS INCLUDED SOLELY FOR
ENCONOMY OF SPACE OVER THE USE OF THE
EQUIVALENT (IN-LINE) CODE GENERATED BY
THE BUILT-IN FUNCTION */
MOVE: PROC(C,S,D) PUBLIC;
DCL (S,D) POINTER, C BYTE;
DCL A BASED DUM1P BYTE, B BASED DUM2P BYTE;
DUM1P=S;DUM2P=D;
DO WHILE (C:=C-1)<>255;
B=A; DUM1L=DUM1L+1;DUM2L=DUM2L+1;
END;
END MOVE;
WRITE$XFCB: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
CALL MOVE(8,@PASSWORD,@PASSWORD(8));
IF MON6(103,FCB)= 0FFH THEN
CALL PRINT(@('ERROR CREATING PASSWORD$'));
END WRITE$XFCB;
READ$XFCB: PROCEDURE(FCB) PUBLIC;
DECLARE FCB POINTER;
CALL MON5(102,FCB);
END READ$XFCB;
/* 0FF => RETURN BDOS ERRORS */
RETURN$ERRO:
PROCEDURE(MODE) PUBLIC;
DECLARE MODE BYTE;
CALL MON1 (45,MODE);
END RETURN$ERRO;
REBOOT: PROCEDURE PUBLIC;
IF XFERON THEN
CALL DELETE(@LIBFCB);
CALL BOOT;
END REBOOT;
VERSION: PROCEDURE ADDRESS PUBLIC;
/* RETURNS CURRENT CP/M VERSION # */
RETURN MON7(12,0);
END VERSION;
PARSE: PROCEDURE PUBLIC;
CALL MON5(152,@PARSE$FN);
END PARSE;
END;