TD*TzcZ\ CP/M 2.2 for Bill Bailey's much modified Altair 8800SSDD 512 byte sector, 1-?, 1:?G>@:JG!(!Nx@(+G:Qo~2D!x4> 0400 {23x4>0#3w40+0 |{ :DO:JG4>] C\XRLOCBIOS ©RIGHT (C) 1979, DIGITAL RESEARCH !x_͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2Ձ Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!i#͘*~ "ַ"͌#>?͌͘ =_.:;<> 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ͽ:Է i1͘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 s ͢ØÆ^ 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!}|qK=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO3ADCOMf^: !۶  $$$ SUB$ ܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,F&-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#M 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͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:E߷ẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E߷͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*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>"k!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C63:ʑw:2E**E}DQ>2'@ æÐ>'Òâ7Q E!ͣͯ1 go"@!"B !Ww#VO_:X2J!"Lz̓;3"LT!B~ڰw+4#ʰ:J@°:Q= ʰ4:Qz>22!"!"!"L!"":Oy2K>!Gy2!o)))){y2y*I2J*@:Cgy2@>2CqdO+F!SxP!_@P!x2@] ]|2C}2@"Iw#w w#wy!y9y2Ly29­y2My=2y>ҽ>29`i:#Vy2 B_V# #떁o<2!g7) 2%2$| CHECK SUM ERROR OCCURED ON LS-100 BOARD AT TRACK H SECTOR H 9?~_#&{:L:M*N!L~5>~:Kɯ2$y2%g[*"*"}L<2!ʀ5[t2<2#2"!6ʤ[@t: [z2Q*"@*"B:2J:#ă!"w2*P%7*!> =*:$<2w# :%=:"2̈́!"w:L: <>!^#VO&7&:!oE!4!"Á!=R^#V:#V:h<2!#dy>2K ̝ Ê_:K{2H03w#3w#3w#3w#¬ 2H0~3#~3#~3#~3#+~2H0402G:@A2!ͣk:B21O:A=3:Jͯ4 >LƈO1W#~G>ZGy*LX*I|ͯ!0+|z!N>ͧʘ>@ضwk21f~2I2J#:Qw7¶ w4> >~04w@>+w#13~濱4:C:@!U&^&~&PKNQTHKNQ j?? ?0?4?< @+ KNQTH KN*Q9` h x? ? 00 w$?(? ?:?H?P?  :Qy:: :: :z}!~O#!ͼj>> gPRINTER ERROR :0 ͼ.ͿN#yҰͬ!ͯɯ2!!ͼI/O ASGT ERRORST ERDRIVE NOT READCANNOT BOO Ýæü1T4A!6ͼ!"ú62k CP/M Vers 2.2TæüÝ!6# x\>2>2!͢>p>>U>>>)>/>͝ʦG:JxMͷ͢*} !F6xy D!~#~# ~##^#V!""y2y gy owqy8p:G1͹.ͪ&͂!(.M͹g}jL*ͪ alg|~MͲg}Ó|%&$> &}-.O,>P.!.ͣ&͒!( :2:2 O9O9 TO9O9ww|H}Y^!^r Hrq#|{}rr:< Œ2:›> =2"}:< ڴ *>L !|%'(.T]>$'(M .OT]}-_ 1T]>N,_ 1w w P~# ==P~# OOwww ~:<  [ O}! O~#fo P@0€ p`İPŠ@Ɛ0ǀ p`ɰ Q c  fO)(="QWERT(YI^_qifjklmt1y@U[]_e^m]u\}{ڃ@҉[ґ  0123'4C5[6s7ʋ8ʣ9ʻæ!~ʦO#!ͼY:J/2Jæ æ!N#xæ@!3CcNl@x1æ æ æ æ æ æ æ*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_)*)þ))>+><77"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!0ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"$$$I$$H!!! BH" !I B  $$]uk!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ /x: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>p! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'^}CCSINIT COM CCSYSGENCOM SD COM PIP COM:DDT COM&LS100 ASMA DRV1 PRN` 0LS100 DOCSDRV1 HEX DRV2 PRNY DRV2 HEX !INSTALL PRNq"#$%FMAT COM&INSTALL HEX'DIAG COM (LS100 PRNm)*+,1m> >0G@G42H12I! {!Dͥ_2A**2@!ͥ0BB2!mͥ_DhU<2A!{k2Bx!ͥ0}}2C!Xͥ_2GYµ!.{ڠ2Kx:G Y!Q 0N>M2K:A=x@2gGhy2=^#V#">^#V:C<#=~<w:Kw:B<,=,3:=12%>2L#m>20#:%:L:0:C:CO:?G~ x™:G:Lʺ>>4:B<*:=X:%<,2C2B<2A:Gõ!{U0402;!VqINSTALL COM"-.LS63 COM"/0LS100 HEX1LS56 COM"23LS48 COM"45FIND PRN6PROCESS ASM 7MESSAGE ASM8DRV2 ASM49:STORAGE ASM;FIND HEX<FIND ASM =LS60 COM">?FIND COM@READ ME AWS COM|BCDEX  F#~# :gG3h*> DM!91m>0{3 z3444E02;d!!:@O 7 o4!D~͖#{͎Ɛ'@'_{x :H4:C:I12A v ʳ*O>y0?  ؀GO xGy#~#ͅ~ ͖# CCS DISK FORMATTER PROGRAM V2.0 WHICH DRIVE (A-D)? IS IT A MINI (Y/N)? SINGLE OR DOUBLE DENSITY (S/D)? SECTOR SIZE (0-3)? TRACK NUMBER (0-4C OR *)? IS THE DISKETTE MOUNTED (Y/N)? SINGLE OR DOUBLE SIDED (0 OR 1)? B ]WSMSGS OVRZFGHIJKLWSOVLY1 OVR MNOPQRSTUASM COM@VWDIAG ASMHXYZDIAG PRN{[\]^DIAG HEX_FMAT ASM1`aFMAT PRNVbcdFMAT HEXeINSTALL ASMAfghDRV1 ASM8ijSUBMIT COM kE SUBl$$$ SUBm   KAD TRACK OR SECTOR SIZE/DENSITY SELECTION: NUMBER OF TRACKS (23, 28, OR 46)?  ! |0MMPN 2N N 6N# #NNNNNN NSEEKINIT < ERROR: DRIVE ; SIDE ; TRACK ; SECTOR ; STATUS- ;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qy  1> >0G G4212!#"!!yͧ22_GA11::ڷ!ͧ½!"! "`¨":!:<ڞG:x2:G!:´!#:@+~<2r*"!ͧʽ22_GA!!ͧ½!"! "͍¨":!b:<;iG:ix2:G!:Q!#Q:@_+~<2**}|! ***WARNING: POSSIBLE LOST DATA*** !! DISK I/O ERROR ON <: G27 2G4> 204023!"!"!9""1":m2$2%2 "(}a 2%:)a/ :% O>1:% 0C >2!\~r<2\@2!]~ ‰ 6?#‚>?2h:\=_2\:(##~2#~2##^#V"#^#V"*.;^#~2#~2#^""#)+""*{zҫ\24>>=0!"ͧý DRIVE NOT READY (TYPE CR WHEN READY).:024T02 „03w#3w#3w#3w#kT b> ¶ 20~3#~3#~3#~3#T > n03_#3_#3_#3_#T >:O:Sy40!y4>203w#3w#T<y@>@O2:1y2SXK4:21O:n3K!1z:)=zE*4 >ʍƈ_:W1zŸ4{2 !P:4:C:1 v> > _~# CCS SYST  "#"*{ozg"*"> ͎E**y**{ozgEE**#{z*!+"!""*+}ʝ ʁ*> b##"*+"k*^#V#" >  ^#~))))!o&:/o*"*#" >k*+}P" k2*&&&>002(x0J:*>0:2*2 *  *  *#ڑW+}ʢzŒÈi`:ʱ)=¬   : Total of $k in $ files with $k space remaining.$>:> _  EM GENERATION PROGRAM VERSION 1.0 COPYRIGHT 1980 CALIFORNIA COMPUTER SYSTEMS INSUFFICIENT MEMORY SPACE - NEED 24K SOURCE DRIVE: DESTINATION DRIVE: SOURCE ON , THEN TYPE RETURNDESTINATION y40!y4>203w#3w#T<y@>@O2:1y2SXK4:21O:n3K!1z:)=zE*4 >ʍƈ_:W1zŸ4{2 !P:4:C:1 v> > _~# CCS SYSTV~# *. ͜:<3C 2> >  (Strike any key to continue)$^#V#N#F_ #wl)) ) Nq#Nq)) ) N#F^#V_ #   2{*" k2*&&&>002(x0J:*>0:2*2 *  *  *#ڑW+}ʢzŒÈi`:ʱ)=¬   : Total of $k in $ files with $k space remaining.$>:> _h221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>` :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!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 ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ w-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6 @(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ r!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * *M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O> 2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 l "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !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:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ :H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈* y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# & 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ /fD$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I u$I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨'' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*^z8O!B N#N ¾SP.* |} !9":q!"S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~    IO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET 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 ANA 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âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1 ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_  =COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.|)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI f D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I u$I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"z;PROGRAM LS100.ASM ;LS-100 DRIVER RELOCATOR PROGRAM ;BY RVA ;LAST CHANGE ;11/21/83 ; ;COPYRIGHT 1983 ;DIGITAL RESEARCH COMPUTERS ;ALL RIGHTS RESERVED ; ;THIS PROGRAM WILL RELOCATE THE LS-100 DRIVER PROGRAM (DRV2) ;FROM 1000H TO A USER DEFINED DESTINATION ADDRESS. ;THIS WILL ALLOW YOU TO HAVE A MAXMIMUN CP/M SYSTEM SIZE ;AS THE DRIVER PROGRAM IS OUT OF THE TPA AREA. THEREFORE IT IS NO ;LONGER NESSARY TO PROTECT THE DRIVER FROM BEING OVER WRITTEN. ;NOTE HOWEVER THAT IF THE WARM BOOT ROUTINE OV100.COM ; ; ASM LS100 ;MAKE HEX FILE ; ASM DRV2 ;MAKE HEX FILE ; DDT LS100.HEX ;READ IN RELOCATOR ; H0,(ADDRESS OF DRV2) ;GET DRIVER OFFSET FROM 0H ; ;ADD 1000H TO DIFF. TO GET FINAL OFFSET ; IDRV2.HEX ;SET UP TO READ IN LS-100 DRIVER ; R(FINAL OFFSET) ;READ DRVIER INTO MEMORY AT 1000H ; G0 ;EXIT DDT ; SAVE 18 LS100.COM ;SAVE RELOCATOR AND DRIVER ; ; ORG 0100H ;MAKE COM FILE LXI SP,STACK ;SET UP SYSTEM STACK ; ;CHECK FOR # OF BOARDS IN SYSTEM ; CALL FIND ;FIND # OF BOARDS IT ;MOVE INTO POSTION ; ;END OF MAIN PROGRAM ; LXI D,MESG2 ;DONE CALL SMESG JMP 0 ; ;FIND # OF BOARDS IN SYSTEM ; FIND: XRA A ;CLEAR A MOV B,A ;" " B MOV C,A ;" " C OUT REG2 ;CLEAR LSB LATCH FIND1: OUT REG1 ;SET MSB LATCH CALL TEST ;CHECK FOR A BOARD RNZ ;RETURN WHEN NO BOARD FOUND MOV A,B ;B=SECTORS/BOARD ADI 08 ;ADD BOARD OFFSET CPI 40H ;CHECK FOR OVERFLOW JZ ERR2 ;REPORT ERROR MOV B,A ;RESULTS IN B INR C ;INCREMENT BOARD COUNTER JMP FIND1 ;KEEP ER WRITES THE BIOS ;JUMP TABLE AS IS DONE ON A COLD BOOT THEN THE DRIVER PROGRAM WILL ;HAVE TO BE RE-INSTALLED ON EACH WARM BOOT. THIS PROBLEM IS RARE BUT ;IT MAY EXIST. THE ONLY CURE FOR THIS PROBLEM IS TO MODIFY THE ;BIOS WARM BOOT ROUTINE TO READ IN ONLY THE CCP AND BDOS AS DESCRIBED ;IN THE SYSTEM ALTERATION GUIDE FROM DIGITAL RESEARCH. ;NOTE THAT THE DRIVER PROGRAM AS SUPPLIED ;REQUIRES 618 BYTES OF RAM STORAGE. ; ; ; ;THE PROGARM BDOS & BIOS VALUES MUST MATCH ;YOU'RE CURRENT CP/M BDOS & MOV A,C ;PUT IN A ORA A ;SET FLAGS JZ ERR1 ;CAN'T BE 0 STA NUMBD ;SAVE COUNT ADI 30H ;MAKE ASCII STA BDS ;PUT IN MESSAGE ; ;CHECK CP/M VER. # ; MAIN: MVI C,0CH ;VERSION FUNC. CALL 5 CPI 20H ;CHECK FOR 2.0 OR BETTER JNC VEROK LXI D,MESG4 ;WRONG VERSION CALL SMESG JMP 0 ;ABORT ; ;MOVE DRIVER ; VEROK: LXI D,MESG1 ;SIGN ON CALL SMESG MOV1: LXI H,1000H ;HL=SOURCE OF DRIVER LXI D,DRV2 ;DE=DEST. OF DRIVER LXI B,DRVSZ ;BC=LENGTH OF DRIVER CALL MOVIT ;MOVE INTLOOKING ; ;NON-DESTRUCTIVE BYTE TEST ; TEST: CALL RESET ;CLEAR BYTE LOCATION ADDRESS IN REG0 ;READ DATA MOV D,A ;SAVE IN D CALL RESET ;CLEAR BYTE LOCATION ADDRESS MVI A,55H ;GET TEST BYTE OUT REG0 ;WRITE IT CALL RESET ;CLEAR BYTE LOCATION ADDRESS IN REG0 ;READ DATA BACK CPI 55H ;CHECK FOR TEST BYTE CALL RESET ;CLEAR BYTE LOCATION ADDRESS MOV A,D ;GET ORGINAL DATA OUT REG0 ;RESTORE DATA RET ; ;RESET BYTE ADDRESS COUNTERS ; RESET: MVI A,0 ;CLEAR A/SAVE FLAGS OUT    BIOS VALUES. ;NOTE THAT SOME CP/M SYSTEMS HAVE AN OFFSET FROM ;THE STANDARD CP/M VALUES AS PUBLISHED IN THE CP/M 2.2 ;DOCUMENTATION. ;IF YOU DO NOT KNOW THE BDOS & BIOS VALUES FOR YOU'RE SYSTEM ;YOU CAN FIND THE VALUES WITH THE FIND.COM PROGRAM SUPPLIED ;ON THE DISTRIBUTION DISK. ;ENTER THE BDOS & BIOS VALUES INTO ;THE SOURCE CODE BELOW. ; BDOS EQU 0DC06H ;BDOS ADDRESS BIOS EQU 0EA00H ;BIOS ADDRESS ; ;SET DRV2 EQUAL TO THE DESTINATION ADDRESS OF THE DRIVER. ;BE SURE TO ALLOW ENOUGH RAM FO O POSTION ; ;COPY BIOS JUMP TABLE TO RELOCATED BIOS JUMP TABLE ; MOV2A: LXI H,BIOS+3 ;HL=BIOS JUMP TABLE LXI D,DRV2+27H ;DE=RELOCATED BIOS JUMP TABLE LXI B,3 ;# OF BYTES CALL MOVIT ;COPY WARM BOOT LXI D,12H ;SKIP PAST UNUSED ENTRIES DAD D ;ADJUST HL LXI D,DRV2+2AH ;DE=DEST. LXI B,1BH ;# OF BYTES CALL MOVIT ;COPY HOME-SECTOR TRANSLATE ; ;COPY DRIVER JUMP TABLE INTO BIOS JUMP TABLE ; MOV2B: LXI H,DRV2+9 ;HL=DRIVER BIOS LXI D,BIOS+3 ;DE=DEST. LXI B,3 ;# OF BYTES CALL MOVIT  -REG3 ;SET BYTE LOCATION ADDRESS RET ; ;BLOCK MOVE ROUTINE ;HL=SOURCE/DE=DEST./BC=COUNT ; MOVIT: MOV A,M ;GET DATA STAX D ;STORE IT INX H ;BUMP SOURCE POINTER INX D ;BUMP DEST. POINTER DCX B ;DECREMENT COUNTER MOV A,B ;A=B ORA C ;CHECK FOR BC=0 JNZ MOVIT ;LOOP UNTIL BC=0 RET ; ;NO LS-100 BOARDS FOUND ; ERR1: LXI D,MESG6 CALL SMESG JMP 0 ; ;TO MANY LS-100 BOARDS FOUND ; ERR2: LXI D,MESG7 CALL SMESG JMP 0 ; ;SEND MESSAGE @DE TO CON. ; SMESG: MVI C,09H JMP 5 dR THE DRIVER TO FIT. ; DRV2 EQU 0F800H ;LOAD ADDRESS OF DRIVER DRVSZ EQU 618 ;SIZE OF DRV2 PROGRAM ; DRVID EQU 04 ;ACTIVE DRIVE # (E) DRVLD EQU 42H ;DRIVER LOADED FLAG TABSZ EQU 0FH ;SIZE OF DRIVE TABLE ENTRY DPB EQU DRV2+55H ;ADDRESS OF DISK PARM. BLOCK ; ; ;LS-100 BOARD EQUATES ; PBASE EQU 0D0H ;BASE PORT ADDRESS REG0 EQU PBASE ;DATA TRANSFER PORT REG1 EQU PBASE+1 ;MSB ADDRESS LATCH REG2 EQU PBASE+2 ;LSB ADDRESS LATCH REG3 EQU PBASE+3 ;BYTE LOCATION COUNTERS ; ; TO CREATE LS ;COPY WARM BOOT LXI D,BIOS+18H ;SKIP PAST UNUSED ENTRIES LXI B,1BH ;# OF BYTES CALL MOVIT ;COPY HOME-SECTOR TRANSLATE ; ; FILL IN DISK PRAMTER BLOCK BASED ON # OF BOARDS IN SYSTEM ; LXI D,MESG5 CALL SMESG LDA NUMBD LXI H,DRVTAB ;HL@ DRIVE TABLE DCR A ;MAKE RELATIVE 0 JZ CALC2 ;SKIP IF ONLY 1 BOARD LXI D,TABSZ ;DE=SIZE OF TABLE CALC1: DAD D ;INDEX INTO TABLE DCR A ;DECREMENT A JNZ CALC1 ;UNTIL A=0 CALC2: LXI D,DPB ;HL=SOURCE/DE=DEST. LXI B,TABSZ ;BC=LENGTH CALL MOV$ ; ;DISK DRIVE PRAMETER TABLES ; DRVTAB: EQU $ ; DPB0: DW 8 ;SECTORS/TRACK DB 4 ;BLOCK SHIFT DB 15 ;BLOCK MASK DB 1 ;EXTNT. MASK DW 126 ;DISK SIZE-1 DW 127 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB1: DW 16 ;SECTORS/TRACK DB 4 ;BLOCK SHIFT DB 15 ;BLOCK MASK DB 1 ;EXTNT. MASK DW 253 ;DISK SIZE-1 DW 127 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB2: DW 24 ;"IGHTS RESERVED' DW 0D0AH DB ' !COPYRIGHT 1983' DW 0D0AH DB ' VER. 2.0' DW 0D0AH DW 0D0AH DB '$' MESG2: DW 0D0AH DW 0D0AH DB 'DRIVE ' DB DRVID+41H DB ' ACTIVE' DW 0D0AH DB '$' MESG4: DB 'CP/M 2.0 OR BETTER REQUIRED' DW 0D0AH DB '$' MESG5: DW 0D0AH DB 'DRIVER INSTALLED FOR ' BDS: DS 1 DB ' LS-100 BOARD(S)' DW 0D0AH DB '$' MESG6: DB 'NO BOARDS FOUND' DW 0D0AH DB '$' MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMSECTORS/TRACK DB 5 ;BLOCK SHIFT DB 31 ;BLOCK MASK DB 3 ;EXTNT. MASK DW 189 ;DISK SIZE-1 DW 255 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB3: DW 32 ;SECTORS/TRACK DB 5 ;BLOCK SHIFT DB 31 ;BLOCK MASK DB 3 ;EXTNT. MASK DW 253 ;DISK SIZE-1 DW 255 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB4: DW 40 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTo[IT' DW 0D0AH DB '$' NUMBD: DS 1 ;NUMBER OF BOARDS FOUND DS 20 STACK EQU $ END .0' DW 0D0AH DW 0D0AH DB '$' MESG2: DW 0D0AH DW 0D0AH DB 'DRIVE ' DB DRVID+41H DB ' ACTIVE' DW 0D0AH DB '$' MESG4: DB 'CP/M 2.0 OR BETTER REQUIRED' DW 0D0AH DB '$' MESG5: DW 0D0AH DB 'DRIVER INSTALLED FOR ' BDS: DS 1 DB ' LS-100 BOARD(S)' DW 0D0AH DB '$' MESG6: DB 'NO BOARDS FOUND' DW 0D0AH DB '$' MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIM  ;PROGRAM DRV1.ASM  ;LS-100 DRIVER PROGRAM  ;BY RVA  ;TO BE RELOCATED BELOW CCP  ;LAST CHANGE  ;6/23/1983  ;COPYRIGHT 1983  ;DIGITAL RESEARCH COMPUTERS  ;ALL RIGHTS RESERVED  ;  ; FFFF = * TRUE EQU 0FFFFH ;VALUE FOR TRUE 0000 = & FALSE EQU NOT TRUE ;VALUE FOR FALSE  ; FFFF = STND EQU TRU NT. MASK DW 157 ;DISK SIZE-1 DW 511 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB5: DW 48 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTNT. MASK DW 189 ;DISK SIZE-1 DW 511 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB6: DW 56 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTNT. MASK DW 221 ;DISK SIZE-1 DW 1023 ;MAX. DIRECTORY ENTRIES    ~*E ;SET TO TRUE FOR STANDARD CP/M 0000 = 5 OFST EQU FALSE ;SET TO TRUE FOR NON-STANDARD CP/M  ;   IF STND 003C = / MSIZE EQU 60 ;CP/M SIZE IN KILOBYTES A000 = ) CBASE EQU (MSIZE-20)*1024 ;BIAS D400 = 3 CPMB EQU CBASE+3400H ;BASE ADDRESS OF CCP EA00 = , BIOS EQU CBASE+4A00H ;BIOS ADDRESS EA0C = 4 CONOUT EQU BIOS+12 ;BIOS CONSOLE OUTPUT DC06 = # BDOS EQU CBASE+3C06H ;BDOS ENTRY   ENDIF     DB 240 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB7: DW 64 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTNT. MASK DW 253 ;DISK SIZE-1 DW 1023 ;MAX. DIRECTORY ENTRIES DB 240 ;ALLOC0 DB 0 ;ALLOC1W DW 0 ;CHECK SIZE DW 2 ;OFFSET ; ; ; ;MESSAGE AREA ; MESG1: DW 0D0AH DB ' = LS-100 AUTO INSTALL PROGRAM' DW 0D0AH DW 0D0AH DB ' / DIGITAL REASEARCH COMPUTERS' DW 0D0AH DB '  ALL R ;  IF OFST  #BIOS EQU 0EA00H ;ADDRESS OF BIOS  #BDOS EQU 0DC06H ;ADDRESS OF BDOS  $CPMB EQU BDOS-806H ;ADDRESS OF CCP   ENDIF  ; EA0C = 2 CONOUT EQU BIOS+12 ;BIOS CONSOLE OUTPUT 0004 = + DRVID EQU 04 ;ACTIVE DRIVE # (E) 0041 = ! DRVLD EQU 41H ;DRIVER ID BYTE  ;  ;LS-100 PORT ADDRESS ASSIGMENT  ; 00C0 =  PBASE EQU 0C0H ;BASE PORT"ITE SECTOR D03F ! LSTS2: DS 3 ;LIST STATUS D042 # SCTRL2: DS 3 ;SECTOR TRANSLATOR  ;  ;  ; D045 00. DPE0: DW XLT0,0000H ;TRANSLATE TABLE D049 00 DW 0000H,0000H ;SCRATCH AREA D04D BAD155D0 DW DIRBUF,DPB0 ;DIR.BUF./PARM. BLOCK D051 7AD23AD2 DW CSV0,ALV0 ;CHECK ALLOC. VECTORS  ;  2;THE FOLLOWING PARAMETERS ARE FOR 1 MEMORY BOARD  ; D055 =  DPB0: EQU $ ;DISK PAc, LXI H,DPE0 ;HL=DISK PARM. BLOCK D090 C9  RET  ;  ;SET TRACK ROUTINE  p; D091 CD68D1 STRK: CALL CHK ;CHECK FOR LS-100 D094 C230D0 JNZ STRK2 ;IF NOT JUMP TO BIOS D097 79 E MOV A,C ;GET TRACK # D098 32B6D1 STA TRK ;STORE IT D09B C9  RET  ;  ;SET SECTOR ROUTINE  l; D09C CD68D1 SSEC: CALL CHK ;CHECK FOR LS-100 D09F C233D0 JNZ SSEC2 ;IF NOT JUMP TO BIOS D0AvX ;CONVERT TO HEX ASCII D0D8 22A4D1 SHLD BDTRK ;PUT IN MESSAGE D0DB 3AB7D1 LDA SEC ;GET CURRENT SECTOR # D0DE CD10D1 CALL CNVHX ;CONVERT TO HEX ASCII D0E1 22AFD1 SHLD BDSCTR ;PUT IN MESSAGE  ;  /;FIND WHICH LS-100 BOARD THE ERROR OCCURED ON  ; D0E4 0631 MVI B,'1' ;START WITH BOARD #1 D0E6 3AB7D1 LDA SEC ;GET CURRENT SECTOR # D0E9 D608 FIND: SUI 8 ;SUB. OFFSET/BOARD D0EB DAF2D0 JC FOUND ;CHECK FOR OVERFK ADDRESS 00C0 = - REG0 EQU PBASE ;DATA TRANSFER PORT 00C1 = . REG1 EQU PBASE+1 ;MSB ADDRESS LATCH 00C2 = . REG2 EQU PBASE+2 ;LSB ADDRESS LATCH 00C3 = ; REG3 EQU PBASE+3 ;BYTE LOCATION ADDRESS COUNTERS 0080 = NBYTES EQU 128 ;BYTES/SECTOR  ;  ;START OF DRIVER  ; D000 / ORG CPMB-1024 ;ALLLOW 1K FOR DRIVER D000 41 $ DB DRVLD ;DRIVER ID BYTE D001 00 DB 0 D002 00 DW 0,0 ;6 BYTE O-;RM. BLOCK D055 1000 DW 16 ;SECTORS/TRACK D057 04  DB 4 ;BLOCK SHIFT D058 0F  DB 15 ;BLOCK MASK D059 01 j DB 1 ;EXTNT MASK D05A FD00 DW 253 ;SIZE-1 D05C 7F00 DW 127 ;MAX. DIR. ENTRYS D05E C0  DB 192 ;ALLOC0 D05F 00 [ DB 0 ;ALLOC1 D060 0000 DW 0 ;CHECK SIZE D062 0200 DW 2 ;OFFSET 0000 =  XLT0: EQU 0 ;NOT REQUIRED  ;  ;DRIVER ROUTINES  ; D064 318000 WBOOT: 32 79 F MOV A,C ;GET SECTOR # D0A3 32B7D1 STA SEC ;STORE IT D0A6 C9  RET  ;  ;SET UP DMA ADDRESS  ; D0A7 60 SDMA: MOV H,B ;H=B D0A8 69 i MOV L,C ;L=C D0A9 22B8D1 SHLD TADDR ;STORE IT D0AC C336D0 JMP SDMA2 ;PASS PARM. TO BIOS  ;  ";LS-100 SECTOR TRANSLATE ROUTINE  b; D0AF CD68D1 SCTRL: CALL CHK ;CHECK FOR LS-100 D0B2 C242D0 JNZ SCTRL2 ;IF NOT JUMP Tj LOW D0EE 04 O INR B ;BUMP BOARD COUNTER D0EF C3E9D0 JMP FIND ;KEEP LOOKING D0F2 78 KFOUND: MOV A,B ;GET BOARD # D0F3 3298D1 STA BDBRD ;PUT IN MESSAGE  ;  !;PRINT ERROR MESSAGE ON CONSOLE  >; D0F6 216ED1 LXI H,MESG1 ;HL @ ERROR MESSAGE D0F9 7E #SMESG: MOV A,M ;GET DATA D0FA B7 R ORA A ;CHECK FOR END OF MESSAGE D0FB CA08D1 JZ EXIT ;EXIT IF SO D0FE 4F * MOV C,A ;SETUP FOR BIOS CALL D0FF E5  =FFSET D006 C306DC BDOS1: JMP BDOS ;LINK TO BDOS ENTRY  ;  ;DRIVER BIOS JUMP TABLE  ; D009 C364D0 WBOOT1: JMP WBOOT ;WARM BOOT D00C C378D0 HOME1: JMP HOME ;HOME D00F C383D0 SLDSK1: JMP SLDSK ;SELECT DISK D012 C391D0 STRK1: JMP STRK ;SET TRACK D015 C39CD0 SSEC1: JMP SSEC ;SET SECTOR D018 C3A7D0 SDMA1: JMxP SDMA ;SET DMA ADDRESS D01B C3B8D0 RDE1: JMP RDE ;READ SECTOR D01E C328D1 WRE1: JMP WRE ;WRITE SECTOR D0 LXI SP,80H ;RESET STACK D067 2106D0 LXI H,BDOS1 ;HL=BASE OF DRIVER D06A 220600 SHLD 6 ;REFLECT REDUCED SIZE D06D 24 # INR H ;SKIP PAST DRIVER D06E 24  INR H ; D06F 24  INR H ; D070 24 f INR H ;HL=HL+1024 D071 2E03 MVI L,3 ; D073 3A0400 LDA 4 ;GET CURRENT DRIVE D076 4F MOV C,A ;MOVE INTO C D077 E9  PCHL ;LOG IN DRIVE (CCP+3)    ;  ;HOME ROUTINE  ; D078 C O BIOS D0B5 60 , MOV H,B ;NO TRANLASTION REQUIRED D0B6 69  MOV L,C ;SET HL=BC D0B7 C9  RET  ;  ;LS-100 SECTOR READ ROUTINE  ; D0B8 CD68D1 RDE: CALL CHK ;CHECK FOR LS-100 D0BB C239D0 JNZ RDE2 ;IF NOT JUMP TO BIOS D0BE CD43D1 CALL SETUP ;SET UP LS-100 REGS. D0C1 DBC0 RDLP: IN REG0 ;GET DATA FROM LS-100 D0C3 77  MOV M,A ;STORE @ HL D0C4 83 $ ADD E ;COMPUTE CHECK SUM D0C5 5F  MOV E %R PUSH H ;SAVE POINTER D100 CD0CEA CALL CONOUT ;OUTPUT BYTE D103 E1 " POP H ;RESTORE POINTER D104 23 O INX H ;BUMP POINTER D105 C3F9D0 JMP SMESG ;LOOP UNTIL END OF MESSAGE  ;  #;SET DEFAULT DRIVE TO A AND ABORT  ; D108 AF EXIT: XRA A ;CLEAR A D109 4F n MOV C,A ;SET TO DRIVE A D10A 320400 STA 4 ;SET TO DRIVE A D10D C30000 JMP 0 ;RETURN TO CP/M  ;  ;CONVERT HEX Ud21 C33FD0 LSTS1: JMP LSTS2 ;LIST STATUS D024 C3AFD0 SCTRL1: JMP SCTRL ;SECTOR TRANSLATOR  ;  !;RELOCATED CP/M BIOS JUMP TABLE  ; D027 WBOOT2: DS 3 ;WARM BOOT D02A  HOME2: DS 3 ;HOME D02D " SLDSK2: DS 3 ;SELECT DISK D030  STRK2: DS 3 ;SET TRACK D033 SSEC2: DS 3 ;SET SECTOR D036 % SDMA2: DS 3 ;SET DMA ADDRESS D039 RDE2: DS 3 ;READ SECTOR D03C  WRE2: DS 3 ;WRfD68D1 HOME: CALL CHK ;CHECK FOR LS-100 D07B C22AD0 JNZ HOME2 ;IF NOT JUMP TO BIOS D07E AF E XRA A ;CLEAR A D07F 32B6D1 STA TRK ;SET TO TRACK 0 D082 C9  RET  ;  ;SELECT DISK ROUTINE  ; D083 79 ~SLDSK: MOV A,C ;GET DRIVE # D084 32B5D1 STA UNIT ;SAVE IT D087 3E04 MVI A,DRVID ;GET ACTIVE DRIVE # D089 B9 ] CMP C ;CHECK FOR LS-100 D08A C22DD0 JNZ SLDSK2 ;IF NOT JUMP TO BIOS D08D 2145D0 (,A ;ACCUMULATE CHECK SUM IN E D0C6 23  INX H ;BUMP POINTER D0C7 05 DCR B ;DECREMENT BYTE COUNT D0C8 C2C1D0 JNZ RDLP ;LOOP UNTIL ZERO D0CB CD55D1 CALL CALC ;SET ADDRESS OF CHECK SUM BYTE D0CE DBC0 IN REG0 ;GET CHECK SUM BYTE D0D0 93 # SUB E ;CHECK FOR ERROR D0D1 C8  RZ ;RETURN IF NO ERROR  ;  ;PROCESS CHECK SUM ERROR  M; D0D2 3AB6D1 LDA TRK ;GET CURRENT TRACK # D0D5 CD10D1 CALL CNVH / BYTE IN A. RETURN TWO HEX ASCII CHARS. IN HL  ; D110 F5 CNVHX: PUSH PSW D111 0F  RRC D112 0F  RRC D113 0F  RRC D114 0F + RRC D115 CD1FD1 CALL HASCI D118 6F  MOV L,A D119 F1 / POP PSW D11A CD1FD1 CALL HASCI D11D 67  MOV H,A D11E C9 H RET D11F E60F HASCI: ANI 0FH D121 C690 ADI 90H D123 27 ( DAA D124 CE40 ACI 40H D126 27  DAA D127 C9 RET   CK D15C 07 RLC ;MOD 128 D15D D264D1 JNC SKP1 ;JUMP IF <128 D160 3E01 MVI A,1 ;SET TO TRACK 1 D162 D3C2 OUT REG2 ;UPDATE LSB ADDRESS LATCH D164 7E iSKP1: MOV A,M ;RESTORE TRACK # D165 D3C3 OUT REG3 ;SET BYTE LOCATION ADDRESS COUNTERS D167 C9  RET  ;  *;CHECK THE CURRENT DRIVE BYTE FOR LS-100  l; D168 3AB5D1 CHK: LDA UNIT ;GET DRIVE # D16B FE04 CPI DRVID ;Z=0 DRIVE ACTIVE/Z=1 DRIVE NOT Wsclaimer  I-1 1.3 Features I-2 1.4 LS-100 Overview + I-3 1.5 Table 1-1 Storage Capacity 7I-4 II ASSEMBLY 2.1 Construction Hints  II-1 2.2 Parts List $ II-2 2.3 Assembly Procedure H II-4 III BOARD SETUP 3.1 I/O Base Port Addressing (S1)   blan board al tha i covere b th limite warrant i th P board itself. Unde n circumstanc shoul yo cu an trace o th P board T d s wil VOI you warrant an w wil no servic an cu o modifie board. 1.2 SOFTWARE DISCLAIMER Digita Researc Computer make n representation o warrantie wit respec t th softwar supplie wit th LS-10 boar an specificall disclaim an implie  ;  ;LS-100 SECTOR WRITE ROUTINE  ; D128 CD68D1 WRE: CALL CHK ;CHECK FOR LS-100 D12B C23CD0 JNZ WRE2 ;IF NOT JUMP TO BIOS D12E CD43D1 CALL SETUP ;SET UP LS-100 REGS. D131 7E ZWRLP: MOV A,M ;GET DATA FROM MEMY. @ HL D132 D3C0 OUT REG0 ;STORE DATA D134 83 $ ADD E ;COMPUTE CHECK SUM D135 5F . MOV E,A ;ACCUMULATE CHECK SUM IN E D136 23  INX H ;BUMP POINTER D137 05 ( DCR B ;DECREMENT BYTE COUNT D138 C23 >ACTIVE D16D C9  RET    ;  ;MESSAGE AREA  l; D16E 0A0D MESG1: DW 0D0AH D170 434845434B DB 'CHECK SUM ERROR OCCURED ON LS-100 BOARD ' D198 00 nBDBRD: DB 0 D199 0A0D DW 0D0AH D19B 4154205452 DB 'AT TRACK ' D1A4 0000 BDTRK: DW 0 D1A6 48 O DB 'H' D1A7 2053454354 DB ' SECTOR ' D1AF 0000 BDSCTR: DW 0 D1B1 48 , DB 'H' D1B2 0A0D DW 0D0AH D1B4 00  DB 0  ; P_ #III-1 3.2 Board Select (S2) ! III-1 3.3 Jumper Options "III-1 3.4 8080 Setup Chart !III-3 3.5 Z80 Setup Chart 0 III-4 3.6 Table 3-1 I/O Port Addressing ) III-5 3.7 Battery Back up Option III-7 3.8 Status LEDs 1 III-7 IV SOFTWARE 4.1 Diagnosti  warrantie o merchantabilit o fitnes fo an particula purpose Futher Digita Researc Computer reserve th righ t revis th include softwar fro tim t tim withou an obligatio o Digita Researc Computer t noGtif an perso o organizatio o suc revision o changes. .fo Page I-1 .PA .he Section I .pn   DIGITAL RESEARCH COMPUTERS   h1D1 JNZ WRLP ;LOOP UNTIL ZERO D13B CD55D1 CALL CALC ;SET ADDRESS OF CHECK SUM BYTE D13E 7B Y MOV A,E ;GET CHECK SUM BYTE D13F D3C0 OUT REG0 ;STORE CHECK SUM BYTE D141 AF XRA A ;NORMAL RETURN D142 C9  RET  ;  5;SETUP LS-100 REGS. BASED ON CURRENT TRACK & SECTOR  ; D143 3AB6D1 SETUP: LDA TRK ;GET CURRENT TRACK # D146 D3C2 OUT REG2 ;SET LSB ADDRESS LATCH D148 3AB7D1 LDA SEC ;GET CURRENT SECTOR և  ;  ;LOCAL STORAGE MUST BE IN RAM  ; D1B5 " UNIT: DS 1 ;CURRENT DRIVE D1B6 ! TRK: DS 1 ;CURRENT TRACK D1B7 " SEC: DS 1 ;CURRENT SECTOR D1B8 & TADDR: DS 2 ;TRANSFER ADDRESS D1BA 0 DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER D23A * ALV0: DS 64 ;ALLOCATION VECTOR D27A 00 $CSV0: DB 0 ;CHECK SUM VECTOR D27B  END # w c Program IV-1 4.2 Format Program ! IV-2 4.3 Install Program 2IV-3 4.4 Install Program Incompatabilities DIV-5 V USING THE LS-100 5.1 How to use the LS-100 I V-1 VI BIOS INTEGRATION 6.1 LS-100 Register Description "VI-1 6.2 Bios Integration  VI-3 6.3 Disk Paramete  P.O. BOX 461565  GARLAND, TEXAS 75046   (214)-271-3538 1.3  LS-100 FEATURES USES FIVE VOLT ONLY 64K x 1 DYNAMIC RAMS USE INTE 820-1 DYNAMI RA CONTROLLE PROVIDES 256K BYTES PER BOARD OF ON LINE STORAGE REQUIRES ONLY FOUR I/O PORTS FOR OPERATION (DIP SWITCH SELECTABLE) EXPANSION OF UP TO EIGHT BOARDS PROVIDING 2 ^MEGABYTES OF STORAGE INTERFACES WITH 8080 OR Z80 PROCESSOR BOARDS PROVISION FOR EXTERNAL  # D14B D3C1 OUT REG1 ;SET MSB ADDRESS LATCH D14D 2AB8D1 LHLD TADDR ;HL=DMA POINTER D150 0680 MVI B,NBYTES ;B=BYTES/SECTOR D152 1E00 MVI E,0 ;CLEAR CHECK SUM BYTE D154 C9  RET  ;  ;;COMPUTE ADDRESS FOR CHECK SUM BYTE & SET UP LS-100 REGS.  ;; D155 21B6D1 CALC: LXI H,TRK ;HL @ TRACK # D158 AF Q XRA A ;CLEAR A/CARRY FLAG D159 D3C2 OUT REG2 ;SET TO TRACK 0 D15B 7E  MOV A,M ;GET CURRENT TRA /.OP   "Light Speed - 100"   256K S-100   DISK SIMULATOR   COPYRIGHT (c) 1983  ' DIGITAL RESEARCH COMPUTERS .PA .he  Table of Contents SECTION C PAGE I GENERAL INFORMATION 1.1 Limited Warranty I-1 1.2 Software Di r Blocks LVI-8 VII THEORY OF CIRCUIT OPERATION 7.1 Circuit Description b VII-1 APPENDICES I ERROR MESSAGES II COMPONENT LOCATION DIAGRAM .pa .he  Section I 1.1 LIMITED WARRANTY Rea th enclose yello shee fo statemen o ou limited warranty as related to this kit. Als not tha whe thi produc i purchase a   POWER OR BATTERY BACKUP BOARD SELECT AND ACCESS STATUS LED INDICATORS LOW POWER (600 MA. TYPICAL) DOUBLE SIDED PC BOARD WITH PLATED THROUGH HOLES SILK SCREENED COMPONENT LEGEND AND SOLDER MASKED GOLD PLATED FINGERS FULLY BUFFERED AND BYPASSED IEEE 696 S-100 BUS COMPATABILE (as proposed) OVERLAYFORMATTER AN DIAGNOSTI SOFTWARE PROVIDE (CP/͠ 2. REQ.) .FO Page I-2 .PA .he Section I 1.4 d I erro conditio occur th use i prompte a t whic LS-10 boar th erro occure on allowin quic issolatio o faul t th boar level. Th LS-10 provide dramati spee improvemen i dis intensiv softwar b usin semiconducto memor fo storag instea o magneti media Suc program a hig leve language lik PASCAL FORTRAN PLI-80 ect wil execut fro t 1 time faste whe compare t flopp dis drive Othe program l a 2 gauge rosi cor 60/4 allo solder. Keep the soldering tip clean with a wet sponge or cloth. Afte suc component a resistor o capacitor hav bee soldered us smal pai o diagona cutter t remov th exces lea length CAUTION WEA EY PROTECTIOΠ GOGGLEӠ T PREVEN INJUR T YOU EYES. Observe polarities on all tantalum caps and LEDs. I yo notic an discrepancie betwee th part receive an thos listed pleas notif us. or DM8097 1 DM8131 1  8203-1 3 %MK4564P-20 Mostek 64K Dynami ram  ?(Oequivalen witaacces tim o 25 ns o faster.)  9(NOTE: C5 and C7 are not supplied with the kit as these  3 caps are only required for fundamental crystals.  1 I fundamenta crysta i use for XY1 then  0 install a 3-10 pf. cap at locations CanC.) .fo Page II-3 .pa .he   OVERVIEW Th LS-10 boar i hig densit memor boar tha i organize a a arra o fou bank b eigh bit o 64ˠ dynami rams Th LS-10 provide th use wit tota o 262,14 byte o memor tha i I/ mapped On LS-10 boar provide th equvalen storag o a inc singl side singl densit flopp dis drive Fou I/Ϡ port ar require t control th LS-10 board Thes port ar switc selectabl t an f ܩ suc a editor wil als benifi i improve performac whe excute o th LS-100 a thes program frequentl us overlay tha mus b rea i fro th dis drive Onc yo hav use th LS-10 yo wil neve wan t WAIT o flopp dis drive again. K* CP/M is a registered trade mark of DIGITAL RESEARCH (California) .FO Page I-3 .PA .he Section I  TABLE 1-1 1.5 X .FO Page II-1 .pa.he Section II 2.3  PARTS LIST 1  40 pin Socket 4  20 pin Sockets 39 16 pin Sockets 7  14 pin Sockets 2 LEDs 3 . 10 pin SIP resistor packs (3.3k to 4.7k) 1  20 MHZ crystal 4  33 ohm 1/4 watt resistors 2 330 ohm 1/4 watt resistors 1 " 680 ohm 1/4 watt 5% resistor 1 1k ohm 1/4 I  Section II 2.3 ASSEMBLY PROCEDURE [ݠ Giv th P boar goo visua inspectio fo an obviou short o opens Ther shoul b none bu fe minute spen her coul sav hour later. [ݠ Usin a ohmmeter ensur tha ther ar n short betwee BUS pin an 50. [ Instal an solde 3 1 pi socket a location Y throug Y32 Not tha pi # i oriente t th to o th P board. [ Instal an sold ou consecutiv port o th 25 tha ar available Ther ca b u t eigh LS-10 board wit th sam bas I/ por address providin th use wit 2,097,15 byte o o lin storage I mor storag i required the fou mor I/ port wil hav t b assigne t th nex grou o eigh boards Eac LS-10 boar ca addres 2,04 12 byt page o "sectors" I orde t addres th LS-10 board th flopp dis trac an secto number tha ar pr d Storage Capacity Th followin tabl provide th storag capacit tha ca b achive base o th numbe o LS-10 board i th system. Numbe o Board 4 Max Dir Entr Storage i Kilobytes 1 128 (4k)  254 2 128 (4k)  508 3 256 (8k)  760 4 256 (8k) 1016 5    watt 5% resistor 2  1N4002 diode 51 .1 mfd Bypass Caps 4 / 10 mfd. 15 VDC tantalums caps (or larger) 7 1 6.8 mfd. 10 VDC axial lead caps (or larger) 2 $ 7805 +5 VDC voltage regulaters 2 $ TO-220 heatsinks with hardware 2  8 position DIP switches 1 ' 4-pin right angle molex connector 2 ) 3 position single row jumper blocks 2 ) 3 position double row jumper blocks 4  shorting plugs 1 printed cir e 1 pi socket a location Z3 Z5 Z12 Z13 an Z18-Z20 Not tha pi # i oriente t th to o th P board. [ Instal an solde 1 pi socket a location Z4 Z6 Z9 Z10 an Z15-Z17 Not tha pi # i oriente t th to o th board. [ Instal an solde 2 pi socket a location Z11 Z14 Z22 an Z23 Not tha pi # i oriente t th to o th board. [ Instal an solde th 4 pi socke a locatio Z7 Not that pin #1 is oriente ovide b CP/ ar use b th drive progra t generat a addres tha wil suppor u t eigh LS-10 boards Thi provide tota o 16,38 12 byt page o "sectors o storage Dat integrit i maintaine b softwar generate chec su byt tha i compute o eac 12 byt secto a store i reserve area O eac 12 byt secto read th chec su byt i re-compute an compare wit th orgina checksu byt tha wa generate whe th dat wa store \e 512 (16k)  1264 6 512 (16k)  1520 7 1024 (32k)  1776 8 1024 (32k) 2032 .FO Page I-4 .pa .he Section II 2.1 GENERAL CONSTRUCTION HINTS Fo solderin w recommen 3 wat solderin pencil D no us solderin gu !! Us smal diamete (suc cuit board 1 74LS00 1  7406 or 7416 .fo Page II-2 .pa .he  Section II  PARTS LIST Cont. 1 74S08 (do not substitute) 1 74LS14 1 74LS32 2 74S32 (do not substitute) 1 74LS138 1 74LS139 1 74LS155 2 74LS193 1 74LS244 1 74LS373 2 74LS374 1  74LS367A or 8T97  d to the left of the board. [ݠ Instal an solde thre 1 pi SIР resisto pack a location Z8 Z21 an Z24 Pi # i u o thes parts. [ Instal an solde th fou radia lea tantalu cap a location C1 C2 C3 C4 Pleas observ th prope polarit whe installin thes parts [ Instal an solde th bypas cap i location C6 an C8- C57. [ݠ Instal an solde seve axia lea cap a location C58 C59 C60 C61 C62 C63 C64 Pleas observ  voltag regulator a location Z an Z2. [ Usin an o th regulato mountin tab a ground measur th outpu o eac 780 voltag regulato unde powe i you system Th outpu i measure o th righ pi o th 7805 Th measure voltag shoul b betwee 4.7 an 5.2 VDC An regulato ou o spe mus b replaced. [ Instal 74LS0 i socke locatio Z10 Pi # i t th top. [] Install a 7406 in socket location Z6. Pin #1 is to the top. [ Instal  Page II-6 .pa .he  Section III   Board Setup 3.1 I/O BASE PORT ADDRESSING   Dip Switch S-1  grou o fou consecutiv I/ port ar require t addres th LS-10 board Di switc S- set th bas addres o thes ports Switc positio correspond t addres bi A an switc positio correspond t addres bi A2 providin 6 pos ie t th CPU.) .fo  Page III-1 .pa .he  Section III  JUMPER OPTIONS Cont. 3.3.2  Advanced or Normal Ready  J3-J4 Base䠠 o you syste requirements eithe transfe acknowledg XAC (norma ready o th syste acknowledg SAC (advance ready signa ca b use t generat th CP processo read signa (PRDY) XAC i g  th prope polarit whe installin thes parts. [ Instal an solde th tw diode i location D1 an D2 Pleas observ th prope polarit whe installin thes parts. [ݠ Instal an solde th tw LED a location DS an DS2 XTh cathod (denote b th fla side goe towar th lef sid o th board. .fo Page II-4 .pa .he  Section II  )ASSEMBLY PROCEDURE Cont. [ Instal = 74S0 i socke locatio Z9 Pi # i t th top. .fo Page II-5 .pa .he Section II  ASSEMBLY PROCEDURE Cont. [ Instal 74LS1 in socke locatio Z16 Pi # i t th top. [ Instal 74LS3 i socke locatio Z17 Pi # i t th top. [ Instal a 74S3 i socket location Z4 an Z15 Pi # i t th top. [ݠ Instal 74LS13! i socke locatio Z3 Pi # i sibl bas addresse o th 25 tha ar available Tabl 3- provide th 6 possibl bas I/ por addresses Fo operatio wit th supplie softwar se thi switc fo bas por D0 b settin switche 3,5 an i th o positio an switche 1,2 an i th of position I thi conflict wit an othe board i you syste the selec ne grou o I/ port fro Tabl 3-1 an modif th softwar accordingly. 3.2 BOARD SELECT enerall used howeve i you syste ca tolerat a advance ready the SAC ca b used bu onl i th th CP i you syste ca tolerat th amoun o advance read provide b th 820 controller I SAC i use n wai state ar introduce durin dat transfers I XAC i use the tw t thre wai state ar inserte o eac dat transfer Fo norma read plac jumpe a J4 Fo advance read plac jumpe a J3 T determin i you syste wil r an solde th 2 MH crysta a locatio XY1 [ Instal an solde tw 33 oh resistor a location R and R6. [ Instal an solde 68 oh resisto a locatio R8. [ Instal an solde 1 oh resisto a locatio R7. [ݠ Instal an solde fou 3 oh resistor a location R1 R2 R3 an R4. [ݠ Instal an solde tw eigh positio di switche a location S1 an S2 Switc positio on i towar th to o th board [ Instal an solde T t th top. [ Instal 74LS13 i socke locatio Z5 Pi # i t th top. [ݠ Instal 74LS15 i socke locatio Z18 Pi # i t th top. [ Instal a 74LS19 i socke location Z12 an Z13 Pi # i t th top. [ Instal 74LS24 i socke locatio Z22 Pi # i t th top. [ݠ Instal 74LS37 i socke locatio Z23 Pi # i t th top. [ Instal 74LS37 i socke location Z11 an Z14 Pi # i t th top. [ Instal 74LS3  Dip Switch S-2 Di switc S- provide on o eigh boar selec decode A mor LS-10 board ar installe int th system eac boar wil hav differen boar addres (i.e th firs boar wil hav switc positio closedԠ th secon wil hav switc positio close etc. Not tha onl on switc positio o boar shoul b close a time Fo boar #1 clos switc positio an ope switc position 2-8. 3.3 !tolerat a advance ready ru th diagnosti program I i wil ru withou an error the al i probabl ok I yo ge rando error the yo wil hav t selec norma ready (Note Fo mor infomatio refe t th Memor Component ;Handboo fro Inte o th 820 Dynami Ra Controller.) 3.3.3 Refresh Select  {J5-J6-J7 J8-J9-J10 Th 820 controlle ha tw way o providin dynami ra refresh Interna o Externa wth fou pi mole connecto a positio B2. [ݠ Instal an solde single row thre positio jumper bloc a locations J1-J2. [ݠ Instal an solde single row three position jumpe bloc a locations J3-J4. [ Instal an solde doubl ro thre positio jumpe bloc a locatios J5-J7. [ݠ Instal an solde doubl ro thre positio jumpe bloc at locations J8-J10. [ݠ Usin th heatsink an hardwar supplie instal an solde th tw 780 67 i socke locatio Z19 Pi # i t th top. [ݠ Instal DM813 i socke locatio Z20 Pi # i t th top. [ݠ Instal 8203- i socke locatio Z7 Pi # i t th left. [ Instal 3 64 Dynami RAM i socke location Y1-Y32 Pi # i t th top. [ݠ Instal th boar i you syste an remeasur th voltag regulato output t ensur prope operation (Note Neve instal o remov th boar whe powe i applied.) .fo   JUMPER OPTIONS 3.3.1 & Software Power Down Write Protect  J1-J2 I yo ar goin t utiliz th stand-b powe optio t powe th LS-10 boar whe you syste i off the plac jumpe a J2 I yo chos no t us thi optio the plac jumpe a J1 (Note Whe th LS-10 boar i powe "dow writ protected an attemp t rea o writ t th dat transfe por wil caus th CP t loc u unti rese i appl (hidden refresh Bot type ar supporte b th LS-10 board I you processo doe no generat refres signa suc a a 808 the th Interna refres mod wil hav t b selecte b placin jumpe a J5 Howeve man Z8 processo board generat refres signal Unfortunatel th leve an bu pi numbe use fo th refres signa o olde CP board i no wel defined Th LS-10 boar support bot Hig tru an Lo tru refres signa levels I =  [ Jumpe at J2 ;select powe  ;down mode [ Jumpe at J5 ;selec internal   ;refres mode .fo  Page III-3 .pa  3.5 ( SETUP CHART FOR Z80 BASED SYSTEMS  I/O PORT BASE ADDRESS D0H Q 4 - 0 7 H  0 0 0 0 1 0 0 8 - 0 B H 0 0 0 0 1 1 0 C - 0 F H 0 0 0 1 0 0 1 0 - 1 3 H 0 0 0 1 0 1 1 4 - 1 7 H 0 0 0 1 1 0 1 8 - 1 B H 0 0 0 1 1 1 1 C - 1 F H 0 0 1 0 0 0 2 0 - 2 3 H 0 0 1 0 0 1 !2 4 - 2 7 H 0 0 1 0 1 0 u1 Switch Positions Base I/O (0=closed/1=open) &Port Address 1 2 3 4 5 6 -- 1 0 0 0 0 0 8 0 - 8 3 H 1 0 0 0 0 1 8 4 8 7 H  1 0 0 0 1 0 8 8 - 8 B H 1 0 0 0 1 1 8 C - 8 F H 1 0 0 1 0 0 9 0 - 9 3  you processo support Refres ba (lo true the plac jumpe a J7 I you processo support Refres (hig true the plac jumpe a J6 Bu pin 21 65 an 6 hav bee provide fo th refres signal T us bu pi 2 plac jumpe a J10 T us bu pi 6 plac jumpe a J9 T us bu pi 6 plac jumpe a J8 Not tha yo no hav t us th Externa refres mod a th 820 wil provid al refres cycle a required Howeve i th Externa refres mo   POWER DOWN MODE SELECTED   ADVANCED READY SELECTED  (EXTERNAL REFRESH ON BUS PIN 66 HIGH TRUE ,[] Dip Switch S2 Switch position 1 closed  ;select board  Switch positions 2-8 open H;# 1 [] Dip Switch S1 Switch positions 3,5,6 closed ;set base  ,Switch positions 1,2,4 open ;I/O port  GSwitcposition 7, no use ;addres t D0H [ Jumpe at J3 = "2 8 - 2 B H 0 0 1 0 1 1 2 C - 2 F H 0 0 1 1 0 0 3 0 - 3 3 H 0 0 1 1 0 1 3 4 - 3 7 H 0 0 1 1 1 0 3 8 - 3 B H 0 0 1 1 1 1 3 C - 3 F H 0 1 0 0 0 0 4 0 - 4 3 H 0 1 0 0 0 1 4 4 - 4 7 H 0 1 0 0 1 0 4 8 - 4 B H GH 1 0 0 1 0 1 9 4 - 9 7 H 1 0 0 1 1 0 9 8 - 9 B H 1 0 0 1 1 1 9 C - 9 F H 1 0 1 0 0 0 A 0 - A 3 H 1 0 1 0 0 1 A 4 - A 7 H 1 0 1 0 1 0 "A 8 - A B H 1 0 1 0 1 1 A C - A F H 1 0 1 1 0 0 B 0 - B 3 H 1 0 1 1 0 1 Õd i use al dat transfer t an fro th LS-10 wil b a ful processo speed I th Interna refres mod i use the wai state wil b introduce a dat transfer cycles an refres cycle coinside. .fo  Page III-2 .pa .he  Section III 3.4 (SETUP CHART FOR 8080 BASED SYSTEMS  I/O PORT BASE ADDRESS D0H  POWER DOWN MODE SELECTED  N  $;Advance ready [ Jumpe at J2 ;Selec power  ;down mode [] Jumper at J6 ;Refresh  ;high true [ Jumpe at J9 ;Refres signal   ;o bu pi 66 .fo  Page III-4 .pa .he ?C 0 1 0 0 1 1 4 C - 4 F H 0 1 0 1 0 0 5 0 - 5 3 H 0 1 0 1 0 1 5 4 - 5 7 H 0 1 0 1 1 0 5 8 - 5 B H 0 1 0 1 1 1 5 C - 5 F H 0 1 1 0 0 0 6 0 - 6 3 H 0 1 1 0 0 1 6 4 - 6 7 H 0 1 1 0 1 0 6 8 - 6 B H 0 1 1 0 1 1 VK B 4 - B 7 H 1 0 1 1 1 0 B 8 - B B H 1 0 1 1 1 1 B C - B F H 1 1 0 0 0 0 C 0 - C 3 H 1 1 0 0 0 1 C 4 - C 7 H 1 1 0 0 1 0 C 8 - C B H 1 1 0 0 1 1 C C - C F H 1 1 0 1 0 0 D 0 - D 3 H 1 1 0 1 0 1 D 4 - D 7 H 1 1 0 1 1 ORMAL READY SELECTED  INTERNAL REFRESH SELECTED -[ Di Switc S2 Switc positio close ;selec board  Switc position 2- ope I;#1 [ Di Switc S1 Switc position 3,5, close ;set base  Switch positions 1,2,4 open ;I/O port  MSwitc position ,8 no use ;addres to D0H [ݠ Jumper at J4  ;norma ready   .   Section III  Table 3-1 3.6 #I/O Port Addressing S-1  Switch Positions Base I/O (0=closed/1=open) &Port Address 1 2 3 4 5 6 -- 0 0 0 0 0 0 0 0 - 0 3 H 0 0 0 0 0 1 0 ) 6 C - 6 F H 0 1 1 1 0 0 "7 0 - 7 3 H 0 1 1 1 0 1 7 4 - 7 7 H 0 1 1 1 1 0 7 8 - 7 B H 0 1 1 1 1 1 7 C - 7 F H .fo  Page III-5 .PA .he  Section III  Table 3-1  )I/O Port Addressing cont. S-1   = 0 D 8 - D B H 1 1 0 1 1 1 D C - D F H 1 1 1 0 0 0 E 0 - E 3 H 1 1 1 0 0 1 E 4 - E 7 H 1 1 1 0 1 0 E 8 - E B H 1 1 1 0 1 1 E C - E F H 1 1 1 1 0 0 "F 0 - F 3 H 1 1 1 1 0 1 F 4 - F 7 H 1 1 1 1 1 0 F 8 - i  Section IV  SOFTWARE 4.1 DIAGNOSTIC PROGRAM Th diagnosti progra provide mean fo verifyin tha th LS-10 i operational Whe excute th diagnosti progra wil as yo fo th numbe o th LS-10 boar tha i t b tested Th memor tes wil continu t ru unti interrupte b pressin an ke o th consol whic transfer contro t CP/M ma o th memor arra o 0! G G G G G G A> .fo Page IV-1 .PA .he Section IV    SOFTWARE Cont. 4.2 FORMAT PROGRAM Whe powe i firs applie t th LS-10 boar th content o memor will be rando data Befor th boar ca b use i mus firs b formatted forma progra i supplie wit defaul bas I/ por addres o D0H I thi conflict w xo fil ORGe a 100 whil th drive i ORGe jus belo th CC an move t 1000 (b usin DDT) The th drive an relocato progra ar save togethe a on fil wit th SAV command Th actua loa addres o th drive depend o th CP/ syste siz (MSIZE equate a th instal progra move th drive modul fro 1000 t jus belo th CC (CPMB) Afte th drive modul i i place th CP/͠ BIOӠ jum tabl i copie t reserve are withi th  F B H 1 1 1 1 1 1 F C - F F H .fo  Page III-6 .pa .he  Section III 3.7 BATTERY BACK-UP OPTION Th LS-10 provide standb powe optio tha ca b use t provid powe t th LS-10 boar whe th hos compute i turne off Befor th hos compute i turne of th Powe Dow writ protec bi shoul b se t "1 i th MS Addres Registe (Bi .th LS-10 boar wil b displaye afte eac tes pass "G indicate goo memor chi an "B indicate failin memor chip Replac an ba memor chip befor continuing Th diagnosti progra provide ha bas I/ por addres o D0H I thi conflict wit an othe board i you syste th diagnosti progra wil hav t b modified T chang th bas por address edi th diagnosti progra sourc fil DIAG.AS͠ an chang th PBAS equat state ?it an othe board i you syste the th forma progra wil hav t b modified T chang th bas I/ por address edi th forma sourc progra FMAT.AS an chang th PBAS equat statemen t th ne por addres tha yo hav selected Assembl th fil wit AS o an othe compatibl assemble an creat FMAT.CO͠ file Typ FMAT thi wil loa an execut th diagnosti program 4.1.1 -SAMPLE DIAGNOSTIC PROGRAM SESSION A>DIAG   LS-100 MEMORY DIAGNO tomaticall format an the verif th reserve chec su are fo a 80H an th dat are fo a E5H Thi progra dynamicall format th LS-10 Board dependin o th numbe o board i th system Therefor a mor board ar adde t @th syste n furthe softwar change ar required 4.2.1 , SAMPLE FORMAT PROGRAM SESSION A>FMAT  !LS-100 AUTO FORMAT PROGRAM   DIGITAL RESEARCH COMPUTERS   ALL RIGHTS RESER @av t edi th Instal progra an th drive modul an se th followin EQUATE t matc you system B sur tha bot th instal progra (INSTALL.ASM an th drive modul (DRV1.ASM hav th followin identica parameters.  1 PBASE EQU (base I/O port address)  4 MSIZE EQU (size of CP/M in Kilobytes)  y DRVID EQU (drive # 1-15) Afte yo hav assemble th drive an th instal progra lis th th M  3.8 STATUS LED INDICATORS Th LS-10 ha tw LE statu indicator locate a th to lef cente o th board DSP- i th acces indicato an i onl o durin th actua dat rea an writ transfe cycles DSP- i th boar selec indicato an wil sta o a lon a th boar i selected Thes LED provid quic visua chec fo prope boar addressin an operation. .fo  Page III-7 .pa .HE STIC PROGRAM   DIGITAL RESEARCH COMPUTERS   ALL RIGHTS RESERVED   COPYRIGHT 1983   VER. 1.0 ENTER NUMBER OF BOARD TO TEST (1-8): 1 PRESS ANY KEY TO EXIT TO CP/M TEST RESULTS FOR BOARD 1 PASS NUMBER 0001H  DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BANK-1 G G G G G G G G BANK-2 G G G G G G G G BANK-3 G G G G G G G G BANK-4 G G uVED   COPYRIGHT 1983  IVER. 1.0 FORMATTING 1 LS-100 BOARD(S) VERIFYING FORMAT DONE A> .fo Page IV-2 .pa .he  Section IV   SOFTWARE Cont. 4.3 INSTALL PROGRAM Th Instal progra i actuall tw program combine int one relocato progra an th drive program Th relocato progra i CP/ c2sINSTALL.PR fil an obtai th valu o DRV i.e fo 60 CP/ SYSTE DRV1=D000H Loa th instal modul wit DD a follows DD INSTALL.HEX thi wil loa th Instal he fil a 100H Nex usin th he caculato i DD fin th offse o th drive modul fro 0H H0,(valu fo DRV1) Ad 100 he t thi valu an us thi offse a follows IDRV1.HEX ;ad1000Ƞtoffset (3000H+1000=4000H) IDRV1.HEX 5 ;prepare to read in driver module R,4000H 1 ;read with offset to place at 1000H G0 #;exit DDT SAVŠ1 INSTALL.COMRduce memor pointe a location an 7 Thi ma caus problem wit som BIO routine tha suppor densit change i th war boo routine T eliminat thi typ o proble w sugges tha th LS-10 drive modul b integrate int you BIOS  4.4.1 /SAMPLE INSTALL PROGRAM SESSION A>INSTALL  LS-100 AUTO INSTALL PROGRAM   DIGITAL RESEARCH COMPUTERS   ALL RIGHTS RESERVED    Page V-1 .pa .he  Section VI 6.1 % LS-100 I/O PORT REGISTER DESCRIPTION Contro젠 o th LS-10 boar i don堠 throug蠠 fou consecutiv I/ ports Thei operatio i described a follow : REGISTER- DAT TRANSFER POR (8 BITS) READ/WRITE REGISTER- MS ADDRES REGISTER (k7 BITS) WRIT ONLY REGISTER- LS ADDRES REGISTER (8 BITS) WRIT ONLY REGISTIlxi DD an the typ SAVŠ 1 INSTALL.CO t sav th Instal progra o th logge i drive. .fo Page IV-3 .pa .he Section IV  Install program cont. T execut th Instal progra typ INSTALL Th instal progra wil searc fo th numbe o LS-10 board i you syste an dynamicall instal th correc driv paramete bloc base o th numbe o board3 .fo Page IV-5 .pa .he  Section V 5.1 HOW TO USE THE LS-100 Ever tim powe i applie t th LS-10 boar i mus firs b formatte befor yo ca us i a dis driv emulator T forma th LS-10 ru th forma prE8ER- BYT LOCATIO REGISTER (7 BITS) WRIT ONLY 16.1.1 REGISTER- DAT TRANSFER POR  (BAS ADDRESS+0) Th dat por provide th mean fo transferrin dat betwee th hos compute an th LS-10 board Dat i transferre䠠 b usin砠 th processor inpu an䠠 outpu instructions Readin砠 o wxritin t th dat por als automaticall increment th byt locatio addres registe b one addressin _ i th system automaticall increasin th amoun o storag provided (Se Tabl 1-1) Therefor a mor board ar adde t th syste n furthe softwar change ar required Th drive modul contain chec su routin whic calculate chec byt fo eac 12 byt pag o "sector tha i writte t an rea fro th LS-10 boards I chec su erro occur a erro messag i displaye reportin whic boar th erro occure on Thi typ  r point Unfortunatel som program ma ignor th to o memor pointe an overwrit th drive module I thi happens syste cras i inevitable Othe problem aris whe certai program d direc dis I/ throug th BIO jum tabl instea o usin th CP/ functio calls Suc program ar fas dis copiers Thes type o program wil no functio properl a th LS-10 forma i differen fro tha o flopp disk Us PI in ogra FMAԠ b typin FMAT Assumin al wen wel th nex ste i t instal th softwar drive fo th LS-100 T instal th drive ru th instal progra b typin INSTALL Th instal progra a supplie install th LS-10 boar o board a driv E Lo o t driv an us th DI comman t loo a th directory Ther shoul b n file present Us PI t cop tex fil t th LS-10 usin th verif option (i.e PI E:=A:TEST.TXT[V]  > th nex byt withi th 12 byt pag o "sector". 36.1.2 REGISTER-1 MSB ADDRESS REGISTER  (BASE ADDRESS+1) Registe on i seve bi writ onl registe an provide th mos significan addres an powe dow mod selection Bi o thi registe i no use an i no connected Bi whe se t on select th powep dow writ protec mode Bit - ar addres bit A2 - A1 an provid on o eigh boar decode  o erro i mos probabl cause b failin memor chip I thi happen i i recommende tha th diagnosti progra b ru o th failin boar t locat th memor chi tha i havin problems  $ Customizing the Install program  (This is for a 60K CP/M system) Edit both DRV1.ASM, and INSTALL.ASM and set MSIZE=60 (Note: the default drive ID is drive E and the default  7base I/O port address is D0H) Assemble DRV1, and stea t cop file fro driv t driv an thes problem wil b eliminated Als not tha cop o CP/ doe no resid o th reserve track a wit flopp dis drives Instead thi are ha bee reserve fo th chec su bytes T ge aroun th proble o war bootin fro th emulate drive th Drive progra modifie th war boo routin t jum t th CCР whic wil lo i th emulate driv withou re-readin i CP/ a th CCР shoul b protecte b th reno us th TYP comman t lis th tex file Not tha no onl i th LS-10 faste bu i i als silen i operation Nex assembl som program notin th spee a whic the execute Dependin o th numbe o dis accesses th executio spee improvemen ca b fro t 1 time faste tha tha o flopp dis drive an typical twic a fas a mos har dis drives Th LS-10 provide a econimica mean of increasing syste performance .fo  m஠ Bit - ar addres bit A1 - A1 an provide on o fou ban decode Bi i addres bi A1 o th memor arra o th LS-10 board Th CP dat bu i no drive whe readin fro thi register. .fo Page VI-1 .PA  $ I/O port register description cont. 46.1.3 REGISTER-2 LSB ADDRESS REGISTER  j(BASE ADDRESS+2) Registe tw i a eigh bi writ onl register Bit - ar memor addres t integrat th LS-10 drive modul directl int th BIOS DRVI i Equate t th numbe o th driv tha th LS-10 ;boar wil emulate Thi shoul b th nex logica driv i ;you system Fo driv syste DRVI woul =b se t 0 fo ;driv C ; DRVID EQU (01-15) g;DRIVE ID. (B-P) ; ; The following equates define the LS-100 hardware ; PBASE EQU 0D0H 6 ;DEFAULT BASE PORT ADDRESS REG0 EQU PBASE ;DATA TRANSy . ;CONTINUES  .  RET *;NORMAL RETURN ; SCTRL2: MOV H,B ;TRANSLATION  MOV L,C ;NOT REQUIRED  ; F8E5 215DF9 LXI H,MESG1 ;HL @ ERROR MESSAGE F8E8 7E #SMESG: MOV A,M ;GET DATA F8E9 B7 ORA A ;CHEC T ADDRESS 00D0 = - REG0 EQU PBASE ;DATA TRANSFER PORT 00D1 = . REG1 EQU PBASE+1 ;MSB ADDRESS LATCH 00D2 = . REG2 EQU PBASE+2 ;LSB ADDRESS LATCH 00D3 = ; REG3 EQU PBASE+3 ;BYTE LOCATION ADDRESS COUNTERS 0080 = NBYTES EQU 128 ;BYTES/SECTOR  ;  ;START OF DRIVER  ; F800 & ORG DRV2 ;START OF DRIVER F800 42 $ DB DRVLD ;DRIVER ID BYTE F801 00 DB 0 F802 00 DW 0,0 ;6 BYTE OFFSET  N3K F855 1000 DW 16 ;SECTORS/TRACK F857 04  DB 4 ;BLOCK SHIFT F858 0F  DB 15 ;BLOCK MASK F859 01 j DB 1 ;EXTNT MASK F85A FD00 DW 253 ;SIZE-1 F85C 7F00 DW 127 ;MAX. DIR. ENTRYS F85E C0  DB 192 ;ALLOC0 F85F 00 [ DB 0 ;ALLOC1 F860 0000 DW 0 ;CHECK SIZE F862 0200 DW 2 ;OFFSET 0000 =  XLT0: EQU 0 ;NOT REQUIRED  ;  ;DRIVER ROUTINES  "; F864 C327F8 WBOOT: JMP WBOO INE  r; F89E CD57F9 SCTRL: CALL CHK ;CHECK FOR LS-100 F8A1 C242F8 JNZ SCTRL2 ;IF NOT JUMP TO BIOS F8A4 60 , MOV H,B ;NO TRANLASTION REQUIRED F8A5 69  MOV L,C ;SET HL=BC F8A6 C9  RET  ;  ;LS-100 SECTOR READ ROUTINE  ; F8A7 CD57F9 RDE: CALL CHK ;CHECK FOR LS-100 F8AA C239F8 JNZ RDE2 ;IF NOT JUMP TO BIOS F8AD CD32F9 CALL SETUP ;SET UP LS-100 REGS. F8B0 DBD0 RDLP: IN REG0 ;GET DATA cEK FOR END OF MESSAGE F8EA CAF7F8 JZ EXIT ;EXIT IF SO F8ED 4F ( MOV C,A ;SETUP FOR BIOS CALL F8EE E5 L PUSH H ;SAVE POINTER F8EF CD0CEA CALL CONOUT ;OUTPUT BYTE F8F2 E1 " POP H ;RESTORE POINTER F8F3 23 O INX H ;BUMP POINTER F8F4 C3E8F8 JMP SMESG ;LOOP UNTIL END OF MESSAGE  ;  #;SET DEFAULT DRIVE TO A AND ABORT  ; F8F7 AF EXIT: XRA A ;CLEAR A F8F8 4F & MOV C,A ;SET TO DRIVE A F8F9 32040 5F806 C306DC BDOS1: JMP BDOS ;LINK TO BDOS ENTRY  ;  ;DRIVER BIOS JUMP TABLE  ; F809 C364F8 WBOOT1: JMP WBOOT ;WARM BOOT F80C C367F8 HOME1: JMP HOME ;HOME F80F C372F8 SLDSK1: JMP SLDSK ;SELECT DISK F812 C380F8 STRK1: JMP STRK ;SET TRACK F815 C38BF8 SSEC1: JMP SSEC ;SET SECTOR F818 C396F8 SDMA1: JMP SDMA ;SET DMA ADDRESS F81B C3A7F8 RDE1: JMP RDE ;READ SECTOR F81E C317F9 WRE1: JMP WRE ;WRITE SECTOR F821 C33FFT2 ;READ IN CCP & BDOS    ;  ;HOME ROUTINE  p; F867 CD57F9 HOME: CALL CHK ;CHECK FOR LS-100 F86A C22AF8 JNZ HOME2 ;IF NOT JUMP TO BIOS F86D AF E XRA A ;CLEAR A F86E 32A5F9 STA TRK ;SET TO TRACK 0 F871 C9  RET  ;  ;SELECT DISK ROUTINE  ; F872 79 lSLDSK: MOV A,C ;GET DRIVE # F873 32A4F9 STA UNIT ;SAVE IT F876 3E04 MVI A,DRVID ;GET ACTIVE FROM LS-100 F8B2 77  MOV M,A ;STORE @ HL F8B3 83 $ ADD E ;COMPUTE CHECK SUM F8B4 5F . MOV E,A ;ACCUMULATE CHECK SUM IN E F8B5 23  INX H ;BUMP POINTER F8B6 05 DCR B ;DECREMENT BYTE COUNT F8B7 C2B0F8 JNZ RDLP ;LOOP UNTIL ZERO F8BA CD44F9 CALL CALC ;SET ADDRESS OF CHECK SUM BYTE F8BD DBD0 IN REG0 ;GET CHECK SUM BYTE F8BF 93 # SUB E ;CHECK FOR ERROR F8C0 C8  RZ ;RETURN IF NO ERROR  ;  H0 STA 4 ;SET TO DRIVE A F8FC C30000 JMP 0 ;RETURN TO CP/M  ;  ;;CONVERT HEX BYTE IN A. RETURN TWO HEX ASCII CHARS. IN HL  ; F8FF F5 CNVHX: PUSH PSW F900 0F  RRC F901 0F  RRC F902 0F  RRC F903 0F + RRC F904 CD0EF9 CALL HASCI F907 6F  MOV L,A F908 F1 / POP PSW F909 CD0EF9 CALL HASCI F90C 67  MOV H,A F90D C9 6 RET F90E E60F HASCI: ANI 0FH F910 C690 U XRA A ;CLEAR A/CARRY FLAG F948 D3D2 OUT REG2 ;SET TO TRACK 0 F94A 7E & MOV A,M ;GET CURRENT TRACK F94B 07 RLC ;MOD 128 F94C D253F9 JNC SKP1 ;JUMP IF <128 F94F 3E01 MVI A,1 ;SET TO TRACK 1 F951 D3D2 OUT REG2 ;UPDATE LSB ADDRESS LATCH F953 7E iSKP1: MOV A,M ;RESTORE TRACK # F954 D3D3 OUT REG3 ;SET BYTE LOCATION ADDRESS COUNTERS F956 C9  RET  ;  /;CHECK THE CURRENT DRIVE BYTE FOR LS-100  ADI 90H F912 27 ( DAA F913 CE40 ACI 40H F915 27  DAA F916 C9 RET  ;  ;LS-100 SECTOR WRITE ROUTINE  ; F917 CD57F9 WRE: CALL CHK ;CHECK FOR LS-100 F91A C23CF8 JNZ WRE2 ;IF NOT JUMP TO BIOS F91D CD32F9 CALL SETUP ;SET UP LS-100 REGS. F920 7E ZWRLP: MOV A,M ;GET DATA FROM MEMY. @ HL F921 D3D0 OUT REG0 ;STORE DATA F923 83 $ ADD E ;COMPUTE CHECK SUM F924 5F  MOV E,A ;ACC } ; F957 3AA4F9 CHK: LDA UNIT ;GET DRIVE # F95A FE04 CPI DRVID ;Z=0 DRIVE ACTIVE/Z=1 DRIVE NOT ACTIVE F95C C9  RET    ;  ;MESSAGE AREA  l; F95D 0A0D MESG1: DW 0D0AH F95F 434845434B DB 'CHECK SUM ERROR OCCURED ON LS-100 BOARD ' F987 00 nBDBRD: DB 0 F988 0A0D DW 0D0AH F98A 4154205452 DB 'AT TRACK ' F993 0000 BDTRK: DW 0 F995 48 - DB 'H' F996 2053454354 DB ' SECTOR ' F99& :10F800004200gC306DCC364F8C367F8C30D :10F8100072F8C380F8C38BF8C396F8C3A7F8C31770 :07F82000F9C33FF8C39EF895 :10F845 000A9F955F869FA29FA3E :10F855001000040F01FD007F00C00200C37E :10F8650027F8CD57F9C22AF8AF32A5F9C97932A4DC :10F87500F93E04B9C22DF82145F8C9CD57F9C23072 :10F88500F87932A5F9C9CD57F9C233F87932A6F915 :10F89500C9606922A7F9C336F8CD57F9C242F860A5 :10F8A50069C9CD57F9C239F8CD32F9DBD077835F15 :10F8B5002305C2B0F8CD;44F9DBD093C83AA5F9CDFC :10F8C500FFF82293F93AA6F9CDFFF8229E k UMULATE CHECK SUM IN E F925 23  INX H ;BUMP POINTER F926 05 DCR B ;DECREMENT BYTE COUNT F927 C220F9 JNZ WRLP ;LOOP UNTIL ZERO F92A CD44F9 CALL CALC ;SET ADDRESS OF CHECK SUM BYTE F92D 7B Y MOV A,E ;GET CHECK SUM BYTE F92E D3D0 OUT REG0 ;STORE CHECK SUM BYTE F930 AF XRA A ;NORMAL RETURN F931 C9  RET  ;  5;SETUP LS-100 REGS. BASED ON CURRENT TRACK & SECTOR  "; F932 3AA5F9 SETUP: LDA TRK  -"E 0000 BDSCTR: DW 0 F9A0 48 , DB 'H' F9A1 0A0D DW 0D0AH F9A3 00  DB 0  ;  ;  ;LOCAL STORAGE MUST BE IN RAM  ; F9A4 " UNIT: DS 1 ;CURRENT DRIVE F9A5 ! TRK: DS 1 ;CURRENT TRACK F9A6 " SEC: DS 1 ;CURRENT SECTOR F9A7 & TADDR: DS 2 ;TRANSFER ADDRESS F9A9 0 DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER FA29 * ALV0: DS 64 ;ALLOCATION VECTOR FA69 00 CSV0: hF9063101 :10F8D5003AA6F9D608DAE1F804C3D8F8783287F9F8 :10F8E500215DF97EB7CAF7F84FE5CD0CEAE123C3F0 :10F8F500E8F8AF4F320400C30000F50F0F0F0FCD2E :10F905000EF96FF1CD0EF967C9E60FC69027CE4007 :10F9150027C9CD57F9C23CF8CD32F97ED3D0835FE4 :10F925002305C220F9CD44F97BD3D0AFC93AA5F957 :10F93500D3D23AA6F9D3D12AA7F906801E00C92148 :10F94500A5F9AFD3D27E07D253F93E01D3D27ED3E8 :10F95500D3C93AA4F9FE04C90A0D434845434B20CF :10F9650053554D204552524F52204F434355524512 :10F9750044204F4E204C532D31303020424F4152C0 :10F985   ;GET CURRENT TRACK # F935 D3D2 OUT REG2 ;SET LSB ADDRESS LATCH F937 3AA6F9 LDA SEC ;GET CURRENT SECTOR # F93A D3D1 OUT REG1 ;SET MSB ADDRESS LATCH F93C 2AA7F9 LHLD TADDR ;HL=DMA POINTER F93F 0680 MVI B,NBYTES ;B=BFYTES/SECTOR F941 1E00 MVI E,0 ;CLEAR CHECK SUM BYTE F943 C9  RET  ;  ;;COMPUTE ADDRESS FOR CHECK SUM BYTE & SET UP LS-100 REGS.  ?; F944 21A5F9 CALC: LXI H,TRK ;HL @ TRACK # F947 AF  DB 0 ;CHECK SUM VECTOR FA6A  END ( ;  ;LOCAL STORAGE MUST BE IN RAM  ; F9A4 " UNIT: DS 1 ;CURRENT DRIVE F9A5 ! TRK: DS 1 ;CURRENT TRACK F9A6 " SEC: DS 1 ;CURRENT SECTOR F9A7 & TADDR: DS 2 ;TRANSFER ADDRESS F9A9 0 DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER FA29 * ALV0: DS 64 ;ALLOCATION VECTOR FA69 00 CSV0:ga004420000A0D415420545241434B200000AD :0FF995004820534543544F52200000480A0D00AC :01FA6900009C :00  0F50FCD2E :10F905000EF96FF1CD0EF967C9E60FC69027CE4007 :10F9150027C9CD57F9C23CF8CD32F97ED3D0835FE4 :10F925002305C220F9CD44F97BD3D0AFC93AA5F957 :10F93500D3D23AA6F9D3D12AA7F906801E00C92148 :10F94500A5F9AFD3D27E07D253F93E01D3D27ED3E8 :10F95500D3C93AA4F9FE04Cv90A0D434845434B20CF :10F9650053554D204552524F52204F434355524512 :10F9750044204F4E204C532D31303020424F4152C0 :10F985o ;ADDRESS OF BIOS  $BDOS EQU 0DC06H ;ADDRESS OF BDOS  $CPMB EQU BDOS-806H ;ADDRESS OF CCP   ENDIF  ;  ;  ; D000 = / DRV1 EQU CPMB-1024 ;ADDRESS OF DRIVER 0004 = + DRVID EQU 04 ;ACTIVE DRIVE # (E) 0041 = , DRVLD EQU 41H ;DRIVER LOADED FLAG 000F = 3 TABSZ EQU 0FH ;SIZE OF DRIVE TABLE ENTRY D055 = 0 DPB EQU DRV1+55H ;ADDRESS OF DISK PARM. BLOCK  ;  R. 0119 7C  MOV A,H ;A=H 011A BA Q CMP D ;CHECK MSB 011B C23401 JNZ MAIN ;LOAD DRIVER IF NOT EQU. 011E 7D  MOV A,L ;A=L 011F BB CMP E ;CHECK LSB 0120 C23401 JNZ MAIN ;LOAD DRIVER IF NOT EQU. 0123 3A00D0 LDA DRV1 ;TPA IS REDUCED CORRECT AMOUNT 0126 FE41 CPI DRVLD ;CHECK ID BYTE TO SEE IF DRIVER IS THERE 0128 C23401 JNZ MAIN ;LOAD DRIVER IF NOT 012TB 119703 LXI D,MESG3 ;DRIVER ALL-READY LOADED 012E CD2002 CALL SMESG ;DIST UNUSED ENTRIES 0179 19 DAD D ;ADJUST HL 017A 112AD0 LXI D,DRV1+2AH ;DE=DEST. 017D 011B00 LXI B,1BH ;# OF BYTES 0180 CDFA01 CALL MOVIT ;COPY HOME-SECTOR TRANSLATE  ;  .;COPY DRIVER JUMP TABLE INTO BIOS JUMP TABLE  ; 0183 2109D0 MOV2B: LXI H,DRV1+9 ;HL=DRIVER BIOS 0186 1103EA LXI D,BIOS+3 ;DE=DEST. 0189 010300 LXI B,3 ;# OF BYTES 018C CDFA01 CALL MOVIT ;COPY WARM BOOT 018F 1118EA LXI D,BIOS+18H ;SKI ;BOARD EQUATES  ; 00C0 = , PBASE EQU 0C0H ;BASE PORT ADDRESS 00C0 = - REG0 EQU PBASE ;DATA TRANSFER PORT 00C1 = . REG1 EQU PBASE+1 ;MSB ADDRESS LATCH 00C2 = . REG2 EQU PBASE+2 ;LSB ADDRESS LATCH 00C3 = , REG3 EQU PBASE+3 ;BYTE LOCATION COUNTERS  ;  ; TO CREATE REL.COM  ; ASM INSTALL ;MAKE HEX FILE  ; ASM DRV1 ;MAKE HEX FILE  !; DDT INSTALL.HEX ;READ IN RELOCx6SPLAY MESSAGE 0131 C30000 JMP 0 ;EXIT TO CP/M  ;  ;CHECK CP/M VER. #  ; 0134 0E0C MAIN: MVI C,0CH ;VERSION FUNC. 0136 CD0500 CALL 5 0139 FE20 CPI 20H ;CHECK FOR 2.0 OR BETTER 013B D24701 JNC VEROK 013E 11A903 LXI D,MESG4 ;WRONG VERSION 0141 CD2002 CALL SMESG 0144 C30000 JMP 0 ;ABORT  ;  (;CHECK FOR PROPER BDOS MEMORY LOCATION  ; 0147 1106DC VEROK: LXI D,zP PAST UNUSED ENTRIES 0192 011B00 LXI B,1BH ;# OF BYTES 0195 CDFA01 CALL MOVIT ;COPY HOME-SECTOR TRANSLATE  ;  =; FILL IN DISK PRAMTER BLOCK BASED ON # OF BOARDS IN SYSTEM  ; 0198 11C703 LXI D,MESG5 019B CD2002 CALL SMESG 019E 3A6304 LDA NUMBD 01A1 212502 LXI H,DRVTAB ;HL@ DRIVE TABLE 01A4 3D | DCR A ;MAKE RELATIVE 0 01A5 CAB001 JZ CALC2 ;SKIP IF ONLY 1 BOARD 01A8 110F00 LXI D,TABSZ ;DE=SIZE OF TABLE  l    ;PROGRAM INSTALL.ASM  #;LS-100 DRIVER RELOCATOR PROGRAM  ;BY RVA  ;LAST CHANGE  ;6/27/83  ;COPYRIGHT 1983  ;DIGITAL RESEARCH COMPUTERS  ;ALL RIGHTS RESERVED  ; FFFF = * TRUE EQU 0FFFFH ;VALUE FOR TRUE 0000 = & FALSE EQU NOT TRUE ;VALUE FOR FALSE  ; FFFF = 0 STND EQU TRUE ;SET TO TRUE FOR STANDARD CP/M  ATOR  3; H0,(ADDRESS OF DRV1) ;GET DRIVER OFFSET FROM 0H  ; ;ADD 1000H TO DIFF.  /; IDRV1.HEX ;SET UP TO READ IN LS-100 DRIVER  6; R(FINAL OFFSET) ;READ DRVIER INTO MEMORY AT 1000H  ; G0 ;EXIT DDT  3; SAVE 17 INSTALL.COM ;SAVE RELOCATOR AND DRIVER  ;  ; 0100 Q ORG 0100H ;MAKE COM FILE 0100 317804 LXI SP,STACK ;SET UP SYSTEM STACK  ;    8LBDOS ;GET EQUATED VALUE 014A 210600 LXI H,6 ;HL=BDOS ENTRY 014D 7B  MOV A,E ;A=LSB 014E BE B CMP M ;CHECK 014F C21702 JNZ ERR3 ;REPORT ERROR 0152 23  INX H ;BUMP POINTER 0153 7A  MOV A,D ;A=MSB 0154 BE : CMP M ;CHECK 0155 C21702 JNZ ERR3 ;REPORT ERROR  ;  ;MOVE DRIVER BELOW CCP  r; 0158 119D02 LXI D,MESG1 ;SIGN ON 015B CD2002 CALL SMESG 015E 210010 MOV1: LXI H,1000H ;HL=SOU  01AB 19 )CALC1: DAD D ;INDEX INTO TABLE 01AC 3D DCR A ;DECREMENT A 01AD C2AB01 JNZ CALC1 ;UNTIL A=0 01B0 1155D0 CALC2: LXI D,DPB ;HL=SOURCE/DE=DEST. 01B3 010F00 LXI B,TABSZ ;BC=LENGTH 01B6 CDFA01 CALL MOVIT ;MOVE INTO POSTION  ;  ;END OF MAIN PROGRAM  ^; 01B9 118203 LXI D,MESG2 ;DONE 01BC CD2002 CALL SMESG 01BF C30000 JMP 0  ;  $;FIND # OF BOARDS IN SYSTEM   0000 = 5 OFST EQU FALSE ;SET TO TRUE FOR NON-STANDARD CP/M  ;   IF STND 003C = / MSIZE EQU 60 ;CP/M SIZE IN KILOBYTES A000 = ) CBASE EQU (MSIZE-20)*1024 ;BIAS D400 = 3 CPMB EQU CBASE+3400H ;BASE ADDRESS OF CCP DC06 = * BDOS EQU CBASE+3C06H ;BDOS ENTRY EA00 =  BIOS EQU CBASE+4A00H ;BIOS   ENDIF  ;  ;  ;  IF OFST  BIOS EQU 0EA00H) ;CHECK FOR # OF BOARDS IN SYSTEM  :; 0103 CDC201 CALL FIND ;FIND # OF BOARDS 0106 79  MOV A,C ;PUT IN A 0107 B7 ORA A ;SET FLAGS 0108 CA0502 JZ ERR1 ;CAN'T BE 0 010B 326304 STA NUMBD ;SAVE COUNT 010E C630 ADI 30H ;MAKE ASCII 0110 32DE03 STA BDS ;PUT IN MESSAGE  ;  ;SEE IF DRIVER IS LOADED  ]; 0113 1106D0 LXI D,DRV1+6 ;DE=BASE OF DRIVER+6 0116 2A0600 LHLD 6 ;GET CCP ADDRCE OF DRIVER 0161 1100D0 LXI D,DRV1 ;DE=DEST. OF DRIVER 0164 010004 LXI B,1024 ;BC=LENGTH OF DRIVER 0167 CDFA01 CALL MOVIT ;MOVE INTO POSTION  ;  4;COPY BIOS JUMP TABLE TO RELOCATED BIOS JUMP TABLE  ; 016A 2103EA MOV2A: LXI H,BIOS+3 ;HL=BIOS JUMP TABLE 016D 1127D0 LXI D,DRV1+27H ;DE=RELOCATED BIOS JUMP TABLE 0170 010300 LXI B,3 ;# OF BYTES 0173 CDFA01 CALL MOVIT ;COPY WARM BOOT 0176 111200 LXI D,12H ;SKIP PAR ; 01C2 AF FIND: XRA A ;CLEAR A 01C3 47  MOV B,A ;" " B 01C4 4F MOV C,A ;" " C 01C5 D3C2 OUT REG2 ;CLEAR LSB LATCH 01C7 D3C1 FIND1: OUT REG1 ;SET MSB LATCH 01C9 CDDA01 CALL TEST ;CHECK FOR A BOARD 01CC C0 , RNZ ;RETURN WHEN NO BOARD FOUND 01CD 78 MOV A,B ;B=SECTORS/BOARD 01CE C608 ADI 08 ;ADD BOARD OFFSET 01D0 FE40 CPI 40H ;CHECK FOR OVERFLOW 01D2 CA0E02 JZ ERR2 ;REPORT ERROR 01D5 47  MO DS FOUND  [; 0205 11F203 ERR1: LXI D,MESG6 0208 CD2002 CALL SMESG 020B C30000 JMP 0  ;  ;TO MANY MEMORY BOARDS FOUND  [; 020E 110404 ERR2: LXI D,MESG7 0211 CD2002 CALL SMESG 0214 C30000 JMP 0  ;  (;BDOS VALUE NOT EQUAL TO EQUATED VALUE  [; 0217 112A04 ERR3: LXI D,MESG8 021A CD2002 CALL SMESG 021D C30000 JMP 0  ;  ;SEND  MASK 0256 03 v DB 3 ;EXTNT. MASK 0257 FD00 DW 253 ;DISK SIZE-1 0259 FF00 DW 255 ;MAX. DIRECTORY ENTRIES 025B C0  DB 192 ;ALLOC0 025C 00 T DB 0 ;ALLOC1 025D 0000 DW 0 ;CHECK SIZE 025F 0200 DW 2 ;OFFSET  8; 0261 2800 DPB4: DW 40 ;SECTORS/TRACK 0263 06  DB 6 ;BLOCK SHIFT 0264 3F  DB 63 ;BLOCK MASK 0265 07 [ DB 7 ;EXTNT. MASK 0266 9D00 DW 157 ;DISK SIZE-1 0268 FF01 DW 511 ;MAX. |TUTO INSTALL PROGRAM' 02CE 0A0D DW 0D0AH 02D0 0A0D DW 0D0AH 02D2 20 DB ' @ DIGITAL REASEARCH COMPUTERS' 0300 0A0D DW 0D0AH 0302 20 DB ' 9 ALL RIGHTS RESERVED' 032C 0A0D DW 0D0AH 032E 20 DB ' 2COPYRIGHT 1983' 0356 0A0D DW 0D0AH 0358 20 DB ' J VER. 1.0' 037D 0A0D DW 0D0AH 037F 0A0D DW 0D0AH 0381 24  DB '$' 0382 0A0D 7V B,A ;RESULTS IN B 01D6 0C M INR C ;INCREMENT BOARD COUNTER 01D7 C3C701 JMP FIND1 ;KEEP LOOKING  ;  ;NON-DESTRUCTIVE BYTE TEST  q; 01DA CDF501 TEST: CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01DD DBC0 IN REG0 ;READ DATA 01DF 57 MOV D,A ;SAVE IN D 01E0 CDF501 CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01E3 3E55 MVI A,55H ;GET TEST BYTE 01E5 D3C0 OUT REG0 ;WRITE IT 01E7 CDF501 CALL RESET ;CLEAMESSAGE @DE TO CON.  =; 0220 0E09 SMESG: MVI C,09H 0222 C30500 JMP 5  ;  ;DISK DRIVE PRAMETER TABLES  ; 0225 =  DRVTAB: EQU $  7; 0225 0800 DPB0: DW 8 ;SECTORS/TRACK 0227 04  DB 4 ;BLOCK SHIFT 0228 0F  DB 15 ;BLOCK MASK 0229 01 v DB 1 ;EXTNT. MASK 022A 7E00 DW 126 ;DISK SIZE-1 022C 7F00 DW 127 ;MAX. DIRECTORY ENTRIES 022E C0  DB 192 ;ALLOC0 02RDIRECTORY ENTRIES 026A C0  DB 192 ;ALLOC0 026B 00 T DB 0 ;ALLOC1 026C 0000 DW 0 ;CHECK SIZE 026E 0200 DW 2 ;OFFSET  8; 0270 3000 DPB5: DW 48 ;SECTORS/TRACK 0272 06  DB 6 ;BLOCK SHIFT 0273 3F  DB 63 ;BLOCK MASK 0274 07 v DB 7 ;EXTNT. MASK 0275 BD00 DW 189 ;DISK SIZE-1 0277 FF01 DW 511 ;MAX. DIRECTORY ENTRIES 0279 C0  DB 192 ;ALLOC0 027A 00 - DB 0 ;ALLOC1 027B 0000 DW 0 ;CHECK~V MESG2: DW 0D0AH 0384 0A0D DW 0D0AH 0386 4452495645 DB 'DRIVE ' 038C 45 Q DB DRVID+41H 038D 2041435449 DB ' ACTIVE' 0394 0A0D DW 0D0AH 0396 24 s DB '$' 0397 0A0D MESG3: DW 0D0AH 0399 4452495645 DB 'DRIVER ACTIVE' 03A6 0A0D DW 0D0AH 03A8 24 e DB '$' 03A9 43502F4D20MESG4: DB 'CP/M 2.0 OR BETTER REQUIRED' 03C4 0A0D DW 0D0AH 03C6 24 a DB '$' 03C7 0A0D MESG5: DW 0D0AH 03C9 4452495645 DB 'DRIVER INSTALLED FOR ' 03DE  yR BYTE LOCATION ADDRESS 01EA DBC0 IN REG0 ;READ DATA BACK 01EC FE55 CPI 55H ;CHECK FOR TEST BYTE 01EE CDF501 CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01F1 7A O MOV A,D ;GET ORGINAL DATA 01F2 D3C0 OUT REG0 ;RESTORE DATA 01F4 C9  RET  ;  ;RESET BYTE ADDRESS COUNTERS  w; 01F5 3E00 RESET: MVI A,0 ;CLEAR A/SAVE FLAGS 01F7 D3C3 OUT REG3 ;SET BYTE LOCATION ADDRESS 01F9 C9  RET   ?2F 00 T DB 0 ;ALLOC1 0230 0000 DW 0 ;CHECK SIZE 0232 0200 DW 2 ;OFFSET  8; 0234 1000 DPB1: DW 16 ;SECTORS/TRACK 0236 04  DB 4 ;BLOCK SHIFT 0237 0F  DB 15 ;BLOCK MASK 0238 01 v DB 1 ;EXTNT. MASK 0239 FD00 DW 253 ;DISK SIZE-1 023B 7F00 DW 127 ;MAX. DIRECTORY ENTRIES 023D C0  DB 192 ;ALLOC0 023E 00 T DB 0 ;ALLOC1 023F 0000 DW 0 ;CHECK SIZE 0241 0200 DW 2 ;OFFSET  ; @' SIZE 027D 0200 DW 2 ;OFFSET  8; 027F 3800 DPB6: DW 56 ;SECTORS/TRACK 0281 06  DB 6 ;BLOCK SHIFT 0282 3F  DB 63 ;BLOCK MASK 0283 07 w DB 7 ;EXTNT. MASK 0284 DD00 DW 221 ;DISK SIZE-1 0286 FF03 DW 1023 ;MAX. DIRECTORY ENTRIES 0288 F0  DB 240 ;ALLOC0 0289 00 T DB 0 ;ALLOC1 028A 0000 DW 0 ;CHECK SIZE 028C 0200 DW 2 ;OFFSET  :; 028E 4000 DPB7: DW 64 ;SECTORS/TRACK 0290 06  U\ BDS: DS 1 03DF 204C532D31 DB ' LS-100 BOARD(S)' 03EF 0A0D DW 0D0AH 03F1 24 Y DB '$' 03F2 4E4F20424FMESG6: DB 'NO BOARDS FOUND' 0401 0A0D DW 0D0AH 0403 24 m DB '$' 0404 4E554D4245MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMIT' 0427 0A0D DW 0D0AH 0429 24 DB '$' 042A 52454C4F43MESG8: DB 'RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE' 0460 0A0D DW 0D0AH 0462 24  DB '$' 0463 % NUMBD: DS 1 ;NUMBER OF BOARDS FOUND 1 ;  ;BLOCK MOVE ROUTINE  ;HL=SOURCE/DE=DEST./BC=COUNT  ; 01FA 7E #MOVIT: MOV A,M ;GET DATA 01FB 12  STAX D ;STORE IT 01FC 23 & INX H ;BUMP SOURCE POINTER 01FD 13 % INX D ;BUMP DEST. POINTER 01FE 0B $ DCX B ;DECREMENT COUNTER 01FF 78  MOV A,B ;A=B 0200 B1 O ORA C ;CHECK FOR BC=0 0201 C2FA01 JNZ MOVIT ;LOOP UNTIL BC=0 0204 C9  RET  ;  ;NO MEMORY BOAR7 0243 1800 DPB2: DW 24 ;SECTORS/TRACK 0245 05  DB 5 ;BLOCK SHIFT 0246 1F  DB 31 ;BLOCK MASK 0247 03 v DB 3 ;EXTNT. MASK 0248 BD00 DW 189 ;DISK SIZE-1 024A FF00 DW 255 ;MAX. DIRECTORY ENTRIES 024C C0  DB 192 ;ALLOC0 024D 00 T DB 0 ;ALLOC1 024E 0000 DW 0 ;CHECK SIZE 0250 0200 DW 2 ;OFFSET  8; 0252 2000 DPB3: DW 32 ;SECTORS/TRACK 0254 05  DB 5 ;BLOCK SHIFT 0255 1F  DB 31 ;BLOCKF# DB 6 ;BLOCK SHIFT 0291 3F  DB 63 ;BLOCK MASK 0292 07 w DB 7 ;EXTNT. MASK 0293 FD00 DW 253 ;DISK SIZE-1 0295 FF03 DW 1023 ;MAX. DIRECTORY ENTRIES 0297 F0  DB 240 ;ALLOC0 0298 00 T DB 0 ;ALLOC1 0299 0000 DW 0 ;CHECK SIZE 029B 0200 DW 2 ;OFFSET  ;  ;  ;  ;MESSAGE AREA  *; 029D 0A0D MESG1: DW 0D0AH 029F 20 DB ' LS-100 A}K 0464  DS 20 0478 =  STACK EQU $ 0478  END =G6: DB 'NO BOARDS FOUND' 0401 0A0D DW 0D0AH 0403 24 m DB '$' 0404 4E554D4245MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMIT' 0427 0A0D DW 0D0AH 0429 24 DB '$' 042A 52454C4F43MESG8: DB 'RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE' 0460 0A0D DW 0D0AH 0462 24  DB '$' 0463 % NUMBD: DS 1 ;NUMBER OF BOARDS FOUND1ͤxF2zy2f\ͤ>2{>2|&b>2{&bIͤ2|>2{&b>2{&bͤO:zGzy.:|ʅ k%b:{GXXXXXXXXXXXXXXXX-Šz:{-ɯG03x@O G B>UBUɯͤͤz͌"y͌"x͌" ͌"ͤ͛o͛gƐ'@'  !LS-100 AUTO FORMAT PROGRAM   DIGITAL RESEARCH COMP]:10010000317804CDC20179B7CA0502326304C63022 :1001100032DE031106D02A06007CBAC234017DBB50 :10012000C234013A00D0FE41C23401119703CD2000 :1001300002C300000E0CCD0500FE20D2470111A91C :1001400003CD2002C300001106DC2106007BBEC2E5 :100150001702237ABEC21702119D02CD2002210090 :10016000101100D0010004CDFA012103EA1127D0BB :10017000010300CDFA0111120019112AD0011B0050 :10018000CDFA012109D01103EA010300CDFA0111D2 :1001900018EA011B00CDFA0111C703CD20023A6312 :1001A000042125023DCAB001110F00193DC2AB0167 :1001B0001155D001QUTERS   ALL RIGHTS RESERVED   COPYRIGHT 1983  VER. 1.0 $DONE $NO LS-100 BOARDS FOUND $BOARDS FOUND EXCEED LIMIT CHECK FOR PORT ADDRESSING ERROR $VERIFY ERROR AT SECTOR TRACK GOOD DATA BAD DATA ENTER ESC. TO ABORT ANY OTHER TO CONTINUE $VERIFYING FORMAT $FORMATING LS-100 BO ARD(S) $C0F00CDFA01118203CD2002C3E9 :1001C0000000AF474FD3C2D3C1CDDA01C078C60813 :1001D000FE40CA0E02470CC3C701CDF501DBC05774 :1001E000CDF5013E55D3C0CDF501DBC0FE55CDF5B3 :1001F000017AD3C0C93E00D3C3C97E1223130B7842 :10020000B1C2FA01C911F203CD2002C300001104EA :1002100004CD2002C30000112A04CD2002C3000037 :100220000E09C305000800040F017E007F00C00016 :10023000000002001000040F01FD007F00C000005C :100240000002001800051F03BD00FF00C0000000F1 :1002500002002000051F03FD00FF00C00000000297 :10026000002800063F079D00FF01C0000    '0000200BB :100270003000063F07BD00FF01C00#200384B :1002800000063F07DD00FF03F00#200400011 :10029000063F07FD00FF03F002000A0D20EA :1002A0002l04E :1002B0004C532D31303020204155544F2020494E91 :1002C0005354414C4C202050524F4752414D0A0D3F :1002D0000A0D20 47 :1002E0002U04449474954414C2052454178 :1002F00053454152434820434F4D50555445525366 :100300000A0D20 16 :1003100 020414C4C20524947E2 :10032 /0004854532052455345525645440A0D202007 :100330002 0BD :100340002.0434F50595249474848 :100350005420313938330A0D20 3D :100360002 08D :10037000205645522E20312E300A0D0AF2 :100380000D240A0D0A0D445249564520452041438B :10039000544956450A0D240A0D44524956455220E7 :1003A0004143544956450A0D2443502F4D20322EC7 :1003B00030204F5220424554544552205245515509 :1003C000495245440A0D240A0D44524956455220CB :0E03D000494E5354414C4C454420464F522058 :1003DF00204C532D31303020424F41524428532965 :1003EF000A0D244E4F20424F4152445320464F5541 :1003FF004E440A0D244E554D424552204F46204241 :10040F004F4152445320464F554E4420455843497F :10041F004445204C494D49540A0D2452454C4F43F5 :10042F004154494F4E204552524F522042444F5350 :10043F002056414C5545204E4F5420455155414C67 :10044F0020544F20455155415445442056414C5559 :04045F00450A0D2419 :00 21t  G1ix8ix2s1!_~2#~2 :<2: GO;_x<l}WG :ʌxW:O; “ʨÓ :“*#"|Ϳ"}Ϳ"vC2:2G :xG:<2xɯ2:<2g 02:_:!W=R:f#[6B  !Z͚͚͚͚  ^ͭ#£ ogƐ'@' $ $  LS-100 MEMORY DI.  ;PROGRAM LS100.ASM  #;LS-100 DRIVER RELOCATOR PROGRAM  ;BY RVA  ;LAST CHANGE  ;11/21/83  ;  ;COPYRIGHT 1983  ;DIGITAL RESEARCH COMPUTERS  ;ALL RIGHTS RESERVED  ;  >;THIS PROGRAM WILL RELOCATE THE LS-100 DRIVER PROGRAM (DRV2)  4;FROM 1000H TO A USER DEFINED DESTINATION ADDRESS.  ;THIS WILL ALLOW YOU TO  AGNOSTIC PROGRAM  DIGITAL RESEARCH COMPUTERS   ALL RIGHTS RESERVED   COPYRIGHT 1983  VER. 1.0 $ENTER BOARD NUMBER TO TEST (1-8): $ PRESS ANY KEY TO EXIT TO CP/M $ VALUE OF BOARD TO TEST MUST BE IN RANGE OF 1 - 8 RE-ENTER VALUE OF BOARD TO TEST $ TEST RESULTS FOR BOARD PASS NUMBER H DB0 DB1 DB2 DB3 DB4 DB5E DB6 DB7 BANK-0 $ BANK-1 $ BANK-2 $ BANK-3 $ (08@GG  # HAVE A MAXMIMUN CP/M SYSTEM SIZE  C;AS THE DRIVER PROGRAM IS OUT OF THE TPA AREA. THEREFORE IT IS NO  @;LONGER NESSARY TO PROTECT THE DRIVER FROM BEING OVER WRITTEN.  B;NOTE HOWEVER THAT IF THE WARM BOOT ROUTINE OVER WRITES THE BIOS  D;JUMP TABLE AS IS DONE ON A COLD BOOT THEN THE DRIVER PROGRAM WILL  F;HAVE TO BE RE-INSTALLED ON EACH WARM BOOT. THIS PROBLEM IS RARE BUT  .;IT MAY EXIST. THE ONLY CURE FOR THIS PROBLEM  @GGx VALUE OF BOARD TO TEST MUST BE IN RANGE OF 1 - 8 RE-ENTER VALUE OF BOARD TO TEST $ TEST RESULTS FOR BOARD PASS NUMBER H DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BANK-0 $ BANK-1 $ BANK-2 $ BANK-3 $ (08@GGIS TO MODIFY THE  H;BIOS WARM BOOT ROUTINE TO READ IN ONLY THE CCP AND BDOS AS DESCRIBED  9;IN THE SYSTEM ALTERATION GUIDE FROM DIGITAL RESEARCH.  +;NOTE THAT THE DRIVER PROGRAM AS SUPPLIED  %;REQUIRES 618 BYTES OF RAM STORAGE.  ;  ;  ;  ,;THE PROGARM BDOS & BIOS VALUES MUST MATCH  *;YOU'RE CURRENT CP/M BDOS & BIOS VALUES.  ;NOTE THAT SOME CP/M SYSTEMS  E HEX FILE  ; ASM DRV2 ;MAKE HEX FILE  %; DDT LS100.HEX ;READ IN RELOCATOR  3; H0,(ADDRESS OF DRV2) ;GET DRIVER OFFSET FROM 0H  .; ;ADD 1000H TO DIFF. TO GET FINAL OFFSET  /; IDRV2.HEX ;SET UP TO READ IN LS-100 DRIVER  6; R(FINAL OFFSET) ;READ DRVIER INTO MEMORY AT 1000H  ; G0 ;EXIT DDT  1; SAVE 18 LS100.COM ;SAVE RELOCATOR AND DRIVER  ;  ; 010148 112AF8 LXI D,DRV2+2AH ;DE=DEST. 014B 011B00 LXI B,1BH ;# OF BYTES 014E CDC801 CALL MOVIT ;COPY HOME-SECTOR TRANSLATE  ;  .;COPY DRIVER JUMP TABLE INTO BIOS JUMP TABLE  ; 0151 2109F8 MOV2B: LXI H,DRV2+9 ;HL=DRIVER BIOS 0154 1103EA LXI D,BIOS+3 ;DE=DEST. 0157 010300 LXI B,3 ;# OF BYTES 015A CDC801 CALL MOVIT ;COPY WARM BOOT 015D 1118EA LXI D,BIOS+18H ;SKIP PAST UNUSED ENTRIES 0160 011B00  LXI B,1BH ;# OF2= BOARD COUNTER 01A5 C39501 JMP FIND1 ;KEEP LOOKING;  ;NON-DESTRUCTIVE BYTE TEST  q; 01A8 CDC301 TEST: CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01AB DBD0 IN REG0 ;READ DATA 01AD 57 MOV D,A ;SAVE IN D 01AE CDC301 CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01B1 3E55 MVI A,55H ;GET TEST BYTE 01B3 D3D0 OUT REG0 ;WRITE IT 01B5 CDC301 CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01B8 DBD0 IN REG0 ;READ DATA BACK 01BAHAVE AN OFFSET FROM  8;THE STANDARD CP/M VALUES AS PUBLISHED IN THE CP/M 2.2  ;DOCUMENTATION.  >;IF YOU DO NOT KNOW THE BDOS & BIOS VALUES FOR YOU'RE SYSTEM  >;YOU CAN FIND THE VALUES WITH THE FIND.COM PROGRAM SUPPLIED  ;ON THE DISTRIBUTION DISK.  $;ENTER THE BDOS & BIOS VALUES INTO  ;THE SOURCE CODE BELOW.  ; DC06 = ( BDOS EQU 0DC06H ;BDOS ADDRESS EA00 = BIOS EQU  00 Q ORG 0100H ;MAKE COM FILE 0100 31F203 LXI SP,STACK ;SET UP SYSTEM STACK  ;  ";CHECK FOR # OF BOARDS IN SYSTEM  :; 0103 CD9001 CALL FIND ;FIND # OF BOARDS 0106 79  MOV A,C ;PUT IN A 0107 B7 ORA A ;SET FLAGS 0108 CAD301 JZ ERR1 ;CAN'T BE 0 010B 32DD03 STA NUMBD ;SAVE COUNT 010E C630 ADI 30H ;MAKE ASCII 0110 329103 STA BDS ;PUT IN MESSAGE  ;  ;CHECK CP/M VEJB BYTES 0163 CDC801 CALL MOVIT ;COPY HOME-SECTOR TRANSLATE  ;  =; FILL IN DISK PRAMTER BLOCK BASED ON # OF BOARDS IN SYSTEM  ; 0166 117A03 LXI D,MESG5 0169 CDE501 CALL SMESG 016C 3ADD03 LDA NUMBD 016F 21EA01 LXI H,DRVTAB ;HL@ DRIVE TABLE 0172 3D DCR A ;MAKE RELATIVE 0 0173 CA7E01 JZ CALC2 ;SKIP IF ONLY 1 BOARD 0176 110F00 LXI D,TABSZ ;DE=SIZE OF TABLE 0179 19 'CALC1: DAD D ;INDEX INTO TABLE 017A 4n FE55 CPI 55H ;CHECK FOR TEST BYTE 01BC CDC301 CALL RESET ;CLEAR BYTE LOCATION ADDRESS 01BF 7A O MOV A,D ;GET ORGINAL DATA 01C0 D3D0 OUT REG0 ;RESTORE DATA 01C2 C9  RET  ;  ;RESET BYTE ADDRESS COUNTERS  w; 01C3 3E00 RESET: MVI A,0 ;CLEAR A/SAVE FLAGS 01C5 D3D3 OUT REG3 ;SET BYTE LOCATION ADDRESS 01C7 C9  RET  ;  ;BLOCK MOVE ROUTINE  ;HL=SOURCE/DE=D 0EA00H ;BIOS ADDRESS  ;  ;;SET DRV2 EQUAL TO THE DESTINATION ADDRESS OF THE DRIVER.  5;BE SURE TO ALLOW ENOUGH RAM FOR THE DRIVER TO FIT.  ; F800 = 3 DRV2 EQU 0F800H ;LOAD ADDRESS OF DRIVER 026A = ' DRVSZ EQU 618 ;SIZE OF DRV2 PROGRAM  ; 0004 = + DRVID EQU 04 ;ACTIVE DRIVE # (E) 0042 = , DRVLD EQU 42H ;DRIVER LOADED FLAG 000F = 9 TABSZ EQU 0FH ;SIZE OF DRIVE TABLE ENTRY F855 =  R. #  ; 0113 0E0C MAIN: MVI C,0CH ;VERSION FUNC. 0115 CD0500 CALL 5 0118 FE20 CPI 20H ;CHECK FOR 2.0 OR BETTER 011A D22601 JNC VEROK 011D 115C03 LXI D,MESG4 ;WRONG VERSION 0120 CDE501 CALL SMESG 0123 C30000 JMP 0 ;ABORT  ;  ;MOVE DRIVER  ; 0126 116202 VEROK: LXI D,MESG1 ;SIGN ON 0129 CDE501 CALL SMESG 012C 210010 MOV1: LXI H,1000H ;HL=SOURCE OF DRIVER 012F 1100F8 LXI D,DR 3D DCR A ;DECREMENT A 017B C27901 JNZ CALC1 ;UNTIL A=0 017E 1155F8 CALC2: LXI D,DPB ;HL=SOURCE/DE=DEST. 0181 010F00 LXI B,TABSZ ;BC=LENGTH 0184 CDC801 CALL MOVIT ;MOVE INTO POSTION  ;  ;END OF MAIN PROGRAM  ^; 0187 114703 LXI D,MESG2 ;DONE 018A CDE501 CALL SMESG 018D C30000 JMP 0  ;  ;FIND # OF BOARDS IN SYSTEM  ; 0190 AF FIND: XRA A ;CLEAR A 0191 EST./BC=COUNT  ; 01C8 7E #MOVIT: MOV A,M ;GET DATA 01C9 12  STAX D ;STORE IT 01CA 23 & INX H ;BUMP SOURCE POINTER 01CB 13 % INX D ;BUMP DEST. POINTER 01CC 0B $ DCX B ;DECREMENT COUNTER 01CD 78  MOV A,B ;A=B 01CE B1 O ORA C ;CHECK FOR BC=0 01CF C2C801 JNZ MOVIT ;LOOP UNTIL BC=0 01D2 C9  RET  ;  ;NO LS-100 BOARDS FOUND  /; 01D3 11A503 ERR1: LXI D,MESG6 01D6 CDE ޫ2 DPB EQU DRV2+55H ;ADDRESS OF DISK PARM. BLOCK  ;  ;  ;LS-100 BOARD EQUATES  ; 00D0 = P PBASE EQU 0D0H ;BASE PORT ADDRESSREG0 EQU PBASE ;DATA TRANSFER PORT 00D1 = . REG1 EQU PBASE+1 ;MSB ADDRESS LATCH 00D2 = . REG2 EQU PBASE+2 ;LSB ADDRESS LATCH 00D3 = , REG3 EQU PBASE+3 ;BYTE LOCATION COUNTERS  ;  ; TO CREATE LS100.COM  ;  ; ASM LS100 ;MAK~V2 ;DE=DEST. OF DRIVER 0132 016A02 LXI B,DRVSZ ;BC=LENGTH OF DRIVER 0135 CDC801 CALL MOVIT ;MOVE INTO POSTION  ;  4;COPY BIOS JUMP TABLE TO RELOCATED BIOS JUMP TABLE  ; 0138 2103EA MOV2A: LXI H,BIOS+3 ;HL=BIOS JUMP TABLE 013B 1127F8 LXI D,DRV2+27H ;DE=RELOCATED BIOS JUMP TABLE 013E 010300CDC8 LXI B,3 ;# OF BYTES CALL MOVIT ;COPY WARM BOOT 0144 111200 LXI D,12H ;SKIP PAST UNUSED ENTRIES 0147 19  DAD D ;ADJUST HL ' 47  MOV B,A ;" " B 0192 4F MOV C,A ;" " C 0193 D3D2 OUT REG2 ;CLEAR LSB LATCH 0195 D3D1 FIND1: OUT REG1 ;SET MSB LATCH 0197 CDA801 CALL TEST ;CHECK FOR A BOARD 019A C0 , RNZ ;RETURN WHEN NO BOARD FOUND 019B 78 MOV A,B ;B=SECTORS/BOARD 019C C608 ADI 08 ;ADD BOARD OFFSET 019E FE40 CPI 40H ;CHECK FOR OVERFLOW 01A0 CADC01 JZ ERR2 ;REPORT ERROR 01A3 47 ! MOV B,A ;RESULTS IN B 01A4 0C  INR C ;INCREMENT,501 CALL SMESG 01D9 C30000 JMP 0  ;  ;TO MANY LS-100 BOARDS FOUND  [; 01DC 11B703 ERR2: LXI D,MESG7 01DF CDE501 CALL SMESG 01E2 C30000 JMP 0  ;  ;SEND MESSAGE @DE TO CON.  =; 01E5 0E09 SMESG: MVI C,09H 01E7 C30500 JMP 5  ;  $;DISK DRIVE PRAMETER TABLES 01EA =  ;DRVTAB: EQU $  ,; 01EA 0800 DPB0: DW 8 ;SECTORS/TRAC 9 ; 0226 2800 DPB4: DW 40 ;SECTORS/TRACK 0228 06  DB 6 ;BLOCK SHIFT 0229 3F  DB 63 ;BLOCK MASK 022A 07 v DB 7 ;EXTNT. MASK 022B 9D00 DW 157 ;DISK SIZE-1 022D FF01 DW 511 ;MAX. DIRECTORY ENTRIES 022F C0  DB 192 ;ALLOC0 0230 00 C DB 0 ;ALLOC1 0231 00000200 DW 0 ;CHECK SIZE DW 2 ;OFFSET  8; 0235 3000 DPB5: DW 48 ;SECTORS/TRACK 0237 06  DB 6 ;BLOCK SHIFT 0238 3F  DB 63 ;BLOCK MASK' 2COPYRIGHT 1983' 031B 0A0D DW 0D0AH 031D 20 DB ' J VER. 2.0' 0342 0A0D DW 0D0AH 0344 0A0D DW 0D0AH 0346 24 Z DB '$' 0347 0A0D MESG2: DW 0D0AH 0349 0A0D445249 DW 0D0AH DB 'DRIVE ' 0351 45 Q DB DRVID+41H 0352 2041435449 DB ' ACTIVE' 0359 0A0D DW 0D0AH 035B 24 f DB '$' 035C 43502F4D20MESG4: DB 'CP/M 2.0 OR BETTER REQUIRED' 0377 0A0D DW 0D0AH 0379 24 DB '$' 037  K 01EC 04  DB 4 ;BLOCK SHIFT 01ED 0F  DB 15 ;BLOCK MASK 01EE 01 v DB 1 ;EXTNT. MASK 01EF 7E00 DW 126 ;DISK SIZE-1 01F1 7F00 DW 127 ;MAX. DIRECTORY ENTRIES 01F3 C0  DB 192 ;ALLOC0 01F4 00 T DB 0 ;ALLOC1 01F5 0000 DW 0 ;CHECK SIZE 01F7 0200 DW 2 ;OFFSET  8; 01F9 1000 DPB1: DW 16 ;SECTORS/TRACK 01FB 04  DB 4 ;BLOCK SHIFT 01FC 0F  DB 15 ;BLOCK MASK 01FD 01  DB 1 ;EXTNT. MASK  0239 07 v DB 7 ;EXTNT. MASK 023A BD00 DW 189 ;DISK SIZE-1 023C FF01 DW 511 ;MAX. DIRECTORY ENTRIES 023E C0  DB 192 ;ALLOC0 023F 00 T DB 0 ;ALLOC1 0240 0000 DW 0 ;CHECK SIZE 0242 0200 DW 2 ;OFFSET  8; 0244 3800 DPB6: DW 56 ;SECTORS/TRACK 0246 06  DB 6 ;BLOCK SHIFT 0247 3F  DB 63 ;BLOCK MASK 0248 07 ` DB 7 ;EXTNT. MASK 0249 DD00 DW 221 ;DISK SIZE-1 024B FF03 DW 1023 ;MAX. DIREOA 0A0D MESG5: DW 0D0AH 037C 4452495645 DB 'DRIVER INSTALLED FOR ' 0391 W BDS: DS 1 0392 204C532D31 DB ' LS-100 BOARD(S)' 03A2 0A0D DW 0D0AH 03A4 24 Y DB '$' 03A5 4E4F20424FMESG6: DB 'NO BOARDS FOUND' 03B4 0A0D DW 0D0AH 03B6 24 m DB '$' 03B7 4E554D4245MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMIT' 03DA 0A0D DW 0D0AH 03DC 24  DB '$' 03DD - NUMBD: DS 1 ;NUMBER OF BOARDS FOUND 03DE  DS 20 03F2 = STACK EQU  ya 01FE FD00 DW 253 ;DISK SIZE-1 0200 7F00 DW 127 ;MAX. DIRECTORY ENTRIES 0202 C0  DB 192 ;ALLOC0 0203 00 T DB 0 ;ALLOC1 0204 0000 DW 0 ;CHECK SIZE 0206 0200 DW 2 ;OFFSET  8; 0208 1800 DPB2: DW 24 ;SECTORS/TRACK 020A 05  DB 5 ;BLOCK SHIFT 020B 1F  DB 31 ;BLOCK MASK 020C 03 v DB 3 ;EXTNT. MASK 020D BD00 DW 189 ;DISK SIZE-1 020F FF00 DW 255 ;MAX. DIRECTORY ENTRIES 0211 C0 DB 192  CTORY ENTRIES 024D F0  DB 240 ;ALLOC0 024E 00 T DB 0 ;ALLOC1 024F 0000 DW 0 ;CHECK SIZE 0251 0200 DW 2 ;OFFSET  8; 0253 4000 DPB7: DW 64 ;SECTORS/TRACK 0255 06  DB 6 ;BLOCK SHIFT 0256 3F  DB 63 ;BLOCK MASK 0257 07 w DB 7 ;EXTNT. MASK 0258 FD00 DW 253 ;DISK SIZE-1 025A FF03 DW 1023 ;MAX. DIRECTORY ENTRIES 025C F0  DB 240 ;ALLOC0 025D 00 0 DB 0 ;ALLOC1 025E 0000 DW 0 ;CHECK SI )$ 03F2  END 310 BOARD(S)' 03A2 0A0D DW 0D0AH 03A4 24 Y DB '$' 03A5 4E4F20424FMESG6: DB 'NO BOARDS FOUND' 03B4 0A0D DW 0D0AH 03B6 24 m DB '$' 03B7 4E554D4245MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMIT' 03DA 0A0D DW 0D0AH 03DC 24  DB '$' 03DD - NUMBD: DS 1 ;NUMBER OF BOARDS FOUND 03DE  DS 20 03F2 = STACK EQU   ;ALLOC0 0212 00 T DB 0 ;ALLOC1 0213 0000 DW 0 ;CHECK SIZE 0215 0200 DW 2 ;OFFSET  8; 0217 2000 DPB3: DW 32 ;SECTORS/TRACK 0219 05  DB 5 ;BLOCK SHIFT 021A 1F  DB 31 ;BLOCK MASK 021B 03 v DB 3 ;EXTNT. MASK 021C FD00 DW 253 ;DISK SIZE-1 021E FF00 DW 255 ;MAX. DIRECTORY ENTRIES 0220 C0  DB 192 ;ALLOC0 0221 00 Y DB 0 ;ALLOC1 0222 0000 DW 0 ;CHECK SIZE 0224 0200 DW 2 ;OFFSET $ZE 0260 0200 DW 2 ;OFFSET  ;  ;  ;  ;MESSAGE AREA  *; 0262 0A0D MESG1: DW 0D0AH 0264 20 DB ' ^ LS-100 AUTO INSTALL PROGRAM' 0293 0A0D DW 0D0AH 0295 0A0D DW 0D0AH 0297 20 DB ' @ DIGITAL REASEARCH COMPUTERS' 02C5 0A0D DW 0D0AH 02C7 20 DB ' 9 ALL RIGHTS RESERVED' 02F1 0A0D DW 0D0AH 02F3 20 DB N1xy2c02*|4}4:A4   G !{#z !!'*!  :c!%=ʰ=«U GOx@G W>UUz>~# x  *  ~ (?0?8?@?  # LS-100 AUTO INSTALL PROGRAM   DIGITAL REASEARCH COMPUTERS͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.P #ЯO2ogƐ'@'h~: CHECK SUM ERROR OCCURED ON LS-100 BOARD AT TRACK H SECTOR H 6! @!!BH @@ABH B! "BHI$$BI$BI $ HI AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*Я2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#U:":"1:x2!n~O   ALL RIGHTS RESERVED  COPYRIGHT 1983  VER. 1.0 $ DRIVE E ACTIVE $ DRIVER ACTIVE $CP/M 2.0 OR BETTER REQUIRED $ DRIVER INSTALLED FOR ! LS-100 BOARD(S) $NO BOARDS FOUND $NUMBER OF BOARDS FOUND EXCIDE LIMIT $RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE $g͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# & 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # ^z8O!B N#N ¾SP.* |} !9":q!"S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~     IO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET 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 ANA 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âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1l! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*Я2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#U:":"1:x2!n~OIO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET 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 ANA 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âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*ܯ2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#UГ:":"1:x2!n~O1xy2c02*|4}4:A4   G !{#z !!'*!  :c!%=ʰ=«U GOx@G W>UUz>~# x  *  ~ (?0?8?@?  # LS-100 AUTO INSTALL PROGRAM   DIGITAL REASEARCH COMPUTERS͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. #ܯO2ogƐ'@'h~: CHECK SUM ERROR OCCURED ON LS-100 BOARD AT TRACK H SECTOR H 6! @!!BH @@ABH B! "BHI$$BI$BI $ HI AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*ܯ2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#UГ:":"1:x2!n~O    ALL RIGHTS RESERVED  COPYRIGHT 1983  VER. 1.0 $ DRIVE E ACTIVE $ DRIVER ACTIVE $CP/M 2.0 OR BETTER REQUIRED $ DRIVER INSTALLED FOR ! LS-100 BOARD(S) $NO BOARDS FOUND $NUMBER OF BOARDS FOUND EXCIDE LIMIT $RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE $g͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#  & 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #   ^z8O!B N#N ¾SP.* |} !9":q!"S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  '0202020F5 :100270002_04C532D313030202041555457 :100280004F2020494E5354414C4C202050524F4750 :1002900052414D0A0D0A0D 20 30 :1002A00 02U04449474954415C :1002B0004C2052454153454152434820434F4D50F5 :1002C00055544552530A0D 20 64 :1002D0002E0414CD1 :1002E0004C20524947485453205245534552564595 :1002F000440A0D 20 03 :10030000 20=434F506B :1003100059524947485420313938330A0D2020209A :10032^z8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1 :1001000031F203CD900179B7CAD30132DD03C63095 :100110003291030E0CCD0500FE20D22601115C03A6 :10012000CDE501C30000116202CDE50121001011EF :1001300000F8016A02CDC8012103EA1127F8010382 :1001400000CDC80111120019112AF8011B00CDC8F9 :10015000012109F81103EA010300CDC8011118EAD1 :10016000011B00CDC801117A03CDE5013ADD032161 :10017000EA013DCA7E01110F00193DC279011155F6 :10018000F8010F00CDC801114703CDE501C3000000 :10019000AF474FD3D2D3D1CDA801C078C608FE4017 :1001A000CADC01470CC39501CDC301DBD057CDC3D9 :1001B000013E55D3 04445204C494D49540A0D24BD :00 , :100350002045204143544956450A0D2443502F4D12 :1003600020322E30204F52204245545445522052C4 :10037000455155495245440A0D240A0D44524956E7 :10038000455220494E5354414C4C454420464F520F :01039000204C :10039200204C532D31303020424F415244285329B2 :1003A2000A0D244E4F20424F4152445320464F558E :1003B2004E440A0D244E554D424552204F4620428E :1003C2004F4152445320464F554E442045584349CD :0B03D20 1xy2c02*|4}4:A4   G !{#z !!'*!  :c!%=ʰ=«U GOx@G W>UUz>~# x  *  ~ (?0?8?@?  # LS-100 AUTO INSTALL PROGRAM   DIGITAL REASEARCH COMPUTERS ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. gD0CDC301DBD0FE55CDC3017A6E :1001C000D3D0C93E00D3D3C97E1223130B78B1C25A :1001D000C801C911A503CDE501C3000011B703CDC6 :1001E000E501C300000E09C305000800040F017EED :1001F000007F00C00#2001000040F01FD009D :100200007F00C00#2001800051F03BD00FFB2 :1002100000C00#2002000051F03FD00FF00D9 :10022000C00!2002800063F079D00FF01C03B :1002300#2003000063F07BD00FF01C000C3 :1002400]2003800063F07DD00FF03F0000059 :100250000002004000063F07FD00FF03F000000021 :1002600002000A0D202   ALL RIGHTS RESERVED  COPYRIGHT 1983  VER. 1.0 $ DRIVE E ACTIVE $ DRIVER ACTIVE $CP/M 2.0 OR BETTER REQUIRED $ DRIVER INSTALLED FOR ! LS-100 BOARD(S) $NO BOARDS FOUND $NUMBER OF BOARDS FOUND EXCIDE LIMIT $RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE $g͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# & 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #   ALL RIGHTS RESERVED  COPYRIGHT 1983  VER. 1.0 $ DRIVE E ACTIVE $ DRIVER ACTIVE $CP/M 2.0 OR BETTER REQUIRED $ DRIVER INSTALLED FOR ! LS-100 BOARD(S) $NO BOARDS FOUND $NUMBER OF BOARDS FOUND EXCIDE LIMIT $RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE $g͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#  ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ^z8O!B N#N ¾SP.* |} !9":q!"= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#UГ:":"1:x2!n~O   IO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET 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 ANA 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âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1  #O2ogƐ'@'h~: CHECK SUM ERROR OCCURED ON LS-100 BOARD AT TRACK H SECTOR H 6! @!!BH @@ABH B! "BHI$$BI$BI $ HI AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#UГ:":"1:x2!n~O1xy2c02*|4}4:A4   G !{#z !!'*!  :c!%=ʰ=«U GOx@G W>UUz>~# x  *  ~ (?0?8?@?  # LS-100 AUTO INSTALL PROGRAM   DIGITAL REASEARCH COMPUTERS5͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. #O2ogƐ'@'h~: CHECK SUM ERROR OCCURED ON LS-100 BOARD AT TRACK H SECTOR H 6! @!!BH @@ABH B! "BHI$$BI$BI $ HI AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#UГ:":"1:x2!n~O  ;PROGRAM FIND.ASM  ;11/27/1983  ;THIS PROGRAM WILL PRINT OUT  !;THE CURRENT BIOS & BDOS VALUES  ;WHICH ARE LOCATED AT MEMORY  ;LOCATIONS 2 AND 3 AND  ";LOCATIONS 6 AND 7 RESPECTIVELY.  ;  ; 0005 = ' BDOS EQU 5 ;BDOS ENTRY POINT 0009 = % PMSG EQU 9 ;PRINT STRING FUNCTION  ;  ; 0100  ORG 100H ;TPA 010& 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #'0 31B901 LXI SP,STACK ;INIT. PROGRAM STACK 0103 3A0100 LDA 1 ;GET LSB OF BIOS WARM BOOT 0106 D603 SUI 03H ;ADJUST TO POINT TO COLD BOOT 0108 CD3401 CALL CNVHX ;CONVERT TO ASCII 010B 228F01 SHLD MSG1B ;STORE RESULTS IN MESSAGE 010E 3A0200 LDA 2 ;GET MSB BIOS ADDRESS 0111 CD3401 CALL CNVHX ;CONVERT TO ASCII 0114 228D01 SHLD MSG1A ;STORE RESULTS 0117 3A0600 LDA 6 ;GET LSB ADDRESS OF BDOS 011A CD3401 CALL CNVHX ;CONVERT TO ASCII 011D 22A901   ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~     Y SHLD MSG2B ;STORE RESULTS 0120 3A0700 LDA 7 ;GET MSB BDOS ADDRESS 0123 CD3401 CALL CNVHX ;CONVERT TO ASCII 0126 22A701 SHLD MSG2A ;STORE RESULTS 0129 114C01 LXI D,MSG ;SEND MESSAGE @ DE TO 012C 0E09 MVI C,PMSG ;COBNSOLE 012E CD0500 CALL BDOS 0131 C30000 JMP 0 ;DONE  ;  !;ENTER WITH A HEX BYTE IN ACCU.  !;EXIT WITH 2 ASCII CHARS. IN HL  ; 0134 F5 CNVHX: PUSH PSW 0135 0F  RRC  U! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~AdxÃÑÜçø(?ï*M|N+"M N:LHͅUz:1!"$$$$.:Oh*2y2>-!Eh0y2h3y2`i"6hB`ih9Cw_#UГ:":"1:x2!n~O 0136 0F  RRC 0137 0F  RRC 0138 0F + RRC 0139 CD4301 CALL HASCI 013C 6F  MOV L,A 013D F1 / POP PSW 013E CD4301 CALL HASCI 0141 67  MOV H,A 0142 C9 H RET 0143 E60F HASCI: ANI 0FH 0145 C690 ADI 90H 0147 27 ( DAA 0148 CE40 ACI 40H 014A 27  DAA 014B C9  RET  ;  ;MESSAGE AREA  ; 014C 20 MSG: DB '  BIOS - BDOS LOCATOR' = 0176 0A0D DW 0D0AH 0178 0A0D DW 0D0AH 017A 20] DB ' BIOS VALUE = ' 018D 0000 MSG1A: DW 0 018F 0000 MSG1B: DW 0 0191 48 * DB 'H' 0192 0A0D DW 0D0AH 0194 20] DB ' BDOS VALUE = ' 01A7 0000 MSG2A: DW 0 01A9 0000 MSG2B: DW 0 01AB 48 , DB 'H' 01AC 0A0D DW 0D0AH 01AE 24 DB '$'  ;  ;PROGRAM STACK AREA  ; 01AF  DS 10 01B9 = STACK: EQU ;PROCESS CHECK SUM ERROR ; LDA TRK ;GET CURRENT TRACK # CALL CNVHX ;CONVERT TO HEX ASCII SHLD BDTRK ;PUT IN MESSAGE LDA SEC ;GET CURRENT SECTOR # CALL CNVHX ;CONVERT TO HEX ASCII SHLD BDSCTR ;PUT IN MESSAGE ; ;FIND WHICH LS-100 BOARD THE ERROR OCCURED ON ; MVI B,'1' ;START WITH BOARD #1 LDA SEC ;GET CURRENT SECTOR # FIND: SUI 8 ;SUB. OFFSET/BOARD JC FOUND ;CHECK FOR OVERFLOW INR B ;BUMP BOARD COUNTER JMP FIND ;KEEP LOOKING FOUND: MOV A,B ;GET BOARD # STA BDBRD ;PU;MESSAGE AREA ; MESG1: DW 0D0AH DB 'CHECK SUM ERROR OCCURED ON LS-100 BOARD ' BDBRD: DB 0 DW 0D0AH DB 'AT TRACK ' BDTRK: DW 0 DB 'H' DB ' SECTOR ' BDSCTR: DW 0 DB 'H' DW 0D0AH DB 0 DIAG BAKH=>?FIND HEX@FIND ASM ALS60 COM"BCFIND COMDREAD ME EWS COM|FGHIWSMSGS OVRZJKLMNOP Vq$ 01B9  END 3%018F 0000 MSG1B: DW 0 0191 48 * DB 'H' 0192 0A0D DW 0D0AH 0194 20] DB ' BDOS VALUE = ' 01A7 0000 MSG2A: DW 0 01A9 0000 MSG2B: DW 0 01AB 48 , DB 'H' 01AC 0A0D DW 0D0AH 01AE 24 DB '$'  ;  ;PROGRAM STACK AREA  ; 01AF  DS 10 01B9 = STACK: EQU  *T IN MESSAGE ; ;PRINT ERROR MESSAGE ON CONSOLE ; LXI H,MESG1 ;HL @ ERROR MESSAGE SMESG: MOV A,M ;GET DATA ORA A ;CHECK FOR END OF MESSAGE JZ EXIT ;EXIT IF SO MOV C,A ;SETUP FOR BIOS CALL PUSH H ;SAVE POINTER CALL CONOUT ;OUTPUT BYTE POP H ;RESTORE POINTER INX H ;BUMP POINTER JMP SMESG ;LOOP UNTIL END OF MESSAGE ; ;SET DEFAULT DRIVE TO A AND ABORT ; EXIT: XRA A ;CLEAR A MOV C,A ;SET TO DRIVE A STA 4 ;SET TO DRIVE A JMP 0 ;RETURN TO CP/M ; ;CONVERT HEX BYTE IN     A. RETURN TWO HEX ASCII CHARS. IN HL ; CNVHX: PUSH PSW RRC RRC RRC RRC CALL HASCI MOV L,A POP PSW CALL HASCI MOV H,A RET HASCI: ANI 0FH ADI 90H DAA ACI 40H DAA RET ; POP H ;RESTORE POINTER INX H ;BUMP POINTER JMP SMESG ;LOOP UNTIL END OF MESSAGE ; ;SET DEFAULT DRIVE TO A AND ABORT ; EXIT: XRA A ;CLEAR A MOV C,A ;SET TO DRIVE A STA 4 ;SET TO DRIVE A JMP 0 ;RETURN TO CP/M ; ;CONVERT HEX BYTE IN    MP SLDSK ;SELECT DISK STRK1: JMP STRK ;SET TRACK SSEC1: JMP SSEC ;SET SECTOR SDMA1: JMP SDMA ;SET DMA ADDRESS RDE1: JMP RDE ;READ SECTOR WRE1: JMP WRE ;WRITE SECTOR LSTS1: JMP LSTS2 ;LIST STATUS SCTRL1: JMP SCTRL ;SECTOR TRANSLATOR ; ;RELOCATED CP/M BIOS JUMP TABLE ; WBOOT2: DS 3 ;WARM BOOT HOME2: DS 3 ;HOME SLDSK2: DS 3 ;SELECT DISK STRK2: DS 3 ;SET TRACK SSEC2: DS 3 ;SET SECTOR SDMA2: DS 3 ;SET DMA ADDRESS RDE2: DS 3 ;READ SECTOR WRE2: DS 3 ;WRITE SECTOR LSTS2: DS 3 ;LI S-100 SECTOR READ ROUTINE ; RDE: CALL CHK ;CHECK FOR LS-100 JNZ RDE2 ;IF NOT JUMP TO BIOS CALL SETUP ;SET UP LS-100 REGS. RDLP: IN REG0 ;GET DATA FROM LS-100 MOV M,A ;STORE @ HL ADD E ;COMPUTE CHECK SUM MOV E,A ;ACCUMULATE CHECK SUM IN E INX H ;BUMP POINTER DCR B ;DECREMENT BYTE COUNT JNZ RDLP ;LOOP UNTIL ZERO CALL CALC ;SET ADDRESS OF CHECK SUM BYTE IN REG0 ;GET CHECK SUM BYTE SUB E ;CHECK FOR ERROR RZ ;RETURN IF NO ERROR ; ;PROCESS CHECK SUM ERROR ; LDA TR   nST STATUS SCTRL2: DS 3 ;SECTOR TRANSLATOR ; ; ; DPE0: DW XLT0,0000H ;TRANSLATE TABLE DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB0 ;DIR.BUF./PARM. BLOCK DW CSV0,ALV0 ;CHECK ALLOC. VECTORS ; ;THE FOLLOWING PARAMETERS ARE FOR 1 MEMORY BOARD ; DPB0: EQU $ ;DISK PARM. BLOCK DW 16 ;SECTORS/TRACK DB 4 ;BLOCK SHIFT DB 15 ;BLOCK MASK DB 1 ;EXTNT MASK DW 253 ;SIZE-1 DW 127 ;MAX. DIR. ENTRYS DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET XLT0: EQU 0 ;NOT REQUI mK ;GET CURRENT TRACK # CALL CNVHX ;CONVERT TO HEX ASCII SHLD BDTRK ;PUT IN MESSAGE LDA SEC ;GET CURRENT SECTOR # CALL CNVHX ;CONVERT TO HEX ASCII SHLD BDSCTR ;PUT IN MESSAGE ; ;FIND WHICH LS-100 BOARD THE ERROR OCCURED ON ; MVI B,'1' ;START WITH BOARD #1 LDA SEC ;GET CURRENT SECTOR # FIND: SUI 8 ;SUB. OFFSET/BOARD JC FOUND ;CHECK FOR OVERFLOW INR B ;BUMP BOARD COUNTER JMP FIND ;KEEP LOOKING FOUND: MOV A,B ;GET BOARD # STA BDBRD ;PUT IN MESSAGE ; ;PRINT ERROR MESSAG  h;PROGRAM DRV2.ASM ;LS-100 DRIVER PROGRAM ;BY RVA ;TO BE RELOCATED ABOVE CP/M ;BY THE RELOCATOR PROGRAM (LS100) ; ;LAST CHANGE ;11/21/83 ; ;COPYRIGHT 1983 ;DIGITAL RESEARCH COMPUTERS ;ALL RIGHTS RESERVED ; ;THE FLOWING EQUATES MUST MATCH THE VALUES ;IN THE LS100 FILE. ; BIOS EQU 0EA00H ;BIOS ADDRESS BDOS EQU 0DC06H ;BDOS ADDRESS DRV2 EQU 0F800H ;LOAD ADDRESS OF DRIVER ; ; CONOUT EQU BIOS+12 ;BIOS CONSOLE OUTPUT DRVID EQU 04 ;ACTIVE DRIVE # (E) DRVLD EQU 42H ;DRIVER ID BYTE ; 4RED ; ;DRIVER ROUTINES ; WBOOT: JMP WBOOT2 ;READ IN CCP & BDOS ; ;HOME ROUTINE ; HOME: CALL CHK ;CHECK FOR LS-100 JNZ HOME2 ;IF NOT JUMP TO BIOS XRA A ;CLEAR A STA TRK ;SET TO TRACK 0 RET ; ;SELECT DISK ROUTINE ; SLDSK: MOV A,C ;GET DRIVE # STA UNIT ;SAVE IT MVI A,DRVID ;GET ACTIVE DRIVE # CMP C ;CHECK FOR LS-100 JNZ SLDSK2 ;IF NOT JUMP TO BIOS LXI H,DPE0 ;HL=DISK PARM. BLOCK RET ; ;SET TRACK ROUTINE ; STRK: CALL CHK ;CHECK FOR LS-100 JNZ STRK2 ;IF NOT JU TE ON CONSOLE ; LXI H,MESG1 ;HL @ ERROR MESSAGE SMESG: MOV A,M ;GET DATA ORA A ;CHECK FOR END OF MESSAGE JZ EXIT ;EXIT IF SO MOV C,A ;SETUP FOR BIOS CALL PUSH H ;SAVE POINTER CALL CONOUT ;OUTPUT BYTE POP H ;RESTORE POINTER INX H ;BUMP POINTER JMP SMESG ;LOOP UNTIL END OF MESSAGE ; ;SET DEFAULT DRIVE TO A AND ABORT ; EXIT: XRA A ;CLEAR A MOV C,A ;SET TO DRIVE A STA 4 ;SET TO DRIVE A JMP 0 ;RETURN TO CP/M ; ;CONVERT HEX BYTE IN A. RETURN TWO HEX ASCII CHARS. IN HL  ;LS-100 PORT ADDRESS ASSIGMENT ; PBASE EQU 0D0H ;BASE PORT ADDRESS REG0 EQU PBASE ;DATA TRANSFER PORT REG1 EQU PBASE+1 ;MSB ADDRESS LATCH REG2 EQU PBASE+2 ;LSB ADDRESS LATCH REG3 EQU PBASE+3 ;BYTE LOCATION ADDRESS COUNTERS NBYTES EQU 128 ;BYTES/SECTOR ; ;START OF DRIVER ; ORG DRV2 ;START OF DRIVER DB DRVLD ;DRIVER ID BYTE DB 0 DW 0,0 ;6 BYTE OFFSET BDOS1: JMP BDOS ;LINK TO BDOS ENTRY ; ;DRIVER BIOS JUMP TABLE ; WBOOT1: JMP WBOOT ;WARM BOOT HOME1: JMP HOME ;HOME SLDSK1: J CMP TO BIOS MOV A,C ;GET TRACK # STA TRK ;STORE IT RET ; ;SET SECTOR ROUTINE ; SSEC: CALL CHK ;CHECK FOR LS-100 JNZ SSEC2 ;IF NOT JUMP TO BIOS MOV A,C ;GET SECTOR # STA SEC ;STORE IT RET ; ;SET UP DMA ADDRESS ; SDMA: MOV H,B ;H=B MOV L,C ;L=C SHLD TADDR ;STORE IT JMP SDMA2 ;PASS PARM. TO BIOS ; ;LS-100 SECTOR TRANSLATE ROUTINE ; SCTRL: CALL CHK ;CHECK FOR LS-100 JNZ SCTRL2 ;IF NOT JUMP TO BIOS MOV H,B ;NO TRANLASTION REQUIRED MOV L,C ;SET HL=BC RET ; ;L!\!u ; CNVHX: PUSH PSW RRC RRC RRC RRC CALL HASCI MOV L,A POP PSW CALL HASCI MOV H,A RET HASCI: ANI 0FH ADI 90H DAA ACI 40H DAA RET ; ;LS-100 SECTOR WRITE ROUTINE ; WRE: CALL CHK ;CHECK FOR LS-100 JNZ WRE2 ;IF NOT JUMP TO BIOS CALL SETUP ;SET UP LS-100 REGS. WRLP: MOV A,M ;GET DATA FROM MEMY. @ HL OUT REG0 ;STORE DATA ADD E ;COMPUTE CHECK SUM MOV E,A ;ACCUMULATE CHECK SUM IN E INX H ;BUMP POINTER DCR B ;DECREMENT BYTE COUNT JNZ WRLP ;LOOP UNTIL!!!!l ZERO CALL CALC ;SET ADDRESS OF CHECK SUM BYTE MOV A,E ;GET CHECK SUM BYTE OUT REG0 ;STORE CHECK SUM BYTE XRA A ;NORMAL RETURN RET ; ;SETUP LS-100 REGS. BASED ON CURRENT TRACK & SECTOR ; SETUP: LDA TRK ;GET CURRENT TRACK # OUT REG2 ;SET LSB ADDRESS LATCH LDA SEC ;GET CURRENT SECTOR # OUT REG1 ;SET MSB ADDRESS LATCH LHLD TADDR ;HL=DMA POINTER MVI B,NBYTES ;B=BYTES/SECTOR MVI E,0 ;CLEAR CHECK SUM BYTE RET ; ;COMPUTE ADDRESS FOR CHECK SUM BYTE & SET UP LS-100 REGS. ; !!!! CALC: LXI H,TRK ;HL @ TRACK # XRA A ;CLEAR A/CARRY FLAG OUT REG2 ;SET TO TRACK 0 MOV A,M ;GET CURRENT TRACK RLC ;MOD 128 JNC SKP1 ;JUMP IF <128 MVI A,1 ;SET TO TRACK 1 OUT REG2 ;UPDATE LSB ADDRESS LATCH SKP1: MOV A,M ;RESTORE TRACK # OUT REG3 ;SET BYTE LOCATION ADDRESS COUNTERS RET ; ;CHECK THE CURRENT DRIVE BYTE FOR LS-100 ; CHK: LDA UNIT ;GET DRIVE # CPI DRVID ;Z=0 DRIVE ACTIVE/Z=1 DRIVE NOT ACTIVE RET ; ;MESSAGE AREA ; MESG1: DW 0D0AH DB 'CHECK SUM ERROR OC! ! ! ! CURED ON LS-100 BOARD ' BDBRD: DB 0 DW 0D0AH DB 'AT TRACK ' BDTRK: DW 0 DB 'H' DB ' SECTOR ' BDSCTR: DW 0 DB 'H' DW 0D0AH DB 0 ; ; ;LOCAL STORAGE MUST BE IN RAM ; UNIT: DS 1 ;CURRENT DRIVE TRK: DS 1 ;CURRENT TRACK SEC: DS 1 ;CURRENT SECTOR TADDR: DS 2 ;TRANSFER ADDRESS DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER ALV0: DS 64 ;ALLOCATION VECTOR CSV0: DB 0 ;CHECK SUM VECTOR END 2! ;LOCAL STORAGE MUST BE IN RAM ; UNIT: DS 1 ;CURRENT DRIVE TRK: DS 1 ;CURRENT TRACK SEC: DS 1 ;CURRENT SECTOR TADDR: DS 2 ;TRANSFER ADDRESS DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER ALV0: DS 64 ;ALLOCATION VECTOR CSV0: DB 0 ;CHECK SUM VECTOR DIAG BAKH=>?FIND HEX@FIND ASM ALS60 COM"BCFIND COMDREAD ME EWS COM|FGHIWSMSGS OVRZJKLMNOP!"":1001000031B9013A0100D603CD3401228F013A0200 :1001100000CD3401228D013A0600CD340122A9011F :100120003A0700CD340122A701114C010E09CD057B :1001300000C30000F50F3CD43016FF1CD434A :100140000167C9E60FC69027CE4027C920 8E :100150002O09F :1001600020202042494F53202D2042444F53204C01 :100170004F4341544F520A0D0A0D20BC9 :1001800042494F532056414C5545203D2000000028 :1001900000480A0D20&42444F532056A2 :0F01A000414C5545203D2000480A0D2429 :00 "";PROGRAM FIND.ASM ;11/27/1983 ;THIS PROGRAM WILL PRINT OUT ;THE CURRENT BIOS & BDOS VALUES ;WHICH ARE LOCATED AT MEMORY ;LOCATIONS 2 AND 3 AND ;LOCATIONS 6 AND 7 RESPECTIVELY. ; ; BDOS EQU 5 ;BDOS ENTRY POINT PMSG EQU 9 ;PRINT STRING FUNCTION ; ; ORG 100H ;TPA LXI SP,STACK ;INIT. PROGRAM STACK LDA 1 ;GET LSB OF BIOS WARM BOOT SUI 03H ;ADJUST TO POINT TO COLD BOOT CALL CNVHX ;CONVERT TO ASCII SHLD MSG1B ;STORE RESULTS IN MESSAGE LDA 2 ;GET MSB BIOS ADDRESS CALL CNVHX ;CO""""@NVERT TO ASCII SHLD MSG1A ;STORE RESULTS LDA 6 ;GET LSB ADDRESS OF BDOS CALL CNVHX ;CONVERT TO ASCII SHLD MSG2B ;STORE RESULTS LDA 7 ;GET MSB BDOS ADDRESS CALL CNVHX ;CONVERT TO ASCII SHLD MSG2A ;STORE RESULTS LXI D,MSG ;SEND MESSAGE @ DE TO MVI C,PMSG ;CONSOLE CALL BDOS JMP 0 ;DONE ; ;ENTER WITH A HEX BYTE IN ACCU. ;EXIT WITH 2 ASCII CHARS. IN HL ; CNVHX: PUSH PSW RRC RRC RRC RRC CALL HASCI MOV L,A POP PSW CALL HASCI MOV H,A RET HASCI: ANI 0FH ADI"" " "  @ 90H DAA ACI 40H DAA RET ; ;MESSAGE AREA ; MSG: DB ' BIOS - BDOS LOCATOR' DW 0D0AH DW 0D0AH DB ' BIOS VALUE = ' MSG1A: DW 0 MSG1B: DW 0 DB 'H' DW 0D0AH DB ' BDOS VALUE = ' MSG2A: DW 0 MSG2B: DW 0 DB 'H' DW 0D0AH DB '$' ; ;PROGRAM STACK AREA ; DS 10 STACK: EQU $ END   ; CNVHX: PUSH PSW RRC RRC RRC RRC CALL HASCI MOV L,A POP PSW CALL HASCI MOV H,A RET HASCI: ANI 0FH ADI" " ""#N##IO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET 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 ANA 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âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1#! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~AdxÃÑÜçï?*M|N+"M N:LHͅUҝ1!"$$$$.:O*Я2y2>-!E0y23y2`i"69w_#¸Г<~Ѓ_#{ЯB`i::*!##1y202*|4}4:A4;   GM !{#z !!'*! k :!%=ʰ=«U& GOx@G W>UUz>~# x    ~ (?0?8?@?   INSTALL PROGRAM  VER. 1.0 %ALL RIGHTS RESERVED COPYRIGHT#͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.#ѯ~>~:>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI AdxÃÑÜçï?*M|N+"M N:LHͅUҝ1!"$$$$.:O*Я2y2>-!E0y23y2`i"69w_#¸Г<~Ѓ_#{ЯB`i::*!##  DIGITAL RESEARCH COMPUTERS 1983 $ DRIVE E ACTIVE $ DRIVER ACTIVE $CP/M 2.0 OR BETTER REQUIRED $ DRIVER INSTALLED FOR  MEMORY BOARD(S) $NO BOARDS FOUND $NUMBER OF BOARDS FOUND EXCIDE LIMIT $RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE $Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# # & 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  ## # # ^z8O!B N#N ¾SP.* |} !9":q!"S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  #$$$$$ current address of the BIOS and BDOS jump vectors. This will allow you to enter these values directly into the driver and relocator program. Also find ready to run versions of the LS-100 overlay software. These files are for a standard CP/M O.S. and relocate the LS-100 driver below the CCP. The base I/O port is equated to D0H and the LS-100 is assigned to drive E. LS48.COM - is for a 48k CP/M LS56.COM - is for a 56K CP/M LS60.COM - is for a 60K C$$$$ P/M LS63.COM - is for a 63K CP/M There is also an ap note being published for the NORTH STAR system on how to intergrate the LS-100 driver into the NORTH STAR BIOS. For futher information contact EWING at DIGITAL RESEARCH COMPUTERS.  P R O B L E M S !!! The previous INSTALL and DRIVER programs used the CP/M system size value to compute the BIOS and BDOS address. However some implementations of CP/M have a negative offset from the $ L1:4":4":4":4"L CoCgƐ'@' M BIOS - BDOS LOCATOR BIOS VALUE = H BDOS VALUE = H $)DIAG ASMH=>?FIND HEX@FIND ASM ALS60 COM"BC FIND $$$ 0$ $  LS-100 UPDATE  11/21/83 Three New programs are now included on the distribution disk. The LS-100 driver (DRV2.ASM) can now be relocated above the BIOS, where as the other driver (DRV1.ASM) is relocated below the CCP by the install program (INSTALL.ASM). 1) LS-100.ASM - Is a revised driver relocator which allows you to specify the load address of the LS-100 driver which would normally be above CP/M. This allows you $ Ostandard values as described in the System Alteration Guide. In which case the INSTALL and DRIVER programs computed the wrong values when assembled. To correct this problem a FIND program has been included which will display the current BIOS and BDOS values. You can now use these values in the source code of both the DRIVER and INSTALL programs instead of the CP/M MSIZE equate.  JMANUAL UPDATE The following typeos have been noted in the manual.$ $$to have a maximum CP/M system size. Note that this loader should be run ONCE per cold boot as it does not check to see if it has been previously loaded. 2) DRV2.ASM - Is a revised LS-100 driver to be loaded by the LS-100.ASM program. This program currently requires 618 bytes of ram. If you make any changes to the driver be sure to update the DRVSZ equate in the LS100.ASM file so the correct amount of code will be moved. 3) FIND.ASM - Is a program that will display the %x%O Please make the following changes. 1) Page IV-3 Last paragraph.  IDRV1.HEX r,(offset)   correct to:  WIDRV1.HEX r(offset) 2) Page IV-4 Under customizing the install program.  7List the DRV1.PRN file and obtian the value for DRV1.   correct to :  qList the INSTALL.PRN file and obtain the value for DRV1. 3) Page IV-4 Under sample install session.  R,4000   correct to :  R4000 4) Pa%.mIxB@ @..Y[]{}AEIOU.:+-JP dccdxdBjKjPjVj0j1j2j3j4j5j6j7j8j9jk%~2y;#^#V## 2;~2y;+~2};##{l"z;R|";"z;O:Z;!<=O G q#s#r#ww#Gw!o;~#m #~ͪ*C6|/!N >2D6êo ͪ*C6|/ͧ ê*E;!9"E;Ê:B6C M ";ͧ 2 :C; x~>2 x:;*;";";ͼ*;͎. o ;2 "; ͧ !;w[wÎR R *@;W{k z!!4ʮ zy > W_ !Q;zV#>2@;{ ȯ2@;͌ x~ #à !9"G;! ]% >*G;:B6 "C:B6%C LH7 SRI UJ BPPL%>'Ng:;;!"B6"D6<=G:E67J*;~7Jp#~d_x2::;*:*:::g" ;yHG*:::g":::o&{2:y: ;ey_! ;*6;R:: ‚> ڲ!e::~œ=<<*6;-ʰҮ<>d lx_gQy2;:; !;4!;4x*;::e";͵";!%ge IV-5 Last paragraph.  (CALC: LXI TRACK ;SET HL @ TRACK#   correct to :  (CALC: LXI H,TRACK ;SET HL @ TRACK# 7& file and obtian the value for DRV1.   correct to :  qList the INSTALL.PRN file and obtain the value for DRV1. 3) Page IV-4 Under sample install session.  R,4000   correct to :  R4000 4) Pa%9k  e>@ddvgggggBDDF-hCenk<Ie uh fie  Bj Kj 0!j 1"j 2#j 3$j 4%j 5&j 6'j 7(j 8)j 9*j     2 0.         i)       "$6& (I*,.08:H4       +(C))00n  !AB IB  IB%pQ MT] MBc HMi FMo CWu PC PO} PA CP PN OP HE FO !Z;>-w n!v;>< ![;-9 !_;T !g;T !c;T !k;T c >< !r;-\ !t;-Ғ \ -> V>2A;ͧ%ڼ ͑"K;uâ *; *;>oGw#%  % w#- 6> ͧ% !> ONOF͗%]% 4}ͧ% g%MCg ͆| !4sx:Ê͌>2B;!Q;~6͌ڥ:4!B;6>[:4!_; !;͵*;!|;͵!y;õ*<;*K;zĎ>2C;>*M;_:Z;<=*w;͎:4%;4::#4!;4x!::*;e";!;x *;*#;"#;*;*;͵";!";";";!;~6py_!";";͵";!;4~!!;4!;~::5*;"#;:;!;2;*;";*;|:#;*;)::G$%==xxy2&;>2'; :6;=|g}o|*#;&*6;**;R"*;";:ī͗ͻ͗͢Cs\ͫ -\ͫs\͢s\*;"0;:;UͫcͲ*;".;*;)*!;T]:: ڈ:ʐ*;Î*#;&*;*$;,;ͻͻ*!;(;*;&;*;R|";:6;w#~w+͎  ~# % %   -_*_777{7w nw?VWx2z7W:Goocc56    /RCDTTVV2CCTTBT2STTICBTTTTVUUUVUUVVSSVUfVVTVVTUVVgVVUTVTVUTTTTTTSTTRRTRfTTTTSSSTTfTTTTVTVU   6NIQYdXfjly%27?QXivYN @@@@ on () off () INTERNAL ERRORFATAL NAME OF  TO FILEMERGE-% ͆|*w;͋!g; )!y;͵3!|;͵> :7*;#~+:A;͑:o;G!t;z*K;|f} > :Ͷ42o;u"I;!Y; :+ <*I;"I;!R;~ :# <›Ì:i> :> ;#~+͑:o;G~4#~i\#~i.# *K;Ͷ .:K;#~i  +:!o:2;}X>:2;:o;c >!o;w:2;~q>n>[c o>^#~4> [Á*M;:3;ʠR|:Z;e͎:Q;Ì:3;N#{ ʘ> :> [> :+|#>Ø!".g|,-% N͎O>G  %+~ !!x 6#.$%%$o>gAARDMxɅo|gg}o|g^#V#~#fo# ‚Gz—{xɾ~~/w~ͼ#ä   :.,;?!0?:ɷ @[A?a{['N#w@w#6:#6+Y T6.#Z6 dw# Ys0 {{:|sͥ_:§ {2b5_ͥ=!¼sü):OͥGHGxy"6$2P P=  )(qwC,# @ %)Print a file РԠ Š *** FATAL ERR F25: NOT ENUF MEMORY $ File  not found. Menus &  messages will display as @@@@ only.  WAIT  PRINT\PAUSED merge-printing\ \editing\no\file\ d ׽ *** Press ESCAPE Key *** INTERRUPTED***  E*** I***   F: mG! e~x7*`;:Z;e*h;*\;R| !͎ "w;!"~;";#"|;%:4[}> [G!P;~6!4x!r;^Gz4x!0GO!P> W>~a>- S }!O;~<> STk ‹!"O;F F*Z;&*M;"M;*\;͎*M;|͑!"M;*K;#"K;2Q;u*Z;>*v;> :4*M;|:3;*\;‹͑> [*M;|ñ TW͔ J.S!O;~-5R;!G̞#~^T@!O;4!͌ڈ:4<:4/!4!D;6> ̜͜:C;7*K;*:;Î'ͪÜNħ >2D6ç ['ͧ ͪ¾Ņ ͪħ :4ͪ<:4&&687<>|&*7"787ͼ):7_71*`5!~! 8~!:7!7~6_7''<>|&Ð!eɷ v&do>!#{ |<ʎs#rɯ7Ê>G!"{}O)|! !!~6w<x7z! q#~w['^#V#o & *7~G:7w26 "7:[5>!:!*`5#!6~\!5*7~w27*`5ͫ":6o&{!͔!*`5͎ī"ͪ*6:6o*`5}ͧ!o!6:!<=:!g=!÷!÷!:c5~<=#~ͳ !!0:H=!:I"=O3#:c5T"~ &"# "ye +~ ," ~!!m~Į!S"A> ͳ J" 6 # Z"!!!~x"!ͮ!ͥ" *`5"~"!ͮ!ͧ*H-&"`53#!"7:[5{" ":Ͷ!:d#*^\:]"!J#!S#!X&wO1):6.):&><)26!6.)2626/262654>G1:k5!H4O)~o :7a:61Êͼ):+/y)>!+Fw>2626ó))26 :6Ÿ)26:6<ð):6=26!"626ó)g:7O/ G:+:6)o#}!6Ěx:+ʉ)o *:6=1Ê)!6͚G:6 *!6):6̐):6W:6)_:6!6<*:6´* + @+:6/<_y!6q*U*qy!6ڣ*<26͟,z<26o !6:7ʣ*:6ң*z26ñ*z±*!6U*26*7"6:6O:6G/!((ͥ*6+"6gx/+!(y+*>͡(:I>(:6& 1 ` 1`:7133:6!6͚!6͚!6͚*7"7"7>26: /!6ɯ2L62r6~#26~26#"6Ñ1}26|26"6Ñ1~#26~#26"6:6=>$ԕ&ͽ11i`)2^#V*6 *6)))2N!6 :66i`)2^#V#^#V#͇2~#fo)DM!"q#p#N#F2 ~>)v& 2x2x2 2~>'v&#:6>,v&6 >*v&w!6Y2>+v&# N2^#V>(v&!6:6w>&v&͓2!$~v&><Cpy-M67-M6M6 M6M63M6M6#M6M6mM6t&/s^#V+ѷs~o #:7277>27!74!77!_8ͪͪ*7*͎l!7"J6:77͎?9͎({%}):7=!9=z27!97o >e!9e:͎ç!` .:7*7+##+6!.}1~6/ % ~6 %!!< nU6#~!͜>ͳ 1*5~*5~w#~<!5"5:c5/!&z!!:`G{ʳ  i#d*7*7[*7Ro&U\*7:IOD# C#*+a#}!+y)>26*`5"6 ]$ ]$]$2'!t#ʜ#ʜ#«#*6!ͫ"o#!####U$## #*`5%~!_! #$$#!#$$- $!#45 $>!w)#ʣ)#ʪ)!oy^>Iy <26+q#$:Y5:H$<26262626$_!>ä$o$â$%_!>!`5ͧ!01:6!6$~:`5!6!"6"626262&Wß,!6452626*7"6:6=+2626͒ͅ,+:626Ħ,Ê:IO *76 #=M+#m+ x GV+:6G*6+F+N <ʙ+"6gʹ++F+N 26Êʹ++++DM>26>.!m,### ʡ+#~¸+  +m,ʴ+26*7"6*76+r+s ͎,:6,,+~w͊,+*6 !i, ~d,#-, :,~Z,\,6.#w#w#> *6<BAINuHEvREwCOxOVy$$z26͌"6g>26j*7ó,#p+qg+F+N <,#Vp+^qBK,+V+^ oʬ,,, ,,,!91C4&M6M6{s6M6'M6-M6dM6!M6gM6|M6  w3Ô3>e A:)2323:>!+}ˆ3::> AU85& :ͳ *7+wF*|#6!26:?ͺÊ>X:VͽÊ>!*ey!5w+~#wz.!5"5"5P. G:a5Oxͱ:I x  yON#F ܔ ͱp+q ͔!o *7:IO&:H=! D3#:c5N%# H +9 .`ͫ" ? !!!!a5 È*`5>+,&í":`5 *`5-í">o͜:+A ]!& 626r!$261$r!:1%:1%:1%:1%:GOͪO%:C6I% y̔ x4%ê!%2S%%_:S%W~ʑ%#ʂ%###r%~|%#^#VÓ%g% ʗ% ʗ%!͗%%%0% %T])))_%%%0% ڽ%|7%%x 7 7 77?}81U8W8Y8[8]8_8a8c8q8}8e8g8i8k8m8}8}8}8{8}8s8}8u8w8y8}88}88888888}888}8}8}8888}8}8!Ø&?'ͥ"K'oG-!?'?1͉-:626o!$K'>c31̓͹$26:626!&26%×-!6~6& ->26!D6~/++! n1:7M*3.د27R1(:C6 .*7"73126|=Q3#.=b0.^#Vn126262626%>26/.3.26G:7l.x ʸ.?G~ʸ.|.o.#~ʼ.:7<#^#V++̂N26.}.26O~ʼ.###~ʸ.#ʡ.è.7#^#V|7!$/*`5o 0\/o .1/6/=r!& n55(???!ͱ6!Sͱ6ͩ6You are trying to run an uninstalled WORDSTAR.Please run INSTALL first.-ͩ6 ʹ6͢6~̢6 #ô6& Re:B6dbf:C6h:D6j͔$2'$Ù*6G*66*78ʙQc#^#VʏʔQln++O:d5Gyʱ¸:Þ¿>~͙܀ > :a5   >^@ :c5 ̎ !45 ͳ !a5 P H 4*7w#!6*7B +4:H=q :I*7e"7*7eB 5*7 *I&*7[gg> -¤ !!O: y#*`50> XO !X5 ws"g":[5!&U*5~̓!66:7!'!!à&͏G!6~6̀1ͪ:6'o&)&^#Vo&Di:7/!F6ˆ'5:6͎ *`5! ~!~! Î *6|!F6£'o 02F6*7"6':D6ʽ'(:7':C6'V(:B6'((!5((ć`:IO>(!:6*6^(*6^(:6c(>>(:626*7"6'O'G:IPx=(V(*7*6R@(> c(}c(| s(>^c(@!d5\‚(> Ç( ʈ(#*7++*6w͎ڞ(#"6:D6¼(:)ʹ(:f5!6V(0(^#V#(~#c((:&!+!7(26.)!6N61q!6F&~!"%/=r!8Í'>260\/ ͑!~!:7Z/!/v~Z/.%Z/6`]͑! ~!)(:7v/1=!60:7]͍'o :6!6͚o:7š/:6o:6/!6ڱ/!6ڽ/o&͔!o !<Ý/Q):6!606}:7G:Y5O*J6|!6/6:6!6ᠡ/6o ‡0($:D6!8:G6!8:610268I0x/I0͖0F0͜!"6o͢$:626:6f0!6~6!8*J6|!"J6͢$:626‡0>26!G6~6ȯ26:IPڣ0!7:E4 ~"8126×-:7O!60w:70:6=0w~=!6)!61)'j'Ea'' For maximum help (full menu display),  select Help Level 3 by typing ^JH3.  This message will clear when a key is pressed.  TO HYPHENATE, PRESS -. Before pressing -, you may  move cursor: ^S=cursor left, ^D=cursor right.  If *hyphenation not desired, type ^B.  (< < < M A I N M E N U > > >   | | |  ^S char left ^D char right |^G char | ^I Tab ^B Re'Hb scrn X bottom scrn |DEL lin lf|A Find & Replace |^J Help ^K Block  R top file C end file C |L Find Misspelling |^Q Quick ^P Print  B top block K end block E|Q Repeat command or |^O Onscreen  0-9 marker Z up W down | key until space |Space Bar returns  P previous V last Find or Block | bar or other key |you to Main Menu.  ^K PREFIX (to cancel prefix, press SPACE bar) 9 END EDIT/SAVE: D=Done X=done,eXit S=Save,reedit Q=a'' COPYRIGHT(C) 1980 MICROPRO INTERNATIONAL, SAN RAFAEL, CALIFORNIA, USA. ALL RIGHTS RESERVED. WordStar 3.00 Message Texts "Rm )L hge!!"#$2.()<)&''n)*%+-../////>0l00001,/W00RmRmA$Rms"w$%"&23C33=3344444445Rm425555.6N6Rm$";QJN'igW]VURm1QRm8-Z6-C.+0Rm...6Rm6P666Rm67Rmg7q7777'8m8Q9l99Rm99Rm:1:\::::::::;2Rm;5;Rmb;Rm;$Rm'form | (from Main only)  ^A word left ^F word right |DEL chr lf| ^V INSERT ON/OFF |^J Help ^K Block  ^E line up ^X line down |^T word rt|^L Find/Replce again|^Q Quick ^P Print  筭 |^Y line |RETURN End paragraph|^O Onscre'en  ^Z line up ^W line down | | ^N Insert a RETURN |  ^C screen up ^R screen down| | ^U Stop a command | 7 CURSOR: ^A=left word ^S=left char ^D=right char   ^F=right word ^E'Xbandon  MARK BLOCK: B=Block start K=blocK end H=Hide/display  BLOCK OPERATIONS: V=moVe block C=Copy block Y=delete block  ADDITIONAL FILES R=Read file W=Write block J=delete file  & PRINTING: O=cOpy file E=rEname P=  DISK & DIiRECTORY: L=Log disk F=File directory + MISC: 0-9 = set/hide place markers N=columN move * (< < < B L O C K M E N U > > >  J  砠 | | 堠 | '  >V<<2E4!9"C4ͨ<=:l2J:] @:4-:5-*C4͢=!~!!S!Ϳ' _ & < < < N O - F I L E M E N U > > >  D Open Document File | Y DELETE a file | H Set HELP LEVEL  N Open Non-document File | E RENAME a file | L Change Drive  X EXIT to System @ | O COPY a file | R Run a program  F Directory + | P    -  M Run MailMerge  S Run SpellStar  & < < < N O - F I L E M E N U > > >   ' =up line ^X=down line  SCROLL: ^Z=up line ^W=down ^C=up screen ^R=down  DELETE: DEL=char left ^G=right ^T=word ^Y=line  OTHER: ^V=insert off/on ^I=tab RETURN=end para ^U=stop  ^N=insert a RETURN ^B=reform ^L=find/reCplace again  PREFIX KEYS ^Q ^J ^K ^O ^P display additional menus 7  ^Q PREFIX (to cancel prefix, press SPACE bar) A CURSOR: S=left Side E=top X=bottom D=right enD line  ,R=beginning file C=end file 0-9,B,K,V,P=t' '  S Save & resume | B Begin K End | R Read P Print | (from Main only)  D Save--done | H Hide / Display | O Copy E Rename | ^J Help ^K Block  X Save & exit | C Copy Y Delete| J Delete | ^Q Quick ^P Print  Q Abandon file | V Move W Write | 렠 | ^O Onscreen  | N Column *|L Change logged disk| Space Bar returns  0-9 set/hide 0-9| H|F Directory+| you to Main Menu. ^P PREFIX: Put Control Character ' Y!%=#%=#%=#%=:`2Y5:c2+ͥ2b5~f!B6.:2c5K=~"=:b5é*͂="7:Il++"7"7="7+"7:Il++"7"7"7*:c5£=*HL&bj –=R+#"7"7*H-3#"7"7Q"7R"7:c5*HͿ-=|!]=>o&))))>=goR>.>O->26:H26=26=26S>:7*7>|& 7!!Y5~P>(P>6!"J6O-:H|>y|>6u>:I@|>|>~!8"J6>|&w- A4:c5:ª>®>:ʰ>>2d52e5>:2[5ͤ!ͮ!~"!N6 ! t6!q66.!66/:26ɛ'4h󭭭 | 堠 |  L Changed logged disk drive | a| R Run a program  F File directory + | P  | X EXIT to system  H Set help level  | |  孭 | E RENAME a file |  D Open a document file | O COPY a file | M Run MailMerge  N Open a non-document file | Y DELETE a file | S Run SpellStar  'g7o marker  SCROLL: Z=continuous up W=continuous down  DELETE TO END LINE: DEL = left Y = right r FIND, REPLACE: F=Find a string A=find And substitute  REPEAT NEXT COMMAND: Q=repeat until key pressed  '< < < Q U I C K M E N U > > >  | | |  S left side D right side |Y line rt|F Find text in file | (from Main only)  E top((Jin File  V=subscript T=superscript Y=ribbon color change  S=underScore B=Boldface D=Double strike  A=alternate pitch N=standard pitch X=strikeout begin/end  O=non-break space F=phantom space G=phantom rubout  C=pause H=overprinUt char RETURN=overprint line  Q,W,E,R=user printer controls SPACE=cancel prefix  '< < < P R I N T M E N U > > > J 젠󠭭 | 砠 | (  | |  H Display & set help level |S Status line | (from Main only)  B Paragraph reform (CTRL B)|R Ruler line |^J Help ^K Block  F Flags in rightmost column|M Margin & Tab |^Q Quick ^P Print  D Dot commands, print ctrls|P Place markers|^O Onscreen  $|V Moving text |Space Bar returns  |  |you to Main Menu.  (< < < H E L P M E N U > > >   (r enter one or more of:  number=repeat count, B=search Backwards, W=whole Words only, U=ignore case, N=replace w/o asking, G=replace in entire file. To search for misspelled words, enter one of the following - RETURN=search forward, B=searc2h backward, G=from start of file:  F - Fix word D - Add to dictionary N  B - Bypass word S - Add to supplemental dictionary I - Ignore word .  HELP LEVELS  3 all menus (Y TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  CAN'T EDIT A FILE WHILE MERGE-PRINTING --  FINISH OR ABANDON MERGE-PRINT BEFORE EDITING  FINISHING PRINT BEFORE EXIT  (type ^U to cancel exit command) ... FINISHING PRINT OF SAME FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  FINISHING PRINT OF .BAK FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  ABANDONING UNCHANGED  ABANDON EDITED VERSION OF INVALID  NAME:    NOT FOUND (]  (begin and end) | (one time each) | A Alternate pitch | (from Main only)  B Bold D Double | H Overprint char | N Standard pitch |^J Help ^K Block  S Underscore | O Non-break space | C Printing pause |^Q Quick ^P Print  X Strikeout | F Phantom space | Y Other ribbon color|^O Onscreen  V Subscript | G Phantom rubout | 󭭠 |Space Bar returns  T Superscript | RET Overprint line | Q(1) W(2) E(3) R(4) |you to Main Menu. ^O PREFIX: on-screen f(  | |  H Display & set the help level | S Status line | (from Main only)  B Paragraph reform (CONTROL-B) | R Ruler line | ^J Help ^K Block  F Flags in right-most column | M Margins & Tabs | ^Q Quick ^P Print D D Dot commands, print controls | P Place markers | ^O Onscreen  +| V Moving text | Space Bar returns  |  (and explanations displayed  2 main editing menu (1-control-char commands) suppressed  1 prefix menus (2-character commands) also suppressed  0 command explanations (including this) also suppressed  CURRENT HELP LEVEL IS  ENTER Space OR NEW HELP LEVEL (0, 1, 2, OR 3):  The LOGGED DISK (or Current Disk or Default Disk) is the  disk drive used for files except those files for which  you enter a disk drive name as part of the file name.  WordStar displays the File Dire(M Now printing file  "Y" TO ABANDON PRINT, "N" TO RESUME, ^U TO HOLD: PRINT?  For default press RETURN for each question: START AT PAGE NUMBER (RETURN for beginning)?  STOP AFTER PAGE NUMBER (RETURN for end)?  NUMBER OF COPIES (RETURN for 1)?  DISK  OUTPUT (Y/N):  OUTPUT  NAME?  USE FORM FEEDS (Y/N):  SUPPRESS PAGE FORMATTING (Y/N):  PAUSE FOR PAPER CHANGE BETWEEN PAGES (Y/N):  Ready printer, press RETURN: WARNI( ormatting commands  S=line Spacing C=Center cursor line F=margins/tabs from line  L=Left margin X=margin release E=soft Entry #  R=Right margin W=Word wrap   D=, ctrl dspy%  I=set tab stop J=Justify ! P=Page display (  N=clear tab V=Var tabs " TH=ruler display&  G=para tab H=Hyphn-Help$ SPACE=cancel prefix  ( < < < O N S C R E E N M E N U > > > M  󠦠 | 堠 | 󭭠 | (  | you to Main Menu. 1 ^S=delete character ^Y=delete entry ^F=File directory  ^D=restore character ^R=Restore entry ^U=cancel command  TYPE ^KP TO CONTINUE PRINT  TO RETURN CURSOR TO POSITION BEFORE SAVE,  TYPE ^QP BEFORE TYPING ANYTHING ELSE.  TYPE 1-9 TO VARY SPEED, SPACE TO STOP *** WARNING:  WRONG VERSION OF WSMSGS.OVR --  SOME MESSAGES MAY BE INCORRECT. *** *** WAR( _ctory of the Logged Disk.  THE LOGGED DISK DRIVE IS NOW  NEW LOGGED DISK DRIVE (letter, colon, RETURN)?  Use this command to create and alter program source files  and other non-documents. Word wrap defaults off;  tabbing defaults to fixed (TAB chars in file; 8-col stops);  page breaks not shown; hi bit flags not used in file.  For normal word processing uses, use the "D" command instead.  Use this command to create a new document file,  or to initiate altera( NG: You are printing the same file as you are editing.  The last saved version will be printed, not reflecting un-  saved changes. Furthermore, WordStar will not allow you to  save the file being edited while the print is in progress.  END EDIT (^KD) BEFORE STARTING PRINT.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  TOO LITTLE MEMORY FOR MERGE-PRINT  *** PRINT OUTPUT DISK IS FULL. PRINT PAUSED. *** THAT PLACE MARKER NOT S( a  L Set left margin |C Center text |J Justify !| (from Main only)  R Set right margin|S Set line spacing |V Vari-Tabs"|^J Help ^K Block  X Release margins | |H Hyph-help$|^Q Quick ^P Print  I Set N Clear tab| 󭭭 |E Soft hyph#|^O Onscreen  G Paragraph tab |W Wrd wrap |D Prnt disp%|Space Bar returns  F Ruler from line |T Rlr line&|P Pge break(|you to Main Menu.  (< < < H E L P M E N U > > >     (NING  SCREENS OVER 48 LINES HIGH OR 120 COLUMNS WIDE  HAVE NOT BEEN TESTED AND DEBUGGED. PROCEED WITH  CAUTION; REDUCE WIDTH IF BUGS ENCOUNTERED. *** WARNING: DISK FULL,  DELETING OLD .BAK FILE TO MAKE SPACE  (NORMALLY, THE PREVIOUS BACKUP FILE IS DELETED  ONLY AFTER EDIT IS SUCCESSFULLY COMPLETED).  CAN'T DISPLAY PAGE BREAKS IN A NON-DOCUMENT FILE *** WARNING: WORD TOO LONG TO FIT MARGINS  PUT AT FILE BEGINNING FOR CORRECT PAGE BREAK DISPLAY  Normally press RETURN only, o(tion of an existing document file.  A file name is 1-8 letters/digits, a period,  and an optional 0-3 character type.  File name may be preceded by disk drive letter A-D  and colon, otherwise current logged disk is used.  WARNING: You are editing the same file as you are printing.  WordStar will not allow you to save the edited version  until the print has completed or has been abandoned.  ALLOW PRINT TO FINISH BEFORE EDITING A FILE.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMOR))ETBLOCK BEGINNING NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END MARKER BEFORE BEGINNING MARKERBLOCK TOO LONG -  MOVE OR DELETE IN TWO SMALLER BLOCKSCURSOR NOT IN RANGE FOR COLUMN MOVE/COPYCOLUMN READ / WRITE NOT ALLOWED THAT FILE EXISTS ON DESTINATION DISK.  DELETE EXISTING FILE FIRST,  OR USE A DIFFERENT DISKETTE.DISK FULLINVALID COPY LENGTHADDRESS IN "HOLE" (TSTADR)MEMORY FULL (MAK256)MEMORY S)M file then press RETURN: *** No .DF before .RV: *** WARNING: Overlong data value truncated *** Invalid variable name in .RV command ignored *** WARNING: Data exhausted, null value(s) used  ***** Print Directives *****  PRINT CONTROL CHARACTERS may be entered anywhere in a line  to invoke underlining, boldface, subscripts, pauses, etc.  They are entered by typing ^P and a letter. A directory  of most print cont*rols is given on the ^P PREFIX MENU;  )har for next frame:  THE FOLLOWING WORK ONLY WITH INCREMENTAL PRINTERS:  .LH n Line Height in 48ths of an inch (default 8)  .CW n Character Width in 120ths of an inch, for standard or  alternate pitch, whichever is in use (see ^P menu).  (default 12 for standard, 10 for alternate)  .SR n Subscript / Superscript Roll in 48ths of an inch (3)  .UJ OFF/ON "MicroJustification" off/on (default ON)  Use insure that printed column alignment exactly  matches screen)GAGE n is page number of cursor (disregards .PN's)  LINE n is printout line on page of cursor position  COL n is printout column on line of cursor position  INSERT ON shows if character insertion is on (^V command)  MAR REL shows if margins are released (^OX command)  decimal shows during decimal tabbing  LINE SPACING n shows if line spacing is not 1 (^OS command)  PRINT PAUSE shows if printer is stopped (^KP to resume)  when WAIT appears, st)HORTAGE (MKSP)POINTER > 64K FROM CURSOR (PPTOAD)NOT ENOUGH MEMORY  OR YOUR OPERATING SYSTEM IS NOT  RELOCATED TO MAKE ALL RAM AVAILABLE DISKETTE DIRECTORY FULL CLOSE FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKETTES RENAME FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKETTES INVALID SCREEN HEIGHT OR WIDTH  MESSAGE  Can't edit a file of type .BAK or .$$$  -- rEname or cOpy before editing BAD OVLY #BAD OVERLAY FILE, OR  WRONG VERSION OVERLAY FILE Overlay file  Not Fou)| see manual for more.  DOT COMMANDS are special lines beginning with a period and  a two-letter code. They control page breaks, headings,  page numbering, page layout, etc. Dot commands are  typed in like other text.  Space bar for DOT COMMAND SUMMARY, ^U to return to editing:  ***** Dot Commands *****  PUT EACH DOT COMMAND ON SEPARATE LINE, WITH . IN COL 1  .PA new PAge  .CP n new page if less than n lines left on this pa), e.g. for tabular material:  Put .UJ OFF before table, put .UJ ON after table.  Space for next frame, ^U to return to editing:  SPECIAL CHARACTERS in HEADINGS (.HE) and FOOTINGS (.FO):  # prints as current page number  \ do not interpret next character as a special character  ^K do not print following spaces if on even-numbered page  PAGE NUMBER POSITIONING: If a footing text is specified (.FO  dot command), the default bottom center page number is not  pr)op typing. Press space bar:  If page break display is OFF (^OP command) or edit  was started with N command, then Status Line shows  FC=nnnn FL=nnnn in place of PAGE n LINE n .   FC=nnnn cursor position in characters (bytes) from  beginning of file  FL=nnnn cursor position in file lines from beginning  of file, including dot command lines   space bar:  ***** FLAG CHARACTERS (rightmost column of screen) *)  nd FILE  NOT FOUND  (The seperately sold file   is required for use of chosen function.) NOT FOUNDPROGRAM IS AN EMPTY FILE!?PROGRAM TOO BIG FOR  MEMORY AVAILABLE UNDER WordStar LET PRINT COMPLETE BEFORE RUNNING A PROGRAM  NOT ENOUGH MEMORY TO USE "RUN PROGRAM" COMMAND  File  Not Found --  Can't Run a program unless  is available.  For spelling check, enter name of file to be checked.  (^R for last file edited) $  For dictionary maintenance, ente) ge  .OP Omit Page numbers when printing, starting this page  .PN print Page Numbers, starting this page (default)  .PN n set Page Number to n, print page numbers  .PC n Page number Column (default 33 (30 if 64-col screen))  .PO n Page Offset: extra indent when printed (default 8)  .. text comment, not printed  press space bar for next frame:  .HE text HEading used until next .HE (default blank)  .FO text FOooting (replaces page number) (blank)) Binted. Use a # in heading or footing to position page  number where desired. ^K followed by spaces followed by #  may be used to produce alternating left/right page numbers.  Space for next frame, ^U to return to editing:  ***** Merge-Print Dot Commands *****  .DF filename specify Data File for .RV  .RV name,name,name,... Read Variable values from data file  .AV "prompt",name Ask operator for Variable value  &name& anywhere in doc't prints as variable va) ****  < line ends in "hard" carriage return, entered by user  space this line break arose from word wrap or paragraph  reform, and may moved on subsequent reform  + this line of document continues on next screen line  - next line will overprint this line  ? unrecognized or incomplete dot command  M Merge-Print (optional feature) dot command  P page break  : this screen line is before beginning of document  . ) r name of file  containing words to add to or delete from dictionary.  FILE  ALREADY EXISTS  FILE  NOT ON SAME DRIVE  TOO LITTLE MEMORY TO COPY WHILE  EDITING OR MERGE-PRINTING  FILE  EXISTS -- OVERWRITE? (Y/N): FILE  IN USE BY WordStar   P=   Press space bar after reading screen: *** Invalid Dot Command Ignored: *** File Not Found *** But found, and will use, *** Cannot change disk in drive , request ignored Insert diskette with)  .PL n Paper Length: total number of lines (default 66)  .MT n Margin at Top: # lines, top paper to text (3)  .MB n Margin at Bottom: # lines, end text to end paper (8)  # lines text on page is PL - MT - MB (defaults to 55)  .HM n Heading Margin: blank lines between head and text (2)  .FM n Footing Margin: blank lines, text to footing (2)  FOR PAGE BREAKS TO DISPLAY AS THEY WILL PRINT, USE  .PL,.MT,.MB, AND .LH (next frame) AT FILE BEGINNING ONLY.  Depress space b)4lue. variable names are letter then 0-39 letters, digits, -'s. .FI filename Insert document File  .DM message Display Message  See manual for details and additional commands. Merge-Print  is an optional feature, operational only if MAILMRGE.OVR is  on your diskette. Press any key to return to editing:  ***** STATUS LINE (top line of screen) *****  ^JS at left end of line is command now executing  A:NAME.TYP is name of file you are now editing  P** after end of document press space bar:  COMMANDS TO -- ARE --  move cursor on main and ^Q menus  scroll file up or down on main menu; also find (^QF)  delete text on main and ^Q menus; also ^KY  move or copy text on ^K menu  end edit / save file ^KD; see ^K menu  print (while editing) ^KP  set tabs and margins on ^O menu  reformat text ^B; ^JB gives info  find a string; replace ^QF; ^QA; ^L repeats last *sired justification (^OJ) & line spacing  (^OS), place cursor at paragraph beginning, and type ^B.  To obtain WordStar's help in hyphenating long words, place  cursor at beginning of paragraph and type ^B.  press space bar for more:  ^B reforms lines to end of paragraph as indicated by "hard"  carriage return (< in rightmost column).  Thus, it is important not to use RETURN between lines  within a paragraph when entering text.  ^B may be used to form h*for ragged right format),  or to turn justification back on: type ^OJ.  Line spacing and justification settings apply to text  subsequently entered; they may be applied to previously  entered text with the paragraph reform command (^B).  press space bar for "Tab Stops":  ***** TAB STOPS *****   To set a tab: type ^OI. WordStar will ask for column number.  Type column number and press RETURN. Or, to use cursor  column, press the ESC*'  press space bar after reading:  ***** PLACE MARKERS *****   Up to 10 place markers, identified by numbers (n) 0-9,  may be set in a file while the file is being edited.  To set place marker n at the cursor position: type ^Kn.  will display to indicate the marker position.  To return the cursor to place marker n: type ^Qn any  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the*  press space bar for "entering text":  ***** ENTERING TEXT *****  To enter text at cursor position, just type the text.  Use RETURN key for paragraph end or other fixed line break;  let word wrap form lines within paragraph.  Type ^V to turn insertion off (to overtype) or back on.  ^N may be used to create blank lines ahead of cursor,  as before inserting a paragraph.  Use ^B to realign margins after corrections.  ^JM shows info o*anging indents, change margins in  mid-paragraph, etc. The exact rule is:  "^B starts on the cursor line, at the left margin col-  umn, or at the cursor position, whichever is farther  left, and proceeds to the next 'hard' carriage return".  press space bar:  ***** Hyphen-Help *****  ^B will occasionally stop before the end of the paragraph  and ask you whether you wish a word hyphenated.  Following the instructions that appear on the screen, mov*APE key. To set a decimal tab stop,  type "#" before typing column number or pressing ESCAPE.  To clear a tab stop or all tab stops: type ^ON.  To tab: type ^I, or press TAB key if present. Tabbing  inserts spaces to next tab stop if insertion (^V) is on.  Tabbing advances cursor over text if insertion is off.  press space bar:  ENTERING A COLUMNAR TABLE -- We Suggest:   Set a tab stop for each column of table.  Clear all other tab stop*[ marker position.  press space bar:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or written to a file (^KW).   ^QP moves cursor to its position before preceding command.   ^QV moves cursor to start of last find/replace, or to  * n margins, tabs, table entry, outline entry. press space bar after reading:  ***** TO MOVE A BLOCK OF TEXT *****  1. Put cursor on first character, type ^KB to mark start.  2. Put cursor after last character, type ^KK to mark end  (for end line, use start next line to include RETURN).  3. Put cursor at destination, type ^KV to move the text,  or ^KC to make a duplicate copy.  To undisplay markers afterwards, use ^KH.  ^KB and ^KK may be entered* e  the cursor if desired to adjust the hyphen position,  then press "-" to hyphenate, or ^B to not hyphenate.  To turn off "hyphen-help", type ^OH.  press space bar:  ***** MARGINS *****  To set left margin: Type ^OL. WordStar will asks for column.  Type desired column number 1-240 and press RETURN.  Or, to use column of cursor in file, just press ESCAPE.  To set right margin: type ^OR, proceed as above.  To set both margins to match text * [s.  If not at end file, turn on insertion (^V),  or use ^N to make blank lines.  Tab (^I) after entering each table item. After last column  on a line, tabbing will move to first item on next line.  space bar:  OUTLINE FORMAT TEXT ENTRY -- We Suggest:  Set tab stops at desired indentations.  Set right margin as desired.  For each item:  Type ^OG's as required for item number indentation.  Type item number.  Type ^OG. *  source of text for last block move or copy.  press space bar:  IF THIS DISPLAYS YOU ARE USING WRONG VERSION OF WSMSGS.OVR ext for last block move or copy.  press space bar:  IF THIS DISPLAYS YOU ARE USING WRONG VERSION se markers can be moved (^KV), copied  (^KC), deleted (^KY), or written to a file (^KW).   ^QP moves cursor to its position before preceding command.   ^QV moves cursor to start of last find/replace, or to  *  in either order, with or without  other intervening commands.  All above commands are on ^K menu. press space bar:  ***** PARAGRAPH REFORM (^B) *****  To realign margins of a paragraph after corrections, place  cursor at beginning of paragraph and type ^B.  To change margins of paragraph already entered, set margins  (^OL, ^OR), place cursor at paragraph beginning, type ^B. To change between justified and ragged right, or change line  spacing, set de*_in a line already entered:  place cursor in that line, type ^OF.  To temporarily set left margin to next tab stop: type ^OG.  Margins apply to text subsequently entered. To remarginate  text already entered: set margins and use ^B.  press space bar after reading:  ***** LINE SPACING AND JUSTIFICATION *****   To set line spacing: type ^OS. WordStar will ask for line  spacing. Enter a digit 1 thru 9.  To turn justification off (* Type text of item, without using RETURN.  At end of item, press RETURN. Left margin resets.  Press RETURN again if blank line desired.  press space bar:  ***** RULER LINE *****   L----!----!----!----!----!----!----!----!---------R   L Left margin (set with ^OL)  R Right margin (set with ^OR)  ! regular tab stop (set with ^OI, clear with ^ON)  # decimal tab stop (set with ^OI, clear with ^ON)  - other positions between margins  +++BZBZBZB*;#";o*:&K>A~1APYÞ*A*:&:;HAK*:":*:":!*:REAK*:":*:*9<|R":::_jA*:|*9 –B>!,<*:-,=AҵBAÙB!";0 +4~6"qqv!Cë:!2p ë:'C!7:72:qv!7ëhq2'́qhqFq!7I*7yTJvM!7xVKJqJy£JqJ!"6!7xH*7͈C͟IҖqqJp:C6G-$ͱ$!8.͔ 2':D6:C6G-ôq8q8>25G*B6|!8s:C6s$:Y5r!8͔$:626n$:!4$r,p2JZ1%͹$*+?1*`5"6"6*6~!͔$a#+w#͟$~ʂrͨrږryrsږrGͤ–rxG8x͔$}!+y)8ͩ$8@rկ ®rsr.r#r rͤ7rr rrr>  r~+7*7w# q"7z̈CCp!"6Uq!vj:v>qnp>v&:*|t!Hv:Gv6q:*nq*"v|> v&}> v&:v>v&:v>v&͉qÐp*hv*7͎ҥr:u®qïq͎ҥrtWr|¦qqtqqq:IvLr={rڦqqLræq{ræq!Dv:Iv7ȷ:Iv=4rLr;r:Gvo&A> trr1ru(r;r>2IvxeÏq{rA%rQr*7#"7u>2Iv͈C>t:Iv={rLrnræqgo2Dv2Iv#C>2Dv>2Dv2Iv*Gv&"hv|2u͔ xr+!Dvf:Ivo=Lr{r}2Iv|2Dv"hv>2u*Gv|g*Gv͹R8L͉V*Gv"Gv2Av"Ev`i"Bv2?v<+ COPYRIGHT (C) 1981, MICROPRO INTERNATIONAL, SAN RAFAEL, CALIFORNIA, USA. ALL RIGHTS RESERVED. WordStar release 3.00 overlay file number 1. overlays for no-file commands and editing  NOSEY, AREN'T YOU?   Bý<>AE>x ʡ</{/ C:<><26;!:: *;<6#";=Ao͍ͩs{é7!4k$%Ñq!p~Žq4w#…qp~#͹$O*+*`5"6?1"6*6~!͔E$a#͟$~^ry:7ĥGrrrrr8y=qͩ$8îqyr̈́r+-s#.:*? пͤ#~+:1s~1s@##ͥ7$:C6 tKsͱ$8Zs:C6tmsͱ$8.͔ 2':C6]sͱ$.pxs.0p!4:4̎sù$~ʤs ʤs.#ʧsÑs6.#7 ʹsw# ¬s+~.s#6Ê*ps!s#~͹$2'*7*7R!)͎?!=8""J6!_7t!:; ͂7?o+2Iv2DvLs:&vogss&"GvDsnrtst=s͈tt$s"EvLs*EvDs*Gv&[tvuʨutsTsvu[t}uqs33"Ev!sKât͚tځuŠsnr͚tڛuʕu*Gv"+v:&vg$o"Gv2Dv2Ivt*+v"Gv7t|Ҙs˜s:&vs+Lrs[t:Gvg:HvGu|sDM vuums"Ev:Gv&oA:HvtyGeu>2DvmsmsTs͈C8LyG;rQ8LQt;LNt͈Cs͈tt |t |t͈tGx*Bv}”t7+"BvẍCKt!Avtʾt t6 6Út6Gͭt>xɯx t#t+:Dv2IvGux + YA A A AL>@ !> :=%>:=A6#J= J=~*:::O ~!:ͥ>!":*;ͮ>========!=F6#>=J=~6# Ox͡?ç=":!::!;".2;::?Y>͡2:2:AWo x4>!:~6)>::ͪA2E6W>2:2;:;!:’>*:*:R*:>*:>͎Ғ>2;?T?ͪo:J= > +~<>*;++~:>>>>>ġ?#+ qy(r!7r8îq(r8îqy\r̈́r®q\r8͹$2'!Ur#~®q͔$}!+y)8ͩ$8îq!M6r:7ʦr!:r!vr!87r:C6ʾr!;r:4!;r# ͂8þrկ rMss.r#s sͤ71s&s s1ss>  's~2pGOy*77sx0q:2i52g5:I!ڈp~<2k5>24!vi.>2vC!p ̀ʾp!p ̀p!8"J6×-!v.!6.292F2I2[[-*7"v"7p*7*7R|<2 72 7|D!"7>2 7%q)"7,q2 7!5wȷ!  .>2%!:C6!4̗!:~ͣwv:Jtqw::ʀq>26_7 !p ~87!p  :4=q!CS!7v!4:8:6q6 #:v+!4v8!5~8:4=r!SC+ Gu #|t͝r+t:Dv1u||t:Gv)u|t>2Dv7=|t>2Dv:Hv|t|t)u> t`ueu}JuWu# }eu Gx*EvóGóG͈C>kD> kD!Þu͈C8L͈C:&vus  ¶u vu:Hvu|s8uo|uu%uEuͳoÊeu8t çpôp2vþp>2v25Ok$%p͹$!n5L#25yp>,cp͹$!5L#25>)c͔$+ *:\A! >!:ͥ>*:ͮ>9?F#>.?J=~ O#x͡?{?> ͡?":";{2:!:::;2;!2>!:ͥ>*:\A*:::_>G{ʛ?H>G>y”?ʕ? O>xF͡?w?*:\A2 ;WG ҙ@ʙ@ʙ@?2;:?:?:?q>2;@@@>@A?::=$@<<=͖B@9@¢2:>3@N@?::)>@!:1A#yHͿ@::x :=*6;>AͿ@î@Q::@:::=@@z@z ::: @::: ! Z+s`t!͎tt!8"J67:77Z1tt!75t!7#͎+Mẗ́twt2G6pvtLp::2J:v2:Z1$24: 7«p#8rs(%÷p%8xss2'vpp6sp87p2726:+2_5:^5y)[-'Cq:6 q\!+Sv:6v> v&:>(r293r26p(%v!p :50q:+2^5:_5y)͉):C6Ărdr!8"J6:Y5=*J6!a!Z5r5!8"J6;!: ͂7?ɛ4u pcptp:*/Wͳṗp!vjvLzWvLPj!7I*7:*r̳G31!vPjnpͳpnp,p!vj͇p:*ʤp:Gv2Hvnp&q͆rv2'5k:*ƒqCÐpnp!vj!vj&q7p*7*7Rp!U*v͎> v&31AMG2'o ixg"6!7G*,,*`5!5 .>2525:59q~!p!5 L#rqo?q(:5Rq:5kk*5"5>r2'!vͨjͤq{q*5|!p!pà&:5q*5|ʎq+"5:5[qg:5JÔJ?1 ͎rxͨsڼq͎rq͈C2'͗qҭq:5kk7!!:5:55r:5.rĨrr:5:5*7eÈCMh:5*7eC*7!5mrͮG:5:55ro /*7lÈC!n5x:5Srmrermr>+wy<<+w#y25~ʈrr>  > # pr+q#:5:5 r8LãrK?ÈC! p"60͍''/r@Yr>N!d5 7*7~ % *6~!%r͑!~!r2',.1TJUMNF TAB AT COL CLEAR./; A for all)? ͱ$Bp1< 2)!6~6tq61)!5DpͶq2i52g5<<<2k5===!g5w!i5w̓s1)=xq*"v|}q>q<>!  r!!Þ!"Þ!#Þ!$Þ!%͞?1!&1)Þ:'!(r!I8"J6!*rHp!5͈s͹q_z#?rhrhr1)y!I4.ÊrJp!5A͊sDr͹q_{q!I4eڃr)))){/w!4+ʢr~ʑr¢r{2H41)tksr+C!vͭj@s*v*i5R*k5*v|r7_}r!vj> kD-r!vjtks,y``0   0m͛l?ace system disk (if removed), Hit any key to return to Operating System: C~$zf%{| ,!18!4ͧq)qr;!+5$rA8p:*5q,qr!A5/88s":;q!G5?88s"<;q!M5C8:B68s">;q r38!4:̧q58#ͧq#:4/78̧qw98͹$2'!:; ͂7?$qqN!q#+qAxq#~xpÿ*sqq>;!q#~͹$72'?:62626:626n$>(r>%͹$O*+?1*`5"6*6~!͔$a#+w#͟$~|rͪrڐrrG8y=ʢrx͔$}!+y)8ͩ$8Frͩ$8Frկ °rsr.r#r rͤ7rr rrr>  r~,ͤr͡sys#?"sͩ$ 87B,s-2s>25G@s>2525NJs25WUs>25U`s>25> c"p$p͹$7~͡s#bk))ܝs0_ܝs"5|s!0?::5s!7s*7sÈC!7s*7ltüsIGyOxG7tt  t#s+at#ss#Ltt #0ttattѷt Btat# t~͡s>Ҳt~>ɛ,s+͈C=s:v́q:v=͛q1)rK*sv"v͒kͭ7ͣks *v"svK*sv"v:sv_͒kͭͣkSsKs!:r#?r-frKsÊs%͔$L#Gy¸sͤ#ʶs!¸sW#ͤ7ssͤ{ŒsҌs~:0#bk))es*u(q5tSPELSTAROVR #1 COMMAND? WHAT???   NOT FOUND  Enter name of program you wish to Run,  optionally followed by appropriate arguments.  Example (shows disk space): STAT CHECK / ADD TO DICTIONARY? ,1|*"|*"||͕{9|͘{y{ʊz|ʊzڊz!\!y͘{!4y͘{d{{:|{>1|*|"*|"!!|͐{!|͐{|{z!|ͣ{{! }ͣ{{-||9|3|$:|9|*|:|?|:| {!|ͣ{{! }ͣ{Gx{>2|1|ݏzyʈz 8{*|>2|2{2|͜|F{:|F{1|! }ͣ{Èz!y"*!a{͐{!!{͐{!|"Õ{H{:|x~# Ø{^#V+~#ʹ{{ê{!~ͪ{ê{O> {2|>*_y{{N#!{,ʷ s#.:*? пͤ#~+:3s~3s@##ͥ7$*`5&~!bk͔$L#ͤvsͤjs68LʲCڵC*7["7`iͰLzL͚D*7[F*7"7"7zL͏GïC*7"7RDͼL D ,  qpppp(p:pÈpÙpqKK7p+pCf+L;LMp@p#D*Pv:6O~`opyL`opop Zp~~wyL`…pDM2v6P[jKKDhËp:pv*g5iڳp*k5+++͓lڶp*i5"g52pv!vͭj1)*6"6!6Þ!dp!d"6>26!"6:6*v:vpv, 24:C6:q!8"J6w-~͎!86q26̀1!|!. !!86q!~8!"|~2|!>"|:4=t!*pt%$p͔$!,uML#Ϳͤy6sq&p×q!y6C#6O#6Mq(p×qyͺr#yͺr23y4y~# qy͔$:42|!+~w26.wͅ"͗*y ?w-! !A4!~yR++R.!yyRR!yy[!Y|y[ͫst!~Y|[! Dկ r͎sr.r#r rͤ7 ss* s , q5x>4!|B|!}B|!}B|!}!}ͣ{ͣ{! }ͣ{{n1&r *;Gw#6*;w#62::Z;2::2:2v;*":!"K;:2A;>2@;Z;!fG#:IODrN +y=!7#͎+ir͠r͓rXr!7͎Ҋ;r++++lr!8d Hit any key to return to WordStar: Replace diskette with file , hit any key: *** file  still not found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short) *** ***  found is bad or incompatible version *** ,   bDC HïC|ïC*7["7F`iDͼL W W OD WD ͋LbD;D͏GD G*7w#"7+ͰD`iDͰL8D͚DÃD*7"7ôD2vx0:*7R:'/̼ED|E E E#D*7+ [!"v"v"v͠Fx0 T%uEEx0  oE AE Ex0  Efg*v#"v*v#"v:'bE*v͎jE> ͧEE>ͧEEE:EE*v͙Es#r!"v*v#"v*v&)*vg:'2lv|bk+Ó_:v*v*v:'FͼE!EE!E]% FFLHTFPLiFMToFMBuFCP0F, iK2q!vj*vK2qqf!vv͉d>267ɯ2v{͹qq6q{͹q*q7?Cqͧq{xq͹qͶqʆqͧq>2v͹qͶqsqE7:v7͹qSʝqD q͹q-7+vM"v#{ʿq2'K? ܔ ڿq7*qɾ#45q s6RqhqwqÑq&rSrqqqqrrërrqq r9s{IQ0 ENTER space OR NEW LINE SPACING (1-9): LEFT MARGIN COLUMN NUMBERumn)? (ESCAPE for cursor col RIGHT For decimal tab stop enter "#" and decimal point column  SE,r ss>?ss> s s~+s#.: пկ  ps~ͅs#*?+sͤ#~+:¦s~Ҧs@##ͥ7~#fo"t#R"tstsottg*ts#zw+|s~w#+|s*tF#"txG s8$:Y5͢$:626n$%ͩ$"p>24,q$y!p \t>/v&!8t%!4,u%,p͔$:!,uL#Ϳͤy6sҠt&pqt±t(pqt#yͺrryͺr23y*** xm6lm6f161am,Hy^C Cannot return to WordStar. Replace system disk (if removed), Hit any key to return to Operating System:  WS.COM Hit any key to return to Operating System: s(pp:7:C6s6͇2>up:C6up!D6~6Cp:B6Z1 >2:$:7]p)8!5+8q>2:2D6/2:2B6:7ěsB!:.4!$;!5r'8:7Ēqp+~!8¼p"J649p~#p!5~pZ1!9"sͩ$-8:6<26 r:6r!͟$=r-0-PAF% E> ͧE*v#"v% F>ͧEFEͧ%F% F*v*v#͎%FFͧ%FF%g}2 vÑF! vxF!vxF!vͧ%FF%ҊW{͘FͰF| FO: v> !f v*v*v* vR|F`h: v/<_F Fi`"vÊ 2vx%G  GG FJG`GF:'GJG`G3GF:vOqG*v+"v:XGJG>2v!v454T%*v+"v*v+"v͙E{"v*7RA|#O ʋG wGxMG:v1G*7NJ*7qG͋G0OG HGGºG ͐D  *7*7͎!7!7IxŠͣHz{-6~6N/ cN:6*6*67_N2626qN&* 3.GNy*N!ex *N*6"6"6"6y26x26:6!6nN26-vLvLíj:Y5ڸN͍'"%:6> 0026o $͖0o͢$:626ɯ2626:Y5o!ͩ$M88L K͈CKNNN!% O ܔ %7N!6~6ʦOʹPAO`i+~+++1O6! ^#V{rOV`?G1G:6[O>`Ox=e`ͣRckL7>~.`P͙QҲO*Rv~ʔO@_PÂOb` ʲOh_͍QÔOʹPAO͔QPPAO$PvP{2@v[bV#54+U:ivbV*0v*hv͎UGxG"0v26=2/v*+v ÉV!"hv9"+v!Wv~ʠV6>2VvvLz2]v>2\v:22v!:v#:* 2jvW:Dv^`:+^:6!6^:6^26ͳ)1)ͥ"> ͜ `'_'_!tÏ^:6W0#w 7_||g}o&wPY!x[!p0`i&wy_&wr_PY!x[!X_h_=‰_Mæ_DML_`0͹R`é_*w:CW __͗L___7 _::6h``-XHIG>͕&>2 7!7jH*v*6͎-H"6!7jHYHR*7͎GH"7*7͎UH"7Ê*Z7*\RI`i)\wH!7#͎+ڐHHͺHH!7͎ҊH++++ÓH!7I ͺHҫH####7͎I++ws#r+##s#rÊ++Iw#r+s+r+sÊ!7w[?II>ܘIڊI: 7GO IvIڊBI!64F! 7ZI=O: 7=G͟IsI hIÉ*7+:Vv7!Wv~‹I6!v̭j͈C*7#zI*6*7R*7͎*v*6͎vIdIM*6#"6"7*7JI:\7WlzTJI*6-M5kĈCj2g5:lv͔QòOL :6e``i"PvL͉V:%v26*&v" v""v:(v2v:6VP̀1 o :vL`o:Wv!vj2WvbP2$v!6~6/o ’P͑! ~!:6=ʡPͭPڨP7ԭP1)!65lԉl͹RͅR7ȷ$^PʹP:vL`P!6^͍QP>P:6e`2&w:vW!C?Q! 45QͯRP=6++++!CQEQ! ~QͯR!C?Q#Q#QbPLiUڂQ͉V͗LuQ_\_͏RPQzbg 整͏RͣRzWL_L:6=ÖQ>e`! ʬQ~wýQ ʷQ~½QQQͣRͅRQbPLͅR͉V ͣRͅRRzOR R R͗LiQ_-@ X )WX*hv*0v#R|}&X>=,XOyFX FXFX 3XxgðWWxGX'X*hv|}/<7:EvpX=sZ:Av:*2Ev.[:ͮXY:͙XY:;vʦX:2v 2jv͙X:\v2\v#́\X:͙X:"Y:͙XÝ\> )W]SͱX X:X:͙XKY YÝ\YY#:ͮX@+:@v[> O2?v:]v-TXv:\vMwO\GY͋\:*UY:AvzY:kvG_Yw#]Y:jvwo 2VvXvL:CvUY:2CvSZhX:Ev=W:kvGScYw#¸YpXïY:`v<2av=YYY*hvZ[j74ZM- ~&w!C)`:Ch`!C/8`W:C&w_H` :`G1Ox1!6/<12vog))Bw DM!BwA 4_}:)ʑ`>!f5FO:6ʟ` *6|ʪ`:D6!6O!: #~ ` ½`:I'`V(!4(́\`͡(C*v#a(C*v#a(a͡(C:v_*vͰL aͲa(C*v#Ͳa(C*"v#$%>aA>-c(a:$vc(*6|ja>+0((*7*6Re."6:f5!6V(~ʁa>͡( C:pvʏa>͡($Cʛa>%͡("C:)a>0͡((C0c(;aHa+|axa`i;ac(iÎ :6:6W?- *7͎J*7YH͎&J:kKJ*7YH͎87>JdKJM*7+"7J"7:G+~# `J> iJÊJͣH?IPK*7!7CKãJJqJ!7)K*7ͼJJڲJ2\7"7 ¦JsIg77797~J#J7>>:9!777:v7qJI!7,K*7gvsI"7 KsI?I*7ͣH͎UK*7)$$VKNKO>͕&xHͣH͎eK)|Lɯ2 v8M:WvK͈CŽK*72 v/2 v*7ژK*7[:WvʾK:v¾K*v|KPY͎ڽKDMɯ2WvI*72 vKxK~# ! v~6K2 v*7*7[x- n /R͉V͗L)RK^͏RͣRiQͅRR R͏RQ ~R͗LDRR0^iQ/R_ _RR jR WLͣRͅR_RRLQ:6!vvLzWL:v<2v_:v=ëRbP*C!&w####PS~RR###~R+++RzL`S~RS+~G+++ SxPS~PS~PS~4Sz!CPS++++~PSPSDMz!CPS!CPS2v26bP7`S>2?v T ƒS> ]ShX:hvoSŸS:%-T͕SXS:!e5ªS͕S]S͔ SSҾS:%S>^XSSS@XSdV*hv#"hv*Ev+"Ev*hv+"hvS@]SS!- ZWO$%Z.}Z.Ey=!Gv2Zx/Zw:*1y#RZ!CvGZRZw!v45!e~[>>NU:Fv:Bv4ZZ2`v2Fv=2Ev=2_v:]vZv !\zZ!_v4:*![ZZ:vZ>2kvÊ:]vv̗LfX?vԗL[[:*[:Gv<[:Hv<[2Avɯ:`v=ZZZ:Iv/!v!vZ*hvM|D!Gv~¯[][=2Dv>2kv:Cvh[ڞ[:Hvګ[ʣ[O:`vŠ[:_v=ګ[ʫ[y!Bvp!Ev2BvÊŠGy/ ^bw#\b6 ͟,z26>26{!i5ڙbb2 v*7"L+LxEL+~ ! v~6cL=2 v!7w[xvMJLx7LͰLͼL͊LL    7L?®L ®L ɯo>g>_v:~CW o g _ Wz}|{ L*7͎*7͎>͕&MLL1M*7!M*7}o|g_Pg!\*MLAM{yM>ĕ&zʘM*7*7R#͎+nM͔JSM*7>áM<>ĕ&*7*7R͎ҘMJM*7z7>2 vg:H!CڵM~=26=26M~26=26h``i"Rv "Tv͠F>27×-N*6<͎#N:6#N!- T-T> gT>~!kvU: v7T: v7Tɯ2 v:Wvz2%v*hv:?vPT+"&v:kv2(v>2=v:>v•T:2VvL;LԒU2VvM+LͨUxU+~  •U#xU+~ # +ëU>;L#:hvG:?v!:vUS#~bV*0v}CV#6{=(V=2>v-lT|\!"8vK"3v+"3v#*\Ê o  }!_vзG\z!avد2_vz2`v:/:]vF*0v}:^vT%vL;L? :'!(:'!D9"nvJ*7#~+T%ʸ\!(]]%\\Կ\*nvÊͧ%\*nv>?]͙X\`i{= ]~ ]#]w#\!kv!d5:ÙX\:':(7ĭ]8\LH]PL]MT]MB]HM\FM\PC\PO\SR\UJ\BP\CW\PA\CP\PN\OP\HE\FO\IG\PF ]OJ ]IJ ]LM ]LS ]RM ]CS ]DM ]SV ]AV ]RP ]DF ]RV ]FI ]!vL;LT%ʼ];Lw\]b`o ] ]ͣR!6]bP0]bP..ͭ+KͶd+Kd+2d:6!6did~‰dÌi*Pv~‰d͌iqd]ddid"PvKP>d*Pv####:6=L`1h``iÌi*RvÌi!"6:6/!+£)b` ‰dqd2d!65^:t!c5d>L`:6e` ]:+!6ª)*Rv++++~‰d:6!6>d$^e:{!c5b`]*Rv~1h_͔Q͉de!v~6.en1 K+!f5Þ:g5:v=f+g*7++͈C>2v2g5ڊe(͂N/*`52626(~! ҕef͡eMh!mv626-e!645enk!#45e>f!"45e#e:-fn ~:6/!mv!6qN<26á.kD 7> ęԜkOG1!"vy͉lͮk>2mv2rv͟ltllͯ_tl*~v*k5R"v+|hlo:!nͯ_f"nͯ_>lg͈C26*"v*g5Ól*k5*"vÓlzʜl7?{tkK*sv͂lKͭ7l+́nl~w#ͣkål͈C*sv*g5"svRE̓oKgv>M!uv. ?ml> 2}v:yv:|vm!O8"J6?m!}v5 m*zv"~v*v"v*v"v|n͓n Qm3e7ͭ7_m>+w#_ͦmW*svͣk*k5*svm#͓lҟm:zvŸm"zv+v>M:zv{nʽmzn>m{m2|vz>Gg!uv~p#wzxmO#~q#wz2v*svm#"~v!yv4+x.%p͹$7>24>2v(r:Y51qS8͹$!"tPt:5Jq:5kk2'!vͨj͋qgq͛t!+p!)pà&26:5ĢrIrMh!!:5q!7q*7rÈC!7q*7lrqIGyOxr#*r r r# rr7 2r+ /r/r7͜r*7#C*7o /!'p"6͍'*6"ror!d5 *7~ % *r~!%‘r͑!~!or2'8LÈCKÈCg:5JÔJx ~#õr:Y52Y5k$2Y5%!~!tqܨr3ss-sPr26FsB"s2.D?>?>?~>?>i?#::E=2:! >!:ͽ>*:>Y?F#>N?͌WG +@+@+@:”?qBBBB¿?C>i=%@!:ʰB#z=:4;<̉B::!:A@ ::O::U@W@>!:`@ H::̔@:4;::@x :=CB͔@|@@ ::=Q::@:4;::@:=CB@ë@¾@ ::=::zA: O::@: O::@ɷ@z @ :4;@A:.efkGfxԙMhf!v͜xkD Mh!65͌flMhhf26Khf Mhf:f5Mh~ MhC*Pv~###ʁf~fw+w+w###x͎kf f!vͭj!vj8L ·f;Lڷf#ͼʾf!qv4fD*"v+""vj*v-f!ļ!"pv"6:pv:f57:v=ȷffg͉lg!6~61)!65:)=#g=g!f545;gMh> kD> kDhfKK]gTg+ Hē_w#>gÈC͈Cͯ_.g:i5!g5w1)( Ͷg@_=gPe͉i1( Ͷg͇_͔Qb` ʌg@_P͉dágV`g?<:vf8L~cDg*Pv~~wJhK3eOGh!v~yg4 :p.v>M=n: vL;Lw2 vgvL;LW4n6iK2|nSn͓nW:nͭ7+͈C:)=_g>kD> kD[n2'*g5"svE̓oK:rvMv͗L7Kʣnʣn+͈CKKnʪn̯_n3eên+nCKͼ zn+6 -:vvG:v!v64n!xv owOo!v4o<552vx!xv2vviKgKqo.og!vv5po:vSo!xv5bo!v5bo!v5bo=<.otoK.o:v͈C!vo~G~wogxړo>OxGͳGÆooÆo 7:$/!rv:vv!!vZ1 toK.o^tPC!vo~G.tIsDsSsr͗s-sr͛t*7tͮG7>26*7tG2t+#tWs_>ʐs2t?s}s}s'Hs ʅs ʅs ʅs ʅsÐs2t?s:t2t?sx2t*t~!:tD­s-p÷sSs/p͹$:tc1p3p*`5"ror*t"`5͹$Yt!By! %A+A *A*A!:4x!:4::ͳA!:=AG]ÀA!";o:onAͩA]A:=(=LX:Ox 3 O[[:%=7=Rd*;#WA::=2:> ;AóA:=A͗AA!8;A6A6:8;ͩAAB!9;4:=>29;ͩAB~B5>KA͗A!8;~4:=:9;?8B!AÊ:4;BÊ:4;CB!:~5N*:!:+#{ 2:yhB!:{Bw::!:5*:!:::+ʞBҕB#<2:w":~ʰBPY͞J 6ͩBBͩB:5;=#B<=/AB. ^v!qv~ h5!vͭj!vj> kDͭj:vjK8LͶKcdfC[j*Pv:!vah: v ih~~w++++~~w>2mvf͠h:pv!"v$"v+L;Lښhͼh#vMiҶh!""vgz:f5hK*"v͓l҈CKh+h#!"vh͈Cͯ_> k:"> f*"v͓lhf> kDi*"v:"'i{_Iiz=iig 7 i{/ikii2pvG1fi*k5͓l/i*i5͓li 7ȷ{!I4e~io&" v*Pv~ʛi++++Îi~ld›i"PvDM#^#V###N#fiR>2VviKi2Wv2VvÈC!")v* v|i{K+zj#!)v#. [rpq|r!! ͎8p:71p̀1p!;8"J6!7Qr*7";";";";";";";";6#";";.6#";";";";"E; s#r":2;:4q::p>24;=/p22;23;>q:>q:>q/25;/!7̗q:4.q/2E6>':4! Wq:4;! 2C6:B6ʔ Z1 n1&r *;Gw#6*;w#62::. )  ADD !"<2:oz=*;S<<6#";!&<26;!:: !8!:>!":*; >N=N=N=N=N=N=N=N=!N=F6##>G=ͨ<~6# Ox>=":!::!;".2;::;?ͷ=͡2:2:AWo x’=!:~6=::ͱA2E6W>2:2;:;!:=*:*:R*:>*:>͎=2;^>į>ͪ. 1:!vji+: vi+͈C8Lj͹j1Bj*&vZ~###j6͝_ͯj͝_lj!vw?1Ê͑j:d5vLz>v >͗L>:*#ڤj=w<6Rj6#w#w#wR}))v~wXj~~wXjj͹jj>v&>?1WDM5kʊz2'͈C26k!vjK2'?1!]AM͈Cko L{lk{XkPk|gk!gk.Z;2::2:2v;*":!"K;:2A;>2@;Z;!fG#:IODrN +y=!7#͎+ir͠r͓rXr!7͎Ҋ;r++++lr!7r ͓r҄r####7͎r++ws#r+##s#rÊ++rw#r+s+r+sÊw[ɛ uàpàpqïtqÛt&5>Rd ???Action(F/B/I/D/S)?Spelling Check Completed Add to Dictionary:  Add to Supplement: (Y/N)? >2vqr2525~!Q8͹$!5 L#pګpqͤp#Bp>25Gp>25> c#p.=::O ~*;":#>2:2:B~5I= BWo xq=!:~6i=::B2E6W2::;G:;W*::5;==!}>>x=!:y=!:zU=2:)>}>>| >x= >y=z!:5 >z=I=|xOzO>2:2:K>:;?>ɷH>::33ɯ2:d>:;?>::2:z>C>:;z>:;!:4><2:͚>::::!:ڃ>!:.?ͪo:4;!:!; .:>; ͵< > :>/"/o:ͨ< .> +~*;++~:>V>>V>>>#*:A! D>!:>*: >ʔ>F##>‰>͛{u>> >":";{2:!:::;2;!2D>!:>*:A*:::_7>G{>H7>G#>y>> O7>xF>>*:A2 ;WG ???!?2;:9?:9?:A?q>2;a?a?a?j?A;?PAz?;?::Ç=?!:7A#<€?x$AAA!::APY+:A@ 8::AÛ=yH?::x :=*6;aA??Q::@:::=/r:4!;r# ͂8rկ 2r͝rcr.Jr#cr _rͤ7́rvr cŕror>  wr~͌r#.:*? пͤ#~+:µr~ҵr@##ͥ7r!vj:vrr>v&:*r!Hv:Gvr:v>v&:v>v&!vj:*> v&x///0@?z@z ::: @::: ! úA::!:=@GW@z@!";o:oh@͠@W@:=(=LX:Ox 3 O[:%=7=Rd*;#Q@:=@͎@@!8;@6@6:8;͠@ê@@!9;4:=>29;͠@@~@5>E@͎@!8;~4:=:9;?A!@Ê*:&KaA~7APYÞ0A*:&!:0A A<=,@UA:;kAK*:":*:":!*:RhAK*:":::_ÍA >2:2:PAAPAADA ,@AA 82:!::|A,B!:~6B͜B͂///d11*" COPYRIGHT(C) 1978, DIGITAL RESEARCH M ! á 4êü /L9ASMPRNHEX 1/ B**:͵B":!:yw:ĩB!xhBB**:ͲB":!:~LBLBNPB!,B͜B!:~6pB!:x!mBPA!:xpx!hBʗBʗB,@PA!:yw:OPAy,@:O|8͎B!BRyKByOB#zxAɛ <<<"<5<ɯWV<<2E4!9"C4ͨ<=:l2J:] @:4-:5-*C4͢=!~!!S!Ϳ!%=#%=#%=#%=:`2Y5:c2+ͥ2b5~f!B6.:2c5K=~"=:b5é*͂="7:Il++"7"7="7+"7:Il++"7"7"7*:c5£=*HL&bj –=R+#"7"7*H-3#"7"7Q"7R"7:c5*HͿ-=|!]=>o&))))>=goR/ / / 9?s ÉpÿpXpB READ? WRITE MARKED TEXT ON?  1:v!v}pj!vj>v&>v&!vj!vjsqp!vPj2'7!:ڹpJO:ͳGڙp!vjrsqpͺr2'!AMv!͗Lp*778͈Cp*7:vTJ7Mr7!4~#k$%͹$O*+?1*`5"6"6*6~!͔$a#͟$~ʦq,rںqºq8y=qy¤qq.>O->26:H26=26=26S>:7*7>|& 7!!Y5~P>(P>6!"J6O-:H|>y|>6u>:I@|>|>~!8"J6>|&w- A4:c5:ª>®>:ʰ>>2d52e5>:2[5ͤ!ͮ!~"!N6 ! t6!q66.!66/:26ɛ!%=#%=#%=#%=:`2Y5:c2+ͥ2b5~f!B6.:2c5K=~"=:b5é*͂="7:Il++"7"7="7+"7:Il++"7"7"7*:c5£=*HL&bj –=R+#"7"7*H-3#"7"7Q"7R"7:c5*HͿ-=|!]=>o&))))>=goR/000!)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1  :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y0){zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~͎*_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/0:|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8O00d:! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ0?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!m#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8n!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fk0NĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>SR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N 0 0 q@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q: A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<: OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " 0 z'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂÃ)sn55)=â|g}o=î--#zg{ozg{ozg{oÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅ0 `;PROGRAM TO TEST LS-100 ;BY RVA ;LAST CHANGE ;7/11/83 ;COPYRIGHT 1983 ;DIGITAL RESEARCH COMPUTERS ;ALL RIGHTS RESERVED ; TRUE EQU 0FFFFH ;VALUE FOR TRUE FALSE EQU NOT TRUE ;VALUE FOR FALSE ; ;LS-100 BOARD EQUATES ; PBASE EQU 0C0H ;LS-100 BASE I/O PORT ADDRESS DATA EQU PBASE ;DATA TRANSFER PORT TRK EQU PBASE+1 ;MSB ADDRESS LATCH SCTR EQU PBASE+2 ;LSB ADDRESS LATCH ; NUMSCT EQU 0 ;256 SECTORS/TRACK NUMBYT EQU 128 ;BYTES/SECTOR BDOS EQU 5 ;CP/M ENTRY ; LIGHTS EQU FALSE ;SET TO 0 ag`!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ 08:  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*0Ͱ>2lyPLnR>UX:l̅2l͓*>E 2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH bͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 1[1TRUE FOR FRONT PANEL IMSAI EQU FALSE ;SET TO TRUE FOR IMSAI ; ; ORG 0100H LXI SP,STACK ;SET UP PROGRAM STACK MAIN: LXI D,MESG1 ;PRINT SIGN ON MESSAGE MVI C,09 ;BDOS FUNCT. CALL BDOS ;SIGNON MAIN1: LXI D,MESG2 ;GET BOARD TO TEST MVI C,09 CALL BDOS ;PRINT MESSAGE MVI C,01 CALL BDOS ;GET RESPONSE MOV B,A ;SAVE A SUI 31H ;SEE IF TO SMALL JC ERR1 ;IF SO PRINT ERROR MOV A,B ;GET VALUE BACK SUI 38H ;SEE IF TO LARGE JNC ERR1 ;IF SO PRINT ERROR MOV A,B ;RESTORE A ST1]ING ; ;CHECK MEMORY FOR ERRORS ; CHECK: CALL INIT ;START AT GROUND ZERO LDA PATT ;GET PATTERN BYTE MOV C,A ;SAVE IN C REG. R1: IN DATA ;GET DATA FROM LS-100 CMP C ;CHECK IT CNZ ERROR ;LOG ANY ERRORS INR C ;BUMP PATTERN BYTE DCR E ;DECREMENT BYTE COUNT JNZ R1 ;LOOP UNTIL 0 DCR D ;DECREMENT SECTOR COUNT JZ R2 ;CHECK FOR ZERO CALL NSCT ;BUMP SECTOR COUNT JMP R1 ;READ EM ALL R2: CALL NTCK ;BUMP TRACK COUNT LDA TEND ;GET END VALUE CMP H ;CHECK FOR END JNZ R1 ;RE1STR ;SET LSB REG. STA SCNT ;ZERO SECTOR COUNT MVI E,NUMBYT ;E=BYTES/SECTOR LDA TCNT ;GET CURRENT COUNT INR A ;BUMP COUNT STA TCNT ;STORE TRACK COUNT OUT TRK ;SET MSB REGISTER MOV H,A ;H=CURRENT TRACK RET ; ;CHECK KEYBOARD , AND ABORT IF ANY KEY IS PRESSED ; ABORT: PUSH A PUSH H PUSH D ;SAVE REGISTERS MVI C,0BH ;CON. STATUS FUNCTION CALL BDOS ;CHECK FOR KEY ENTRY ORA A ;SET Z BIT JNZ EXIT ;EXIT IF NOT 0 POP D POP H POP A ;RESTORE REGISTERS RET ; ;CLEAR IN1<Y. @HL ; SMESG1: MOV E,M ;GET CHAR. FROM MEMY. CALL PCHAR ;SEND THEM ONE AT A TIME INX H ;BUMP POINTER DCR B ;DECREMENT COUNT JNZ SMESG1 ;CHECK FOR ZERO RET ; ;SEND CHARTER IN E REG. TO CONSOLE ; PCHAR: PUSH H ;SAVE HL PUSH B ;SAVE BC MVI C,2 ;BDOS FUNCT. CALL BDOS ;PRINT CHAR. LXI D,SPC ;PRINT THREE SPACES MVI C,9 ;BDOS FUNCT. CALL BDOS ;SEND EM. POP B ;RESTORE BC POP H ;RESTORE HL RET ; ;CONVERT HEX BYTE IN ACCU INTO TWO ASCII CHARS. IN HL ; CNVHX: PUSH1A BDNO ;SAVE IT SUI 31H ;REMOVE ASCII BIAS/MAKE RELATIVE 0 LXI H,TAB1 ;HL @ START/END VALUE TABLE LXI D,0 ;CLEAR MSB MOV E,A ;LSB=A DAD D ;INDEX INTO TABLE MOV A,M ;GET START VALUE STA TSTRT ;STORE TEST START VALUE INX H ;HL@ END VALUE MOV A,M ;GET VALUE STA TEND ;STORE END VALUE LXI D,MESG3 MVI C,09 CALL BDOS MAIN2: LDA PATT ;GET INITIAL PATTERN VALUE INR A ;INCREMENT VALUE STA PATT ;STORE IT IF LIGHTS ;PUT PATTERN ENDIF ;OUT IF IMSAI ;TO PANEL LIGHTS1AD REST LHLD PCNT ;GET VALUE OF PASS COUNT INX H ;BUMP COUNTER SHLD PCNT ;SAVE PASS COUNT PUSH H ;SAVE ON STACK MOV A,H ;MOVE INTO POSITION CALL CNVHX ;CONVERT TO HEX ASCII SHLD PCNT1 ;PUT MSB INTO MESSAGE POP H ;RESTORE VALUE MOV A,L ;MOVE INTO POSITION CALL CNVHX ;CONVERT TO HEX ASCII SHLD PCNT2 ;PUT LSB INTO MESSAGE CALL PMAP ;PRINT BOARD MAP JMP MAIN2 ;REPEAT TEST ; ;INITIALIZE MSB/LSB REGS. TO ZERO ;SET D=SECTORS/TRACK, E=BYTES/SECTOR ; INIT: XRA A ;CLEAR A 1PUT AND RETURN TO CP/M ; EXIT: MVI C,01 ;GET RID OF INPUT CHAR. CALL BDOS POP D POP H POP A ;FIX UP STACK JMP 0 ;RETURN TO CP/M ; ;PROCESS ERROR ; ERROR: PUSH D ;SAVE DE STA BAD ;SAVE BAD BYTE LDA TSTRT ;GET STARTING TRACK # MOV E,A ;COPY INTO E LDA TCNT ;GET CURRENT TRACK # SUB E LXI H,BNK0 ;HL=BASE OF MAP LXI D,8 ;DE=NUM. OF BITS/BANK RAR ;CONVERT INTO BANK ORA A ;CHECK FOR BANK ZERO JZ SKP1 ;SKIP REST IF SO MULU: DAD D ;MAKE HL POINT DCR A ;TO CORRE16 PSW RRC RRC RRC RRC CALL HASCI MOV L,A POP PSW CALL HASCI MOV H,A RET HASCI: ANI 0FH ADI 90H DAA ACI 40H DAA RET ; ;MESSAGE AREA ; SPC: DB 20H,20H,20H,'$' CRLF: DB 0DH,0AH,'$' MESG1: DW 0D0AH DW 0D0AH DB ' ALS-100 MEMORY DIAGNOSTIC PROGRAM' DW 0D0AH DW 0D0AH DB ' -DIGITAL RESEARCH COMPUTERS' DW 0D0AH DB ' ' ALL RIGHTS RESERVED' DW 0D0AH DB ' " COPYRIGHT 1983' DW 0D0AH DB ' 1  CMA ;NEGITAVE TRUE OUT 0FFH ;SET LIGHTS ENDIF CALL INIT ;INITIALIZE LS-100 REGS. XRA A CALL CLEAR ;CLEAR MEMORY CALL INIT ;START AT GROUND ZERO LDA PATT ;GET PATTERN BYTE F1: CALL ABORT ;CHECK FOR ABORT MOV B,A ;SAVE PATTERN BYTE XRA A ;CLEAR A MOV C,A ;CLEAR C MVI E,NUMBYT ;E=BYTES/SECTOR CK1: IN DATA ;MAKE SURE THIS SECTOR IS STILL ORA A ;CLEAR IN CASE OF ADDRESSING ERROR CNZ ERROR ;CHECK FOR NON ZERO DCR E ;DECREMENT BYTE COUNT JNZ CK1 ;CHECK REST MVI1 ^ STA SCNT ;RESET SECTOR COUNT OUT SCTR ;SET LS-100 REGISTER LDA TSTRT ;GET STARTING TRACK # OUT TRK ;SET LS-100 REGISTER STA TCNT ;STORE CURRENT TRACK COUNT MVI D,NUMSCT ;D=SECTORS/TRACK MVI E,NUMBYT ;E=BYTES/SECTOR RET ; ;SET MEMORY = TO ACCU. ; CLEAR: OUT DATA ;WRITE DATA TO LS-100 DCR E ;DECREMENT BYTE COUNT JNZ CLEAR ;CHECK FOR ZERO DCR D ;DECREMENT SECTOR COUNT JZ CL2 ;CHECK FOR ZERO CALL NSCT ;BUMP SECTOR COUNT JMP CLEAR ;FILL SOME MORE CL2: MOV B,A ;SAVE D1 CT BANK JNZ MULU ;HL=BANK*BITS SKP1: LDA BAD ;GET FAILED BYTE XRA C ;EXCLUSIVE OR WITH GOOD BYTE CHK1: RAR ;CHECK FOR BAD BIT(S) CC MKBAD ;UPDATE MAP INX H ;POINT TO NEXT BIT IN MAP DCR E ;CHECK ALL BITS JNZ CHK1 POP D ;RESTORE DE RET MKBAD: MVI M,'B' ;MAKE IT BAD RET ; ;VALUE OF BOARD TO TEST OUT OF RANGE ; ERR1: LXI D,MESG4 ;DE=ERROR MESSAGE PUSH B ;SAVE B MVI C,09H ;SETUP FOR CP/M CALL CALL BDOS ;PRINT MESSAGE POP B ;RESTORE B JMP MAIN1 ; ; ;PRINT MEMO1 $ VER. 1.0' DW 0D0AH DW 0D0AH DB '$' MESG2: DB 'ENTER BOARD NUMBER TO TEST (1-8): ' DB '$' MESG3: DW 0D0AH DW 0D0AH DB 'PRESS ANY KEY TO EXIT TO CP/M' DW 0D0AH DB '$' MESG4: DW 0D0AH DW 0D0AH DB 'VALUE OF BOARD TO TEST MUST BE IN RANGE OF 1 - 8' DW 0D0AH DB 'RE-ENTER VALUE OF BOARD TO TEST' DW 0D0AH DW 0D0AH DB '$' HDR1: DW 0D0AH DB 'TEST RESULTS FOR BOARD ' BDNO: DB 0 DW 0D0AH DW 0D0AH DB 'PASS NUMBER ' PCNT1: DW 0 PCNT2: DW 0 DB 'H' DW 0D0AH D1  E,NUMBYT MOV A,B ;RESTORE PATTERN BYTE F2: OUT DATA ;WRITE DATA TO LS-100 INR A ;BUMP PATTERN BYTE DCR E ;DECREMENT BYTE COUNT JNZ F2 ;CHECK FOR ZERO DCR D ;DECREMENT SECTOR COUNT JZ F3 ;CHECK FOR ZERO CALL NSCT ;BUMP SECTOR COUNT JMP F1 ;WRITE TO ALL SECTORS F3: MOV B,A ;SAVE PATTERN BYTE IN B REG. CALL NTCK ;BUMP TRACK COUNT LDA TEND ;GET END VALUE CMP H ;CHECK FOR LIMIT JZ CHECK ;IF AT LIMIT CHECK DATA FOR ERRORS MOV A,B ;RESTORE PATTERN BYTE JMP F1 ;KEEP GO1ATA BYTE IN B REG. CALL NTCK ;BUMP TRACK COUNT LDA TEND ;GET END VALUE CMP H ;CHECK FOR LIMIT RZ ;RETURN IF AT END MOV A,B ;RESTORE DATA BYTE JMP CLEAR ;NOT DONE YET ; ;INCREMENT SECTOR NUMBER ; NSCT: MOV B,A ;SAVE DATA BYTE IN B REG LDA SCNT ;GET CURRENT SECTOR COUNT INR A ;BUMP COUNT STA SCNT ;SAVE IT OUT SCTR ;UPDATE LSB REG. MVI E,NUMBYT ;E=BYTES/SECTOR MOV A,B ;RESTORE A RET ; ;INCREMENT TRACK NUMBER AND RESET SECTOR NUMBER ; NTCK: XRA A ;CLEAR A OUT SC1zRY MAP ; PMAP: LXI H,BNK0 ;HL=MAP ARRAY LXI D,HDR1 ;DE=BANK-0 HEADER CALL SMESG ;PRINT IT LXI D,HDR2 ;DE=BANK-1 HEADER CALL SMESG LXI D,HDR3 ;DE=BANK-2 HEADER CALL SMESG LXI D,HDR4 ;DE=BANK-3 HEADER CALL SMESG LXI D,CRLF ;SEND A CRLF MVI C,09 CALL BDOS RET ; ;SEND MESSAGE @DE TO CONSOLE ; SMESG: PUSH H ;SAVE HL MVI C,9 ;BDOS FUNCT. CALL BDOS ;SEND MESSAGE TO CONSOLE POP H ;RESTORE HL MVI B,8 ;B=NUMBER OF BYTES TO SEND ; ;SEND B CHARTERS TO CONSOLE FROM MEM22W 0D0AH DB ' DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7' DW 0D0AH DB 'BANK-0 ' DB '$' HDR2: DW 0D0AH DB 'BANK-1 ' DB '$' HDR3: DW 0D0AH DB 'BANK-2 ' DB '$' HDR4: DW 0D0AH DB 'BANK-3 ' DB '$' ; ;PROGRAM STORAGE AREA ; PCNT: DW 0 ;CURRENT PASS COUNT SCNT: DB 0 ;CURRENT SECTOR # TCNT: DB 0 ;CURRENT TRACK # PATT: DB 0FFH ;STARTING TEST BYTE BAD: DB 0 ;BAD BYTE FROM LS-100 TSTRT: DB 0 ;STARTING TRACK # TO TEST TEND: DB 0 ;ENDING TRACK # TO TEST ; ;TABLE FOR START END V22  ;PROGRAM TO TEST LS-100  ;BY RVA  ;LAST CHANGE  ;7/11/83  ;COPYRIGHT 1983  ;DIGITAL RESEARCH COMPUTERS  ;ALL RIGHTS RESERVED  ; FFFF = * TRUE EQU 0FFFFH ;VALUE FOR TRUE 0000 = & FALSE EQU NOT TRUE ;VALUE FOR FALSE  ;  ;LS-100 BOARD EQUATES  ; 00C0 = 6 PBASE EQU 0C0H ;LS-100 BASE I/O PORT ADDRESS 00C0 2*A TSTRT ;STORE TEST START VALUE 0136 23 INX H ;HL@ END VALUE 0137 7E MOV A,M ;GET VALUE 0138 32E604 STA TEND ;STORE END VALUE 013B 11DC03 LXI D,MESG3 013E 0E09 MVI C,09 0140 CD0500 CALL BDOS 0143 3AE304 MAIN2: LDA PATT ;GET INITIAL PATTERN VALUE 0146 3C @ INR A ;INCREMENT VALUE 0147 32E304 STA PATT ;STORE IT   IF LIGHTS ;PUT PATTERN   ENDIF ;OUT   IF IMSAI ;TO PANEL LIGHTS  2ٛALUES ; TAB1: DB 00H DB 08H DB 10H DB 18H DB 20H DB 28H DB 30H DB 38H DB 40H ; ;MEMORY MAP ARRAY STORAGE ; ; DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 ; BNK0: DB 'G','G','G','G','G','G','G','G' ; BNK1: DB 'G','G','G','G','G','G','G','G' ; BNK2: DB 'G','G','G','G','G','G','G','G' ; BNK3: DB 'G','G','G','G','G','G','G','G' ; DS 100 ;PROGRAM STACK AREA STACK EQ U $ END 322x= - DATA EQU PBASE ;DATA TRANSFER PORT 00C1 = - TRK EQU PBASE+1 ;MSB ADDRESS LATCH 00C2 = ' SCTR EQU PBASE+2 ;LSB ADDRESS LATCH  ; 0000 = * NUMSCT EQU 0 ;256 SECTORS/TRACK 0080 = ' NUMBYT EQU 128 ;BYTES/SECTOR 0005 =  BDOS EQU 5 ;CP/M ENTRY  ; 0000 = 8 LIGHTS EQU FALSE ;SET TO TRUE FOR FRONT PANEL 0000 = * IMSAI EQU FALSE ;SET TO TRUE FOR IMSAI  ;  ; 0100  ORG 012 CMA ;NEGITAVE TRUE   OUT 0FFH ;SET LIGHTS  G ENDIF 014A CDCF01 CALL INIT ;INITIALIZE LS-100 REGS. 014D AF XRA A 014E CDE201 CALL CLEAR ;CLEAR MEMORY 0151 CDCF01 CALL INIT ;START AT GROUND ZERO 0154 3AE304 LDA PATT ;GET PATTERN BYTE 0157 CD2002 F1: CALL ABORT ;CHECK FOR ABORT 015A 47 & MOV B,A ;SAVE PATTERN BYTE 015B AF  XRA A ;CLEAR A 015C 4F 5 MOV C,A ;CLEAR C 015D 1E80 MVI E,NUMBYT ;E=2 2 2 00H 0100 317405 LXI SP,STACK ;SET UP PROGRAM STACK 0103 11DE02 MAIN: LXI D,MESG1 ;PRINT SIGN ON MESSAGE 0106 0E09 MVI C,09 ;BDOS FUNCT. 0108 CD0500 CALL BDOS ;SIGNON 010B 11B903 MAIN1: LXI D,MESG2 ;GET BOARD TO TEST 010E 0E09 MVI C,09 0110 CD0500 CALL BDOS ;PRINT MESSAGE 0113 0E01 MVI C,01 0115 CD0500 CALL BDOS ;GET RESPONSE 0118 47 MOV B,A ;SAVE A 0119 D631 SUI 31H ;SEE IF TO SMALL 011B DA6902 JC ERR1 ;IF SO PRINT ER2 AUBYTES/SECTOR 015F DBC0 CK1: IN DATA ;MAKE SURE THIS SECTOR IS STILL 0161 B7 e ORA A ;CLEAR IN CASE OF ADDRESSING ERROR 0162 C43B02 CNZ ERROR ;CHECK FOR NON ZERO 0165 1D m DCR E ;DECREMENT BYTE COUNT 0166 C25F01 JNZ CK1 ;CHECK REST 0169 1E80 MVI E,NUMBYT 016B 78 ^ MOV A,B ;RESTORE PATTERN BYTE 016C D3C0 F2: OUT DATA ;WRITE DATA TO LS-100 016E 3C $ INR A ;BUMP PATTERN BYTE 016F 1D / DCR E ;DECREMENT BYTE COUNT 0170 C26C01 2 22 ROR 011E 78 ~ MOV A,B ;GET VALUE BACK 011F D638 SUI 38H ;SEE IF TO LARGE 0121 D26902 JNC ERR1 ;IF SO PRINT ERROR 0124 78 MOV A,B ;RESTORE A 0125 327304 STA BDNO ;SAVE IT 0128 D631 SUI 31H ;REMOVE ASCII BIAS/MAKE RELATIVE 0 012A 21E704 LXI H,TAB1 ;HL @ START/END VALUE TABLE 012D 110000 LXI D,0 ;CLEAR MSB 0130 5F  MOV E,A ;LSB=A 0131 19 # DAD D ;INDEX INTO TABLE 0132 7E / MOV A,M ;GET START VALUE 0133 32E504 ST3I3" JNZ F2 ;CHECK FOR ZERO 0173 15 DCR D ;DECREMENT SECTOR COUNT 0174 CA7D01 JZ F3 ;CHECK FOR ZERO 0177 CDFF01 CALL NSCT ;BUMP SECTOR COUNT 017A C35701 JMP F1 ;WRITE TO ALL SECTORS 017D 47 F3: MOV B,A ;SAVE PATTERN BYTE IN B REG. 017E CD0D02 CALL NTCK ;BUMP TRACK COUNT 0181 3AE604 LDA TEND ;GET END VALUE 0184 BC a CMP H ;CHECK FOR LIMIT 0185 CA8C01 JZ CHECK ;IF AT LIMIT CHECK DATA FOR ERRORS 0188 78  MOV A,B ;RESTORE PATTERN BYT3rB/LSB REGS. TO ZERO  &;SET D=SECTORS/TRACK, E=BYTES/SECTOR  ; 01CF AF INIT: XRA A ;CLEAR A 01D0 32E104 STA SCNT ;RESET SECTOR COUNT 01D3 D3C2 OUT SCTR ;SET LS-100 REGISTER 01D5 3AE504 LDA TSTRT ;GET STARTING TRACK # 01D8 D3C1 OUT TRK ;SET LS-100 REGISTER 01DA 32E204 STA TCNT ;STORE CUzRRENT TRACK COUNT 01DD 1600 MVI D,NUMSCT ;D=SECTORS/TRACK 01DF 1E80 MVI E,NUMBYT ;E=BYTES/SECTOR 01E1 C9  RET   3= COUNT 021C D3C1 OUT TRK ;SET MSB REGISTER 021E 67 $ MOV H,A ;H=CURRENT TRACK 021F C9  RET  ;  3;CHECK KEYBOARD , AND ABORT IF ANY KEY IS PRESSED  ; 0220 F5 ABORT: PUSH A 0221 E5  PUSH H 0222 D5 PUSH D ;SAVE REGISTERS 0223 0E0B MVI C,0BH ;CON. STATUS FUNCTION 0225 CD0500 CALL BDOS ;CHECK FOR KEY ENTRY 0228 B7 I ORA A ;SET Z BIT 0229 C23002 JNZ EXIT ;EXIT IF NOT 0 022C D1 3 ;  &;VALUE OF BOARD TO TEST OUT OF RANGE  A; 0269 110004 ERR1: LXI D,MESG4 ;DE=ERROR MESSAGE 026C C5 x PUSH B ;SAVE B 026D 0E09 MVI C,09H ;SETUP FOR CP/M CALL 026F CD0500 CALL BDOS ;PRINT MESSAGE 0272 C1 3 POP B ;RESTORE B 0273 C30B01 JMP MAIN1 ;  ;  ;PRINT MEMORY MAP  t; 0276 21F004 PMAP: LXI H,BNK0 ;HL=MAP ARRAY 0279 115A04 LXI D,HDR1 ;DE=BANK-0 HEADER 027C CD9A02 3)E 0189 C35701 JMP F1 ;KEEP GOING  ;  ;CHECK MEMORY FOR ERRORS  r; 018C CDCF01 CHECK: CALL INIT ;START AT GROUND ZERO 018F 3AE304 LDA PATT ;GET PATTERN BYTE 0192 4F W MOV C,A ;SAVE IN C REG. 0193 DBC0 R1: IN DATA ;GET DATA FROM LS-100 0195 B9 H CMP C ;CHECK IT 0196 C43B02 CNZ ERROR ;LOG ANY ERRORS 0199 0C $ INR C ;BUMP PATTERN BYTE 019A 1D 5 DCR E ;DECREMENT BYTE COUNT 019B C29301 JNZ R3 ;  ;SET MEMORY = TO ACCU.  C; 01E2 D3C0 CLEAR: OUT DATA ;WRITE DATA TO LS-100 01E4 1D T DCR E ;DECREMENT BYTE COUNT 01E5 C2E201 JNZ CLEAR ;CHECK FOR ZERO 01E8 15 DCR D ;DECREMENT SECTOR COUNT 01E9 CAF201 JZ CL2 ;CHECK FOR ZERO 01EC CDFF01 CALL NSCT ;BUMP SECTOR COUNT 01EF C3E201 JMP CLEAR ;FILL SOME MORE 01F2 47 aCL2: MOV B,A ;SAVE DATA BYTE IN B REG. 01F3 CD0D02 CALL NTCK ;BUMP TRACK COUNT 01F6 3AE3 POP D 022D E1  POP H 022E F1 $ POP A ;RESTORE REGISTERS 022F C9  RET  ;  !;CLEAR INPUT AND RETURN TO CP/M  `; 0230 0E01 EXIT: MVI C,01 ;GET RID OF INPUT CHAR. 0232 CD0500 CALL BDOS 0235 D1  POP D 0236 E1  POP H 0237 F1 A POP A ;FIX UP STACK 0238 C30000 JMP 0 ;RETURN TO CP/M  ;  ;PROCESS ERROR  ; 023B D5 ERROR: PUSH D ;SAVE 3T CALL SMESG ;PRINT IT 027F 11BE04 LXI D,HDR2 ;DE=BANK-1 HEADER 0282 CD9A02 CALL SMESG 0285 11C904 LXI D,HDR3 ;DE=BANK-2 HEADER 0288 CD9A02 CALL SMESG 028B 11D404 LXI D,HDR4 ;DE=BANK-3 HEADER 028E CD9A02 CALL SMESG j 0291 11DB02 LXI D,CRLF ;SEND A CRLF 0294 0E09 MVI C,09 0296 CD0500 CALL BDOS 0299 C9  RET  ;  ;SEND MESSAGE @DE TO CONSOLE  ; 029A E5 %SMESG: PUSH H ;SAVE HL 029B 0E09 3 1 ;LOOP UNTIL 0 019E 15 DCR D ;DECREMENT SECTOR COUNT 019F CAA801 JZ R2 ;CHECK FOR ZERO 01A2 CDFF01 CALL NSCT ;BUMP SECTOR COUNT 01A5 C39301 JMP R1 ;READ EM ALL 01A8 CD0D02 R2: CALL NTCK ;BUMP TRACK COUNT 01AB 3AE604 LDA TEND ;GET END VALUE 01AE BC { CMP H ;CHECK FOR END 01AF C29301 JNZ R1 ;READ REST 01B2 2ADF04 LHLD PCNT ;GET VALUE OF PASS COUNT 01B5 23 M INX H ;BUMP COUNTER 01B6 22DF04 SHLD PCNT ;SAVE PASS COUNT 01B9 E53 E*604 LDA TEND ;GET END VALUE 01F9 BC " CMP H ;CHECK FOR LIMIT 01FA C8 ! RZ ;RETURN IF AT END 01FB 78 I MOV A,B ;RESTORE DATA BYTE 01FC C3E201 JMP CLEAR ;NOT DONE YET  ;  ;INCREMENT SECTOR NUMBER  ; 01FF 47 gNSCT: MOV B,A ;SAVE DATA BYTE IN B REG 0200 3AE104 LDA SCNT ;GET CURRENT SECTOR COUNT 0203 3C c INR A ;BUMP COUNT 0204 32E104 STA SCNT ;SAVE IT 0207 D3C2 OUT SCTR ;UPDATE LSB RE3 iDE 023C 32E404 STA BAD ;SAVE BAD BYTE 023F 3AE504 LDA TSTRT ;GET STARTING TRACK # 0242 5F Q MOV E,A ;COPY INTO E 0243 3AE204 LDA TCNT ;GET CURRENT TRACK # 0246 93 o SUB E 0247 21F004 LXI H,BNK0 ;HL=BASE OF MAP 024A 110800 LXI D,8 ;DE=NUM. OF BITS/BANK 024D 1F # RAR ;CONVERT INTO BANK 024E B7 R ORA A ;CHECK FOR BANK ZERO 024F CA5702 JZ SKP1 ;SKIP REST IF SO 0252 19 %MULU: DAD D ;MAKE HL POINT 0253 3D DCR A ;TO C3 $Z MVI C,9 ;BDOS FUNCT. 029D CD0500 CALL BDOS ;SEND MESSAGE TO CONSOLE 02A0 E1 K POP H ;RESTORE HL 02A1 0608 MVI B,8 ;B=NUMBER OF BYTES TO SEND  ;  ,;SEND B CHARTERS TO CONSOLE FROM MEMY. @HL  ; 02A3 5E gSMESG1: MOV E,M ;GET CHAR. FROM MEMY. 02A4 CDAD02 CALL PCHAR ;SEND THEM ONE AT A TIME 02A7 23  INX H ;BUMP POINTER 02A8 05 K DCR B ;DECREMENT COUNT 02A9 C2A302 JNZ SMESG1 ;CHECK FOR ZERO 023  ! PUSH H ;SAVE ON STACK 01BA 7C MOV A,H ;MOVE INTO POSITION 01BB CDBF02 CALL CNVHX ;CONVERT TO HEX ASCII 01BE 228404 SHLD PCNT1 ;PUT MSB INTO MESSAGE 01C1 E1 POP H ;RESTORE VALUE 01C2 7D MOV A,L ;MOVE INTO POSITION 01C3 CDBF02 CALL CNVHX ;CONVERT TO HEX ASCII 01C6 228604 SHLD PCNT2 ;PUT LSB INTO MESSAGE 01C9 CD7602 CALL PMAP ;PRINT BOARD MAP 01CC C34301 JMP MAIN2 ;REPEAT TEST  ;  ;INITIALIZE MS3a;G. 0209 1E80 MVI E,NUMBYT ;E=BYTES/SECTOR 020B 78  MOV A,B ;RESTORE A 020C C9  RET  ;  1;INCREMENT TRACK NUMBER AND RESET SECTOR NUMBER  ; 020D AF NTCK: XRA A ;CLEAR A 020E D3C2 OUT SCTR ;SET LSB REG. 0210 32E104 STA SCNT ;ZERO SECTOR COUNT 0213 1E80 MVI E,NUMBYT ;E=BYTES/SECTOR 0215 3AE204 LDA TCNT ;GET CURRENT COUNT 0218 3C < INR A ;BUMP COUNT 0219 32E204 STA TCNT ;STORE TRACK3pORRECT BANK 0254 C25202 JNZ MULU ;HL=BANK*BITS 0257 3AE404 SKP1: LDA BAD ;GET FAILED BYTE 025A A9 . XRA C ;EXCLUSIVE OR WITH GOOD BYTE 025B 1F SCHK1: RAR ;CHECK FOR BAD BIT(S) 025C DC6602 CC MKBAD ;UPDATE MAP 025F 23 + INX H ;POINT TO NEXT BIT IN MAP 0260 1D < DCR E ;CHECK ALL BITS 0261 C25B02 JNZ CHK1 0264 D1  POP D ;RESTORE DE 0265 C9 > RET 0266 3642 MKBAD: MVI M,'B' ;MAKE IT BAD 0268 C9  RET   44QAC C9  RET  ;  $;SEND CHARTER IN E REG. TO CONSOLE  ; 02AD E5 !PCHAR: PUSH H ;SAVE HL 02AE C5 PUSH B ;SAVE BC 02AF 0E02 MVI C,2 ;BDOS FUNCT. 02B1 CD0500 CALL BDOS ;PRINT CHAR. 02B4 11D702 LXI D,SPC ;PRINT THREE SPACES 02B7 0E09 MVI C,9 ;BDOS FUNCT. 02B9 CD0500 CALL BDOS ;SEND EM. 02BC C1  POP B ;RESTORE BC 02BD E1  POP H ;RESTORE HL 02BE C9  RET  ; 4 DW 0D0AH 0402 0A0D DW 0D0AH 0404 56414C5545 DB 'VALUE OF BOARD TO TEST MUST BE IN RANGE OF 1 - 8' 0434 0A0D DW 0D0AH 0436 52452D454E DB 'RE-ENTER VALUE OF BOARD TO TEST' 0455 0A0D DW 0D0AH 0457 0A0D DW 0D0AH 0459 24 ` DB '$' 045A 0A0D HDR1: DW 0D0AH 045C 5445535420 DB 'TEST RESULTS FOR BOARD ' 0473 00 BDNO: DB 0 0474 0A0D DW 0D0AH 0476 0A0D DW 0D0AH 0478 5041535320 DB 'PASS NUMBER ' 0484 0000 PCNT1: DW 0 0486 0000 4eG','G','G','G'  ; 0500 47*BNK2: DB 'G','G','G','G','G','G','G','G'  ; 0508 47*BNK3: DB 'G','G','G','G','G','G','G','G'  ; 0510 & DS 100 ;PROGRAM STACK AREA 0574 =  STACK EQU $ 0574  END 1 ; 04F0 47*BNK0: DB 'G','G','G','G','G','G','G','G'  ; 04F8 47BNK1: DB 'G','G','G','G','450E09CDB9 :100270000500C1C30B0121F004115A04CD9A0211EB :10028000BE04CD9A0211C904CD9A0211D404CD9AAC :100290000211DB020E09CD0500C9E50E09CD0500EE :1002A000E106085ECDAD022305C2A302C9E5C50E75 :1002B00002CD050011D7020E09CD0500C1E1C9F537 :1002C0000F0F0F0FCDTCE026FF1CDCE0267C9E60F33 :1002D000C69027CE4027C9202020240D0A240A0DCD :1002E0000A0D 20u4C53D8 :1002F0002D31303020204D454D4F5259202044495A :1003000041474E4F53544943202050524F4752418A :100310004D0A0D0A0D 20 02 :100324$ 8 ;CONVERT HEX BYTE IN ACCU INTO TWO ASCII CHARS. IN HL  ; 02BF F5 CNVHX: PUSH PSW 02C0 0F  RRC 02C1 0F  RRC 02C2 0F  RRC 02C3 0F + RRC 02C4 CDCE02 CALL HASCI 02C7 6F  MOV L,A 02C8 F1 / POP PSW 02C9 CDCE02 CALL HASCI 02CC 67  MOV H,A 02CD C9 H RET 02CE E60F HASCI: ANI 0FH 02D0 C690 ADI 90H 02D2 27 ( DAA 02D3 CE40 ACI 40H 02D5 27  DAA 02D6 C9 4/ PCNT2: DW 0 0488 48 G DB 'H' 0489 0A0D DW 0D0AH 048B 0A0D DW 0D0AH 048D 20q DB ' DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7' 04B3 0A0D DW 0D0AH 04B5 42414E4B2D DB 'BANK-0 ' 04BD 24 Q DB '$' 04BE 0A0D HDR2: DW 0D0AH 04C0 42414E4B2D DB 'BANK-1 ' 04C8 24 Q DB '$' 04C9 0A0D HDR3: DW 0D0AH 04CB 42414E4B2D DB 'BANK-2 ' 04D3 24 Q DB '$' 04D4 0A0D HDR4: DW 0D0AH 04D6 42414E4B2D DB 'BANK-3 ' 04DE 24 DB '$' 44p0002S04449474954414C2052455325 :10033000454152434820434F4D5055544552530A6E :100340000D20 C0 :10035000280414C4C2052494748545313 :100360002052455345525645440A0D20 56 :100370002?07D :100380002020434F5059524947485420313938337F :100390000A0D20 86 :1003A00 02~05645522EB2 :1003B00020312E300A0D0A0D24454E54455220425C :1003C0004F415244204E554D42455220544F2054E7 :1003D0004553542028312D4 k RET  ;  ;MESSAGE AREA  ; 02D7 20202024 SPC: DB 20H,20H,20H,'$' 02DB 0D0A24 CRLF: DB 0DH,0AH,'$' 02DE 0A0D MESG1: DW 0D0AH 02E0 0A0D DW 0D0AH 02E2 20 DB ' bLS-100 MEMORY DIAGNOSTIC PROGRAM' 0311 0A0D DW 0D0AH 0313 0A0D DW 0D0AH 0315 20 DB ' >DIGITAL RESEARCH COMPUTERS' 033F 0A0D DW 0D0AH 0341 20 DB ' ' ALL RIGHTS RESERVED' 0369 0A0D 4 ý  ;  ;PROGRAM STORAGE AREA  <; 04DF 0000 PCNT: DW 0 ;CURRENT PASS COUNT 04E1 00 'SCNT: DB 0 ;CURRENT SECTOR # 04E2 00 &TCNT: DB 0 ;CURRENT TRACK # 04E3 FF ,PATT: DB 0FFH ;STARTING TEST BYTE 04E4 00 *BAD: DB 0 ;BAD BYTE FROM LS-100 04E5 00 0TSTRT: DB 0 ;STARTING TRACK # TO TEST 04E6 00 %TEND: DB 0 ;ENDING TRACK # TO TEST  ;  ;TABLE FOR START END VALUES  ; 04 a:1001000031740511DE020E09CD050011B9030E0987 :10011000CD05000E01CD050047D631DA690278D64B :1001200038D2690278327304D63121E70411000015 :100130005F197E32E504237E32E60411DC030E09EA :10014000CD05003AE3043C32E304CDCF01AFCDE26C :1001500001CDCF013AE304CD200247AF4F1E80DB33 :10016000C0B7C43B021DC25F011E8078D3C03C1DD6 :10017000C26C0115CA7D01CDFF01C3570147CD0DEA :10018000023AE604BCCA8C0178C35701CDCF013ACC :10019000E3044FDBC0B9C43B020C1DC2930115CA76 :1001A000A801CDFF01C39301CD0D023AE604BCC204 :1001B00093012ADF4 38293A20240A0D0A0D7E :1003E000505245535320414E59204B455920544FAC :1003F000204558495420544F2043502F4D0A0D2476 :100400000A0D0A0D56414C5545204F4620424F419A :10041000524420544F2054455354204D555354209A :10042000424520494E2052414E4745204F462031FB :10043000202D20380A0D52452D454E544552205648 :10044000414C5545204F4620424F41524420544F85 :1004500020544553540A0D0A0D240A0D5445535493 :1004600020524553554C545320464F5220424F4141 :10047000524420000A0D0A0D50415353204E554D51 :100480004245522000000000480A0D0A0D202024  DW 0D0AH 036B 20 DB ' 3 COPYRIGHT 1983' 0390 0A0D DW 0D0AH 0392 20 DB ' IVER. 1.0' 03B4 0A0D DW 0D0AH 03B6 0A0D DW 0D0AH 03B8 24 Q DB '$' 03B9 454E544552MESG2: DB 'ENTER BOARD NUMBER TO TEST (1-8): ' 03DB 24 DB '$' 03DC 0A0D MESG3: DW 0D0AH 03DE 0A0D DW 0D0AH 03E0 5052455353 DB 'PRESS ANY KEY TO EXIT TO CP/M' 03FD 0A0D DW 0D0AH 03FF 24  DB '$' 0400 0A0D MESG4:4x4E7 00 TAB1: DB 00H 04E8 08  DB 08H 04E9 10  DB 10H 04EA 18  DB 18H 04EB 20  DB 20H 04EC 28  DB 28H 04ED 30  DB 30H 04EE 38  DB 38H 04EF 40 DB 40H  ;  ;MEMORY MAP ARRAY STORAGE  ;  ; " DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7  ; 04F0 47*BNK0: DB 'G','G','G','G','G','G','G','G'  ; 04F8 47BNK1: DB 'G','G','G','G','4042322DF04E57CCDBF022284E1 :1001C00004E17DCDBF02228604CD7602C34301AF98 :1001D00032E104D3C23AE504D3C132E20416001E70 :1001E00080C9D3C01DC2E20115CAF201CDFF01C30F :1001F000E20147CD0D023AE604BCC878C3E20147EC :100200003AE1043C32E104D3C21E8078C9AFD3C2C4 :1002100032E1041E803AE2043C32E204D3C167C9F1 :10022000F5E5D50E0BCD0500B7C23002D1E1F1C91D :100230000E01CD0500D1E1F1C30000D532E4043A4E :10024000E5045F3AE2049321F0041108001FB7CAE5 :100250005702193DC252023AE404A91FDC66022388 :100260001DC25B02D1C93642C9110004C55O 09D :100490002044423020444231204442322057 :1004A00044423320444234204442352044423620E2 :1004B0004442370A0D42414E4B2D302020240A0D74 :1004C00042414E4B2D312020240A0D42414E4B2DEE :1004D000322020240A0D42414E4B2D33202024008F :1004E000FF000810182028303840ED :1004F00047 8C :10050000477B :00p 004600020524553554C545320464F5220424F4141 :10047000524420000A0D0A0D50415353204E554D51 :100480004245522000480A0D0A0D202025pORG 0100H ;MAKE COM FILE MAIN: LXI SP,STACK ;SET UP STACK LXI D,MESG1 ;SIGN ON CALL SMESG CALL FIND ;FIND # OF BOARDS MOV A,B ;B=SECTORS/TRACK ORA A ;CANT BE 0 JZ ERR1 ;PRINT WARNING STA NSCTR ;SAVE SECTORS/TRACK MOV A,C ;GET # OF BOARDS FOUND STA NUMBD ;PUT IN MESSAGE LXI D,MESG7 CALL SMESG MVI A,80H ;GET CHECK SUM BYTE STA FBYTE ;SAVE IT MVI A,1 ;WRITE MODE STA MODE ;SET MODE TO WRITE MVI H,2 ;H=TRACKS TO FORMAT MVI D,0 ;CLEAR TRACK COUNTER CALL FMATE 5MREG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR DCR L ;DECREMENT BYTE COUNTER JNZ RDLP ;READ ALL BYTES POP B ;RESTORE BC JMP FMATE2 ;READ REST OF DATA ; WRTE: LDA FBYTE ;GET FILL BYTE WRLP: OUT REG0 ;WRITE DATA OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT R5RE REGS. RET ; CNVHX: PUSH PSW ;SAVE CONVERT BYTE RRC RRC RRC RRC ;MOVE INTO POSITION CALL HASCI ;CONVERT NIBBLE MOV L,A ;SAVE IN L POP PSW ;RESTORE BYTE CALL HASCI ;CONVERT NIBBLE MOV H,A ;SAVE IN H RET ; HASCI: ANI 0FH ;MASK MSB NIBBLE ADI 90H ;A-F CAUSE CARRY DAA ;ADJUST ACI 40H ;ADD IN CARRY DAA ;ADJUST RET ; SMESG: MVI C,09H ;PRINT MESSAGE FUNCTION JMP BDOS ;LET CP/M DO THE WORK ; MESG1: DB ' %LS-100 AUTO FORMAT PROGRAM' DW 055 ;DO IT MVI A,0E5H ;GET FORMAT BYTE STA FBYTE ;SAVE IT MVI H,254 ;H=TRACKS LEFT TO FORMAT CALL FMATE ;DO IT LXI D,MESG6 CALL SMESG XRA A ;SET TO READ MODE STA MODE ;SET MODE BYTE MVI A,80H ;GET COMPARE BYTE STA FBYTE ;SAVE IT MVI H,2 ;# OF TRACKS TO VERIFY MVI D,0 ;CLEAR TRACK COUNTER CALL FMATE ;VERIFY TRACKS MVI A,0E5H ;GET COMPARE BYTE STA FBYTE ;SAVE IT MVI H,254 ;# OF TRACKS TO VERIFY CALL FMATE ;VERIFY TRACKS LXI D,MESG2 ;FORMAT COMPLEATE CALL SMES5EG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 OUT REG0 DCR L ;DECREMENT BYTE COUNTER JNZ WRLP ;FILL CURRENT SECTOR RET ; FIND: XRA A ;CLEAR A MOV B,A ;CLEAR B MVI C,30H ;C=NUMBER OF BOARDS FOUND OUT REG2 ;SET LSB LATCH FIND1: OUT REG1 ;SET MSB LATCH CALL TEST ;CHECK FOR A BOARD RNZ ;BOARDS FOUND MOV A,B ;GET SECTORS/BOARD ADI 8 ;ADD BOARD OFFSET CPI 40H ;MAX. BOARDS ALLOWED JZ ERR2 ;PRINT WARNING & ABORT INR C ;BUMP BOARD COUNT MOV B,A ;SAVE OFFSET JMP F5yD0AH DW 0D0AH DB ' . DIGITAL RESEARCH COMPUTERS' DW 0D0AH DB ' ' ALL RIGHTS RESERVED' DW 0D0AH DB ' " COPYRIGHT 1983' DW 0D0AH DB ' VER. 1.0' DW 0D0AH DW 0D0AH DB '$' MESG2: DB 'DONE' DW 0D0AH DB '$' MESG3: DB 'NO LS-100 BOARDS FOUND' DW 0D0AH DB '$' MESG4: DB 'BOARDS FOUND EXCEED LIMIT' DW 0D0AH DB 'CHECK FOR PORT ADDRESSING ERROR' DW 0D0AH DB '$' MESG5: DB 'VERIFY ERROR AT' DW 0D0AH 5 5 IG JMP 0 ;DONE ; FMATE: XRA A ;CLEAR A MOV C,A ;C=CURRENT SECTOR # LDA NSCTR ;GET SECTORS/TRACK MOV B,A ;B=SECTOR COUNTER MOV A,D ;D=CURRENT TRACK OUT REG2 ;SET LSB LATCH FMATE1: MOV A,C ;GET CURRENT SECTOR # OUT REG1 ;SET MSB LATCH MVI L,NBYTES/16 ;L=BYTES/SECTOR LDA MODE ;CHECK FOR READ OR WRITE ORA A ;0=READ/1=WRITE JZ RDE ;READ SECTOR CALL WRTE ;WRITE SECTOR FMATE2: INR C ;BUMP CURRENT SECTOR # DCR B ;DECREMENT SECTOR COUNTER JNZ FMATE1 ;FILL SECTORS INR 5 IND1 ;KEEP LOOKING ; TEST: CALL RESET ;RESET BYTE LOCATION COUNTERS MVI A,55H ;GET TEST BYTE OUT REG0 ;WRITE IT CALL RESET ;RESET COUNTERS IN REG0 ;READ DATA CPI 55H ;CHECK IT RET ; RESET: XRA A ;CLEAR A OUT REG3 ;SET BYTE LOCATION TO 0 RET ; ERR1: LXI D,MESG3 ;CAN'T FIND ANY BOARDS CALL SMESG JMP 0 ;ABORT ; ERR2: LXI D,MESG4 ;BOARDS FOUND EXCEED LIMIT CALL SMESG JMP 0 ;ABORT ; RDERR: PUSH H ;SAVE WORKING REGS. PUSH D PUSH B PUSH PSW MOV A,D ;GET5 DB 'SECTOR ' BDSCTR: DS 2 DW 0D0AH DB 'TRACK ' BDTRK: DS 2 DW 0D0AH DB 'GOOD DATA ' GBYT: DS 2 DW 0D0AH DB 'BAD DATA ' BDBYT: DS 2 DW 0D0AH DB 'ENTER ESC. TO ABORT ANY OTHER TO CONTINUE' DW 0D0AH DB '$' MESG6: DB 'VERIFYING FORMAT' DW 0D0AH DB '$' MESG7: DB 'FORMATING ' NUMBD: DB 0 DB ' LS-100 BOARD(S)' DW 0D0AH DB '$' ; ;PROGRAM STORAGE AREA ;THIS MUST BE IN RAM ; NSCTR: DS 1 ;SECTORS/TRACK FBYTE: DS 1 ;FILL BYTE MODE: DS 1 ;MODE BYTE DS 20 STACK: EQU $ 5 Y;LS-100 ;AUTO FORMAT PROGRAM ;BY RVA ;COPYRIGHT 1983 ;DIGITAL RESEARCH COMPUTERS ;ALL RIGHTS RESERVED ; ;THIS PROGRAM WILL FIND THE NUMBER OF ;LS-100 BOARDS IN THE SYSTEM THEN FORMAT THE ;CHECK SUM TRACKS WITH AN 80H, AND THE DATA ;TRACKS WITH AN E5H ; PBASE EQU 0C0H ;BASE PORT ADDRES REG0 EQU PBASE ;DATA TRANSFER PORT REG1 EQU PBASE+1 ;MSB ADDRESS LATCH REG2 EQU PBASE+2 ;LSB ADDRESS LATCH REG3 EQU PBASE+3 ;BYTE LOCATION ADDRESS NBYTES EQU 128 ;BYTES/SECTOR BDOS EQU 5 ;BDOS ; 5D ;BUMP CURRENT TRACK COUNT DCR H ;DECREMENT TRACK COUNTER JNZ FMATE ;FILL TRACKS RET ; RDE: PUSH B ;SAVE BC LDA FBYTE ;GET COMPARE BYTE MOV B,A ;IN B RDLP IN REG0 ;GET DATA CMP B ;CHECK IT CNZ RDERR ;PRINT ANY ERRORS IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN REG0 CMP B CNZ RDERR IN 5h CURRENT TRACK # CALL CNVHX ;CONVERT TO ASCII IN HL SHLD BDTRK ;PUT INTO MESSAGE MOV A,C ;GET CURRENT SECTOR # CALL CNVHX ;CONVERT TO ASCII SHLD BDSCTR ;PUT IN MESSAGE MOV A,B ;GET GOOD DATA BYTE CALL CNVHX ;CONVERT SHLD GBYT ;STORE IN MESSAGE POP PSW ;GET BAD BYTE CALL CNVHX ;CONVERT SHLD BDBYT ;STORE IN MESSAGE LXI D,MESG5 ;PRINT ERROR MESSAGE CALL SMESG MVI C,01 ;GET RESPONSE CALL BDOS CPI 1BH ;CHECK FOR ABORT JZ 0 POP B ;CONTINUE POP D POP H ;RESTO66LEND =ATA ' BDBYT: DS 2 DW 0D0AH DB 'ENTER ESC. TO ABORT ANY OTHER TO CONTINUE' DW 0D0AH DB '$' MESG6: DB 'VERIFYING FORMAT' DW 0D0AH DB '$' MESG7: DB 'FORMATING ' NUMBD: DB 0 DB ' LS-100 BOARD(S)' DW 0D0AH DB '$' ; ;PROGRAM STORAGE AREA ;THIS MUST BE IN RAM ; NSCTR: DS 1 ;SECTORS/TRACK FBYTE: DS 1 ;FILL BYTE MODE: DS 1 ;MODE BYTE DS 20 STACK: EQU $ 6  ;LS-100  ;AUTO FORMAT PROGRAM  ;BY RVA  ;COPYRIGHT 1983  ;DIGITAL RESEARCH COMPUTERS  ;ALL RIGHTS RESERVED  ;  ';THIS PROGRAM WILL FIND THE NUMBER OF  .;LS-100 BOARDS IN THE SYSTEM THEN FORMAT THE  .;CHECK SUM TRACKS WITH AN 80H, AND THE DATA  ;TRACKS WITH AN E5H  ; 00C0 = ! PBASE EQU 0C0H ;BASE PORT ADDRE6;45 327B04 STA FBYTE ;SAVE IT 0148 2602 MVI H,2 ;# OF TRACKS TO VERIFY 014A 1600 MVI D,0 ;CLEAR TRACK COUNTER 014C CD6201 CALL FMATE ;VERIFY TRACKS 014F 3EE5 MVI A,0E5H ;GET COMPARE BYTE 0151 327B04 STA FBYTE ;SAVE IT 0154 26FE MVI H,254 ;# OF TRACKS TO VERIFY 0156 CD6201 CALL FMATE ;VERIFY TRACKS 0159 117F03 LXI D,MESG2 ;FORMAT COMPLEATE 015C CDA402 CALL SMESG 015F C30000 JMP 0 ;DONE  ; 0162 AF FMATE: 60 CNZ RDERR 01AE DBC0 IN REG0 01B0 B8 I CMP B 01B1 C45802 CNZ RDERR 01B4 DBC0 IN REG0 01B6 B8 I CMP B 01B7 C45802 CNZ RDERR 01BA DBC0 IN REG0 01BC B8 I CMP B 01BD C45802 CNZ RDERR 01C0 DBC0 IN REG0 01C2 B8 I CMP B 01C3 C45802 CNZ RDERR 01C6 DBC0 IN REG0 01C8 B8 I CMP B 01C9 C45802 CNZ RDERR 01CC DBC0 IN REG0 01CE B8 3 CMP B 01CF C45802 CNZ RDERR 01D2 DBC0 66\ S 00C0 = - REG0 EQU PBASE ;DATA TRANSFER PORT 00C1 = . REG1 EQU PBASE+1 ;MSB ADDRESS LATCH 00C2 = . REG2 EQU PBASE+2 ;LSB ADDRESS LATCH 00C3 = 2 REG3 EQU PBASE+3 ;BYTE LOCATION ADDRESS 0080 = ' NBYTES EQU 128 ;BYTES/SECTOR 0005 =  BDOS EQU 5 ;BDOS  ; 0100 ORG 0100H ;MAKE COM FILE 0100 319104 MAIN: LXI SP,STACK ;SET UP STACK 0103 11A902 LXI D,MESG1 ;SIGN ON 0106 CDA402 CALL SMESG 0109 CD1A02 CALL FIN6.XRA A ;CLEAR A 0163 4F W MOV C,A ;C=CURRENT SECTOR # 0164 3A7A04 LDA NSCTR ;GET SECTORS/TRACK 0167 47 % MOV B,A ;B=SECTOR COUNTER 0168 7A O MOV A,D ;D=CURRENT TRACK 0169 D3C2 OUT REG2 ;SET LSB LATCH 016B 79 FMATE1: MOV A,C ;GET CURRENT SECTOR # 016C D3C1 OUT REG1 ;SET MSB LATCH 016E 2E08 MVI L,NBYTES/16 ;L=BYTES/SECTOR 0170 3A7C04 LDA MODE ;CHECK FOR READ OR WRITE 0173 B7 2 ORA A ;0=READ/1=WRITE 0174 CA8501 JZ RDE 6 IN REG0 01D4 B8 I CMP B 01D5 C45802 CNZ RDERR 01D8 DBC0 IN REG0 01DA B8 I CMP B 01DB C45802 CNZ RDERR 01DE DBC0 IN REG0 01E0 B8 I CMP B 01E1 C45802 CNZ RDERR 01E4 DBC0 IN REG0 01E6 B8 . CMP B 01E7 C45802 CNZ RDERR 01EA 2D U DCR L ;DECREMENT BYTE COUNTER 01EB C28A01 JNZ RDLP ;READ ALL BYTES 01EE C1 F POP B ;RESTORE BC 01EF C37A01 JMP FMATE2 ;READ REST OF DATA  ; 016 6 D ;FIND # OF BOARDS 010C 78 $ MOV A,B ;B=SECTORS/TRACK 010D B7 w ORA A ;CANT BE 0 010E CA4602 JZ ERR1 ;PRINT WARNING 0111 327A04 STA NSCTR ;SAVE SECTORS/TRACK 0114 79 MOV A,C ;GET # OF BOARDS FOUND 0115 326604 STA NUMBD ;PUT IN MESSAGE 0118 115C04 LXI D,MESG7 011B CDA402 CALL SMESG 011E 3E80 MVI A,80H ;GET CHECK SUM BYTE 0120 327B04 STA FBYTE ;SAVE IT 0123 3E01 MVI A,1 ;WR0ITE MODE 0125 327C04 STA MODE ;SET MODE T6 A;READ SECTOR 0177 CDF201 CALL WRTE ;WRITE SECTOR 017A 0C /FMATE2: INR C ;BUMP CURRENT SECTOR # 017B 05 W DCR B ;DECREMENT SECTOR COUNTER 017C C26B01 JNZ FMATE1 ;FILL SECTORS 017F 14 + INR D ;BUMP CURRENT TRACK COUNT 0180 25 T DCR H ;DECREMENT TRACK COUNTER 0181 C26201 JNZ FMATE ;FILL TRACKS 0184 C9  RET  ; 0185 C5 NRDE: PUSH B ;SAVE BC 0186 3A7B04 LDA FBYTE ;GET COMPARE BYTE 0189 47  MOV B,A ;IN B 06 .F2 3A7B04 WRTE: LDA FBYTE ;GET FILL BYTE 01F5 D3C0 WRLP: OUT REG0 ;WRITE DATA 01F7 D3C0 OUT REG0 01F9 D3C0 OUT REG0 01FB D3C0 OUT REG0 01FD D3C0 OUT REG0 01FF D3C0 OUT REG0 0201 D3C0 OUT REG0 0203 D3C0 OUT REG0 0205 D3C0 OUT REG0 0207 D3C0 OUT REG0 0209 D3C0 OUT REG0 020B D3C0 OUT REG0 020D D3C0 OUT REG0 020F D3C0 OUT REG0 0211 D3C0 OUT REG0 0213 D3C0 OUT REG0 0215 2D 6 6TO WRITE 0128 2602 MVI H,2 ;H=TRACKS TO FORMAT 012A 1600 MVI D,0 ;CLEAR TRACK COUNTER 012C CD6201 CALL FMATE ;DO IT 012F 3EE5 MVI A,0E5H ;GET FORMAT BYTE 0131 327B04 STA FBYTE ;SAVE IT 0134 26FE MVI H,254 ;H=TRACKS LEFT TO FORMAT 0136 CD6201 CALL FMATE ;DO IT 0139 114904 LXI D,MESG6 013C CDA402 CALL SMESG 013F AF XRA A ;SET TO READ MODE 0140 327C04 STA MODE ;SET MODE BYTE 0143 3E80 MVI A,80H ;GET COMPARE BYTE 016/18A DBC0 RDLP IN REG0 ;GET DATA 018C B8 d CMP B ;CHECK IT 018D C45802 CNZ RDERR ;PRINT ANY ERRORS 0190 DBC0 IN REG0 0192 B8 I CMP B 0193 C45802 CNZ RDERR 0196 DBC0 IN REG0 0198 B8 I CMP B 0199 C45802 CNZ RDERR 019C DBC0 IN REG0 019E B8 I CMP B 019F C45802 CNZ RDERR 01A2 DBC0 IN REG0 01A4 B8 I CMP B 01A5 C45802 CNZ RDERR 01A8 DBC0 IN REG0 01AA B8  CMP B 01AB C45802 7m7Z DCR L ;DECREMENT BYTE COUNTER 0216 C2F501 JNZ WRLP ;FILL CURRENT SECTOR 0219 C9  RET  ; 021A AF FIND: XRA A ;CLEAR A 021B 47 MOV B,A ;CLEAR B 021C 0E30 MVI C,30H ;C=NUMBER OF BOARDS FOUND 021E D3C2 OUT REG2 ;SET LSB LATCH 0220 D3C1 FIND1: OUT REG1 ;SET MSB LATCH 0222 CD3302 CALL TEST ;CHECK FOR A BOARD 0225 C0  RNZ ;BOARDS FOUND 0226 78 A MOV A,B ;GET SECTORS/BOARD 0227 C608 ADI 8 ;ADD BOARD 7 0271 F1 POP PSW ;GET BAD BYTE 0272 CD8C02 CALL CNVHX ;CONVERT 0275 221904 SHLD BDBYT ;STORE IN MESSAGE 0278 11DC03 LXI D,MESG5 ;PRINT ERROR MESSAGE 027B CDA402 CALL SMESG 027E 0E01 MVI C,01 ;GET RESPONSE 0280 CD0500 CALSL BDOS 0283 FE1B CPI 1BH ;CHECK FOR ABORT 0285 CA0000 JZ 0 0288 C1  POP B ;CONTINUE 0289 D1  POP D 028A E1 POP H ;RESTORE REGS. 028B C9  RET  ; 028C F5 CNVHX: PU7yT' 03B8 0A0D DW 0D0AH 03BA 434845434B DB 'CHECK FOR PORT ADDRESSING ERROR' 03D9 0A0D DW 0D0AH 03DB 24 v DB '$' 03DC 5645524946MESG5: DB 'VERIFY ERROR AT' 03EB 0A0D DW 0D0AH 03ED 534543544F DB 'SECTOR ' 03F4 M BDSCTR: DS 2 03F6 0A0D DW 0D0AH 03F8 545241434B DB 'TRACK ' 03FE P BDTRK: DS 2 0400 0A0D DW 0D0AH 0402 474F4F4420 DB 'GOOD DATA ' 040C N GBYT: DS 2 040E 0A0D DW 0D0AH 0410 4241442044 DB 'BAD DATA ' 041977sOFFSET 0229 FE40 CPI 40H ;MAX. BOARDS ALLOWED 022B CA4F02 JZ ERR2 ;PRINT WARNING & ABORT 022E 0C # INR C ;BUMP BOARD COUNT 022F 47 C MOV B,A ;SAVE OFFSET 0230 C32002 JMP FIND1 ;KEEP LOOKING  ; 0233 CD4202 TEST: CALL RESET ;RESET BYTE LOCATION COUNTERS 0236 3E55 MVI A,55H ;GET TEST BYTE 0238 D3C0 OUT REG0 ;WRITE IT 023A CD4202 CALL RESET ;RESET COUNTERS 023D DBC0 IN REG0 ;READ DATA 023F FE55 CPI 55H ;CH7$SH PSW ;SAVE CONVERT BYTE 028D 0F  RRC 028E 0F  RRC 028F 0F  RRC 0290 0F R RRC ;MOVE INTO POSITION 0291 CD9B02 CALL HASCI ;CONVERT NIBBLE 0294 6F  MOV L,A ;SAVE IN L 0295 F1 O POP PSW ;RESTORE BYTE 0296 CD9B02 CALL HASCI ;CONVERT NIBBLE 0299 67  MOV H,A ;SAVE IN H 029A C9  RET  i; 029B E60F HASCI: ANI 0FH ;MASK MSB NIBBLE 029D C690 ADI 90H ;A-F CAUSE CARRY 029F 27  DAA ;ADJUST7 BDBYT: DS 2 041B 0A0D DW 0D0AH 041D 454E544552 DB 'ENTER ESC. TO ABORT ANY OTHER TO CONTINUE' 0446 0A0D DW 0D0AH 0448 24 Z DB '$' 0449 5645524946MESG6: DB 'VERIFYING FORMAT' 0459 0A0D DW 0D0AH 045B 24 9 DB '$' 045C 464F524D41MESG7: DB 'FORMATING ' 0466 00 XNUMBD: DB 0 0467 204C532D31 DB ' LS-100 BOARD(S)' 0477 0A0D DW 0D0AH 0479 24 DB '$'  ;  ;PROGRAM STORAGE AREA  ;THIS MUST7:1001000031910411A902CDA402CD1A0278B7CA46D2 :1001100002327A0479326604115C04CDA4023E8076 :10012000327B043E01327C0426021600CD62013E81 :10013000E5327B0426FECD6201114904CDA402AF55 :10014000327C043E80327B0426021600CD62013EE2 :10015000E5327B0426FECD6201117F03CDA402C3EC :100160000000AF4F3A7A04477AD3C279D3C12E0840 :100170003A7C04B7CA8501CDF2010C05C26B0114AB :1001800025C26201C9C53A7B0447DBC0B8C4580226 :10019000DBC0B8C45802DBC0B8C45802DBC0B8C466 :1001A0005802DBC0B8C45802DBC0B8C45802DBC078 :1001B000B8C458027 ECK IT 0241 C9  RET  ; 0242 AF TRESET: XRA A ;CLEAR A 0243 D3C3 OUT REG3 ;SET BYTE LOCATION TO 0 0245 C9  RET  ~; 0246 118603 ERR1: LXI D,MESG3 ;CAN'T FIND ANY BOARDS 0249 CDA402 CALL SMESG 024C C30000 JMP 0 ;ABORT  ; 024F 119F03 ERR2: LXI D,MESG4 ;BOARDS FOUND EXCEED LIMIT 0252 CDA402 CALL SMESG 0255 C30000 JMP 0 ;ABORT  ; 0258 E5 RDERR: PUSH H ;SAVE WORKIN7 3 02A0 CE40 ACI 40H ;ADD IN CARRY 02A2 27  DAA ;ADJUST 02A3 C9  RET  p; 02A4 0E09 SMESG: MVI C,09H ;PRINT MESSAGE FUNCTION 02A6 C30500 JMP BDOS ;LET CP/M DO THE WORK  ; 02A9 20 MESG1: DB ' \LS-100 AUTO FORMAT PROGRAM' 02D6 0A0D DW 0D0AH 02D8 0A0D DW 0D0AH 02DA 20 DB ' ? DIGITAL RESEARCH COMPUTERS' 0305 0A0D DW 0D0AH 0307 20 DB '  ALL7  BE IN RAM  ; 047A # NSCTR: DS 1 ;SECTORS/TRACK 047B  FBYTE: DS 1 ;FILL BYTE 047C  MODE: DS 1 ;MODE BYTE 047D  DS 20 0491 =  STACK: EQU $ 0491  END  < DB '$' 045C 464F524D41MESG7: DB 'FORMATING ' 0466 00 XNUMBD: DB 0 0467 204C532D31 DB ' LS-100 BOARD(S)' 0477 0A0D DW 0D0AH 0479 24 DB '$'  ;  ;PROGRAM STORAGE AREA  ;THIS MUST7 DBC0B8C45802DBC0B8C4580287 :1001C000DBC0B8C45802DBC0B8C45802DBC0B8C436 :1001D0005802DBC0B8C45802DBC0B8C45802DBC048 :1001E000B8C45802DBC0B8C458022DC28A01C1C3CA :1001F0007A013A7B04D3C0D3C0D3C0D3C0D3C0D319 :10020000C0D3C0D3C0D3C0D3C0D3C0D3C0D3C0D356 :10021000C0D3C0D3C02DC2F501C9AF470E30D3C281 :10022000D3C1CD3302C078C608FE40CA4F020C4786 :10023000C32002CD42023E55D3C0CD4202DBC0FEF8 :1002400055C9AFD3C3C9118603CDA402C3000011A1 :100250009F03CDA402C30000E5D5C5F57ACD8C027D :1002600022FE0379CD8C0222F40378CD87 +G REGS. 0259 D5  PUSH D 025A C5  PUSH B 025B F5  PUSH PSW 025C 7A MOV A,D ;GET CURRENT TRACK # 025D CD8C02 CALL CNVHX ;CONVERT TO ASCII IN HL 0260 22FE03 SHLD BDTRK ;PUT INTO MESSAGE 0263 79 MOV A,C ;GET CURRENT SECTOR # 0264 CD8C02 CALL CNVHX ;CONVERT TO ASCII 0267 22F403 SHLD BDSCTR ;PUT IN MESSAGE 026A 78 t MOV A,B ;GET GOOD DATA BYTE 026B CD8C02 CALL CNVHX ;CONVERT 026E 220C04 SHLD GBYT ;STORE IN MESSAGE 7l4 RIGHTS RESERVED' 032F 0A0D DW 0D0AH 0331 20 DB ' 3 COPYRIGHT 1983' 0356 0A0D DW 0D0AH 0358 20 DB ' IVER. 1.0' 037A 0A0D DW 0D0AH 037C 0A0D DW 0D0AH 037E 24 N DB '$' 037F 444F4E45 MESG2: DB 'DONE' 0383 0A0D DW 0D0AH 0385 24 ` DB '$' 0386 4E4F204C53MESG3: DB 'NO LS-100 BOARDS FOUND' 039C 0A0D DW 0D0AH 039E 24 < DB '$' 039F 424F415244MESG4: DB 'BOARDS FOUND EXCEED LIMI788C02220C7D :1002700004F1CD8C0222190411DC03CDA4020E017D :10028000CD0500FE1BCA0000C1D1E1C9F50F0F0F5B :100290000FCD9B026FF1CD9B0267C9E60FC6902779 :1002A000CE4027C90E09C305002 091 :1002B00 02]04C532D31303020A1 :1002C000204155544F2020464F524D41542020503C :1002D000524F4752414D0A0D0A0D20 68 :1002E00 02S044494749543D :1002F000414C20524553454152434820434F4D50B5 :1003000055544552530A0D 20 23 :1003100 020414C4C2064 :1003288}BASE+2 ;LSB ADDRESS LATCH REG3 EQU PBASE+3 ;BYTE LOCATION COUNTERS ; ; TO CREATE REL.COM ; ASM INSTALL ;MAKE HEX FILE ; ASM DRV1 ;MAKE HEX FILE ; DDT INSTALL.HEX ;READ IN RELOCATOR ; H0,(ADDRESS OF DRV1) ;GET DRIVER OFFSET FROM 0H ; ;ADD 1000H TO DIFF. ; IDRV1.HEX ;SET UP TO READ IN LS-100 DRIVER ; R(FINAL OFFSET) ;READ DRVIER INTO MEMORY AT 1000H ; G0 ;EXIT DDT ; SAVE 17 INSTALL.COM ;SAVE RELOCATOR AND DRIVER ; ; ORG 0100H ;MAKE COM FILE LXI SP,STACK ;SET UP SYSTEM STACK 8+NUSED ENTRIES DAD D ;ADJUST HL LXI D,DRV1+2AH ;DE=DEST. LXI B,1BH ;# OF BYTES CALL MOVIT ;COPY HOME-SECTOR TRANSLATE ; ;COPY DRIVER JUMP TABLE INTO BIOS JUMP TABLE ; MOV2B: LXI H,DRV1+9 ;HL=DRIVER BIOS LXI D,BIOS+3 ;DE=DEST. LXI B,3 ;# OF BYTES CALL MOVIT ;COPY WARM BOOT LXI D,BIOS+18H ;SKIP PAST UNUSED ENTRIES LXI B,1BH ;# OF BYTES CALL MOVIT ;COPY HOME-SECTOR TRANSLATE ; ; FILL IN DISK PRAMTER BLOCK BASED ON # OF BOARDS IN SYSTEM ; LXI D,MESG5 CALL SMESG LDA NUMBD 820005249474854532052455345525645440A72 :100330000D20 D0 :100340002.0434F50595249474848 :100350005420313938330A0D20 3D :10036000208D :1003700020205645522E20312E300A0D0A0D2444DD :100380004F4E450A0D244E4F204C532D3130302016 :10039000424F4152445320464F554E440A0D244289 :1003A0004F4152445320464F554E442045584345F3 :1003B0004544204C494D49540A0D434845434B2080 :1003C000464F5220504F5254+2041444452455353BB :1003D000494E472045525288; ;CHECK FOR # OF BOARDS IN SYSTEM ; CALL FIND ;FIND # OF BOARDS MOV A,C ;PUT IN A ORA A ;SET FLAGS JZ ERR1 ;CAN'T BE 0 STA NUMBD ;SAVE COUNT ADI 30H ;MAKE ASCII STA BDS ;PUT IN MESSAGE ; ;SEE IF DRIVER IS LOADED ; LXI D,DRV1+6 ;DE=BASE OF DRIVER+6 LHLD 6 ;GET CCP ADDR. MOV A,H ;A=H CMP D ;CHECK MSB JNZ MAIN ;LOAD DRIVER IF NOT EQU. MOV A,L ;A=L CMP E ;CHECK LSB JNZ MAIN ;LOAD DRIVER IF NOT EQU. LDA DRV1 ;TPA IS REDUCED CORRECT AMOUNT CPI DRVLD ;CHECK 8k LXI H,DRVTAB ;HL@ DRIVE TABLE DCR A ;MAKE RELATIVE 0 JZ CALC2 ;SKIP IF ONLY 1 BOARD LXI D,TABSZ ;DE=SIZE OF TABLE CALC1: DAD D ;INDEX INTO TABLE DCR A ;DECREMENT A JNZ CALC1 ;UNTIL A=0 CALC2: LXI D,DPB ;HL=SOURCE/DE=DEST. LXI B,TABSZ ;BC=LENGTH CALL MOVIT ;MOVE INTO POSTION ; ;END OF MAIN PROGRAM ; LXI D,MESG2 ;DONE CALL SMESG JMP 0 ; ;FIND # OF BOARDS IN SYSTEM ; FIND: XRA A ;CLEAR A MOV B,A ;" " B MOV C,A ;" " C OUT REG2 ;CLEAR LSB LATCH FIND1: OUT R8 4F520A0D245645524924 :1003E0004659204552524F522041540A0D5345431D :0403F000544F5220F4 :0803F6000A0D545241434B2053 :0C0400000A0D474F4F4420444154412056 :0B040E000A0D424144204441544120AB :10041B000A0D454E544552204553432E20544F2030 :10042B0041424F525420414E59204F54484552207F :10043B00544F20434F4E54494E55450A0D245645B3 :10044B0052494659494E4720464F524D41540A0D89 :10045B0024464F524D4154494E472000204C532DBA :0F046B0031303020424F4152442853290A0D248A :00 8  ;PROGRAM INSTALL.ASM ;LS-100 DRIVER RELOCATOR PROGRAM ;BY RVA ;LAST CHANGE ;6/27/83 ;COPYRIGHT 1983 ;DIGITAL RESEARCH COMPUTERS ;ALL RIGHTS RESERVED ; TRUE EQU 0FFFFH ;VALUE FOR TRUE FALSE EQU NOT TRUE ;VALUE FOR FALSE ; STND EQU TRUE ;SET TO TRUE FOR STANDARD CP/M OFST EQU FALSE ;SET TO TRUE FOR NON-STANDARD CP/M ; IF STND MSIZE EQU 60 ;CP/M SIZE IN KILOBYTES CBASE EQU (MSIZE-20)*1024 ;BIAS CPMB EQU CBASE+3400H ;BASE ADDRESS OF CCP BDOS EQU CBASE+3C06H ;BDOS ENTRY BIOS EQU CBASE8 jID BYTE TO SEE IF DRIVER IS THERE JNZ MAIN ;LOAD DRIVER IF NOT LXI D,MESG3 ;DRIVER ALL-READY LOADED CALL SMESG ;DISPLAY MESSAGE JMP 0 ;EXIT TO CP/M ; ;CHECK CP/M VER. # ; MAIN: MVI C,0CH ;VERSION FUNC. CALL 5 CPI 20H ;CHECK FOR 2.0 OR BETTER JNC VEROK LXI D,MESG4 ;WRONG VERSION CALL SMESG JMP 0 ;ABORT ; ;CHECK FOR PROPER BDOS MEMORY LOCATION ; VEROK: LXI D,BDOS ;GET EQUATED VALUE LXI H,6 ;HL=BDOS ENTRY MOV A,E ;A=LSB CMP M ;CHECK JNZ ERR3 ;REPORT ERROR INX8 EG1 ;SET MSB LATCH CALL TEST ;CHECK FOR A BOARD RNZ ;RETURN WHEN NO BOARD FOUND MOV A,B ;B=SECTORS/BOARD ADI 08 ;ADD BOARD OFFSET CPI 40H ;CHECK FOR OVERFLOW JZ ERR2 ;REPORT ERROR MOV B,A ;RESULTS IN B INR C ;INCREMENT BOARD COUNTER JMP FIND1 ;KEEP LOOKING ; ;NON-DESTRUCTIVE BYTE TEST ; TEST: CALL RESET ;CLEAR BYTE LOCATION ADDRESS IN REG0 ;READ DATA MOV D,A ;SAVE IN D CALL RESET ;CLEAR BYTE LOCATION ADDRESS MVI A,55H ;GET TEST BYTE OUT REG0 ;WRITE IT CALL 8 8+4A00H ;BIOS ENDIF ; ; ; IF OFST BIOS EQU 0EA00H ;ADDRESS OF BIOS BDOS EQU 0DC06H ;ADDRESS OF BDOS CPMB EQU BDOS-806H ;ADDRESS OF CCP ENDIF ; ; ; DRV1 EQU CPMB-1024 ;ADDRESS OF DRIVER DRVID EQU 04 ;ACTIVE DRIVE # (E) DRVLD EQU 41H ;DRIVER LOADED FLAG TABSZ EQU 0FH ;SIZE OF DRIVE TABLE ENTRY DPB EQU DRV1+55H ;ADDRESS OF DISK PARM. BLOCK ; ;BOARD EQUATES ; PBASE EQU 0C0H ;BASE PORT ADDRESS REG0 EQU PBASE ;DATA TRANSFER PORT REG1 EQU PBASE+1 ;MSB ADDRESS LATCH REG2 EQU P8t H ;BUMP POINTER MOV A,D ;A=MSB CMP M ;CHECK JNZ ERR3 ;REPORT ERROR ; ;MOVE DRIVER BELOW CCP ; LXI D,MESG1 ;SIGN ON CALL SMESG MOV1: LXI H,1000H ;HL=SOURCE OF DRIVER LXI D,DRV1 ;DE=DEST. OF DRIVER LXI B,1024 ;BC=LENGTH OF DRIVER CALL MOVIT ;MOVE INTO POSTION ; ;COPY BIOS JUMP TABLE TO RELOCATED BIOS JUMP TABLE ; MOV2A: LXI H,BIOS+3 ;HL=BIOS JUMP TABLE LXI D,DRV1+27H ;DE=RELOCATED BIOS JUMP TABLE LXI B,3 ;# OF BYTES CALL MOVIT ;COPY WARM BOOT LXI D,12H ;SKIP PAST U99)RESET ;CLEAR BYTE LOCATION ADDRESS IN REG0 ;READ DATA BACK CPI 55H ;CHECK FOR TEST BYTE CALL RESET ;CLEAR BYTE LOCATION ADDRESS MOV A,D ;GET ORGINAL DATA OUT REG0 ;RESTORE DATA RET ; ;RESET BYTE ADDRESS COUNTERS ; RESET: MVI A,0 ;CLEAR A/SAVE FLAGS OUT REG3 ;SET BYTE LOCATION ADDRESS RET ; ;BLOCK MOVE ROUTINE ;HL=SOURCE/DE=DEST./BC=COUNT ; MOVIT: MOV A,M ;GET DATA STAX D ;STORE IT INX H ;BUMP SOURCE POINTER INX D ;BUMP DEST. POINTER DCX B ;DECREMENT COUNTER MO9 48 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTNT. MASK DW 189 ;DISK SIZE-1 DW 511 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB6: DW 56 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTNT. MASK DW 221 ;DISK SIZE-1 DW 1023 ;MAX. DIRECTORY ENTRIES DB 240 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB7: DW 64 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 999V A,B ;A=B ORA C ;CHECK FOR BC=0 JNZ MOVIT ;LOOP UNTIL BC=0 RET ; ;NO MEMORY BOARDS FOUND ; ERR1: LXI D,MESG6 CALL SMESG JMP 0 ; ;TO MANY MEMORY BOARDS FOUND ; ERR2: LXI D,MESG7 CALL SMESG JMP 0 ; ;BDOS VALUE NOT EQUAL TO EQUATED VALUE ; ERR3: LXI D,MESG8 CALL SMESG JMP 0 ; ;SEND MESSAGE @DE TO CON. ; SMESG: MVI C,09H JMP 5 ; ;DISK DRIVE PRAMETER TABLES ; DRVTAB: EQU $ ; DPB0: DW 8 ;SECTORS/TRACK DB 4 ;BLOCK SHIFT DB 15 ;BLOCK MASK DB 1 ;EXTNT. MASK D9ɳ7 ;EXTNT. MASK DW 253 ;DISK SIZE-1 DW 1023 ;MAX. DIRECTORY ENTRIES DB 240 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; ; ; ;MESSAGE AREA ; MESG1: DW 0D0AH DB ' = LS-100 AUTO INSTALL PROGRAM' DW 0D0AH DW 0D0AH DB ' / DIGITAL REASEARCH COMPUTERS' DW 0D0AH DB ' ( ALL RIGHTS RESERVED' DW 0D0AH DB ' !COPYRIGHT 1983' DW 0D0AH DB '  VER. 1.0' DW 0D0AH DW 999 W 126 ;DISK SIZE-1 DW 127 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB1: DW 16 ;SECTORS/TRACK DB 4 ;BLOCK SHIFT DB 15 ;BLOCK MASK DB 1 ;EXTNT. MASK DW 253 ;DISK SIZE-1 DW 127 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB2: DW 24 ;SECTORS/TRACK DB 5 ;BLOCK SHIFT DB 31 ;BLOCK MASK DB 3 ;EXTNT. MASK DW 189 ;DISK SIZE-1 DW 255 ;MAX. DIRECTORY ENTRIES DB 192 ;ALL9 }0D0AH DB '$' MESG2: DW 0D0AH DW 0D0AH DB 'DRIVE ' DB DRVID+41H DB ' ACTIVE' DW 0D0AH DB '$' MESG3: DW 0D0AH DB 'DRIVER ACTIVE' DW 0D0AH DB '$' MESG4: DB 'CP/M 2.0 OR BETTER REQUIRED' DW 0D0AH DB '$' MESG5: DW 0D0AH DB 'DRIVER INSTALLED FOR ' BDS: DS 1 DB ' LS-100 BOARD(S)' DW 0D0AH DB '$' MESG6: DB 'NO BOARDS FOUND' DW 0D0AH DB '$' MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMIT' DW 0D0AH DB '$' MESG8: DB 'RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE9 9 9 OC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB3: DW 32 ;SECTORS/TRACK DB 5 ;BLOCK SHIFT DB 31 ;BLOCK MASK DB 3 ;EXTNT. MASK DW 253 ;DISK SIZE-1 DW 255 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB4: DW 40 ;SECTORS/TRACK DB 6 ;BLOCK SHIFT DB 63 ;BLOCK MASK DB 7 ;EXTNT. MASK DW 157 ;DISK SIZE-1 DW 511 ;MAX. DIRECTORY ENTRIES DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET ; DPB5: DW9(Z' DW 0D0AH DB '$' NUMBD: DS 1 ;NUMBER OF BOARDS FOUND DS 20 STACK EQU $ END B 'DRIVER ACTIVE' DW 0D0AH DB '$' MESG4: DB 'CP/M 2.0 OR BETTER REQUIRED' DW 0D0AH DB '$' MESG5: DW 0D0AH DB 'DRIVER INSTALLED FOR ' BDS: DS 1 DB ' LS-100 BOARD(S)' DW 0D0AH DB '$' MESG6: DB 'NO BOARDS FOUND' DW 0D0AH DB '$' MESG7: DB 'NUMBER OF BOARDS FOUND EXCIDE LIMIT' DW 0D0AH DB '$' MESG8: DB 'RELOCATION ERROR BDOS VALUE NOT EQUAL TO EQUATED VALUE9::C;PROGRAM DRV1.ASM ;LS-100 DRIVER PROGRAM ;BY RVA ;TO BE RELOCATED BELOW CCP ;LAST CHANGE ;6/23/1983 ;COPYRIGHT 1983 ;DIGITAL RESEARCH COMPUTERS ;ALL RIGHTS RESERVED ; ; TRUE EQU 0FFFFH ;VALUE FOR TRUE FALSE EQU NOT TRUE ;VALUE FOR FALSE ; STND EQU TRUE ;SET TO TRUE FOR STANDARD CP/M OFST EQU FALSE ;SET TO TRUE FOR NON-STANDARD CP/M ; IF STND MSIZE EQU 60 ;CP/M SIZE IN KILOBYTES CBASE EQU (MSIZE-20)*1024 ;BIAS CPMB EQU CBASE+3400H ;BASE ADDRESS OF CCP BIOS EQU CBASE+4A00H ;BIOS AD:V0,ALV0 ;CHECK ALLOC. VECTORS ; ;THE FOLLOWING PARAMETERS ARE FOR 1 MEMORY BOARD ; DPB0: EQU $ ;DISK PARM. BLOCK DW 16 ;SECTORS/TRACK DB 4 ;BLOCK SHIFT DB 15 ;BLOCK MASK DB 1 ;EXTNT MASK DW 253 ;SIZE-1 DW 127 ;MAX. DIR. ENTRYS DB 192 ;ALLOC0 DB 0 ;ALLOC1 DW 0 ;CHECK SIZE DW 2 ;OFFSET XLT0: EQU 0 ;NOT REQUIRED ; ;DRIVER ROUTINES ; WBOOT: LXI SP,80H ;RESET STACK LXI H,BDOS1 ;HL=BASE OF DRIVER SHLD 6 ;REFLECT REDUCED SIZE INR H ;SKIP PAST DRIVER INR H ; I:URN IF NO ERROR ; ;PROCESS CHECK SUM ERROR ; LDA TRK ;GET CURRENT TRACK # CALL CNVHX ;CONVERT TO HEX ASCII SHLD BDTRK ;PUT IN MESSAGE LDA SEC ;GET CURRENT SECTOR # CALL CNVHX ;CONVERT TO HEX ASCII SHLD BDSCTR ;PUT IN MESSAGE ; ;FIND WHICH LS-100 BOARD THE ERROR OCCURED ON ; MVI B,'1' ;START WITH BOARD #1 LDA SEC ;GET CURRENT SECTOR # FIND: SUI 8 ;SUB. OFFSET/BOARD JC FOUND ;CHECK FOR OVERFLOW INR B ;BUMP BOARD COUNTER JMP FIND ;KEEP LOOKING FOUND: MOV A,B ;GET BOA:UTE ADDRESS FOR CHECK SUM BYTE & SET UP LS-100 REGS. ; CALC: LXI H,TRK ;HL @ TRACK # XRA A ;CLEAR A/CARRY FLAG OUT REG2 ;SET TO TRACK 0 MOV A,M ;GET CURRENT TRACK RLC ;MOD 128 JNC SKP1 ;JUMP IF <128 MVI A,1 ;SET TO TRACK 1 OUT REG2 ;UPDATE LSB ADDRESS LATCH SKP1: MOV A,M ;RESTORE TRACK # OUT REG3 ;SET BYTE LOCATION ADDRESS COUNTERS RET ; ;CHECK THE CURRENT DRIVE BYTE FOR LS-100 ; CHK: LDA UNIT ;GET DRIVE # CPI DRVID ;Z=0 DRIVE ACTIVE/Z=1 DRIVE NOT ACTIVE RET ; ;:DRESS CONOUT EQU BIOS+12 ;BIOS CONSOLE OUTPUT BDOS EQU CBASE+3C06H ;BDOS ENTRY ENDIF ; IF OFST BIOS EQU 0EA00H ;ADDRESS OF BIOS BDOS EQU 0DC06H ;ADDRESS OF BDOS CPMB EQU BDOS-806H ;ADDRESS OF CCP ENDIF ; CONOUT EQU BIOS+12 ;BIOS CONSOLE OUTPUT DRVID EQU 04 ;ACTIVE DRIVE # (E) DRVLD EQU 41H ;DRIVER ID BYTE ; ;LS-100 PORT ADDRESS ASSIGMENT ; PBASE EQU 0C0H ;BASE PORT ADDRESS REG0 EQU PBASE ;DATA TRANSFER PORT REG1 EQU PBASE+1 ;MSB ADDRESS LATCH REG2 EQU PBASE+2 ;LSB ADDRESS :NR H ; INR H ;HL=HL+1024 MVI L,3 ; LDA 4 ;GET CURRENT DRIVE MOV C,A ;MOVE INTO C PCHL ;LOG IN DRIVE (CCP+3) ; ;HOME ROUTINE ; HOME: CALL CHK ;CHECK FOR LS-100 JNZ HOME2 ;IF NOT JUMP TO BIOS XRA A ;CLEAR A STA TRK ;SET TO TRACK 0 RET ; ;SELECT DISK ROUTINE ; SLDSK: MOV A,C ;GET DRIVE # STA UNIT ;SAVE IT MVI A,DRVID ;GET ACTIVE DRIVE # CMP C ;CHECK FOR LS-100 JNZ SLDSK2 ;IF NOT JUMP TO BIOS LXI H,DPE0 ;HL=DISK PARM. BLOCK RET ; ;SET TRACK ROUTINE ; :RD # STA BDBRD ;PUT IN MESSAGE ; ;PRINT ERROR MESSAGE ON CONSOLE ; LXI H,MESG1 ;HL @ ERROR MESSAGE SMESG: MOV A,M ;GET DATA ORA A ;CHECK FOR END OF MESSAGE JZ EXIT ;EXIT IF SO MOV C,A ;SETUP FOR BIOS CALL PUSH H ;SAVE POINTER CALL CONOUT ;OUTPUT BYTE POP H ;RESTORE POINTER INX H ;BUMP POINTER JMP SMESG ;LOOP UNTIL END OF MESSAGE ; ;SET DEFAULT DRIVE TO A AND ABORT ; EXIT: XRA A ;CLEAR A MOV C,A ;SET TO DRIVE A STA 4 ;SET TO DRIVE A JMP 0 ;RETURN TO CP/M ; :MESSAGE AREA ; MESG1: DW 0D0AH DB 'CHECK SUM ERROR OCCURED ON LS-100 BOARD ' BDBRD: DB 0 DW 0D0AH DB 'AT TRACK ' BDTRK: DW 0 DB 'H' DB ' SECTOR ' BDSCTR: DW 0 DB 'H' DW 0D0AH DB 0 ; ; ;LOCAL STORAGE MUST BE IN RAM ; UNIT: DS 1 ;CURRENT DRIVE TRK: DS 1 ;CURRENT TRACK SEC: DS 1 ;CURRENT SECTOR TADDR: DS 2 ;TRANSFER ADDRESS DIRBUF: DS 128 ;DIRECTORY ACCESS BUFFER ALV0: DS 64 ;ALLOCATION VECTOR CSV0: DB 0 ;CHECK SUM VECTOR END : 5LATCH REG3 EQU PBASE+3 ;BYTE LOCATION ADDRESS COUNTERS NBYTES EQU 128 ;BYTES/SECTOR ; ;START OF DRIVER ; ORG CPMB-1024 ;ALLLOW 1K FOR DRIVER DB DRVLD ;DRIVER ID BYTE DB 0 DW 0,0 ;6 BYTE OFFSET BDOS1: JMP BDOS ;LINK TO BDOS ENTRY ; ;DRIVER BIOS JUMP TABLE ; WBOOT1: JMP WBOOT ;WARM BOOT HOME1: JMP HOME ;HOME SLDSK1: JMP SLDSK ;SELECT DISK STRK1: JMP STRK ;SET TRACK SSEC1: JMP SSEC ;SET SECTOR SDMA1: JMP SDMA ;SET DMA ADDRESS RDE1: JMP RDE ;READ SECTOR WRE1: JMP WRE ;WRITE: STRK: CALL CHK ;CHECK FOR LS-100 JNZ STRK2 ;IF NOT JUMP TO BIOS MOV A,C ;GET TRACK # STA TRK ;STORE IT RET ; ;SET SECTOR ROUTINE ; SSEC: CALL CHK ;CHECK FOR LS-100 JNZ SSEC2 ;IF NOT JUMP TO BIOS MOV A,C ;GET SECTOR # STA SEC ;STORE IT RET ; ;SET UP DMA ADDRESS ; SDMA: MOV H,B ;H=B MOV L,C ;L=C SHLD TADDR ;STORE IT JMP SDMA2 ;PASS PARM. TO BIOS ; ;LS-100 SECTOR TRANSLATE ROUTINE ; SCTRL: CALL CHK ;CHECK FOR LS-100 JNZ SCTRL2 ;IF NOT JUMP TO BIOS MOV H,B ;N: :;CONVERT HEX BYTE IN A. RETURN TWO HEX ASCII CHARS. IN HL ; CNVHX: PUSH PSW RRC RRC RRC RRC CALL HASCI MOV L,A POP PSW CALL HASCI MOV H,A RET HASCI: ANI 0FH ADI 90H DAA ACI 40H DAA RET ; ;LS-100 SECTOR WRITE ROUTINE ; WRE: CALL CHK ;CHECK FOR LS-100 JNZ WRE2 ;IF NOT JUMP TO BIOS CALL SETUP ;SET UP LS-100 REGS. WRLP: MOV A,M ;GET DATA FROM MEMY. @ HL OUT REG0 ;STORE DATA ADD E ;COMPUTE CHECK SUM MOV E,A ;ACCUMULATE CHECK SUM IN E INX H ;BUMP POINT: :  SECTOR LSTS1: JMP LSTS2 ;LIST STATUS SCTRL1: JMP SCTRL ;SECTOR TRANSLATOR ; ;RELOCATED CP/M BIOS JUMP TABLE ; WBOOT2: DS 3 ;WARM BOOT HOME2: DS 3 ;HOME SLDSK2: DS 3 ;SELECT DISK STRK2: DS 3 ;SET TRACK SSEC2: DS 3 ;SET SECTOR SDMA2: DS 3 ;SET DMA ADDRESS RDE2: DS 3 ;READ SECTOR WRE2: DS 3 ;WRITE SECTOR LSTS2: DS 3 ;LIST STATUS SCTRL2: DS 3 ;SECTOR TRANSLATOR ; ; ; DPE0: DW XLT0,0000H ;TRANSLATE TABLE DW 0000H,0000H ;SCRATCH AREA DW DIRBUF,DPB0 ;DIR.BUF./PARM. BLOCK DW CS: O TRANLASTION REQUIRED MOV L,C ;SET HL=BC RET ; ;LS-100 SECTOR READ ROUTINE ; RDE: CALL CHK ;CHECK FOR LS-100 JNZ RDE2 ;IF NOT JUMP TO BIOS CALL SETUP ;SET UP LS-100 REGS. RDLP: IN REG0 ;GET DATA FROM LS-100 MOV M,A ;STORE @ HL ADD E ;COMPUTE CHECK SUM MOV E,A ;ACCUMULATE CHECK SUM IN E INX H ;BUMP POINTER DCR B ;DECREMENT BYTE COUNT JNZ RDLP ;LOOP UNTIL ZERO CALL CALC ;SET ADDRESS OF CHECK SUM BYTE IN REG0 ;GET CHECK SUM BYTE SUB E ;CHECK FOR ERROR RZ ;RET:ER DCR B ;DECREMENT BYTE COUNT JNZ WRLP ;LOOP UNTIL ZERO CALL CALC ;SET ADDRESS OF CHECK SUM BYTE MOV A,E ;GET CHECK SUM BYTE OUT REG0 ;STORE CHECK SUM BYTE XRA A ;NORMAL RETURN RET ; ;SETUP LS-100 REGS. BASED ON CURRENT TRACK & SECTOR ; SETUP: LDA TRK ;GET CURRENT TRACK # OUT REG2 ;SET LSB ADDRESS LATCH LDA SEC ;GET CURRENT SECTOR # OUT REG1 ;SET MSB ADDRESS LATCH LHLD TADDR ;HL=DMA POINTER MVI B,NBYTES ;B=BYTES/SECTOR MVI E,0 ;CLEAR CHECK SUM BYTE RET ; ;COMP;;;;;;> copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Command Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q* ͊!p+q*͍2!p+q*͍2!p+q*͊!p+q*͍!p+q*͍!p+q*͍2!s+p+q+p+q:=2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:=;;`7FMAT PIP E:=WS*.* PIP E:=SD.COM PIP E:=PIP.COM E: $DIAG PRN{[\]^DIAG HEX_FMAT ASM1`aFMAT PRNVbcdFMAT HEXeINSTALL ASMAfghDRV1 ASM8ijSUBMIT COM k E $$$ 0;; ͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uMʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ; ; ; ; -!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vv ~_{ozg 001 $$$$ SUB6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ;;<<<<<<<<<< B7E:$ PIP E:=WS*.* PIP E:=SD.COM PIP E:=PIP.COM E: $8PIP E:=PIP.COM$* PIP E:=SD.COM PIP E:=PIP.COM E: $8 PIP E:=SD.COM$$* PIP E:=SD.COM PIP E:=PIP.COM E: $8 PIP E:=WS*.*$$$* PIP E:=SD.COM PIP E:=PIP.COM E: $< < < < 7FMAT$=WS*.*$$$* PIP E:=SD.COM PIP E:=PIP.COM E: $8PIP E:=PIP.COM$* PIP E:=SD.COM PIP E:=PIP.COM E: $8 PIP E:=SD.COM$$* PIP E:=SD.COM PIP E:=PIP.COM E: $8 PIP E:=WS*.*$$$* PIP E:=SD.COM PIP E:=PIP.COM E: $<<=7========= = = = = ==>>>>>>>>>> > > > > >>?%????????? ? ? ? ? ??@@@@@@@@@@ @ @ @ @ @@A`AAAAAAAAA A A A A AABBBBBBBBBB B B B B BBCrCCCCCCCCC C C C C CCDDDDDDDDDD D D D D DDEDEEEEEEEEE E E E E EEFFFFFFFFFF F F F F FFGVGGGGGGGGG G G G G GGHHHHHHHHHH H H H H HHI(IIIIIIIII I I I I IIJJJJJJJJJJ J J J J JJK:KKKKKKKKK K K K K KKLLLLLLLLLL L L L L LLL