;************************************************************************ ;* * ;* 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. * ;* * ;************************************************************************ 0005 = BDOS EQU 0005H ;BDOS ENTRY POINT 000D = CR EQU 0DH ;CARRIAGE RETURN. 000A = LF EQU 0AH ;LINE FEED. 0008 = BS EQU 08H ;BACK SPACE 0008 = CCPLN EQU 8H ;LENGTH OF CCP IN PAGES 000E = BDOSLN EQU 0EH ;LENGTH OF BDOS IN PAGES 0100 ORG 100H ;BASE OF TRANSIENT PROGRAM AREA ************************************************************************* * * * FILL IN THE BIOS JUMP TABLE (AT RUNTIME) * * * ************************************************************************* 0100 2A0100 LHLD 1 ;WARM BOOT POINTER 0103 110300 LXI D,3 0106 19 DAD D 0107 223606 SHLD CONST+1 010A 19 DAD D 010B 223906 SHLD CONIN+1 010E 19 DAD D 010F 223C06 SHLD CONOUT+1 0112 19 DAD D 0113 223F06 SHLD LIST+1 0116 19 DAD D 0117 224206 SHLD PUNCH+1 011A 19 DAD D 011B 224506 SHLD READER+1 011E 19 DAD D 011F 224806 SHLD HOME+1 0122 19 DAD D 0123 224B06 SHLD SELDSK+1 0126 19 DAD D 0127 224E06 SHLD SETTRK+1 012A 19 DAD D 012B 225106 SHLD SETSEC+1 012E 19 DAD D 012F 225406 SHLD SETDMA+1 0132 19 DAD D 0133 225706 SHLD READ+1 0136 19 DAD D 0137 225A06 SHLD WRITE+1 013A 19 DAD D 013B 225D06 SHLD LISTST+1 013E 19 DAD D 013F 226006 SHLD SECTRAN+1 0142 0E19 MVI C,19H ;BDOS RETURN CURRENT DISK 0144 CD0500 CALL BDOS 0147 326206 STA ORGDSK ;SAVE THE ORIGINAL LOGGED DISK 014A 0E09 SIGNON: MVI C,09H ;BDOS PRINT STRING 014C 117606 LXI D,INTRO ;PRINT SIGNON, EXPLANATION, AND 1st INSTRUCTION 014F CD0500 CALL BDOS 0152 0E06 DRIVE: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT 0154 1EFF MVI E,0FFH ;INDICATES THIS IS CONSOLE INPUT 0156 CD0500 CALL BDOS 0159 FE00 CPI 0 ;0 RETURNED IF NO CHARACTER IS READY 015B CA5201 JZ DRIVE ;TRY AGAIN FOR A CHARACTER 015E FE03 CPI 03H ;SEE IF ^C WAS TYPED AT CONSOLE 0160 CA0000 JZ 0 ;WARM BOOT IF ^C WAS TYPED 0163 E65F ANI 01011111B ;CONVERT LOWER TO UPPER CASE 0165 FE51 CPI 'Q' ;SEE IF Quit FROM CONSOLE AND WARM BOOT IF SO 0167 CA0000 JZ 0 016A 5F MOV E,A ;PUT LETTER OF DRIVE IN E FOR BDOS TO CRT LATER 016B D641 SUI 'A' ;'A' IS THE LOWEST ASCII VALUE PERMITTED ; (drive is now a digit) 016D 326606 STA DISK ;DIGIT OF DRIVE TO PLACE AUTO COMMAND ON 0170 DA5201 JC DRIVE ;IF LOWER ASCII CHARACTER THAN 'A' WAS ENTERED 0173 FE10 CPI 16D ;DRIVE DIGIT-16 MUST BE LESS THAN 0 0175 D25201 JNC DRIVE ;IF HIGHER ASCII CHARACTER THAN 'P' WAS ENTERED 0178 CDAB05 CALL NEXTCR ;GO WAIT FOR A CARRIAGE RETURN OR A BACKSPACE 017B DA5201 JC DRIVE ;BACKSPACE TYPED; DO DRIVE SELECTION OVER AGAIN 017E 3A6606 DRVSEL: LDA DISK ;DIGIT DENOTING DRIVE TO PLACE AUTO COMMAND ON 0181 5F MOV E,A ;PREPARE FOR BIOS CALL 0182 0E0E MVI C,0EH ;BDOS SELECT DISK 0184 CD0500 CALL BDOS 0187 0E1F CALCTR: MVI C,1FH ;BDOS GET ADDRESS OF DISK PARAMETER BLOCK 0189 CD0500 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) * * * ************************************************************************* 018C 7E MOV A,M ;A CONTAINS LOW BYTE OF SECTORS PER TRACK 018D FE40 CPI 64D ;64d SPT INDICATES THIS IS A 8 IN. DD FLOPPY 018F 5E MOV E,M ;E CONTAINS LOW BYTE OF SECTORS PER TRACK ALSO 0190 23 INX H ;POINT TO HIGH BYTE OF SECTORS PER TRACK 0191 C2B101 JNZ NOT8IN ;IF NOT 64d SPT ASSUME OTHER THAN 8 FLOPPY 0194 7E MOV A,M ;A CONTAINS HIGH BYTE OF SECTORS PER TRACK 0195 FE00 CPI 00 ;IF 00 THEN 0064d SPT SO ASSUME 8" BOOT FLOPPY 0197 C2B101 JNZ NOT8IN ;WE DIDN'T FIND 64d SPT SO NOT 8" BOOT FLOPPY 019A 3E21 MVI A,33D ;FOR TRACK 0 SECTOR 5 APPEARS AS SECTOR 33d 019C 323303 STA READ5+1 ;CHANGE THE SECTOR NUMBR CALLED IN LATER SETSEC 019F 321A04 STA CCPWRT+1 ; " " " " " " " " 01A2 3E29 MVI A,41D ;FOR TRACK 0 SECTOR 6 APPEARS AS SECTOR 41d 01A4 324603 STA READ6+1 ;CHANGE THE SECTOR NUMBR CALLED IN LATER SETSEC 01A7 322F04 STA WRITE6+1 ; " " " " " " " " 01AA 2600 MVI H,00 ;ON 8" FLOPPY BOOT DISK TRACK 0 IS 26 SPT 01AC 2E1A MVI L,26D 01AE C3B301 JMP ABSSEC 01B1 56 NOT8IN: MOV D,M ;DE NOW CONTAINS SECTORS PER TRACK (SPT) 01B2 EB XCHG ;HL NOW CONTAINS SECTORS PER TRACK (SPT) 01B3 3E31 ABSSEC: MVI A,49D ;DESIRED ABSOLUTE SECTOR 01B5 2F CMA ;1s COMPLIMENT OF DESIRED SECTOR 01B6 C601 ADI 1 ;2s COMPLIMENT OF DESIRED SECTOR 01B8 5F MOV E,A ;E CONTAINS 2s COMPLIMENT OF DESIRED SECTOR 01B9 16FF MVI D,0FFH ;TREAT SECTOR AS A 16 BIT NEGATIVE NUMBER 01BB 19 DAD D ;SUBTRACT DESIRED SECTOR FROM SECTORS PER TRACK 01BC DACA01 JC PASINR ;SECTOR IS ON TRACK 0 IF CARRYI 01BF 7D MOV A,L ;NEGATIVE TRACK 1 SECTOR NUMBER 01C0 2F CMA ;1s COMPLIMENT 01C1 3C INR A ;2s COMPLIMENT 01C2 326706 SAVSEC: STA SECT49 ;STORE ADDRESS IS INCREMENTED LATER FOR 50, 51 01C5 3E01 MVI A,01 ;SECTOR IS ON TRACK 1 01C7 326D06 SAVTRK: STA TRAK49 ;STORE ADDRESS IS INCREMENTED LATER FOR 50, 51 01CA 3A7506 PASINR: LDA PASS ;PASS=1 FOR SECTOR 49, 2 FOR 50, AND 3 FOR 51 01CD FE03 CPI 3 ;HAS THE FINAL PASS BEEN COMPLETED? 01CF CAF001 JZ READ49 ;GO READ THE SECTORS INTO THE DMA SPACE 01D2 3C INR A ;PASS=PASS+1 01D3 327506 STA PASS 01D6 2AC801 LHLD SAVTRK+1 ;STORAGE ADDRESS OF THIS SECTOR'S TRACK NUMBER 01D9 23 INX H ;NEXT ADDRESS FOR NEXT SECTOR'S TRACK NUMBER 01DA 23 INX H ;THIS WILL EITHER BE FOR SECTOR 50 OR FOR 51 01DB 22C801 SHLD SAVTRK+1 01DE 2AC301 LHLD SAVSEC+1 ;STORAGE ADDRESS OF THIS SECTOR'S SECTOR NUMBER 01E1 23 INX H ;NEXT ADDRESS FOR NEXT SECTORS SECTOR NUMBER 01E2 23 INX H 01E3 22C301 SHLD SAVSEC+1 01E6 3AB401 LDA ABSSEC+1 ;ABSOLUTE SECTOR THAT JUST GOT CALCULATATED 01E9 3C INR A ;NEXT ABSOLUTE SECTOR 01EA 32B401 STA ABSSEC+1 ;NEXT ABSOLUTE SECTOR TO CALCULATE 01ED C38701 JMP CALCTR ;CALCULATE NEXT TRACK AND SECTOR FOR NEXT SECTR ********************************************** 01F0 2A6D06 READ49: LHLD TRAK49 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS 01F3 44 MOV B,H 01F4 4D MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS 01F5 CD4D06 CALL SETTRK ;BIOS SET TRACK 01F8 2A6706 LHLD SECT49 ;HL NOW HAS DESIRED SECTOR 01FB 44 MOV B,H 01FC 4D MOV C,L ;BC NOW HAS DESIRED SECTOR 01FD CD5006 CALL SETSEC ;BIOS SET SECTOR 0200 01A709 LXI B,DMA ;SET DMA ADDRESS FOR DISK READS AND WRITES 0203 CD5306 CALL SETDMA ;BIOS SET DMA 0206 CD5606 CALL READ ;READ FIRST OF THE 3 SECTORS INTO THE DMA AREA 0209 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ 020A C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** 020D 2A6F06 LHLD TRAK50 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS 0210 44 MOV B,H 0211 4D MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS 0212 CD4D06 CALL SETTRK ;BIOS SET TRACK 0215 2A6906 LHLD SECT50 ;HL NOW HAS DESIRED SECTOR 0218 44 MOV B,H 0219 4D MOV C,L ;BC NOW HAS DESIRED SECTOR 021A CD5006 CALL SETSEC ;BIOS SET SECTOR 021D 01270A LXI B,DMA+128D ;SET DMA ADDRESS FOR DISK READS AND WRITES 0220 CD5306 CALL SETDMA ;BIOS SET DMA 0223 CD5606 CALL READ ;READ SECOND OF THE 3 SECTORS INTO THE DMA AREA 0226 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ 0227 C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** 022A 2A7106 LHLD TRAK51 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS 022D 44 MOV B,H 022E 4D MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS 022F CD4D06 CALL SETTRK ;BIOS SET TRACK 0232 2A6B06 LHLD SECT51 ;HL NOW HAS DESIRED SECTOR 0235 44 MOV B,H 0236 4D MOV C,L ;BC NOW HAS DESIRED SECTOR 0237 CD5006 CALL SETSEC ;BIOS SET SECTOR 023A 01A70A LXI B,DMA+256D ;SET DMA ADDRESS FOR DISK READS AND WRITES 023D CD5306 CALL SETDMA ;BIOS SET DMA 0240 CD5606 CALL READ ;READ THIRD OF THE 3 SECTORS INTO THE DMA AREA 0243 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ 0244 C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** 0247 21A80A LXI H,DMA+100H+1 ;POINT TO CBIOS REVISION NUMBER 024A 7E MOV A,M ;GET CBIOS REVISION NUMBER IN A 024B FE35 CPI 53D ;COMPARE WITH E.3 024D CA6702 JZ CMDREV ;E.3 IS A VALID REVISION FOR AUTOD TO WORK WITH 0250 FE35 CPI 53D ;COMPARE WITH E.31(or patch space for future re 0252 CA6702 JZ CMDREV ;E.31 IS OK REVISION FOR AUTOD TO WORK WITH 0255 FE36 CPI 54D ;COMPARE WITH E.4 0257 CA6702 JZ CMDREV ;E.4 IS A VALID REVISION FOR AUTOD TO WORK WITH 025A FE36 CPI 54D ;PATCH SPACE FOR FUTURE REVISION NMBRS OF CBIOS 025C CA6702 JZ CMDREV ;VALID REVISION 025F 0E09 MVI C,09 ;BDOS PRINT STRING;NO VALID REVISION FOUND 0261 114809 LXI D,BIOREV ;STRING WARNS AUTOD MIGHT'NT WORK WITH BIOS REV 0264 CD0500 CALL BDOS 0267 2AAF0A CMDREV: LHLD DMA+100H+8 ;POINTER TO AUTO COMMAND REVISION BYTE 026A 7C MOV A,H ;H IS FIRST PAGE OF BIOS WHEN IT IS RUNNING 026B 326306 STA BIOSPG ;SAVE FIRST PAGE FOR CALCULATING CCP BASE LATER 026E 2600 MVI H,00H ;ZERO THE HIGH BYTE 0270 01A709 LXI B,DMA ;BEGINNING OF BUFFER IN THIS PROGRAM FOR DISK 0273 09 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. * * * ************************************************************************* 0274 7E MOV A,M ;AUTOD IS WRITTEN ONLY FOR AUTO COM. REV. 0 0275 FE00 CPI 0 0277 E5 PUSH H 0278 C46404 CNZ REVERR ;PRINT REVISION ERROR MESSAGE ON CONSOLE 027B E1 POP H 027C 23 INX H 027D 23 INX H ;HL POINTS TO AUTO COMMAND FEATURE ENABLE FLAG 027E E5 PUSH H 027F 0E09 MVI C,09H ;BDOS PRINT STRING 0281 112208 LXI D,WHNMSG ;ASK IF TO GIVE MESSAGE ON COLD OR WARM OR BOTH 0284 CD0500 CALL BDOS 0287 E1 POP H 0288 0E06 INWHEN: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT 028A 1EFF MVI E,0FFH ;INDICATES THIS IS CONSOLE INPUT 028C E5 PUSH H 028D CD0500 CALL BDOS 0290 E1 POP H 0291 FE00 CPI 0 ;0 RETURNED IF NO CHARACTER IS READY 0293 CA8802 JZ INWHEN ;TRY AGAIN FOR A CHARACTER 0296 FE51 CPI 'Q' ;SEE IF Quit FROM CONSOLE AND WARM BOOT IF SO 0298 CA5204 JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT 029B FE71 CPI 'q' ;SEE IF qUIT FROM CONSOLE AND WARM BOOT IF SO 029D CA5204 JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT 02A0 FE03 CPI 03H ;SEE IF ^C WAS TYPED AT CONSOLE 02A2 CA5204 JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT 02A5 77 MOV M,A ;STORE CHOICE OF COLD OR WARM OR BOTH BOOTING 02A6 5F MOV E,A ;PREPARATION FOR BDOS DIRECT OUTPUT TO CONSOLE 02A7 326406 STA ENABLE ;SAVE CHOICE FOR LATER EXAMINATION 02AA E6FC ANI 1111$1100B ;STRIP LAST TWO BITS 02AC FE30 CPI 30H ;WAS CHARACTER A '0','1','2', or '3' ? 02AE C28802 JNZ INWHEN ;TRY AGAIN FOR A VALID CHARACTER 02B1 E5 PUSH H 02B2 CDAB05 CALL NEXTCR ;GET NEXT CHARACTER; MUST BE BACKSPACE OR CR 02B5 E1 POP H 02B6 DA8802 JC INWHEN ;A BACKSPACE WAS TYPED; DO SELECTION OVER 02B9 23 INX H ;HL POINTS TO POINTER TO cold START COMMAND 02BA 3E07 MVI A,07H ;LOW BYTE OF ADDRESS OF CCP+7 02BC 77 MOV M,A ;STORE IT IN POINTER LOW BYTE 02BD 23 INX H 02BE 3A6306 LDA BIOSPG ;FIRST PAGE OF BIOS WHEN EXECUTING 02C1 D616 SUI CCPLN+BDOSLN ;A IS NOW HIGH BYTE OF CCP+7 02C3 77 MOV M,A ;STORE IT IN POINTER HIGH BYTE 02C4 23 INX H ;HL POINTS TO POINTER TO warm START COMMAND 02C5 3E47 MVI A,07H+64D ;LOW BYTE OF ADDRESS OF CCP+7+64 02C7 77 MOV M,A ;STORE IT IN POINTER LOW BYTE 02C8 23 INX H 02C9 3A6306 LDA BIOSPG ;FIRST PAGE OF BIOS WHEN EXECUTING 02CC D616 SUI CCPLN+BDOSLN ;A IS NOW HIGH BYTE OF CCP+7 02CE 77 MOV M,A ;STORE IT IN POINTER HIGH BYTE ********************************************** 02CF 2A6D06 LHLD TRAK49 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS 02D2 44 MOV B,H 02D3 4D MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS 02D4 CD4D06 CALL SETTRK ;BIOS SET TRACK 02D7 2A6706 LHLD SECT49 ;HL NOW HAS DESIRED SECTOR 02DA 44 MOV B,H 02DB 4D MOV C,L ;BC NOW HAS DESIRED SECTOR 02DC CD5006 CALL SETSEC ;BIOS SET SECTOR 02DF 01A709 LXI B,DMA ;SET DMA ADDRESS FOR DISK READS AND WRITES 02E2 CD5306 CALL SETDMA ;BIOS SET DMA 02E5 0E00 MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA 02E7 CD5906 CALL WRITE ;WRITE FIRST OF THE 3 SECTORS ONTO THE DISK 02EA B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE 02EB C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ********************************************** 02EE 2A6F06 LHLD TRAK50 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS 02F1 44 MOV B,H 02F2 4D MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS 02F3 CD4D06 CALL SETTRK ;BIOS SET TRACK 02F6 2A6906 LHLD SECT50 ;HL NOW HAS DESIRED SECTOR 02F9 44 MOV B,H 02FA 4D MOV C,L ;BC NOW HAS DESIRED SECTOR 02FB CD5006 CALL SETSEC ;BIOS SET SECTOR 02FE 01270A LXI B,DMA+128D ;SET DMA ADDRESS FOR DISK READS AND WRITES 0301 CD5306 CALL SETDMA ;BIOS SET DMA 0304 0E00 MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA 0306 CD5906 CALL WRITE ;WRITE SECOND OF THE 3 SECTORS ONTO THE DISK 0309 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE 030A C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ***************************************************** 030D 2A7106 LHLD TRAK51 ;HL NOW HAS TRACK ON WHICH DESIRED SECTOR IS 0310 44 MOV B,H 0311 4D MOV C,L ;BC NOW HAS TRACK ON WHICH DESIRED SECTOR IS 0312 CD4D06 CALL SETTRK ;BIOS SET TRACK 0315 2A6B06 LHLD SECT51 ;HL NOW HAS DESIRED SECTOR 0318 44 MOV B,H 0319 4D MOV C,L ;BC NOW HAS DESIRED SECTOR 031A CD5006 CALL SETSEC ;BIOS SET SECTOR 031D 01A70A LXI B,DMA+256D ;SET DMA ADDRESS FOR DISK READS AND WRITES 0320 CD5306 CALL SETDMA ;BIOS SET DMA 0323 0E00 MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA 0325 CD5906 CALL WRITE ;WRITE THIRD OF THE 3 SECTORS ONTO THE DISK 0328 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE 0329 C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ***************************************************** 032C 010000 LXI B,0000H ;READ THE CCP FROM TRACK 0 032F CD4D06 CALL SETTRK ;BIOS SET TRACK 0332 010500 READ5: LXI B,0005H ;SECTOR OF DISK STARTING AT CCP+0 0335 CD5006 CALL SETSEC ;BIOS SET SECTOR 0338 01A709 LXI B,DMA ;STORAGE IN THIS PROGRAM FOR DISK SECTORS 033B CD5306 CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES 033E CD5606 CALL READ ;READ TRACK 0 LOGICAL SECTOR 5 INTO DMA AREA 0341 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ 0342 C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT 0345 010600 READ6: LXI B,0006H ;SECTOR OF DISK STARTING AT CCP+128 0348 CD5006 CALL SETSEC ;BIOS SET SECTOR 034B 01270A LXI B,DMA+128D ;STORAGE IN THIS PROGRAM FOR DISK SECTORS 034E CD5306 CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES 0351 CD5606 CALL READ ;READ TRACK 0 LOGICAL SECTOR 6 INTO DMA AREA 0354 B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN READ 0355 C4EC05 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. * ;* * ;************************************************************************ 0358 3A6406 LDA ENABLE ;SELECTION MADE EARLIER (0,1,2,or 3) 035B FE30 CPI '0' ;SEE IF CHOSE NEVER TO GIVE COMMAND (CHOICE 0) 035D CA5204 JZ RESTOR ;RESTORE ORIGINAL DRIVE AND DMA AND WARM BOOT 0360 FE32 CPI '2' ;SEE IF CHOSE TO GIVE WARM BOOT COMMANDS ONLY 0362 CA7803 JZ WARM ;REQUEST FOR WARM BOOT COMMAND 0365 0E09 MVI C,09 ;BDOS PRINT STRING FUNCTION 0367 11ED04 LXI D,CMDCLD ;PRINT REQUEST FOR COLD COMMAND LINE ON CONSOLE 036A CD0500 CALL BDOS 036D 21AF09 LXI H,DMA+8 ; FIRST BYTE OF AUTO COMMAND IN CCP 0370 3E43 MVI A,'C' ;SET COLD-WARM FLAG TO SHOW THIS PASS IS COLD 0372 326506 STA CLDWRM ;(THE COLD PASS IS ALWAYS FIRST AND MAY BE ONLY 0375 C38803 JMP CMDBGN ;INITIALIZE COUNTER AND ACCEPT COMMAND INPUT 0378 0E09 WARM: MVI C,09 ;BDOS PRINT STRING FUNCTION 037A 114C05 LXI D,CMDWRM ;PRINT REQUEST FOR WARM COMMAND LINE ON CONSOLE 037D CD0500 CALL BDOS 0380 3E57 MVI A,'W' ;SET COLD-WARM FLAG TO SHOW THIS PASS IS WARM 0382 326506 STA CLDWRM ;(THE WARM PASS IS THE LAST IN ALL CASES) 0385 21EF09 LXI H,DMA+72 ;64 BYTE WARM COMMNAND SPACE FOLLOWING CCP+8+64 0388 1601 CMDBGN: MVI D,1 ;COUNTER FOR NUMBER OF CHARS IN COMMAND+NULL 038A 1EFF CONIO: MVI E,0FFH ;TO REQUEST INPUT CHARACTER FROM THE CONSOLE 038C 0E06 MVI C,06H 038E D5 PUSH D 038F E5 PUSH H 0390 CD0500 CALL BDOS ;BDOS DIRECT CONSOLE I/O 0393 E1 POP H 0394 D1 POP D 0395 FE00 CPI 0 ;RETURNS CHAR IN REGISTER A OR 0 IF NONE READY 0397 CA8A03 JZ CONIO ;IF NO CHARACTER WAS READY TRY AGAIN 039A FE08 CPI BS ;ASCII BACKSPACE 039C C2A503 JNZ CANCEL ;IF NOT A BACKSPACE, CHECK IF ^X 039F CDD505 CALL BKSPCE ;THIS IS A BACKSPACE, GO DO ONE 03A2 C38A03 JMP CONIO ;GO GET THE NEXT CHARACTER FROM THE CONSOLE 03A5 FE18 CANCEL: CPI 18H ;ASCII CANCEL (^X) 03A7 C2B603 JNZ CRCHEK ;IF NOT ^X, CHECK IF CARRIAGE RETURN 03AA CDD505 BKAGAN: CALL BKSPCE ;BACKSPACE 1 CHARACTER 03AD 7A MOV A,D 03AE FE01 CPI 1 ;HAVE WE BACKED THROUGH ALL CHARACTERS YET? 03B0 CA8A03 JZ CONIO ;IF DONE GO GET NEXT CHARACTER FROM CONSOLE 03B3 C3AA03 JMP BKAGAN ;DO ANOTHER BACKSPACE 03B6 FE0D CRCHEK: CPI 0DH ;ASCII CARRIAGE RETURN 03B8 CAF003 JZ ENDINP ;IF ALL OF AUTO COMMAND HAS BEEN ENTERED 03BB FE14 CPI 20 ;HIGHEST NONPRINTING ASCII CHARACTER + 1 03BD DA8A03 JC CONIO ;DON'T RECORD NONPRINTING CHARACTERS 03C0 FE7F CPI 7FH ;ASCII DELETE 03C2 CA8A03 JZ CONIO ;DON'T ALLOW DELETES 03C5 FE61 CPI 'a' ;LOWEST ASCII LOWER CASE VALUE CHARACTER 03C7 DAD103 JC PNTCHR ;RECORD+PRINT THE CHARACTER SANS MODIFICATION 03CA FE7B CPI '{' ;HIGHEST ASCII LOWER CASE VALUE + 1 03CC D2D103 JNC PNTCHR ;CHARACTER MUST BE HIGHER THAN 'z' 03CF E65F ANI 1011111B ;CONVERT lower TO UPPER CASE 03D1 14 PNTCHR: INR D ;INCREMENT COUNT OF CHARACTERS 03D2 77 MOV M,A ;STORE CHARACTER IN CCP AUTO COMMAND 03D3 23 INX H ;NEXT ADDR TO STORE CHARACTER IN CCP AUTO COMND 03D4 E5 PUSH H 03D5 D5 PUSH D 03D6 0E02 MVI C,02H 03D8 5F MOV E,A ;CHARACTER TO SEND TO CONSOLE 03D9 CD0500 CALL BDOS ;BDOS CONSOLE OUTPUT (1 CHARACTER AT A TIME) 03DC D1 POP D 03DD E1 POP H 03DE 7A MOV A,D ;COUNT OF CHARACTERS 03DF FE3E CPI 62D ;MAXIMUM NUMBER OF CHARACTERS 03E1 C28A03 JNZ CONIO ;IF MAX NUM CHARS NOT EXCEEDED GO GET NEXT CHAR 03E4 E5 PUSH H 03E5 D5 PUSH D 03E6 0E09 MVI C,09H ;BDOS PRINT STRING 03E8 110709 LXI D,TOLONG ;MESSAGE THAT COMMAND LENGTH IS TOO LONG 03EB CD0500 CALL BDOS 03EE D1 POP D 03EF E1 POP H 03F0 E5 ENDINP: PUSH H 03F1 D5 PUSH D 03F2 0E09 MVI C,09 ;BDOS PRINT STRING 03F4 11E204 LXI D,WAITMS ;WAIT MESSAGE STRING 03F7 CD0500 CALL BDOS 03FA D1 POP D 03FB E1 POP H 03FC 3E00 MVI A,00H ;ASCII NULL TO END AUTO COMMAND STRING WITH 03FE 77 MOV M,A ;STORE NULL AT END OF AUTO COMMAND STRING 03FF 3A6506 LDA CLDWRM ;WAS THIS PASS A COLD OR A WARM COMMAND? 0402 FE43 CPI 'C' ;IF 'C' THEN COLD 0404 7A MOV A,D ;COUNT OF CHARACTERS 0405 C21604 JNZ ENDWRM ;IF NOT COLD THEN IT WAS WARM 0408 32AE09 STA DMA+7 ;STORE COUNT IN CCP+7(START OF COLD CMD STRING) 040B 3A6406 LDA ENABLE ;ELECTION MADE EARLIER FOR COLD, WARM OR BOTH 040E FE31 CPI '1' ;IF 1 WAS FOR COLD ONLY 0410 CA1904 JZ CCPWRT ;SO WRITE SECTORS TO DISK AND FINISH UP 0413 C37803 JMP WARM ;MUST HAVE BEEN A 3 SO GO GET WARM COMMAND 0416 32EE09 ENDWRM: STA DMA+71 ;STORE COUNT IN CCP+71(START OF WARM CMD STRING 0419 010500 CCPWRT: LXI B,5D ;SECTOR OF DISK TO WRITE TO 041C CD5006 CALL SETSEC ;BIOS SET SECTOR 041F 01A709 LXI B,DMA ;STORAGE IN THIS PROGRAM FOR DISK SECTORS 0422 CD5306 CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES 0425 0E00 MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA 0427 CD5906 CALL WRITE ;BIOS WRITE SECTOR(REPLACE MODIFIED CCP TO DISK 042A B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE 042B C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT 042E 010600 WRITE6: LXI B,6D ;SECTOR OF DISK TO WRITE TO 0431 CD5006 CALL SETSEC ;BIOS SET SECTOR 0434 01270A LXI B,DMA+128D ;STORAGE IN THIS PROGRAM FOR DISK SECTORS 0437 CD5306 CALL SETDMA ;BIOS SET DMA ADDRESS FOR DISK READS/WRITES 043A 0E00 MVI C,0 ;TELL BIOS THIS IS ORDINARY (ALLOCATED) DATA 043C CD5906 CALL WRITE ;BIOS WRITE SECTOR(REPLACE MODIFIED CCP TO DISK 043F B7 ORA A ;BIOS RETURNS 0 IF NO ERROR OCCURED IN WRITE 0440 C4EC05 CNZ SECERR ;GIVE ERROR MESSAGE AND THEN WARM BOOT ;********************************************** ;*THE PURPOSE OF THE FOLLOWING READ IS TO FORCE FLUSHING THE BUFFER TO THE DISK ;********************************************** 0443 010000 LXI B,00 ;SET TO READ SECTOR 0 0446 CD5006 CALL SETSEC ;BIOS SET SECTOR 0449 01A709 LXI B,DMA ;SET DMA ADDRESS FOR FIRST SECTOR 044C CD5306 CALL SETDMA ;BIOS SET DMA 044F CD5606 CALL READ ;READ A SECTOR OF THE DISK INTO THE DMA AREA ********************************************** 0452 3A6206 RESTOR: LDA ORGDSK ;DRIVE SELECTED BEFORE THIS PROGRAM STARTED 0455 5F MOV E,A ;RESTORE ORIGINAL DRIVE SELECTION 0456 0E0E MVI C,0EH ;BDOS SELECT DISK 0458 CD0500 CALL BDOS 045B 018000 LXI B,0080H ;RESTORE DEFAULT DMA ADDRESS 045E CD5306 CALL SETDMA ;BIOS SET DMA 0461 C30000 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. * * * ************************************************************************* 0464 0E09 REVERR: MVI C,09H ;BDOS PRINT STRING FUNCTION 0466 116D04 LXI D,REVMSG ;ERROR MESSAGE STRING ADDRESS 0469 CD0500 CALL BDOS 046C C9 RET 046D 202020200DREVMSG: DB 20H,20H,20H,20H,CR 0472 5741524E49 DB 'WARNING: AUTOD.COM was not written for this revision of the ' 04AE 6175746F20 DB 'auto command',CR,LF 04BC 7374727563 DB 'structure and may not work with it.',CR,LF,'$' 04E2 0D0A574149WAITMS: DB CR,LF,'WAIT',BS,BS,BS,BS,'$' ************************************************************************* * * * STRINGS REQUESTS THE COMMAND THAT WILL BE AUTO EXECUTED * * * ************************************************************************* 04ED 202020200DCMDCLD: DB 20H,20H,20H,20H,CR,LF 04F3 454E544552 DB 'ENTER YOUR COLD COMMAND FOLLOWING THE ">".' 051D 0D0A DB CR,LF 051F 454E442059 DB 'END YOUR COMMAND WITH A CARRIAGE RETURN.',CR,LF,LF,'>$' 054C 202020200DCMDWRM: DB 20H,20H,20H,20H,CR,LF 0552 454E544552 DB 'ENTER YOUR WARM COMMAND FOLLOWING THE ">".' 057C 0D0A DB CR,LF 057E 454E442059 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 * * * ************************************************************************* 05AB 0E06 NEXTCR: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT 05AD CD0500 CALL BDOS ;PRINT THE WHEN DIGIT ON THE CRT 05B0 0E06 WAITCR: MVI C,06 ;BDOS DIRECT CONSOLE INPUT/OUTPUT 05B2 1EFF MVI E,0FFH ;INDICATES THIS IS CONSOLE INPUT 05B4 CD0500 CALL BDOS 05B7 FE0D CPI CR ;WAS A CARRIAGE RETURN TYPED AT CONSOLE? 05B9 CACB05 JZ WAIT ;PRINT MESSAGE TO WAIT AND RETURN CURSOR 05BC FE08 CPI BS ;ASCII BACKSPACE 05BE C2B005 JNZ WAITCR ;NOT A BACKSPACE OR CR SO GO TRY AGAIN 05C1 0E09 MVI C,09 ;BDOS PRINT STRING 05C3 11E805 LXI D,MKSPCE ;ASCII BACKSPACE, SPACE, BACKSPACE SEQUENCE 05C6 CD0500 CALL BDOS ;ERASE SELECTED DRIVE SHOWN ON CRT 05C9 37 STC ;START THE DRIVE SELECTION PROCESS OVER AGAIN 05CA C9 RET 05CB 0E09 WAIT: MVI C,09 ;BDOS DIRECT CONSOLE INPUT/OUTPUT 05CD 11E204 LXI D,WAITMS ;SEND WAIT MESSAGE TO THE CONSOLE 05D0 CD0500 CALL BDOS 05D3 A7 ANA A ;CLEAR CARRY STATUS 05D4 C9 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. * * * ***************************************************************** 05D5 7A BKSPCE: MOV A,D 05D6 FE01 CPI 1 ;DON'T BACKSPACE BY MORE CHARACERS THAN HAVE 05D8 C8 RZ ; BEEN ENTERED 05D9 2B DCX H ;POINT TO THE LAST CHARACTER INPUT TO STRING 05DA 15 DCR D ;REDUCE THE CHARACTER COUNT BY 1 05DB E5 PUSH H 05DC D5 PUSH D 05DD 0E09 MVI C,09H ;BDOS PRINT STRING 05DF 11E805 LXI D,MKSPCE ;ASCII BACKSPACE, SPACE, BACKSPACE SEQUENCE 05E2 CD0500 CALL BDOS 05E5 D1 POP D 05E6 E1 POP H 05E7 C9 RET 05E8 08200824 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. * * * ************************************************************************* 05EC 0E09 SECERR: MVI C,09 ;BDOS PRINT STRING 05EE 11F705 LXI D,SECMSG ;ADDRESS OF ERROR MESSAGE TO PRINT 05F1 CD0500 CALL BDOS 05F4 CA5204 JZ RESTOR ;RESTORE ORIG. DRIVE AND DMA ADDR AND WARM BOOT 05F7 202020200DSECMSG: DB 20H,20H,20H,20H,CR,LF 05FD 4E4F4E2D52 DB 'NON-RECOVERABLE ERROR OCCURED IN SECTOR READ (OR WRITE)$' ************************************************************************* * * * BIOS VECTOR TABLE. Actual values are filled in at runtime. * * * ************************************************************************* 0635 C30000 CONST: JMP 0 0638 C30000 CONIN: JMP 0 063B C30000 CONOUT: JMP 0 063E C30000 LIST: JMP 0 0641 C30000 PUNCH: JMP 0 0644 C30000 READER: JMP 0 0647 C30000 HOME: JMP 0 064A C30000 SELDSK: JMP 0 064D C30000 SETTRK: JMP 0 0650 C30000 SETSEC: JMP 0 0653 C30000 SETDMA: JMP 0 0656 C30000 READ: JMP 0 0659 C30000 WRITE: JMP 0 065C C30000 LISTST: JMP 0 065F C30000 SECTRAN: JMP 0 0662 ORGDSK: DS 1 0663 BIOSPG: DS 1 0664 ENABLE: DS 1 0665 CLDWRM: DS 1 0666 DISK: DS 1 ;DIGIT OF SELECTED AUTO DRIVE 0667 3100 SECT49: DW 49D 0669 3200 SECT50: DW 50D 066B 3300 SECT51: DW 51D 066D 0000 TRAK49: DW 0000 066F 0000 TRAK50: DW 0000 0671 0000 TRAK51: DW 0000 0673 DPH: DS 2 0675 01 PASS: DB 1 0676 0A0A0A0A0AINTRO: DB LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF 0681 4155544F20 DB 'AUTO COMMAND PROGRAM FOR MORROW DECISION 1 CP/M CBIOS',CR,LF 06B8 0D0A202020 DB CR,LF,' Revision 2.1 Copyright 1984 Ronald E. Jacobs' 06EB 0D0A0A0A0A DB CR,LF,LF,LF,LF 06F0 5468697320 DB 'This program inserts commands (which will be automatically' 072A 0D0A DB CR,LF 072C 6578656375 DB 'executed) onto the system tracks of your CP/M boot disk.' 0764 0D0A0A DB CR,LF,LF 0767 53656C6563 DB 'Select the drive that the command will be written to (A-P) ' 07A2 6F72207479 DB 'or type Q to quit.' 07B4 0D0A DB CR,LF 07B6 4966207468 DB 'If the command is to be on a floppy disk then PLACE THE DISK' 07F2 0D0A DB CR,LF 07F4 4E4F572049 DB 'NOW INTO THE DRIVE you will select.' 0817 0D0A0A DB CR,LF,LF 081A 4452495645 DB 'DRIVE: $' 0822 202020200DWHNMSG DB 20H,20H,20H,20H,CR,LF 0828 594F552048 DB 'YOU HAVE THE FOLLOWING CHOICES:',CR,LF,LF 084A 0930202020 DB ' 0 NEVER GIVE A COMMAND.',CR,LF 0869 0931202020 DB ' 1 GIVE A COMMAND ONLY WHEN COLD BOOTING.',CR,LF 0899 0932202020 DB ' 2 GIVE A COMMAND ONLY WHEN WARM BOOTING.',CR,LF 08C9 0933202020 DB ' 3 GIVE COMMANDS ON BOTH COLD AND WARM BOOTS.' 08FB 0D0A0A DB CR,LF,LF 08FE 43484F4943 DB 'CHOICE: $' 0907 0D0A TOLONG DB CR,LF 0909 594F552048 DB 'YOU HAVE REACHED THE MAXIMUM COMMAND LENGTH OF 62 CHARACTERS' 0945 0D0A24 DB CR,LF,'$' 0948 202020200DBIOREV: DB 20H,20H,20H,20H,CR,LF 094E 5741524E49 DB 'WARNING, AUTOD was not written for this revision of the Cbios' 098B 0D0A DB CR,LF 098D 616E64206D DB 'and may not work with it.$' 09A7 DMA: DS 1 ;SPACE FOR DMA DISK READS/WRITES BEGINS HERE 09A8 END