IMD 1.12: 12/12/2009 20:26:50 M16 boot disk  13!x>w>>wwyWw yA yH->t>c>t>rw#e/v\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<į2 Ň!˶2:2a{_:˷ʖ:˷>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "Ʒ"͌#>?͌͘ =_.:;<> Oƅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER !yO#< Ty#O 3ǯ21y_͸2y2ͽ:ķ1͘A͌>>͌92^ :˷¥.!_~#fow]ɭʎʥ!v"!çREAD ERRORçNO FILE^:˷ ! ~ 3#0 Wx x ƀ Ƃ G ~ # 3x~#B!Y~ɯ2:˷=!˾ý:˷=!˾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ɯw4!Y~ʆ͌†t=ʆf ^ T ɯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yʸpsp2mÆÆf ͧFILE EXISTS _: É: :˷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2˯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !˶ Â$$$ SUB ̙̥̫̱"C{2!"E9"1Aϯ22!ty)K!G_^#V*Cΐ~؃E؜إث ,&-AGMSϛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :ϷE B 2>: Ϸb# : Ϸy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! Ͼ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ͯ2 H! >w_: ! Ͼ5ͤNkͱ¦ͱxʊ#Nx: Ϸ! ϖ2 ͤ! 5™#wO~x½p Hy<< ڷʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>گ*w#w*w#w'û*ڷ! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N:ٷ EG>O: \зSЀ*C :ٷqn& ^#V>O^ "*}:*)=":O:١o"*C *C!ͮ~2~2ͦ:٦2ͮ:ЯO:فw:w |g}o*ٯ#  ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:مo$*C~i6iw**{#zr+s{ozg**͕** Ѿ,w͜͸Ͳ!!N#F$**O!~#:AϾ#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | sӖ-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ٷ~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌xѯ2͢*C ~<wʃG:٠!٦ʎì 4~ʶ¬:<ʶ$ʶïZͻЯx>2>2ͻ:!پZկ2:EϷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C :ٷ:ddslO s#r:EϷ͊:==»y==»*Ww#*"͸*:G#š"͸:!پw4 iw:Z!E~=26Я2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!BϾw!>2*C~=2u:B2~2wE:A*C϶w>"!""ٯ2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*٤W}_*"}o|g":ٷʑ*C6:ٷʑw:2E**E}DQ>2ÃÒ`;ÿ:QHKiro*eۂi|Zi|ZJ+?     12>>>!w~56K CP/M 2.2 EE 07/10/8>yx>>125:,!z z2324"@r!"@.6#6#6#w#N#6#6#6C> ͉q.3.4&q!y25i)))): n`i"@C> 2Z͉:3w> :4*@ error in track:3 sector:4> :Z=2Z|,Retry or Ignore`_OI w> 8w#-~#8:5/͉~ Uܷ͒`:uuzÁÁ>:57o&:ݠܠܩܲ>/>/>>/ܷ͒`¿N~#Ɛ'@'O: y> y_~#fo> >yO \ p>>*ݷQy!94~9pCw 29 CBOOT56 ASMLOAD COMWMH COML  !"STAT COM).HARD SUBBOOTGEN SUBM16 PRL"$$$ SUBBER OF SECTORS. ORG 0 BOOT: LXI SP,100H BOOT1: LXI B,2 MVI D,NSECTS LXI H,CPMB RBLK MOVCOPY COM<EBIOS56 PRNcqrstuvwxy{|}PIP COM:XREF COME IS TO LOAD AND RUN THE MAIN ; CP/M DISK OPERATING SYSTEM AT THE TOP OF ; THE MEMORY IN USE. ; CPMVERS EQU 22 ;CP/M VERSIONSYSGEN COMXSUB COMSUBMIT COM EBIOS56 PRN #&'()*345678JCBOOT57 SYMnEBIOS57 PRNrstuvwxyz{}EBIOS57 HEXEBIOS57 PRN A,B OUT DDATA IN DSTAT RRC MVI A,1 JC ERROR MVI A,13H OUDUMP2 COMEBIOS56 SYMMOVCPM COMLDU2 COMN 14 OR 22 MSIZE EQU 56 ;MEMORY SIZE IN DECIMAL KB. ; DCOM EQU 0E8H DSTAT EQU 0E8H TRACK EQU 0E9H SECT EQU MAC COM\/01FORMATMWCOM +,-~CBOOT56 PRN$%29FORMATMWCOMQEBIOS57 PRNcEBIOS57 SYMT DCOM IN WAIT ORA A MVI A,1 JM ERROR IN DSTAT ANI 91H IBIOS PRL"DDT COM&CPMGEN SUB$$$ SUB0EAH DDATA EQU 0EBH WAIT EQU 0ECH ; IF CPMVERS EQ 22 BIAS EQU (MSIZE-20)*1024 CPMB EQU 3400H+BIAS CBIOS EQU CBOOT56 HEX;CBOOT56 SYM:EBIOS56 ASM<=>?@ABCDEFGHIMNEBIOS56 HEXUhz; TARBELL CP/M COLD START LOADER ; STANDARD VERSION OF 10-11-77 ; PROC TECH CUTER VERSION BY ED ELIZONDO 27 JUN 78 ; CP/M 2.2JNZ ERROR MOV A,C CALL READ RBLK1: JNZ ERROR DCR D JZ CBIOS INR C CPM56 COMDHARD2 BAKHARD SUBINSTALL COM:CPMB+1600H ELSE BIAS EQU (MSIZE-17)*1024 CPMB EQU 2900H+BIAS CBIOS EQU CPMB+1500H ENDIF ; NSECTS EQU 51 ;NUMIBIOSOLDPRL"DISKDEF LIB1\]^_`abEBIOS56 ASMROPQRSTXZijkEBIOS56 PRNKLVWY[cdefglmnop VERSION BY ED ELIZONDO 10/26/80 ; ; THIS PROGRAM IS LOADED AT LOCATION ; 0 BY THE BOOTSTRAP PROGRAM, AND RUN. ; IT'S PURPOS  MOV A,C CPI 27 JC RBLK2 MVI C,1 INR B JMP RBLK ; RBLK2: MOV A,C ×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! de"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O ;*********************************************************** ;* T 0FFH HLT ; ; ORG 7DH JMP 0 END A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_ CALL READ1 JMP RBLK1 ; ; READ1: OUT SECT IN DSTAT RRC MVI A,1 JC RERR 6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* * ;* EBIOS.ASM * ;* @ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR{ozg^#V) _{ozgi`N#Fogo&og_{_z#W MVI A,88H JMP READE ; READ: OUT SECT IN DSTAT RRC MVI A,1 JC R* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!?  DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i! * ;* COMPACT CBIOS FOR CP/M 1.4 & 2.2  ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOERR MVI A,8CH READE: OUT DCOM RLOOP: IN WAIT ORA A JP RDONE IN DDATA Mq=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? w( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸ * ;* (BASED ON R. VAN VALZAH'S BVIOS - CPMUG 38.2) * ;* T OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒOV M,A INX H JMP RLOOP ; RDONE: IN DSTAT RERR: ANI 9DH RET ; ; ERROR: CMA OUlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2  * ;* REV 1.15 07/10/82 E. ELIZONDO * 00 = FALSE EQU 0 FFFF = TRUE EQU NOT FALSE ; 0000 = REL EQU FALSE ;TRUE TO GENERATE~+ —NO FILE NAME~R w& ~ʰR w:\ʼ>2'~&!;  :'&FILE EXISTS ON DESTINATION DSK\pexHeader CRCWrite faultData CRCData overrunData header not foundHeader not foundWrong headWrong cylinderDrive not read>~>>~>|})P~ OÒ%!"&̀:ION, ASSUME CCP STARTS AT 0 ENDIF ; IF NOT REL ;OTHERWISE USE REAL CCP STAR ;*********************************************************** ; ; ; 0007 =  RELOCATABLE CODE 0002 = NODISKS EQU 2 ;NUMBER OF PHYSICAL DRIVES IN SYSTEM 0000 = CUTER EQU FALSE ;TRUE FOR>2[!2'# NEW FILE &&( !C MùWMBACKUP$$$h !\~2l:&wh&( *`'Q!'~\!Sm &!eyController BusỳS!"e!"e*e~2e:e*e*e#"e*e~A*e>Z*e~OG! MD*e~OGyw*e#"e:e2eé*e6O*&2&*&͟"&͖:ON#*&% :͛%:ě%:O<=N#=XP1)>t1)t2L'!9"`'FTING ADDR. ; IF CPMVERS EQ 22 9000 = BIAS EQU (MSIZE-20)*1024 ;STD DISTRIBUTION=2 REVMON EQU 07 ;PROGRAM REVISION MONTH 000A = REVDAY EQU 10 ;PROGRAM REVISION DAY 0052 = REVYR EQU 82 PROC-TECH CUTER SYSTEM 0000 = EPROM EQU FALSE ;TRUE FOR VDM & DIABLO DRIVERS IN PROM FFFF = MULTIO EQU TRUEm ͗¹ & !lS# ABORT (Y/N)? 0"LY͗c*`'!#h!&~5!l(6"M'h>*$0""M'~:k( ʍG#"!e"e*e*e##"eywx#w!"e*e~F*e~r*e> ғ*e~rÓ*ew#w!e*ee}o|g!MZ2DÇS*e~ʤ*e*##*0~#Ÿ~<ʲ+~#¯~dүҲ>2K':!F>wps#r#="9'*9'";'"='"?'"A*͓2D!9N#F#^#V#~#fo"jUkb"hUi`"fUOGtm603tm602tandonm10st412st506m5seagateq2040quantumhd561/2hd561/1ol ;PROGRAM REVISION YEAR ; 0016 = CPMVERS EQU 22 ;CP/M VERSION NUMBER (14 OR 22) 0038 = MSIZ ;TRUE FOR MORROW'S MULTIO I/O BOARD FFFF = H1500 EQU TRUE ;TRUE FOR HAZELTINE 1500 CONSOLE ; E EQU 56 ;MEMORY AND CP/M SYSTEM SIZE ; ; CONDITIONAL ASSEMBLY EQUATES ; 00e##"e:ew:e#wä*e*e#"e6)*e> !*e~!*e#"eä{nosofttestverifyBad sector size.size'& 2[2h2k2}*}&|g+"C':ENOT ENOUGH MEM|<<20'|d!"&'n)"('>2,'z2-'!]ivettims4020ms4010ms2012ms2006ms1012ms1006miniscribecm5640cm5619cm5616m16cmipyxis27pyxis20pyxis13pyxis7df516ami` COPYRIGHT (C) 1978 MICROPRO INTERNATIONAL CORPORATION MicroPro WORDMASTER release 1.06 serial # WM1147P4  ; CP/M ADDRESS COMPUTATION: ; IF REL BIAS EQU 0100H ;FOR RELOCAT Bad skew factor.skewBad head number.headBad track number.trackBad drive arg.drivèS!~w#~w!~w#~w!~D |*Z'A>ʞzz#ÑI"O'"R'P[ XL. T: KG GN *O'*T'*X'͹*3'A"X' DBASE ;FD1771 STATUS INPUT 00E9 = TRACK EQU DBASE+1 ;TRACK INPUT/OUTPUT 00EA = SECT EQU DBASE+2 ;SECTOR OUT='͛ Ҭ  >$! 0 $ "='$ I :& ͹ } :& C N N :& C k OINT CBIOS EQU CPMB+1500H ;CBIOS START ; ENDIF ENDIF  # TURKEY *R' *O'c'D; > > & E >5 [ & 2b'"O'y ȷկ m *O'":K'#ˆͪ !lUywx#w!~#fo~#!~#foN#F!~#foN#F*y!~#fo"e!~w#~w!~w#~w!~#fo~# ͪ !"T'"O'# QX?'!94STACK OVFL͠ Ç͠ >"?'A"='͛Í:\'/!2\'"X'͇(T*X'Q"X'>N5!xLHFQʳOʂEZA# ???*M'#$ù $#"O'h!6*O'""M'I"O''>';|T,V $*='+ ڕ ~ ˆ #*='þ ¬ > ͬ > $U ͕w# *%F  +"% /> g%/*;'͟*='{* ; ; ; COMPUTE NUMBER OF SECTORS TO LOAD ; 002C = DO "O'O'*O' ì #~+:¬  ʬ @# .!   "D"O'^ 4INVALID FILE NAMELIB#   0K C400 = CPMB EQU 3400H+BIAS ;CCP START CC06 = BDOS EQU CPMB+806H ;BDOS ENTRY POINT DA00 = CBIOS 2\'2'"X'~T!͂ *?'һͻ>}$$*='>{ܭ͟$#þ*X'*\'(*&+Q͖"\'"X'͵:\'!?'!!""T'*T'I"R'"O'ʐC,D2KxLTPTʚ*X'!͟BG/>2^'I"O'"R'F5N;RGSAUQʫ_'='*='+ ~ 33!='c'O, !='͍͒ h ? 3 ͕w# C s#r+*='*?'͟!='!='x͕zL͞kSSECT EQU (CBIOS-CPMB)/128 ; ; DISK I/O PORT NUMBERS ; 00E8 = DBASE >   ~ #L.:*? пC  !5' !3'͑þ_*3'"5'!3'͕) C !5'h *?'ͅ!5'͂ ͹͍(^EQU CPMB+1600H ;CBIOS START ; ELSE ; BIAS EQU (MSIZE-17)*;'!́!+|*X'|$+"X'*X':'#͵ J͖ J Jͨ _^# ## 'p7p*O'I"O'ȷp  pa*R'~   :b'C># :X'ͬ 'x *='< "=' *?'J "?' 6 GyOxG*=':c'g}o|g:c'o|gw  v #^ +ͫ#^ Q #`:&=u>(%Êi2&*& :&!&W*&ͣ$:&!&ڽl$ $*&"&Y:&!&/~ ҝ>^â> g%N#:&H :!J ͕Em,?  *:vTEFEE|`=2&:&<{ܗ$V͚$ :&WxV~# P!&4:=2+~#͚$2|*&l$*&,&"&7͕|33nx]Uʙ “$"&>2&:&9*& n]U !$N#ü$:+:&9]U*&͟]U&]+:&͂*X'S ͮ /< !&w? *&#q*&+"&2&ɯ2&u*&*&N%>2& V HK "]K iu"ŽFH!&~4*& tuL  V X*tnELL"T+VX "gV•͙ N#ͣ~ #*?'{͕yOxG;+ô:I'N#"#:I':!J':I'%!%"!$*&$:&!&5!&5]U> $ "&!"&!&~#6> $N#*% ʄ $:&!&54!&!&~ |"X'*X'!\'z5~/͕}K zK!;'*='N#͔v z9#2'͵\!"'"X'"V':\'!*')>M> u"òͲ ڛ"u ʦ Ûuڬx2&Ϳ~xu u"?'͛   |ʬ2&*&!"&*V':&.>2&:&<ð!&!&P>(2>> 22&>22J'7WM HLP%!2&! &¢>2&&¢4k:&ڒ:&ͻ:&G:&xʣGxҸ:&!&xڸ> G > !J ~G@ @0 0 !"&26 (":&ʀ !&6*&2&:&=<څ!"&"&*&"&z2&*&"&*V'*='|$"E'͌*&"&͞"&͙"&: Êī# „„7>  á+ī ››7>~>"7)"LA?[*;'͟*A'#͟*='#!"&!&~/w!"&dʹ0 > ʫ %*& !$ͬ W|y yG:&xs z Ã:&!&2X*&!"&o*V'G!&:&.W!"&n"&b*&q!"&:&*&+t*&"&:&%:&WM.HLP NOT FOUND ON DEFAULT OR A:&!'ͩ &!'͏!'~#$=ºâʹ&f 4FILE NOT FOUND#&:2&2&% % %| +2_':&!&8>w!%!&5Gu6ʹ2&u!&~6d!&6k6r6@I!&~6ʨ&"&n I͚$Ï  !&4:=Ҟ+~#͚$Þl$I ͚$+ !&4 *='ͅx~# ͟ ;'(*?'͟?'4PUTCUR ERR`+6d!&~6W!&~Tw2&t:&*&"&X:&¤*&>{ܭV"&*&"&*='++=—O:&| $͢ tn > ͬ > ì !&~6!&͚$L: &!'ͩ ͏O') (&f !?'ͼ͕|*V' ͟+^&!C{(t*V'͇3{&2!͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&ecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk SxCOPYRIGHT (C) 1978, DIGITAL RESEARCH  o&)))))))a{İ [7ĩ ~wʣ#‘7> >:[!&7:\':&:&7^!;'*;'#&Ͱ ";' *('͕͟!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*l *V'#(#:\'M:\'7^^;͑;ԑ:\';'?'*/'`i͟ !_'4F!.'=O:-'=G L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\Ltatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On __> ̓> ̓͊~̓#ÚO****!*$*'! ">2!4:(wNͯ>23 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTPTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos *;'s*&* '͟&+5!8/!* '#" '";'!"E'!C'I*A' U~:-'GO ~z o*AR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid:)!4f!^!*FNͷyj*DMͿ2: K!͚u c͊<2:\_/:)j*"1!u͚:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics6*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:'ͪ–:&W< zÛ̓ҥ*"'͟ҽ\!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM > Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË:] \<œ!x͕c2|\ ¢! DMͿ\õ!͕c!͕u AnA2Aͦ͊!5536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRvO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"> ͕ͪ!͟*(')!C' \!C'x=ͪsy\ͪs!C'*A'vԏk2&"A' _#&7!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4 ͚u c͊2!?͚!͕u cA7nA2Aͦ!͕u c͊!6!?͚>ͦ͊!Q͕SYSGEN VER MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ>  ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7*ATION DISK ERROR EXIT $ +SOURCE ON A +OBJECT ON B +TYPE $ $0:_:l2O :lO 2:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A2.0SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A**x*́͋<͛ :%*=26͋!7^#6 #6 #6$ 8*7~O #w# !6:6=:O͍:O:O/ :<2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ>  ON , THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A, B, C, OR D)NO SOURCMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> 2% ͋*-"*$$$ SUBq:(=2(N *$*& w*$#"$*&#"&' !"N*M^7 !)6:!)ھ *N*DM͆ MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> W Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$:y*###ƒ# yk E FILE ON DISKSOURCE FILE INCOMPLETE:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A2*ʭ :*ʗ ͯ *N"P*6:2)÷ *N"N!) $@BA$! A "!$"":O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A  җ 4!~=ŐW!xʵ ~#èbx {~#o}où.xsubb!np+q*m2_!pp+q*o$ +COMPARE ERROR ON TRACK $(HEX) SECTOR $PERMANENT $+PERMANENT SOURCE DISK ERROR EXIT $+PERMANENT DESTINMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ>    :O͓:O:O5:2!!*͖!** T# DD :9 )>:<2 INX JC JM JMP JNC JNZ JP JPE JPO JZ L LDA LDAX LHLD LXI M MACROMOD MOV MVI NOP NOT OR ORA ORG ORI?0:?G~ʛʝÍ7#^#V2*w#"*A!^{ ,#ø:, ,,!>2^{    ,!4~  :O͓:O:O5:2!!*͖!** T# DD :9 )>:<2 !"!"! """*+"""A!"*{#¸*"~°7ɷ*"*{#** OUT PCHL POP  GMD!*"͋  ò *"͋> ë!*"͋   *"͋> OUT PCHL POP PSW PUSH RAL RAR RC RET RLC RM RNC RNZ RP RPE RPO RRC RST RZ SBB SBI SET SHL SHLD SHR S:<2,#W!"G:x<2x*yp#"y  , ,J>2 , ,,,:<28A k x'D; GMD!*"͋  ò *"͋> ë!*"͋   *"͋>ͻ"7*" *^#V!ͻu^#V+!ͻ7"##^#V+!ͻk##N͊*##*s#r*" GMD!*"͋  ò *"͋> ë!*"͋   *"͋>1 {͏ͣ͂/{!v͉xA*"*6*Z*^#V"n*"~0^,#\ ,,*##">2x*^#P SPHL STA STAX STC SUB SUI TITLEXCHG XOR XRA XRI XTHL SYMBOL TABLE ERROR $OD MOV MVI NOP NOT OR RA ORG ORI] x x$x(x)x+x-x*x/x,x:x"A ACI ADC ADD ADI ANA AND ANI B C CALL CC CM CMA CMC CMP CNC CN :O͓:O:O5:2!!*͖!** T# DD :9 )>:<2 *##k*}o|g"*ͻ**s#r*">w#º*"**ͻ*ͻ*"}o|g"*" :O͓:O:O5:2!!*͖!** T# DD :9 )>:<2 V!ͻA!6 ^,#•*##":x=2x{*^#V!ͻ"W ,nW!{> w# !{"y>2x:͏ͣ͂ OUT PCHL POP PSW PUSH RAL RAR RC RET RLC RM RNC RNZ RP RPE RPO RRC RST RZ SBB SBI SET SHL SHLD SHR SZ CP CPE CPI CPO CZ D DAA DAD DB DCR DCX DI DS DW E EI END ENDIFENDM EQU H HLT IF IN INR  GMD!*"͋  ò *"͋> ë!*"͋   *"͋>!*{8>w#w#w*"*DM**ͻ -w#8'dddd dd60{_zWs4f{_zW#A[ GMD!*"͋  ò *"͋> ë!*"͋   *"͋>){)ͪ:  $$͏ͣ͂/{/ ͏ͣ'D͏ͣ'D ͏ͣ ] ͯ*#"\́ʍ7!*ͻʣ~#"\¹!"Ü7|}SYOL TABLE ERROR $OD MOV MVI NOP NOT OR RA ORG ORI  ( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0vO0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ* r+s!06#wÚ> 209!e/~6![0~6". :0: 0,!0699*.~6 *.: 0,Ĵ".2f/*.s#r2  ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0ww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":00N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬ: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0X06 '>#G*I0!" :0 :Z0 !0N*K0:O0[02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0  2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R  *V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0m :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0, 'd ! ^#V#*0}o|g*  ":D x=D y0P 2!0^4! 0q :0Ė: 0,; Ė*I0m |}sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į   % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r :0!4 :0& : 0::0!xI !4̨ e ::̮>͞ } !~5:Į ͵>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦:$† ͌oy Ԍ͋ 8O͖ Ăy01y 1m X:0 : 0, >C͘%:0 : 0 v;:0:0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:."X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ :0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:   : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0*""J͊!/6 !/͒%:^0*z& ~2y :yHڪ!z4>>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ=2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:=*&')$$=O4MEM SHORTAGE, TRY CLEARING QBUFI͕ͽ)JzJ3@3T!;'͕y&/! *E'*='|."V0s#r+*.s#r*V0##~_"V0!.".>2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:.: HHGͫ: 2%::ͭ :GF:2Äv!.q!^*8!g*6: >͆ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O-!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uMß*G'*?'͟='͟!;'*&* '͟ҷ" '!?'|*"'͟""'*$'͟"$'*&*~|`i)\ copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Comm!q*&̓ ̓ ̓!p+q͓* ̓ ̓!q*&̓!p+q*͆2!p+q*͆2!p+q*͆20Ģ*R0̜*R0ĜG:O0xě%:/ *R0̍:xz*P0#"P0E2D20:b!^4!/wv ~_{ozg001 $$$$ SUBʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z͕ͅ͏ ++s#r#s#r##͕ͅ##^#V.r+s+r+s!3'͟܆!D'͟Ԇ!3'#͟+sͼͬb!A'͟+and Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q*͆2!p+q*̓!p+q*͆!p+q*͆!p+q*͆2!p+q*̓!6 ̓ ͆ ̓jj*R0!6zz{z4A_A?ɯ2.2*T0"V0!.8w# *V0*K0{zҤ*b0+"X0 =$*::=H (ͫ!6:*D͈!B6::3/HY!6:> !/>HH;ͫ:6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:} >ڦÚ!p+q*DM͞:̓ ̓:}2:~!!:*& N̓!4!6::*X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~gO>Gg%64+4:=5+42&Þ%2&O> #ɩ%%%Ñ#>!$>͛%2&*%~ʹ#͛%²#ʹ#͛%>#2&>#!*J y:&#N###4INTERRUPTEDN#!0000 = HOMECMD EQU 0 ;RESTORE (HOME) COMMAND 0010 = SEEKCMD EQU 10H ;SEEK TRACK COMMAND 0088 = READC!!~ 6w< !x7ʩ!: ! q#~w\'"#+ʹ!-!>ù!+"Z'"##"+)""~)" "#bk))"0_ C321ED JMP LIST ;LIST OUT (FROM REG C) EA12 C3AFEC JMP PUNCH ;PUNCH OUT (FROM REG C) EA15 C39DEC JMP READER ;PA|DMx++^#V#~#fo++ÕGz¨{x͟ڶ!|7͟ʱڱ|7N#$#$c 0$e$0$$?$ b$:& b$N#:9b$> e$b$N#T$l$$ G:&Ox ƒ$yMD EQU 88H ;READ IBM FORMAT 00A8 = WRITCMD EQU 0A8H ;WRITE IN IBM FORMAT 00D0 = FINTCMD EQU 0D0H ;FORCE INTE"!"Z'"X'4NUMBER TOO LARGE0?:!&~w!l(Oy";ܾ>"$ " "!>"m"t""$~"ƒ"PER TAPE READER IN (TO REG A) EA18 C338EB JMP HOME ;MOVE DISK HEAD TO TRACK 00 EA1B C34FEB JMP SELDSK ;SELECT THE D+6&<CLOSE ERR&   ( <DIRECTORY FULL_:K'{b ѷl  $> $RRUPT 000A = RETRIES EQU 10 ;NUMBER OF DISK RETRIES ; ; OPTION BITS WITHIN COMMANDS >$”""ù ¹""G͹ x"ʙ""G"͹ è""$þʳw# y <+~ "> $ 2k(6x$2&~"#" PUT 00EB = DATA EQU DBASE+3 ;DATA INPUT & OUTPUT 00EC = WAIT EQU DBASE+4 ;DATA SYNCRONIZATION & INTRQ INPUT  <:K'RENAME FAILUREʹ 5!$ %>~l$%# >>*% )%!%[% H%#~<5%+6> g%4:&7%[% [% [%>^g%@"% g%͛%t%!& ʆ% „ ; 0008 = LOADHEAD EQU 08H ;LOAD HEAD WHILE SEEKING 0002 = RATE EQU 10B ;STEP RATE OF 10MS. ##~$##*%~@#6#~<7#!%"%N#ʹ#͜#A##ʕ#*%~ƒ#ʹ#Ĝ#O#w#~!#͕ |<^!s#r7>G!"͕}O)|! ʠ!09 C330EC JMP CONIN ;CONSOLE CHARACTER IN (TO REG A) EA0C C3CFEC JMP CONOUT ;CONSOLE CHARACTER OUT (FROM REG C) EA0F   ; ; VDM EQUATES ; CC00 = SCREEN EQU 0CC00H ;STARTING SCREEN ADDRES1633 MVI D,NSECTS 0008 2100C4 LXI H,CPMB 000B 78 RBLK MOV A,B 000C D3EB  IF CPMVERS EQ 22 9000 = BIAS EQU (MSIZE-20)*1024 C400 = CPMB EQU 3400H+BIAS DA00 = ARD * ; ACE#2 DRIVING DC HAYES SMARTMODEM * ; ACE#3 DRIVING HAZELTINE 1500 AS SE IS TO LOAD AND RUN THE MAIN ; CP/M DISK OPERATING SYSTEM AT THE TOP OF ; THE MEMORY IN USE. SOUT EQU 0C019H ;CUTER SYSTEM OUTPUT PORT C01C = AOUT EQU 0C01CH ;CUTER OUTPUT PORT C800 = CRAM EQU S 00C8 = SCRLPT EQU 0C8H ;SCROLL PORT ; ; CUTER EQUATES ; C019 = OUT DDATA 000E DBE8 IN DSTAT 0010 0F RRC 0011 3E01 MVI A,1 0013 DA7700  CBIOS EQU CPMB+1600H ELSE BIAS EQU (MSIZE-17)*1024 CPMB EQU 2900CRT TERMINAL * ; ; MULTIO ADDRESS PORTS ; 0010 = BASE: EQU 10H ;B ; 0016 = CPMVERS EQU 22 ;CP/M VERSION 14 OR 22 0038 = MSIZE EQU 56 ;MEMORY SIZE IN DECIM0C800H ;START OF CUTER RAM AREA ; ; PROM DRIVERS ENTRY POINTS F000 = INITDR EQU 0F00 ; TARBELL CP/M COLD START LOADER ; STANDARD VERSION OF 10-11-77 ; PROC TECH C JC ERROR 0016 3E13 MVI A,13H 0018 D3E8 OUT DCOM 001A DBEC IN WAIT 00H+BIAS CBIOS EQU CPMB+1500H ENDIF ; 0033 = NSECTS EQU 51 ;NUASE ADDRESS 0010 = RBR: EQU BASE ;RECEIVER BUFFER REGISTER (IF DLAB=0) 0010 = THR: EQU BASE ;TRANSMITTER BUFAL KB. ; 00E8 = DCOM EQU 0E8H 00E8 = DSTAT EQU 0E8H 00E9 = TRACK EQU 0E0H ;INITIALIZE DRIVERS F003 = VDMDR EQU 0F003H ;VDM DRIVER F006 = DIABDR EQU 0F006H ;DIABLO DRIVER UTER VERSION BY ED ELIZONDO 27 JUN 78 ; CP/M 2.2 VERSION BY ED ELIZONDO 10/26/80 ; 1C B7 ORA A 001D 3E01 MVI A,1 001F FA7700 JM ERROR 0022 DBE8 IN MBER OF SECTORS. 0000 ORG 0 0000 310001 BOOT: LXI SP,100H 0003 010200 BOOT1: LXI B,2 0006 FER REGISTER (IF DLAB=0) 0010 = DLL: EQU BASE ;ACE BAUD DIVISOR LSB (IF DLAB=1) 0011 = IER: EQU BASE+1 ;INT9H 00EA = SECT EQU 0EAH 00EB = DDATA EQU 0EBH 00EC = WAIT EQU 0ECH ;  ; ; MULTIO BOARD EQUATES ; ; ACE#1 DRIVING DIABLO PRINTER W/SERIAL BO ; THIS PROGRAM IS LOADED AT LOCATION ; 0 BY THE BOOTSTRAP PROGRAM, AND RUN. ; IT'S PURPODSTAT 0024 E691 ANI 91H 0026 C27700 JNZ ERROR 0029 79 MOV A,C 002A CD5700  ERRUPT ENABLE REGISTER (IF DLAB=0) 0011 = DLM: EQU BASE+1 ;ACE BAUD DIVISOR MSB (IF DLAB=1) 0012 = IIR: EQU TUS PORT. 0004 = CDATA2 EQU 4 ;CONSOLE 2 DATA PORT. 0002 = CKBR2 EQU 00000010B ;KEYBOARD READY BIT. 0001 =TTER HOLDING REGISTER EMPTY BIT ; ; ; CONSOLE #1 EQUATES (CONSOLE#1: KBD+VDMH ;LINE FEED 000C = FF: EQU 0CH ;FORM FEED 007F = DEL: EQU 7FH ;DELETE (RUBOUT) ; IT 0006 = BAUD1: EQU 6 ;BAUD RATE FOR ACE #1 (19.2 KBAUD) 0180 = BAUD2: EQU 384 ;BAUD RATE FOR ACE #2 (300RT 0002 = RRBIT EQU 00000010B ;READER READY BIT ; ; PRINTER EQUATES BASE+2 ;ACE INTERRUPT IDENTIFICATION REGISTER 0013 = LCR: EQU BASE+3 ;ACE LINE CONTROL REGISTER 0014 = MCR:  CPTR2 EQU 00000001B ;CONS OUTPUT RDY BIT. ; ; MODEM EQUATES ; 0000) ; 0000 = CSTAT1 EQU 0 ;CONSOLE 1 STATUS PORT. 0003 = CDATA1 EQU 3 ;CONSOLE 1 DATA PORT.  ; CP/M RAM ASSIGNMENTS ; 0003 = IOBYTE EQU 0003H ;LOCATION OF IOBYTE ;  BAUD) 0006 = BAUD3: EQU 6 ;BAUD RATE FOR ACE #3 (19.2 KBAUD) 0003 = WFMT: EQU 0000$0011B ;WORD FORMAT - 8  ; 0000 = PSTAT EQU 0 ;PRINTER STATUS PORT 003C = PTBE EQU 00111100B ;PRINTER TRANSMITTER BUFFER EMPTY BIT EQU BASE+4 ;ACE MODEM CONTROL REGISTER 0015 = LSR: EQU BASE+5 ;ACE LINE STATUS REGISTER 0016 = MSR: EQU BASE = MSTAT EQU 0 ;MODEM STATUS PORT. 0001 = MDATA EQU 1 ;MODEM DATA PORT. 0040 = MRDY EQU 01000000B ;M 0001 = CKBR1 EQU 00000001B ;KEYBOARD READY BIT. 0080 = CPTR1 EQU 10000000B ;CONS OUTPUT RDY BIT.  ; DEFINE CBIOS RAM AREAS ; ; NON-INITIALIZED RAM ; SEE ALSO - AREDATA BITS, 1 STOP BIT, NO PARITY 0000 = IMASK EQU 0000$0000B ;INTERRUPT MASK (ALL DISABLED) 0001 = DR: EQU 0 ; ; FRONT PANEL SENSE SWITCHES EQUATES ; 00FF = SENSE EQU 0FFH ;IMS+6 ;ACE MODEM STATUS REGISTER 0017 = GRPCTL: EQU BASE+7 ;GROUP CONTROL PORT ; ; ODEM DATA READY BIT. 0080 = MTBE EQU 10000000B ;MODEM XMTR BUFFER EMPTY BIT ; ; TAPE ; ; CONSOLE #2 EQUATES (CONSOLE#2: VIO-X) ; 0005 = CSTAT2 EQU 5 ;CONSOLE 2 STAA PAST JUMP TABLE FOR INITIALIZED RAM ; 0004 ORG 4H ;THIS IS WHERE CP/M STORES THE 0004 000$0001B ;DATA READY BIT 0010 = CTS: EQU 0001$0000B ;CLEAR TO SEND BIT 0020 = THRE: EQU 0010$0000B ;TRANSMIAI ; ; ASCII EQUATES 000D = CR: EQU 0DH ;CARRIAGE RETURN 000A = LF: EQU 0A ; MULTIO ACE CONTROL & STATUS BITS ; 0080 = DLAB: EQU 1000$0000B ;DIVISOR LATCH ACCESS B READER EQUATES ; 0000 = RSTAT EQU 0 ;READER STATUS PORT 0002 = RDATA EQU 2 ;READER DATA PO  DISKNO: DS 1 ;CURRENTLY LOGGED DRIVE ; 0040 ORG 40H ;SCRATCH AREA FOR CBIOS 0040 IODe!~w#~w >2e2eÂ>2e2eÂ>2e2eÂ>2e2eÂ! Â!!~#foN#F*y !~w#~w>2e2*y!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F$yʢ:e*e####~OG! !eyx#"piþ áS͋S!["ti!]:ti:ui8 *ti!~*ti####"ti áS Head: error. Track: Format timeout.͋S!~#fo"ti!~#fo"pi!OMMENT BLOCK. ANY REGISTERS NOT MENTIONED ARE PRESERVED. ; ; DA00 ORG CBIOS ;ORGf !*f*fe *f#"f !e~#< ÇS*f#"f ! !]"0W>22W*f"f!f:f:f# *fͬ*e"f!f:e:e# DS 2 ;DMA ADDRESS ; ; ; ; ; ROUTINES WITHIe !!~#foN#F*y9 !~w#~w>2e2e ͪ ͑"ÇSUsage: formatmw drive-type [arguments] Morrow Designs â!- !~w#~w !!~#foN#F*yʺ!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F~#fo"ri:e2,W2-W2.W*pi}/o|/g}og))!eyOx#Gy@Oy2/W*e :ti:ui# :/W2/W*e :ti:ui# :/W2/W!W*e ~OG~w#~wÔ!N#F!~w#~w}ʮ!T!~#foN#F*y!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@! !*f*f͓*f#"fr ÇS*f#"fU ̀S!9!w#w!!e  # !~#fo))[ *e#}!~w#~wý !!wN THE CBIOS MAY BE INTERNALLY REFERENCED (CALLED ; FROM WITHIN THE CBIOS), EXTERNALLY REFERENCED (CALLED BY CP/HDDMA format/test program. Version 1.7 ̀S!p !H 2DÇS ̀S!N#F! !2DÇSChecking format. Formatt$y/:e/!e>@>#7/! !~w#~w !!~#foN#F*yG!~# !~w#~w!~w#~w! !e! }/o|/g}23W*e}/o|/g}24W*e!KM }/o|/g}25W:ri26W>27WͫyP!U :8WOGy_xháS:8WOGi`)xW N#F!E ~#foN#F$yV:eV!e>>#^V !e~#? ͗ ? !?!~#foN#F*yn!~# !~w#~w!~w#~#w~#~!!e  #Y !~#fo))[ ~OG:e:e\ !!~#fo#*e͒M}| ÇS!~#fo))[ !N#F!~w#~wM) ; OR BOTH. ANY ROUTINE WHICH IS EXTERNALLY REFERENCED IS ; ASSUMED TO CLOBBER ALL REGISTERing. ̀S=*e ~#fo *e( !W*e ~OG KM"eV:eM :ej 2f2f*e##~#fo "fv *e"f*e"f:eƒ :!~#foN#Fͮ@!~#foN#F$*eMD!tR! !~w#~w !!~#foN#F*y!~w#~w>2e2e 2e2*tiP!= *piP!; áS̀S!"f> 2 f2 f>28W*! f~#:8WÇSÇS*f:f2f: f2 f}: fw! !e!~#foN#Fͮ@!~#foN#F$y:e*e##~#fo !eyx# !E !~w#~w !(!~#foN#F}!!~#fo*e *e͒M}| ͋S!~#fo"ti!["pi!]:pi:qi *pi*ti}og}*pi *ti!2N}og}*pi####S. REGISTER USAGE OF ROUTINES ; REFERENCED ONLY INTERNALLY IS DECLARED IN THE PRE-ROUTINE ; Ce¥ 2e2e*e####~OGi` "eñ *e"e*e"eͭ !["0W! *f"f!f:f:f## *fͬ*fͪ *e"f!f:e:e#2 * 2 f: f2 fDrive not ready.Can't read drive status.Controller does not respond.͋S>P2ti2ui*ti*ti#"ti,WyOGyw*ti*tw>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘% k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DMóf:.O*.~H:.=!4>͕%0:/#".R͆%2G:0xa{_ ʇ ʇ:0x҇_<20DM oͱ*DM ͱ*N#F ͱ * N#F ͱ͠!p+q͠*DM':͐ͫZ"!6> *} *Moolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0i#"ti!,W!]N}og}*ti*ti#"ti6:e2,W2-W2.W>22W*e}23W*e ~24W*e ~25W*e!KM }26W>27W!,W"9-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55 =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*!/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >W>2;Wͫy!9 >27Wͫy+!  :8WOGy?! áS̀S!!,W!ɯo>g͌"!6ů{_zW5>#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :22 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 yp22W*e}<)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌rP'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2 h&:0¬: 0$ʦ!*R0 >P͘% >U̘%>: 2 3>E͘%>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 79 RBLK2: MOV A,C 0042 CD4800 CALL READ1 0045 C32D00 JMP RBLK1 ; >F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;:P CBOOT ;FROM COLD START LOADER DA03 C3ECDA WBOOTE: JMP WBOOT ;WARM BOOT ENTRY DA06 C392DC JMP CONST ;CONSOLE STATUS 0Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; , TO START OF CBIOS AREA IF CPMVERS EQ 22 MACLIB DISKDEF ;FOR CPM 2.2 ENDIFo2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~  ; 0048 D3EA READ1: OUT SECT 004A DBE8 IN DSTAT 004C 0F RRC 004D 3E01  CALL READ 002D C27700 RBLK1: JNZ ERROR 0030 15 DCR D 0031 CA00DA JZ CBIOS 0034 ;REG A = 000H IF NO CHARACTER READY ;REG A = 0FFH IF CHARACTER IS READY DA09 C360DC 202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^— ; ; I/O JUMP VECTOR ; THIS IS WHERE CPM CALLS WHENEVER IT NEEDS ++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0> MVI A,1 004F DA7400 JC RERR 0052 3E88 MVI A,88H 0054 C36300 JMP READE  0C INR C 0035 79 MOV A,C 0036 FE1B CPI 27 0038 DA4100 JC RBLK2 JMP CONIN ;CONSOLE CHARACTER IN (TO REG A) DA0C C3F1DC JMP CONOUT ;CONSOLE CHARACTER OUT (FROM REG C) DA0F C33BDD ́:[0  <¨!~4 >¼!~5 : >20>V>O>I>B͘% ; TO DO ANY INPUT/OUTPUT OPERATION. ; USER PROGRAMS MAY USE THESE ENTRY POINTS ; ALSO, BUã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04 ; 0057 D3EA READ: OUT SECT 0059 DBE8 IN DSTAT 005B 0F RRC 005C 3E01  003B 0E01 MVI C,1 003D 04 INR B 003E C30B00 JMP RBLK ; 0041 JMP LIST ;LIST OUT (FROM REG C) DA12 C3D1DC JMP PUNCH ;PUNCH OUT (FROM REG C) DA15 C3BFDC JMP READER ;PAPER TAPE RE!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>T NOTE THAT THE LOCATION OF THIS ; VECTOR CHANGES WITH THE MEMORY SIZE. ; DA00 C383DA JM>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄ MVI A,1 005E DA7400 JC RERR 0061 3E8C MVI A,8CH 0063 D3E8 READE: OUT DCOM 0 ADER IN (TO REG A) DA18 C33ADB JMP HOME ;MOVE DISK HEAD TO TRACK 00 DA1B C351DB JMP SELDSK ;SELECT THE DISK GIVEN BYDPB0 ;DIR BUFF,PARM BLOCK DA46+1BDEFCDD DW CSV0,ALV0 ;CHECK, ALLOC VECTORS DA4A+69DA0000 DPE1: DW XLT1,0000H ;TRANSLATE T IF CUTER LASTCH DB 0 ;LAST CHARACTER TO CONSOLE ENDIF ;  DA77+08 DB 8 DA78+0E DB 14 DA79+14 DB 20 DA7A+1A DB 26 DA7B+06 DB 6  ; ;***********************NOTE: THE FOLLOWING BYTES MUST ; BE IN ADJACENT RAM LOALLOC0 DA64+00 DB 0 ;ALLOC1 DA65+1000 DW 16 ;CHECK SIZE DA67+0200 DW 2 ;OFFSET DA69+= XL REG C DA1E C348DB JMP SETTRK ;SET TRACK ADDRESS (0,...76) FOR I/O DA21 C34BDB JMP SETSEC ;SET SECTOR ADDRESS (1,...ABLE DA4E+00000000 DW 0000H,0000H ;SCRATCH AREA DA52+7CDD5ADA DW DIRBUF,DPB1 ;DIR BUFF,PARM BLOCK DA56+4ADE2BDE DW C IF MULTIO DA39 00 LCOUNT DB 0 ;PRINTER LINE COUNT ENDIF ;  DA7C+0C DB 12 DA7D+12 DB 18 DA7E+18 DB 24 DA7F+04 DB 4 DA80+0A DB 10 CATIONS ; AND NOT CROSS A 256 BYTE PAGE BOUNDRY DA33 IOT DS 1 ;TRACK DA34 IOS DS 1 ;ST0 EQU $ ;TRANSLATE TABLE DA69+01 DB 1 DA6A+07 DB 7 DA6B+0D DB 13 DA6C+13 DB 19 26) FOR I/O DA24 C369DB JMP SETDMA ;SET DMA ADDRESS FOR I/O DA27 C372DB JMP READ ;READ A SECTOR DA2A C36FDB JMSV1,ALV1 ;CHECK, ALLOC VECTORS DISKDEF 0,1,26,6,1024,243,64,64,2 DA5A+= DPB0 EQU $ ;DISK PARM BLOCK ; IF CPMVERS EQ 22 DISKS 2 DA3A+= DPBASE EQU $ ;BASE OF DISK PARAMETER BLOCKS  DA81+10 DB 16 DA82+16 DB 22 DISKDEF 1,0 DA5A+= DPB1 EQU DPB0 ;EQUIVALENT PECTOR DA35 SELREQ DS 1 ;CURRENT DRIVE SELECT REQUEST DA36 00 LASTSEL DB 0 ;LAST DRIVE ACTUALLY SELECTED D DA6D+19 DB 25 DA6E+05 DB 5 DA6F+0B DB 11 DA70+11 DB 17 DA71+17 DB 23 P WRITE ;WRITE A SECTOR IF CPMVERS EQ 22 DA2D C32ADD JMP LISTST ;RETURN STATUS OF LIST DEVICE DA30 C36 DA5A+1A00 DW 26 ;SEC PER TRACK DA5C+03 DB 3 ;BLOCK SHIFT DA5D+07 DB 7 ;BLOCK MASK DA5E+00  DA3A+69DA0000 DPE0: DW XLT0,0000H ;TRANSLATE TABLE DA3E+00000000 DW 0000H,0000H ;SCRATCH AREA DA42+7CDD5ADA DW DIRBUF,ARAMETERS 001F+= ALS1 EQU ALS0 ;SAME ALLOCATION VECTOR SIZE 0010+= CSS1 EQU CSS0 ;SAME CHECKSUM VECTOR SIZE A37 01 DHPOS DB 1 ;HEAD POSITION TABLE DA38 DS NODISKS-1 ;STORAGE FOR DISKS B THRU D ;  DA72+03 DB 3 DA73+09 DB 9 DA74+0F DB 15 DA75+15 DB 21 DA76+02 DB 2 5DB JMP SECTRAN ;SECTOR TRANSLATE ENDIF ; ; INITIALIZED RAM AREAS  DB 0 ;EXTNT MASK DA5F+F200 DW 242 ;DISK SIZE-1 DA61+3F00 DW 63 ;DIRECTORY MAX DA63+C0 DB 192 ;  DA69+= XLT1 EQU XLT0 ;SAME TRANSLATE TABLE ENDIF ; ; COLD BOOT  RATE INTO BC DA99 CDD7DA CALL ACEINIT ;INITIALIZE ACE#1 (DIABLO) DA9C 3E02 MVI A,2 ;INITIALIZE ACE #2 DA9E D317 B ;BUMP COUNTER JNZ CLERA ;CLEAR 256 BYTES MVI B,0BH ;GET VDM CLEAR COMMAND 9000 BIAS 0000 BOOT 0003 BOOT1 DA00 CBIOS C400 CPMB 0016 CPMVERS 00E8 DCOM 00EB DDATA 00E8 DSTAT 0077 ERROR 0038 MSIZE 0033 NS CONSOLE 2 DATA PORT DA8A DB02 IN RDATA ;CLEAR READER DATA PORT DA8C DB01 IN MDATA ;CLEAR MODEM DATA PORT DA8E ; 007D ORG 7DH 007D C30000 JMP 0 0080 END  ; EXTERNALLY REFERENCED ; THIS SECTION IS EXECUTED WHENEVER RESET AND RUN ; IS P065 DBEC RLOOP: IN WAIT 0067 B7 ORA A 0068 F27200 JP RDONE 006B DBEB IN  CALL AOUT ;SEND IT ENDIF ; IF EPROM ;IF DRIVERS IN PROM ECTS 000B RBLK 002D RBLK1 0041 RBLK2 0072 RDONE 0057 READ 0048 READ1 0063 READE 0074 RERR 0065 RLOOP 00EA SECT 00E9 TRACK 00EC AF XRA A ;COME UP ON DRIVE A DA8F 320400 STA DISKNO ; IF CUTER  START ; ENDIF ENDIF ; ; ; COMPUTE NUMBER OF SECTORS TO LOAD ; DOSSECT EQU (CBIOS-CPMB)/128 ; ; DISK I/O PORT NUMUSHED, AFTER THE COLDSTART LOADER READS IN ; THE CPM SYSTEM. ; CBOOT: DA83  DDATA 006D 77 MOV M,A 006E 23 INX H 006F C36500 JMP RLOOP ; CALL INITDR ;INITIALIZE THEM ENDIF ; IF MULTIO ;IF MULTIO BOARD D WAIT  OUT SCRLPT ;INITIALIZE VDM SCROLL PORT MOV B,A ;CLEAR B LXI H,CRAM ;POINT TO CUTERBERS ; DBASE EQU 0E8H ;BASE ADDRESS OF CONTROLLER CARD COMMAND EQU DBASE ;FD1771 COMMAND OUTPUT STATUS EQU DBASE ;FD1771 STA310001 LXI SP,100H ;SET STACK FOR INITILIZATION ;NOTE: SOME RAM INITIALIZATION HAS BEEN DB'D  0072 DBE8 RDONE: IN DSTAT 0074 E69D RERR: ANI 9DH 0076 C9 RET ; A92 3E01 MINIT: MVI A,1 ;INITIALIZE ACE #1 DA94 D317 OUT GRPCTL ;SELECT GROUP 1 DA96 010600 LXI B,BAUD1 ;BAUD8H ;LOAD HEAD WHILE SEEKING RATE EQU 10B ;STEP RATE OF 10MS. ; ; VDM EQUATES ; SCREEN EQU 0CC00H ;STARTING SCREEN ADDRESS  RAM CLERA: MOV M,A ;CLEAR MEMORY BYTE INX H ;BUMP MEMORY POINTER INRTUS INPUT TRACK EQU DBASE+1 ;TRACK INPUT/OUTPUT SECT EQU DBASE+2 ;SECTOR OUTPUT DATA EQU DBASE+3 ;DATA INPUT & OUTPUT WAIT E ;INTO THE RAM DEFINITION ABOVE DA86 DB03 IN CDATA1 ;CLEAR CONSOLE 1 DATA PORT DA88 DB04 IN CDATA2 ;CLEAR ; 0077 2F ERROR: CMA 0078 D3FF OUT 0FFH 007A 76 HLT ;   SCRLPT EQU 0C8H ;SCROLL PORT ; ; CUTER EQUATES ; SOUT EQU 0C019H ;CUTER SYSTEM OUTPUT PORT AOUT EQU 0C01CH ;CUTER OUTPUT P EBIOS.ASM * ;* * ;* 0000B ;DIVISOR LATCH ACCESS BIT BAUD1: EQU 6 ;BAUD RATE FOR ACE #1 (19.2 KBAUD) BAUD2: EQU 384 ;BAUD RATE FOR ACE #2 (300 BAEL ;OTHERWISE USE REAL CCP STARTING ADDR. ; IF CPMVERS EQ 22 BIAS EQU (MSIZE-20)*1024 ;STD DISTRIBUTION=20K CPMB EQU 340070010 :1000300015CA00DA0C79FE1BDA41000E0104C30B6D :100040000079CD4800C32D00D3EADBE80F3E01DA8A :1000500074003E88C36300D3EADBE8SIZE ; ; CONDITIONAL ASSEMBLY EQUATES ; FALSE EQU 0 TRUE EQU NOT FALSE ; REL EQU FALSE ;TRUE TO GENERATE RELOCATABLE CODEORT CRAM EQU 0C800H ;START OF CUTER RAM AREA ; ; PROM DRIVERS ENTRY POINTS INITDR EQU 0F000H ;INITIALIZE DRIVERS VDMDR EQU COMPACT CBIOS FOR CP/M 1.4 & 2.2 * ;* (BASED ON R. VAN VALZAH'S BVIOS - CPMUG 38.2) * ;* UD) BAUD3: EQU 6 ;BAUD RATE FOR ACE #3 (19.2 KBAUD) WFMT: EQU 0000$0011B ;WORD FORMAT - 8 DATA BITS, 1 STOP BIT, NO PARITY IH+BIAS ;CCP START BDOS EQU CPMB+806H ;BDOS ENTRY POINT CBIOS EQU CPMB+1600H ;CBIOS START ; ELSE ; BIAS EQU (MSIZE-17)*10F3E01DA7424 :10006000003E8CD3E8DBECB7F27200DBEB7723C306 :0B0070006500DBE8E69DC92FD3FF769A :03007D00C30000BD :0000000000  NODISKS EQU 2 ;NUMBER OF PHYSICAL DRIVES IN SYSTEM CUTER EQU FALSE ;TRUE FOR PROC-TECH CUTER SYSTEM EPROM EQU FALSE ;TRUE FO0F003H ;VDM DRIVER DIABDR EQU 0F006H ;DIABLO DRIVER ; ; MULTIO BOARD EQUATES ; ; ACE#1 DRIVING DIABLO PRINTER W/SERIAL BOAR * ;* REV 1.15 07/10/82 E. ELIZONDO * ;***************MASK EQU 0000$0000B ;INTERRUPT MASK (ALL DISABLED) DR: EQU 0000$0001B ;DATA READY BIT CTS: EQU 0001$0000B ;CLEAR TO SEND BIT 024 ;TARBELL DISTRIBUTION=17K CPMB EQU 2900H+BIAS ;CCP START BDOS EQU CPMB+806H ;BDOS ENTRY POINT CBIOS EQU CPMB+1500H ;CBIOS LINE CONTROL REGISTER MCR: EQU BASE+4 ;ACE MODEM CONTROL REGISTER LSR: EQU BASE+5 ;ACE LINE STATUS REGISTER MSR: EQU BASE+6 R VDM & DIABLO DRIVERS IN PROM MULTIO EQU TRUE ;TRUE FOR MORROW'S MULTIO I/O BOARD H1500 EQU TRUE ;TRUE FOR HAZELTINE 1500 COND * ; ACE#2 DRIVING DC HAYES SMARTMODEM * ; ACE#3 DRIVING HAZELTINE 1500 AS CRT TERMINAL * ; ; MULTIO ADDR******************************************** ; ; ; REVMON EQU 07 ;PROGRAM REVISION MONTH REVDAY EQU 10 ;PROGRAM REVISION DA;*********************************************************** ;* * ;*  START ; ENDIF ENDIF ; ; ; COMPUTE NUMBER OF SECTORS TO LOAD ; DOSSECT EQU (CBIOS-CPMB)/128 ; ; DISK I/O PORT NUM;ACE MODEM STATUS REGISTER GRPCTL: EQU BASE+7 ;GROUP CONTROL PORT ; ; ; MULTIO ACE CONTROL & STATUS BITS ; DLAB: EQU 1000$SOLE ; ; CP/M ADDRESS COMPUTATION: ; IF REL BIAS EQU 0100H ;FOR RELOCATION, ASSUME CCP STARTS AT 0 ENDIF ; IF NOT R:1000000031000101020016332100C478D3EBDBE894 :100010000F3E01DA77003E13D3E8DBECB73E01FA7E :100020007700DBE8E691C2770079CD5700C27Y REVYR EQU 82 ;PROGRAM REVISION YEAR ; CPMVERS EQU 22 ;CP/M VERSION NUMBER (14 OR 22) MSIZE EQU 56 ;MEMORY AND CP/M SYSTEM  BERS ; DBASE EQU 0E8H ;BASE ADDRESS OF CONTROLLER CARD COMMAND EQU DBASE ;FD1771 COMMAND OUTPUT STATUS EQU DBASE ;FD1771 STA LINE CONTROL REGISTER MCR: EQU BASE+4 ;ACE MODEM CONTROL REGISTER LSR: EQU BASE+5 ;ACE LINE STATUS REGISTER MSR: EQU BASE+6 D * ; ACE#2 DRIVING DC HAYES SMARTMODEM * ; ACE#3 DRIVING HAZELTINE 1500 AS CRT TERMINAL * ; ; MULTIO ADDRU 0 ;MODEM STATUS PORT. MDATA EQU 1 ;MODEM DATA PORT. MRDY EQU 01000000B ;MODEM DATA READY BIT. MTBE EQU 10000000B ;MODEM XMT8H ;LOAD HEAD WHILE SEEKING RATE EQU 10B ;STEP RATE OF 10MS. ; ; VDM EQUATES ; SCREEN EQU 0CC00H ;STARTING SCREEN ADDRESS THRE: EQU 0010$0000B ;TRANSMITTER HOLDING REGISTER EMPTY BIT ; ; ; CONSOLE #1 EQUATES (CONSOLE#1: KBD+VDM) ; CSTAT1 EQU 0 TUS INPUT TRACK EQU DBASE+1 ;TRACK INPUT/OUTPUT SECT EQU DBASE+2 ;SECTOR OUTPUT DATA EQU DBASE+3 ;DATA INPUT & OUTPUT WAIT E;ACE MODEM STATUS REGISTER GRPCTL: EQU BASE+7 ;GROUP CONTROL PORT ; ; ; MULTIO ACE CONTROL & STATUS BITS ; DLAB: EQU 1000$ESS PORTS ; BASE: EQU 10H ;BASE ADDRESS RBR: EQU BASE ;RECEIVER BUFFER REGISTER (IF DLAB=0) THR: EQU BASE ;TRANSMITTER BUFFER BUFFER EMPTY BIT ; ; TAPE READER EQUATES ; RSTAT EQU 0 ;READER STATUS PORT RDATA EQU 2 ;READER DATA PORT RRBIT EQU 00000 SCRLPT EQU 0C8H ;SCROLL PORT ; ; CUTER EQUATES ; SOUT EQU 0C019H ;CUTER SYSTEM OUTPUT PORT AOUT EQU 0C01CH ;CUTER OUTPUT P;CONSOLE 1 STATUS PORT. CDATA1 EQU 3 ;CONSOLE 1 DATA PORT. CKBR1 EQU 00000001B ;KEYBOARD READY BIT. CPTR1 EQU 10000000B ;CONSQU DBASE+4 ;DATA SYNCRONIZATION & INTRQ INPUT CONTROL EQU DBASE+4 ;CONTROL OUTPUT ; ; FD1771 COMMANDS ; HOMECMD EQU 0 ;REST0000B ;DIVISOR LATCH ACCESS BIT BAUD1: EQU 6 ;BAUD RATE FOR ACE #1 (19.2 KBAUD) BAUD2: EQU 384 ;BAUD RATE FOR ACE #2 (300 BAR REGISTER (IF DLAB=0) DLL: EQU BASE ;ACE BAUD DIVISOR LSB (IF DLAB=1) IER: EQU BASE+1 ;INTERRUPT ENABLE REGISTER (IF DLAB=0) 010B ;READER READY BIT ; ; PRINTER EQUATES ; PSTAT EQU 0 ;PRINTER STATUS PORT PTBE EQU 00111100B ;PRINTER TRANSMITTER BUFFEORT CRAM EQU 0C800H ;START OF CUTER RAM AREA ; ; PROM DRIVERS ENTRY POINTS INITDR EQU 0F000H ;INITIALIZE DRIVERS VDMDR EQU  OUTPUT RDY BIT. ; ; CONSOLE #2 EQUATES (CONSOLE#2: VIO-X) ; CSTAT2 EQU 5 ;CONSOLE 2 STATUS PORT. CDATA2 EQU 4 ;CONSOLE 2 ORE (HOME) COMMAND SEEKCMD EQU 10H ;SEEK TRACK COMMAND READCMD EQU 88H ;READ IBM FORMAT WRITCMD EQU 0A8H ;WRITE IN IBM FORMATUD) BAUD3: EQU 6 ;BAUD RATE FOR ACE #3 (19.2 KBAUD) WFMT: EQU 0000$0011B ;WORD FORMAT - 8 DATA BITS, 1 STOP BIT, NO PARITY I DLM: EQU BASE+1 ;ACE BAUD DIVISOR MSB (IF DLAB=1) IIR: EQU BASE+2 ;ACE INTERRUPT IDENTIFICATION REGISTER LCR: EQU BASE+3 ;ACER EMPTY BIT ; ; FRONT PANEL SENSE SWITCHES EQUATES ; SENSE EQU 0FFH ;IMSAI ; ; ASCII EQUATES CR: EQU 0DH ;CARRIAGE RETURN0F003H ;VDM DRIVER DIABDR EQU 0F006H ;DIABLO DRIVER ; ; MULTIO BOARD EQUATES ; ; ACE#1 DRIVING DIABLO PRINTER W/SERIAL BOARDATA PORT. CKBR2 EQU 00000010B ;KEYBOARD READY BIT. CPTR2 EQU 00000001B ;CONS OUTPUT RDY BIT. ; ; MODEM EQUATES ; MSTAT EQ FINTCMD EQU 0D0H ;FORCE INTERRUPT RETRIES EQU 10 ;NUMBER OF DISK RETRIES ; ; OPTION BITS WITHIN COMMANDS ; LOADHEAD EQU 0MASK EQU 0000$0000B ;INTERRUPT MASK (ALL DISABLED) DR: EQU 0000$0001B ;DATA READY BIT CTS: EQU 0001$0000B ;CLEAR TO SEND BIT   LF: EQU 0AH ;LINE FEED FF: EQU 0CH ;FORM FEED DEL: EQU 7FH ;DELETE (RUBOUT) ; ; CP/M RAM ASSIGNMENTS ; IOBYTE EQU 0003H  ;SET SECTOR ADDRESS (1,...26) FOR I/O JMP SETDMA ;SET DMA ADDRESS FOR I/O JMP READ ;READ A SECTOR JMP WRITE ;WRITE A SECTTART LOADER WBOOTE: JMP WBOOT ;WARM BOOT ENTRY JMP CONST ;CONSOLE STATUS ;REG A = 000H IF NO CHARACTER READY ;REG A =TA2 ;CLEAR CONSOLE 2 DATA PORT IN RDATA ;CLEAR READER DATA PORT IN MDATA ;CLEAR MODEM DATA PORT XRA A ;COME UP ON DRIVE A REGISTER USAGE OF ROUTINES ; REFERENCED ONLY INTERNALLY IS DECLARED IN THE PRE-ROUTINE ; COMMENT BLOCK. ANY REGISTERS NOT MENO CONSOLE ENDIF ; IF MULTIO LCOUNT DB 0 ;PRINTER LINE COUNT ENDIF ; ; IF CPMVERS EQ 22 DISKS 2 DISKDEF 0,1,26,6,;LOCATION OF IOBYTE ; ; DEFINE CBIOS RAM AREAS ; ; NON-INITIALIZED RAM ; SEE ALSO - AREA PAST JUMP TABLE FOR INITIALIZED RAOR IF CPMVERS EQ 22 JMP LISTST ;RETURN STATUS OF LIST DEVICE JMP SECTRAN ;SECTOR TRANSLATE ENDIF ; ; INITIALIZED RAM A 0FFH IF CHARACTER IS READY JMP CONIN ;CONSOLE CHARACTER IN (TO REG A) JMP CONOUT ;CONSOLE CHARACTER OUT (FROM REG C) JMP  STA DISKNO ; IF CUTER OUT SCRLPT ;INITIALIZE VDM SCROLL PORT MOV B,A ;CLEAR B LXI H,CRAM ;POINT TO CUTER RAM CTIONED ARE PRESERVED. ; ; ORG CBIOS ;ORG TO START OF CBIOS AREA IF CPMVERS EQ 22 MACLIB DISKDEF ;FOR CPM 2.2 ENDIF ; 1024,243,64,64,2 DISKDEF 1,0 ENDIF ; ; COLD BOOT ; EXTERNALLY REFERENCED ; THIS SECTION IS EXECUTED WHENEVER RESET AND RM ; ORG 4H ;THIS IS WHERE CP/M STORES THE DISKNO: DS 1 ;CURRENTLY LOGGED DRIVE ; ORG 40H ;SCRATCH AREA FOR CBIOS IOD DS REAS ; ;***********************NOTE: THE FOLLOWING BYTES MUST ; BE IN ADJACENT RAM LOCATIONS ; AND NOT CROSS A 256 BYTELIST ;LIST OUT (FROM REG C) JMP PUNCH ;PUNCH OUT (FROM REG C) JMP READER ;PAPER TAPE READER IN (TO REG A) JMP HOME ;MOVE DLERA: MOV M,A ;CLEAR MEMORY BYTE INX H ;BUMP MEMORY POINTER INR B ;BUMP COUNTER JNZ CLERA ;CLEAR 256 BYTES MVI ; I/O JUMP VECTOR ; THIS IS WHERE CPM CALLS WHENEVER IT NEEDS ; TO DO ANY INPUT/OUTPUT OPERATION. ; USER PROGRAMS MAY USE THUN ; IS PUSHED, AFTER THE COLDSTART LOADER READS IN ; THE CPM SYSTEM. ; CBOOT: LXI SP,100H ;SET STACK FOR INITILIZATION 2 ;DMA ADDRESS ; ; ; ; ; ROUTINES WITHIN THE CBIOS MAY BE INTERNALLY REFERENCED (CALLED ; FROM WITHIN THE CBIOS), EXTERNAL PAGE BOUNDRY IOT DS 1 ;TRACK IOS DS 1 ;SECTOR SELREQ DS 1 ;CURRENT DRIVE SELECT REQUEST LASTSEL DB 0 ;LAST DRIVE ACTUALLY SISK HEAD TO TRACK 00 JMP SELDSK ;SELECT THE DISK GIVEN BY REG C JMP SETTRK ;SET TRACK ADDRESS (0,...76) FOR I/O JMP SETSEC B,0BH ;GET VDM CLEAR COMMAND CALL AOUT ;SEND IT ENDIF ; IF EPROM ;IF DRIVERS IN PROM CALL INITDR ;INITIALIZE THEM ESE ENTRY POINTS ; ALSO, BUT NOTE THAT THE LOCATION OF THIS ; VECTOR CHANGES WITH THE MEMORY SIZE. ; JMP CBOOT ;FROM COLD S ;NOTE: SOME RAM INITIALIZATION HAS BEEN DB'D ;INTO THE RAM DEFINITION ABOVE IN CDATA1 ;CLEAR CONSOLE 1 DATA PORT IN CDALY REFERENCED (CALLED BY CP/M) ; OR BOTH. ANY ROUTINE WHICH IS EXTERNALLY REFERENCED IS ; ASSUMED TO CLOBBER ALL REGISTERS. ELECTED DHPOS DB 1 ;HEAD POSITION TABLE DS NODISKS-1 ;STORAGE FOR DISKS B THRU D ; IF CUTER LASTCH DB 0 ;LAST CHARACTER T ENDIF ; IF MULTIO ;IF MULTIO BOARD MINIT: MVI A,1 ;INITIALIZE ACE #1 OUT GRPCTL ;SELECT GROUP 1 LXI B,BAUD1 ;BAUD RATE IA SELREQ CALL HOME ;BOOT FROM TRACK 0 ;NEXT SECTOR TO READ - 1 KEPT IN REG D ;NUMBER OF SECTORS TO GO IN REG E LXI DCONTROL MOV A,C ;LOW BYTE OUT DLL ;INTO BAUD RATE DIVISOR LSB MOV A,B ;HIGH BYTE OUT DLM ;INTO BAUD RATE DIVISOR MSB M= 5) MVI M,JMP ;PUT 'JMP BDOS' AT LOCATION 5 INX H MVI M,LOW BDOS INX H MVI M,HIGH BDOS JMP CPMB ; ; HOME DISK HEAR SCREEN ENDIF IF REL DB '00' ;A MESSAGE THAT DOESN'T CHANGE WITH ;DIFFERENT MEMORY SIZES ENDIF IF NOT REL DB  ;NO - KEEP LOADING ;YES - FALL THRU TO BRING UP CP/M ; ; DONE WITH LOAD, SO SET UP LOW MEMORY JMP VECTORS AND ; RESET DMNTO BC CALL ACEINIT ;INITIALIZE ACE#1 (DIABLO) MVI A,2 ;INITIALIZE ACE #2 OUT GRPCTL ;SELECT GROUP 2 LXI B,BAUD2 ;BAUD R,(1 SHL 8) + DOSSECT LXI H,CPMB ;START LOADING AT BASE OF CCP BOOTSEC: INR D ;ADD ONE TO SECTOR NUMBER MOV A,D ;END OF FIVI A,WFMT ;GET TRANSMISSION FORMAT OUT LCR ;INTO LINE CONTROL REGISTER IN RBR ;CLEAR DATA READY FLAG MVI A,IMASK ;SET UP ID TO TRACK 0 ; INTERNALLY AND EXTERNALLY REFERENCED ; HOME: IF NODISKS NE 1 ;IF MULTI-DRIVE SYSTEM CALL DO$SEL ;SELECT '0'+MSIZE/10, '0'+MSIZE MOD 10 ENDIF DB 'K CP/M ' DB '0'+CPMVERS/10, '.', '0'+CPMVERS MOD 10 DB CR,LF DB 'EE ','0'+REVA ADDRESS ; GOCPM: LXI H,80H ;SET DEFAULT DMA ADDRESS SHLD IOD MVI L,0 ;NOW REG HL = 0 MVI M,JMP ;PUT 'JMP WBOOTE' AT ATE INTO BC CALL ACEINIT ;INITIALIZE ACE #2 (MODEM) MVI A,3 ;INITIALIZE ACE #3 OUT GRPCTL ;SELECT GROUP 3 LXI B,BAUD3 ;BRST TRACK? CPI 26+1 JNZ SAMTRK ;NO - STAY ON SAME TRACK MVI D,1 ;YES - RESET SECTOR NUMBER TO 1 MOV A,D ;AND STEP IN TO NTERRUPT MASK OUT IER ;INTO ACE INTERRUPT ENABLE REG RET ENDIF ; ; ; WARM BOOT ; EXTERNALLY REFERENCED ; READ THE CCPCORRECT DRIVE BEFORE HOMING MVI A,RATE ;ISSUE HOME COMMAND CALL CMD$TY1 ;IGNORE ERRORS ENDIF MVI C,0 ;AND FALL TMON/10,'0'+REVMON MOD 10,'/' DB '0'+REVDAY/10,'0'+REVDAY MOD 10,'/' DB '0'+REVYR/10,'0'+REVYR MOD 10+80H JMP GOCPM ;SET LOLOCATION 0 INX H MVI M,LOW WBOOTE INX H MVI M,HIGH WBOOTE INX H IN SENSE ;READ SENSE SWITCHES MOV M,A ;SET IOBYTE AUD RATE INTO BC CALL ACEINIT ;INITIALIZE ACE #3 (CRT) ENDIF ; IN SENSE ;READ SENSE SWITCHES LXI H,IOBYTE MOV M,A ;ITRACK 1 STA IOT SAMTRK: STA IOS ;STORE SECTOR FOR READ SHLD IOD ;STORE DMA ADDRESS FOR READ PUSH D ;SAVE SECTOR & COUNT AND BDOS IN TO MEMORY AFTER TRANSIENT EXECUTION ; WBOOT: LXI SP,100H ;SET STACK DURING BOOT XRA A ;BOOT FROM DRIVE A STHRU TO SET TRACK IF NODISKS NE 1 CALL HPADR ;RESET HEAD POSITION BYTE FOR DRIVE MOV M,C ENDIF ; ; SET TRACK NUMBER MEM JMPS AND ENTER CP/M ; IF MULTIO ACEINIT: ;INITIALIZE ACE DEVICE MVI A,DLAB ;OPEN DIVISOR LATCH OUT LCR ;INTO LINE  INX H ;NOW POINTING TO DISKNO (REG HL = 4) MOV C,M ;GET LAST LOGGED DISK NUMBER FOR CCP INX H ;POINT TO BDOS JUMP (REG HL NITIALIZE IOBYTE TO SWITCH SETTING ; CALL MSGP ;PRINT SINGNON MESSAGE IF H1500 ;IF HAZELTINE 1500 CONSOLE DB 126,28 ;CLEA WHILE READING CALL READ ;READ A SECTOR POP D ;RESTORE SECTOR & COUNT DCR E ;DECREMENT COUNT (DONE LOADING?) JNZ BOOTSEC  FOR DISK I/O ; EXTERNALLY REFERENCED ; ENTRY C TRACK NUMBER (0...76) ; SETTRK: MVI L,IOT AND 0FFH DB 11H ;GENERATE LXI RECT DRIVE FOR I/O RETRY: MVI A,RETRIES ;GET NUMBER OF RETRIES STA RTRYCNT ;INITIALIZE COUNT RTRY: ;RETRY RE-ENTRY POINTTRAN MOV L,M ;HL=PHYSICAL SECTOR RET ENDIF ; ; ; ; SET DMA ADDRESS FOR DISK I/O ; EXTERNALLY REFERENCED ; ENTRY BCAUD3 ;BAUD RATE INTO BC DAAD CDD7DA CALL ACEINIT ;INITIALIZE ACE #3 (CRT) ENDIF ; DAB NOT STA SELREQ ;ELSE SAVE REQUESTED DISK ; IF CPMVERS EQ 22 MOV L,C ;RETURN DPB ELEMENT ADDRESS DAD H ;*2 DAD H ;*4 IF SUCCUSSFULL ANI 1111$1100B ;CHECK FOLLOWING BITS X/X/X/X$X/X/X/XB ;NOT READY/WRITE PROTECT/WRITE FAULT/ ;RECORD NOD TO SKIP NEXT MVI L ; ; SET SECTOR NUMBER FOR DISK I/O ; EXTERNALLY REFERENCED ; ENTRY C SECTOR NUMBER (1...26) ; SETSEC: IF NODISKS EQ 1 LDA IOT ;GET REQUESTED TRACK ELSE CALL HPADR ;GET ADDRESS OF HEAD POSITION BYTE LDA IOT ;GET DE DMA ADDRESS (0000H-0FFFFH) ; SETDMA: MOV H,B MOV L,C SHLD IOD RET ; ; WRITE A SECTOR TO DISK ; EXTERNALLY REFERENC0 DBFF IN SENSE ;READ SENSE SWITCHES DAB2 210300 LXI H,IOBYTE DAB5 77 MOV M,A ;INITIALIZE IOBYTE TO SWITC DAD H ;*8 DAD H ;*16 LXI D,DPBASE ;FROM MACRO DEF DAD D ;HL=.DPB ENDIF ; RET ; ; ; TRANSLATE SECTOR BC USING TABT FOUND$CRC ERROR/LOST DATA// RZ ;YES - RETURN WITH REG A = 0 ERROR: PUSH PSW ;SAVE ERROR BITS CALL MSGP ;PRINT FIRST PA MVI L,IOS AND 0FFH MVI H,IOT SHR 8 MOV M,C RET ; ; SET DISK DRIVE NUMBER FOR DISK I/O ; EXTERNALLY REFERENCED ; ENTSIRED TRACK ON NEW DRIVE MOV M,A ;STORE IT AS NEW HEAD POSITION ENDIF OUT DATA ;SEND DESIRED TRACK TO 1771 MVI A,SEEKCED ; WRITE: MVI E,WRITCMD DB 1 ;GENERATE LXI B TO SKIP MVI E FOLLOWING ; ; READ A SECTOR FROM DISK ; INTERNALLY AND EXTH SETTING ; DAB6 CDD2DC CALL MSGP ;PRINT SINGNON MESSAGE IF H1500 ;IF HAZELTINE 1500 COLE AT DE ; EXTERNALLY REFERENCED ; ENTRY: BC=SECTOR NUMBER (B=0 FOR STD DRIVES) ; DE=TRANSLATION TABLE ADDRESS ; EXIT OUT GRPCTL ;SELECT GROUP 2 DAA0 018001 LXI B,BAUD2 ;BAUD RATE INTO BC DAA3 CDD7DA CALL ACEINIT ;INITIALIZE ACRY C DRIVE NUMBER (0...3)=(A...D) ; EXIT HL=0 IF SELECT ERROR (CP/M 2.2) ; HL=A(DISK PARAMETER HEADER) (CP/M 2.2) ; SELMD+LOADHEAD+RATE CALL CMD$TY1 ;COMMAND DISK TO SEEK REQUESTED TRACK JNZ ERROR ;ISSUE ERROR IF SEEK FAILED LDA IOS ;SEND REERNALLY REFERENCED ; EXIT HL (IOD)+128 DMA ADDRESS + 128 ; B,C,D CLOBBERED ; READ: MVI E,READCMD CALL DO$SEL ;SELECT CORNSOLE DAB9 7E1C DB 126,28 ;CLEAR SCREEN ENDIF IF REL : HL=TRANSLATED SECTOR NUMBER (H=0 FOR STD DRIVES) ; IF CPMVERS EQ 22 SECTRAN: XCHG ;HL=.TRAN DAD B ;SINGLE PRECISION E #2 (MODEM) DAA6 3E03 MVI A,3 ;INITIALIZE ACE #3 DAA8 D317 OUT GRPCTL ;SELECT GROUP 3 DAAA 010600 LXI B,BDSK: LXI H,0000H ;SET HL=0 (FOR CP/M 2.2) MOV A,C ;GET DRIVE # CPI NODISKS ;LESS THAN N DISKS? RNC ;RETURN WITH HL=0 IFQUESTED SECTOR TO 1771 OUT SECT LHLD IOD ;GET REQUESTED DMA ADDRESS CALL XFER ;PERFROM DISK I/O TRANSFER IN STATUS ;SEE   DB '00' ;A MESSAGE THAT DOESN'T CHANGE WITH ;DIFFERENT MEMORY SIZES ENDIF  ;NEXT SECTOR TO READ - 1 KEPT IN REG D ;NUMBER OF SECTORS TO GO IN REG E DAF6 112C01  MASK DAE9 D311 OUT IER ;INTO ACE INTERRUPT ENABLE REG DAEB C9 RET ENDIF ;  ;THEN TRY ONCE MORE FOOL: CALL MSGP ;PRINT REST OF ERROR MESSAGE DB ',Retry or Ignore', '?'+80H CALL CONIN ;GET USERS ACEINIT: ;INITIALIZE ACE DEVICE DAD7 3E80 MVI A,DLAB ;OPEN DIVISOR LATCH DAD9 D313 OUT LCR ;INTO LINE CONTROL RT OF ERROR MESSAGE DB CR,LF,'error', ' '+80H POP PSW ;GET ERROR BITS BACK CALL PHEX ;PRINT THEM AS A HEX NUMBER CALL MS IF NOT REL DABB 3536 DB '0'+MSIZE/10, '0'+MSIZE MOD 10 ENDIF DABD 4B2043502F DB 'K CP/M ' D LXI D,(1 SHL 8) + DOSSECT DAF9 2100C4 LXI H,CPMB ;START LOADING AT BASE OF CCP BOOTSEC: DAFC 14  ; ; WARM BOOT ; EXTERNALLY REFERENCED ; READ THE CCP AND BDORESPONSE ANI 5FH ;CONVERT LOWER TO UPPER CASE PUSH PSW ;SAVE DURRING ECHO MOV C,A ;ECHO RESPONSE CALL CONOUT POP PSW ; DADB 79 MOV A,C ;LOW BYTE DADC D310 OUT DLL ;INTO BAUD RATE DIVISOR LSB DADE 78 MOV A,B ;HIGH BYTE GP ;CONTINUE PRINTING DB ' in track',' '+80H LDA IOT ;GET TRACK NUMBER CALL PHEX ;PRINT IT CALL MSGP ;AND MORE DB ' seAC4 322E32 DB '0'+CPMVERS/10, '.', '0'+CPMVERS MOD 10 DAC7 0D0A DB CR,LF DAC9 4545203037 DB 'EE ','0'+REVMON/10,'0 INR D ;ADD ONE TO SECTOR NUMBER DAFD 7A MOV A,D ;END OF FIRST TRACK? DAFE FE1B CPI 26+1 DB00 C209DB S IN TO MEMORY AFTER TRANSIENT EXECUTION ; WBOOT: DAEC 310001 LXI SP,100H ;SET STACK DURGET RESPONSE BACK SUI 'I' ;IGNORE? RZ ;YES - SEND ALL OK FLAG BACK TO CP/M CPI 'R'-'I' ;RETRY? JNZ FOOL ;NO - RE-ISSUE  DADF D311 OUT DLM ;INTO BAUD RATE DIVISOR MSB DAE1 3E03 MVI A,WFMT ;GET TRANSMISSION FORMAT DAE3 D313 OUTctor',' '+80H LDA IOS ;GET SECTOR CALL PHEX ;AND PRINT IT MVI A,RATE ;SEEK HOME AND TRY AGAIN CALL CMD$TY1 ;ISSUE HOME C'+REVMON MOD 10,'/' DACF 31302F DB '0'+REVDAY/10,'0'+REVDAY MOD 10,'/' DAD2 38B2 DB '0'+REVYR/10,'0'+REVYR MOD 10+JNZ SAMTRK ;NO - STAY ON SAME TRACK DB03 1601 MVI D,1 ;YES - RESET SECTOR NUMBER TO 1 DB05 7A MOV A,D ;AND STEING BOOT DAEF AF XRA A ;BOOT FROM DRIVE A DAF0 3235DA STA SELREQ DAF3 CD3ADB CALL HOME ;BOOT FROM TRACK 0 MESSAGE JMP RETRY ;NO ERROR - TRY OPERATION AGAIN ; ; SEND A TYPE ONE COMMAND TO THE CONTROLLER, WAIT FOR FINISH ; INTERNAL LCR ;INTO LINE CONTROL REGISTER DAE5 DB10 IN RBR ;CLEAR DATA READY FLAG DAE7 3E00 MVI A,IMASK ;SET UP INTERRUPTOMMAND JNZ ERROR ;ERROR IN HOMING LDA RTRYCNT ;GET RETRY COUNT DCR A ;DECREMENT IT STA RTRYCNT ;AND UPDATE IT JNZ RTRY80H DAD4 C318DB JMP GOCPM ;SET LO MEM JMPS AND ENTER CP/M ; IF MULTIO P IN TO TRACK 1 DB06 3233DA STA IOT SAMTRK: DB09 3234DA STA IOS ;STORE SECTOR FOR READ DB0C 22400 LY REFERENCED ; EXIT A ERROR BITS ; ZERO SET IF SUCCESS ; CMD$TY1: OUT COMMAND ;SEND COMMAND IN WAIT IN STATUS ;GET ALMOV M,A ;IF NOT - UPDATE LAST SELECTED=REQUEST CALL MSGP ;GIVE MOUNT MESSAGE DB 13, 10, 'MOUNT', ' '+80H MVI A,'A' ;MOV A,M ;GET DATA FOR DISK OUT DATA INX H JMP XWLOOP ; ; ACTUALLY PERFORM DRIVE SELECTION ; INTERNALLY REFERENCED ; EN, WAIT LDA IOBYTE ;YES, GET IOBYTE CALL DISPTCH ;DISPATCH TO PROPER ROUTINE DW CONIN1 ;0=KEYBOARD DW CONIN1 ;1=KEYBOARD S ANI 0010$0000B ;TRANSFORM HEAD LOADED STATUS INTO XRI 0010$0000B RAR ;HEAD LOAD BIT FOR COMMAND RAR RAR ORA E ;WE LEFT THE HEAD OF MOV A,M ;THE NEW DRIVE BEING SELECTED OUT TRACK SELDEL: IN STATUS ;UNLOAD HEAD BECAUSE 1771 DOEL STATUS BITS ANI 1001$1001B ;LEAVE ONLY THE FOLLOWING ;NOT READY///SEEK ERROR$ ;CRC ERROR///BUSY RET ;RETURN ERROCONVERT REQUEST TO ASCII DRIVE NAME ADD M MOV C,A ;PRINT REQUESTED DRIVE NAME CALL CONOUT IN CDATA ;CLEAR ANY CHTRY (SELREQ) DRIVE TO BE SELECTED ; EXIT A,C,FLAGS,HL CLOBBERED ; IN PASCAL VERSIONS: AS ABOVE EXCEPT ; EXIT CARRY SET IF D DW CONIN2 ;2=VIO-X DW CONIN3 ;3=MULTIO ACE#3 ; CONIN1: ;KEYBOARD VIA 3P+S (CUTER COMPATIBLE) IN CDATA1 ;READ A CHARACTOR HEAD LOAD BIT IN WITH COMMAND OUT COMMAND ;SEND COMMAND TO CONTROLLER CPI WRITCMD ;SEE IF READING OR WRITING JNC XWLOOPS ANI 20H ;NOT RECOGNIZE DRIVE SWITCH JNZ SELDEL ;* THANKS-MARTY NICHOLS * IN STATUS ;GET ALL STATUS BITS RAL ;R BITS TO CALLER ; ; SEND COMMAND TO 1771 AND PERFORM DISK I/O TRANSFER ; HEAD WILL BE LOADED FIRST IF HARDWARE TIMEOUT HAS UAR WHICH MIGHT BE WAITING ;GO TO CONIN TO WAIT FOR MOUNTING ELSE ;GENERATE PHYSICAL DRIVE SELECT CODE LDA SELREQ ;GETRIVE NOT READY OR NON-EXISTANT ; DO$SEL: IF NODISKS EQ 1 ;GENERATE LOGICAL SEL CODE LXI H,SELREQ ;GET REQUEST MOV A,ER. JMP CONINX ;GO TO COMMON EXIT ; CONIN2: ;KEYBOARD VIA VIO-X IN CDATA2 ;READ A CHARACTER. JMP CONINX ;GO TO COMMON  ;WRITING XRLOOP: IN WAIT ;WAIT FOR DATA OR INTRQ ORA A ;SET POSITIVE IF INTRQ RP IN DATA ;DATA IS READ - GO GET IT MDRIVE NOT READY BIT INTO CARRY RET ENDIF ; ; READ A CHARACTER FROM CONSOLE ; INTERNALLY AND EXTERNALLY REFERENCED ; EXNLOADED IT ; INTERNALLY REFERENCED ; ENTRY E 1771 COMMAND ; HL I/O ADDRESS ; EXIT E PRESERVED ; HL I/O ADDRESS+128 ; A,FLA DRIVE TO SELECT TO REG A CMA ;COMPLIMENT FOR CONTROL LATCH PORT ADD A ;ROTATE BITS 0-1 TO 4-5 ADD A ; ADD A M INX H ;POINT TO LAST DRIVE SELECTED CMP M ;IS REQUEST SAME AS LAST SELECTED? RZ ;IF SO - SELECT DOES NOTHING EXIT ; CONIN3: ;MULTIO ACE#3 IN RBR ;READ RECEIVER BUFFER REGISTER ; CONINX: ;COMMON EXIT ROUTINE ANI 7FH ;STRIP OFFOV M,A ;LOAD INTO DMA ADDR INX H JMP XRLOOP XWLOOP: IN WAIT ;WAIT FOR DRQ OR INTRQ ORA A ;SET POSITIVE IF INTRQ RP IT A CHARACTER READ, PARITY RESET ; FLAGS CLOBBERED ; CONIN: CALL CONST ;READ CONSOLE STATUS ORA A ;READY? JZ CONIN ;NOGS CLOBBERED ; XFER: MVI A,FINTCMD ;INTERRUPT 1771 TO GENERATE STATUS OUT COMMAND XTHL XTHL IN STATUS ;GET NEW STATU ; ADD A ; ORI 2 ;MAKE IT A DRIVE SELECT COMMAND OUT CONTROL ;SEND COMMAND TO CARD CALL HPADR ;TELL 1771 WHERE   PARITY IF CPMVERS EQ 22 ;IF CP/M 2.2 CPI DEL ;IS IT A DEL? RNZ ;NO, RETURN WITH IT IN HAND MVI A,'H'-40H ;ELSE REPLACETO INTERRUPT? ORA A ;CHECK FLAGS JNZ CONIN ;YES, GO SERVICE IT IN RSTAT ;ELSE GET READER STATUS ANI RRBIT ;LOOK AT READYEAD CONSOLE STATUS ANI CKBR2 ;LOOK AT KB READY BIT MVI A,0 ;SET A=0 FOR RETURN RZ ;NOT READY WHEN LOW CMA ;IF READY A=; PRINT ONE HEX DIGIT ; INTERNALLY REFERENCED ; ENTRY A B3-B0 NIBBLE TO BE PRINTED AS A HEX DIGIT ; EXIT A,C,FLAGS CLOBBERED 0FFH IF CHRACTER IS READY, 0H IF NOT READY ; FLAGS CLOBBERED ; CONST: LDA IOBYTE ;GET IOBYTE CALL DISPTCH ;DISPATCH TO PNOUT ;PRINT IT MOV A,M ;GET CHR BACK INX H ;POINT TO NEXT ORA A ;WAS BIT 7 SET ON LAST CHR? JP MSG1 ;YES - KEEP PRINTING IT WITH BACKSPACE ENDIF ;IF CPMVERS EQ 22 ; RET ; ; ; CALCULATE HEAD POSITION BYTE ADDRESS ; INTERNALLY REFERENCED ; BIT JNZ READER ;LOOP UNTIL READY IN RDATA ;READ BYTE ANI 7FH ;STRIP PARITY PUNCH: ;DUMMY DEVICE RET ; ; ; ; ;FF RET ;RETURN FROM CONST ; CONST3: ;MULTIO ACE#3 MVI A,3 ;SELECT MULTIO GROUP 3 OUT GRPCTL IN LSR ;READ LINE STATU ; PNIB: ANI 0000$1111B ;LEAVE ONLY LOW NIBBLE ADI 90H ;CAUSE CARRY IF > 9 DAA ADI 40H DAA MOV C,A ;PASS ASCII CHROPER ROUTINE DW CONST1 ;0=KEYBOARD DW CONST1 ;1=KEYBOARD DW CONST2 ;2=VIO-X DW CONST3 ;3=MULTIO ACE#3 ; CONST1: ;KE XTHL ;NO - PUT RETURN ADDRESS BACK RET ; ; PRINT TWO HEX DIGITS ; INTERNALLY REFERENCED ROUTINE ; ENTRY A 8-BIT VALUE  ENTRY (SELREQ) DESIRED DRIVE NUMBER ; EXIT HL ADDRESS OF HEAD POSITION BYTE FOR DRIVE ; A,FLAGS CLOBBERED ; IF NODISKS NE  ; IN-LINE MESSAGE PRINTER ; THE MESSAGE MUST BE TERMINATED BY BIT 7 HIGH ON THE LAST ; CHARACTER. ; INTERNALLY REFERENCED S REGISTER ANI DR ;DATA READY? MVI A,0 ;SET A=0 FOR RETURN RZ ;NOT READY WHEN LOW CMA ;IF READY A=FF RET ;RETURN FRAR TO CONOUT ;FALL THRU TO CONOUT ; ; OUTPUT A CHARACTER TO CONSOLE ; INTERNALLY AND EXTERNALLY REFERENCED ; ENTRY C ASCYBOARD VIA 3P+S (CUTER COMPATIBLE) IN CSTAT1 ;READ CONSOLE STATUS ANI CKBR1 ;LOOK AT KB READY BIT MVI A,0 ;SET A=0 FOR RETTO BE PRINTED AS TWO HEX DIGITS ; EXIT A,C,FLAGS CLOBBERED ; PHEX: PUSH PSW ;SAVE LOW NIBBLE RAR ! RAR ! RAR ! RAR ;POSIT1 HPADR: LDA SELREQ ;GET REQUESTED DRIVE ADI LOW DHPOS ;ADD TO BASE OF HEAD POSITION TABLE MOV L,A ;RESULT OF ADD T; ENTRY STACK TOP MESSAGE ADDRESS (RETURN ADDRESS) ; EXIT C,A,FLAGS CLOBBERED ; NOTE: MODIFYS RETURN ADDRESS AND RETURNS ONE OM CONST ; ; ; PAPER TAPE READER ; EXTERNALLY REFERENCED ; EXIT A=CHARACTER READ ; READER: CALL CONST ;DOES CONSOLE WANT II CHARACTER TO BE SENT ; EXIT A,FLAGS CLOBBERED ; CONOUT: LDA IOBYTE ;GET IOBYTE CALL DISPTCH ;DISPATCH TO APPROPRIATE RURN RNZ ;NOT READY WHEN HIGH CMA ;IF READY A=FF RET ;RETURN FROM CONST ; CONST2: ;KEYBOARD VIA VIO-X IN CSTAT2 ;RION HIGH NIBBLE FOR PRINT CALL PNIB ;PRINT HIGH NIBBLE POP PSW ;GET LOW NIBBLE BACK AND . . ;FALL THRU TO PRINT IT ; O REG HL MVI H,HIGH DHPOS RET ENDIF ; ; CHECK CONSOLE INPUT STATUS ; INTERNALLY AND EXTERNALLY REFERENCED ; EXIT ABYTE PAST ; END OF MESSAGE. ; MSGP: XTHL ;GET MESSAGE ADDRESS TO REG HL MSG1: MOV C,M ;GET A CHR FROM MESSAGE CALL CO OUTINE DW CONOUT1 ;0=VDM DRIVER DW CONOUT2 ;1=VIO-X DW CONOUT2 ;2=VIO-X DW CONOUT3 ;3=MULTIO ACE#3 ; CONOUT1: ;VDM DRAD ;READ A SECTOR DB13 D1 POP D ;RESTORE SECTOR & COUNT DB14 1D DCR E ;DECREMENT COUNT (DONE LOADING?) DB178D3113E03D313DB103E004F :10DAE900D311C9310001AF3235DACD3ADB112C013E :10DAF9002100C4147AFE1BC209DB16017A3233DA1B :10DB0900323,HIGH BDOS DB37 C300C4 JMP CPMB ; ; HOME DISK HEAD TO TRACK 0 ; INTERNAADD44 :03DA3000C365DBF0 :02DA36000001ED :10DA39000069DA0000000000007CDD5ADA1BDEFC18 :10DA4900DD69DA0000000000007CDD5ADA4ADE2DB25 23 INX H DB26 36DA MVI M,HIGH WBOOTE DB28 23 INX H DB29 DBFF IN SENSE ;READ SENSE SWITCHIVER IF EPROM CALL VDMDR ;IN EPROM ENDIF ; IF CUTER MOV A,C ;GET CHAR CPI CR ;IS IT CR? JNZ CONOT1 ;NO, PRO5 C2FCDA JNZ BOOTSEC ;NO - KEEP LOADING ;YES - FALL THRU TO BRING UP CP/M ; 4DA224000D5CD72DBD11DC2FCDA21D4 :10DB190080002240002E0036C32336032336DA2341 :10DB2900DBFF77234E2336C32336062336CCC300C7 :10DBLLY AND EXTERNALLY REFERENCED ; HOME: IF NODISKS NE 1 ;IF MULTI-DRIVE SYSTEMBCD :10DA5900DE1A00030700F2003F00C00010000200B8 :10DA690001070D1319050B111703090F1502080EEC :10DA7900141A060C1218040A10163100ES DB2B 77 MOV M,A ;SET IOBYTE DB2C 23 INX H ;NOW POINTING TO DISKNO (REG HL = 4) DB2D 4E MOV C,M CESS NORMALLY LDA LASTCH ;ELSE GET LAST CHAR TRANSMITTED CPI CR ;WAS IT A CR? MOV A,C ;RESTORE CHAR IN A RZ ;YE ; DONE WITH LOAD, SO SET UP LOW MEMORY JMP VECTORS AND ; RESET DMA ADDRESS ; 3900C4CD43DC3E02CD0DDC0E00CD89DC712E57 :10DB490033112E3426DA71C921000079FE02D03250 :10DB590035DA6929292929113ADA19C9EB096EC96E DB3A CD43DC CALL DO$SEL ;SELECT CORRECT DRIVE BEFORE HOMING DB3D 3E02 MVI A,RATE ;ISSUE HOME COMMAND DB3F C01DB03DB14 :10DA890004DB02DB01AF3204003E01D317010600BB :10DA9900CDD7DA3E02D317018001CDD7DA3E03D3C1 :10DAA90017010600CDD7DADBF;GET LAST LOGGED DISK NUMBER FOR CCP DB2E 23 INX H ;POINT TO BDOS JUMP (REG HL = 5) DB2F 36C3 MVI M,JMP ;PUT 'S, DON'T PROCESS IT ; CONOT1: CPI 'H'-40H ;BACKSPACE? JNZ CONOT2 ;NO, PROCESS NORMALLY MVI C,01H ;ELSE REPLACE IT WI GOCPM: DB18 218000 LXI H,80H ;SET DEFAULT DMA ADDRESS DB1B 224000 SHLD IOD DB1E 2E00 MVI L,0 ;NOW REG 0 SHLD IOD ;STORE DMA ADDRESS FOR READ DB0F D5 PUSH D ;SAVE SECTOR & COUNT WHILE READING DB10 CD72DB CALL RED0DDC CALL CMD$TY1 ;IGNORE ERRORS ENDIF DB42 0E00 MVI C,0 ;AND FALL THRU TO F21030077CDD2DCE1 :10DAB9007E1C35364B2043502F4D20322E320D0A15 :10DAC90045452030372F31302F38B2C318DB3E801F :10DAD900D31379D310JMP BDOS' AT LOCATION 5 DB31 23 INX H DB32 3606 MVI M,LOW BDOS DB34 23 INX H DB35 36CC MVI M:10DA0000C383DAC3ECDAC392DCC360DCC3F1DCC3EA :10DA10003BDDC3D1DCC3BFDCC33ADBC351DBC3484E :10DA2000DBC34BDBC369DBC372DBC36FDBC32HL = 0 DB20 36C3 MVI M,JMP ;PUT 'JMP WBOOTE' AT LOCATION 0 DB22 23 INX H DB23 3603 MVI M,LOW WBOOTE  SET TRACK IF NODISKS NE 1 DB44 CD89DC CALL HPADR ;RESET HEAD POSITION BYTE FOR DRIVE DB47 71  SETSEC: DB4B 2E34 MVI L,IOS AND 0FFH DB4D 26DA MVI H,IOT SHR 8 DB4F 71 MOV M,C DB5IATELY FOLLOWING CALLING ROUTINE ; ; DISPTCH: RLC ;DOUBLE THE CODE BITS OF INTEREST ANI 06H ;MASK OUT ALL OTHER BITS =FF IF READY ; IF CPMVERS EQ 22 LISTST: IF NOT MULTIO IN PSTAT ;READ PRINTER STATUS ANI PTBE ;PRINTER TRANSMITTER BUF OUT CDATA2 ;OUTPUT DATA RET ; CONOUT3: ;OUPUT VIA MULTIO ACE#3 MVI A,3 ;SELECT MULTIO GROUP 3 OUT GRPCTL COUT3A: XTHL ;SAVE HL,GET ADDRESS OF TABLE PUSH D ;SAVE DE MOV E,A ;PUT DOUBLED CODE IN E MVI D,0 ;AND CLEAR D DAD D ;ADD DOUBL MOV M,C ENDIF ; ; SET TRACK NUMBER FOR DISK I/O ; EXTERN0 C9 RET ; ; SET DISK DRIVE NUMBER FOR DISK I/O ; EXTERNALLY REFERENCALLY REFERENCED ; ENTRY C TRACK NUMBER (0...76) ; SETTRK: DB48 2E33 MFER EMPTY BIT MVI A,0 ;SET A=0 FOR RETURN RNZ ;NOT READY WHEN NOT 0. CMA ;IF READY A=FF. RET ENDIF IF MULTIO MIN LSR ;READ LINE STATUS REGISTER ANI THRE ;TRANMITTER HOLDING REGISTER EMPTY? JZ COUT3A ;NO, KEEP LOOPING MOV A,C ;GET CHED CODE TO BRANCH TABLE ; ;TO FIND ADDRESS OF DRIVER MOV A,M ;GET LOW BYTE OF DRIVER ADDR INX H ;NOW POINT TO HIGH BYTE OTH A CUTER BACKSPACE MOV A,C ;ALSO IN A CONOT2: STA LASTCH ;SAVE LAST CHAR TRANSMITTED PUSH B ;SAVE ENVIRONMENT PED ; ENTRY C DRIVE NUMBER (0...3)=(A...D) ; EXIT HL=0 IF SELECT ERROR (CP/M 2.2) VI L,IOT AND 0FFH DB4A 11 DB 11H ;GENERATE LXI D TO SKIP NEXT MVI L ; ; SET SECTOR NVI A,1 ;SELECT MULTIO GROUP #1 OUT GRPCTL IN MSR ;READ MODEM STATUS REGISTER ANI CTS ;CLEAR TO SEND? RZ ;NO, RETURN WITAR OUT THR ;OUTPUT DATA RET ; ; ; ; ; I/O DISPATCH ROUTINE (INTERNALLY REFERENCED) ; (DISPATCHES ACCORDING TO IOBYTE VF DRIVER MOV H,M ;AND PUT IT INTO H MOV L,A ;PUT THE LOW BYTE INTO L POP D ;RESTORE DE XTHL ;PUT DRIVER ADDR ON STACK,RUSH H MOV B,C ;PUT CHAR IN B CALL SOUT ;OUTPUT IT POP H ;RESTORE ENVIRONMENT POP B ENDIF ;IF CUTER RET ;  ; HL=A(DISK PARAMETER HEADER) (CP/M 2.2) ; SELDSK: DB51 210000 LXI H,0000H ;SETUMBER FOR DISK I/O ; EXTERNALLY REFERENCED ; ENTRY C SECTOR NUMBER (1...26) ;H A=00 IN LSR ;ELSE READ LINE STATUS REGISTER ANI THRE ;TRANSMITTER BUFFER EMPTY? RZ ;NO, RETURN WITH A=00 MVI A,0FFH ;ALUE) ; ON INPUT: A=IOBYTE FIELD VALUE ROTATED TO BITS 0-1 ; ON OUTPUT: EXECUTES DRIVER ACCORDING TO BRANCH TABLE ; IMMEDESTORE HL RET ;DISPATCH TO DRIVER ; ; ; LIST DEVICE STATUS ; EXTERNALLY REFERNECED ; EXIT A=0 IF NOT READY ; ACONOUT2: ;OUPUT VIA VIO-X BOARD IN CSTAT2 ;READ STATUS ANI CPTR2 ;READY? JZ CONOUT2 ;NO, KEEP LOOPING MOV A,C ;GET CHAR HL=0 (FOR CP/M 2.2) DB54 79 MOV A,C ;GET DRIVE # DB55 FE02 CPI NODISKS ;LESS THAN N DISKS? DB57 D0   RNC ;RETURN WITH HL=0 IF NOT DB58 3235DA STA SELREQ ;ELSE SAVE REQUESTED DISK ; IF CP,1,...,n-1 ; fsc is the first sector number (usually 0 or 1) ; lsc is the last sector number on a track ; skf is optional "sk; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; disk disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,00STD DRIVES) ; DE=TRANSLATION TABLE ADDRESS ; EXIT: HL=TRANSLATED SECTOR NUMBER (H=0 FOfined by ; disks 4 ; diskdef 0,1,26,6,1024,243,64,64,2 ; dsk set 0 ; rept 3 ; dsk set dsk+1 ; diskdef %dsk,0 ; endm MVERS EQ 22 DB5B 69 MOV L,C ;RETURN DPB ELEMENT ADDRESS DB5C 29 DAD H ;*2 DB5D 29 DAD H ;*4 DB5Eew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (wdef parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logi00h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc vecR STD DRIVES) ; IF CPMVERS EQ 22 SECTRAN: DB65 EB XCHG ;HL=.TRAN  ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the bio 29 DAD H ;*8 DB5F 29 DAD H ;*16 DB60 113ADA LXI D,DPBASE ;FROM MACRO DEF DB63 19 DAD D ;HL=.Dord) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of cal disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,tors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter bl DB66 09 DAD B ;SINGLE PRECISION TRAN DB67 6E MOV L,M ;HL=PHYSICAL SECTOR DB68 C9 RET s, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is PB ENDIF ; DB64 C9 RET ; ; ; TRAtracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defin-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 0ocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro d; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a largeNSLATE SECTOR BC USING TABLE AT DE ; EXTERNALLY REFERENCED ; ENTRY: BC=SECTOR NUMBER (B=0 FOR nes disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is de n dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks)he block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fite the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn nts for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eqse dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;;  > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; lls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not fou= gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elementu als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table %blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shproduces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variablnow generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries pend yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkvas nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nx else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocatr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate table for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif r block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again l set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; tsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endifion vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate te, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; generagcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set stateme ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks el   nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul ; EXTERNALLY REFERENCED ; ENTRY BC DMA ADDRESS (0000H-0FFFFH) ; SETDMATE ;WRITE A SECTOR ; ; INITIALIZED RAM AREAS ; ;************ON BYTE DB7F 3A33DA LDA IOT ;GET DESIRED TRACK ON NEW DRIVE DB82 77 MOV M,A ;STORE IT AS NEW HEAD POSITION LIST ;LIST OUT (FROM REG C) BA12 C3AABB JMP PUNCH ;PUNCH OUT (FROM REG C) BA15 C3ABBB JMP READER ;PAPER TAPE READER 128 ; B,C,D CLOBBERED ; READ: DB72 1E88 MVI E,READCMD DB74 CD43DC  fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds l: DB69 60 MOV H,B DB6A 69 MOV L,C DB6B 224000 SHLD IOD DB6E C9 RET ; ***********NOTE: THE FOLLOWING BYTES MUST ; BE IN ADJACENT RAM LOCATIONS ; AND NOT CROSS  ENDIF DB83 D3EB OUT DATA ;SEND DESIRED TRACK TO 1771 DB85 3E1A MVI A,SEEKCMD+LOADHEAD+RATE DBIN (TO REG A) BA18 C3ABBA JMP HOME ;MOVE DISK HEAD TO TRACK 00 BA1B C3BFBA JMP SELDSK ;SELECT THE DISK GIVEN BY REG  CALL DO$SEL ;SELECT CORRECT DRIVE FOR I/O DB77 3E0A RETRY: MVI A,RETRIES ;GET NUMBER OF RETRIES Db&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access bu ; WRITE A SECTOR TO DISK ; EXTERNALLY REFERENCED ; WRITE: DB6F 1A 256 BYTE PAGE BOUNDRY BA2D IOT DS 1 ;TRACK BA2E IOS DS 1 ;SECTOR BA2F SELREQ DS 1 ;CURRENT87 CD0DDC CALL CMD$TY1 ;COMMAND DISK TO SEEK REQUESTED TRACK DB8A C29DDB JNZ ERROR ;ISSUE ERROR IF SEEK FAILED DB8D C BA1E C3B9BA JMP SETTRK ;SET TRACK ADDRESS (0,...76) FOR I/O BA21 C3BCBA JMP SETSEC ;SET SECTOR ADDRESS (1,...26) FB79 325ADE STA RTRYCNT ;INITIALIZE COUNT RTRY: ;RETRY RE-ENTRY POINT IF NODISKS EQ 1 ffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm eEA8 MVI E,WRITCMD DB71 01 DB 1 ;GENERATE LXI B TO SKIP MVI E FOLLOWING ; ; REA ENDIF ; ; ; ; SET DMA ADDRESS FOR DISK I/O 3A34DA LDA IOS ;SEND REQUESTED SECTOR TO 1771 DB90 D3EA OUT SECT DB92 2A4000 LHLD IOD ;GET REQUESTED DMA ADDREOR I/O BA24 C3C5BA JMP SETDMA ;SET DMA ADDRESS FOR I/O BA27 C3CEBA JMP READ ;READ A SECTOR BA2A C3CBBA JMP WRI LDA IOT ;GET REQUESTED TRACK ELSE DB7C CD89DC CALL HPADR ;GET ADDRESS OF HEAD POSITInddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; D A SECTOR FROM DISK ; INTERNALLY AND EXTERNALLY REFERENCED ; EXIT HL (IOD)+128 DMA ADDRESS + ! SS DB95 CD16DC CALL XFER ;PERFROM DISK I/O TRANSFER DB98 DBE8 IN STATUS ;SEE IF SUCCUSSFULL DB9A E6FC ANI  POP PSW ;GET RESPONSE BACK DC02 D649 SUI 'I' ;IGNORE? DC04 C8 RZ ;YES - SEND ALL OK FLAG BACK TO CP/M DCDBDC 3D DCR A ;DECREMENT IT DBDD 325ADE STA RTRYCNT ;AND UPDATE IT DBE0 C27CDB JNZ RTRY ;THEN TRY ONCE MORE T E PRESERVED ; HL I/O ADDRESS+128 ; A,FLAGS CLOBBERED ; XFE CALL MSGP ;CONTINUE PRINTING DBB0 20696E2074 DB ' in track',' '+80H DBBA 3A33DA LDA IOT ;GET TRACK NUMBER DBBD CDDATUS BITS DC13 E699 ANI 1001$1001B ;LEAVE ONLY THE FOLLOWING ;NOT READY///SEEK ERROR$  1111$1100B ;CHECK FOLLOWING BITS X/X/X/X$X/X/X/XB ;NOT READY/WRITE PROTECT/WRITE FAULT/ 05 FE09 CPI 'R'-'I' ;RETRY? DC07 C2E3DB JNZ FOOL ;NO - RE-ISSUE MESSAGE DC0A C377DB JMP RETRY ;NO ERROR - TRY  FOOL: DBE3 CDD2DC CALL MSGP ;PRINT REST OF ERROR MESSAGE DBE6 2C52657472 DB ',Retry oR: DC16 3ED0 MVI A,FINTCMD ;INTERRUPT 1771 TO GENERATE STATUS DC18 D3E8 OUT COMMAND DC1A E3 XTHL DC1FDC CALL PHEX ;PRINT IT DBC0 CDD2DC CALL MSGP ;AND MORE DBC3 2073656374 DB ' sector',' '+80H DBCB 3A34DA LDA I ;CRC ERROR///BUSY DC15 C9 RET ;RETURN ERROR BITS TO CALLER ; ; SEND COMMAND  ;RECORD NOT FOUND$CRC ERROR/LOST DATA// DB9C C8 RZ ;YES - RETURN WITH REG A = 0 ERROR: DB9D F5 OPERATION AGAIN ; ; SEND A TYPE ONE COMMAND TO THE CONTROLLER, WAIT FOR FINISH r Ignore', '?'+80H DBF7 CD60DC CALL CONIN ;GET USERS RESPONSE DBFA E65F ANI 5FH ;CONVERT LOWER TO UPPER CASE DBFB E3 XTHL DC1C DBE8 IN STATUS ;GET NEW STATUS DC1E E620 ANI 0010$0000B ;TRANSFORM HEAD LOADED STATUS INOS ;GET SECTOR DBCE CDDFDC CALL PHEX ;AND PRINT IT DBD1 3E02 MVI A,RATE ;SEEK HOME AND TRY AGAIN DBD3 CD0DDC TO 1771 AND PERFORM DISK I/O TRANSFER ; HEAD WILL BE LOADED FIRST IF HARDWARE TIMEOUT HAS UNLOADED IT  PUSH PSW ;SAVE ERROR BITS DB9E CDD2DC CALL MSGP ;PRINT FIRST PART OF ERROR MESSAGE DBA1 0D0A657272 DB CR,LF,'error ; INTERNALLY REFERENCED ; EXIT A ERROR BITS ; ZERO SET IF SUCCESS ; C F5 PUSH PSW ;SAVE DURRING ECHO DBFD 4F MOV C,A ;ECHO RESPONSE DBFE CDF1DC CALL CONOUT DC01 F1 TO DC20 EE20 XRI 0010$0000B DC22 1F RAR ;HEAD LOAD BIT FOR COMMAND DC23 1F RAR DC24 1F R CALL CMD$TY1 ;ISSUE HOME COMMAND DBD6 C29DDB JNZ ERROR ;ERROR IN HOMING DBD9 3A5ADE LDA RTRYCNT ;GET RETRY COUNT  ; INTERNALLY REFERENCED ; ENTRY E 1771 COMMAND ; HL I/O ADDRESS ; EXI', ' '+80H DBA9 F1 POP PSW ;GET ERROR BITS BACK DBAA CDDFDC CALL PHEX ;PRINT THEM AS A HEX NUMBER DBAD CDD2DC  CMD$TY1: DC0D D3E8 OUT COMMAND ;SEND COMMAND DC0F DBEC IN WAIT DC11 DBE8 IN STATUS ;GET ALL ST"  :10DB69006069224000C91EA8011E88CD43DC3E0A17 :10DB7900325ADECD89DC3A33DA77D3EB3E1ACD0D52 :10DB8900DCC29DDB3A34DAD3EA2A4000CD1I A,WFMT ;CLEAR DLAB OUT LCR LIST1: CALL LISTST ;PRINTER READY? ORA A ;SET FLAGS JZ LIST1 ;LOOP UNTIL READY MOV A,C ;GE; EXTERNALLY REFERENCED ; ENTRY C CHARACTER ; EXIT A,FLAGS CLOBBERED ; LIST: IF EPROM ;IF DRIVER IN EPROM MOV A,C ;MOVE 80H ; 2.2 7 0380H ; ;************************************************************* ; IF CPMVE08787F602D3ECCD89DC7ED3E9DBE8E620D1 :10DC5900C255DCDBE817C9CD92DCB7CA60DC3A03F0 :10DC690000CD1ADD75DC75DC7ADC7FDCDB03C38172 :;CHANGE LINE FEED TO FORM FEED LZERO: XRA A ;CLEAR A STA LCOUNT ;ZERO LINE COUNT RET ENDIF ; BIOSIZE: EQU $-CBIOS ;AC6DCDB6D :10DB9900E8E6FCC8F5CDD2DC0D0A6572726F72A099 :10DBA900F1CDDFDCCDD2DC20696E20747261636B4C :10DBB900A03A33DACDDFDCCDD2DCT CHAR OUT THR ;SEND TO PRINTER RET ; PROCESS LINE FEED CHARACTER LFEED: PUSH PSW ;SAVE CHAR PUSH H ;SAVE HL LXI H,LCHAR TO A ANI 07FH ;STRIP PARITY MOV C,A ;AND MOVE IT BACK CALL DIABDR ;CALL DRIVER RET ENDIF ;IF DRIVER IN EPROM ; RS EQ 22 ; THE FOLLOWING AREA IS UNINITIALIZED RAM ; IT IS NOT LOADED FROM DISK BUT THE REQUIRED ; SPACE MUST BE AVAILABLE10DC7900DCDB04C381DCDB10E67FFE7FC03E08C924 :10DC89003A35DAC6376F26DAC93A0300CD1ADDA06C :10DC9900DCA0DCA9DCB2DCDB00E6013E00C02FTUAL SIZE OF CBIOS ; IF CPMVERS EQ 22 FREE: EQU 0380H-BIOSIZE ;REMAINING BIOS SIZE ELSE FREE: EQU 0480H-BIOSIZE ENDI20736563746F34 :10DBC90072A03A34DACDDFDC3E02CD0DDCC29DDB3A :10DBD9003A5ADE3D325ADEC27CDBCDD2DC2C5265AC :10DBE900747279206F722COUNT ;POINT TO LINE COUNT INR M ;INCREMENT IT MOV A,M ;GET NEW COUNT CPI 57 ;PAST LAST PRINTED LINE? CZ FFEED ;YES, CHE IF MULTIO ;IF MULTIO BOARD MOV A,C ;GET CHAR ANI 07FH ;STRIP PARITY MOV C,A ;PUT BACK STRIPPED CHAR CPI LF ;LINE FEED? BEFORE THE END OF MEMORY ENDEF ENDIF RTRYCNT DS 1 ;DISK RETRY COUNT END C958 :10DCA900DB05E6023E00C82FC93E03D317DB15E6A4 :10DCB900013E00C82FC9CD92DCB7C260DCDB00E6AB :10DCC90002C2BFDCDB02E67FC9E34ECF ; ;*********************************************************** ; NOTE: ; ; THE VALUE OF BIOSIZE CALCULATED ABOVE SHOUL049676E6F7265BFCD605C :10DBF900DCE65FF54FCDF1DCF1D649C8FE09C2E399 :10DC0900DBC377DBD3E8DBECDBE8E699C93ED0D3AD :10DC1900E8E3E3CK FOR AUTO LINE FEED CPI 67 ;PAST LAST REAL LINE? CZ LZERO ;YES, ZERO LINE COUNT POP H ;RESTORE HL POP PSW ;AND CHAR  CZ LFEED ;YES, PROCESS IT CPI FF ;FORM FEED? CZ FFEED ;YES, PROCESS IT MVI A,1 ;SELECT MULTIO GROUP 1 OUT GRPCTL MV ELSE SET UP READY SIGNAL RET ;AND RETURN WITH A=FF ENDIF ; ENDIF ;CPM 2.2 ; ; ; ; OUTPUT CHARACTER TO LIST DEVICE D NOT ; EXCEED THE FOLLOWING VALUE: ; ; CP/M VERS MAX # OF SECTORS MAX BIOS SIZE ; 1.4 9 04DBE8E620EE201F1F1FB3D3E8FEAD :10DC2900A8D238DCDBECB7F0DBEB7723C32DDCDBE8 :10DC3900ECB7F07ED3EB23C338DC3A35DA2F87878C :10DC490RET ; PROCESS FORM FEED FFEED: IN 0FFH ;INTERROGATE SWITCHES ANI 80H ;AUTO TOP OF FORM? RNZ ;NO, DO NOTHING MVI C,FF # 20736563746F54 :10D3C90072A03A34D2CDDFD43E02CD0DD4C29DD362 :10D3D9003A5AD63D325AD6C27CD3CDD2D42C5265D4 :10D3E900747279206F722 ; ENTRY (SELREQ) DRIVE TO BE SELECTED ; EXIT A,C,FLAGS,HL CLOBBERED ; IN PASCAL VERSIDATA IS READ - GO GET IT DC33 77 MOV M,A ;LOAD INTO DMA ADDR DC34 23 INX H DC35 C32DDC JMP XRLOOP  REG A DC46 2F CMA ;COMPLIMENT FOR CONTROL LATCH PORT DC47 87 ADD A ;ROTATE BITS 0-1 TO 4-5 DC48 87 C980 :10D4A900DB05E6023E00C82FC93E03D317DB15E6AC :10D4B900013E00C82FC9CD92D4B7C260D4DB00E6C3 :10D4C90002C2BFD4DB02E67FC9E34EC CALL MSGP ;GIVE MOUNT MESSAGE DB 13, 10, 'MOUNT', ' '+80H MVI A,'A' ;CON049676E6F7265BFCD6064 :10D3F900D4E65FF54FCDF1D4F1D649C8FE09C2E3B1 :10D40900D3C377D3D3E8DBECDBE8E699C93ED0D3C5 :10D41900E8E3E3ONS: AS ABOVE EXCEPT ; EXIT CARRY SET IF DRIVE NOT READY OR NON-EXISTANT ;  XWLOOP: DC38 DBEC IN WAIT ;WAIT FOR DRQ OR INTRQ DC3A B7 ORA A ;SET POSITIVE IF INTRQ DC3B F0  ADD A ; DC49 87 ADD A ; DC4A 87 ADD A ; DC4B F602 ORI 2 ;MAKE IT A DRIVE SELECT CAR DC25 B3 ORA E ;OR HEAD LOAD BIT IN WITH COMMAND DC26 D3E8 OUT COMMAND ;SEND COMMAND TO CONTROLLER DC28 FEVERT REQUEST TO ASCII DRIVE NAME ADD M MOV C,A ;PRINT REQUESTED DRIVE NAME DBE8E620EE201F1F1FB3D3E8FEB5 :10D42900A8D238D4DBECB7F0DBEB7723C32DD4DB00 :10D43900ECB7F07ED3EB23C338D43A35D22F8787A4 :10D4490DO$SEL: IF NODISKS EQ 1 ;GENERATE LOGICAL SEL CODE LXI H,SELREQ ;GET REQUEST  RP DC3C 7E MOV A,M ;GET DATA FOR DISK DC3D D3EB OUT DATA DC3F 23 INX H DC40 C338DC JMPOMMAND DC4D D3EC OUT CONTROL ;SEND COMMAND TO CARD DC4F CD89DC CALL HPADR ;TELL 1771 WHERE WE LEFT THE HEAD OFA8 CPI WRITCMD ;SEE IF READING OR WRITING DC2A D238DC JNC XWLOOP ;WRITING XRLOOP: DC2D DBEC  CALL CONOUT IN CDATA ;CLEAR ANY CHAR WHICH MIGHT BE WAITING ;GO TO CONIN TO WAIT 08787F602D3ECCD89D47ED3E9DBE8E620E1 :10D45900C255D4DBE817C9CD92D4B7CA60D43A0310 :10D4690000CD1AD575D475D47AD47FD4DB03C381A2 : MOV A,M INX H ;POINT TO LAST DRIVE SELECTED CMP M ;IS REQUEST SAME AS LAST SELECT XWLOOP ; ; ACTUALLY PERFORM DRIVE SELECTION ; INTERNALLY REFERENCED  DC52 7E MOV A,M ;THE NEW DRIVE BEING SELECTED DC53 D3E9 OUT TRACK SELDEL: DC55 DBE8  IN WAIT ;WAIT FOR DATA OR INTRQ DC2F B7 ORA A ;SET POSITIVE IF INTRQ DC30 F0 RP DC31 DBEB IN DATA ;FOR MOUNTING ELSE ;GENERATE PHYSICAL DRIVE SELECT CODE DC43 3A35DA LDA SELREQ ;GET DRIVE TO SELECT TO10D47900D4DB04C381D4DB10E67FFE7FC03E08C93C :10D489003A35D2C6376F26D2C93A0300CD1AD5A08C :10D49900D4A0D4A9D4B2D4DB00E6013E00C02FED? RZ ;IF SO - SELECT DOES NOTHING MOV M,A ;IF NOT - UPDATE LAST SELECTED=REQUEST $  IN STATUS ;UNLOAD HEAD BECAUSE 1771 DOES DC57 E620 ANI 20H ;NOT RECOGNIZE DRIVE SWITCH DC59 C255DC JNZ S DC86 3E08 MVI A,'H'-40H ;ELSE REPLACE IT WITH BACKSPACE ENDIF ;IF CPMVERS EQ 22 ;  ; CONIN2: ;KEYBOARD VIA VIO-X DC7A DB04 IN CDATA2 ;READ A CHARACTER. DC7C C381DC JMP CONINX 98 A0DC DW CONST1 ;0=KEYBOARD DC9A A0DC DW CONST1 ;1=KEYBOARD DC9C A9DC DW CONST2 ;2=VIO-X DC9E B2DC  ORA A ;READY? DC64 CA60DC JZ CONIN ;NO, WAIT DC67 3A0300 LDA IOBYTE ;YES, GET IOBYTE DC6A CD1ADD CALL DISPTCE DC8E 6F MOV L,A ;RESULT OF ADD TO REG HL DC8F 26DA MVI H,HIGH DHPOS DC91 C9 RET ELDEL ;* THANKS-MARTY NICHOLS * DC5C DBE8 IN STATUS ;GET ALL STATUS BITS DC5E 17 RAL ;DRIVE NOT READY BIT DC88 C9 RET ; ; ; CALCULATE HEAD POSITION BYTE ADDRESS ;GO TO COMMON EXIT ; CONIN3: ;MULTIO ACE#3 DC7F DB10 IN RBR ;READ RECEIVER BUFFER RE DW CONST3 ;3=MULTIO ACE#3 ; CONST1: ;KEYBOARD VIA 3P+S (CUTER COMPATIBLE) DCA0 DB00 H ;DISPATCH TO PROPER ROUTINE DC6D 75DC DW CONIN1 ;0=KEYBOARD DC6F 75DC DW CONIN1 ;1=KEYBOARD DC71 7ADC  ENDIF ; ; CHECK CONSOLE INPUT STATUS ; INTERNALLY AND EXTERNALLY REFERE INTO CARRY DC5F C9 RET ENDIF ; ; READ A CHARACTER FROM CONSOLE  ; INTERNALLY REFERENCED ; ENTRY (SELREQ) DESIRED DRIVE NUMBER ; EXIT HL ADDRESS OF HEAD POGISTER ; CONINX: ;COMMON EXIT ROUTINE DC81 E67F ANI 7FH ;STRIP OFF PARITY  IN CSTAT1 ;READ CONSOLE STATUS DCA2 E601 ANI CKBR1 ;LOOK AT KB READY BIT DCA4 3E00 MVI A,0 ;SET A=0 FOR RETUDW CONIN2 ;2=VIO-X DC73 7FDC DW CONIN3 ;3=MULTIO ACE#3 ; CONIN1: ;KEYBOARD VIA 3P+S NCED ; EXIT A 0FFH IF CHRACTER IS READY, 0H IF NOT READY ; FLAGS CLOBBERED ;  ; INTERNALLY AND EXTERNALLY REFERENCED ; EXIT A CHARACTER READ, PARITY RESET SITION BYTE FOR DRIVE ; A,FLAGS CLOBBERED ; IF NODISKS NE 1  IF CPMVERS EQ 22 ;IF CP/M 2.2 DC83 FE7F CPI DEL ;IS IT A DEL? DC85 C0 RNZ ;NO, RETURN WITH IT IN HANDRN DCA6 C0 RNZ ;NOT READY WHEN HIGH DCA7 2F CMA ;IF READY A=FF DCA8 C9 RET ;RETURN FROM CONST (CUTER COMPATIBLE) DC75 DB03 IN CDATA1 ;READ A CHARACTER. DC77 C381DC JMP CONINX ;GO TO COMMON EXIT  CONST: DC92 3A0300 LDA IOBYTE ;GET IOBYTE DC95 CD1ADD CALL DISPTCH ;DISPATCH TO PROPER ROUTINE DC; FLAGS CLOBBERED ; CONIN: DC60 CD92DC CALL CONST ;READ CONSOLE STATUS DC63 B7  HPADR: DC89 3A35DA LDA SELREQ ;GET REQUESTED DRIVE DC8C C637 ADI LOW DHPOS ;ADD TO BASE OF HEAD POSITION TABL%  ; CONST2: ;KEYBOARD VIA VIO-X DCA9 DB05 IN CSTAT2 ;READ CONSOLE STATUS DCAB E602  MESSAGE ADDRESS (RETURN ADDRESS) ; EXIT C,A,FLAGS CLOBBERED ; NOTE: MODIFYS RETURN ADDRESS BIT DCCA C2BFDC JNZ READER ;LOOP UNTIL READY DCCD DB02 IN RDATA ;READ BYTE DCCF E67F ANI 7FH ;STRIP PARITY ;FALL THRU TO PRINT IT ; ; PRINT ONE HEX DIGIT ; INTERNALLY REFERENCED HEN LOW DCBD 2F CMA ;IF READY A=FF DCBE C9 RET ;RETURN FROM CONST ; ;  RET ; ; PRINT TWO HEX DIGITS ; INTERNALLY REFERENCED ROUTINE  ANI CKBR2 ;LOOK AT KB READY BIT DCAD 3E00 MVI A,0 ;SET A=0 FOR RETURN DCAF C8 RZ ;NOT READY WHEN LOW DCAND RETURNS ONE BYTE PAST ; END OF MESSAGE. ; MSGP: DCD2 E3 XTHL ; PUNCH: ;DUMMY DEVICE DCD1 C9 RET ; ; ;  ; ENTRY A B3-B0 NIBBLE TO BE PRINTED AS A HEX DIGIT ; EXIT A,C,FLAGS CLOBBERED  ; PAPER TAPE READER ; EXTERNALLY REFERENCED ; EXIT A=CHARACTER READ  ; ENTRY A 8-BIT VALUE TO BE PRINTED AS TWO HEX DIGITS ; EXIT A,C,FLAGS CLOBBERED ; B0 2F CMA ;IF READY A=FF DCB1 C9 RET ;RETURN FROM CONST ; CONST3: ;MULTIGET MESSAGE ADDRESS TO REG HL MSG1: DCD3 4E MOV C,M ;GET A CHR FROM MESSAGE DCD4 CDF1DC CALL CO ; ; ; IN-LINE MESSAGE PRINTER ; THE MESSAGE MUST BE TERMINATED BY  ; PNIB: DCE8 E60F ANI 0000$1111B ;LEAVE ONLY LOW NIBBLE DCEA C690 ADI 90H ;CAUSE CARRY IF >  ; DCBF CD92DC READER: CALL CONST ;DOES CONSOLE WANT TO INTERRUPT? DCC2 B7 ORA A ;CHECK FLAGS DCC3 C260DC  PHEX: DCDF F5 PUSH PSW ;SAVE LOW NIBBLE DCE0 1F1F1F1F RAR ! RAR ! RAR ! RAR ;POSITION HIGH NIBBLE O ACE#3 DCB2 3E03 MVI A,3 ;SELECT MULTIO GROUP 3 DCB4 D317 OUT GRPCTL DCB6 DB15 IN LSR ;READ LINE STATUSNOUT ;PRINT IT DCD7 7E MOV A,M ;GET CHR BACK DCD8 23 INX H ;POINT TO NEXT DCD9 B7 ORA A ;WAS BIT 7BIT 7 HIGH ON THE LAST ; CHARACTER. ; INTERNALLY REFERENCED ; ENTRY STACK TOP9 DCEC 27 DAA DCED C640 ADI 40H DCEF 27 DAA DCF0 4F MOV C,A ;PASS ASCII CHAR TO CONOUT  JNZ CONIN ;YES, GO SERVICE IT DCC6 DB00 IN RSTAT ;ELSE GET READER STATUS DCC8 E602 ANI RRBIT ;LOOK AT READY FOR PRINT DCE4 CDE8DC CALL PNIB ;PRINT HIGH NIBBLE DCE7 F1 POP PSW ;GET LOW NIBBLE BACK AND . .  REGISTER DCB8 E601 ANI DR ;DATA READY? DCBA 3E00 MVI A,0 ;SET A=0 FOR RETURN DCBC C8 RZ ;NOT READY W SET ON LAST CHR? DCDA F2D3DC JP MSG1 ;YES - KEEP PRINTING DCDD E3 XTHL ;NO - PUT RETURN ADDRESS BACK DCDE C9&  ;FALL THRU TO CONOUT ; ; OUTPUT A CHARACTER TO CONSOLE ; INT RET ; CONOUT2: ;OUPUT VIA VIO-X BOARD DD00 DB05 IN CSTAT2 ;READ STATUS DD0BACKSPACE? JNZ CONOT2 ;NO, PROCESS NORMALLY MVI C,01H ;ELSE REPLACE IT WITH A CUTER BACK ; ; DISPTCH: DD1A 07 RLC ;DOUBLE THE CODE BITS OF INTEREST DD1B E606 A IF EPROM CALL VDMDR ;IN EPROM ENDIF ; IF CUTER  DD16 79 MOV A,C ;GET CHAR DD17 D310 OUT THR ;OUTPUT DATA DD19 C9 RET ; ERNALLY AND EXTERNALLY REFERENCED ; ENTRY C ASCII CHARACTER TO BE SENT ; EXIT A,FLAGS CLOBBERE2 E601 ANI CPTR2 ;READY? DD04 CA00DD JZ CONOUT2 ;NO, KEEP LOOPING DD07 79 MOV A,C ;GET CHAR DD08 D304 SPACE MOV A,C ;ALSO IN A CONOT2: STA LASTCH ;SAVE LAST CHAR TRANSMITTED NI 06H ;MASK OUT ALL OTHER BITS DD1D E3 XTHL ;SAVE HL,GET ADDRESS OF TABLE DD1E D5 PUSH D ;SAVE DE DD1F 5 MOV A,C ;GET CHAR CPI CR ;IS IT CR? JNZ CONOT1 ;NO, PROCESS NORMALLY  ; ; ; ; I/O DISPATCH ROUTINE (INTERNALLY REFERENCED) ; D ; CONOUT: DCF1 3A0300 LDA IOBYTE ;GET IOBYTE DCF4 CD1ADD CALL DISPTCH ;DISPATCH  OUT CDATA2 ;OUTPUT DATA DD0A C9 RET ; CONOUT3: ;OUPUT VIA MULTIO ACE#3 DD0B 3 PUSH B ;SAVE ENVIRONMENT PUSH H MOV B,C ;PUT CHAR IN B CALL SOUT F MOV E,A ;PUT DOUBLED CODE IN E DD20 1600 MVI D,0 ;AND CLEAR D DD22 19 DAD D ;ADD DOUBLED CODE TO BRA LDA LASTCH ;ELSE GET LAST CHAR TRANSMITTED CPI CR ;WAS IT A CR? MOV A(DISPATCHES ACCORDING TO IOBYTE VALUE) ; ON INPUT: A=IOBYTE FIELD VALUE ROTATED TO BITS 0-1 ; TO APPROPRIATE ROUTINE DCF7 FFDC DW CONOUT1 ;0=VDM DRIVER DCF9 00DD DW CONOUT2 ;1=VIO-X DCFB 00DD DW CONE03 MVI A,3 ;SELECT MULTIO GROUP 3 DD0D D317 OUT GRPCTL COUT3A: DD0F DB15 IN LSR ;READ LI;OUTPUT IT POP H ;RESTORE ENVIRONMENT POP B ENDIF ;IF CUTER DCFF C9NCH TABLE ; ;TO FIND ADDRESS OF DRIVER DD23 7E MOV A,M ;GET LOW BYTE OF DRIVER ADDR DD24 23 ,C ;RESTORE CHAR IN A RZ ;YES, DON'T PROCESS IT ; CONOT1: CPI 'H'-40H ;ON OUTPUT: EXECUTES DRIVER ACCORDING TO BRANCH TABLE ; IMMEDIATELY FOLLOWING CALLING ROUTINE OUT2 ;2=VIO-X DCFD 0BDD DW CONOUT3 ;3=MULTIO ACE#3 ; CONOUT1: ;VDM DRIVER NE STATUS REGISTER DD11 E620 ANI THRE ;TRANMITTER HOLDING REGISTER EMPTY? DD13 CA0FDD JZ COUT3A ;NO, KEEP LOOPING '  INX H ;NOW POINT TO HIGH BYTE OF DRIVER DD25 66 MOV H,M ;AND PUT IT INTO H DD26 6F MOV L,A ;PUT THE LOW B ; EXIT A,FLAGS CLOBBERED ; LIST: IF EPROM ;IF DRIVER IN EPRDB15 IN LSR ;ELSE READ LINE STATUS REGISTER DD35 E620 ANI THRE ;TRANSMITTER BUFFER EMPTY? DD37 C8 RZ ;NOM MOV A,C ;MOVE CHAR TO A ANI 07FH ;STRIP PARITY MOV C,A ;AND MOVE IT BAC ANI PTBE ;PRINTER TRANSMITTER BUFFER EMPTY BIT MVI A,0 ;SET A=0 FOR RETURN N THE CBIOS MAY BE INTERNALLY REFERENCED (CALLED ; FROM WITHIN THE CBIOS), EXTERNALLY REFERENCED (CALLED BY CP/YTE INTO L DD27 D1 POP D ;RESTORE DE DD28 E3 XTHL ;PUT DRIVER ADDR ON STACK,RESTORE HL DD29 C9 REDF1DC7E2375 :10DCD900B7F2D3DCE3C9F51F1F1F1FCDE8DCF1E65E :10DCE9000FC69027C640274F3A0300CD1ADDFFDC47 :10DCF90000DD00DD0BDDC9DBO, RETURN WITH A=00 DD38 3EFF MVI A,0FFH ;ELSE SET UP READY SIGNAL DD3A C9 RET ;AND RETURN WITH A=FF K CALL DIABDR ;CALL DRIVER RET ENDIF ;IF DRIVER IN EPROM RNZ ;NOT READY WHEN NOT 0. CMA ;IF READY A=FF. RET ENDIF M) ; OR BOTH. ANY ROUTINE WHICH IS EXTERNALLY REFERENCED IS ; ASSUMED TO CLOBBER ALL REGISTERT ;DISPATCH TO DRIVER ; ; ; LIST DEVICE STATUS ; EXTERNALLY05E601CA00DD79D3F6 :10DD090004C93E03D317DB15E620CA0FDD79D3100A :10DD1900C907E606E3D55F1600197E23666FD1E3CE :10DD2900C93E01D31 ENDIF ; ENDIF ;CPM 2.2 ; ; ;  ; IF MULTIO ;IF MULTIO BOARD DD3B 79 MOV A,C ;GET CHAR DD3C E67F ANI 07FH ;STRIP PARITY D IF MULTIO DD2A 3E01 MVI A,1 ;SELECT MULTIO GROUP #1 DD2C D317 OUT GRPCTL DD2E DB16 S. REGISTER USAGE OF ROUTINES ; REFERENCED ONLY INTERNALLY IS DECLARED IN THE PRE-ROUTINE ; C REFERNECED ; EXIT A=0 IF NOT READY ; A=FF IF READY ; 7DB16E610C8DB15E620C83E4D :10DD3900FFC979E67F4FFE0ACC5CDDFE0CCC70DDB5 :10DD49003E01D3173E03D313CD2ADDB7CA51DD797E :10DD5900D3 ; OUTPUT CHARACTER TO LIST DEVICE ; EXTERNALLY REFERENCED ; ENTRY C CHARACTER D3E 4F MOV C,A ;PUT BACK STRIPPED CHAR DD3F FE0A CPI LF ;LINE FEED? DD41 CC5CDD CZ LFEED ;YES, PROCESS IT IN MSR ;READ MODEM STATUS REGISTER DD30 E610 ANI CTS ;CLEAR TO SEND? DD32 C8 RZ ;NO, RETURN WITH A=00 DD33 OMMENT BLOCK. ANY REGISTERS NOT MENTIONED ARE PRESERVED. ; ; DE00 ORG CBIOS ;ORG IF CPMVERS EQ 22 LISTST: IF NOT MULTIO IN PSTAT ;READ PRINTER STATUS 10C9F5E52139DA347EFE39CC70DDFE00 :10DD690043CC77DDE1F1C9DBFFE680C00E0CAF32B1 :03DD790039DAC9CB :0000000000 (  DD44 FE0C CPI FF ;FORM FEED? DD46 CC70DD CZ FFEED ;YES, PROCESS IT DD49 3E01 MVI A,1 ;SELECT MULTIO GROUP  FREE: EQU 0480H-BIOSIZE ENDIF ; ;************************************* ANI 80H ;AUTO TOP OF FORM? DD74 C0 RNZ ;NO, DO NOTHING DD75 0E0C MVI C,FF ;CHANGE LINE FEED TO FORM FEEe}o}2,W*LW!yOx#Gi`"-WA:e2,W!~#fo!LWyOx#Gi`"-W>28WͫyY!(2D!~#fo"LWáS sector: head: VerifTO LINE COUNT DD61 34 INR M ;INCREMENT IT DD62 7E MOV A,M ;GET NEW COUNT DD63 FE39 CPI 57 ;PAST LAST IF CPMVERS EQ 22 ; THE FOLLOWING AREA IS UNINITIALIZED RAM ; IT IS NOT LOADED FR1 DD4B D317 OUT GRPCTL DD4D 3E03 MVI A,WFMT ;CLEAR DLAB DD4F D313 OUT LCR DD51 CD2ADD LIST1: CALL L********************** ; NOTE: ; ; THE VALUE OF BIOSIZE CALCULATED ABOVE SD DD77 AF LZERO: XRA A ;CLEAR A DD78 3239DA STA LCOUNT ;ZERO LINE COUNT DD7B C9 RET Ey timeout: track: ͋S:e2,W2-W2.W!~#fo}/o|/g}og))!eyOx#Gy2/W!~#fo}og}23W!N#F!2N}og}24W!~25W>2 PRINTED LINE? DD65 CC70DD CZ FFEED ;YES, CHECK FOR AUTO LINE FEED DD68 FE43 CPI 67 ;PAST LAST REAL LINE? DD6A COM DISK BUT THE REQUIRED ; SPACE MUST BE AVAILABLE BEFORE THE END OF MEMORY ENDEF DD7C+= ISTST ;PRINTER READY? DD54 B7 ORA A ;SET FLAGS DD55 CA51DD JZ LIST1 ;LOOP UNTIL READY DD58 79 MOV A,C HOULD NOT ; EXCEED THE FOLLOWING VALUE: ; ; CP/M VERS MAX # OF SECTORS MANDIF ; 037C = BIOSIZE: EQU $-CBIOS ;ACTUAL SIZE OF CBIOS ; 7W!6W"ti*ti6*ti~OG!eyx#>2 f> 2ri2si:ri2ri:si2si!ri~#ʙͫy®!{!N#FP!s!N#FP!i*C77DD CZ LZERO ;YES, ZERO LINE COUNT DD6D E1 POP H ;RESTORE HL DD6E F1 POP PSW ;AND CHAR DD6F C9 o}2/W>23W*e ~24W*e ~25W*e!KM }26W>27WͫyL!(2D!"-W>27Wͫyj!(2D2-W2.W*e ~24W>27;GET CHAR DD59 D310 OUT THR ;SEND TO PRINTER DD5B C9 RET ; PROCESS LINE FEEX BIOS SIZE ; 1.4 9 0480H ; 2.2 7 03 IF CPMVERS EQ 22 0004 = FREE: EQU 0380H-BIOSIZE ;REMAINING BIOS SIZE ELSE ti~OGP!gáSáS: fOGy¨xu:8WOGy½xʙ:8W2 f.: f:!ri~#:!]"pi!]*e :pi:qiu*pi~OG! RET ; PROCESS FORM FEED DD70 DBFF FFEED: IN 0FFH ;INTERROGATE SWITCHES DD72 E680 Wͫy”!(2D2LW2MWÇSSeek timeout ͋S>P2ti2ui:LW:MW!:LW:MW#áS:e2/W>27W!!LW  #"*D CHARACTER DD5C F5 LFEED: PUSH PSW ;SAVE CHAR DD5D E5 PUSH H ;SAVE HL DD5E 2139DA LXI H,LCOUNT ;POINT 80H ; ;************************************************************* ; ) yx#|*pi]}o|g*ti~OG!N#F!N#F|! !riyOx#G! *ti~OG!N#F!N#F: fOG! 9*ti4 *pi#2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!N#FP!! N#FP! ~ «#~!! N#FP!! N#F!N#F!N#F&!!N#FE! w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn ut: track: ͋S:e2,W2-W2.W!~#fo}/o|/g}og))!eyOx#Gy2/W!~#fo}og}23W!N#F!2N}og}24W!~25W>27W!6W"t)*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"pi FATAL! Count: Sector: Head: error. Track: Verify: ̀S!!~#fo)xW N#F!!N#FP!)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%)͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐-:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)i*ti6*ti~OG!eyx#>2f> 2ri2si:ri2ri:si2si!ri~#ʙͫy!t!N#FP!l!N#FP!b*ti~OG"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!N#FP!! N#FP! ~ .#~k!! N#FP!! N#F!N#F!N#F&â!!N#FE! *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDP!`áSáS*ti4:fOGy¨xʒ! !riyOx#G! *ti~OG!N#F!N#F:fOGA! 9Ò:8WOGyxʙ:8W2!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)! N#F!N#F!N#F&!ÇS Byte: Sector: Head: Data compare: Track: ̀S!!N#FP!!)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!"j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) M!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#Wf' FATAL! Count: Sector: Head: error. Track: Write: ̀S!9!~#fo)xW N#F!)!N#FP!!!͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)N#FP!!N#FP!! N#FP!!!N#F!N#F!N#F&ÇS sector: head: Verify timeo)!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V"* DPB0 ;DIR BUFF,PARM BLOCK DE46+1BE2FCE1 DW CSV0,ALV0 ;CHECK, ALLOC VECTORS DE4A+69DE0000 DPE1: DW XLT1,0000H ;TRANSLATE T DS 16 DE2B+ ALV1: DS 31 DE4A+ CSV1: DS 16 DE5A+= ENDDAT EQU $ 00DE+= DATSIZ EQU $-BEG3A DPE0 DA4A DPE1 0001 DR DE5A ENDDAT 0000 EPROM DB9D ERROR 0000 FALSE 000C FF DD70 FFEED 00D0 FINTCMD DBE3 FOOL 0004 FREE DB1 IN ; THE CPM SYSTEM. ; IF NOT PASCAL CBOOT: LXI SP,100H ;SET STACK FOR INITILIZATION ;NOTE: SOME RAM INITIALIZATION CONIN DC75 CONIN1 DC7A CONIN2 DC7F CONIN3 DC81 CONINX DCF1 CONOUT DCFF CONOUT1 DD00 CONOUT2 DD0B CONOUT3 DC92 CONST DCA0 CONST VDM CURSOR DW SCREEN+3C0H ENDIF IF BACKSPC RUBFLG DB 0 ;NON ZERO IF RUBOUT WAS LAST CHR TYPED ENDIF IF PASCAL BKABLE DE4E+00000000 DW 0000H,0000H ;SCRATCH AREA DE52+7CE15ADE DW DIRBUF,DPB1 ;DIR BUFF,PARM BLOCK DE56+4AE22BE2 DW CDAT ENDIF DE5A RTRYCNT DS 1 ;DISK RETRY COUNT DE5B END 8 GOCPM 0017 GRPCTL FFFF H1500 0000 HOMECMD DB3A HOME DC89 HPADR 0011 IER 0012 IIR 0000 IMASK F000 INITDR 0003 IOBYTE 0040 IOHAS BEEN DB'D ;INTO THE RAM DEFINITION ABOVE IN CDATA ;CLEAR CONSOLE DATA PORT IN RDATA ;CLEAR READER DATA PORT XRA A ;1 DCA9 CONST2 DCB2 CONST3 00EC CONTROL DD0F COUT3A C400 CPMB 0016 CPMVERS 0080 CPTR1 0001 CPTR2 C800 CRAM 000D CR 0010 CSS1 0CHR DB 0 ;BREAK CHARACTER, 0 IF EMPTY FLUSH DB 0 ;FLUSH OUTPUT IF NON ZERO ENDIF IF LCASE ULTG DB 0FFH ;UPPER CASE=0SV1,ALV1 ;CHECK, ALLOC VECTORS DISKDEF 0,1,26,6,1024,243,64,64,2 DE5A+= DPB0 EQU $ ;DISK PARM BLOCK ; IF CPMVERS EQ 22 DISKS 2 DE3A+= DPBASE EQU $ ;BASE OF DISK PARAMETER BLOCKS :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  ACOME UP ON DRIVE A STA DISKNO IF VDM OUT SCRLPT ;INITIALIZE VDM SCROLL PORT CALL CLEAR ;CLEAR SCREEN ENDIF CALL000 CSTAT1 0005 CSTAT2 DE1B CSV0 DE4A CSV1 0010 CTS 0000 CUTER 00EB DATA 00DE DATSIZ 00E8 DBASE 007F DEL DA37 DHPOS F006 DIAB, LOWER CASE OTHERWISE ENDIF IF CPMVERS EQ 22 DISKS 2 DISKDEF 0,1,26,6,1024,243,64,64,2 DISKDEF 1,0 ENDIF ; ; COLDDAD7 ACEINIT 001F ALS1 DDFC ALV0 DE2B ALV1 C01C AOUT 0010 BASE 0006 BAUD1 0180 BAUD2 0006 BAUD3 CC06 BDOS DD7C BEGDAT 9000 BIA DE3A+69DE0000 DPE0: DW XLT0,0000H ;TRANSLATE TABLE DE3E+00000000 DW 0000H,0000H ;SCRATCH AREA DE42+7CE15ADE DW DIRBUF,MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ>  BEGDAT EQU $ DD7C+ DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER DDFC+ ALV0: DS 31 DE1B+ CSV0:DR DD7C DIRBUF 0004 DISKNO DD1A DISPTCH 0080 DLAB 0010 DLL 0011 DLM DC43 DOSEL 002C DOSSECT DA5A DPB0 DA5A DPB1 DA3A DPBASE DA BOOT ; EXTERNALLY REFERENCED ; THIS SECTION IS EXECUTED WHENEVER RESET AND RUN ; IS PUSHED, AFTER THE COLDSTART LOADER READSS 037C BIOSIZE DAFC BOOTSEC DA00 CBIOS DA83 CBOOT 0003 CDATA1 0004 CDATA2 0001 CKBR1 0002 CKBR2 DC0D CMDTY1 00E8 COMMAND DC60 + :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> (INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE):O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ>  COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  ANTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> , ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> E "&" TO REPEAT$!ʵ#O 6$:S4DCARÝ_͎.&^e͎.&M^i͎.&M"l  i MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A !# Ñn  }  Lo  &i :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> $DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> !F#xʕ~wÆw!"  w# µ!~6͸:ɬø !¼#͘*~ MD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> :O͍:O:O/ :*!9"!9"!9" !9" !!9"!$9"!'9"1#YSTEM$ATA$LL$+COMMAND "COPY$" HZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 :O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  A͌#>?͌͘æq =_.:;<> 5o$>!?2ʬ*5"o@G:v:ɬw|x2ʬp:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AAS SYNTAX ERROR $+THIS PROGRAM IS INITIATED WITH THE COMMAND +"COPY SYSTEM", "COPY DATA" OR "COPY ALL"$+FUNCTION COMPLETE - US:O͍:O:O/ :2!m!$͐!$$ N# >> :3 )>:<2  AMD!$"ͅ  ì *"ͅ> å!$"ͅ   *"ͅ> - ʟ#*6?Ñw~ʦÕ#6 Ÿ.ϧϧ#*¿6?w®֧ŧ#6 ϧ#6ا" #~? xDIR ERA TYIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"!0N#~ͼ „ Ͳ O2Ny:6'D'>.6'D'>-6'x&!!"V0*V0}!f/" :N2N!."Oø!N"O!0" * ~6!N^*O^#fk"V0͉=* G#*V0####*V0^#V0000000000000000000@@@@@@@@@@@@@@@@AA AAQQQ"Q'Q,Q1Q6aM2ɯ21ͳy͸<::‡1͘ͰA͌><& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M &À# $b${$*!:!X!!M"p"""""4#\#j# ()*+,-/ABCDEHLMDBDIDSDWEIEQGEGTIFINLELTNEORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADD,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\!0^*K0"V0*M0{z"K0!N"O1#w#w*V0!NN*O N#Fr+sq#p0U>G=#w#wY*M0!0n& {ozg"V0!K0{#z&)L)*Õ**x&t+!,ã-Ë,I,á&&M+*7%!I%w_:JASMPE%:L%%:M%%:I*~#  =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$#CRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASE =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(M"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBPRNFTYPEsHEX&FTYPEB&!%w_:%M&:%M&:%M&:%M&:%M&~*~# .~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/ # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +a2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+ *y2߻y >0O!~ϱw!qy2i`"YiYi~O#L!~w !件w ͸Ż:߻>„yxBALANCED MACRO LIB END OF ASSEMBLY G:%x-!%~--.-*P0*%O {-z-.*P0"%!%^4!%w.OOT 0003 WFMT 00A8 WRITCMD DB6F WRITE DC16 XFER DA69 XLT0 DA69 XLT1 DC2D XRLOOP DC38 XWLOOP 0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+IO 0002 NODISKS DCDF PHEX DCE8 PNIB 0000 PSTAT 003C PTBE DCD1 PUNCH 0002 RATE 0010 RBR 0002 RDATA 0088 READCMD DCBF READER DB~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~zÉӉxӊһʉ͸ʫ±Żګ±Żñ k>:߻»yۉ:߻ϻ{ۋ:߻ܻxۈ.WƐ'@'Õ*>:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞* CONSOLE 2 DATA PORT DE8A DB02 IN RDATA ;CLEAR READER DATA PORT DE8C DB01 IN MDATA ;CLEAR MODEM DATA PORT DE8E#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&72 READ 0000 REL 000A RETRIES DB77 RETRY 000A REVDAY 0007 REVMON 0052 REVYR 0002 RRBIT 0000 RSTAT DE5A RTRYCNT DB7C RTRY DB09 !<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&ŒzÉӉxӊһʉ͸ʫ±Żګ±Żñ k>:߻»yۉ:߻ϻ{ۋ:߻ܻxۈws!9" 1 2 :):og,ʸw!K CP/M DUMP UTILITY VERS 1.3 $, wCOPYRIGHT 1978 BY S. J. SINGER $V %͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,+,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT NSAMTRK CC00 SCREEN 00C8 SCRLPT 00EA SECT DB65 SECTRAN 0010 SEEKCMD DC55 SELDEL DB51 SELDSK DA35 SELREQ 00FF SENSE DB69 SETDMA *`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ D DA34 IOS DA33 IOT DA36 LASTSEL DA39 LCOUNT 0013 LCR 000A LF DD5C LFEED DD3B LIST DD51 LIST1 DD2A LISTST 0008 LOADHEAD 0015 DM4:ږ:>~4>2!"2!"28!"9:O Z!L?BOOT  *$ >2 1 2 !" !s# § >!\!s# ¿ #!A:!B:"2 O DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNDB4B SETSEC DB48 SETTRK C019 SOUT 00E8 STATUS 0010 THR 0020 THRE 00E9 TRACK FFFF TRUE F003 VDMDR 00EC WAIT DA03 WBOOTE DAEC WB*2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:eLSR DD77 LZERO 0014 MCR 0001 MDATA DA92 MINIT 0040 MRDY DCD3 MSG1 DCD2 MSGP 0038 MSIZE 0016 MSR 0000 MSTAT 0080 MTBE FFFF MULT/ >2 x~# !@ Bx?G=#* 7!@R%ZVALIDATEڐ!@m%rGROUP!@$p : !o͙à SECTOR $ !: o͙  >2  :} 2 Q 2 ͊  : <2 !\4 e!ÞCOM§!" : _\ʋ \ý:  !" * : \: \ $ XSUB DDT CPM56.COM IEBIOS56.HEX R4580 ICBOOT56.HEX R900 G0   * ~\  ! s# ¡  > }.T : }* w  : <2 Y!" Oì*.*" INCORRECT SECTOR NUMBER$  F INCORRECT TRACK NUMBER$-  À INCORRECT GROUP NUMBER (GREATER THAN 242)$%ÇG !@%ÝMAP+ !@%óDIRڇ !@%TRACK!@%T 1~!#:0&: oT))): _><  2 ~2 2 : _`o" !" t GROUP ALLOCATION MAP DRIVE -$G  : ~\  #y '     * ~G I>._#y f   :  * "S 037C BIOSIZE D2FC BOOTSEC D200 CBIOS D283 CBOOT 0003 CDATA1 0004 CDATA2 0001 CKBR1 0002 CKBR2 D40D CMDTY1 00E8 COMMAND D460 ͊ : 7 ? O*.!" : M?8O*."6* : _*.'"M: t DRIVE A -$Y Ç T  : ÷ NO FILE BY THAT NAME ON DRIVE A$   NO FILE BY THAT NAME ON DRIVE B$   DISK DEAD ?))) O } 2 !@+%1SECTORI!@D%FS !:} 2 2 " @l%m-Ғ:} 2 !— Ì A $  è à B $  *  $  ~ 0$  : <2 1$   * " >2 2 : _: M?ڷO*."* : 7?O*.!" *.'"m: 2 <2 º:CONIN D475 CONIN1 D47A CONIN2 D47F CONIN3 D481 CONINX D4F1 CONOUT D4FF CONOUT1 D500 CONOUT2 D50B CONOUT3 D492 CONST D4A0 CONSTTRACK $ !: oÿ ڢ |ę{0__͙ SECTOR $ !: o͙  ! : 4  ERROR$   * ERROR IN FILE NAME$  I ADDRESS ERROR$8  ìt ERROR - HEX INPUT ONLY $W  Y G~2 p* @%æEDITҌù EDIT - $ !  s#   >! %WRITE! %x y z 3  #   í D $6  * ͙| GROUPS REMAINING ON DISK OUT OF 243 $U  2 >2 À6# > w# < OE .dw# O7yo# j w# q  : _* $ $Y THAT NAM   NO FILE BY     STOP.!0 O))))  }A.5 |K}5 "   seƐ'@'_: \: \ : : _2 <2 : 7ʺ ?ں O*.!" : M? O*." *." *.'" INPUT ERROR$  0 000 CSTAT1 0005 CSTAT2 D61B CSV0 D64A CSV1 0010 CTS 0000 CUTER 00EB DATA 00DE DATSIZ 00E8 DBASE 007F DEL D237 DHPOS F006 DIABALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # CONSTRUCTING 56k CP/M vers 2.2$ALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # DR D57C DIRBUF 0004 DISKNO D51A DISPTCH 0080 DLAB 0010 DLL 0011 DLM D443 DOSEL 002C DOSSECT D25A DPB0 D25A DPB1 D23A DPBASE D2=!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m =!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m 3A DPE0 D24A DPE1 0001 DR D65A ENDDAT 0000 EPROM D39D ERROR 0000 FALSE 000C FF D570 FFEED 00D0 FINTCMD D3E3 FOOL 0004 FREE D31 xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w8 GOCPM 0017 GRPCTL FFFF H1500 0000 HOMECMD D33A HOME D489 HPADR 0011 IER 0012 IIR 0000 IMASK F000 INITDR 0003 IOBYTE 0040 IO#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  ,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INV#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 34 CPM56.COM"$*|  ,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVCONSTRUCTING 00k CP/M vers 2.2$1 >ͦ!q:_  !p+q.*   !q*&!p+q*2G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ_͌> ͒> Ò> Ò͘~#͌ì _2<2#~?  xDIR ERA TYPESAVEREN USER !yO#< Ty#O 321y_͸2y2ͽ:!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ^=ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(! ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!1y{0!B0}y|zx0y0{00 >ͦ!q:_  !p+q.*   !q*&!p+q*2FILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x \X COPYRIGHT (C) 1979, DIGITAL RESEARCH !p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*2 =qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO*{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ *2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==» Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  *C ^ O T  *C ~w D  -'   -@ ͦ ~^ *C  O x ! N!FwyADCOMf^: ! Â$$$ SUB"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈ yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ y==»*Ww# *" ͸ *:G#š" ͸ :!w4 i w: Z!E ~=26  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #Nxʋ>ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  "C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E ,NÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *#  2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎ &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6: :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-#  ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w* i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{ 2E > ! ^#V w#P :B O|^#V#"##"##"##"!ì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6yS:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK52*C ~=2u:B 2~2wE:A *C w>"#~?  xDIR ERA TYPESAVEREN USER !yO#< Ty#O 3ǯ21y_͸2y2ͽ:ķ Ň!˶2:2a{_:˷ʖ:˷>Ľʖ:=2–!B!6#5ʖ: HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD      00k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j<@$@B B HH II$@DI ABI$"$H$H !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*Oͧ>~ͻ>2!"2!"28!"9:O R![?boot  ç!Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I(  1y{0!B0}y|zx0y0{00ڀĀ@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>g#͘*~ "Ʒ"͌#>?͌͘ =_.:;<> Oƅo$>!Y2*O"ʉ@BIB@!  ! !! D \X COPYRIGHT (C) 1979, DIGITAL RESEARCH A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H :ʑw:2E* *E }DQ>2 yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈG:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" 15D715E0AB :100A700015E615EC15F515FE1504160A1611162CBB :100A80000E17161D1626162D16411647164D160E54 :100A9000155316040C040C9B1_͌> ͒> Ò> Ò͘~#͌ì _2<į2@@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$óadjmrux}çìûpñns ns<nskLns{?4 H ;CARRIAGE STEP SIZE (10/INCH) ELITE: EQU 05H ;CARRIAGE STEP SIZE (12/INCH) ; ;ASCII EQUATES *************** ; CR: EQU 0DH !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6: ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! ! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& ! ;CARRIAGE RET LF: EQU 0AH ;LINE FEED BL: EQU 20H ;SPACE FF: EQU 0CH ;FORM FEED ; ; ;ENTRY POINT ******************* ; ͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<26à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  LIST: IF PASCAL LDA FLUSH ;ARE WE FLUSHING OUTPUT? ORA A RNZ ;YES - FLUSH PRINTER TOO ENDIF PUSH H ! PUSH B ;2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 *!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!EŠ ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/> :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!qSAVE ENV. ; ;TEST BYTE FOR SPECIAL HANDLING ******** ; MOV A,C ;GET BYTE STA BYTE ;AND SAVE IT CPI CR ;CARRIAGE RET?  "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{&!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mHHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$ :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M5 ͯ m!62m!62m!62m!62m'2:2:TҒ:29Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ  ɯw4!Y~ʆ͌†t=ʆf ^ T ɯ2o&)|+!<ͧڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>1͘A͌>>͌92^ :˷¥.!_~#fow]ɭʎʥ!v"!çREAD ERRORçNO FILE^:˷!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ -:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yʸpsp2mÆÆf ͧ*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K: ! ~ 3#0 Wx x ƀ Ƃ G ~ # 3x~#B!Y~ɯ2:˷=!˾ý:˷=!˾:ý^T!*M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !FILE EXISTS _: É: :˷ʉ=2)ͽÉ T!@k!}|q¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x `ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H=qf^!~2>`~2˯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?† ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>! :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&66 ADCOMf^: !˶ Â$$$ SUB7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_! !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'OV M,A INX H JMP RLOOP ; RDONE: IN DSTAT RERR: ANI 9DH RET ; ; ERROR: CMA OUx: 2 p&x~+é7ͯ2 H! >w_: ! Ͼ5ͤNkͱ¦ͱxʊ#N MOV A,C CPI 27 JC RBLK2 MVI C,1 INR B JMP RBLK ; RBLK2: MOV A,C  ̙̥̫̱"C{2!"E9"1Aϯ22!ty)K!G_^#V*Cΐ~؃E؜إث ,' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂T 0FFH HLT ; ; ORG 7DH JMP 0 END x: Ϸ! ϖ2 ͤ! 5™#wO~x½p Hy<< ڷʑ :!qMD# CALL READ1 JMP RBLK1 ; ; READ1: OUT SECT IN DSTAT RRC MVI A,1 JC RERR &-AGMSϛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:HO*!O*|!6ʝ6>گ*w#w*w#w'û*ڷ! J*""!N#F*^#V*~#foyx*{_zW+*2E>! ^#V w#P:BO|^#V#"##"##"##"! MVI A,88H JMP READE ; READ: OUT SECT IN DSTAT RRC MVI A,1 JC R O͐  :ϷE B 2>: Ϸb# : Ϸy! 4 5~yy5 6yDM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{o:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""yx#*DM*s#r*s#ryOxG*0MD!!N:ٷ EG>O: \зSЀ*C :ٷqn& ^#V>O^2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ERR MVI A,8CH READE: OUT DCOM RLOOP: IN WAIT ORA A JP RDONE IN DDATA MҐ^H@Oy H H: –ͬ  #H: ! Ͼ Hù H H $O͐: 2 *CN# zgO{ozgi`N#Fogo&og H ©=¨7 "*}:*)=":O:١o"*C *C!ͮ~2~2ͦ:٦2ͮ:ЯO:فw:w |g}o*ٯ# Я2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄ w ~>2!E5T*C!"C"C!w# F! w͌xѯ2͢*C ~<wʃG:٠!٦ʎz8O!B N#N ¾SP.* |} !9":q!"2!q*C"͡ʔ*JҔ^:Oyʃ?|x | sӖ-|N-#  y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P  ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:مo$*C~i6iw*=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃ì 4~ʶ¬:<ʶ$ʶïZͻЯx>2>2ͻ:!پZկ2:EϷẅ́͊Ͳ>@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z zS:2E!~Яw>T D^6k-äPYy 5*{zBK52T*CGͻ:ẅ́n>2;O ^DM;}H>"*C :ٷ:ddslO s#r:EϷ͊:==»O=!9 Ÿ!6q!2qC J R q!z z=naO $q$,! *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwy͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEË"**#"͕: 2ٷÞy<_WyOxOxG* ~V5dw^ :ٷʈÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘y==»*Ww#*"͸*:G#š"͸:!پw4 iw:Z!E~=26;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qyxʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ٷ~w~͔͔# # C–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:AϾ#~$=2Ek͌=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ8 O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLREÇS̀S!9!!~#fo|g!'i`! 6!ÇS̀S!9!~#fo~ ! y !!! yw!~*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O {7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P  ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"]"0W>22W!]"ti!]*e :ti:ui;*ti*ti#"ti!~*f"f!f:f:f#*fͬ*f"f!f:f:f#*f*f͌*f#"T HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB AN+2D+ÇS!~#fo~ a! ! a!~ ! y5!! yXx 2D !~#fo~OG! !~w `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =«q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f ff^!e~#áS*f#"fA!!N#FP!!]"0W>22W*f"f!f:f:f#*fͬ*f"f!f:f:f#!N#F*A XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!E#~wTesting disc. ̀S!!w#w!~#fo)NW #~!N#F!~#fo)NW N#F !~w#~wîÇS Reading - pa f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6 DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1ss: data: Writing - pass: ͋S=*e ~#fo *e( !W*e ~OG KM"eV:eg:e„2f2f*e##~#fo "! N#F!N#F!N#F&!ÇS̀S!!UHÇS̀S!!THÇS̀S!9! !N#F!'i`! 6!ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~ 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X_!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢fÐ*e"f*e"f:e:e¿2f2f*e####~OGi` "f*e"f*e"f!!N#FP!!N#F͇!!9 x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁt):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*٤W}_*"}o|g":ٷʑ*C6COLOR: DB LIFT ;RIBBON COLOR CRPOS: DW 0000H ;CARRIAGE POSITION PAPOS: DW PAGEL ;CURRENT PAPER0EAH DDATA EQU 0EBH WAIT EQU 0ECH ; IF CPMVERS EQ 22 BIAS EQU (MSIZE-20)*1024 CPMB EQU 3400H+BIAS CBIOS EQU $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kܶw ?L:fܷ>gZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_:ٷʑw:2E**E}DQ>2i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{CPMB+1600H ELSE BIAS EQU (MSIZE-17)*1024 CPMB EQU 2900H+BIAS CBIOS EQU CPMB+1500H ENDIF ; NSECTS EQU 51 ;NUM$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I yxzӉxӊY?2ܷ8L28L8 >:fܷIyۉ:fܷV{ۋ:fܷcxۈ)*)þ))>+><7"9.Yͯ * M^2Uóadjmrux}çìûpñۂns ܂ns<݂nskL݂nsښ{?s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!BϾw!>2*C~=2u:B2~2wE:A*C϶w>"BER OF SECTORS. ORG 0 BOOT: LXI SP,100H BOOT1: LXI B,2 MVI D,NSECTS LXI H,CPMB RBLK MOV$I$I$UUU$$A$  :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI       56k CP/M vers 2.2 1!ۯ21 ͻ}ͧͬ,I*lDMͻ:k:j<!""ٯ2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q* A,B OUT DDATA IN DSTAT RRC MVI A,1 JC ERROR MVI A,13H OU ; CSTEP: DB PICA ;CARRIAGE STEP LSTEP: DB 08H ;LINE STEP (6 PER INCH) D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I Oͧۯ>~ͻ>2!"2!"28!"9:O R![?boot  ç!: Ü@ chdir>Ì !p+q*~:ʉ *N͐*#"$@NAMES DIRZCPR2 DU2.COM from D #!~#fo!!!~#fo)!~#fo N#Fzywx#w+#~Z!~#fo)!~#fo N#F!<͢Z!ywx#w!>w%s. Invalid load address %s. Can not open %s. Odd number of arguments. Usage: install [-string] file1.prl address1 [ fih. Insufficient memory to read %s. Invalid PRL file format in %s. !9!!!~#foN#Fͬytxʓ!N#F!Invalid Command at or after xÃ/+++ Out of memory +++ Ã~ (;/ Warning: Remainder of Command Line after "@" Delete~w#~w!~w#~wC!N#F!O<!9!!~#fo~!~#fo!~#fo~!~#fo!~!>wU.COM ver 7.5 1/23/81 by RLC!9"&1& | 7/ DU2 cannot run on CP/M Version 1.4 -- Abortingn%*"""""#w!!  #!~#fo)!~#fo N#F!N#FH!~w#~w!~w#~w!~#fo##!~#fo)##!~#fo N#Fle2.prl address2 ...] Install Revision %i.%i !9!>w#w!>w#w* ! * ! !<!~#fo##~#fo~-;<! <͢!~OGyOxGy­x!N#F!'<! <͢!!~#~!!~#~!~#fo##~#fo!~d/ Command -- !,(~#  > !(Ð~ͫP#~ͫ@((/Macro Definitions --A(B#ͳØ#/Previous Co#w!~#fo~!~#fo~0!~#fo>9!!~#fo~OG!~#fo))))  }|!~#foMD!~#fo~A!~#fo>Z" "3"i"""*"Zͳ j / DU2 - Disk Utility II, Version 1.0 Type ? for Help !~(G((##~/I> !pywx#w+~#!~#fo##!~#fo~#fo  !~#fo##~#fo}o|g}!~#fo)##!~#fo N#F!<͢!~w#!~#fo##~w#~w!>w>#w!~#fo##~#fo~!!N#F!~w#~w!~#fo##N#F!~#fo##~w#~w~!~#fo6á>2f*f͓*f#"fáS*f#"f̀S! ~7#~F!e~#FÇS2f2f![:f:f#*f)))W ! u #D*f)))mmand Line Definition -- @: !,#ͳz Ø/ z0/: !4~#  > 08 0W/ Invalid Macro Numbe!~#fo~OG! MD#!~#fo~OGyax!~#fo~A^!~#fo>Z^!~#fo~OG! MDk!~#fo~OG>f>!!~#f( 2&m>2&2&1&2&>2&!"&T (:&y~# (,(ͫ2&G!%~|(####^#Vx!(0~08:0#0G!4 ~w!~w#~wu!!~#fo##N#F! Hywx#w!:w:#w!*3  Ҟ!~#fo~OGyOxGyvx !~#f!~#~>!<͢>!~w#~w!~w#~w!~#fo}o|g}^!<͢! ywx#w!>w#w!! W ! ‘ #D*f)))W ! ­ #D*f)))W !   #N*f)))W ! ~#~N*f)))W !~#~*f)))* â Memory may be corrupted. Error reading %s. Next Load address: %h. Invalid CBIOS format in o~A!~#fo>Z!~#fo~OG! MDø!~#fo~OG!~#fo))))  }|!~w#~wÂCan not write in location %~#+ (, !0(s!(~#+ !4|(/ Error -- Macro Expanded Command Line too LongÃ!(,~# /o##N#F!h<! <͢ !:w:#w!!~#fo~#fo }|!*3  !N#F!N#F1!~w#~w!; W !~#~*f)))W !~#~*f)))W ! ~#~*[#"[ÇS*f#"fMÇS HardSoft%+ 5i %+ 4i %+ 6i %p Track Hea!~#ʾ ! ~#fo~OG!yOx#Gy !~#fo!  ! ~w#~wa !#~~w+~w!~w#~w!~w#~wv !9w!!  # !!~#fo!yOx#G>>  !N#F!yOx#Gywx#w!!N#F!}|!~#fo}o|g!>w>#w!!}|!~w#~wͩ!N#F!~w#~w6!!N#F!~w#~w~OGyOxGywx#w!># !)))W ~#~!!~#fo)))W ~#~!!~#fo)))W ~#~!!~#fo)))W ~#~!~#fo)))W !~#fo)))W ~ "$f![:$f:%f#(#*$f"[*[!%"(2 f2!f![: f:!f#V$* f)))] * f)))W ~#fo}og}* f)))] * f)))W N#F!]Nd Sector Type No bad sectors detected. Bad sector report: ̀S!(![~#!(ÇS!k !*[*!v(!#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#fo)))W ~#~!~#fo)} !~w#~w !~#fo##~#fo!~#fo !~#fo }o|g} !~#fo##~#fo!~#fo !~#fo  }o|gMD!>#J!~#fo~ J!~w#~w!~w#~w~ !!}|!~w#~w!!~#fo#}|!!  #!!#fo !~#fo !~#fo##yx#B !N#F!<! <͢!>w#w!!~#fo!~#fo   !~#fo##~#fo!}og}* f)))W N#F*e͐N* f)))W ~#fo #""f* f)))] *"f}og}* f)))] *"f!2N}og}* f)))] 6* f)))w#w!![  #!~#fo)))W ~1#~<!XMDA!SMD!~#fo)))W N#F!~#fo)))W N#F!~#fo)))W N#F!]))W !~#~!~#fo)))W !~#~!~#fo)))W !~#~!~#fo)))W !~#~ÇSCan't write bad sector mapN#F!!~#foN#Fͬ!yª x# !N#F!;<! <͢!!N#F!~#fo##~#fo!~#fo !~#fo##N#F~#fo~!~#fo!~#fo~!~#fo!~!~w#~w!~w#~w !>#!~#fo~ ʦͩ!~#fo!~#fo~!~#fo !~#fo}o|g}!~#fo##~#fo!~#fo ~OGyOxG!~#fo}o|gy xf !~#fo##~#fo!~#fo !<] 6*e)#* f #""f* f)))] *"f}og}* f)))] *"f!2N}og}* f#" f/#!ͬ:e2,W2-W2.W*e}o}@o}2/W*e(! 9!~w#~w!Q(ÇS̀S!!~#fo)))W ~#fo!~#fo)))W yOx#Gywx#w+~#!~#foMDÇS!!~#fo.Timeout on writing bad sector map.Too many bad sectors. Assigning alternates for the first %i sectors. No room for a bad maA !~w#~wÁ !~#fo##~#fo!~#fo !~#fo MD!9!!N#F!}!~#ʻ !>w>#w!~#ʾ ~w#~w!~w#~w!~w#~wJͩ!N#F!~w#~w6q !!~#~!!}|!~w#~w!>w#w!! <͢f !N#F!~#fo##N#F!~#foN#Fͬ!yD x#v !N#F!;<! <͢v !~w#~wM !>w# >#$:/W2/W*e >#$:/W2/W!]"0W>22W>23W>24W>25W>26W>27Wͫy$!" :8WOGy$x$!! ÇS͋S)))W ~#fo!~#fo)))W yOx#Gywx#w+~#= !~#foMDÇS!~#fo)))W ~#fo!~#fo)))W yOx#GÇS̀S!9!!~#fop on this drive.̀S*e##>#"*e####>"!l" !]"f!e:f:f"*f*f#"f6ý"*e####~OG*e͐N*e)yOxGi`< !  #V!~#fo~™ͩͩ!~#fo!~#fo#}|!~w#~w!~w#~wÙͩͩ!~#fo!~#fo#}|!~w#~~w#~wN#FͯS!~OG!~S!~#fo~!~#fo~ ! !~!N#F!~w#~w~OG!N#F!~y—x/!~#fo#6 !N#F!~w#~w6 ç!N#F!~w#~w!~#fo~a!~#fo>z!~#f 9!>w#w!|ywx#w!~#~!~#fo#~ !~#fo~ !~w#~wö!~w#~w!~Ʀw#~wÙ!~#fo~DxTDLL|7xLTD(D|/g}/o#x/Gy/Ox/Gy/O>=))k# w#`` w!N#F!N#F1!~w#~w;!9!!~#~!N#F!} ~ !!N#F!| }~ò!!  #B!N#F!N#F!N#F!!N#F!N#F}|  ډ!~#foA  !o~OG! MD!~#fo~OGyw!~w#~wç!~#foMD!9!!}|!!N#F!~w#~w~ ʖ!~%ʙ !~#fo#~:y!~#fo!~#fo~aT!~#fo>zT!~#fo~OG! MDa!~#fo~OG! }!~w#~wÃ!~#f|!!~#fo$ ~#~!>#v!~#›!~#fo& !~!N#F!~y!~#fo!yOx#G!~#fo$~ß!~#fo0 !~*#~##~#®~®+++~#fo!9N#F#^#V!xxGyO)MD!9q#po!!~OG!~S!!N#F!~w#~w~ OG!ï!~#fo#~!-!~!~#fo!~#fo~#fo>o>g}| o6!!~#~!!~#fo#}|!!~#fo  !~#fo~ʫ!~#fo~.!~w#~w!!~#fo    !~#~!~#foMD!!  #!N#F!N#F!~#fo& !!yOx#G ͤ!!  #!>w#9~o3||g}o'/<3)"MD!9q#poG! 9~#fo!9~o/< !9~o3|g}oa'!9N#F#q#p!! !N#F!~w#~wN#FSS!!N#F!~w#~wN#FS!!N#F!~w#~wN#FS!N#F! ҧ!N#F!~w#~w6 !~#fo !~#fo 6~!~#fo! !~#fo" !~#fo# 6~ w!~#fo$ >w#w! w!>w>#wÛ!N#F!N#F!~#fo& !!yOx#G ͤ!!  #!!  #!>w#w!9N#F#^#V"""O>/G!9N#F#^#V#~#foͻz w#û!9TT|xT=   }|'*ri!~#ʪ&!N#F>O>Gñ&!N#Fywx#w!pi~#ʹ'*ti~A&*ti>Z&*ti~OG! MD&*ti~OGyl&x¹'*ti#"tiù'*P IN TO TRACK 1 DF06 3233DE STA IOT SAMTRK: DF09 3234DE STA IOS ;STORE SECTOR FOR READ DF0C 22400~#fo"ti!~#fo"pi*pi~>+*ti*ti#"ti*pi*pi#"pi +áS*ti~L+O+áS͋S!~#fo"ti!~#fo"pi!~#fo"ri*ti~nʈ+* ;NEXT SECTOR TO READ - 1 KEPT IN REG D ;NUMBER OF SECTORS TO GO IN REG E DEF6 112C01 ~#fo"ti!!  #)áS!~#fo "pi!~#fo"ri!ri:pi:qi#)*pi#"pi!ri:pi:qi#)*ti !N#F*pi*ti~#fo͆Sti~aY'*ti>zk'Y'!!N#F! N#F͐N!~#fo }|:pi2pi:qi2qi*ti#"tiV&*ti~Aڊ&*ti>Zڊ&!*ti~Aڒ'*ti>Z!~#fo"ti!~#fo"pi!~#fo"ri!w#w!:tiw:ui#w!w#w!pi~#[%*ti> Ғ%*ti~Ғ%!pi~#ʬ%*ti~-3&!>w#w*ti#"ti:ti~N¹+*ti#"ti*pi*riN#F*ri~w#~w~#fo}|*tiMDáS*piw#w*ti~0ڱ+*ti>9ڱ+*pi*ti~OG*pi~#foMD)) )  }|*ti#"ti LXI D,(1 SHL 8) + DOSSECT DEF9 2100C8 LXI H,CPMB ;START LOADING AT BASE OF CCP BOOTSEC: DEFC 14 >H))!:piš):qi#=**ti !N#F*pi*ti ~#fo͆S=*:ri2ri:si2si!ri:pi:qi# **ti !N#F*ri*ti~#fo '*ti~OG! MDÙ'*ti~OG! }|!!   #'Ê&*ti!yOx#GáS͋S!~#fo"ti*ti"ri!#~(!>#(!~#fo>pi2pi:qi2qiì%:pi2pi:qi2qi*ti#"ti@%! ~º%#~V&:pi:qiV&*ti~0V&*ti ~A&*ti >Z&*ti ~OG! MD +͋S!9!~#fo"ti*ti"ri*ri~B,*ri~%B,*ri#"ri,*ri "ti,!ri:ti:ui#{,*ri!tiyOx#G*ti!N#F!~#fo͆S*ri* INR D ;ADD ONE TO SECTOR NUMBER DEFD 7A MOV A,D ;END OF FIRST TRACK? DEFE FE1B CPI 26+1 DF00 C209DF Sx)!ri:pi:qi#9)*ti *ri*pi*ti ~#fo͆S9)*pi!yOx#G!~#fo!piyOx#G}|**ti*pi !N#FusOh)odio>g"pi*ri*ri#"ri6-&(!~#fo"pi!~#>(!> w#wc(!#~c(!!~#fo>o>g}|!:pi:qi#ڛ(!N#F*pi!&*ti ~OGyx&xV&*ti##"ti:pi2pi:qi2qiV&*ti~+¬%*ti#"ti:pi2pi:qi2qiì%!pi~#ʊ&*ti~0&*ti>9&!*ti~OG!ri#"ri~,áS!>w#w!6 *ri~-,!w#w!*ri#"ri*ri~*ri#"ri,*ri~+,!*ri#"ri*ri~*ri#"ri! !*riR+JNZ SAMTRK ;NO - STAY ON SAME TRACK DF03 1601 MVI D,1 ;YES - RESET SECTOR NUMBER TO 1 DF05 7A MOV A,D ;AND STE(*ti!N#F*pi (**ti!N#F*pi (*ti*pi !N#F(áS̀S!!~#fo !(ÇS͋S!ING BOOT DEEF AF XRA A ;BOOT FROM DRIVE A DEF0 3235DE STA SELREQ DEF3 CD3ADF CALL HOME ;BOOT FROM TRACK 0 N#FM*ri'*ri "ri*ri*pi!N#FM0 }*ri>9(*ri~'w*ri!tiyOx#GáS̀S!!N#F!&f!i:,ÇS͋S!> i`"ri!w#w*ri~.6-! !*ri R+i`"ri*ri~aZ-*ri~hZ-*ri~oZ-*ri~u…-!*ri*ri#"ri~!~hŽ->2pi2`i,O!`iKAL*ti*ti#"ti6-!!~#fo!~#fo }|!>>#3!>w#w!!~#fo#! >+F+N=3!?1*ri~c1!!~!>w#wB2!:riw:si#w!>w#w\.:qi1 2!!N#F!2N}!!~!>w#wB2*ri~yw!~w#~wù7!#~X8!ti>#X8*ri*ri#"ri60!~w#~w:ti2ti:ui2ui8!ti>#8*ri*ri#"ri*pi!yOxG !##~!!=Q`/*ri~f¢0!!}|!!N#F!!yOx#G! ~#fo >+F+N=/!d6!9ywx#w! Mywx#w+*ti*ti#"ti!N#F! KM0 }*ti*ti#"ti!N#F! ͒M0 }*ti!yOx#GáS͋S!9!~#fo"ti!~#fo"qi-!6n-!~o¥->2pi2qi-!~u¼-> 2pi2qi-!"pi*ri~x-!w#w\.*ri~b¨.!! N#F! ~w#~w~#~=! 9ywx#w!!N#F!~#fo#!?~w#~w2pi2qi!:pi:qi#4!:pi:qi#ҏ4*ti*ti#"ti!*pi ~*pi#"pi!c2!~w#w 2!~w#~w!*pi!N#F!%#2!yxҜ8*pi*pi#"pi~OGß80yw:ti2ti:ui2uiX8*ri!yOx#GáS͋S!~#fo"ti*ti"pi!#~+9! >#+9!!! ~#fo }|\.!!}|!*pi! ~#fo##N#F+++N#F!8ywx#w! ! ~#fo####}|\.!!}|!ri!#~6*ri*ri#"ri6-!!`i,O!`iKAL!"pi!!! >+F+N=6*pi?=! 9ywx#w!!~#fo*ti !! N#F! ~w#~w~#~!~#\.!!!  #O.!N#FV.!N#Fywx#w!~#p2!!  #p2!!~w#~w=4!:pi:qi#4*ti*ti#"ti60*pi#"pi!~w#~wÏ4!~#/5*ti*ti#"ti6.2ri2si!:ri:si#R5!:pi:qi#N#F!N#F!N#F!~#fo͆S!~#5,!!  #5,!!!N#F!~#fo͆S!~w#~wí2͋S!~#fo"ti! >w#w! ! ~#fo####}|\.*ri~d#1!!}|!!>>#00!N#F!! ~#fo >+F+N=0!X3!}|!>>#7!>w#w!!N#F!!?~w#~w!!  #7!~#fo!yOx#G*pi "pi!!~#~!N#F!~#fo͆S!~w#~wf.*ri~p&/!! N#F! ~w#~w~#~!!N#Fͮ@ywx#w!~#\.!!!R5*ti*ti#"ti!*pi ~*pi#"pi*ri#"ri4*ti*ti#"ti6e!~#z5!w#wz5!:ri:si#/5*ti*ti#"ti60*ri#"riR5!#~~#fo"pi!~#fo"ri!ri~#K3*ti*ti#"ti*pi*pi#"pi~:ri2ri:si2si3!~#foMDáS͋S!9!~#fo"ti!#~3!!9ywx#w! ! ~#fo }|\.*ri~cG1*ri~sG1*ri~iG1!~ʥ1!!}|!! N#F! ~w#~w~#~!~a!>#7*ri*ri#"ri60!ti>#8*ri*ri#"ri6.8!>#7*ri*ri#"ri*pi!yOxGyx7*pi*pi#"pi~OG80  #/!N#F/!N#Fywx#w\.*ri~l›/!~a0!! ~#fo~#~#~#~!>w#w!~w#~w+n0!!~#fo5*ti*ti#"ti6-!!~#fo>o>g}|þ5*ti*ti#"ti6+!^i>># 6*ti*ti#"ti!N#F!dKM0 }!N#F!d͒? C A* @1-23 ><2D#y!rfbO>gyO2s:s~ʕ~rzRҕ6!!rNyW>گ_Ͱ{zA2^yA2s!^ ð~_# Morrow Designs installable IBIOS͕^#V+q#pi`"zB!"`i"y= 2y2 *P" :R2 T!"Pdded handshake configuration bytes * * 8 18 82 Marc Removed 'equ'ed handshaking from LST: * * 8 12 82 Marc Added configu:=o&)))))))#!>©:>2>=>>> 22n2 .G*|.G.G*DM.G#.G.Gsystems * * 9 9 82 Marc SETHIGH was botching 2 sided DPB pointers * * 8 31 82 Marc Changed TRACKS in HD driver to HDTRAK , revision E.3. ~: HDDMA + M16 drive 0, partition A ~: HDDMA + M16 drive 0, partition B : Host system drive : ‘{2R"2*!:B>2@*ʹ`ʹ`:2/O:2:2!6ration entries for a0 & d0 * * 8 11 82 Marc Added the autostart command structure * * 8 11 82 Marc Redefined the configu>7>x.G͸!:;::K=>22:g|9OogyR#{_~#foy!# :O*/z‘{ * * 8 27 82 Marc Added code/system length checker * * 8 27 82 Marc mwreset save/restores the track number * * 8 26 8257`i"!`i"$:'2`i"!0k:g.KO!ky2ү{Ža.K|ʯ͢s#r#q#~y2K ʄ‘*"*"y#:#:#:#:# uw# xo&))))~#O qU~7z„7:_!`i#|/g}/o#ͥ|}D  D B_;@~2گ:BگZ¯_:o&))))2Qy2>B S>B!6#6z͕6#6͆!‘*"*"y#:#:#:#:# uw# xo&))))~#O q Marc mwreset now sets *step and *dir for CMI * * 8 20 82 Marc Added 'equ'ed handshaking to the serial LST: * * 8 19 82 Mz2:2a.K͢^#V#Nu:_!;!:O:26:g. K| ^#V#"~#fo" */#~< :w#the Switchboard * * 9 22 82 Marc Added initialization code for serial group 2 * * 9 22 82 Marc Added sector size byte to t 1!~9A92r#~Xe# !$  62!222!:r_Ͱ!:rAW#͕^#V+q#pi`"zB!"`i"y= 2y2 *P" :R2 T!"PB_;@~2گ:BگZ¯_:o&))))2Qy2>B S>B!6#6z͕6#6͆!arc Removed clock switching code from HDCA driver * * 8 18 82 Marc Added handshake configuration code * * 8 18 82 Marc A"/!  BAD MAP OVERFLOW! !# !*ky2>G!'k2*|O|g+f|g}oX#|g"!ʄ#uhe hdca DPB's * * 9 22 82 Marc Added sector size parameter to DPBGEN * * 9 9 82 Marc Fixed system length checks for 64K @ 2R"2*!:B>2@*ʹ`ʹ`:2/O:2:2!6!#~9!!O9! N#F!`i02ji2ki2iiR: E016 3ED0 MVI A,FINTCMD ;INTERRUPT 1771 TO GENERATE STATUS E018 D3E8 OUT COMMAND E01A E3 XTHL E01 "piw?2ri2si!:ri:si#ҝ?!~#ʝ?!!`i,O!`i!&iJAL!!L!!`i,O!`i!hi!N#F#RKA w#wç:!~#foMDáS*ti w#w <͋S!~#fo"ti*ti"ri!#~y#yo>g}|*ri*ri#"ri6-!~#fU~7z„7:_!`i#|/g}/o#ͥ|}$I$I$ "@D"I D 2hi!hiN##~*pi>9 :*pi~'w*pi!tiyOx#GáSwrite error in putlwrite error in putlbad putl call͋S!~#fo"ti!~#foB E3 XTHL E01C DBE8 IN STATUS ;GET NEW STATUS E01E E620 ANI 0010$0000B ;TRANSFORM HEAD LOADED STATUS INL*ti*ti#"ti!~#fo0 }*ri#"ri>!`i,O!`i!&iJ!iH>*^i "ri!ri>#>!*ri)))i `i,O!`i!TO 1771 AND PERFORM DISK I/O TRANSFER ; HEAD WILL BE LOADED FIRST IF HARDWARE TIMEOUT HAS UNLOADED IT o}o|g"pi!~#¤ w#wo>g}|!:pi:qi#=!N#F*pi!N#FM*ri%<*ri "rH H@@I$! $H!$B "I@! $! $@@I"""" UURI$ BH $BHA  A "pi!ti~#œ:!![: áS!~#fo"ri!ri>#:;!*ti *ti ~#fo }|!ri>#;*ti ~#~;!N#F!~TO E020 EE20 XRI 0010$0000B E022 1F RAR ;HEAD LOAD BIT FOR COMMAND E023 1F RAR E024 1F RJAL!iH?!!AL!*ri N:pi2pi:qi2qiÊ?!!iH>!!`i,O!`i!&icIAL*pi#"pi>:ri2ri: ; INTERNALLY REFERENCED ; ENTRY E 1771 COMMAND ; HL I/O ADDRESS ; EXIi*ri*pi!N#FM0 }*ri>9,=*ri~'w*ri!tiyOx#GáS͋S!9!~#fo"ti2pi2qi!#~=!!`i,O!`iKAL!$$H!  DAI$@HI"w#~w*pi*pi#"pi~:ri2ri:si2si*ti ~w#~w:*ti ~K;#~ <*ti ~# <*ti ~#fo*ti ~ <*ti N#`i w#wh9! #~h9! ! ~#fo>o>g}|!! #~~+~ si2siâ=:ri2ri:si2si>!:ri:si#?*ti*ti#"ti60*ri#"riÝ?*piMDáS͋S!~#fo"ti!#~R@!!  #R@*ti!T E PRESERVED ; HL I/O ADDRESS+128 ; A,FLAGS CLOBBERED ; XFE~#>!!iH>*^i "ri!ri>#>?!*ri)))i Hw?!!`i,O!`i*ri)))i cIAL*pi!*ri NF*ti *tiN#F͹B*ti y¨;x##:!*ti *tiN#F͹By;x;!!G: ç:*tiA ~#fo ~5R@!~#fo "pi:qiX@*ti*pi ~9š@*ti*pi 60:pi2pi:qi2qi@áS:qiR@*ti61!~#fo"pi!pi>#@*ti*~#fo"ti*ti ~#fo"pi*ti~OGyF!*pi( N#F*tíGyFxGáS!~#{G*ti~OGy{G*ti ~OG! *pSaF[FrF͋S!~#fo"ti*ti ~#fo"pi!*pi$ `i8!w! ~#+~w bK!~K!MD!  5B*ti~OGyʬB*pi! ~ʬB*pi" ~#fo6*ti~wA ͋S!N#FCi`"ri!ri~#BáS*ri~OGyC!N#F!N#F*ri I_>WxƀGzƀWyox"I'I>XI>XI! 9N#F!9~#fo# AI ##]I +]ICIчU"II!9!9!6!N#F!pi 60:pi2pi:qi2qio@*ti*pi 4X@áS͋S!~#fo"ti*ti"pi*pi~@*pi#"pi@*pi!tiyOx#GáSAAAA͋S!~#fi! *ti~w{G*ti ~OG! *pi* ! *pi! i`"ri!! !ri~#jGáS*ti~w*ti~wFáGyw*pi" *pi* *ri }|!~#JE!*pi( AE #JEáS!*ti{Fx{E!N#F!N#F*tíGxEá #K!#~w ’K!5YK!N#F!ʹS!~K!~#K~w! N#F !#~K*U!9~#fo~#K~ƀw@áS!~#fo"ti!>#RC*ti"pi!>#eC*ti~ eC*ti#"ti!~w#~w%C*ti!yOx#GáS*ti!piyOx#G*pi*ri@ͤTy­I! N#F > J!~I!>#w¾I!4!q#p! N#F I!4 !ͤTyJy!o"ti!~#fo"ri!>#IA! y\A! y;Ax\A!2D\A*ri!yOx#GáS*ti ~zA*ti ~OG!@tR*tiS͋S!~#fo"ti*ti ~#fo"ri!N#F!2N"pi*ri ~OG:piG:qiG*ti~OGy hH*ti ~OG! *ti~OGyH*riS*pi ~OG*pi ~OGyOG}|EñEi`"ri!*pi( E #E*riMDáS*pi( !~#~!ri~# F!*pi* !9!9!N#F ! #wL!~ƀw! N#F!͙R*U!9N#F!9~#fo~#~WL*UMD!9!9!N#F!*ti!piyOx#G}›C|ʤCáS!>#C!!B*ri@yCxCáS*ti#"ti!~w#~wC͋S!~#fo"ti:uiOx#Gyƀ+wx#w !#w J!69!#~w )J!MD! +IJ>JjJ!MD!  #[J!4! +~w qJ!5" ~#fo"pi!*ti͎DyžAxBáS*ri~OG! !~w#~w*ri#"riA*ri~OG! øA*ri~OG! øA!~#foM! xHáS*ti~w*ri :piw*ri! xaH!~#aH*ri! xaH*ti~wáS*ti~ w*ri !~#fo}og}HáS*ti ~OG! *pi* ! *pi! i`"ri!! *riMD!DtRáS!*pi* ͇HáSáS͋S!ͤTyLy֨OxGL!~#+~wŸLy•LLyL!#~w¾L ñL! cLN#F!~#~*UcLN#F!~+~ +~+~ D!2h:ti:ui#D*ti))h ~$DáS*ti))h MDáS̀S!.h~#]D!fD:.hLD:/h]D*.h͆Si`".h5D*0h͆S]D͋S*.h"ti!~#fo".h*tiMDJ!N#F!ʹS!~ʫJ!~#ʫJ~w! N#F !#~ºJ*U!9!9! N#F!6 Jƀ4 !ͤTyK!DáS!>#B*pi! ~ʅB*pi" N#F*pi" ~w#~w*ri*ri#"ri~*pi$ >2`i2ai>2ci>2bi!`iN!~w#~w*pi!áS͋S!~#fo"ti!~#fo"pi:pi2pi:qi2qiH*ti6*ti#"tiàHáS&}!!9͆S! 9~#foN#FxHO>G!9~#fo^#VzB *UcLMDL!9~w#~w#~w#~w+MD!9 _ #M{ !94M! 9~cM+w>#w! 9N#FxwMO>GM҇M!9!9*ti*ri*pii`!"pi"ri"ti!9N#F! ~Si`+ >#wSS+SSâT! ~ T# +~wS!Q/<Q*UO!9~#fo##+~w+~w###~w+~w ”Q*U!9~#fo##w>#w>+++w>#wMD!9!9!N#F!>w#w#w##w#w!!~w#~w#~w#~w#~w!9MD! 9  # # #nO!9MD! 9  # # #!94nO!9!9*U#~#~+++~#~#~O(2(2(2(2(2(((~@(v@O>G! 9q#p*U! 9~M+w>#w! 9N#FxMO>GMMO>G! 9q#p*U! 9N#FM! 9q#p*U! 9N#FM9~w#~wS! ~4Ti`+ #~wT!9~w#~w T LTi`7#~w@TS!9~dTi`+#w[TâTwTi`>#wmT>w! !9ʹS! N#F !#~R*UQq#px#w#wQQq#p#w#wQQ w #w #w #wQQ w #w #w #wQ~#€R#~#fo#>#>+++>#~#~#~ #~{P>#># >#O!9MD!9~#foO! 9MD!9~#foOKO!9N#F!9(n@(f(`(X@(U@(O@(I2(E2(>! 9q#p*U!9~N/w+~w} Ui`y#”Rx#•R+++~#fo##tR!9!9!N#F!ͤTyzS!q#p! N#F!ͤTyR!N#FdS!yOx#GSy4S+~w#~w-POO!9MD!9~#foO! 9MD!9~#foOKO!9N#F!9-POO! 9MD!9~#fo#O!9MD!9~#fo#OKO!9N#Fkb9PO(8(2(U @rcX yNMD!9q#p*U!! 9~+N~үN! 9N#F ! 9~w#~w! 9~w+~wÖN!9q#p*U!9N#F!9~#fo ## # +++ #>#wUJ!9N#F###q#p+++q!9N#F#q#pV2.1: copyright (c) 1979 by Whitesmiths, Ltd.` (!SO>G! ~#+~wS&Sw y3SS!MD!  #wBS!N#F!ʹS!MD ! ~#fo+ #wqS*UOP!9~Q/B S>B!6#6z6#6͆! ORA A ;READY? E064 CA60E0 JZ CONIN ;NO, WAIT E067 3A0300 LDA IOBYTE ;YES, GET IOBYTE E06A CD1AE1 CALL DISPTC"/!  BAD MAP OVERFLOW! !o !*ky2>G!'k2*|O|g+f|g}oX#|g""!%ʄ#uC A* @1-23 ><2Doy!rfbO>gyO2s:s;GO TO COMMON EXIT ; CONIN3: ;MULTIO ACE#3 E07F DB10 IN RBR ;READ RECEIVER BUFFER RE^#V+q#pi`"zB!"`i"y= 2 y2  *P" :R2 T! "PH ;DISPATCH TO PROPER ROUTINE E06D 75E0 DW CONIN1 ;0=KEYBOARD E06F 75E0 DW CONIN1 ;1=KEYBOARD E071 7AE0 :=o&)))))))o!>©:$>2>=>>> 22$n2 .G**|.G.G*,DM.Go.G.GfDGISTER ; CONINX: ;COMMON EXIT ROUTINE E081 E67F ANI 7FH ;STRIP OFF PARITY 2R"2*!: B>2@*``: 2/O: 2: 2DW CONIN2 ;2=VIO-X E073 7FE0 DW CONIN3 ;3=MULTIO ACE#3 ; CONIN1: ;KEYBOARD VIA 3P+S >7>x.G͸!%:;::K=>22$:%g|9OogyR#{_~#foy!o :%O*/z‘{ 4h 57`i"!`i"$:'2(`i" !0k:g.KO!ky2ү{Ža.K|ʯ͢s#r#q#~y2K ʄ!ͦ! ~ͮͩ# Š  ͩ ͷ0:'O !6U~7z7: _!`i#|/g}/o#(CUTER COMPATIBLE) E075 DB03 IN CDATA1 ;READ A CHARACTER. E077 C381E0 JMP CONINX ;GO TO COMMON EXIT ‘*&"**(",y#:&#:'#:(#:)#* uw# xo&))))~#O q@ BCG@M [u+pz2:2.a.K͢^#V#Nu:_!;!:.O:26:g. K| ^#V#" ~#fo"" */o~< :w#E |}  O _ 1!~ʅA҅^#V+q#pi`"zB!"`i"y= 2 y2  *P" :R2 T! "P ;FALL THRU TO PRINT IT ; ; PRINT ONE HEX DIGIT ; INTERNALLY REFERENCED  ! @2r#~Xıo !p  62!2(22$!*:r_!^:rAW#~~rzR6!_!rNyW>_{z2R"2*!: B>2@*``: 2/O: 2: 2 ; ENTRY A B3-B0 NIBBLE TO BE PRINTED AS A HEX DIGIT ; EXIT A,C,FLAGS CLOBBERED A2yA2! ~_# Morrow Designs installable IBIOS, revision E.3. ~: HDDMA + M16 drive 0, partitionͦ! ~ͮͩ# Š  ͩ ͷ0:'O !6U~7z7: _!`i#|/g}/o# ; PNIB: E0E8 E60F ANI 0000$1111B ;LEAVE ONLY LOW NIBBLE E0EA C690 ADI 90H ;CAUSE CARRY IF >  PHEX: E0DF F5 PUSH PSW ;SAVE LOW NIBBLE E0E0 1F1F1F1F RAR ! RAR ! RAR ! RAR ;POSITION HIGH NIBBLE  A ~: HDDMA + M16 drive 0, partition B : Host system drive :  uw# xo&))))~#O q|} $I$I$ "@D"I D H H@@I$! $H!$B "I@! $B_;@~2 گ: BگZ¯_/: o&))))2 Qy2 >B S>B!6#6z6#6͆!9 E0EC 27 DAA E0ED C640 ADI 40H E0EF 27 DAA E0F0 4F MOV C,A ;PASS ASCII CHAR TO CONOUT FOR PRINT E0E4 CDE8E0 CALL PNIB ;PRINT HIGH NIBBLE E0E7 F1 POP PSW ;GET LOW NIBBLE BACK AND . . ! $@@I"""" UURI$ BH $BHA  A $$HI B @$A$@IF r Specified in CommandÃ#!4sÃQØ/+=============================+ | -- Queue Information -- | +------%# >. :&~~> © >)/ ++ Free ++ :&2&C>:%~# 8~8ͪ *&#"&!"&!<2&2&!"&"&"&#"&"&> 2,!>"&"&!4 6 $> 2( 2&O Ø~ (m,(iͫ#AO:Gy8!/Disk Letter Out octor read ++ /Use G command following F, or R or S following T Ã~,( PBK (,(#P`i}%%:&A(& /Address of Head of Queue: *&DMͺ/ Hex Address of Tail of Queue: *&DMͺ/ Hex *& *&| } `2&*&Þ~ͫB(Gv:&ʬ!&Ø#*&|(+"& *& "&Ø/Error -- Queue Empty à /Wri-----------------------+ ~/ +=============================+ | -- Disk Information -- | +------------------------>~(5~_#~< :&(W#s% *&|(>*2&"&  *&+"&| *&:&~ͫB(GD !&>2&Ø#*&f Range Ãy2&||^#V#"&!~#foͻ%*&7*&|2&J*&"&!"&*&#͆%͆%DM>BK:=ڤ͟*&*-~}%}%{(#} T ʃ:&H(4*~ 8~8>.{(#} *͡T ʃ{ Ø͡{ Ø~,( (T( i/ Blocks Left in Queue ~,| |\YY*&|X\ͣͣ*& \ x \ting to Group *&DMͺ/ *&"&>2&y /++ No "<" Save Command Issued ++ Ã~#ɯ2&T !(6 D<G~{|:& *&}i2&*&7*&͢J!~#"&:&{  Total Groups: *&/ Directory Entries: *&#/ System Tracks: *&/ =============================== Ø*| >#~*&ͫ,( (͏*&͘%m"&"&2&7 /Reading from Group *&DMͺ/ *&"&>2&*{(>2&BKͺ>-> 2& *&#} |(# T ('z {( ͺf :&  ͺf Q͡*&ó%|ʮ ~> >(~NCH TABLE ; ;TO FIND ADDRESS OF DRIVER E123 7E MOV A,M ;GET LOW BYTE OF DRIVER ADDR E124 23 /User Number Out of Range Ã:&2&Ø{ :pW x; T ʃ8 4 Øͳ ͽ̽ɯ2&2&2&2&2&2&2&!T (T~(=~0 0 ( ( (~ͪ, (**&7*&͢/ ++ EOF ++ ͡D:& `/++ Can't dump, no se :&O Ø~ͫ,(> (:#Z($S /Invalid Queue Command Ã!>"&"&!"&/** Queue Status Summary ** ~Ø*&:&::&>,/ Track = *&/, Sector = YTE INTO L E127 D1 POP D ;RESTORE DE E128 E3 XTHL ;PUT DRIVER ADDR ON STACK,RESTORE HL E129 C9 RES(#Gʛ|*&͘%m>2&z|*&͘%|7͢2&J(*&*&͘%*&͟%*&+:&G}2&:&G͆%"&*&2O, RETURN WITH A=00 E138 3EFF MVI A,0FFH ;ELSE SET UP READY SIGNAL E13A C9 RET ;AND RETURN WITH A=FF C:MAC C:IBIOS REN C:IBIOS.HX0=C:IBIOS.HEX C:MAC C:IBIOS $+R REN C:IBIOS.HX1=C:IBIOS.HEX C:MAKEPRL C:IBIOS C:IBIOS *&/, Physical Sector = *&͡~ͫ#͏S#- ͏S#BK |H(6A|~ ʘ,ʘ"&'#y(ʘ*&~ T ;DISPATCH TO DRIVER ; ; ; LIST DEVICE STATUS ; EXTERNALLY&:&2&- o&"&͏*&͘%m"&2&7͢2&(bk:&)= :&o*&~%8 *&*& #>2&\ ENDIF ; ENDIF ;CPM 2.2 ; ; ; C A* @1-23 ><2Dxy!rfbO>gyO2s:s IF MULTIO E12A 3E01 MVI A,1 ;SELECT MULTIO GROUP #1 E12C D317 OUT GRPCTL E12E DB16 ,ʘ|#~ ʘ,ʘ ("&͏{y(ʘ*& ~ ʘ,ʘ|:& ͢Ø/++ Can't read - not positioned ++ Position by:  REFERNECED ; EXIT A=0 IF NOT READY ; A=FF IF READY ; YY\< !2&/++ File Not Found ++ Ø=2&o&))))) >D2&n~.( (,(ͫ#~ ,#.|#>  ; OUTPUT CHARACTER TO LIST DEVICE ; EXTERNALLY REFERENCED ; ENTRY C CHARACTER IN MSR ;READ MODEM STATUS REGISTER E130 E610 ANI CTS ;CLEAR TO SEND? E132 C8 RZ ;NO, RETURN WITH A=00 E133  Track then Sector, or Group ØØ><>>:&xy 802$'    d    } IF CPMVERS EQ 22 LISTST: IF NOT MULTIO IN PSTAT ;READ PRINTER STATUS ~ (,( z z *&7*&͢D~ (,( z *&+| *&| *&"&*&+"&*&"&z *&H 57`i"&!`i"$:'21`i")!0k:(g.KO!ky2(ү{Ža.K|ʯ͢s#r#q#~y2K ʄpartition A ~: HDDMA + M16 drive 0, partition B : Host system drive : w# xo&))))~#O q2 ͷͯ!~ͷͲ# “  Ͳ 0:'O !"6U~7z7:_!`i#|/g}/oB_DI~2گ:BگZ¯_8:o&))))2Qy2>K S>K!6#6̓6#6͆!‘*/"3*1"5y#:/#:0#:1#:2#3 uw# xo&))))~#O qz2:(27a.K͢^#V#Nu:(_!;!:7O:26:(g. K| ^#V#")~#fo"+ */x~< :(w##|} X) ) h) ) 1!~^#V+q#pi`"zK!"`i"y= 2y2 *P" :R2 T!"PB_DI~2گ:BگZ¯_8:o&))))2Qy2>K S>K!6#6̓6#6͆!"/!  BAD MAP OVERFLOW! !x !*ky2>G!'k2*&|O|g+f|g}oX#|g"+!(.ʄ#uʎAҎ2r#~Xĺx !y  62(!2122-!3$:r_!g:rAW#~~rzR6!h$!rNyW>2R"2*!:K>2!@* i i:2/O:2:^#V+q#pi`"zK!"`i"y= 2y2 *P" :R2 T!"P:&=o&)))))))x!>©:->2>=>>> 22-n2 .G*3|.G.G*5DM.Gx.G.G_{zA2yA2!$ ~_#$ Morrow Designs installable IBIOS, revision E.3. ~: HDDMA + M16 drive 0, 2 ͷͯ!~ͷͲ# “  Ͳ 0:'O !"6U~7z7:_!`i#|/g}/o2R"2*!:K>2!@* i i:2/O:2:>7>x.G͸(!.:;::K=>22-:.g|9OogyR#{_~#foy!x :.O*/z‘{I #|}$I$I$ "@D"I D H H@@I$! $H!$B "Ibort - ͽ(͡<:&ʃn%> > `_O > :& . 0 ( y >2& 8:&<8 GOCPM 0017 GRPCTL FFFF H1500 0000 HOMECMD DF3A HOME E089 HPADR 0011 IER 0012 IIR 0000 IMASK F000 INITDR 0003 IOBYTE 0040 IOe optional @ Repeat Previous Non-@ Command Line +[nn] Step In [nn (decimal)] Sectors; -[nn] Step Out Sectors Note: + or 1 E0A9 CONST2 E0B2 CONST3 00EC CONTROL E10F COUT3A C800 CPMB 0016 CPMVERS 0080 CPTR1 0001 CPTR2 C800 CRAM 000D CR 0010 CSS1 0lities allow the user to manipulate information in memory. The following is a summary of the commands available to the DU2 @! $! $@@I"""" UURI$ BH $BHA   $$!B@UU H 2&:&*&͘%m"&BK*&"&*&͘%`i0 :& +*& :& g"&DM/++ Not Within Tr0}o|g0:$2$z0y> >*T ʃ~ ͽʃ#~ #z {dƀ_/++ Bad Displacement (Not - need not be followed by a "," to delimit commands. # Print Disk Parameters for Current Drive =xxx Search for ASCII xxx from 000 CSTAT1 0005 CSTAT2 E21B CSV0 E24A CSV1 0010 CTS 0000 CUTER 00EB DATA 00DE DATSIZ 00E8 DBASE 007F DEL DE37 DHPOS F006 DIABuser. This same list is invoked internally by the ? Command of DU2. For additional information on disk structures and how toI $BBH acks 0-*&/ ++ Ã>2&(B:&2&>2&/++ READ Failed, Sector may be Invalid ++ .:&2&:& ./++ Ca0-7FH) ++ Ã~#(5~ͫ , ->#0|:8 A|G|0))))o#~# #~ͫ0:0#bk)))o|g/ DU2 Current Sector Note: upper/lower case matters. Use for hex: To find "IN 0" use: =<0> or "(tab)H,0(CR)(LDR E17C DIRBUF 0004 DISKNO E11A DISPTCH 0080 DLAB 0010 DLL 0011 DLM E043 DOSEL 002C DOSSECT DE5A DPB0 DE5A DPB1 DE3A DPBASE DE use DU2 in general, refer to the files DU2.DOC and DU2.HLP. >2&Q2&/===============================================nnot Write Unless Read Issued ++ (/++ WRITE Failed ++ /Introductory HELP on DU2 (Disk Utility) The DU2 p:&A:&o&/? ' :'G!(o|g> w> !(:q2&:&(=2&á/ Type Any Character to Continue or ^C to AF)" use: =<9>H,0 *[nn] Repeat [nn (decimal) times]; ! Pause for User :ntext Define 'text' to be Macro n; n Perform Macro3A DPE0 DE4A DPE1 0001 DR E25A ENDDAT 0000 EPROM DF9D ERROR 0000 FALSE 000C FF E170 FFEED 00D0 FINTCMD DFE3 FOOL 0004 FREE DF1======== -- Command Summary -- ------------------------------------------------------- Operands in brackets [...] arCONIN E075 CONIN1 E07A CONIN2 E07F CONIN3 E081 CONINX E0F1 CONOUT E0FF CONOUT1 E100 CONOUT2 E10B CONOUT3 E092 CONST E0A0 CONSTrogram is designed to provide the user with the ability to manipulate information on the disk as easily as the DDT and SID utiJ  n, 0<=n<=9 :Pn Print Macro n, 0<=n<=9 :Px Print All Macros if x=A or Print Prev Line if x=@ Q/----------------------- (use #ff or #tt for Decimal) ======================================================= Q/===============================------------------------------ Command Line is of the form: DU2 du? "d" is Logged-In Disk, "u" is Current User Cancel aÍ>2˻a."z:̻2:<:߽^^d{_zW{_zW )æ4#4#4ަлަ٦# w#Jue Status; QZ Zero (Empty) Queue QSfn.ft Save Queue as a File on Disk < Save Current Block into Temp; > Restore Temp Block =N)? ͽͫY*&y(#x}/-------------------------------- A[ff,tt] ASCII Dump C Change: CHaddr byte byte... (hex) or CAaddr data... (Ascii) ======================== DU2 Status Information ------------------------------------------------------- Processor Speed: :p function with C or Ctrl-C. Suspend output with S or Ctrl-S. Separate commands with ",". Example: g0 +,d,z2,* would steo ͠# CP/M Error On : $Disk I/O$Invalid Drive$Read/Only File$Read/Only Disk$File Exists$? in Filename$Í Save Block into Queue; >B Restore Queue Block G[n] Restore Queue Group Snn Sector nn (decimalo|/g#ɷ|g}o0  }o|gBKx ! T]x( &!&~:&w*&"&"&w:2@+-= #3?J*!- Allowed for imbedded hex. or CHfrom-thru byte e.g. ch0-7f,e5 or CAfrom-thru byte D[ff,tt] Dump (Hex and ASCII) Ffn0/ MHz Number of Lines on CON: :qo&/ Group Save Buffer Address: >ͺ/ Hex =============================p in, dump, sleep 2 sec, and repeat until control-c typed. "nn" usage varies with command as follows: +, -, *, T, S, U, VINSTALL -C IBIOS.PRL E200$) Tnn Track nn (decimal) Unn Set User nn (decimal) for Find command (CP/M-2 only) V[nn] View [nn (decimal)] ASCII Blocks R RACDFGHL M NP QR@STUVpWX&%Z+ Do you wish to Warm Boot (Y/N/=N)? ͽͫY*&y(#x}/.ft Find File Gnn CP/M Allocation Group nn (hex) H[ff,tt] Hex Dump L[d] Log in Current Drive or Drive d M[nn] Map [from grou========================== :& KÃ/ Exit to CP/M -- Do you wish to Warm Boot (Y/N/=N)? ͽͫY*&y(#x}/, Z nn in Decimal (use #nn for Hex) G, M nn in Hexadecimal (use #nn for Decimal) "ff" and "tt" are in Hexadecimal:J!2ã!5Jx4 J#wO͏:ϽT~xT¡Hp!" I˥y<ʃ #3?J*!~p nn (hex)] Q/------------------------------------------------------- N Load New Disk; P Toggle Printer Switch Q Queo|/g#ɷ|g}o0  }o|gBKx ! T]x( &!&~:&w*&"&"&w:2@+-= #3?J*!-K :˽2߽:2*۽N#G2H  W W|:ʽ<ʈ:W:H2xy“INSTALL -C IBIOS.PRL E200$p ^#Vͦ:罷ü!"(COPR. '82 DRI 151282ȡ^dj; READER: CALL CONST ;DOES CONSOLE WANT TO INTERRUPT? ORA A ;CHECK FLAGS JNZ CONIN ;YES, GO SERVICE IT IN RSTAT ;ELSE GETxa{ҏ_p# ’ ʙ ʙ:̻A2'!š!"!9"1!>զ%:25:߽!ʦ=g; CONST: IF PASCAL LDA BKCHR ;IF CONOUT GOBBLED A CHARACTER ORA A ;RESET ZERO MVI A,0FFH ;PREPARE TO RETURN READYy‰5 6y͌Ҡ^I@O:߽=ʯ:ϽIy I I:µˣ  #I:! Iأ I I!ӽ O͠CALCULATE HEAD POSITION BYTE ADDRESS ; INTERNALLY REFERENCED ; ENTRY (SELREQ) DESIRED DRIVE NUMBER ; EXIT HL ADDRESS OF HEAD "۽y2߽7!":ڽ2ƻ:=7!~7͡#*{2û!"z"ݽ9"ˡ1!dy3\K!n҂b&&!R_^#V*۽ ! READER STATUS ANI RRBIT ;LOOK AT READY BIT JNZ READER ;LOOP UNTIL READY IN RDATA ;READ BYTE ANI 7FH ;STRIP PARITY PUNC?͙s! ! ?+> ws  X*]w#6?#] .,:;[]=<>|!eʃ45# FLAG RNZ ;SEND READY FLAG FOR GOBBLED CHR HCONST: ;HARD CONSOLE STATUS CHECK ENTRY ;CONTENTS OF BKCHR IS IGNORED Ͻ >xw>ɯw% :Ͻ7!Խ>wɯ:߽= x :r:ϽG:߽=Ľ9xr:Խy!4 5~POSITION BYTE FOR DRIVE ; A,FLAGS CLOBBERED ; IF NODISKS NE 1 HPADR: LDA SELREQ ;GET REQUESTED DRIVE ADI LOW DHPOS CP ;YES - GO COMPLIMENT FLAG ORA A ;NO - IS MODE = UPPER? MOV A,B ;PREPARE TO RETURN CHR IF SO RZ ;MODE IS UPPER H: ;DUMMY DEVICE RET ; ; ; ; ; ; IN-LINE MESSAGE PRINTER ; THE MESSAGE MUST BE TERMINATED BY BIT 7 HIGH ON THE LASTl!ø*۽^#V#^#Vw# ͒͒ ͒ ͙͒:ҠsA 9 DAA LAST CHR? JP MSG1 ;YES - KEEP PRINTING XTHL ;NO - PUT RETURN ADDRESS BACK RET ; ; PRINT TWO HEX DIGITS ; INTERNALLY R ENDIF ;END OF IF BACKSPC CONDITIONAL CONO1: IN CSTAT ;CHECK CONSOLE OUTPUT STATUS RAR RAR JNC CONO1 M JZ FTEST ;GO CHECK FOR FLUSH ELSE RZ ENDIF LDA RUBFLG ;WAS RUBOUT THE LAST CHR INPUT? ORA A ADI 40H DAA MOV C,A ;PASS ASCII CHAR TO CONOUT ;FALL THRU TO CONOUT ; ; OUTPUT A CHARACTER TO CONSOLE ; INTERNALLYEFERENCED ROUTINE ; ENTRY A 8-BIT VALUE TO BE PRINTED AS TWO HEX DIGITS ; EXIT A,C,FLAGS CLOBBERED ; PHEX: PUSH PSW ;SAVE OV A,C OUT CDATA ;OUTPUT CHAR TO CONSOLE ENDIF ;IF NOT VDM AND NOT CUTER ; IF CUTER MOV A,C ;GET CHAR CPI CR ;