home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
ccp
/
autoboot.lbr
/
AUTOBOOT.AZM
/
AUTOBOOT.ASM
Wrap
Assembly Source File
|
1987-03-07
|
5KB
|
237 lines
; 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