; AUTOBOOT.ASM ; ; INSTALL OR REMOVE AUTO BOOT SEQUENCE 3/4/80 ; ; WRITTEN BY JOHN MOORHEAD ; ; THIS PROGRAM WILL INSTALL OR REMOVE AN AUTO BOOT ; MESSAGE OR COMMAND FILE NAME. THIS MODIFICATION ; IS PERMANANTLY STORED ON THE CURRENTLY LOGGED DISK. ; ; THIS PROGRAM WORKS WITH BOTH CP/M VERSIONS 1.4 AND 2.X. ; IT LOADS THE FIRST 128 BYTES OF THE CP/M CCP MODULE ; INTO RAM AT 80 HEX. THIS IS ASSUMED TO BE ON TRACK ; 0, LOGICAL SECTOR 1. IF THE USER TYPES 'I' TO ; INSTALL THE AUTO BOOT FILE NAME OR COMMAND, THE PROGRAM ; WILL PROMPT THE USER FOR SAID ITEM. THE PROGRAM WILL ; INSERT THAT TEXT STRING INTO THE CCP CONSOLE BUFFER ; ALONG WITH THE LENGTH. IT THEN WRITES THIS MODIFIED ; SECTOR OF THE CCP BACK TO THE DISK. 'REMOVE' WORKS ; THE SAME WAY, EXCEPT THAT IT SETS THE LENGTH OF THE ; INPUT BUFFER STRING TO 0 AT HEX 87, AND WRITES 16 ; HEX 20'S STARTING AT 88 HEX. THIS IS THEN RE-WRITTEN ; OUT TO THE DISK. ; ; WHEN CP/M WARM BOOTS IT CHECKS THE CONSOLE BUFFER TO ; SEE IF IT HAS ANYTHING IN IT. IF IT DOES, CP/M READS ; IT AND PERFORMS THE FUNCTION. ; ; MODIFICATION LOG ; ; 5/21/84 LRB ; ; MODIFIED PROGRAM TO ACCESS LOGICAL SECTOR 1. ; ALSO, THE PROGRAM SETS THE TRACK AND SECTOR ; JUST BEFORE THE WRITE IN THE INSTALL ; AND REMOVE ROUTINES. SEEMS TO WORK WITH AND NOT ; WITHOUT THIS CODE. ; ; BDOS EQU 5 CR EQU 0DH ;ASCII CARRIAGE RETURN ORG 100H JMP START ;THE CBIOS JUMP TABLE IS MOVED HERE BOOT: DS 3 WBOOT: DS 3 CONST: DS 3 CONIN: DS 3 CONOUT: DS 3 LIST: DS 3 PUNCH: DS 3 READER: DS 3 HOME: DS 3 SELDSK: DS 3 SETTRK: DS 3 SETSEC: DS 3 SETDMA: DS 3 READ: DS 3 WRITE: DS 3 LISTST: DS 3 ;ABOVE 15 FOR CP/M 1.4; LAST 2 FOR SECTRAN:DS 3 ;CP/M 2.X COMPATIBILITY. START: LXI SP,STACK LHLD 1 ;GET WARM BOOT ADDRESS DCX H DCX H DCX H LXI D,BOOT ;DESTINATION ADDRESS MVI B,17*3 ;NUMBER OF BYTES TO MOVE CALL MOVE ;MOVE THE CBIOS JUMP TABLE LXI B,80H CALL SETDMA ;SET DMA ADDRESS TO 80H MVI C,0 CALL SETTRK ;SET TRACK TO 0 MVI C,1 CALL SETSEC ;SET SECTOR TO 1 CALL READ ;READ IN FIRST SECTOR OF CPM QQ: CALL CRLF CALL PRINT DB 'INSTALL OR REMOVE AUTO BOOT SEQUENCE ON',CR CALL PRINT DB 'CURRENTLY LOGGED DISK? (I OR R)',CR CALL CRLF CALL PRINT DB 'NOTE - IT IS IMPOSSIBLE TO INSTALL A',CR CALL PRINT DB 'SUBMIT COMMAND, AS THE SUBMIT PROGRAM',CR CALL PRINT DB 'WILL LOOK AT THE BUFFER AND RE-SUBMIT',CR CALL PRINT DB 'ITSELF AD-INFINITUM...',CR CALL CRLF CALL INPUT ;GET REPLY CPI 'I' JZ INSTALL CPI 'R' JZ REMOVE JMP QQ ;CONSOLE INPUT ROUTINE INPUT: PUSH H PUSH D PUSH B MVI C,1 ;GET CONSOLE INPUT CALL 5 CPI 60H JC IN1 SUI 20H ;CONVERT TO UPPER CASE IN1: POP B POP D POP H RET CRLF: CALL PRINT DB CR RET ;PRINTS ASCII STRINGS POINTED TO BY TOP OF STACK ;TO CONSOLE. PRINT: XTHL ;GET STRING POINTER PUSH PSW PUSH B PO1: MOV A,M INX H CPI '@' ;NO CR IF @ IS END OF STRING JZ NOCR CALL COUT CPI CR ;CARRIAGE RET? JZ THEEND JMP PO1 THEEND: CALL PRINT DB 0AH,'@' NOCR: POP B POP PSW XTHL RET ;CONSOLE OUTPUT ROUTINE COUT: PUSH PSW PUSH B PUSH D PUSH H MOV E,A MVI C,2 ;WRITE CONSOLE CALL 5 POP H POP D POP B POP PSW RET ;GENERAL PURPOSE MEMORY TO MEMORY BLOCK MOVE ROUTINE ;HL POINT TO THE SOURCE, DE POINT TO THE DESTINATION ;THE B REGISTER HAS THE COUNT. MOVE: MOV A,M STAX D INX H INX D DCR B JNZ MOVE RET ;THIS ROUTINE GETS THE TEXT STRING FOR THE AUTO BOOT ;SEQUENCE AND THEN MOVES IT INTO THE CCP CONSOLE BUFFER. INSTALL: CALL CRLF CALL CRLF CALL PRINT DB 'ENTER COMMAND STRING YOU WISH TO AUTO EXECUTE' DB CR CALL PRINT DB 'EXACTLY AS DESIRED - NO BACKSPACES ALLOWED!' DB CR CALL CRLF LXI H,INSTL ;LOCATION OF ENTERED STRING MVI B,0 ;COUNT FOR MOVE ROUTINE INST1: CALL INPUT CPI CR JZ INST2 MOV M,A INX H INR B JMP INST1 ;DIDN'T TYPE CR YET, SO GET MORE STUFF INST2: MVI M,0 ;WAS A CR, SO LAST BYTE IS A 00 INR B MOV A,B STA 87H ;INDICATE LENGTH OF STRING LXI D,88H LXI H,INSTL ;MOVE TYPED TEXT STRING TO 88H CALL MOVE MVI C,0 CALL SETTRK MVI C,1 CALL SETSEC CALL WRITE ;WRITE SECTOR TO DISK CALL CRLF CALL CRLF CALL PRINT DB 'CP/M AUTO BOOT SEQUENCE INSTALLED',CR JMP 0 ;THIS ROUTINE CLEARS THE CCP CONSOLE BUFFER REMOVE: LXI H,REMV LXI D,87H MVI B,11H CALL MOVE MVI C,0 CALL SETTRK MVI C,1 CALL SETSEC CALL WRITE CALL CRLF CALL CRLF CALL PRINT DB 'CP/M AUTO BOOT SEQUENCE REMOVED',CR JMP 0 ;THESE ARE THE STRINGS WHICH ARE PUT IN TH ;CCP CONSOLE BUFFER INSTL: DS 16 REMV: DB 0,' ' DS 256 STACK: END 100H