TD8ábn:Altos series 8000 CP/M, version 2.21, Non-DMA, Single Density, from original Altos 8" diskG!`"r3>Ox> >*r*r"r ( y0>*~} | vjE##M}χCG <;\cXc ©RIGHT (C) 1979, DIGITAL RESEARCH !x`_͌`> ͒`> Ò`> Ò`͘`~#͌`ì` _2g<`2gg````g``ʁg``` a!g2:g2a{_:gʖa:g>Ľ`g`ʖa:g=2gg`–a`!Bd!g6#5g`ʖa:g Ľ`!`ͬ`aʧaaÂcaa `)a!`F#xʺa~0awëaw!`"` !g~6ͽ`g`:gý`(c!h#c#a͘`*`~ "b"b͌`#b>?͌`͘`aÂc b=_.:;<> Obo$>!gYb2g*`Ob"`ʉb@HG:ʐb:gwÖbx2gp0bʹb#*©b6?ëbw˜b0bbïb#6 ¹b.b0bb#*b6?bwb0bbb#6 b#6b"` #~? c cxDIR ERA TYPESAVEREN USER!cygOc#>͌`9aaa2g^b b:g¥f.c!c_~#fowde]eefff!v"`!`cç`READ ERRORcç`NO FILE^b:g  b!g ~ 3d#0 bWx bx b b bG d~ b# 3dx~#Bd!Yb~ɯ2g:g=!gý`:g=!g:gý`^bTd!g -~ d 6?#ˆd`ce:g`O> Kde{d͘`aA͒`>:͒`d͢`>:͒`͢`xKd dd> Kd e> ͒`x e d͢`dae`ØdÆg^b BeReͧ`9a!`5‚c#~Y‚c#"`Tdg``b~2g2g\!g!Bd!`~>g >g#0g~Og#Cgx2͘`aa1g)aͽ`Âcfd bzgͧ`ÆgBAD LOo3ADCOMfd^b:g !g bÂc $$$ SUB$hhhhh"Ck{2u!"Ek9"k1Ak2u2u!tuy)K!Gh_^#V*Ckvjijvvjjjjij~ttEtttttttttttu uu,muu&u-uAuGuMutSukku!hh!hôh!hôh!hhBdos Err On : $Bad Sector$Select$File R/O$i:BkA2hhii!k~6 vhiO͐i  :kEiv vBi v2k>: kbi#i v: kvy! k4 5~yyi5 6yiҐi^Hi@Oy Hi Hi: k–iͬi v v#Hii: k! k Hiùi Hi Hi $O͐ii: k2 k*CkN#h j jjxi: k2 kpj&jxi~+éj7ji2 kiHj! k>wi_j: k! ki5ͤiNjkjͱii¦jͱixʊj#Nixj: ki! k2 kͤi! k5™ji#wOi~x½jip Hiikvkyk:! h^#V w#Pk:BkOv|^#V#"u##"u##"u##"u!uOk*u!uOk*u|!u6ʝk6>v*uw#w*uw#w'vûk*v! hJk*ul"u"u!uN#F*u^#V*u~#foyxk*u{_zW+k*uЁlyxl#k*uDMv*us#r*us#ryOxG*u0vMD!v!uN:u ElG>O:u \lSl*Ck :uqln& ^#V>lO^l"u*u}:u*u)=l"u:uO:uo"u*Ck *Ck!ͮl~2u~2uͦl:u2uͮl:ulO:uw:uw |g}ol*u# l )m:BkO!myoxg*u:BkOl}!uN#F m"u*u#*us#r^m ~!hJkm! hJk*u:uo$*Ck~im6imw*u*u{#zmr+s{ozg*u*u͕ml*u*u mm,mw͜mm͸kmmͲk!um!uN#F$v*u*uOk!u~#n:Akn#~$n=2Ekkn͌m݁n:uk:u/GyO>2u!uq*Ck"um͡knmʔo*uJomҔo^m:uOyʃo?|ox |o so-o|oNo-o# %So:u2Ek!u~Яwm>kTm omDm^m6knm-oäoPYyo 5no*u{zoBK5nooڋp>*Ckw~#+w#w+ɯ2Ek2u2umimom^m *Ck :up~pwp~qp͔p͔pq#q #  p qw ~>2up!Ek5Tm*Ck!u"Ckom"Ck!w# Fq! w͌moxm2u͢pm*Ck ~<wʃqG:u!uʎq ìq 4~ʶqom¬q:u<ʶq$qmʶqïqZpͻlkkxm>2u>2uͻl:u!uqqZq2u:Ekqwl̈́lq͊lkͲklk> 2u>2uTm*CkGmͻl:ukwl̈́lnr>l2u;rO ^lDM;o}Hr>k"u*Ck :u:udrdmslrO s#r:Ek͊l:u==»r y==»r*uWw#rm*u"uk͸k*u:uG#šr"umk͸k:u!urw4 rimws:uslZq!Ek~r=2u6ml2u*Ck!!~~#~O~G#n,-.‹s! w! yGs!xs͢p.:Ek<ʄs! q!pQp:Ek<s. ʄs$q.:Ek<ʄskim6}2EkxmsqsrN! ~态O>G~G!~G} o*Ck!r#r#rm t^mͥs_y#x#{ts+p+q-os*Ck ͥs!!q#p#w*u:BkOlYkGk}*uMD m"uãn:u!Bkw!t>2u*Ck~=2uut:Bk2u~2uwEt:Ak*Ckw>"}k!"u"u2Bk!"um!trmQtQpQtâp~?tͦl~?rmQtom*u"CkQt-omQt͜ooQtüqQtqrmQt$qQtpo*u)u:Bkk"um*u)u*u)uQt;po*u"Ek:u;u:Akk2AkQtÓsQtÜsQts*Ck}/_|/*uW}_*u"u}o|g"u:uʑu*Ck6M92:uʑuw:u2uEt*k*Ek}DQt>2usr']ývÅwwwwwwwx x&x6x@xFxNxw:x 44Svxvy{y      Z !"#$%&'()*+,-./0?0_1`>wG>| *?v}|*Av}2|2!x͓x22 h*x"aw"x[whZugRwh[whѷ!w!w>^ !;vZ*v"!DwÀ!v v!x͓xäwCBIOS00 COM ~w##M1` xx@x6xFx >2!v"2!h"@x:O`>w(> y> yɯ>G͉x6> !y2x͉x~~!Cv͉xyw>y n&i`"x>>`xx*xg"f*x"h*xJ>*x&3v~#OwE 32K ALTOS LOADER VERS 2.21 CBIOS00.COM NOT FOUND ON DISK, CORRECT AND RETRY J>*x&3v~#OwE 32K ALTOS LOADER VERS 2.21 CBIOS00.COM NOT FOUND ON DISK, CORRECT AND RETRY Ui2MOVCPM COML CBIOS32 COM CBIOS48 COMCBIOS64 COM@@@y3CBIOS221ASMxyz{|}~CBIOS221ASM6DEBLOCK ASMPDISKDEF LIB1ׁY )}o|g"J! :m % 2x2 ~#%*J!:m G xh {X~#o}oddG:m ! ~š#v~mPIP COM:SUBMIT COM XSUB COMED COM4 !"#@ @ @ IOZ80S LIB MODE COMCPMSETUPCOM /* DM! xʚ w#Í!N#F! D!>0w#w!4~:ڭ60+4í*[" *J READY FOR "SYSGEN" OR "SAV FmASM COM@$%&'()*+DDT COM&,-./0LOAD COM12STAT COM)345678@@@@}vE 00 CPM00.COM"$ ENTER Y FOR HARD DISK SYSTEM $ INVALID MEMORY SIZE $ CONSTRUCTING 00K ALTOS LOADER VERS 2.21$LgSYSGEN COM9DUMP COM:DUMP ASM!;<=>?BOOT221 ASM6@ABCDEFk,COPYRIGHT (C) DIGITAL RESEARCH, 1980 1] {?{! __0 r))) O @|r}r.g))Ï0!$@@@@y1C221LDRBASMGHIJKLMNOPQRSTUVC221LDRBASMW?CBIOS221ASMXYZ[\]^_`abcdefgCBIOS221ASMhijklmnopqrstuvw~/w/w~|g|?š>@G![>0w#w!\4~:ڱ60+4£L>N2G!N#F! ]x # #+\w+w!:G@ŁG:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" x_͌> ͒> Ò> Ò͘~#͌ì _2<2=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ@#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 321y_͸2y2ͽ: k !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ: z3ADCOMf^: !  $$$ SUB$ @  w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ @l1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!&"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E ,!"r3>Ox> >*r*r"r ( y0>*~} | jE##M}χCG ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧ@ ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!R#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@ &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6r;\X ©RIGHT (C) 1979, DIGITAL RESEARCH !gFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q>ͦ!q:_  !p+q.*   !q*&!p+q*2k~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x cP  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6yLS:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK52*C ~=2u:B 2~2wE:A *C w>"2O *!O *|!6ʝ 6>*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!Fwy {"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈ  !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q* Ձ 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~͔͔# # ɁNÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ ):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6"*}:*)= ":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:!ʎr: :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# X92:ʑw:2E* *E }DQ>2' ) :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#{M 2E > :! ^#V w#P :B O|^#V#"##"##"##"!ì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >ýÅ &6@FN: G G S{      ف0FC000CD2C0EC977C9CD9C0ECDE00E0E01CDB84B :100FD0000CC3DA0ECDE00ECDB20C21B116C3E30E78 :100FE00021B9164E2346C324172AB916EB2AB116@@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ʫwzw kxwy>0 !Nv ~ 2!|ͽ{ëwy2}i&))))v"v ^#V!V!yr*v`i"v`i" }y2 }Nv*}&y>*&3~#OE 00K ALTOS LOADER VERS 2.21 CBIOS00.COM NOT FOUND ON DISK, CORRECT AND RETRY c:Tww6|A|&|z&|A| |!xkxqxexÉxÔxïzmyßxxz     !"#$%&'()*+,-./0?0_1>G>| *?}|*A}2|2!͓22 *"a"[@  HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD O~wxڀyyxڏyy*}&}Zvqyʷxvxn&})))v*v Zv*}&~:}y!y[y6y:}:} i $O@B B HH II$@DI ABI$"$H$H {i E}ThΥ (χw} w}}w} w}}w} w9~~w} wx~Y~w} w}4w ugR[ѷ!!>^ !;Z*"!DÀ! !͓äCBIOS00 COM ~#@yV" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$!  $I$I   @  $$j>:v:~v~y++y##wZy!~vAyw.y:}[y:v>Qy>~*~v}&BvT] |( n& :y#"@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$ˁ}Dw?     4 0_!!!q|ͽ{>v2^w:v(#!{"v!{".v!{":v"2!"2!"@:O>(> y> yɯ>@z;4  @I  $   &>2|>2v>Ûy>2|>2v>2|*v"v:}!y> 2}y:}c|[y6!|>w[y: }2v(wy:}c|: }2v yA DI$@  A$@M$$@H! "!$$" @B$!!!DH$$"H 9>v"@v>>22!x!Zv N͟x w }>2!v"2!h"ex>{G#:O`1!xxkx,!`Jqxex͉xw͉6> !y2͉~~!C͉yw>y n&i`">>`x*g"f*"h*@qzEz:}!f}!vf:| -z!g6*v:|!}f!}6!}:|wx!}~gzʠzÁzʠz@([y~@ ~ cO~wԸڀԸڏ*&}Zqyʷvn&})))* Z*&~:![6::{i E}ThΥ (χ  ۽ 9 xY 45'!P:w#w!Rw#!6:6& VERS 2.21 PERMANENT DISK ERROR, DRIVE TRACK HEAD SECTOR STATUS INVALID DISK SELECT DISK DENSITY CHANGED %/l2!9 N#F  >ȯͯz ;zy.>::~~++##wZ!~Aw.:[:>Q>~*~}&BT] |( n& :# D?     4 0_!!!qͽ>v2^:(#!"!".!":"<" @ 5'!Pv:v}w#w!Rvw#!}6:v6&   p+qM$> >ȯ͙ ͦy>>~#O&ý!ͽ:~K!ͽ:K:~!ͽ:K!ͽ:K t%/l{{{2}!9 N#F >2>2>Û>2>2>2*":!> 2Ϲ:c[6!>w[: 2(w:c: 2 >"@>>22!!Z N͟ >2!"2!"e>G#:O1!߸k,!Jqe͉Էc:T6A&&A !kqeÉÔïmß    @;!ļͽ:K:߸O!B ~>w߸> yɯ>6(T0:8O&d))e c 48K ALTOS DOSf  p+qM$> >ȯ͙{ ͦ{y>>~#O&|ý{!|ͽ{:~vK|!|ͽ{:vK|:~v{!|ͽ{:vK|!|ͽ{:vK|E:!f!f: -!g6*:!f!6!:wԸ!~gʠÁʠ@([~@ ~ c΁ʫz ky>0 !N ~ 2!ͼͽëy2i&))))" ^#V!V!r*`i"`i" y2 N*&y{i E}ThΥ (χ   9 xY 4c:TԷ6A&ƺ&A !kqeÉÔïmßԸ     VERS 2.21 PERMANENT DISK ERROR, DRIVE TRACK HEAD SECTOR STATUS INVALID DISK SELECT DISK DENSITY CHANGED `!|ͽ{:}K|:}xO!Bv ~>wx> yɯ>6|(T|0:8O&|d))e| c| 32K ALTOS DOSWM:߸2fͧ!5rͧȻ!6*~&4> >ȯͯ ;yAD?     4 0_!!!qͽ>v2^:(#!"!".!":"<"@  p+qM$> >ȯ͙ ͦy>>~#O&ý!ͽ:~K!ͽ:K:~!ͽ:K!ͽ:K221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$΁>2>2>Û>2>2>2*":!> 2:c[6!>w[: 2(w:c: 2 ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE R=>"@>>22!!Z N͟ >2!"2!"e>G#:O1!k,!Jqe͉(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) ,!ͽ:K:O!B ~>w> yɯ>6(T0:8O&d))e c 64K ALTOS DOS ::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'!  E:!f!f: -!g6*:!f!6!:w!~gʠÁʠ@([~@ ~ c ETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE ʫz ky>0 !N ~ 2!ͽëy2i&))))" ^#V!V!r*`i"`i" y2 N*&y(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) VERS 2.21 PERMANENT DISK ERROR, DRIVE TRACK HEAD SECTOR STATUS INVALID DISK SELECT DISK DENSITY CHANGED :$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2 WM:2fͧ!5rͧ!6*~&4> >ȯͯ ;yԁ$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNI?O~wڀڏ*&}Zqyʷvn&})))* Z*&~:![6::ށ COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PU5'!P:w#w!Rw#!6:6&Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>%/l2!9 N#F ^ZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 >::~~++##wZ!~Aw.:[:>Q>~*~}&BT] |( n& :#NTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$gHHͯ :^!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ͣ :] :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>! !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:cͯ m!62m!62m!62m!62m'2:2:TҒ:2؁ ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >́:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6< :! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& ! ρڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O> y͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆  !6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[  ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  @*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:&2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 *Ё*M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*x/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!ET :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q|¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{&Ɂ`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!D!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2m :[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?† 5:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H s :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6 @ ~9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\ DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{o !6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ G:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!"" p2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ @ N-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>= 092zgO{ozgi`N#Fogo&og H ©=¨' ÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O* 7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_! k !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6' @ k20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:! @ 4& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 ! "' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M !j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂ @ :=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 @ r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H !4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*  w copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Comm @ wA v ~_{ozg 001 $$$$ SUB @ hʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z e ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7* Band Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q* @ @ @ 6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ 2% ͋*-"*$$$ SUBq:(=2(N *$*& w*$#"$*&#"&' !"N*M^7 !)6:!)ھ *N*DM͆  ҁ=2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:= W Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$:y*###ƒ# yk  @ 0FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~!~_z*~& w!~5Bx:yͧ*v+"v i_2*ʭ :*ʗ ͯ *N"P*6:2)÷ *N"N!) $@BA$! A "!$"" /ͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uM g  җ 4!~=ŐW!xʵ ~#èbx {~#o}où.xsubb!np+q*m2_!pp+q*o 9m++s#r!9+s#r9";9;"^*mM 6*m+"o!o#s#r!6!f6!6:] :m H}- :\ ߁͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:" 8_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎ :7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x ́! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+" :f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o 2d‘ 2dÝ:d=2d!\6:l2e±:d2eø:e=2eEU !M6 !""*o"$!h61m!6#1m!6?1m!6>1m!f6 L"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :! ! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6 Q!e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w :  !!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2d N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2" F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :! =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8! 3LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t  *r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q* hû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F &+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ E (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F” *`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"` R-? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G 8!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q* )ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!" =- ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq + 8:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ *$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:!  "“**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ 1g_{_z#W H =+ LIB > ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq" с*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x-  e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6 *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!  X$$$$$$$LIB. j* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq +: ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q* :>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6 "&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6  @ ǁ N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{. *FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "P MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!! $:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :h L!7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"& @ *22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*:  ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&o >6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!:  AHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B!  @ @ @ @ 1HEX 1 @ @ @ @ @ @ @ r;11*" COPYRIGHT(C) 1978, DIGITAL RESEARCH ' @ @ @ @ @ %  @ @ ag`!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ  @ @ =! á 4êü /L9ASMPRN  @9!)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1 @x: A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋sl#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8 Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCECCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAX :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w+.$![w#w#b!"!F#v2[ a>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<:  Pu n!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fk FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊ :RICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/ q#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~DG*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " z'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂ ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪÁ?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6yʁ{zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~c8:  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ)sn55)=â|g}o=î--#zg{ozg{ozg{@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!:! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 *_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMāoÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#uk:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N jîîĽ y0îîH ñG 1: :,; c*| } 8O/z8O!B N#N ¾SP.* |} !9":q!" 2 W y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P j=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅ=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃ oĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>S @* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSx ā!ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ Ͱ>2lyPLnR>UX:l̅2l͓΁i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oAR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"O=!9 Ÿ!6q!2qC J R q!z z=naO $q$,!S 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ix͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËw *>E a2C!" """ :ʼ:*1 |R|ͦ0FIL: R=ÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘h* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0L;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qyH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñ.C–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#   R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H%=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ@&O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRE_!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 +*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O {XoeD$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I   ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtT 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 AN7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P  ԁ `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« {t$I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A" Za. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f vZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_ 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!E8q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  , f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #?$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.)*)þ))>+><7"9.Yͯ * M^2U âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1g! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6 ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ +!$I$I$UUU$$A$ /| 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X3 :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI k͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~@lR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! [tatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On de"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O}*3 Copyright (c) 1979, Digital Research??JCON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP@A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_ 6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝ R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Ɂ: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* :UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics6 @ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERRORmKA{ozg^#V) _{ozgi`N#Fogo&og_{_z#W* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!?  Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!5536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRU ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNO@oq=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wb͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸ecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk SӁT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒ@RŁL!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\Lk ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DMDM oͱ*DM ͱ*N#F ͱ * N#F ͱ͠!p+q͠*DM':͐ͫZ"!6> *} *M)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!"kTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqosj6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) R" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_؁ =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐* !+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :! )!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V" *s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ: 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r! -p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2c)*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"o)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%)!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4b͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)(>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~!)6!)6>!)=:)!)w=*)&*)~2):!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!g!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)@@!9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> eM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W?͚u c͊2!?͚!͕u cA7nA2Aͦ!͕u c͊!6!?͚>ͦ͊!Q͕SYSGEN VER s͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)cDxCOPYRIGHT (C) 1978, DIGITAL RESEARCH  o&)))))))a{ @ ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FI  ? ^2.0SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn __> ̓> ̓͊~̓#ÚO****!*$*'! ">2!4:(wNͯ>2@BLE PRESENT ON DISK$!Y , <    *$A!6 # T!w $r# *`: 0 @ҁ ON , THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A, B, C, OR D)NO SOURCq-:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2):)!4f!^!*FNͷyj*DMͿ2: K!͚u c͊<2:\_/:)j*"1!u͚@*A*! ~ ʰxkb))))_y‘BK{ͅ*!66!"80*{#z+++ #@/%E FILE ON DISKSOURCE FILE INCOMPLETE-;99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogD`:] \<œ!x͕c2|\ ¢! DMͿ\õ!͕c!͕u AnA2Aͦ͊!d@LE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR ӁME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FCRKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED ˁ 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;CTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;T@JMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ; WBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCB MVI C,TYPEF MOV E,A CALL BDOS POP B! POP D! POP H; RESTORED RET ; CRLF: MVI A,CR CALL PCHAR MVI A,LF CALL PC TYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN  ^O NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE  @ā HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALL LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK ARHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMŁREADF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP @e LINE POSITION JC FINIS ;CARRY SET BY GNB IF END FILE MOV B,A ; PRINT HEX VALUES ; CHECK FOR LINE FOLD MOV A,L ANI 0FHEA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FIP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRC!IC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NA΁; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,Bā; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARA RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE @PLF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;DWARE CONSTITUTES A BREACH OF THE COPYRIGHT ; LICENSE TO THE PURCHASER. ; ; VERSION DATE FEB 08, 1979 ; ; VERSION DATE JULY ,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; UK TITLE 'CP/M Bootstrap Sector (ie. track 0, sector 1) - June 20, 1980' ;---~ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0 @ IB ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END  ΁16, 1979 ; Modification to provide optional DMA support for hardware. ; ; VERSION DATE SEPTEMBER 7, 1979 ; ADD SUPPORT FOR C KSETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C, u --n ; ; ; ALTOS COMPUTER SYSTEMS ; 2360 BERING DRIVE ; SAN JOSE, CALIFORNIA 95131 ; ; (408) 946-6700 ; ; ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH C@@YP/M VERSION 2.00 ; ; VERSION 2.21 ; DATE: June 20, 1980 ; Add support for user selectable console baud rate ; Revised for CӁOPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MW ; COPYRIGHT 1980, ALTOS COMPUTER SYSTEMS ; ; THIS PROGRAM IS A COPYRIGHT PROGRAM PRODUCT OF ; ALTOS COMPUTER SYSTEMS AND ISARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISION@@CP/M 2.21 ; ; ;#--)- ; ; ASSEMBLER CONTROL STATEMENTS ; IVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,/ DISTRIBUTED TO THE ; OWNERS OF ALTOS SUN SERIES 8000 COMPUTERS FOR ; USE ON THOSE SYSTEMS ONLY. ANY OTHER USE OF THIS ; SOFT INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H@vWC;#--9- ; MACLIB Z80 TRUE EQU 0FFFFH ;VALUE FOR TRUE CET TO LOAD FROM SECT 2 ; ;#--- ; ; UPDATE TRACK REGISTER CH ;START OF BIOS ; ;#--"- ; ; ROUTINE TO LOAD AND RELOCA}] ;SET INPUT PORT # LHLD DMAAD endif if dma CALL SETDMA ;SET DMA FOR READ endif  OUT 4  ;ISSUE  RDSK OFFST EQU 2800H ;CCP OFFSET FROM TOP OF MEMORY ENDIF IF NOT HARDSK OFFST EQU 2000H ;OFFSET FOR FLOPPY SYSTEM ENDI]?--1- ; ; SETUP TO READ FIRST SECTOR ON TRACK ; ;---)FALSE EQU NOT TRUE ;VALUE FOR FALSE VERSION EQU 22 ;CP/M VERSION NUMBER MSIZE EQU 32 ;MEMORY SIZE OF SYSTEM FOR ASSEMBLY A IN 1771 ; ;#--- ; READS: SUI 26  MOV C,A CTE CCP/BDOS/CBIOS ; ;#--#- ; ORG 0000H ;ORIGIN FOR BOOTS READ COMMAND WAIT2: JR WAIT2 ;WAIT FOR I/O TO COMPLETE ADSEC: PUSH D ;INCREMENT MEMORY ADDRESS LXI D,128 LHLD DMAAD ;AD {F IF RELOC ; ;When assembling for relocatable version, ; ;do one assembly with BIAS of 0000H ; ;do second assemb 2m -- ;  XRA A ;SET HEAD LOAD DELAY  OUT 13  &MVI A,8CH ;READ COMMAND & HE ; ;..NOTE: MSIZE HAS MEANING ONLY IF THIS ; ;.. ASSEMBLLY SPECIFIES RELOC EQU FALSE RELOC EQU TRUE ;SET TO FALIs  ;SAVE SECTOR #  OUT 6  ;SEND SECTOR # TO CONTROLLER  INR B  ;INCREMENT TRACK {TRAP COLD: LXI H,CCP ;BASE OF BDOS FOR LOAD SHLD DMAAD ;SET AS DMA ADDRESS SPHL ;KEEP STACK OUT OF THE WAY DRESS TO BE UPDATED DAD D ;DO IT.... SHLD DMAAD ;SAVE UPDATED ADDRESS POP D ;RESTORE REGISTER D POP B INly with BIAS of 0100H BIAS EQU 0000H ;VALUE FOR RELOCATABLE ASSEMBLY ENDIF IF NOT RELOC BIAS EQU (MSIZE*1024)-OFFST ;VALUXC AD LOAD ; ;#---- ; ; ISSUE READ FOR EACH SECTOR ; ;-----eSE FOR NORMAL ASSEMBLY DMA EQU FALSE ;SET TO TRUE IF DMA GENERATION HARDSK EQU FALSE ;SET TO TRUE FOR HARD DISK SYSTEM I^y#  MOV A,B  OUT 7  ;SEND TRACK # TO CONTROLLER  'MVI A,01AH ;SEEK COMMAND }  *MVI D,51 ;NUMBER OF SECTORS TO LOAD  'MVI B,0FFH ;STARTING TRACK-1  MVI A,26+2 ;S{e 4 ;READ DISK STATUS ANI 09FH ;REMOVE UNWANTED STATUS BITS JRNZ COLD ;BAD STATUS, START OVER  DCR D ցE FOR ABSOLUTE ASSEMBLY ENDIF CCP EQU 000H+BIAS ;START OF CCP BDOS EQU CCP+806H ;ENTRY TO DOS FOR CALLS BIOS EQU CCP+1600fC!--% ; READ1: PUSH B if not dma  MVI C,7 ցF DMA REVLVL EQU 0 ;REVISION LEVEL FOR DMA SYSTEMS ELSE REVLVL EQU 1 ;REVISION LEVEL FOR NON-DMA SYSTEMS ENDIF IF HAY OUT 4 C ;SEEK TO TRACK WAIT1: JR WAIT1 ;WAIT FOR I/O TO COMPLETE ; ;--{< ;DCR SECTOR COUNT JRZ GOCPM ;FINISHED LOAD, START CP/M  INR C  ;INCREMENT SECTOR COUNT  MOV A:-ENABLE SYSTEM DB 0EDH,04DH ;FAKE RETI INSTRUCTION ; ;#--=--2 ; ; INTERRUPT POINTER AND SERVICE ROUTINE ; ;--MC TITLE 'LOADER, COPYRIGHT June 21, 1980, ALTOS COMPUTER SYSTEMS' ;---l[QA,L OUT 00CH MOV A,H OUT 00CH JMP BIOS ;GO START THE BALL ROLLING ;---0CFH,087H ORG 007BH DB 'C' ;ID FOR CP/M SYSTEM DB VERSION,REVLVL BAUD$RATE: DB 047H,00DH ;DEFAULT OF 9600 BAUD FOR1} A,C  CPI 27 I ;HAVE WE FINISHED THIS TRACK? JRNC READS ;CONTINUE WITH NEXT TRACK  OUT 6 C- ; ; DMA setup routine ; ;#--- ; if dma setdma: lx "m --=- ; ; ORG 005EH ;FLOPPY INTERRUPT VECTOR MUST BE AT 05EH  #DW INY2A ;POINTER FOR MO }--v ; ; ALTOS COMPUTER SYSTEMS ; 2360 BERING DRIVE ; SAN JOSE, CALIFORNIA 95131 ; ; (408) 946-6700 ; ; COPYRIGHT  ho --h ; ; THE FOLLOWING TWO WORDS ARE RESERVED FOR USE BY SETUP. IF YOU ; MODIFY ANY CODE IN THIS MODULE, kY CONSOLE ; ;THESE VALUES MAY BE CHANGED BY ; ;SETUP TO ALLOW OTHER BAUD RATES  END   u# ;SEND SECTOR # TO CONTROLLER  BMVI A,088H ; JR READ1 ;CONTINUE ON WITH THIS TRACK ; ; ---i h,dmastr ;DMA setup string lxi b,0900H ;port zero in C, count of 09 in B db 0EDH,0B3H ;fake OUTIR instruction ret ; }DE 2 INTERR. if not dma ORG 0066H ;NON MASKABLE INTERRUPT (DRQ) DB 0EDH,0A2H ;FAKE INI INSTRUCTION DB 0ʁ1980, ALTOS COMPUTER SYSTEMS ; ; THIS PROGRAM IS INTENDED TO PERFORM THE LOADING OF THE ; CCP AND BDOS INTO MEMORY DURING THEyo YOU SHOULD BE SURE THAT THE ; "ORG" STATEMENT WHICH FOLLOWS DOES NOT CAUSE ANY CODE TO BE ; OVERLAYED. ; ;---@zI--> ; ; FINISHED LOADING, SETUP PRINTER PORT THEN DENSITY ; ;--A endif ; ;#--%- ; ; DATA AREAS USED BY BOOT ; ;---EDH,045H ;FAKE RETN INSTRUCTION endif ; ; ; INY2A: POP H ;ON INTERRUPT SKIP TWO BYTES INX H INX H PUSH H EI ;RE} FIRST COLD START ; OF THE ALTOS SYSTEM. ; ONCE THE SYSTEM IS LOADED IT WILL LOAD THE FULL CBIOS ; ROUTINES WHICH WILL CONTRO1--# ORG 05AH DW 0 DW 0 ; ;---@O--H- ; GOCPM: LHLD BAUD$RATE ;GET INFO FOR CONSOLE BAUD RATE MOV I--B ; DMASTR: DB 07DH DMAAD: DS 2 DW 080H-001H DB 0CFH,001H,zL THE LOADING AND OPERATION ; OF THE SYSTEM FROM THAT POINT ONWARD. ; IF THE INITIAL LOAD OF THE SYSTEM IS UNABLE TO FIND THE OS EQU CCP+806H ;BASE OF BDOS BIOS EQU CCP+1600H ;BASE OF BIOS IF DMA BIOSLN EQU 23*128 ;LENGTH OF CBIOS FOR MOVE ELSE  FROM TOP OF MEMORY ENDIF IF NOT HARDSK OFFST EQU 2000H ;OFFSET FOR FLOPPY ONLY SYSTEM ENDIF IF RELOC ; ; ;WHENe--^ ; ; FIXED TABLES FOR TWO DRIVE MINIMAL STANDARD SYSTEM ; ; THE LOCATION OF THE FOLLOWING aC--5 ; ; THE FOLLOWING FIELDS ARE USER MODIFIABLE ; ; ---Ɓsole status jmp conin ;console character in jmp conout ;console character out jmp list ;list character out jmp punch  ; FULL CBIOS ON THE CURRENT DISK IT WILL CONTINUE TO ; OPERATE BUT IN A DEGRADED MODE. ; ; VERSION: 2.00 ; DATE: OCTOBEF BIOSLN EQU 19*128 ;LENGTH OF CBIOS FOR MOVE ENDIF CDISK EQU 0004H ;current disk number 0=A,...,15=P IOBYTE EQU 0003H  ASSEMBLING FOR RELOCATABLE VERSION ; ;DO ONE ASSEMBLY WITH BIAS OF 0000H ; ;DO SECOND ASSEMBLY WITH BIAS OF 0100H BIAS ,mcTABLES MUST NOT BE ; CHANGED AS EXTERNAL PROGRAMS RELY ON THEIR ; POSITION IN THIS PROGRAM. ; ;--- M--? MSIZE EQU 32 ; DMA EQU FALSE ; HARDSK EQU FALSE ; ; --- ;punch character out jmp reader ;reader character out jmp home ;move head to home position jmp seldsk ;select disk j ˁR 5, 1979 ; . INITIAL VERSION OF PROGRAM. ; ; VERSION: 2.21 ; DATE: June 3, 1980 ; . Change length of move for CBI}s ;intel i/o byte ORG BIOS ;origin of this program NSECTS EQU ($-CCP)/128 ;warm start sector count PAGE ;---N EQU 0000H ;VALUE FOR RELOCATABLE ASSEMBLY ENDIF ; IF NOT RELOC ; BIAS EQU (MSIZE*1024)-OFFST ;VALUE FOR ABSOLUTE ASSEMBZ]--V TRKM: DB 000H,000H,000H,000H ;TRACK REGISTERS SELM: DB 004H,008H,010H,020H ;DENSIS--L ; ; THE FOLLOWING CONSTANTS APPLY TO THE RELOCATION OF BIOS ; ;--------فmp settrk ;set track number jmp setsec ;set sector number jmp setdma ;set dma address jmp read ;read disk jmp write COS ; ;#--2- MACLIB DISKDEF MACLIB Z80S VERSION EQU A--3 ; ; JUMP VECTOR FOR INDIVIDUAL SUBROUTINES ; ; --- CLY ENDIF ; ;#--'- CCP EQU 000H+BIAS ;BASE OF CCP BDāTY MASKS UPDATED BY SETUP MODM: DB 000H,000H,000H,000H ;MODE MASKS UPDATED BY SETUP PTR1: DB 047H,00DH ;9600 BAUD SETUP FOR I--B- RELOC EQU TRUE ; IF HARDSK OFFST EQU 2800H ;CCP OFFSETe[ ;write disk jmp listst ;return list status jmp sectran ;sector translate PAGE ;---uk22 ;CP/M VERSION NUMBER ALTOSV EQU 1 ;ALTOS VERSION NUMBER TRUE EQU 0FFFFH ; FALSE EQU 00000H ; ; ---S--L jmp boot ;cold start wboote: jmp wboot ;warm start jmp const ;conPRINTER 1 PTR2: DB 047H,00DH ;9600 BAUD SETUP FOR AUXILLIARY PORT DPBASE: ;THESE BLOCKS ARE UPDATED BY SETUP ; DISK PARA+AND INITIALIZES THE BDOS PRIOR TO ATTEMPTING TO LOAD ; THE FULL SYSTEM BIOS. IF THE FULL BIOS CAN NOT BE ; LOCATED, A MESSAGE SIZE DW 2 ;TRACK OFFSET MPARMS: DW 0 ;MISC. PARAMETERS ; ; 0100H = DOUBLE HEADED FLOPPY DRIVES ; 0200H = CENTRONICS PRINTIVE MVI C,15 ;OPEN DISK FILE CONTAINING CBIOS LXI D,BIOSFCB ;POINT TO FCB TO BE OPENED CALL BDOS ;.... CPI 0FFH ;Wve--^ SDBLK: ;DISK PARAMETER BLOCK FOR SINGLE DENSITY dw 26 ;sectors per track db 3 ;block A,L ; OUT 032H ; MOV A,H ; OUT 032H ; EI ;ENABLE SYSTEM LXI H,MSG ;BOOT MESSAGE CALL MSPRT ; xra a ;zeMETER HEADER FOR DISK 00 (A:) DW XLT00,0000H DW 0000H,0000H DW DIRBF,SDBLK DW CHK00,ALL00 XLT00: db 01,07,13,19,25,05SIIS ISSUED AND CONTROL PASSES TO ; CCP FOR DEGRADED MODE OPERATION. ; ;--- wCTER IS LIST DEVICE ; ;#-- - ; ; END OF FIXED LOCATION DE ELL, ??? JZ NOBIOS ;NO, WE DIDNT FIND IT.... LXI D,0100H ;WHERE WE WILL LOAD THE BIOS BOOTLOOP: PUSH D ;SAVE DMA A E shift factor db 7 ;block mask db 0 ;null mask dw 242 ;disk size-1 dw 63 ;directory max db 192 ;alloc 0 db 0 ; &ro in the accum sta iobyte ;clear the iobyte sta cdisk ;select disk zero ; ; WE WILL NOW ATTEMPT TO LOCATE THE CP/M FULL 7,11,17,23,03,09,15,21 db 02,08,14,20,26,06,12,18,24,04,10,16,22 XLT01: DB 01,02,03,04,05,06,07,08,09,10,11,12 DB 13,14,15w--p BOOT: ;simplest case is to just perform parameter initialization LXI SP,CCP ;SET STACK OUT OF THE WAY M1PENDENT TABLES ; ;#-- - PAGE ; ---DDRESS MVI C,26 ;SET THE BDOS DMA ADDRESS CALL BDOS ; MVI C,20 ;NOW READ ALL THE CBIOS INTO MEMORY LXI D,BIOSFCB ;POIalloc 1 dw 16 ;check size dw 2 ;track offset DDBLK: DW 48 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLO[ BIOS AND LOAD IT ; INTO MEMORY TO COMPLETE THE SYSTEM LOAD PROCESS. ; BOOTLOAD: MVI C,13 ;INITIALIZE DISK SYSTEM CALLyr,16,17,18,19,20,21,22,23,24 DB 25,26,27,28,29,30,31,32,33,34,35,36 DB 37,38,39,40,41,42,43,44,45,46,47,48 ;--xVI A,INTERUPT SHR 8; STAI ;SET INDEX REGISTER MVI A,INTERUPT AND 0FFH OUT 00AH ;SET FLOPPY INTERRUPT ADDRESS LHLD PY--R ; ; COLD BOOT ROUTINE ; THIS ROUTINE RECEIVES CONTROL FROM THE BOOT LOADER ; CNT TO FCB FOR I/O CALL BDOS ;.... POP D ;RESTORE DMA ADDRESS ORA A ;END OF FILE YET?? JNZ BIOSIN ;YES LXI H,080HCK MASK DB 0 ;EXTENT MASK DW 224 ;DISK SIZE-1 DW 95 ;DIRECTORY MAX DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 24 ;CHECK h BDOS ;.... LHLD MSZ ;LOAD ASCII MEMORY SIZE SHLD BIOSFCB+6 ;USE FOR FILE NAME SHLD NOMSG+7 ;AND MAKE MESSAGE DESCRIP1--#- ; ; DISK PARAMETER BLOCKS ; ;--->TR1 ;SETUP DEFAULT RATES FOR PRINTER MOV A,L ; OUT 00EH ; MOV A,H ; OUT 00EH ; LHLD PTR2 ;AND FOR AUX PORT MOVY ;BUMP BY SECTOR SIZE DAD D ; XCHG ;PUT BACK INTO DE JMP BOOTLOOP ; BIOSIN: MVI A,05EH ;SET FLOPPY INTERRUPT ADDC!S RUNNING IN DEGRADED MODE. ; ;#--- WBOOT: ;SIMPLEST CASC----- ; ; INTERRUPT VECTOR AND ROUTINE ; ;#-- - ORG (($O--H CONST: ;console status, return 0ffh if character ready, 00h if not ESTING PLACE. ; MOVPGM: LXI H,0100H ;START FOR MOVE LXI D,BIOS ;TARGET ADDRESS LXI B,BIOSLN ;LENGTH OF BIOS TO BE MO ;for jmp to bdos lxi h,bdos ;bdos entry point shld 6 ;address field of jump at 5 to bdos lxi b,80h ;default dma addressŁRESS TO STANDARD OUT 00AH ; LXI H,MODM ;ADDRESS OF MODE MASKS, UPDATED BY SETUP LXI D,15AH ;ADDRESS OF MODE BYTES IN LOE IS TO DO A COLD BOOT LXI SP,CCP ;SET STACK OUT OF THE WAY mvi c,000H ;select disk 0 call seldsk ; call home ;go to +001H) AND 0FFFEH) ;ENSURE EVEN ADDRESS INTERUPT: DW IRTN IRTN: POP H ;PICKUP PC INX H ;BUMP PAST JR $ INX H ;  H XRA A ;CHECK STATUS OUT 01DH ; IN 01DH ; ANI 00000001B ;CHARACTER WAITING ?? RZ ;NO, RETURN MVI A,0FFH ;RETURN  (VED LDIR ;MOVE IT.... JMP BIOS ;GO TO COLD BOOT ENTRY POINT MPLEN EQU $-MOVPGM ;LENGTH OF MOVED PROGRAM CODE NOBIOS:  ԁ is 80h call setdma lda cdisk ;get current disk number mov c,a ;send to the ccp jmp ccp ;go to cp/m for further proces ADED BIOS LXI B,004H ;LENGTH FOR MOVE LDIR ;MOVE UPDATED MODES TO LOADED BIOS LHLD MPARMS ;UPDATE MISC. PARAMETERS Ś track 00 LXI B,000H ;SET DMA ADDRESS CALL SETDMA ; MVI C,001H ;SET SECTOR 1 CALL SETSEC ; CALL READ ;READ BOOT SI? PUSH H ;PUT IT BACK FOR RETI EI ; RETI ; PAGE ; ---ALL FOXES ret CONIN: ;console character into register a CALL CONST ;CHARACTER WAITING ?? JRZ CONIN ;NOT YET.... IN ρ LXI H,NOMSG ;TELL USER NO BIOS ON DISK CALL MSPRT ; JMP GOCPM ;GO TO CP/M WITH LIMITED BIOS BIOSFCB DB 0,'CBIOS00 CO&Csing PAGE ;#--*- ; ; THESE ARE THE BYTE ORIENTED ROUTINLHLD 0188H ; LXI H,MOVPGM ;START OF MOVED PROGRAM LXI D,080H ;DESTINATION LXI B,MPLEN ;LENGTH LDIR ; JMP 080H ;ECTOR INTO MEMORY ORA A ;OK ?? JRNZ WBOOT ;NO, JUST RETRY JMP 000H ;GO RELOAD EVERYTHING gocpm: mvi a,0c3h ;c3 is 3------ ; ; THIS IS THE WARM BOOT ROUTINE. ; THIS ROUTINE WILL ONLY BE USED IF FULL BIOS CANNOT BE ; LOCATED AND THE SYSTEM I01CH ;READ CHARACTER IN ANI 07FH ;MAKE SURE ITS ASCII ret CONOUT: ;console character output from register c MVI A,010+M',0 DB 0, 0 PAGE ;!---{qES. ; SOME OF THESE ROUTINES ARE USED INITIALLY BUT IN ; GENERAL THEY WILL ONLY BE USED IN DEGRADED MODE. ; ;---[GO TO MOVED PROGRAM ; ; THIS FOLLOWING PROGRAM IS MOVED TO LOW MEMORY AND IS USED ; TO MOVE THE FULL BIOS UP TO ITS FINAL R0a jmp instruction sta 0 ;for jmp to wboot lxi h,wboote ;wboot entry point shld 1 ;set address field for jmp at 0 sta 5>H ;RESET INT BIT OUT 01DH ; IN 01DH ;GET STATUS ANI 00001100B ;TXE AND DTR CPI 00001100B ;READY ?? JRNZ CONOUT ;NOҁER DAD D ; MOV A,M ;PICKUP MASK OUT 008H ;WITHE IT OUT TO SELECT DRIVE ; compute proper disk parameter header addresׁk 00 position of current drive CALL POINT ;POINT TO TRACK REGISTER MVI M,000H ;SET TO TRACK ZERO MVI A,00AH ;HOME COMMAMA READ CODE MVI C,09FH ;READ STATUS MASK jr waitio ;to perform the actual i/o WRITE: ;perform a write operation MVI Xet ;null subroutine READER: ;read character into register a from reader device mvi a,1ah ;enter end of file for now (replate table given by DE xchg ;HL=.trans dad b ;HL=.trans(sector) mov l,m ;L = trans(sector) mvi h,0 ;HL= trans(sector), WAIT HERE MOV A,C ;Get to accumulator OUT 01CH ;WRITE IT ONTO CONSOLE ret LIST: ;list character from register c Mzs LXI H,DPBASE ;ONLY ONE SO ITS EASY.... ret SETTRK: ;set track given by register c CALL POINT ;POINT TO LAST TRACK  ND OUT 004H ;DO IT WT1: JR WT1 ;WAIT HERE UNTIL FINISHED ret ;RETURN TO CALLER SELDSK: ;select disk given by registe A,0ACH ;WRITE COMMAND CODE MVI B,005H ;DMA WRITE CODE MVI C,0FFH ;WRITE STATUS MASK waitio: ;enter here from read and  Cce later) ret PAGE ;#--- ; ; THESE ARE THE DISK I/O  ԁ ret ;with value in HL SETDMA: ;set dma address given by registers b and c mov l,c ;low order address mov h,b ;high RVI A,010H ;RESET INT BIT OUT 01FH ; IN 01FH ;GET STATUS ANI 00001100B ;TXE AND DTR CPI 00001100B ;READY ?? JRNZ LISREGISTER mov a,c ; CMP M ;SAME TRACK AS LAST TIME ?? RZ ;YES, NO NEED TO SEEK MOV M,A ; OUT 007H ; MVI A,01AH r C lxi h,0000h ;error return code mov a,c ; ORA A ;MUST BE ONLY 0 RNZ ;INVALID FOR LOADER. STA DISKNO ;UPDATEJwrite to perform the actual i/o ; operation. return a 00h in register a if the operation completes ; properly, and 01h if anROUTINES. ; THESE ROUTINES WILL BE USED BY THE BDOS DURING ; THE LOAD OF THE FULL CBIOS. FOLLOWING THE SUCCESSFUL ; LOAD THEY^ order address shld dmaad ;save the address ret READ: ;perform read operation (usually this is similar to write ; so weȁT ;NO, WAIT HERE MOV A,C ;Get to accumulator OUT 01EH ;WRITE IT ONTO PRINTER ret ;RETURN TO CALLER LISTST: ;return ;SEEK TO CORRECT TRACK OUT 004H ;DO IT.... STWT: JR STWT ;WAIT FOR SEEK TO COMPLETE ret SETSEC: ;set sector given by  DISK NUMBER CALL POINT ; MOV A,M ;LOAD LAST TRACK NUMBER OUT 005H ;RESETUP 1791 LXI D,004H ;POINT TO DENSITY REGIST error occurs during the read or write PUSH PSW ;SAVE I/O COMMAND CODE IN 008H ;IS HEAD LOADED ?? ANI 00000010B ;CHECKC WILL NO LONGER BE USED. ; ;#--- HOME: ;move to the trac will allow space to set up read command, then use ; common code in write) MVI A,08CH ;READ COMMAND CODE MVI B,001H ;Dҁ list status (0 if not ready, 1 if ready) xra a ;0 is always ok to return ret PUNCH: ;punch character from register c rregister c mov a,c ;WRITE SECTOR OUT OUT 006H ; ret SECTRAN: ;translate the sector given by BC using the ;transla,Ӂ MVI D,0FBH ;ASSUME YES JNZ $+3+2 ;VERIFY ASSUMPTION MVI D,0FFH ;ITS NOT, LEAVE HEAD LOAD BIT IN COMMAND POP PSW ;RE@PORT SOFTWARE DMALIST:DB 0C3H,07DH ; DMAAD: DS 2 ;DIRECT MEMORY ADDRESS DW 128-1 ;LENGTH FOR I/O DB 014H,028H,085H,007H,ʁNO ;CURRENT DRIVE MVI H,000H ; LXI D,TRKM ; DAD D ; RET ;POINT TO CURRENT TRACK REGISTER MSPRT: MOV A,M ; f data area dirbf: ds 128 ;scratch directory area all00: ds 31 ;allocation vector 0 chk00: ds 16 ;check vector 0 enddat eq݁ ; LHLD LOWSTR ;LOW MEMORY INI/RETN ORA H ;MAKE INTO AN OTI IF NECESSARY MOV H,A ; SHLD 066H ;SAVE AT NMI LOCATION ց' DB 00DH,00AH,000H LDRSIZ EQU $-BIOS ;LOADER SIZE IN BYTES LDRPAG EQU (LDRSIZ+255)/256;LOADER SIZE IN PAGES PAGE ;--STORE COMMAND ANA D ;RESET HEAD LOAD BASED ON PREVIOUS TEST IF DMA ;GENERATE DMA SUPPORT PUSH PSW ;SAVE COMMAND PUSҁ08AH,0CFH,001H,0CFH DMALST3:DS 1 ;001=READ, 005=WRITE DB 0CFH,087H ; ENDIF ; IF NOT DMA ;NON DMA SUPPORT SOFTWARE  ohORA A ;END OF MESSAGE ?? RZ ;YES INX H ; MOV C,A ; CALL CONOUT ; JR MSPRT ; PAGE ; -- :MFu $ ;end of data area datsiz equ $-begdat;size of data area end  LHLD LOWSTR+2 ; SHLD 066H+2 ; POP PSW ;RESTORE PSW LHLD DMAAD ;POINT TO RECORD AREA MVI C,007H ;PORT ADDRESS FOR I jA#--: ; ; THE remainder of the CBIOS is reserved uninitialize H B ;SAVE REST MOV A,B ; STA DMALST3 ;SAVE READ/WRITE CODE BYTE LXI B,01100H ;17 BYTES OF DATA AND PORT ZERO LXI H,DMÁDMAAD: DS 2 ;DIRECT MEMORY ADDRESS LOWSTR: INI ; RETN ; ENDIF ; MSG: DB 00DH,00AH IF RELOC MSZ: DB '00' ENDI1--&- ; ; CONSTANTS AND WORK AREAS ; ;--@/O ENDIF ;END NON DMA SOFTWARE OUT 004H ;PERFORM COMMAND RDLP: JR RDLP ;WAIT HERE IN 004H ;READ STATUS POP B ,d ; data area, and does not need to be a part of the ; system memory image (the space must be available, ; however, between "BALIST ; OUTIR ;WRITE IT OUT POP B ; POP PSW ; ENDIF ; PUSH B ;SAVE STATUS MASK IF NOT DMA ;NON DMA SOFTWF IF NOT RELOC MSZ: DB MSIZE/10+'0',MSIZE MOD 10 + '0' ENDIF DB 'K ALTOS LOADER VERS ' DB VERSION/10+ '0','.',VERSION M[QUMBER TRUE EQU 0FFFFH ;VALUE FOR TRUE FALSE EQU NOT TRUE ;VALUE FOR FALSE ;---p HARD DISK VERSION 2.0 (8 MEG AT 512) ; 5 ALTOS HARD DISK VERSION 2.0 (8 MEG AT 1024) ; 6 ALTOS HARD DISK VERSION 2.0 (4 MEG]SS APPLY TO THE RELOCATABILITY ; OF THE CBIOS AND SHOULD NOT BE USER ALTERED. ; ;---+; . Add support for Hard disk drives ; . Add support for disk MODE selection ; . Provide compatability MODE for 1.4 operation C AND THE ALTOS HARD DISK. ; ;#--- BLKSIZ EQU 16384 ;CP/ SYSTEMS ; 2360 BERING DRIVE ; SAN JOSE, CALIFORNIA 95131 ; ; (408) 946-6700 ; ; ; Copyright 1980, ALTOS COMPUTER SYSTEMSo --h ; ; THE FOLLOWING EQUATES ARE USER MODIFIABLE BASED ON THE ; PARTICULAR USER SYSTEM AND OPTIONS SELE! AT 512) ; ;#--- ;--? --1 RELOC EQU FALSE ;RELOCATABLE VERSION ?? ;---IB ; . Remove CTC/1791 counter reset ; . Change for CP/M 2.21 ; ;--ځM ALLOCATION SIZE HSTSIZ EQU 1024 ;HOST DISK SECTOR SIZE HSTSPT EQU 16 ;HOST DISK SECTORS PER TRACK HSTBLK EQU HSTSIZ/128 ; ; ; This program is a copyright program product of ; ALTOS COMPUTER SYSTEMS and is distributed to the ; owners of ALTOS SU#C CTED. ; ;#--/- MSIZE EQU 32 ;MEMORY SIZE DMA EQU FALSE>u --n IF HARDSK MAXDSK EQU 12 ;MAXIMUM NUMBER OF LOGICAL DRIVES BIOSLEN EQU 1200H ENDIF IF NOT HARDSK MTDMA ;SET DMA ADDRESS  -JMP READ ;READ ONE SECTOR FROM DISK  *JMP WRITE ;WRITE ONE SECTOR TO DISK .TE: JMP WBOOT ;WARM BOOT ENTRY POINT  "JMP CONST ;CONSOLE STATUS  JMP CONIN ;CONSOLE CHARACH,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H DISKNO: DB 000H ;CURRENT DRIVE NUMBER TRAKNO: DB 000H ;CURRENTGRAM NSECTS EQU ($-CCP)/128 ;WARM START SECTOR COUNT IOBYTE EQU 003H ;LOCATION OF INTEL IOBYTE CDISK EQU 004H ;LOCATIONC ; PAGE ;#--+- ; ; WORK AND CONTROL AREAS FOR CBIOS SE`AXDSK EQU 4 ;MAXIMUM NUMBER OF LOGICAL DRIVES BIOSLEN EQU 0A00H ENDIF ; OFFST EQU 02000H ; IF RELOC BIAS EQU 0100H ;V JMP PRSTAT ;CHECK PRINTER STATUS FOR DESPOOL JMP SECTRAN ;ROUTINE TO TRANSLATE SECTOR NUMBER JMP SETMOD ;ROUTINE TO SE )}TER IN  )JMP CONOUT ;CONSOLE CHARACTER OUT  JMP LIST ;PRINTER OUT  JMP CONOUT ;PUNCH  TRACK NUMBER HEADNO: DB 000H ;CURRENT HEAD NUMBER DMAADR: DW 000H ;CURRENT DMA ADDRESS SECTNO: DB 000H ;CURRENT SEC OF CURRENT DRIVE NUMBER WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCAT C RVICES ; ;#--.- TRK0: DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F ALUE FOR RELOCATABLE ASSEMBLY ENDIF IF NOT RELOC BIAS EQU (MSIZE*1024)-OFFST ;VALUE FOR ABSOLUTE ASSEMBLY ENDIF ;-----I?T DISK MODE JMP RETMOD ;ROUTINE TO RETURN CURRENT MODE ; ---}DEVICE  !JMP CONIN ;READER DEVICE  0JMP HOMEIT ;MOVE HEAD TO HOME POSITION  JMP SELDSK TOR NUMBER DPEPTR: DW 000H ;CURRENT DPE ADDRESS DBLKAD: DW 000H ;CURRENT EXTENSION ADDRESS MPARMS: DW 000H ;MISC. PA CED PAGE ;#--,- ; ; JUMP VECTORS FOR ENTRIES TO CBIOS ROЁFH,0FFH,0FFH,0FFH,0FFH,0FFH SEL0: DB 004H,008H,010H,020H,010H,010H,010H,020H,020H,020H,010H,020H MODE: DB 000H,000H,000H,000H,E!--> CCP EQU 000H+BIAS ;BASE OF CCP BDOS EQU CCP+0806H ;BASE WE;------ ; ; POINTERS FOR KLH SPOOLER PROGRAM PRODUCT ; ;"---A} ;SELECT DISK  'JMP SETTRK ;SET TRACK # (0-76)  'JMP SETSEC ;SET SECT # (1-26)  JMP SERAMETERS HTK1: DB 10H ;HARD DISK # 1 TRACK HTK2: DB 20H ;HARD DISK # 2 TRACK ; ; PARAMETER FLAGS ; ; 0100H = DgA UTINES ; ;#---  !JMP BOOT ;COLD START WBOÁ003H,004H,005H,003H,004H,005H,006H,006H TCNT: DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H PCNT: DB 000H,000#OF BDOS (RESIDENT PORTION) BIOS EQU CCP+1600H ;BASE OF BIOS ; ddtoff equ 0ffffh-bios+0101h ; ORG BIOS ;ORIGIN OF THIS PROo-- SPOOLER: DB 0FFH ;TELLS SPOOLER LIST FOLLOWS DW LSTBSY ;PRINTER BUSY TESTS DW LSTBSY ; DW LSTBSY ; DW LSTBSYunOUBLE HEADED DRIVES ; 0200H = CENTRONICS PRINTER FOR LIST DEVICE ; 0400H = FOUR DRIVE SYSTEM [ A B C D ] ; --E DW DIRBUF,DPB0 ;DIR BUFF, PARM BLOCK DW CSV2,ALV2 ;CHECK VECTOR, ALLOC VECTOR DPE3: DW XLT0,0000H ;TRANSLATE TABLE AND W^DISKS EQU 12 ;NUMBER OF LOGICAL DISK DRIVES DPBASE EQU $ ;START OF DISK PARAMETER BLOCKS DPE0: DW XLT0,0000H ;TRANSLATE *K AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB5 ;DIR BUFF, PARM BLOCK DW CSV9,ALV9 ;CHECK VECTOR, ALLOC VECTOR DPEA: 0H ;ADDRESS FOR I/O DMALEN: DW 1025-1 ;LENGTH FOR I/O DMAS2H: DB 054H,0CEH,068H,0CEH,0A5H,020H ;HARD DISK SETUP DMA AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB5 ;DIR BUFF, PARM BLOCK DW CSV6,ALV6 ;CHECK VECTOR, ALLOC VECTOR E--- ; ;"---ORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB0 ;DIR BUFF, PARM BLOCK DW CSV3,ALV3 ;CHECK VECTOR, ALLOC VECTOR IF TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB0 ;DIR BUFF, PARM BLOCK DW CSV0,ALV0 ;CHECK VECTOR, ALLOC VE ʁ DW 0000H,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB6 ;DIR BUFF, PARM BLOCK DW CSVA,A S2F: DB 014H,028H,085H,007H ;FLOPPY DISK SETUP DMAS3: DB 08AH,0CFH,001H,0CFH ;LAST PART OF DMA SETUP DMAS3F: DB 001H ;0 h DPE7: DW 0000H,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB3 ;DIR BUFF, PARM BLOCK D -- ; ; NOTE: ; NO CHANGES ARE TO BE MADE TO THE ABSOLUTE LOCATIONS OF ; ANY FIELDS PRIOR TO THIS POINT. EXTERNAL PROGRAMS AR} HARDSK DPE4: DW 0000H,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB3 ;DIR BUFF, PARM BBCTOR DPE1: DW XLT0,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB0 ;DIR BUFF, PARM BLOCKLVA ;CHECK VECTOR, ALLOC VECTOR DPEB: DW 0000H,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA DW DIRBUrIB01=READ, 005=WRITE DB 0CFH,087H ;SETUP DMA, ENABLE PAGE ;--QW CSV7,ALV7 ;CHECK VECTOR, ALLOC VECTOR DPE8: DW 0000H,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA `E>E ; DEPENDENT UPON THE LOCATION OF THE PRECEEDING DATA. ; ;!--=LOCK DW CSV4,ALV4 ;CHECK VECTOR, ALLOC VECTOR DPE5: DW 0000H,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH DW CSV1,ALV1 ;CHECK VECTOR, ALLOC VECTOR DPE2: DW XLT0,0000H ;TRANSLATE TABLE AND WORK AREA DW 0000H,0000H ;SCRATCH AREA]VF,DPB6 ;DIR BUFF, PARM BLOCK DW CSVB,ALVB ;CHECK VECTOR, ALLOC VECTOR ENDIF ;--+?--,- ; ; CONTROL BLOCKS FOR DISK DRIVER ; ;#--- NDW DIRBUF,DPB4 ;DIR BUFF, PARM BLOCK DW CSV8,ALV8 ;CHECK VECTOR, ALLOC VECTOR DPE9: DW 0000H,0000H ;TRANSLATE TABLE AND WOR----- NMIRTN: DB 0EDH,0A2H,0EDH,045H ;FAKE INI AND RETN INST DMAS1: DB 0C3H,07DH ;FIRST PART OF DMA SETUP DMASA: DW 00 AREA DW DIRBUF,DPB4 ;DIR BUFF, PARM BLOCK DW CSV5,ALV5 ;CHECK VECTOR, ALLOC VECTOR DPE6: DW 0000H,0000H ;TRANSLATE TABLE yk--d- MODL0: DW XLT0,000H ;MODEL DPE FOR MODE 0 DW 000H,000H ; DW DIRBUF,DPB0 ; MODL1: DW 0000 V{^ CALL MSPRT ;DISPLAY IT TO CALLER DI ; MVI A,076H ;STOP SECOND ENTRY STA BOOT+10 ; TO BOOT ROUTINE LD kS A "0" DPB6: DISKDEF 6,0,127,,16384,288,256,0,513 DB 0 ;SHOW SECTRAN ROUTINE THAT 1ST SECTOR IS A "0" ENDIF PAGE ;B ; OUT 020H ;DRIVE 2 MVI A,00010000B ;SELECT DRIVE 1/ HEAD 0 OUT 020H ; MVI C,20 ;WAIT FOR 20 MILLISECONDS CALL DE 94,243,64,64,2,0 DISKDEF 1,1,52,,2048,243,128,128,2 DB 1 ;SHOW SECTRAN ROUTINE THAT 1ST SECTOR IS A "1" DISKDEF 2,1,48  LXI B,003H ;SET THE MODE FOR DRIVES INITIALIZED BY "SETUP" MODESET: CALL SELDSK ;SELECT DRIVE FOR MODESET LXI H,MODE &H,0000H ;MODEL DPE FOR MODE 1 DW 0000H,0000H ; DW DIRBUF,DPB1 ; MODL2: DW 0000H,0000H ;MODEL DPE FOR MODE 2 DW 0000H,00 A MPARMS ;CHECK PARAMETERS FOR ANI 2 ; CENTRONICS PRINTER SUPPORT JRZ PRTOK ; NO - JMP TABLE CORRECT LXI H,CLIST ; IF HARDSK SETHED: LHLD HSTTRK ;CP/M TRACK NUMBER (0-8%xACK REGISTER ; PUSH PSW ;***DEBUG*** MVI A,010H ;SEEK COMMAND OUT 023H ;DO IT.... HRW4: JR HRW4 ;WAIT FOR I/O MVI %$LOW: INX H ;BUMP UP TO DRIVE TWO OE TRHEE INX H ; DBL$SAVE: MOV M,A ;UPDATE OTHER SIDE REGISTER RET ; IF HA% HEAD.... ; PUSH PSW ;***DEBUG*** ; LXI H,MDV ;***DEBUG*** ; CALL MSPRT ;***DEBUG*** ; POP PSW ;***DEBUG*** ; CALL HEXC%CATE ROUTINE ; ;#--)- DBL$UPDATE: LDA MPARMS ;CHECK F&&<00) ANI 80H ; CHECK FOR LARGE DRIVE MOV A,L ;LOW ORDER JRZ SETH14 ; SMALL DRIVE ANI 00000111B ;GET TRACK MOD 8 (HEAD&'D LDA STEPRATE ;GET FLOPPY STEP RATE ORI 010H ;SEEK AND UNLOAD HEAD OUT 004H ;DO IT.... SLS2: JR SLS2 ;WAIT HERE FOR& ; ; THIS IS THE ROUTINE THAT DOES THE FLOPPY DISK I/O ; ;--( CONOUT: MVI A,10H ;RESET INT BIT OUT 1DH ;SEND*N XCHG ;HL = .UNATRK OR .HSTTRK LXI H,NEWTRK ; LDAX D ;LOW BYTE COMPARE CMP M ;SAME ?? RNZ ;RETURN IF NOT INX D *fa--Z- HOMEIT: LDA NEWDSK ; CHECK FOR FIRST HOME CPI 4 ; CHECK FOR FLOPPY JC HOME ; *ER LXI H,HEDERR ; CALL MSPRT ; LDA HEADNO ;PICKUP HEAD NUMBER CALL HEXCONV ; P$SEC: LXI H,SECERR ;SECTOR ERROR MESSA*= 1  RZ  MVI A,0FFH  RET ;#---*#3--( ; ; DISK ERROR MESSAGE ROUTINE. ; ;--*j IT TO 'SIO' IN 1DH ;READ STATUS ANI 00001100B ;CHECK FOR DTR AND TXE CPI 00001100B ;WE MUST HAVE BOTH TO PROCEED JR*i_;TO CHECK HIGH BYTE INX H ; LDAX D ; CMP M ;SETS FLAGS RET ; ENDIF PAGE ;---*K DO NOT BYPASS FLOPPY HOME MOV C,A ; MVI B,0 ; POINT TO PRESENT TRACK STORED LXI H,TRK0 ; DAD B ; MOV A,M ; CHECK+ +C! ; ; CONSOLE READ ROUTINE ; ;#--- CONIN: CALL CONST +JG: DB 00DH,00AH ;CR,LF IF RELOC DB '00' ;FILLED IN BY CPMOVE ENDIF IF NOT RELOC DB MSIZE/10+'0',MSIZE MOD 10 +'0' E+g[--T DELAY: DEL1: MVI B,100 ;FORCE DELAY FOR 1 MILLISECOND DEL2: RLC ;INSTRUCTIO+.CECUTED ONLY ONCE ] ; ;#--"- ; SDCONF: LXI H,SEL0+2 ;POINT + }!EXOT ;PRINT IT OUT IN HEX  POP PSW 3 ;GET ORIGINAL LOWER NIBBLE HEXOT: ANI 0FH ;PRINT O+ IF HARDSK ; PIN CONFIGURATION DSCN0: DB 00H,00H,00H,00H,00H,00H,00H,00H DB 10H,00H,00H,00H,00H,00H,10H,00H +}K ;IS THERE"A CHARACTER WAITING ?? JRZ CONIN ;NO, WAIT HERE FOR ONE....  IN 1CH  ANI 7FH  RET+NDIF DB 'K ALTOS DOS VERS ' DB VERSION/10+'0','.',VERSION MOD 10 +'0' DB ALTOSV+'0' ;ALTOS VERSION NUMBER CRLF: DB 00DH,0+ āNS TO FILL IN TIME DAD H ; DAD H ; DCR B ;AT ONE MILLISECOND YET ?? JNZ DEL2 ;NO, KEEP ON LOOPING DCR C ;END OF R+ TO DRIVE C: LDA MPARMS ; ANI 05H ; TEST FOR FOUR FLOPPIES JMP SDDBL ; YES SKIP THE ZAP MOV M,A ; INX H ; ZAP C:+ }UT NIBBLE IN HEX  ADI '0'  )CPI '9'+1 JRC HX1 ;LESS THAN 'A'  ADI 7 HX1: MOV C,A + ́; 1 DB 90H,90H,90H,00H,00H,00H,00H,00H ; 2 DB 00H,00H,00H,00H,00H,00H,00H,00H DB 10H,00H,00H,20H,00H,00H,10H,20H ; 4 + C PAGE ;#--.- ; ; ROUTINE TO CONVERT ACCUMULATOR TO HEX +0AH ; DB 0 ; PERR: DB 00DH,00AH,'PERMANENT DISK ERROR, DRIVE ',0 TRKERR: DB ' TRACK ',0 HEDERR: DB ' HEAD ',0 +NaWEQUESTED INTERVAL YET ?? JNZ DEL1 ;NO, KEEP ON RET ;RETURN TO CALLER PAGE ;---+& AND D: MOV M,A ; SDDBL: IF HARDSK LXI D,SEL0+4 ;POINT TO DRIVE E: IN 025H ;READ CONFIGURATION PORT ANI 07H ;STRI+C* CALL CONOUT ;DISPLAY BYTE RET ; ;#--- ; ; THIS IS +3 DB 00H,00H,00H,00H,00H,00H,00H,00H DB 90H,90H,90H,20H,00H,00H,00H,20H ; 6 DB 90H,90H,90H,0A0H,0A0H,0A0H,0H,0H ; 7 END+(AAND DISPLAY IT ; ;#--- HEXCONV:  PUSH PSW + SECERR: DB ' SECTOR ',0 STERR: DB ' STATUS ',0 DSERR: DB 0DH,0AH,'INVALID DISK SELECT',0DH,0AH,0 DCERR: DB 0DH,0AH,'DISK D+)-- ; ; MESSAGES ; ;#--- MS+)P OFF HIGH PART RAL ; RAL ; RAL ; MVI B,0 ; MOV C,A ;POINT TO CONFIGURATION TABLE LXI H,DSCN0 ; DAD B ; +oeTHE DELAY ROUTINE. IT WILL LOOP HERE FOR THE ; NUMBER OF MILLISECONDS SPECIFIED IN REGISTER C. ; ; ---+nCIF ;#--5- ; ; SET UP DISK CONFIGURATON ; ; [ THIS CODE EX+o ;SAVE IT  RRC  RRC  ;SHIFT DOWN TO LOWER NIBBLE  RRC  RRC  CALL H+lmLENSITY CHANGED',0DH,0AH,0 BIOSLN EQU $-BIOS ;LENGTH OF THIS BIOS DB 0,0 ; SAVE AREA RESERVED ,, INDEX TO RIGHT ENTRY MVI B,8 ; SDL1: MOV A,M ; CHECK ALL 8 POSSIBILITIES STAX D ; - CHANGE SELECT MASKS SDOK: IN,pCATED RECORD COUNT UNADSK: DS 1 ;LAST UNALLOCATED DISK UNATRK: DS 2 ;LAST UNALLOCATED TRACK UNASEC: DS 1 ;LAST UNALLOCA,Y000H ;COUNTER FOR TEMPORARY ERRORS STEPRATE: DS 1 ;STEP RATE FOR FLOPPY HOMES AND SEEKS ; ;... 3 MSEC FOR DOUBLE SI,q **j ; ; utility macro to compute sector mask smask macro hblk ;; compute log2(hblk), return @x as result , u --n- ; ; THE FOLLOWING AREA CONTAINS THE DISK/WORK SAVE AREAS ; USED BY THE CBIOS IN THE NORMAL COURSE OF ACTI,aWE HSTBUF HSTBUF: DS 1024 ;HOST BUFFER AREA ENDIF DATSIZE EQU $-BEGDAT END ,сX D ; NEXT INX H ; DRIVE DJNZ SDL1 ; ELSE LXI H,SEL0+4 ;POINT TO DRIVE E: MVI B,8 ; XRA A ; SDL2: MOV M,A ; ,TED SECTOR ERFLAG: DS 1 ;ERROR REPORTING RSFLAG: DS 1 ;READ SECTOR FLAG READOP: DS 1 ;1 IF READ OPERATION WRTYPE: DS, gDED ; ;... 10 MSEC FOR SINGLE SIDED NEWDSK: DS 1 ;SEEK DISK NUMBER NEWTRK: DS 2 ;SEEK TRACK NUMBER NEWSEC: DS 1 , % ;; (2 ** @x = hblk on return) @y set hblk @x set 0 ;; count right shifts of @y until = 1 rept 8 if @y = 1 exitm endi, C VITY. ; ;#--/- BEGDAT EQU $ ;START OF BDOS AREAS CMD: , @, ZAP ALL HARD DRIVES INX H ; DJNZ SDL2 ; ENDIF ; LXI H,STEPRATE ; MVI M,002H ;SET 10 MSEC STEP RATE FOR SINGLE S,W 1 ;WRITE OPERATION TYPE DIRBUF: DS 128 ALV0: DS 31 CSV0: DS 32 ALV1: DS 31 CSV1: DS 32 ALV2: DS 31 CSV2: DS 32 ALV3,l;SEEK SECTOR NUMBER HSTDSK: DS 1 ;HOST DISK NUMBER HSTTRK: DS 2 ;HOST TRACK NUMBER HSTSEC: DS 1 ;HOST SECTOR NUMBER ,i_f ;; @y is not 1, shift right one position @y set @y shr 1 @x set @x + 1 endm endm ; ;***,DB 0 ;COMMANDS FOR NEXT I/O MASK: DB 0 ;STATUS MASKS BUFFER FOR DISK I/O STATUS: DB 0 ;STATUS SAVE LOCATION FOR DISK I/O,");*** ;*  * ;* Sector D,GIDED FLOPPY LDA MPARMS ANI 00000001B ;CHECK FOR DOUBLE SIDED FLOPPY RZ ;EXIT IF SINGLE SIDED MVI M,000H ;SET 3 MSEC S,5: DS 31 CSV3: DS 32 IF HARDSK ALV4: DS 64 CSV4: DS 0 ALV5: DS 64 CSV5: DS 0 ALV6: DS 64 CSV6: DS 0 ALV7: DS 64 CSV7: , NEWHST: DS 1 ;SEEK SHR SECSHF HSTACT: DS 1 ;HOST ACTIVE FLAG HSTWRT: DS 1 ;HOST WRITTEN FLAG UNACNT: DS 1 ;UNALLO,= ** ;*  * ;*  CP/M to host disk constants , SAVE1: DB 000H,000H,000H,000H ;SAVE AREA FOR NMI ROUTINE P$RETRIES: DB 000H ;COUNTER FOR PERMANENT ERRORS T$RETRIES: DB ,e?*eblocking Algorithms for CP/M 2.0 * ;*  * ;***,SLTEP RATE FOR DOUBLE SIDED FLOPPY RET ORG BIOS+BIOSLN PAGE ;--,́DS 0 ALV8: DS 64 CSV8: DS 0 ALV9: DS 64 CSV9: DS 0 ALVA: DS 36 CSVA: DS 0 ALVB: DS 36 CSVB: DS 0 DS 1 ;MUST PRECED-;-b) * ;*  * ;** * blksiz equ-B number to HL mvi h,0 rept 4 ;multiply by 16 dad h endm lxi d,dpbase ;base of parm block dad d ;hl=.dpb(curdsk) -; ; DISKDEF macro, or hand coded tables go here dpbase equ $ ;disk param block base ; boot: wboot: ;enter here on system-cYtry point takes the place of * ;* the previous BIOS defintion for WRITE. * ;*  -K  * ;**9* wrall equ 0 ;write to allocated wrdir equ 1 ;write -O/ * ;* the previous BIOS defintion for READ. * ;*  * ;***- 2048 ;CP/M allocation size hstsiz equ 512 ;host disk sector size hstspt equ 20 ;host disk sectors/trk hstblk equ hstsiz/1-ret ; settrk: ;set track given by registers BC mov h,b mov l,c shld sektrk ;track to seek ret ; setsec: ;set se- S boot to initialize xra a ;0 to accumulator sta hstact ;host buffer inactive sta unacnt ;clear unalloc count ret ; - M * ;**<* write: ;write the selected CP/M sector xra a ;0 to a- tK6to directory wrual equ 2 ;write to unallocated ; ;*** ;*  - _**X read: ;read the selected CP/M sector xra a sta unacnt mvi a,1 sta readop ;r- 28 ;CP/M sects/host buff cpmspt equ hstblk * hstspt ;CP/M sectors/track secmsk equ hstblk-1 ;sector mask smask hstblk ;comp-Sctor given by register c mov a,c sta seksec ;sector to seek ret ; setdma: ;set dma address given by BC mov h,b m-home: ;home the selected disk home: lda hstwrt ;check for pending write ora a jnz homed sta hstact ;clear host active-/ccumulator sta readop ;not a read operation mov a,c ;write type in c sta wrtype cpi wrual ;write unallocated? jnz c-e ^* ;* The BDOS entry points given below show the * ;* code which is relevant to debloc-ead operation sta rsflag ;must read data mvi a,wrual sta wrtype ;treat as unalloc jmp rwoper ;to perform the read ; -0E3ute sector mask secshf equ @x ;log2(hstblk) ; ;*** ;* -Eoeov l,c shld dmaadr ret ; sectran: ;translate sector number BC mov h,b mov l,c ret ; ; ***-d flag homed: ret ; seldsk: ;select disk mov a,c ;selected disk number sta sekdsk ;seek disk number mov l,a ;disk-thkuna ;check for unalloc ; ; write to unallocated, set parameters mvi a,blksiz/128 ;next unalloc recs sta unacnt lda se-)king only. * ;*  * ;*** -) ;*** ;*  * ;* The WRITE en-C  * ;* BDOS constants on entry to write  * ;* -A ** ;* 0 * ;* The READ entry point takes the place of ..skdsk ;disk to seek sta unadsk ;unadsk = sekdsk lhld sektrk shld unatrk ;unatrk = sectrk lda seksec sta unasec ;una. a a ;carry = 0 rar ;shift right endm sta sekhst ;host sector to seek ; ; active host sector? lxi h,hstact ;host ac.YRcum sta unacnt ;unacnt = 0 inr a ;1 to accum sta rsflag ;rsflag = 1 ; ;**.d relative host buffer address lxi d,hstbuf dad d ;hl = host address xchg ;now in DE lhld dmaadr ;get/put CP/M data .loc ;skip if not ; ; match, move to next sector for future ref inr m ;unasec = unasec+1 mov a,m ;end of track? cpi cp.ځrt ;host written? ora a cnz writehst ;clear host buff ; filhst: ;may have to fill the host buffer lda sekdsk sta hs.sec = seksec ; chkuna: ;check for write to unallocated sector lda unacnt ;any unalloc remain? ora a jz alloc ;skip i.tive flag mov a,m mvi m,1 ;always becomes 1 ora a ;was it already? jz filhst ;fill host if not ; ; host buffer acti. Q ******* ;* 9 * ;* Common code for READ and WRITE follows * ;* . ˁ mvi c,128 ;length of move lda readop ;which way? ora a jnz rwmove ;skip if read ; ; write operation, mark and switch. mspt ;count CP/M sectors jc noovf ;skip if no overflow ; ; overflow to next track mvi m,0 ;unasec = 0 lhld unatrk i. Wtdsk lhld sektrk shld hsttrk lda sekhst sta hstsec lda rsflag ;need to read? ora a cnz readhst ;yes, if 1 xra . f not ; ; more unallocated records remain dcr a ;unacnt = unacnt-1 sta unacnt lda sekdsk ;same disk? lxi h,unadsk .ve, same as seek buffer? lda sekdsk lxi h,hstdsk ;same disk? cmp m ;sekdsk = hstdsk? jnz nomatch ; ; same disk, same .1  * ;*** rwoper: ;enter here to per. direction mvi a,1 sta hstwrt ;hstwrt = 1 xchg ;source/dest swap ; rwmove: ;C initially 128, DE is source, HL is de.nx h shld unatrk ;unatrk = unatrk+1 ; noovf: ;match found, mark as unnecessary read xra a ;0 to accumulator sta rsfl.߁a ;0 to accum sta hstwrt ;no pending write ; match: ;copy data to or from buffer lda seksec ;mask buffer number ani.cmp m ;sekdsk = unadsk? jnz alloc ;skip if not ; ; disks are the same lxi h,unatrk call sektrkcmp ;sektrk = unatrk? .)track? lxi h,hsttrk call sektrkcmp ;sektrk = hsttrk? jnz nomatch ; ; same disk, same track, same buffer? lda sekhst .Bform the read/write xra a ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector rept secshf or.āst ldax d ;source character inx d mov m,a ;to dest inx h dcr c ;loop 128 times jnz rwmove ; ; data has been mov.ag ;rsflag = 0 jmp rwoper ;to perform the write ; alloc: ;not an unallocated record, requires pre-read xra a ;0 to ac. secmsk ;least signif bits mov l,a ;ready to shift mvi h,0 ;double count rept 7 ;shift left 7 dad h endm ; hl has.jnz alloc ;skip if not ; ; tracks are the same lda seksec ;same sector? lxi h,unasec cmp m ;seksec = unasec? jnz al.lxi h,hstsec ;sekhst = hstsec? cmp m jz match ;skip if match ; nomatch: ;proper disk, but not correct sector lda hstw/)/Ned to/from host buffer lda wrtype ;write type cpi wrdir ;to directory? lda erflag ;in case of errors rnz ;no furthe/Q)areas * ;*  * ;*** ;/w**p* writehst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. write "hstsiz" bytes ;fr/; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; /sektrk xchg lxi h,sektrk ldax d ;low byte compare cmp m ;same? rnz ;return if not ; low bytes equal, test high 1s/Ӂ flag readop: ds 1 ;1 if read operation wrtype: ds 1 ;write operation type dmaadr: ds 2 ;last dma address hstbuf: ds hsts/jr processing ; ; clear host buffer for directory write ora a ;errors? rnz ;skip if so xra a ;0 to accum sta hstwrt/Q sekdsk: ds 1 ;seek disk number sektrk: ds 2 ;seek track number seksec: ds 1 ;seek sector number ; hstdsk: ds 1 ;host d/ om hstbuf and return error flag in erflag. ;return erflag non-zero if error ret ; readhst: ;hstdsk = host disk #, hsttrk/ ; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; disk/ K9 inx d inx h ldax d cmp m ;sets flags ret ; ;*** ;* / '+iz ;host buffer ; ;*** ;*  / SO: ;buffer written call writehst lda erflag ret ; ;*** ;*  /isk number hsttrk: ds 2 ;host track number hstsec: ds 1 ;host sector number ; sekhst: ds 1 ;seek shr secshf hstact: ds 1/D = host track #, ;hstsec = host sect #. read "hstsiz" bytes ;into hstbuf and return error flag in erflag. ret ; ;*******/def parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logi/c \ * ;* WRITEHST performs the physical write to * ;* the host disk, READHST reads the p/I7 * ;* The ENDEF macro invocation goes here * ;*  * ; **/)A +* ;* Utility subroutine for 16-bit compare * ;* / ;host active flag hstwrt: ds 1 ;host written flag ; unacnt: ds 1 ;unalloc rec cnt unadsk: ds 1 ;last unalloc disk unat/W-** ;*  * ;* Unitialized RAM data /cal disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,/7%hysical * ;* disk. * ;*  * ;**/O** * end */~I  * ;**7* sektrkcmp: ;HL = .unatrk or .hsttrk, compare with /rk: ds 2 ;last unalloc track unasec: ds 1 ;last unalloc sector ; erflag: ds 1 ;error reporting rsflag: ds 1 ;read sector00Mn-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 00$ocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro d0ngiven by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a large0ȁion vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate t0nes disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is de0:gcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set stateme0P,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 "sk0n dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw 0 disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,000 he block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fi0 fined 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 0 nts for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eq0 ew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (w0macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;; 0b00h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc vec0~lls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not fou0] ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the bio0u als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table 0ord) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of 0`produces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variabl0tors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter bl0nd yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkva0s, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is 0 else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocat0tracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defi0e for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif 1P1Wl set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; 1ptsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif1e, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; genera1@1 ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks el1_Unddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; 1.otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks)1 nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul1 te the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn 1 @1 Qse dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb 1 @1 > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; 1 fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds l1= gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous element1@1%blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk sh1@1now generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries pe1b&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access bu1s nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nx1@1r 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate tabl1@1r block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again 1ffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm e22iEXAF MACRO DB 008H ;---- FAKE EX AF,AF' INSTRUCTION ---- ENDM STAI MACRO DB 0EDH,047H ;---- FAKE STAI INSTRUCTION ---- 2@2@2@2߁010H,?N-$-1 ;---- FAKE DJNZ INSTRUCTION ---- ENDM RETI MACRO DB 0EDH,04DH ;---- FAKE RETI INSTRUCTION ---- ENDM RETN MAC2!9"61482:] *:\ʨ@AڠD(Ҡ2D*3DGJMPSVY\_behknqt DRIVE 2 ENDM LDDR MACRO DB 0EDH,0B8H ;---- FAKE LDDR INSTRUCTION ---- ENDM LDIR MACRO DB 0EDH,0B0H ;---- FAKE LDIR INSTRUCTION 2@2 @2 @2 RO DB 0EDH,045H ;---- FAKE RETN INSTRUCTION ---- ENDM INI MACRO DB 0EDH,0A2H ;---- FAKE INI INSTRUCTION ---- ENDM OUTI2 : SET TO MODE $ DRIVE OR MODE INVALID, REQUEST IGNORED $ TO USE MODE 2.22 ENTER "MODE d n" WHERE "d" IS DRIVE LETTER "n"2 ---- ENDM JR MACRO ?N DB 018H,?N-$-1 ;---- FAKE JR INSTRUCTION ---- ENDM JRZ MACRO ?N DB 028H,?N-$-1 ;---- FAKE JRZ IN2@2@25!9"Q 1O 2͹ V  y :{0K8K2Â^ ( ALTOS COMPUTER SYSTEMS BOOT SETUP PRO2~R MACRO DB 0EDH,0B3H ;---- FAKE OTIR INSTRUCTION ---- ENDM SAVE MACRO PUSH H ; SAVE ALL REGISTERS PUSH D ; PUSH B 2< IS MODE NUMBER MODE NUMBERS CAN BE 0 (SINGLE DENSITY) 2 (DOUBLE DENSITY) $ DRIVE : IN USE MODE REQUEST IGNORED$ M2STRUCTION ---- ENDM JRNZ MACRO ?N DB 020H,?N-$-1 ;---- FAKE JRNZ INSTRUCTION ---- ENDM JRC MACRO ?N DB 038H,?N-$-1 ;--2~!9"61482:] *:\ʨ@AڠD(Ҡ22]=G:m0ڠ1ʠ2(ҠO02H! ^#V"%²H\2@2TGRAM, VERSION 2.22 $ SELECT CONSOLE BAUD RATE FROM FOLLOWING LIST 0 DON'T CHANGE CONSOLE BAUD RATE 1 110 BAUD 2 2uyr; PUSH PSW ; ENDM RESTORE MACRO POP PSW ; RESTORE ALL REGISTERS POP B ; POP D ; POP H ; ENDM 2[E;ODE COMMAND LOGIC ERROR PLEASE RE-ISSUE COMMAND$I"2ʁ-- FAKE JRC INSTRUCTION ---- ENDM JRNC MACRO ?N DB 030H,?N-$-1 ;---- FAKE JRNC INSTRUCTION ---- ENDM DJNZ MACRO ?N DB 2Vt*%¼!N\w $  U } D*6d ! ^#V#*0}o|g*  ":D x=3B3 300 BAUD 3 600 BAUD 4 1200 BAUD 5 2400 BAUD 6 4800 BAUD 7 9600 BAUD $ INVALID ENTRY, RETRY....$ 3  CP/M LOADER ON ?: IS UNRECOGNIZABLE, REPLACE.... $S  ~  !N *Q   ¬:O!3A( Bw 22    ʾ  :!:C  DISK IN ?: IS UNRECOGNIZABLE, RESTA3@3D 7 9600 BAUD $   :!06262>2R Ýr  :12:23@3%  :0ڧ8ҧ2 ^   :080 2Ý^ ò:2>220 SELE3؁~…w#~…w#~…w#~ …w!:w#w#w#w!6SE6m!6P6! CP/M BOOT SECTOR SUCCESSFULLY UPDATED $ 3 |RT OPERATION...$ PLACE DISK WITH BOOT TO BE UPDATED IN EITHER DRIVE A: OR DRIVE B: REMOVE SYSTEM DISK IF NECESSARY. REPLY W3 @3   SELECT DEFAULT MODE FOR FLOPPY DISKS, 0 (SINGLE), 2 (DOUBLE) $ INVALID MODE SELECTED, RETRY $ SELECT SING3 @3 ځCT PRINTER BAUD RATE FROM FOLLOWING LIST 0 CENTRONIX PRINTER (PARALLEL PORT) 1 110 BAUD 2 300 BAUD 3 600 B3ׁREPLACE SYSTEM DISK IN DRIVE A: HIT WHEN READY$ ü ÿ  *6~#3ITH DRIVE LETTER ("A" OR "B") WHEN READY TO PROCEED. $ I/O ERROR, RESTART OPERATION.... $:0( !   ¬:O!3@3[LE OR DOUBLE HEADED DISKS, 1 (SINGLE), 2 (DOUBLE) $ INVALID SELECTION, RETRY $  *+V+^##~ x a 3@3(AUD 4 1200 BAUD 5 2400 BAUD 6 4800 BAUD 7 9600 BAUD $ SELECT AUXILLIARY PORT BAUD RATE FROM FOLLOWING LIST3+$ ! _~#~4 G4GG .3h~…w#~…w#~…w#~ …w!:w#w#w#w!6SE6m!6P6!: !: ¬ ¬*" 3@3+:cN(_Y :2Q DO YOU WANT TO BE ABLE TO WARM BOOT FROM DRIVE E:? REPLY "Y" OR "N" $   :3@3 0 AUXILIARY PORT NOT USED 1 110 BAUD 2 300 BAUD 3 600 BAUD 4 1200 BAUD 5 2400 BAUD 6 4800 BAU3@44@4@4@4@4@4@4@4@4 @4 @4 @4 @4 @4@4@4@4@4@4@4@4@4@4@4@4@4@5t5@5@5@5@5@5@5@5@5 @5 @5 @5 @5 @5@5@5@5@5@5@5@5@5@5@5@5@5@66@6@6@6@6@6@6@6@6 @6 @6 @6 @6 @6@6@6@6@6@6@6@6@6@6@6@6@6@7f7@7@7@7@7@7@7@7@7 @7 @7 @7 @7 @7@7@7@7@7@7@7@7@7@7@7@7@7@88@8@8@8@8@8@8@8@8 @8 @8 @8 @8 @8@8@8@8@8@8@8@8@8@8@8@8@8@99@9@9@9@9@9@9@9@9 @9 @9 @9 @9 @9@9@9@9@9@9@9@9@9@9@9@9@9@::@:@:@:@:@:@:@:@: @: @: @: @: @:@:@:@:@:@:@:@:@:@:@:@:@:@; ;@;@;@;@;@;@;@;@; @; @; @; @; @;@;@;@;@;@;@;@;@;@;@;@;@;@<<@<@<@<@<@<@<@<@< @< @< @< @< @<@<@<@<@<@<@<@<@<@<@<@<@<@=<=@=@=@=@=@=@=@=@= @= @= @= @= @=@=@=@=@=@=@=@=@=@=@=@=@=@>>@>@>@>@>@>@>@>@> @> @> @> @> @>@>@>@>@>@>@>@>@>@>@>@>@>@?.?@?@?@?@?@?@?@?@? @? @? @? @? @?@?@?@?@?@?@?@?@?@?@?@?@?@@@@@@@@@@@@@@@@@@@ @@ @@ @@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@AkA@A@A@A@A@A@A@A@A @A @A @A @A @A@A@A@A@A@A@A@A@A@A@A@A@A@BB@B@B@B@B@B@B@B@B @B @B @B @B @B@B@B@B@B@B@B@B@B@B@B@B@B@CyC@C@C@C@C@C@C@C@C @C @C @C @C @C@C@C@C@C@C@C@C@C@C@C@C@C@DD@D@D@D@D@D@D@D@D @D @D @D @D @D@D@D@D@D@D@D@D@D@D@D@D@D@EOE@E@E@E@E@E@E@E@E @E @E @E @E @E@E@E@E@E@E@E@E@E@E@E@E@E@FF@F@F@F@F@F@F@F@F @F @F @F @F @F@F@F@F@F@F@F@F@F@F@F@F@F@G]G@G@G@G@G@G@G@G@G @G @G @G @G @G@G@G@G@G@G@G@G@G@G@G@G@G@HH@H@H@H@H@H@H@H@H @H @H @H @H @H@H@H@H@H@H@H@H@H@H@H@H@H@I#I@I@I@I@I@I@I@I@I @I @I @I @I @I@I@I@I@I@I@I@I@I@I@I@I@I@JJ@J@J@J@J@J@J@J@J @J @J @J @J @J@J@J@J@J@J@J@J@J@J@J@J@J@K1K@K@K@K@K@K@K@K@K @K @K @K @K @K@K@K@K@K@K@K@K@K@K@K@K@K@LL@L@L@L@L@L@L@L@L @L @L @L @L @L@L@L@L@L@L@L@L@L@L@L@L@L@L