; TITLE '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 TO/FROM THE USER
;       INPUT BUFFER AT LOCATION 80 HEX.  THIS MODIFICATION
;       IS PERMANANTLY STORED ON THE CURRENTLY LOGGED DISK.
;
;NAME:  AUTOBOOT.ASM
;
;       THIS PROGRAM WORKS WITH BOTH CP/M VERSIONS 1.4 AND 2.0.
;       IT LOADS THE FIRST 128 BYTES OF THE CP/M CCP MODULE
;       INTO RAM AT 80 HEX.  THIS IS ASSUMED TO BE ON TRACK
;       ZERO, SECTOR 2.  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
;       ZERO AT HEX 987, AND WRITES 16 HEX 20'S (ASCII SPACE)
;       STARTING AT 988 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.


       ORG 100H
BDOS    EQU     5

CR      EQU     0DH     ;ASCII CARRIAGE RETURN


       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.0 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,2
       CALL    SETSEC  ;SET SECTOR TO 2
       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,0,0,0,0,'@'
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',CR
       CALL    PRINT
       DB      ' EXACTLY AS DESIRED - NO BACKSPACES ALLOWED!',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
       CALL    WRITE   ;WRITE SECTOR TO DISK
       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
       CALL    WRITE
       CALL    CRLF
       CALL    PRINT
       DB      ' CP/M AUTO BOOT SEQUENCE REMOVED',CR
       JMP     0

;THESE ARE THE STRINGS WHICH ARE PUT IN THE
;CCP CONSOLE BUFFER

INSTL:  DS      16

REMV:   DB      0,'                '




       DS      256
STACK:


       END     100H