;************************************************************************ ;* * ;* AUTO COMMAND INSERTION PROGRAM FOR THE MORROW DECISION 1 * ;* FEBRUARY 18,1984 BY RONALD E. JACOBS * ;* * ;* Inserts a command onto the system track of the selected disk. * ;* That command will be executed when the disk is cold booted or * ;* on warm boots or both as selected. * ;* * ;************************************************************************ BDOS EQU 0005h ;BDOS ENTRY POINT CR EQU 0Dh ;CARRIAGE RETURN. LF EQU 0Ah ;LINE FEED. BS EQU 08h ;BACK SPACE CCPLN EQU 8h ;LENGTH OF CCP IN PAGES BDOSLN EQU 0Eh ;LENGTH OF BDOS IN PAGES ORG 100h ;BASE OF TRANSIENT PROGRAM AREA ************************************************************************* * * * FILL IN THE BIOS JUMP TABLE (AT RUNTIME) * * * ************************************************************************* LHLD 1 ;WARM BOOT POINTER LXI D,3 DAD D SHLD CONST+1 DAD D SHLD CONIN+1 DAD D SHLD CONOUT+1 DAD D SHLD LIST+1 DAD D SHLD PUNCH+1 DAD D SHLD READER+1 DAD D SHLD HOME+1 DAD D SHLD SELDSK+1 DAD D SHLD SETTRK+1 DAD D SHLD SETSEC+1 DAD D SHLD SETDMA+1 DAD D SHLD READ+1 DAD D SHLD WRITE+1 DAD D SHLD LISTST+1 DAD D SHLD SECTRAN+1 MVI C,19h ;BDOS RETURN CURRENT DISK CALL BDOS STA ORGDSK ;SAVE THE ORIGINAL LOGGED DISK SIGNON: MVI C,09h ;BDOS PRINT STRING LXI D,INTRO ;PRINT SIGNON, EXPLANATION, AND 1st INSTRUCTION CALL BDOS DRIVE: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT MVI E,0FFh ;INDICATES THIS IS CONSOLE INPUT CALL BDOS CPI 0 ;0 RETURNED IF NO CHARACTER IS READY JZ DRIVE ;TRY AGAIN FOR A CHARACTER CPI 03h ;SEE IF ^C WAS TYPED AT CONSOLE JZ 0 ;WARM BOOT IF ^C WAS TYPED ANI 01011111b ;CONVERT LOWER TO UPPER CASE CPI 'Q' ;SEE IF Quit FROM CONSOLE AND WARM BOOT IF SO JZ 0 MOV E,A ;PUT LETTER OF DRIVE IN E FOR BDOS TO CRT LATER SUI 'A' ;'A' IS THE LOWEST ASCII VALUE PERMITTED ; (drive is now a digit) STA DISK ;DIGIT OF DRIVE TO PLACE AUTO COMMAND ON JC DRIVE ;IF LOWER ASCII CHARACTER THAN 'A' WAS ENTERED CPI 16d ;DRIVE DIGIT-16 MUST BE LESS THAN 0 JNC DRIVE ;IF HIGHER ASCII CHARACTER THAN 'P' WAS ENTERED CALL NEXTCR ;GO WAIT FOR A CARRIAGE RETURN OR A BACKSPACE JC DRIVE ;BACKSPACE TYPED; DO DRIVE SELECTION OVER AGAIN DRVSEL: LDA DISK ;DIGIT DENOTING DRIVE TO PLACE AUTO COMMAND ON MOV E,A ;PREPARE FOR BIOS CALL MVI C,0Eh ;BDOS SELECT DISK CALL BDOS CALCTR: MVI C,1Fh ;BDOS GET ADDRESS OF DISK PARAMETER BLOCK CALL BDOS ;RETURNS DISK PARAMETER BLOCK IN HL ************************************************************************* * * * THE FOLLOWING 11 LINES CHECK THE DISK PARAMETER SPT (SECTORS * * PER TRACK) TO SEE IF ITS 64 SECTORS PER TRACK. IF IT IS THE * * ASSUMPTION IS MADE THAT THIS IS A 1024 BYTE PER SECTOR DOUBLE * * DENSITY 8 INCH BOOT FLOPPY. IN THIS CASE WE CHANGE THE SPT * * VALUE THAT IS STORED IN HL TO BE 26 SECTORS PER TRACK BECAUSE * * TRACK 0 ON THIS KIND OF BOOT DISK ACTUALLY IS 128 BYTE SINGLE * * DENSITY SECTORS. (THAT WORKS OUT TO 26 SECTORS PER TRACK) * * * ************************************************************************* MOV A,M ;A CONTAINS LOW BYTE OF SECTORS PER TRACK CPI 64d ;64d SPT INDICATES THIS IS A 8 IN. DD FLOPPY MOV E,M ;E CONTAINS LOW BYTE OF SECTORS PER TRACK ALSO INX H ;POINT TO HIGH BYTE OF SECTORS PER TRACK JNZ NOT8IN ;IF NOT 64d SPT ASSUME OTHER THAN 8 FLOPPY MOV A,M ;A CONTAINS HIGH BYTE OF SECTORS PER TRACK CPI 00 ;IF 00 THEN 0064d SPT SO ASSUME 8" BOOT FLOPPY JNZ NOT8IN ;WE DIDN'T FIND 64d SPT SO NOT 8" BOOT FLOPPY MVI A,33d ;FOR TRACK 0 SECTOR 5 APPEARS AS SECTOR 33d STA READ5+1 ;CHANGE THE SECTOR NUMBR CALLED IN LATER SETSEC STA CCPWRT+1 ; " " " " " " " " MVI A,41d ;FOR TRACK 0 SECTOR 6 APPEARS AS SECTOR 41d STA READ6+1 ;CHANGE THE SECTOR NUMBR CALLED IN LATER SETSEC STA WRITE6+1 ; " " " " " " " " MVI H,00 ;ON 8" FLOPPY BOOT DISK TRACK 0 IS 26 SPT MVI L,26d JMP ABSSEC NOT8IN: MOV D,M ;DE NOW CONTAINS SECTORS PER TRACK (SPT) XCHG ;HL NOW CONTAINS SECTORS PER TRACK (SPT) ABSSEC: MVI A,49d ;DESIRED ABSOLUTE SECTOR CMA ;1s COMPLIMENT OF DESIRED SECTOR ADI 1 ;2s COMPLIMENT OF DESIRED SECTOR MOV E,A ;E CONTAINS 2s COMPLIMENT OF DESIRED SECTOR MVI D,0FFh ;TREAT SECTOR AS A 16 BIT NEGATIVE NUMBER DAD D ;SUBTRACT DESIRED SECTOR FROM SECTORS PER TRACK JC PASINR ;SECTOR IS ON TRACK 0 IF CARRYI MOV A,L ;NEGATIVE TRACK 1 SECTOR NUMBER CMA ;1s COMPLIMENT INR A ;2s COMPLIMENT SAVSEC: STA SECT49 ;STORE ADDRESS IS INCREMENTED LATER FOR 50, 51 MVI A,01 ;SECTOR IS ON TRACK 1 SAVTRK: STA TRAK49 ;STORE ADDRESS IS INCREMENTED LATER FOR 50, 51 PASINR: LDA PASS ;PASS=1 FOR SECTOR 49, 2 FOR 50, AND 3 FOR 51 CPI 3 ;HAS THE FINAL PASS BEEN COMPLETED? JZ READ49 ;GO READ THE SECTORS INTO THE DMA SPACE INR A ;PASS=PASS+1 STA PASS LHLD SAVTRK+1 ;STORAGE ADDRESS OF THIS SECTOR'S TRACK NUMBER INX H ;NEXT ADDRESS FOR NEXT SECTOR'S TRACK NUMBER INX H ;THIS WILL EITHER BE FOR SECTOR 50 OR FOR 51 SHLD SAVTRK+1 LHLD SAVSEC+1 ;STORAGE ADDRESS OF THIS SECTOR'S SECTOR NUMBER INX H ;NEXT ADDRESS FOR NEXT SECTORS SECTOR NUMBER INX H SHLD SAVSEC+1 LDA ABSSEC+1 ;ABSOLUTE SECTOR THAT JUST GOT CALCULATATED INR A ;NEXT ABSOLUTE SECTOR STA ABSSEC+1 ;NEXT ABSOLUTE SECTOR TO CALCULATE JMP CALCTR ;CALCULATE NEXT TRACK AND SECTOR FOR NEXT SECTR ********************************************** READ49: LHLD TRAK49 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS MOV B,H MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS CALL SETTRK ;BIOS SET TRACK LHLD SECT49 ;HL NOW HAS DESIRED SECTOR MOV B,H MOV C,L ;BC NOW HAS DESIRED SECTOR CALL SETSEC ;BIOS SET SECTOR LXI B,DMA ;SET DMA ADDRESS FOR DISK READS AND WRITES CALL SETDMA ;BIOS SET DMA CALL READ ;READ FIRST OF THE 3 SECTORS INTO THE DMA AREA ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** LHLD TRAK50 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS MOV B,H MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS CALL SETTRK ;BIOS SET TRACK LHLD SECT50 ;HL NOW HAS DESIRED SECTOR MOV B,H MOV C,L ;BC NOW HAS DESIRED SECTOR CALL SETSEC ;BIOS SET SECTOR LXI B,DMA+128d ;SET DMA ADDRESS FOR DISK READS AND WRITES CALL SETDMA ;BIOS SET DMA CALL READ ;READ SECOND OF THE 3 SECTORS INTO THE DMA AREA ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** LHLD TRAK51 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS MOV B,H MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS CALL SETTRK ;BIOS SET TRACK LHLD SECT51 ;HL NOW HAS DESIRED SECTOR MOV B,H MOV C,L ;BC NOW HAS DESIRED SECTOR CALL SETSEC ;BIOS SET SECTOR LXI B,DMA+256d ;SET DMA ADDRESS FOR DISK READS AND WRITES CALL SETDMA ;BIOS SET DMA CALL READ ;READ THIRD OF THE 3 SECTORS INTO THE DMA AREA ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** LXI H,DMA+100h+1 ;POINT TO CBIOS REVISION NUMBER MOV A,M ;GET CBIOS REVISION NUMBER IN A CPI 53d ;COMPARE WITH E.3 JZ CMDREV ;E.3 IS A VALID REVISION FOR AUTOD TO WORK WITH CPI 53d ;COMPARE WITH E.31(or patch space for future re JZ CMDREV ;E.31 IS OK REVISION FOR AUTOD TO WORK WITH CPI 54d ;COMPARE WITH E.4 JZ CMDREV ;E.4 IS A VALID REVISION FOR AUTOD TO WORK WITH CPI 54d ;PATCH SPACE FOR FUTURE REVISION NMBRS OF CBIOS JZ CMDREV ;VALID REVISION MVI C,09 ;BDOS PRINT STRING;NO VALID REVISION FOUND LXI D,BIOREV ;STRING WARNS AUTOD MIGHT'NT WORK WITH BIOS REV CALL BDOS CMDREV: LHLD DMA+100h+8 ;POINTER TO AUTO COMMAND REVISION BYTE MOV A,H ;H IS FIRST PAGE OF BIOS WHEN IT IS RUNNING STA BIOSPG ;SAVE FIRST PAGE FOR CALCULATING CCP BASE LATER MVI H,00h ;ZERO THE HIGH BYTE LXI B,DMA ;BEGINNING OF BUFFER IN THIS PROGRAM FOR DISK DAD B ;HL NOW POINTS TO REVISION BYTE IN DMA BUFFER ************************************************************************* * * * CHECK FOR AUTOCOMMAND REVISION STRUCTURE 0 (THE ONLY ONE IN * * EXISTANCE AT THE TIME OF THIS WRITTING). IF NOT REVISION * * 0 THEN PRINT WARNING MESSAGE. WARNING MESSAGE DOES NOT ABORT * * THE NORMAL OPERATION OF THIS PROGRAM. * * * ************************************************************************* MOV A,M ;AUTOD IS WRITTEN ONLY FOR AUTO COM. REV. 0 CPI 0 PUSH H CNZ REVERR ;PRINT REVISION ERROR MESSAGE ON CONSOLE POP H INX H INX H ;HL POINTS TO AUTO COMMAND FEATURE ENABLE FLAG PUSH H MVI C,09h ;BDOS PRINT STRING LXI D,WHNMSG ;ASK IF TO GIVE MESSAGE ON COLD OR WARM OR BOTH CALL BDOS POP H INWHEN: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT MVI E,0FFh ;INDICATES THIS IS CONSOLE INPUT PUSH H CALL BDOS POP H CPI 0 ;0 RETURNED IF NO CHARACTER IS READY JZ INWHEN ;TRY AGAIN FOR A CHARACTER CPI 'Q' ;SEE IF Quit FROM CONSOLE AND WARM BOOT IF SO JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT CPI 'q' ;SEE IF qUIT FROM CONSOLE AND WARM BOOT IF SO JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT CPI 03h ;SEE IF ^C WAS TYPED AT CONSOLE JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT MOV M,A ;STORE CHOICE OF COLD OR WARM OR BOTH BOOTING MOV E,A ;PREPARATION FOR BDOS DIRECT OUTPUT TO CONSOLE STA ENABLE ;SAVE CHOICE FOR LATER EXAMINATION ANI 1111$1100b ;STRIP LAST TWO BITS CPI 30h ;WAS CHARACTER A '0','1','2', or '3' ? JNZ INWHEN ;TRY AGAIN FOR A VALID CHARACTER PUSH H CALL NEXTCR ;GET NEXT CHARACTER; MUST BE BACKSPACE OR CR POP H JC INWHEN ;A BACKSPACE WAS TYPED; DO SELECTION OVER INX H ;HL POINTS TO POINTER TO cold START COMMAND MVI A,07h ;LOW BYTE OF ADDRESS OF CCP+7 MOV M,A ;STORE IT IN POINTER LOW BYTE INX H LDA BIOSPG ;FIRST PAGE OF BIOS WHEN EXECUTING SUI CCPLN+BDOSLN ;A IS NOW HIGH BYTE OF CCP+7 MOV M,A ;STORE IT IN POINTER HIGH BYTE INX H ;HL POINTS TO POINTER TO warm START COMMAND MVI A,07h+64d ;LOW BYTE OF ADDRESS OF CCP+7+64 MOV M,A ;STORE IT IN POINTER LOW BYTE INX H LDA BIOSPG ;FIRST PAGE OF BIOS WHEN EXECUTING SUI CCPLN+BDOSLN ;A IS NOW HIGH BYTE OF CCP+7 MOV M,A ;STORE IT IN POINTER HIGH BYTE ********************************************** LHLD TRAK49 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS MOV B,H MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS CALL SETTRK ;BIOS SET TRACK LHLD SECT49 ;HL NOW HAS DESIRED SECTOR MOV B,H MOV C,L ;BC NOW HAS DESIRED SECTOR CALL SETSEC ;BIOS SET SECTOR LXI B,DMA ;SET DMA ADDRESS FOR DISK READS AND WRITES CALL SETDMA ;BIOS SET DMA MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA CALL WRITE ;WRITE FIRST OF THE 3 SECTORS ONTO THE DISK ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** LHLD TRAK50 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS MOV B,H MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS CALL SETTRK ;BIOS SET TRACK LHLD SECT50 ;HL NOW HAS DESIRED SECTOR MOV B,H MOV C,L ;BC NOW HAS DESIRED SECTOR CALL SETSEC ;BIOS SET SECTOR LXI B,DMA+128d ;SET DMA ADDRESS FOR DISK READS AND WRITES CALL SETDMA ;BIOS SET DMA MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA CALL WRITE ;WRITE SECOND OF THE 3 SECTORS ONTO THE DISK ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ***************************************************** LHLD TRAK51 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS MOV B,H MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS CALL SETTRK ;BIOS SET TRACK LHLD SECT51 ;HL NOW HAS DESIRED SECTOR MOV B,H MOV C,L ;BC NOW HAS DESIRED SECTOR CALL SETSEC ;BIOS SET SECTOR LXI B,DMA+256d ;SET DMA ADDRESS FOR DISK READS AND WRITES CALL SETDMA ;BIOS SET DMA MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA CALL WRITE ;WRITE THIRD OF THE 3 SECTORS ONTO THE DISK ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ***************************************************** LXI B,0000h ;READ THE CCP FROM TRACK 0 CALL SETTRK ;BIOS SET TRACK READ5: LXI B,0005h ;SECTOR OF DISK STARTING AT CCP+0 CALL SETSEC ;BIOS SET SECTOR LXI B,DMA ;STORAGE IN THIS PROGRAM FOR DISK SECTORS CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES CALL READ ;READ TRACK 0 LOGICAL SECTOR 5 INTO DMA AREA ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT READ6: LXI B,0006h ;SECTOR OF DISK STARTING AT CCP+128 CALL SETSEC ;BIOS SET SECTOR LXI B,DMA+128d ;STORAGE IN THIS PROGRAM FOR DISK SECTORS CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES CALL READ ;READ TRACK 0 LOGICAL SECTOR 6 INTO DMA AREA ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ;************************************************************************ ;* * ;* NOTES ON WHAT IS HAPPENING IN THE FOLLOWING SITUATION: * ;* THE LOGIC WORKS THIS WAY: IF NEVER GIVE COMMAND WAS * ;* CHOSEN (CHOICE 0) THEN IT ISN'T NECESSARY TO ASK FOR A COMMAND * ;* SO RESTORE OLD DMA ADDRESS AND DRIVE AND EXIT. * ;* IF 0 WASN'T CHOSEN THEN IT MUST HAVE BEEN 1, 2, OR 3. * ;* THIS MEANS COLD BOOTING OR WARM BOOTING OR BOTH. IN THE * ;* FOLLOWING LOGIC WE FIRST LOAD THE COLD BOOT COMMAND IF THE * ;* SELECTION WAS 1 OR 3. WE THEN EXIT IF IT WAS A 1 OR LOAD THE * ;* WARM BOOT COMMAND IF IT WAS A 3. IF IT WAS A 2 WE JUST LOAD * ;* THE WARM BOOT COMMAND. IN ANY CASE, ONCE A WARM BOOT COMMAND * ;* HAS BEEN LOADED WE MUST HAVE COMPLETED ALL POSSIBLE * ;* COMBINATIONS SO THEN WE EXIT. * ;* * ;************************************************************************ LDA ENABLE ;SELECTION MADE EARLIER (0,1,2,or 3) CPI '0' ;SEE IF CHOSE NEVER TO GIVE COMMAND (CHOICE 0) JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT CPI '2' ;SEE IF CHOSE TO GIVE WARM BOOT COMMANDS ONLY JZ WARM ;REQUEST FOR WARM BOOT COMMAND MVI C,09 ;BDOS PRINT STRING FUNCTION LXI D,CMDCLD ;PRINT REQUEST FOR COLD COMMAND LINE ON CONSOLE CALL BDOS LXI H,DMA+8 ; FIRST BYTE OF AUTO COMMAND IN CCP MVI A,'C' ;SET COLD-WARM FLAG TO SHOW THIS PASS IS COLD STA CLDWRM ;(THE COLD PASS IS ALWAYS FIRST AND MAY BE ONLY JMP CMDBGN ;INITIALIZE COUNTER AND ACCEPT COMMAND INPUT WARM: MVI C,09 ;BDOS PRINT STRING FUNCTION LXI D,CMDWRM ;PRINT REQUEST FOR WARM COMMAND LINE ON CONSOLE CALL BDOS MVI A,'W' ;SET COLD-WARM FLAG TO SHOW THIS PASS IS WARM STA CLDWRM ;(THE WARM PASS IS THE LAST IN ALL CASES) LXI H,DMA+72 ;64 BYTE WARM COMMNAND SPACE FOLLOWING CCP+8+64 CMDBGN: MVI D,1 ;COUNTER FOR NUMBER OF CHARS IN COMMAND+NULL CONIO: MVI E,0FFh ;TO REQUEST INPUT CHARACTER FROM THE CONSOLE MVI C,06h PUSH D PUSH H CALL BDOS ;BDOS DIRECT CONSOLE I/O POP H POP D CPI 0 ;RETURNS CHAR IN REGISTER A OR 0 IF NONE READY JZ CONIO ;IF NO CHARACTER WAS READY TRY AGAIN CPI BS ;ASCII BACKSPACE JNZ CANCEL ;IF NOT A BACKSPACE, CHECK IF ^X CALL BKSPCE ;THIS IS A BACKSPACE, GO DO ONE JMP CONIO ;GO GET THE NEXT CHARACTER FROM THE CONSOLE CANCEL: CPI 18h ;ASCII CANCEL (^X) JNZ CRCHEK ;IF NOT ^X, CHECK IF CARRIAGE RETURN BKAGAN: CALL BKSPCE ;BACKSPACE 1 CHARACTER MOV A,D CPI 1 ;HAVE WE BACKED THROUGH ALL CHARACTERS YET? JZ CONIO ;IF DONE GO GET NEXT CHARACTER FROM CONSOLE JMP BKAGAN ;DO ANOTHER BACKSPACE CRCHEK: CPI 0Dh ;ASCII CARRIAGE RETURN JZ ENDINP ;IF ALL OF AUTO COMMAND HAS BEEN ENTERED CPI 20 ;HIGHEST NONPRINTING ASCII CHARACTER + 1 JC CONIO ;DON'T RECORD NONPRINTING CHARACTERS CPI 7Fh ;ASCII DELETE JZ CONIO ;DON'T ALLOW DELETES CPI 'a' ;LOWEST ASCII LOWER CASE VALUE CHARACTER JC PNTCHR ;RECORD+PRINT THE CHARACTER SANS MODIFICATION CPI '{' ;HIGHEST ASCII LOWER CASE VALUE + 1 JNC PNTCHR ;CHARACTER MUST BE HIGHER THAN 'z' ANI 1011111b ;CONVERT lower TO UPPER CASE PNTCHR: INR D ;INCREMENT COUNT OF CHARACTERS MOV M,A ;STORE CHARACTER IN CCP AUTO COMMAND INX H ;NEXT ADDR TO STORE CHARACTER IN CCP AUTO COMND PUSH H PUSH D MVI C,02h MOV E,A ;CHARACTER TO SEND TO CONSOLE CALL BDOS ;BDOS CONSOLE OUTPUT (1 CHARACTER AT A TIME) POP D POP H MOV A,D ;COUNT OF CHARACTERS CPI 62d ;MAXIMUM NUMBER OF CHARACTERS JNZ CONIO ;IF MAX NUM CHARS NOT EXCEEDED GO GET NEXT CHAR PUSH H PUSH D MVI C,09h ;BDOS PRINT STRING LXI D,TOLONG ;MESSAGE THAT COMMAND LENGTH IS TOO LONG CALL BDOS POP D POP H ENDINP: PUSH H PUSH D MVI C,09 ;BDOS PRINT STRING LXI D,WAITMS ;WAIT MESSAGE STRING CALL BDOS POP D POP H MVI A,00h ;ASCII NULL TO END AUTO COMMAND STRING WITH MOV M,A ;STORE NULL AT END OF AUTO COMMAND STRING LDA CLDWRM ;WAS THIS PASS A COLD OR A WARM COMMAND? CPI 'C' ;IF 'C' THEN COLD MOV A,D ;COUNT OF CHARACTERS JNZ ENDWRM ;IF NOT COLD THEN IT WAS WARM STA DMA+7 ;STORE COUNT IN CCP+7(START OF COLD CMD STRING) LDA ENABLE ;ELECTION MADE EARLIER FOR COLD, WARM OR BOTH CPI '1' ;IF 1 WAS FOR COLD ONLY JZ CCPWRT ;SO WRITE SECTORS TO DISK AND FINISH UP JMP WARM ;MUST HAVE BEEN A 3 SO GO GET WARM COMMAND ENDWRM: STA DMA+71 ;STORE COUNT IN CCP+71(START OF WARM CMD STRING CCPWRT: LXI B,5d ;SECTOR OF DISK TO WRITE TO CALL SETSEC ;BIOS SET SECTOR LXI B,DMA ;STORAGE IN THIS PROGRAM FOR DISK SECTORS CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA CALL WRITE ;BIOS WRITE SECTOR(REPLACE MODIFIED CCP TO DISK ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT WRITE6: LXI B,6d ;SECTOR OF DISK TO WRITE TO CALL SETSEC ;BIOS SET SECTOR LXI B,DMA+128d ;STORAGE IN THIS PROGRAM FOR DISK SECTORS CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA CALL WRITE ;BIOS WRITE SECTOR(REPLACE MODIFIED CCP TO DISK ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ;********************************************** ;*THE PURPOSE OF THE FOLLOWING READ IS TO FORCE FLUSHING THE BUFFER TO THE DISK ;********************************************** LXI B,00 ;SET TO READ SECTOR 0 CALL SETSEC ;BIOS SET SECTOR LXI B,DMA ;SET DMA ADDRESS FOR FIRST SECTOR CALL SETDMA ;BIOS SET DMA CALL READ ;READ A SECTOR OF THE DISK INTO THE DMA AREA ********************************************** RESTOR: LDA ORGDSK ;DRIVE SELECTED BEFORE THIS PROGRAM STARTED MOV E,A ;RESTORE ORIGINAL DRIVE SELECTION MVI C,0Eh ;BDOS SELECT DISK CALL BDOS LXI B,0080h ;RESTORE DEFAULT DMA ADDRESS CALL SETDMA ;BIOS SET DMA JMP 0 ;SUCCESSFUL COMPLETION OF PROGRAM;NOW WARM BOOT ************************************************************************* * * * ERROR MESSAGE PRINTED WHEN THE AUTO COMMAND REVISION STRUCTURE * * IS NOT 0. 0 IS THE ONLY REVISION STRUCTURE THAT EXISTED * * WHEN THIS PROGRAM WAS WRITTEN. * * * ************************************************************************* REVERR: MVI C,09h ;BDOS PRINT STRING FUNCTION LXI D,REVMSG ;ERROR MESSAGE STRING ADDRESS CALL BDOS RET REVMSG: DB 20h,20h,20h,20h,CR DB 'WARNING: AUTOD.COM was not written for this revision of the ' DB 'auto command',CR,LF DB 'structure and may not work with it.',CR,LF,'$' WAITMS: DB CR,LF,'WAIT',BS,BS,BS,BS,'$' ************************************************************************* * * * STRINGS REQUESTS THE COMMAND THAT WILL BE AUTO EXECUTED * * * ************************************************************************* CMDCLD: DB 20h,20h,20h,20h,CR,LF DB 'ENTER YOUR COLD COMMAND FOLLOWING THE ">".' DB CR,LF DB 'END YOUR COMMAND WITH A CARRIAGE RETURN.',CR,LF,LF,'>$' CMDWRM: DB 20h,20h,20h,20h,CR,LF DB 'ENTER YOUR WARM COMMAND FOLLOWING THE ">".' DB CR,LF DB 'END YOUR COMMAND WITH A CARRIAGE RETURN.',CR,LF,LF,'>$' ************************************************************************* * * * SUBROUTINE TO WAIT FOR A CHARACTER INPUT FROM THE CONSOLE. * * ONLY 2 CHARACTERS ARE ACCEPTED; OTHER CHARACTERS CAUSE A LOOP * * TO TRY AGAIN FOR A CHARACTER. CHARACTERS ACCEPTED ARE A * * CARRIAGE RETURN OR A BACKSPACE. A CARRIAGE RETURN CAUSES * * RETURN FROM THIS SUBROUTINE WITH CARRY CLEARED. A BACKSPACE * * ERASES THE LAST CHARACTER DISPLAYED ON THE SCREEN AND CAUSES * * RETURN WITH CARRY SET. * * ON ENTRY E MUST CONTAIN A CHARACTER TO BE PRINTED ON CRT * * * ************************************************************************* NEXTCR: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT CALL BDOS ;PRINT THE WHEN DIGIT ON THE CRT WAITCR: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT MVI E,0FFh ;INDICATES THIS IS CONSOLE INPUT CALL BDOS CPI CR ;WAS A CARRIAGE RETURN TYPED AT CONSOLE? JZ WAIT ;PRINT MESSAGE TO WAIT AND RETURN CURSOR CPI BS ;ASCII BACKSPACE JNZ WAITCR ;NOT A BACKSPACE OR CR SO GO TRY AGAIN MVI C,09 ;BDOS PRINT STRING LXI D,MKSPCE ;ASCII BACKSPACE, SPACE, BACKSPACE SEQUENCE CALL BDOS ;ERASE SELECTED DRIVE SHOWN ON CRT STC ;START THE DRIVE SELECTION PROCESS OVER AGAIN RET WAIT: MVI C,09 ;BDOS DIRECT CONSOLE INPUT/OUTPUT LXI D,WAITMS ;SEND WAIT MESSAGE TO THE CONSOLE CALL BDOS ANA A ;CLEAR CARRY STATUS RET ***************************************************************** * * * SUBROUTINE TO BACKSPACE THE COMMAND LINE ONE SPACE. * * CHECKS TO NOT BACKSPACE MORE CHARACTERS THAN HAVE * * BEEN ENTERED. ON ENTRY EXPECTS REG D TO BE COUNT OF * * CHARACTERS THAT HAVE BEEN ENTERED AND HL POINTS TO THE * * ADDRESS IN DMA MEMORY SPACE WHERE THE NEXT CHARACTER * * WILL BE ENTERED. IF REG D IS NOT ALREADY ZERO, THEN * * DECREMENTS REG D AND HL. * * * ***************************************************************** BKSPCE: MOV A,D CPI 1 ;DON'T BACKSPACE BY MORE CHARACERS THAN HAVE RZ ; BEEN ENTERED DCX H ;POINT TO THE LAST CHARACTER INPUT TO STRING DCR D ;REDUCE THE CHARACTER COUNT BY 1 PUSH H PUSH D MVI C,09h ;BDOS PRINT STRING LXI D,MKSPCE ;ASCII BACKSPACE, SPACE, BACKSPACE SEQUENCE CALL BDOS POP D POP H RET MKSPCE: DB BS,20h,BS,'$' ;ASCII BACKSPACE, SPACE, BACKSPACE STRING ************************************************************************* * * * SUBROUTINE: PRINT ERROR MESSAGE ON SCREEN WHEN ERROR OCCURS * * IN READING OR WRITING A SECTOR. THEN WARM BOOT. * * * ************************************************************************* SECERR: MVI C,09 ;BDOS PRINT STRING LXI D,SECMSG ;ADDRESS OF ERROR MESSAGE TO PRINT CALL BDOS JZ RESTOR ;RESTORE ORIG. DRIVE AND DMA ADDR AND WARM BOOT SECMSG: DB 20h,20h,20h,20h,CR,LF DB 'NON-RECOVERABLE ERROR OCCURED IN SECTOR READ (OR WRITE)$' ************************************************************************* * * * BIOS VECTOR TABLE. Actual values are filled in at runtime. * * * ************************************************************************* CONST: JMP 0 CONIN: JMP 0 CONOUT: JMP 0 LIST: JMP 0 PUNCH: JMP 0 READER: JMP 0 HOME: JMP 0 SELDSK: JMP 0 SETTRK: JMP 0 SETSEC: JMP 0 SETDMA: JMP 0 READ: JMP 0 WRITE: JMP 0 LISTST: JMP 0 SECTRAN: JMP 0 ORGDSK: DS 1 BIOSPG: DS 1 ENABLE: DS 1 CLDWRM: DS 1 DISK: DS 1 ;DIGIT OF SELECTED AUTO DRIVE SECT49: DW 49d SECT50: DW 50d SECT51: DW 51d TRAK49: DW 0000 TRAK50: DW 0000 TRAK51: DW 0000 DPH: DS 2 PASS: DB 1 INTRO: DB LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF DB 'AUTO COMMAND PROGRAM FOR MORROW DECISION 1 CP/M CBIOS',CR,LF DB CR,LF,' Revision 2.1 Copyright 1984 Ronald E. Jacobs' DB CR,LF,LF,LF,LF DB 'This program inserts commands (which will be automatically' DB CR,LF DB 'executed) onto the system tracks of your CP/M boot disk.' DB CR,LF,LF DB 'Select the drive that the command will be written to (A-P) ' DB 'or type Q to quit.' DB CR,LF DB 'If the command is to be on a floppy disk then PLACE THE DISK' DB CR,LF DB 'NOW INTO THE DRIVE you will select.' DB CR,LF,LF DB 'DRIVE: $' WHNMSG DB 20h,20h,20h,20h,CR,LF DB 'YOU HAVE THE FOLLOWING CHOICES:',CR,LF,LF DB ' 0 NEVER GIVE A COMMAND.',CR,LF DB ' 1 GIVE A COMMAND ONLY WHEN COLD BOOTING.',CR,LF DB ' 2 GIVE A COMMAND ONLY WHEN WARM BOOTING.',CR,LF DB ' 3 GIVE COMMANDS ON BOTH COLD AND WARM BOOTS.' DB CR,LF,LF DB 'CHOICE: $' TOLONG DB CR,LF DB 'YOU HAVE REACHED THE MAXIMUM COMMAND LENGTH OF 62 CHARACTERS' DB CR,LF,'$' BIOREV: DB 20h,20h,20h,20h,CR,LF DB 'WARNING, AUTOD was not written for this revision of the Cbios' DB CR,LF DB 'and may not work with it.$' DMA: DS 1 ;SPACE FOR DMA DISK READS/WRITES BEGINS HERE END