0 A700 C700 D700 EF00 E700 Cbios ; 3100 B700 D700 E700 FF00 F700 Tables (approx.) ; 35FF BFFF DFFF EFFF F7FF FFFF End of Memory ; ; ~~~~ 8900 A900 B900 C100 C900 DDT page ;***************************** ;Begin User Configuration Area ;***************************** ; ;Define TRUE and FALSE ;--------------------- ; TRUE equ 1 FALSE equ 0 ;Set the Memory Size ;------------------- ; msize equ 48 ;Memory size of target CP/M ;Misc Equates ;------------ ; biosln equ 13h ;BIOS length in pages micron equ FALSE ;Set for Micronix boot loader (only DJDMA) absasm equ TRUE ;set for MAC retries equ 10 ;Maximum # of disk retries page ;***************************** ;Begin Internal System Equates ;***************************** ;Starting addresses ;------------------ ; if not absasm aseg endif ccpln equ 800h ;Length of the CCP bdosln equ 0e00h ;Length of the BDOS size equ msize*1024 ;Memory size in Kilo-bytes ccp equ size-(biosln*100h+ccpln+bdosln) bdos equ ccp+ccpln bios equ ccp+ccpln+bdosln retries equ 10 load1 equ 100h ;read offset#1 for movcpm ;Load and execution addresses ;---------------------------- ; 1) If this program is being used to boot Micronix, and the load ; address is moved forward from 0100h, then the starting extended ; address for the djdma boot loader should be adjusted. ; if micron eq FALSE loaddr equ ccp ;Load address for floppy cboot equ bios ;Cold boot address for CP/M else ;Micronix boot loader loaddr equ 0100h cboot equ 0100h ;Cold boot address for the loader endif page ;********************************************************************** ;Cold boot loader for the Disk Jockey DMA controller using 5 1/4" ;Soft Sectored Disks <<<<<<<<<<<<<<<<<<<<< ;********************************************************************** ; ;DJDMA Disk Controller (5 1/4" Disks) ;==================================== ; 1) The warm boot starts from track 0 sector 1 and continues ; through to track 1 sector 1. ; 2) The cold boot loader (track 0, sector 0) is loaded into ; RAM at 80h. This loader will start loading from track 0, ; sector 1 and stops at track 1, sector 9. The load ; sequence is as follows: ; ; track sector sysgen load order Name ; 0 0 900 80 0 Cold boot ; 0 1 b00 9500 1 CCP ; 0 2 d00 9700 2 ; 0 3 f00 9900 3 ; 0 4 1100 9b00 4 ; 0 5 1300 9d00 5 BDOS ; 0 6 1500 9f00 6 ; 0 7 1700 a100 7 ; 0 8 1900 a300 8 ; 0 9 1b00 a500 9 ; ; 1 0 1d00 a700 10 ; 1 1 1f00 a900 11 ; 1 2 2100 ab00 12 CBIOS ; 1 3 2300 ad00 13 ; 1 4 2500 af00 14 ; 1 5 2700 b100 15 ; 1 6 2900 b300 16 ; 1 7 2b00 b500 17 ; 1 8 2d00 b700 18 ; 1 9 2f00 b900 19 page ;5 1/4" DJDMA Equates ;==================== ; ;Define Boot Address for DJDMA boot equ 80h org boot djkick equ 0EFh ;I/O port to start DJDMA controller activity channl equ 50h ;Default Channel Address trkoff equ 9*512 ;Number of bytes loaded from track 0 setdma equ 23h ;Set DMA address djhalt equ 25h ;Halt controller djbran equ 26h ;Branch controller command redtrk equ 29h ;Read track command load2 equ 100h ;read offset#2 for movcpm offset equ 900h-boot ;read offset for DDT page ;Begin 5 1/4" DJDMA Executable Code ;================================== ; mvi a,djbran ;Load branch channel command sta channl lxi h,commnd ;Load new command channel address shld channl+1 xra a sta channl+3 djstrt: out djkick ;Start controller djwait: lda djdone ;Get final status ora a ;0 = still busy jz djwait ;Loop if busy lxi h,sectb0 ;Check for bad load lxi b,40ffh ;b = ok, c = loaded lxi d,endtbl-sectb0 ;Error count + # of sectors djloop: mov a,m ;Load sector code cmp c ;Check for 0ffh (already loaded) jz djcont ;Skip if load was 'ok' mov m,c ;Load 'loaded' flag cmp b ;Check for 'ok' status jz djcont ;Skip if load ok inr m ;Make flag = 0 inr d ;Bump error counter djcont: dcr e ;Bump sector count inx h ;Bump table pointer jnz djloop mo ALIAS CMDS ARUNZ08 UQD><ARUNZ08ICOM HARUNZ08ZCOMP Z3ENV* !9"r1r 23@ 22(: 2 ͌"4"ͣ@4k͌͏ʜ$(^(͏#ʜ͏ʜ^!G0ʊ8 0 ~!###~##ȸ ~#fo$Y^^*w-gDcUFNT Z:."*'.MR͏##GK  !͏#w#6! }# ~#~>;2X͏((T!6}| :XO~ȹ#>$>^Ͷ y0(#:\ :,<@:,AͶ y0( #:iN:-NͶ#!]=Ͷ!eA͏Ó\t!.F#N͞>088 د"#.=>.A"#.="#.>o|gA͏18د͍ ~#>23*4@~!.#͌~(l G|(x( ͼ Ovfĺ*r"0( G~(#*0^#V:3(6~;( (>;( ~#(6*0s#r~# =ͼ warning -- script line format error *4@:~#W()!8%͏(.G(-=(?((͏(!8=(͏=( ɯ=͏ :2G: (&ͼ Extended Command Processor Error x(#:  (ͼ Shell Invocation Error x` ~́08 8 80 ))))_z#{Nͻ(: (/:( ($++##~ +~2+~=2% >n (:G:O!.p#qͯ͞ ( ́:]/( ( : ġ͡ͼ Syntax: ARUNZ NAME [PARAMETERS] Runs alias script NAME from text file ALIAS.CMD : ʢͼ Alias "͏ͼ " Not Found â: ʢͼ ALIAS.CMD File Not Found â: ͼ Running Alias "͏ͼ " *4@~!T#ͼ ARUNZ Version 0.8  ( ( =*4w# h͵!,p#q?, #?,#$!e 4; #͙ G~A`@ҍ2f #~ ) ~ z) ڌ#c~ ŒͶ O ҍ2g =͘ #¶#« à=2g 2f ~!=_.:,<>ȷ;ɯ~" #) & Wy& & & & & Oy70 3 ?7ɯ@ @  > S ͵yS ~#Z 2i 8 2j 2l  8 2k 2m :i ʢ 8 < ~  ##ʢ x2l _8 y2m _ 8 Ù = :j _:k _ :l G:m O}2h :h   ##x y =~$) :j <=G#~+$6 :k Oͧ ###~ͧ 0xo|g~ͧ ###w* ^#V* .~* R* ,~* "~#fo* -~* ^#V#~ѷ*  ^#V#~ѷ"    7 0w#: *! : G*# ;  @ >2 *! " : g./" * : G*! xʏ *# k *! " 2 : g./"  2 *# % : ͏ *# % R ##^#V+z s#r#^#V2 r+s:  * ~2 #" * +" : 2 ##^#V+zm s#r#^#V: r+s:  ] * : w#" * +" 6 *# l * } +" * 6#" ç ] *# l " ~2 #~2 #^#V" #^#V" #^#V"! #"# * #: w* #s#r* #s#rw M >N M M G y  2 "  * #~#o|g6: ʶ ~ʵ ́w#è +~# ~#  '    y yG>GO> T  > T> T TTTT T T>^T@TO*. c2 2×:_:_ Y X OG~́w#HWH Wr# x}o|g,7|g}o=7~#M`A+~#M`QMO !xt#jy  a{_*}ʘ$.ɜT]$$$$!d~w%%%%!&u[I OUT OF MEMORY !* a[a>GKB%*aRPYDM*aSaSa*Z3ENV* !9"1C 72͝ 2;: 2 ""c(͌$ʄ^t_Y__!G0ʮڬ ҬD~!#â##~#Yȸ¬~#fo$j^o*-DtUFNT&Z:."6';MRYYGͨ $!Yw#6!O}YI ~#~>;<2iwRRͱB!6} :iO~ȹ#^>$>^ƒy0ʓY:\Ž:<@:Aªy0ʰY:im:mY!]X!e]OD\!F#N>0 د;YHX>.];YHX;YH>o|g]1Fد D~#ß>2*͝~!.#ô~ G|xOvfl*"G~#*^#V:6~;-->;9~#@-6*s#r~#N=warning -- script line format error *͝:~#W!G=ʄ?ʌʌ!=ʄó= ɯ= :G: Extended Command Processor Error xF:  FShell Invocation Error xͽ ~0| m|| ))))_z#S{̈́n: :ʷ2 ++##~¢+~2+~=2e͂ > ʘ:G:O!p#q] ʘ]M :]/  :  Syntax: ARUNZ NAME [PARAMETERS] Runs alias script NAME from text file ALIAS.CMD : Alias "" Not Found : ALIAS.CMD File Not Found : Running Alias "" *͝~!ͱ# ARUNZ Version 0.8 ]M && =*w#.!p#q#: ͐%%: %͐: ͝ ѯ2 c~2 :  .T#c : : 0 *v>?͉}#?̉c0 #Á! 4͘ ! # G~Aڽ@2 #~ ͆ ~ ͆ #~  O R 2 =! ! #!  # $  =2 2 ~!P =_.:,<>ȷ;ɯ~0  #͆ ڃ Wyڃ ڃ ڃ ڃ ڃ OV y70 Ґ ?7ɯ͝ ͝  > Ͱ y° ~#· 2 ͕ 2 2  ͕ 2 2 2 : ͕ <* ~/ | O ## x2 _͕ y2 _ ͕ =0 : _: _ : G: O}2 2 : v | ##xY yY =~$† : <=G#~+$“ : O ###~ 0xo|g~ ###w*G ^#V*G .~*G R*G ,~*G "~#fo*G -~*G ^#V#~ѷ*G  ^#V#~ѷ"G CY Y  e 7g 0w#:y *~ :x G* ˜ v Ý >2y *~ "| :x g.͌"z *z {:x G*~ x *  *~ "| 2y :x g.͌"z - 2y * ͂ ͗ / j Z - * ͂ ͯ / & ##^#V+zu s#r#^#V2u r+s:u - j / *| ~2u #"| *z +"z Z :u 2u ##^#V+z s#r#^#V:u r+s:u - ͺ / *| :u w#"| *z +"z Ó - * / & - *z } +"z *| 6#"|  ͺ * / & "v ~2x #~2y #^#V"z #^#V"| #^#V"~ #" *v #:y w*z #s#r*| #s#rw H)ª >ë )ª )ª ä ) 2 "  * #~#o|g6: ~w#+~#~#s ] ̈́ J OOS$$ $y$ $yG>GO> ͱi$> ͱ> ͱ ұʱʱʱ ʱ ʱ>^ͱ@ͱO*. 2 2:_:_ Y X OG~@w#3HQWrHgWrr# xr}o|g҉7|g}oҚ7~#ʪͽʞ+~#ʪͽ®êO !#y  a{_*}$.a*v%ARUNZ08.UPDJ  !"#o$%&'()*+,-./0123456789:;<=>?@AFC2`326 "DH+"*"66 #\FAPI VIII  \ . #FB15=:]! #$Du7500Ϳ!%=#%=#%=# $F'bP +!33+ +!+"+#5555555 &( _____________-!6~6ʦOʹPAO`i+~+ 'HMgrand Pg!\*MLAM{y 'pMtotalM*7*7R#͎+nM͔JSM* 'F#3bP++$666R͎ҘMJM (8 ============+$6667 ¦JsIg77F'bP +!33+ +!+"+#5555555 &( _____________-!6~6ʦOʹPAO`i+~+ 'HMgrand Pg!\*MLAM{y 'pMtotalM*7*7R#͎+nM͔JSM* 'F#3bP++$666R͎ҘMJM (8 ============+$6667 1No space for file( J$Es+ * 44"File not found 4FebP++++++8888888 !tE&'P+++ +!+"+#5555555 "EPMET`W/ "EB15 " ;************************************************************************ ;* * ;* 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 INTLOADED 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 * * wordstar lh pl mt mb hm fm pc po pa cp he fo op pn cw sr uj bp ig df rv rp sv av dm cs fi pf rm lm ls oj ij l mt mb hm fm pc po pa cp he fo op pn cw sr uj bp ig df rv rp sv av dm cs fi pf rm lmAUXDICT $$$CBOOT MAC*CBOOT PRN+,BOOT COM-CBIOS MACn./01234