;************************************************************************ ;* * ;* 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 55d ;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.2 Copyright 1984 Ronald E. Jacobs' DB CR,LF,' A product of Jacobs Computer Services' DB CR,LF,' P.O. Box 415, Pinole, Calif. 94564' DB CR,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