CPM < USER  1  2  3  FORMAT (?-------- CP/M2 (c)1981 --by-- Lifeboat Assoc. j<˜<$$ <*<%.!~.1~.!~< j<˜<$$ F<><:<2Y<S<.5~k<*<.~|<> =„<*<.~ڟ<<: ͒=> Ò=> Ò=͘=~#͌=ì= _2D<=2DD====D==D=== >!D2:D2a{_:Dʖ>:D>Ľ=D=ʖ>:D=2DD=–>=!BA!D6#5D=ʖ>:DĽ=!=ͬ=>ʧ>>Â@>> =)>!=F#xʺ>~0>wë>w!="= !D~6ͽ=D=:Dý=(@!E@#>͘=*=~ "?"?͌=#?>?͌=͘=>Â@ ?=_.:;<> O?o$>!DY?2D*=O?"=ʉ?@G:ʐ?:DwÖ?x2Dp0?ʹ?#*©?6?ë?w˜?0??ï?#6 ¹?.?0??#*?6??w?0???#6 ?#6?"= #~? @ @xDIR ERA TYPESAVEREN USER!@yDO@#<@ T@y#O@ 3@2=1Dy_>͸=2Dy2Dͽ=:=˜@1D͘=>A͌=>>͌=9>>>2D^? ?:D¥C.@!@_~#fowAB]BBCCC!v"=!=@ç=READ ERROR@ç=NO FILE^?:D ?!D ~ 3A#0 ?Wx ?x ? ? ?G A~ ?# 3Ax~#BA!Y?~ɯ2D:D=!Dý=:D=!D:Dý=^?TA!D~ A 6?#ˆA=@B:D`O> KAB{A͘=>A͒=>:͒=A͢=>:͒=͢=xKA AA> KA B> ͒=x B A͢=A>B=ØAÆD^? BBRBͧ=9>!=5‚@#~Y‚@#"=TAD=<@ÆDALL (Y/N)?^? ?TA=ʧB͘=!D6!D~ڇB= Bw4!Y?~ʆD͌=>†DtB=ʆD@fA ?@^? ?TAD= >B2Do&)|B+!>D>BBD=<CCͧ=>ÆDNO SPACE^? ?:DTA=yC!DDBA*=O?=?C_sC#"=^?sCG!D~YCpsCp2D=mCD>ÆD@ÆDfA ?Cͧ=ÆDFILE EXISTS@ ?_:D ?>ÉD>:D C:DʉD=2D)>ͽ=ÉDD ?TA!D@A=kD!>D=D=}|qDC=qDfA^?!D~2D>`?~2D2D\!D!BA!=~>D >D#0D~OD#CDx2͘=>>1D)>ͽ=Â@fA ?zDͧ=ÆDBAD LOADCOMfA^?:D !D ?Â@$$$ SUBEEEEE"CH{2R!"EH9"H1^2R2R!tRy)K!GE_^#V*CHSGFGSSGGGGFG~Q6SEQQQQQQQQQQQR RR,JRR&R-RARGRMRQSRHHR!EE!EôE!EôE!EEBdos Err On : $Bad Sector$Select$File R/O$F:BHA2EEFF!H~6 SEFO͐F  :HEFS SBF S2H>: HbF#F S: HSy! H4 5~yyF5 6yFҐF^HF@Oy HF HF: H–FͬF S S#HFF: H! H HFùF HF HF $O͐FF: H2 H*CHN#E G GGxF: H2 HpG&GxF~+éG7GF2 HFHG! H>wF_G: H! HF5ͤFNGkGͱFF¦GͱFxʊG#NFxG: HF! H2 HͤF! H5™GF#wOF~x½GFp HFFHSHyHWXX#XwXXXVXfXXXXXX YY Y(Y+Y2YS*Rw#w*Rw#w'SûH*S! EJH*RI"R"R!RN#F*R^#V*R~#foyxH*R{_zW+H*RIyxI#H*RDMS*Rs#r*Rs#ryOxG*R0SMD!S!RN:R EIG>O:R \ISI*CH :RqIn& ^#V>IO^I"R*R}:R*R)=I"R:RO:Ro"R*CH *CH!ͮI~2R~2RͦI:R2RͮI:RIO:Rw:Rw |g}oI*R# I )J:BHO!Jyoxg*R:BHOI}!RN#F J"R*R#*Rs#r^J ~!EJHJ! EJH*R:Ro$*CH~iJ6iJw*R*R{#zJr+s{ozg*R*R͕JI*R*R JJ,Jw͜JJ͸HJJͲH!RJ!RN#F$S*R*ROH!R~#K:AHK#~$K=2EHkK͌JK:RH:R/GyO>2R!Rq*CH"RJ͡HKJʔL*RJLJҔL^J:ROyʃL?|Lx |L sL-L|LNL-L# SL:R2EH!R~ЯwJ>HTJ LJDJ^J6kKJ-LäLPYyL 5KL*R{zLBK5KLLڋM>*CHw~#+w#w+ɯ2EH2R2RJiJLJ^J *CH :RM~MwM~NM͔M͔MN#N # M Nw ~>2RM!EH5TJ*CH!R"CHLJ"CH!w# FN! w͌JLxJ2R͢MJ*CH ~<wʃNG:R!RʎNìN 4~ʶNLJ¬N:R<ʶN$NJʶNïNZMͻIHHxJ>2R>2RͻI:R!RNNZN2R:EHNwḮIN͊IHͲHIH>2R>2RTJ*CHGJͻI:RHwḮInO>I2R;OO ^IDM;L}HO>H"R*CH :R:RdOdJslOO s#r:EH͊I:R==»Oy==»O*RWw#OJ*R"RH͸H*R:RG#šO"RJH͸H:R!ROw4iJwP:RPIZN!EH~O=2R6I2R*CH!!~~#~O~G#n,-.‹P! w! yGP!xP͢M.:EH<ʄP! q!pQM:EH<P. ʄP$N.:EH<ʄPHiJ6}2EHxJPNPON! ~态O>G~G!~G} L*CH!r#r#rJ Q^JͥP_y#x#{Qs+p+q-LP*CH ͥP!!q#p#w*R:BHOIYHGH}*RMD J"RãK:R!BHw!Q>2R*CH~=2RuQ:BH2R~2RwEQ:AH*CHw>"H!"R"R2BH!"RJ!QrJQQQMQQâM~?QͦI~?rJQQLJ*R"CHQQ-LJQQ͜LLQQüNQQNrJQQ$NQQML*R)R:BHH"RJ*R)R*R)RQQ;ML*R"EH:R;R:AHH2AHQQÓPQQÜPQQP*CH}/_|/*RW}_*R"R}o|g"R:RʑR*CH6:RʑRw:R2REQ*H*EH}DQQ>2RPOÃSÙSZ ZTZZZT×TTTTTTZT6WU CP/M2 on North Star 24K Vers 2.23a DQ (C) 1981 Lifeboat Associates $12WYͬYUZS1!SU͗T>!<6W>!H6W>*Y6W*YR͔Y22W>22!S"!E"!1W~6!9S̞YZ:O:YT==\[T\\\[T\\\[T\\\[T]\(?O?(?(Q?Ty!Y2]yVV:]o&))))T!2<y2]y2]`i"'] n&U Z!2W6UUU2%]^U2%]y2&] U^U"U>U2!]!]]͍Y!!]5UU]!]}YUUUU*-]#>U~MU!]42 ]2$]ɯ2!]<2$]!"]~6ʎU!]]}Y†U=ʆU͇YO~͇YʣU:#]V2#]!]]͍Y:$]V:]=o&)))))))*Y*']:%]U>2#]͒Y:%]=:&]U:#]VV:2WUÃQ!YY")]"+]!"Y"Y2"]2!]2#]ͪV6ͪVU:]O  yO*Y>2/];W)V͗VO:4WG:YSV_Vy@!V~pWeV#~2U#^#V#^#V"-]ͪVqͰT͒V s#ry*Y\~>~:]!Yo~[TE]jT1]yTE]TE]!>_V6W:]O ͭV怱O:]G:]͇YW*Yy>zW>:Y!"Wy@Ww!W͞Y Z Mount A, then $2/]> ͇W!Y~=RWGy@O:/]͚W:YgWtW=;W>{:Y@:/]6WyyOVOyg> gy?OڶW 24WX{=! >.X!(] ~YqXqX*4W~}OG<=ͽX:5XY@TX:7X!X>2YpWwG#7wG# 9XW>.X:TX:>.XWr!0OX/.X::Y:&Y::4W=Y:I~_G#~_G# ?YXWͽX>=_Y:\Yz20]:0]8tY=rY##=ÔY~#”Y~$N# ZÞY!1]>Y>YY)¸Y6w#< Y`^D#C-[Z!Z/Z=ZKZ[ZmZ}ZO:ZZZ}ZZ:ZZZmZZ:ZZZKZZ:ZZZZZ:ZZZZZ:ZZZZZ_^#V>>>ʤZʰZʼZ>0ZyZyZ> y:Z2N[>>7>>7>@!>Fp,.[$.[>A>0>`> Z:YHD [^[!["Z![" Z"Z![" Z"Z"Z* "[* "[* "[ >/ɯ ɯA =![͔Y!"Z" Z" Z>22!S"!E"2O=CONFIGMOVCPM COMX CONFIG COM0 ASM COM@COPY COMFORMAT COM FILECOPYCOM!DDT COM&"#$%&ED COM4'()*+,-LOAD COM./PIP COM:01234567STAT COM)89:;<=SYSGEN COM >?SAVEUSERCOM@SETCPM COM-ABCDEFSUBMIT COM GHXSUB COMIQCPMOVE Vers 3.8 (C) Digital Research, 1978 (C) Lifeboat Associates, 1979 1980 1]R* ʿ?ʿ! ʌʌ0 ҟ))) O m|Ÿ}ڟ.g))͙ Invalid memory size.$!$~/w/w|g|?>@G!00"!4~:60+4t͙!N#F !*!~+~!*͙xG}o|g"! *! xk {^~#o}ogM*.Ÿ# x! ~¤#ˆ* DM!  =*DM! D!00"!4~:ڴ60+4ô*"͙͐͐*DM*! =*=!!6DY1"|2!j˜$$ *%.!~.1~.!~ j˜$$ F>:2.5~k*.~|> =„*.~ڟ:g.*.wG,¨$wG,²˜*.~*.~*.~:O! ^#Vz#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2DUMP COMJDUMP ASM"KLMNOMEMR COMPQRMEMR DOCCSTUVWXYZ[HORUSER ASM.\]^_`aUSER ASMRbcdefghijklDISKDEF LIB2mnopqrsREAD-ME DOC)tuvwxyv"!6!Ùx7? a%_0#~$7y~# =y~+ H~ !~N# 6 ~tw+ i`{_ Ù $ !"èè Syncronization error.$͙SYN?͙>Cpw͙>Hpw Do you have a Horizon computer (Y/N) ? $ CONFIG.COM not required on disk.$ CONFIG.COM needed on disk for first cold boot.$!& Constructing 00K CP/M $ New CP/M in memory at 900H (sysgen image) is ready for "SYSGEN" or "SAVE 00 CPM00.COM"$CP/M$K VER$  !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x =qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"C {2!"E 9" 1!22!ty)K!G_^#V*C   ~6E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6 2E > #wVf  (+2<e5! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# # 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q* ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4i w: Z!E ~=26):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2ÃÙ ×6 CP/M2 on North Star 00K Vers 2.23a DQ (C) 1981 Lifeboat Associates $12Wͬ1!͗>!6>! 6>*6*͔22>22!"!"!1~6!9̞:O:[[[[ (?O?(?(Q?y!2 y: o&))))!2<y2 y2 `i"'  n& !26U2% ^2% y2& ^">2! !  ͍!! 5U ! }UU*- #>~M! 42 2$ ɯ2! <2$ !" ~6ʎ!  }†=ʆ͇O~͇ʣ:# 2# !  ͍:$ : =o&)))))))**' :% >2# ͒:% =:& :# :2Ã!YY") "+ !"=ͽ:5@T:7!>2pwG#7wG# 9>.:T:>.Wr!0O/.:::&::4=:I~_G#~_G# ?Xͽ>=_:\z20 :0 8t=r##=Ô~#”~$N# Þ!1 >>)¸6w#< #!D#C-DA $ @$ "D@A @!"$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @*@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$>CHMR12345678LS <---Terminal #8 initstring starts atS before arrow. Put length at L. CONFIG Version 4.8 (c) 1981 Lifeboat Associates Your CP/M console is configured in memory. Ready for "SAVE 24 CONFIG.COM" and "CONFIG P" or "SAVEUSER" to permanently patch disk.$\M\U\S\>2 Ͷ:USʌg!1r:M:M!ʹ¨:M&:M!~q*.".#^#V{2*#}+{_"*A: O! ~7ȹ w#x w0:A; 7!LQ Try again in decimal. $0 ?))) O P: zʎʏ:!ʉ!Ls:!°!>ª¡>ʰ<2:]P: 4 l ͝ KNo.$&KWant to install a printer (Y/N) ? $;Y&KPrinter output status port (Hex) ? $a* s s! KPrinter output port (Hex) ? $a^* s s:"C&KUsing Centronics printer (Y/N) ? $;Y@_ KCentronics ready.$&KNull"2" 2! 2# ͪ6ͪ: O  yO*>2/ ;)͗O:4G:S_y@!~pe#~2#^#V#^#V"- ͪqͰ͒ s#ry*\~>~: !o~[E j1 yE E !>_6: O ͭ怱O: G: ͇W*y>zW>:!"y@w!͞  Mount A, then $2/ > ͇!~=RGy@O:/ ͚:gt=;>{:@:/ 6yyOOyg> gy?Oڶ 24{=! >.!(  ~Yqq*4~}OG<!/=K[m}O:}:m:K:::_^#V>>>ʤʰʼ>0yy> y:2N>>7>>7>@!>Fp,.$.>A>0>`> :HD ^!"!" "!" ""* "* "* " >/ɯ ɯA !͔!"" " >22!"!"2OCONFIG HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I$ $!A! @$  HDDHHH $DI$D! BDA"H ! @"H EP !$@$@!B @ BH@$@ @ @@ DA@B ($I  **   @DI$ $ A  6: * "!" * *6* *DM*"!CY* *"* ^#V#{*^#V r+sY: *!^#V#* €*oN#6ʳ>* DM q#p}o|g:*.T6*A***6 #F+N~$N0# 0 0*. x~# 6 xA&Q~#$O0QA; 7!͔Q Try again in hex. $a! 0 O)))) Ø !N# 6 ~w+ `{_ Gs after carriage return (0-255 Dec) ? $2* s&KDoes printer use handshaking (Y/N) ? $;* Y}6sKEtx/ack or Xon/xoff (E or X) ? $;E6ʹX6=&KSame ports for handshaking (Y/N) ? $;Y! s&KHandshake input status port (Hex) ? $a* s! KHandshake data input port (Hex) ? $a<* s_ &KPrinter ready (LPT: device). $&KModify initialization string (Y/N) ? $;Y͝ KExit with alone.$&* KEnter hex byte: $a$ { ڝ* s* +~; { ڝ#6*q#p&KInitialization string OK (Y/N) ? $;Y! KString too long. Redo.$7: 7?:8L7?KTerm #8 "L" not patched.$7KStatus mask byte for ANI (Hex) ? $a * s * sKHardware active High, Low or Mixed?$KInput hardware sense (H L or M) ? $;HMs L5 KActive HIGH sense bits = 1, LOW = 0.$KHardware sense byte for XRI (Hex) ? $aڛ * ~! &KIOBYT at USER AREA+1DH is Hex.Y, Qume, Centronics, External or None? Enter (T Q C E or N). $;!f TQCEN _ { &KAutomatic paging (Y/N) ? $;N Yo ~wKPage size (0-255 Dec) ? $ڣ #s<Xt~0W  \>>>>> xxÄyyÍ8ͭy:>ɯò9?G}h:2!"!"!"":"`i"O! "~y"w6:*2[>>7>>7>@!>Fp,;$;>A>0>`> 2468:@BDFHNPRTV^`bdfprtvx?DYoÑ1X'2d8:>:2>2O!~y'  X:2::/2M:!~wXw:y Ø!~Mô:>Ò:Я>@>>':G¬>ñ>y! 6 4:6: ͒:Gy   %,4?BGLQV\dh>>>>@>>7 @@CBCBC/>$@@> >>> R>P>P| "%(+17=HLRWagj')+-/579;=CEGIKSUWY[cegik1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH á 4êü /L9ASMPRNHEX Want to change the IOBYT (Y/N) ? $;YKInput new initial IOBYT in (Hex) ? $a0 * s{2&KPrinter on Left, Right, or Parallel port (L R or P) ? $;! PR@Ll _ &KHorizon device assignments set by IOBYT are: Left serial = 0, Right = 1, Parallel = 2, User = 3$ &KSol devices are: Internal keyboard and screen = 0, Serial = 1, Parallel = 2, User pseudoport = 3. $KPrinter on (1,2,3 or 0=none). $;! 1@230å _ &KPrinter TT>*DM*::2:"*~6*:Q:Q:Q"`i"Ap: ksy2*DM*yɯ "%(+.4=EORW]`eimty <  .<JXhzÊO:͌:͌z:͌X:͌:͌:͌_^#V>>>ʱʽ>0yy> y x͒ >'y2 !$(,/37<GNY_bemp $,7:{Pù:2 * ":O͹:*~Oy/2>!~6 ''6y w! u uXf~A`4>w5w> > y6A:=:ʐ=ʘÔyÓy*ʜ~0wy!+|±y>>@2 *~0wy>A`\#1?M?1]p:mzzz:m:m:m!:m_^#V/>zʆɯ/>͒ʞyɯ/>ͨʴyɯ/>;ʹ :Gʹ ͨ:G>;J:[>2[!:!ZyA~A656ʹ2[>2[>2Z:2O!>!y ƒ~y~=é ʝ~<©~¨  wyô!"tw}!)ͼ !ͼ :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:  :6y@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! ~*!) " {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/!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ :! 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*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ:  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkz'{ͅ>ɯ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~ ͅ:|: |Ë  |*" ͩ !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*| } 8O;#( COPY Version 5.5 (C) 1981 Lifeboat Associates.$1Q2!" " 8P81Qͼ_ sͻ_1Q:Vʁu= Insert disk in and to verify. - $L _= Verify in progress - Press ESC to abort. Each * is one track verified.$= Verify complete. $:L=NO errors were detected.$_=Errors detected. +++ ERRORS +++$_= Insert disk in and to format. - $L _= Format in progress - Press ESC to abort. Each * is one track formatted and CR> = Run again with same parameters.$= "A" = Copy ALL tracks. This option also FORMATS a new disk. "M" = Copy MOST until empty (0E5H) track. "V" = VERIFY the disk by reading all data. "E" = EXIT and return to CP/M. Enter your selection from option table. - $L!2!f.ArMrVrEw= Illegal selection. Try again.$>"*}ʃ:w= Insert CP/M disk in A, then press . - $L:V6= Enter VERIFY drive name: (A B C or D) or doe:O: :O   %(:}7 2:=2* }/_|/W*"!4* *"Ϳ :V !5G 2:=2* }/_|/W*"!4* *":<2!5 *" !Q"Ϳ * "  7͉!5‡ :G:O : y=*$:N M : * DM!Q~ # x >*.* :G!R$ |7 y2!Q>w\ /w\ # xG = ABORTING due to memory failure in buffer. Insert CP/M system disk and press . - $Lw͉> 2 ͉ 2  * MD*!Q :>V # y Ͱ>2lyPLnR>UX:l̅2l͓*>E2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 Ľ 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 >Nverified. $= Verify complete. $:N=NO errors were detected.$_=Errors detected. +++ ERRORS +++$_= Insert SOURCE in , DESTINATION in and then press to copy the disk or any other key to reset options. - $L _= Copy in progress - Press ESC to abort. Each * is a track copied and verified. $= Copy complete. $:•=NO errors were detected.$_=Errors detected. +++ ERRORS +++$_= ****** O P T I O N T A B L E ******$:&= A2A= Enter SOURCE drive name: (A B C or D)$= or makes default copy from A to B. - $L 2A6= Enter DESTINATION drive: (A B C or D). - $L2AҦ>A2<2ɯ2!:V~2!:F~22:A2͠" " ͛  2:2= $͉:Fl!R$":A2) ͉:Vʐ:A2!~6!R$":A2i !w:E:O:ʰ:O:2:2   ^#V2:GxGx2!: (: !ɯ:_::7= ***** Select error *****$ _= ***** Error *****$_>2)$L!yw = Compare$Ü = Read$Ü = Write$= error at $ : = $>2͉= on Drive $:A-:! = Track $y! = - Sector $  2*+~>0 : @ʂ 5 { ͎  ~ ͓ :*w:*w*.f%.~2": :A 2 :A ! = ERROR - Density mismatch.$wO *.~ *.:AO ~2 = Source disk is $!> : ʻ : @ʘ :A2ͭ b :A2ͭ ژ = ERROR - Drive set single sided. Use SETCPM.$>:G: @ʧ xG!pO *.~ µ =single density.$=double density, single sided.$=double density, double sided.$ #0w+>06 6/4%#͉_ ~#$-=w !wN# 6 ~mw+ b`{_ single sided. :žè= Console ESCAPE has aborted the copy.$_  !* ::=M N:À# FORMAT ver 2.6 for CP/M2 on North Star. (C) 1981 Lifeboat Associates.$͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y$O?$(?$(Q?$(?$(+?$(W?$?$1 }cE!1]ͪ>͝E* –!:V@!#1  RUN again, EXIT or NEW parameters (R E or *E.~   Drive allows single sided operation only.$7?!V>w!z:V!Y!!:V@!p!! Press to format $SINGLE $DOUBLE $density, $sided in drive or "E" to EXIT, "N" for NEW parameters. $:VO!#~#^#VZyͅ> 0@:GO,>2H:G ¹!IN:W=!HFҀGy@O!>  *$!H4:V@:ʪ=:GO/,:H!  - Cant write disk.$:H!  - Cant read disk.(C) COPYRIGHT 1978, MICRO COM INC. Lifeboat Associates Single Drive File Mover Ver. 1.20$ Replace System Disk -- Press RETURN (ENTER on TRS-80)$ No File Name Specified -- Aborting$ Source Diskette In Drive, Press Return$ Destination Diskette In Drive, Press Return$ File by That Name Not Found$ Source File Read Error$ Destination File Write Error$ Good Transfer - Replace Disk, Press Return$  *%͔:] 22>2?*"A:2G=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ͷ! w###:!A~w !$'*-03-=w Disk copy for CP/M2 on North Star - SD and DQ.$ed. :žèTranslate table   !"#$%&'()*+,-./0123456789:;<=>?@ty, double sided.$ #0w+>06 6/4%#͉_ ~#$-=w !wN# 6 ~mw+ b`{_ single sided. :žè= Console ESCAPE has aborted the copy.$_  !* ::=M N:N). $͝E*NʖR:Vʖâ͐  Insert system disk and to reboot.$͝ *  Use on CP/M version 1.4 not allowed.$* Press "ESCAPE" at any time to ABORT. [ Side one now being formatted ]$[ Side two now being formatted ]$  Drive (A B C D or E for Exit) ? $͝E*2A2G2V*.f%"E.~2D:DSʥ  Single or Double DENSITY (S or D) ? $͝SʥDʥÖ{2V:V  Single or Double SIDED (S or D) ? $͝SDÖ{2V:GO $  Error on track $>> A6= :HзMM]x!6# xS!:Vn6 # xn!J ͅ~# x… !N# 6 ~;w+ ³`{_- Cant write dis  0w+~06 6/4#~$^͘#  $~#$_ :!.w####!$'*3M]FORMAT !>  *$!H4:V@:ʪ=:GO/,:H!  - Cant write disk.$:H!  - Cant read disk.:@2@!"C!:>2|H"E\ͽ*C#"CXG*C+"CM/2:@2@u*E*A}o|g:@2@:@\2h͸\<2:@2@!:>2|H"E\H2*C+"C}*Eñ\ͳ<H2:@g:|2>:h2?͔͙͞:G_é:?2h\ͮ<͔]*C+"C}*Eñ\ͳ<H2:@g Disk, Press Return$  *%͔:] 22>2?*"A:2G 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# z8O!B N#N ¾SP.* |} !9":q!"- Ͷ 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. ë «   Ͷ ͐ =« 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!~  )*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A" COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~1m!f6O!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 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  !  #! _^! ^#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_$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A" *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+"!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t -? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2"+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ - ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq:7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ڦ> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.!7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:! e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:":f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q*r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q*!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q*:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- : ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6 $:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq*FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PҘ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&og_{_z#W H = LIBX$$$$$$$LIB@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2(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.8$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$221@: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:> !/>: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#Wq=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2ABORTED$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 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*!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 * :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!*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>÷: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ͬ!\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 "}*}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  /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:[ *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ͯ -:>>!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: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͈*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͈*3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk SL!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!tatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠":2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V")*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)-:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W>9Sysgen Ver 3.0 Copyright (C) 1978, Digital Research Copyright (C) 1978, Lifeboat Associates Image size= ( Trks=  SPT= ( Skew table= !"#$ %&'(  Table extension space o&)))))))!6#" !5> *~#"`{__' $ *<***!*$d*':WO,! !"[>2X!"^!X4:w8!XN4>2Y:~!Y'4:X:Y_*^+~ڨ!Y^*^F+NDy*[DML2]:] ' on , then type RETURN $ CP/M image in RAM at 900H is ready to write or reboot and "SAVE CPMxx.COM"$ Destination drive NAME (or RETURN to reboot) $Place DESTINATION disk on , then type RETURN $Permanent ERROR - Type RETURN to ignore $Function complete$Invalid drive name (Use A B C or D) $No source file on disk$Source file incomplete$ SAVEUSER Version 2.9 (C) 1980 Lifeboat Associates $ĂySaves  sectors on track  starting BIOS+  Sector table: $%&'( For CP/M2 on double/quad North Star. Saves sector containing MODE BYTE plus 4 sectors of USER AREA.$1!!!8 ‚&:YO)*.*jDM/:O:FSO,5¯! ( User area patch to disk completed. $ Returning to CP/M. NO patch made.$ Disk write error. Returning to CP/M.$_*{ ~!4~$ w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W Hè<2]:Z\ Tʨ:~*["[Ñ> 2]1p":] ʜ\q to write patches onto disk or press any other key to not write. $!8 ‚&:YO)*.*jDM/:O:FSO,5¯! ( User area patch to disk completed. $ Returning to CP/M. NO patch made.$ Disk write error. Returning to CP/M.$_*{ ~!4~$a8^   SETCPM for Lifeboat CP/M2 on North Star Vers 2.5 (C) 1981 Michael Dubno, NYC >>2S!9"T1͎ͧS1͈͒*.|2 2 2 2 2 2  }*."N.f."P+.~2RSD>D2R! :RD͊ ͐ ͊ ͐ ͓ ͖ ‹!D:RS*7͊ ͐ ͊ $͐ ͓ ͖ ‹!|:RSbo͊ ͐ ͊ %͐ ͓ ͖ ‹͋  Could not read disk. $͋  Could not write disk. $͋ :S Error - Rebooting. $:͋ :ges A Change AUTO command D Change number of DRIVES in system I Change INTERRUPT enable status P Change PRINTER assignment on Horizon R Change READ AFTER WRITE status S Change SPEED & SIDES of the drives E EXIT this program Select option: [ Q,A,D,I,P,R,S,E ]: $͋ :S*T͋ d͋ {͋ !:RS͓ ͙ ­!:RS*7͓ ͙ ­!:RSbo͓ ͙ ­*P%.~2*P!K :*P.w2 0 ͋ ͚ !* ! ^LR@P~?w: ͋ ͞ System not configured for Horizon. Press . $m͋ ͚ UfMZQG m   Ë $͞ ɯ  ! N# 6 ~Ϳ w+ ´ `{_ɀ : GK >2!~w:H0 ͋ ͚ !* ! ^LR@P~?w: ͋ ͞ System not con ~#L e =zWW ~>} =zWo zwyzw!$'* Change number of DRIVES in the system ------------------------------------- Options available:]: $ Number of sides:[ 1,2,(CR) ]:$ Drive speed :[ F,S,(CR) ]:$ Change AUTO command line routine ----------------------------------- N Enter a new AUTO command Z Have no AUTO command (Disk update required for above) 0 Not active 1 Active only COLD boot 2 Active only WARM boot 3 Active both WARM & COLD boot (CR) Exit to main menu Option letter:[ N,Z,0,1,2,3,(CR) ]: $ Enter new AUTO command : $ Change status of READ AFTER W R RIGHT serial port P PARALLEL port (CR) Exit to main menu Option letter:[ L,R,P,(CR) ]: $ EXIT this program and return to CP/M ------------------------------------ U UPDATE disk and running CP/M M Change CP/M in MEMORY only Q QUIT with no changes (CR) Exit to main menu Option letter:[ U,M,Q,(CR) ]: $ UPDATE the disk with the changes made ------------------------------------- Writing to disk...$ Changes have been written to disk. $ Change CP/M o&6$͋ 6͋ ͋ !>U N͋ !>U E͋ g͋ g>U a͋ g͋ !>U ʖ:ʊʊ͋ ͋ Ü͋ ͋ !>U ʸ8͋ þ4͋ <͋ !>U 8͋ 4͋ :H S͋ :c@u͋ :RS͑ ͑ ͋ >V>V>V>V͑ ͋ >o>o>o>o͑ ͑ !U h(͋ ͋ !U ʁ@͋ 4͋ ͋ ͚ QGDSʔAʒIeR6PEm ----- O P T I O N S M E N U ----- Q QUIT with no chan͋ ͚ 15& >2!>m 02!>m ͋ ͚ YONZ 6!>m !>m ͋ ͚ Y~Nʉ e!>m !>m :RS͋ ͞ Not implemented in single density. Press . $ ͋ ͚ AB CD# ”>2L>2M->2L>2M->2L>2M->2L>2M ͋ ͚ 1H2V -a!:Lm a!:Lm $ ͋ ͚ SzFʆ a!:Mm !:Mm D ͋ ͚ NʿZ0123 ’͋ ͞ ! : GK >2!~w:H 1 Set 1 physical drive - logical A B C D 2 Set 2 physical drives - logical A B 3 Set 3 physical drives - logical A B C 4 Set 4 physical drives - logical A B C D (CR) Exit to main menu Option letter:[ 1,2,3,4,(CR) ]: $ Change SPEED/SIDES of drives routine ------------------------------------ Options available: A Set drive A B Set drive B C Set drive C D Set drive D (CR) Exit to main menu Option letter:[ A,B,C,D,(CR) RITE ------------------------------------ Y Set the READ AFTER WRITE on N Set the READ AFTER WRITE off (CR) Exit to main menu Option letter:[ Y,N,(CR) ]: $ Change INTERRUPT status after access ------------------------------------ Y Enable interrupts after access N Disable interrupts after access (CR) Exit to main menu Option letter:[ Y,N,(CR) ]: $ Change PRINTER assignment on Horizon ------------------------------------ L LEFT serial port running in MEMORY only $ QUIT with no update of disk $ SETCPM v2.2 for Lifeboat CP/M2 on North Star (c) 1981 M. Dubno Auto message : "$" $Activate on : $+COLD boot $WARM$ boot $No boot set $ Single drive$ TWO $ THREE $ FOUR $drives$ Interrupt enable : $No $Yes$ON $OFF$ Read after write : $ Printer on : $Left serial port$Right serial port$Parallel port $ Drive A Drive B Drive C Drive D ======= ======= ======= ======= Speed: $ Sides: $-FAST- $ slow $-TWO- $ one $e : $ Printer on : $Left serial port$Right serial port$Parallel port $ Drive A Drive B Drive C Drive D ======= ======= ======= ======= Speed: $ Sides: $-FAST- $ slow $-TWO- $ one $e : $ Printer on : $Left serial port$Right serial port$Parallel port $ Drive A Drive B Drive C Drive D ======= ======= ======= ===== 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\:=-!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vv ~_{ozg001 $$$$ SUB6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧW Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$:y*###ƒ# yk   җ 4!~=ŐW!xʵ ~#èbx {~#o}où.xsubb!np+q*m2_!pp+q*o ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7***x*́͋<͛ :%*=26͋!7^#6 #6 #6$ 8*7~O #w# !6:6=!9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> e ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FILE PRESENT ON DISK$!Y , <    *$A!6 # T!w $r# *`: 0 *A*! ~ ʰxkb))))_y‘BK{ͅ*!66!"80*{#z+++ #l port$Parallel port $ Drive A Drive B Drive C Drive D ======= ======= ======= ======= Speed: $ Sides: $-FAST- $ slow $-TWO- $ one $e : $ Printer on : $Left serial port$Right serial port$Parallel port $ Drive A Drive B Drive C Drive D ======= ======= ======= =====ͧ!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>}|ͧ2% ͋*-"*$$$ SUBq:(=2(N *$*& w*$#"$*&#"&' !"N*M^7 !)6:!)ھ *N*DM͆ 2*ʭ :*ʗ ͯ *N"P*6:2)÷ *N"N!) $@BA$! A "!$"" ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7***x*́͋<͛ :%*=26͋!7^#6 #6 #6$ 8*7~O #w# !6:6=; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;TYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN READF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHEA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FILE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR JMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ; HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALLTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP ; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,BRKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED MVI C,TYPEF MOV E,A CALL BDOS POP B! POP D! POP H; RESTORED RET ; CRLF: MVI A,CR CALL PCHAR MVI A,LF CALL PC ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH CARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISION INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END +GGW +GU!ͩ>̀+! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$VI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;IC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NAME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FCBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCB LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK AR LINE POSITION JC FINIS ;CARRY SET BY GNB IF END FILE MOV B,A ; PRINT HEX VALUES ; CHECK FOR LINE FOLD MOV A,L ANI 0FH ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARACTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;TO NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE HAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRC RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0 SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;i MEMR Rasmussen Memory Test - Version 2.2 Copyright (C) 1980 Lifeboat Associates1>2,7Dz 17!:MʥRAͭ? É"A͇A͙c*.:TxP"{! ! G"! D**#GX2""7V :PxW:=2ŸD>2͟ **ͣp#Gұ**~`#G:T?*!*!~/wGNx/wy`#7&|G:&|2A|(###*GT]w+:P+# Trap at 6#s#r*>z  ͞_z ʾ͞͵0  `{_pg"p*o_{_01͖ AAO͖ |}z( 10OÖ  ͖  Ö  Ö #|7{z!$aF~/wNpS% BIOS located at Top of memory at Press ESC or SPACE key to interrupt test or CONTROL C to reboot CP/M at any time. Response of "CR" gives det Random number test - Cycle: M1 cycle test - 4K block: Test series completeLOCATION SHOULD BE WAS  7ʍ O͖ Ͱ  ʬ  ii 1 :2 2 2 ding address below start Input error - Retype 4 hex digits Fast complement test from 0 to Bit stuck high or low test Adjacent bits shorted test Checkerboard pattern test Walking bit left test Walking bit right test Address line tesMEMR.DOC - INFORMATION ABOUT THIS MEMORY TEST The MEMR Rasmussen memory test has been developed at Lifeboat Associates so that our customers may easily check their memory system. We recommend frequent testing of new memory boards until they are burned in, which takes a couple of months, and occasional checkups after that. The program performs a battery of tests to test memory under a variety of conditions. If a test fails in any given memory location, that location will be displayed on the unexplained problems with your computer such as program crashing, try this test. It may detect a memory problem which can then be dealt with, and if not, proably eliminates memory as a source. This memory test will use default addresses if the starting and ending address questions are answered with a "CR". It can be interrupted by pressing the console ESC (escape) key. The forms of the test are: MEMR Gives complete battery of tests MEMR T Above plus display of memory top and quick coG>GͮͺaͮͺͮͺͮͺURRͣp#Ggx/w#GUͣ~`#Gx/G~`x/G#GjͮxGxG¢ͣxGw#GҲͣxG~`#GͣxGw#GͣxG~`#GUͮx2ͣ/w#ͽ* z&{:G/w#G?ͽ)DM 1\A͖ >9I*"͉ͣp#Ge*"͉ͣ~`#Gy*}Gog"" ê>Më2C!8[!([+![*|/2 o:##`:G{`:Gz`:M fault test range which starts above this program and ends at BIOS. "CR" to continue test - "ESC", "SP" or "^C" to stop Starting address (Hex or "CR") Re-enter, starting address must be at least Ending address (Hex or "CR") Re-enter, ending address below start Input error - Retype 4 hex digits Fast complement test from 0 to Bit stuck high or low test Adjacent bits shorted test Checkerboard pattern test Walking bit left test Walking bit right test Address line tesconsole along with the byte that should have been in memory and the actual value in both HEX and binary bits. This may be a further aid to find out what is wrong. If multiple errors are reported, the test will display a screen full of error reports, one to a line, and then wait for you to press a key to continue. Until the screen if full of error reports, the test will continuously cycle. There is one test that MEMR can't do however, and that is performance under daily use. If you seem to have mplement test of all RAM. MEMR R Random number test only. MEMR M M1 cycle test only displays each address Eg. Type "MEMR T" followed by carrige return for random test. This test is designed to display the most common problems first and most uncommon ones last. For example, you may test for gross defects by simply typing "MEMR T" which will start out with the quick test of all memory. The test will continue over and over until the you terminate by pressing the ESC key. Generally memory chip failures will be found within 5 seconds. The test takes several minutes to run all phases in a 32k board. To completely test for all address open and short combinations, the test should be run over a 4K boundry. Then run the test over the full range. There are some subtle things that get missed if you only run the test over the full range and not 4K at a time. If the memory board passes these tests and will run for an hour on the random numbers test without a problem, look elsewhere fomplemented and restores original byte. This is the only test that can test where MEMR runs in the TPA (from 0 to approx 800H) and the BIOS area which contains the console drivers. BIT STUCK TEST: 1. Fills test area with 0FFH and checks for 0FFH. 2. Then fills test area with 0's and tests for 0's. 3. Then re-fills with 0FFH and tests just in case the bit was originally high in (1.). ADJACENT BIT SHORTED TEST: Sets a single bit in all bytes high. Then checks if a bit is shorted to the ones rocedure is repeated rotating the opposite way. This is a very severe test that frequently detects errors that other tests in the battery do not. Don't be surprised if the walking bit "right" test detects errors that "left" doesn't, or vice versa. Sometimes memory developes strange pattern sensitive errors that are most difficult to find. ADDRESS LINE SHORTED TEST: This test will detect addressing problems in memory boards. It fills all memory with 55H, then writes an 0AAH at the lowest memory all test memory. It then re-inserts the same seed to the routine and test reads the memory. A new seed is generated and the exercise is repeated with a new pattern. This test goes thru 8 cycles each time the battery is run. If "MEMR R" is used, it cycles continuously until terminated with an ESC. M1 CYCLE TEST This tests the M1 cycle time for executing instructions which is different than the time to simply read memory in the Z-80. The times are the same in 8080 so the test is not especially cutes. If a memory failure causes the test to bomb, the last address displayed on the screen locates the failure address. Please note that the M1 test (only) uses restart locations 2 and 5 in its operation, and also inserts an error trap at restart location 7, which is the most likely landing place for a program gone wild. That is, a program gone haywire, jumping randomly all over memory, is likely at some point to land in a location that has no memory which will appear to contain the instructir your troubles. The following tests are performed and explained in detail below: 1. Fast complement test of all memory. 2. Bit stuck high or low test. 3. Adjacent bits shorted test. 4. Checkboard pattern test. 5. Walking bit left test. 6. Walking bit right test. 7. Address line test. 8. Random number test. 9. M1 cycle test. FAST COMPLEMENT TEST: This is a test of ALL MEMORY starting at 0 to top of RAM. It loads each byte and tries to store the complement. Tests if properly coon each side. The test repeats 8 times, rotating the test bit from LSB to MSB. CHECKERBOARD TEST: Fill memory with 0AAH, 55H pattern and check. This forms an alternating "checkerboard". Then reverse the pattern and re-check. WALKING BIT TEST: Fill memory with one bit set for each byte. The bit rotates at memory increases. For example, byte 1 has bit 1 set, byte 2 bit 2 etc. Then memory is checked for the proper pattern. This is repeated 8 times, rotating the bit each time. Then, the whole plocation tested. It then rechecks the rest of memory to see if it is still 55H. It then clears the original location of AAH and writes writes the AAH into the next location. Then does same with location 2,4,8,etc setting a new address bit high each time and testing all of memory. If any address bit is shorted to another, the test will find an 0AAH in another location than the place it wrote one. RANDOM NUMBER TEST: A random number routine generates an 8 bit number pattern and writes it through useful for them. A small segment of executing code "worms" its way thru memory, reporting the results of its execution at each memory location. Marginal memory may pass all the other tests but fail to execute properly at a given address. When this happens, the test normally reports the error location in the standard way. However, the faulty execution may cause the test to "bomb" at this point. By running the M1 test in the form "MEMR M", only this test will run, reporting each address as it exeon 0FFH, which is a restart 7, which causes the CPU to immediately jump to 38H, the restart 7 location. We mention this because, it your computer happens to use restarts 2, 5 or 7 for critical operations, this test may not run. That's why it is last. CUSTOMIZATION NOTES: This test is designed to use the CP/M BIOS console input/output drivers. This means that the BIOS area itself may not be tested. If you have a prom monitor or wish to write your own I/O routines, this test may be modified to use them. You will find a jump table at the start of MEMR which contains jumps to routines that perform the functions of return to monitor, console status, input and output. The console routines use the CP/M conventions. That is for example, console output is considered to be from the C register, etc. The portion of the table that may be patched is as follows. ORG 100H BEGINNING OF TPA JMP START STARTS MEMR, DONT CHANGE THIS ONE. JMP CINIT INITIALIZE CONSOLE OR WHATEVER. JMP MONITt, etc. FINAL AUTHORS NOTE Good luck with your use of Lifeboat's memory test. If you find any strange bugs or think of other tests that might be usefully added to the battery, please contact me. September 5, 1980 Larry Alkoff ess so MEMR doesn't scramble your routines. MONITOR is normally a CP/M warm boot but could be a jump to your monitor, cold boo;HORUSER.ASM MAR 2, 1981 ;This USER AREA is for a Horizon computer ;as used in a 24K Lifeboat CP/M2 on North Star. ;It may be used as a prototype for modification. ;Change MSIZE to the memory size desired. MSIZE EQU 24 ;Distribution system ;The following equates are automatically changed by MSIZE. BIOS EQU 5300H+(MSIZE-24)*1024 CCP EQU BIOS-1600H BDOS EQU CCP+800H USER EQU BIOS+700H ;For double/quad density ;;USER EQU BIOS+500H ;For single density OFFSET EQU 2000H-BIOS ;To overlayYT value DB 0,0,0 ;Reserved ;YOU MAY MAKE ANY CHANGES DESIRED FROM THIS POINT ON. ;KEEP THE TOTAL USER AREA UNDER 512 BYTES. ;LOGICAL I/O ROUTINES ;Each logical I/O routine loads the IOBYT at address 3, ;rotates the proper two bit field into bits 0 and 1, ;and calls the DSPCH routine which selects one ;of the four physical drivers from the table following ;depending on the value of bits 0 and 1. ;The HLIST routine has been fully commented to aid you. HCONST: ;Select console status er. LDA IOBYT ;Load IOBYT from address 4. RLC ;Rotate LIST selection bits RLC ;into bit position 0 and 1. CALL DSPCH ;Call dispatcher. ;The dispatcher selects a routine from the table ;following depending on the value of bits 0-1. ;The selected routine will return to the caller. DW COUT0 ;00B = Left serial DW COUT1 ;01B = Right serial DW COUT2 ;10B = Parallel port DW COUT2 ;11B = Parellel port HPUNCH: ;Select as PUNCH driver. LDA IOBYT RRC RRC RRC RRC CALL DSOR CONTROL C EXIT COMES HERE. JMP CONST CONSOLE STATUS 0FFH=READY, 0=NOT. JMP CONIN CONSOLE INPUT TO A. JMP CONOUT CONSOLE OUTPUT FROM C. DW TFIRST FIRST BYTE TESTED. If you wish to simply add on your I/O routines to the end of this program, start your patches at TFIRST and modify TFIRST to be wherever your patches end. This will change the default starting address so MEMR doesn't scramble your routines. MONITOR is normally a CP/M warm boot but could be a jump to your monitor, cold boo SYSGEN IMAGE IOBYT EQU 3 ;Storage location ORG USER ;Origin of this program ;THE JUMP TABLE FOLLOWING MUST BE PRESENT AND ;THE SEQUENCE OF JUMPS MAY NOT BE CHANGED JMP HCINIT ;Initialize I/O ports JMP HWINIT ;Warm boot init JMP HCONST ;Console status JMP HCONIN ;Console input JMP HCONOUT ;Console output JMP HLIST ;Printer output JMP HPUNCH ;Punch output JMP HREADER ;Reader input JMP HLISTST ;Printer status DW HORLEN ;Length of USER AREA HORIOB: DB 0 ;Initial IOBroutine. LDA IOBYT CALL DSPCH DW CINST0 ;Left serial DW CINST1 ;Right serial DW HLISTST ;Batch mode DW CINST2 ;Parallel port HCONIN: ;Select console input routine. LDA IOBYT CALL DSPCH DW CIN0 ;Left serial DW CIN1 ;Right serial DW HREADER ;Batch mode DW CIN2 ;Parallel port HCONOUT: ;Select console output routine. LDA IOBYT CALL DSPCH DW COUT0 ;Left serial DW COUT1 ;Right serial DW HLIST ;Batch mode DW COUT2 ;Parallel port HLIST: ;Select a list drivPCH DW COUT0 DW COUT1 DW COUT2 DW COUT2 HREADER: ;Select a READER driver. LDA IOBYT RRC RRC CALL DSPCH DW CIN0 DW CIN1 DW CIN2 DW CIN2 HLISTST: ;List status not implemented. XRA A RET DSPCH: ;Select routine from table of caller. ANI 3 ;Mask IOBYT and RLC ;mult times 2. MOV E,A ;Put index into MVI D,0 ;DE register. POP H ;Get addr of table DAD D ;and add index. MOV E,M ;Get addr of routine INX H ;into MOV D,M ;DE first, XCHG ;then put into HL PCHL ;and transfer control. ;PHYSICAL STATUS ROUTINES CINST0: ;Left serial port status. IN 3 ANI 2 RZ ;No key MVI A,0FFH RET ;Char ready CINST1: ;Right serial port status. IN 5 ANI 2 RZ ;No key MVI A,0FFH RET ;Char ready CINST2: ;Parallel port status. IN 6 ANI 2 RZ MVI A,0FFH RET ;PHYSICAL INPUT ROUTINES CIN0: ;Left serial port input. IN 3 ANI 2 JZ CIN0 IN 2 ANI 7FH RET CIN1: ;Right serial port input. IN 5 ANI MVI A,20H ;Reset PO flag OUT 6 ;Output char MOV A,C ;Load accumulator TIN1: ORI 80H ;Set strobe false OUT 0 ;and send character XRI 80H ;Toggle strobe OUT 0 ;Output XRI 80H ;and toggle again OUT 0 ANI 7FH ;Mask to ASCII RET ;HORIZON HARDWARE INITIALIZATION HWINIT: ;Warm boot initialization. DB 0,0,0 ;May be patched RET HCINIT: ;Cold boot initialization. LDA HORIOB ;Get initial IOBYT STA IOBYT ;and store CALL HUINIT ;User init routine ;Init motnitialization. MVI A,40H ;Disarm parity logic OUT 0C0H LXI H,0 MVI A,0E0H ;Loop to set parity for first 56K of RAM. TINCP: MOV B,M ;Read byte MOV M,B ;Put back with parity set INR L ;Next memory location JNZ TINCP INR H ;Next 256 byte page CMP H ;up to 0E0H JNZ TINCP ;Enable parity logic on memory board. MVI A,41H OUT 0C0H ;Clear input buffers on serial ports. IN 2 IN 4 ;Init parallel port. MVI A,30H OUT 6 ;Reset parallel port PI flag MVI A,60H ;Code to s;USER AREA for CP/M2 on North Star ;Version 3.4 of Oct 7, 1980 ;Copyright (C) 1980 Lifeboat Associates ;This USER AREA is identical to that produced by ;CONFIG.COM Ver 3.x using configurations 0 thru 8. ;It may be used as is or as a prototype for ;your own drivers. Two pages (512 bytes) are ;available for your custom I/O routines. ;The USER AREA contains a standard CONSOLE driver ;and a PRINTER driver with a choice of handshaking. ;Handshaking may be ETX/ACK, XON/XOFF or NONE. ;Printer msole questions to ;install printer equates "9" thru "J" and init string "S". ;Change MSIZE to the desired CP/M memory size in K. MSIZE EQU 24 ;Distribution size ;The following equates are automatically changed by MSIZE. BIOS EQU 5300H+(MSIZE-24)*1024 CCP EQU BIOS-1600H BDOS EQU CCP+800H USER EQU BIOS+700H ;For double/quad density ;USER EQU BIOS+500H ;For single density OFFSET EQU 2000H-BIOS ;To overlay SYSGEN IMAGE IOBYT EQU 3 ;Storage location ;Hardware equates for Altair SIO (Rev 2 JZ CIN1 IN 4 ANI 7FH RET CIN2: ;Parallel port input. IN 6 ;Motherboard status ANI 2 JZ CIN2 IN 0 ;Read keyboard PUSH PSW ;Save char MVI A,30H OUT 6 ;Reset PI flag POP PSW ANI 7FH RET ;PHYSICAL OUTPUT ROUTINES COUT0: ;Left serial port output. IN 3 ANI 1 JZ COUT0 MOV A,C OUT 2 RET COUT1: ;Right serial port output. IN 5 ANI 1 JZ COUT1 MOV A,C OUT 4 RET COUT2: ;Parallel port output. IN 6 ;Motherboard status ANI 1 JZ COUT2 herboard and set up serial ports. XRA A OUT 6 OUT 6 OUT 6 OUT 6 ;Init left serial port (Standard console). MVI A,0CEH ;Set 2 stop bits OUT 3 ;to first serial port MVI A,37H ;CMMD: RTS ER RXF DTR TXEN OUT 3 ;to first port ;Init right serial port. MVI A,0CEH ;Set 2 stop bits OUT 5 ;to second serial port MVI A,37H ;Same command OUT 5 ;to second port ;0CEH sets 2 stop, 8 data bits, 16X clock, no parity. ;04EH sets 1 stop, 8 data bits, 16X clock, no parity. ;Parity iet PO flag OUT 6 MVI A,0DH ;Output a carriage return JMP TIN1 ;to parallel port ;SPECIAL INITIALIZATION FOR USER HUINIT: RET HORLEN EQU $-USER ;LENGTH yte page CMP H ;up to 0E0H JNZ TINCP ;Enable parity logic on memory board. MVI A,41H OUT 0C0H ;Clear input buffers on serial ports. IN 2 IN 4 ;Init parallel port. MVI A,30H OUT 6 ;Reset parallel port PI flag MVI A,60H ;Code to say send 0-256 nulls after carriage return. ;The PUNCH and READER routines go to the console. ;The specific console ports and initialization strings ;will depend on the terminal number selected. ;Terminals 0 thru 7 are for specific I/O boards. ;CONFIG terminal #8 will configure for non standard ;console ports when the values for equates "1" thru "8" ;are placed in the data table at 130H together with ;initialization string if needed at "S" and length at "L". ;Type "CONFIG P" and answer con Non-zero) with ;active LOW hardware as used in CONFIG.COM Terminal #2. ;Change to the appropriate values for your I/O hardware. ;See the instructions accompanying your I/O board for ;the correct ports, flags, initialization and driver code. ;Set hardware sense flags xxxFLG as follows: ; Active HIGH bits to 1, active LOW to 0. ; Usually xxxFLG = xxxMSK if active HIGH. ; xxxFLG = 0 if active LOW. ;Hardware equates for console input (TTY). TISPT EQU 0 ;"1" TTY input status port TDAMSK EQU 1 ;"2" Data available mask TDAFLG EQU 0 ;"3" Hardware sense active LOW TDIPT EQU 1 ;"4" TTY data input port ;Hardware equates for console output (TTY). TOSPT EQU 0 ;"5" TTY output status port TBEMSK EQU 80H ;"6" Tx buffer empty mask TBEFLG EQU 0 ;"7" Hardware sense active LOW TDOPT EQU 1 ;"8" TTY data output port ;Hardware equates for printer output (PTR). POSPT EQU 0 ;"9" PTR output status port PBEMSK EQU 80H ;"A" Tx buffer empty mask PBEFLG EQU 0 ;"B" Hardware sense active LOW PDOter says stop XON EQU 'Q'-40H ; Printer ready for data ;HAND is type of handshaking which can be 0FFH for NONE, ;6 (ACK) for ETX/ACK or 11H (XON) for XON/XOFF. HAND EQU 0FFH ;"H" Type of handshaking ;DEFIOB is initial IOBYT if used. ;80H sets printer to LPT: device, 0 sets to TTY:. ;STAT.COM can modify IOBYT in running CP/M. DEFIOB EQU 0 ;"I" Default IOBYT ;NULLS is number of nulls sent after carriage return ;to allow printer time to return to left margin. NULLS EQU 0 ;"J" Printer nulof USER AREA USRIOB: DB DEFIOB ;"I" Initial IOBYT HSTYPE: DB HAND ;"H" Handshaking type NULLOC: DB NULLS ;"J" Printer nulls DB 0,0,0 ;Reserved ;These routines use IOBYT to select CP/M CONSOLE and LIST. UCONST: ;Select CP/M CONSOLE status routine. LDA IOBYT CALL DEVSEL ;Select device from table. DW TTYIST ;TTY: DW TTYIST ;CRT: DW TTYIST ;BAT: DW PTRIST ;UC1: UCONIN: ;Select CP/M CONSOLE input routine. LDA IOBYT CALL DEVSEL ;Select device from table DW TTYIN ;TTY LDA IOBYT RLC ;Rotate LIST selection RLC ;bits to 0,1 CALL DEVSEL ;Select device from table. DW TTYOST ;TTY: DW TTYOST ;CRT: DW LPTST ;LPT: DW TTYOST ;UL1: DEVSEL: ;Select routine from table of caller. ANI 3 ;Mask IOBYT and RLC ;mult times 2. MOV E,A ;Put index into MVI D,0 ;DE register. POP H ;Get addr of table DAD D ;and add index. MOV E,M ;Get addr of routine INX H ;into MOV D,M ;DE first, XCHG ;then put into HL PCHL ;and transfer control.tus routine. ;Ret 0FFH if ready for output, 0 if not. XRA A IN TOSPT ;"5" Read status port CMA ;Adjust sense ANI TBEMSK ;"6" Mask status bits XRI TBEFLG ;"7" Hardware sense RZ ;Ready to output MVI A,0FFH ;Not ready RET TTYOUT: ;Console output char from register C. CALL TTYOST ;Ready to output? JZ TTYOUT ;Wait until not busy MOV A,C ;Char into accumulator OUT TDOPT ;"8" Output char RET ;Printer Physical Drivers PTROST: ;Printer output status routine. ;RePT EQU 1 ;"C" PTR data output port ;Hardware equates for printer handshaking (PTR input). ;Usually same ports as printer output with different MSK. PISPT EQU 0 ;"D" PTR input status port PDAMSK EQU 1 ;"E" Data available mask PDAFLG EQU 0 ;"F" Hardware sense active LOW PDIPT EQU 1 ;"G" PTR input data port ;Handshaking equates. ETX EQU 'C'-40H ; Send ETX after a buffer ACK EQU 'F'-40H ; and wait for printers ACK BUFLEN EQU 127 ; Buffer length for ETX/ACK XOFF EQU 'S'-40H ; Prinls ORG USER ;Start of USER AREA ;JUMP TABLE - Jumps MUST remain here in same order. CINIT JMP CINITR ;Cold boot init WINIT JMP WINITR ;Warm boot init CONST JMP UCONST ;Console status CONIN JMP UCONIN ;Console input CONOUT JMP UCONOUT ;Console output LIST JMP ULIST ;Printer output PUNCH JMP UCONOUT ;Punch output to console READER JMP UCONIN ;Reader input to console LISTST JMP ULISTST ;Printer status ;This 8 byte data area used externally MUST remain. LENUA: DW USRLEN ;Length : DW TTYIN ;CRT: DW TTYIN ;BAT: DW PTRIN ;UC1: UCONOUT: ;Select CP/M CONSOLE output routine. LDA IOBYT CALL DEVSEL ;Select device from table DW TTYOUT ;TTY: DW TTYOUT ;CRT: DW TTYOUT ;BAT: DW PTROUT ;UC1: ULIST: ;Select CP/M LIST output routine. LDA IOBYT RLC ;Rotate LIST selection RLC ;bits to 0,1 CALL DEVSEL ;Select device from table. DW TTYOUT ;TTY: DW TTYOUT ;CRT: DW LPTOUT ;LPT: DW TTYOUT ;UL1: ULISTST: ;Select CP/M LIST status routine. ;Console Physical Drivers TTYIST: ;Console input status routine. ;Return 0FFH if char ready, 0 if not. XRA A IN TISPT ;"1" Read status port CMA ;Adjust sense ANI TDAMSK ;"2" Mask status bits XRI TDAFLG ;"3" Hardware sense RZ ;No key was pressed MVI A,0FFH ;Char is ready RET TTYIN: ;Console input char to register A. CALL TTYIST ;Is char ready? JZ TTYIN ;Not yet XRA A IN TDIPT ;"4" Read data port ANI 7FH ;Strip parity RET TTYOST: ;Console output staturn 0FFH if ready, 0 if busy. XRA A IN POSPT ;"9" Read status port CMA ;Adjust sense ANI PBEMSK ;"A" Mask status bits XRI PBEFLG ;"B" Hardware sense RZ ;Printer busy MVI A,0FFH ;Ready to print RET PTROUT: ;Printer output char from register C. CALL PTROST ;Ready to print? JZ PTROUT ;Wait until not busy MOV A,C ;Char into accumulator OUT PDOPT ;"C" Output char RET PTRIST: ;Printer input (ack) status. ;Return 0FFH if ready, 0 if busy. XRA A IN PISPT ;"D" Read status port CMA ;Adjust sense ANI PDAMSK ;"E" Mask status bits XRI PDAFLG ;"F" Hardware sense RZ ;No char avail MVI A,0FFH ;Ready to get ack RET PTRIN: ;Printer input ack char to register A. CALL PTRIST ;Is char ready? JZ PTRIN ;Not yet XRA A IN PDIPT ;"G" Read data port ANI 7FH ;Strip parity RET NULLOUT: ;Null handler for printer output. CALL PTROUT ;Print the char. CPI 0DH ;Was it a CR? RNZ ;Finished if not. LDA NULLOC ;Get nr of nulls to send B,A ;Save type. CPI ACK ;ETX/ACK? JZ PROTO ;Yes, on to handler CPI XON ;XON/XOFF? MVI A,0FFH ;No handshaking in use RNZ ;and hardware is ready. PROTO: ;Mark ready if ACK rvcd when ETX/ACK in use ;or respond to XON/XOFF. CALL PTRIST ;Is hs char ready? CNZ PTRIN ;Yes, get it. CMP B ;Proper go ahead char? JZ READY ;Yes, must be ACK or XON. CPI XOFF ;XOFF rcvd? JNZ NLEGAL ;No, ignore char. INR B ;Make XON INR B ;into XOFF to make sure CMP B ;XON/OFF in use. JZCNT MOV A,C ;Was last char CPI 1BH ;an ESCAPE? JNZ ETXOUT ;No MOV A,M ;Get ETX count CPI 4 ;If over 3 left JNC ETXOUT ;process normally. MVI M,3 ;Send 3 char before ETX. ETXOUT: ;Count down until BUFLEN characters sent, ;then send ETX and wait for printers ACK. DCR M ;Count down but RNZ ;do nothing until 0 MVI M,BUFLEN ;Then reset count MVI C,ETX ;and send ETX CALL PTROUT ;to printer. BUSY: XRA A ;Mark busy STA LPTFLG ;at software flag RET ;and ret Z setch room ;Initialization string for terminal #8 ;of length "L" begins at "S" below. STRING: ;"S" RET STRLEN EQU $-STRING ;"L" USRLEN EQU $-CINIT ;Length of USER AREA ot goes ;here if needed. Make sure it ends with a RET. MVI A,0FFH ;Mark printer ready STA LPTFLG ;at software flag. MVI A,BUFLEN ;Initialize STA BUFCNT ;buffer count. LDA USRIOB ;Load initial IOBYT STA IOBYT ;and store. DB 0,0,0 ;Pat; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; ; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; diskdef parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logical disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,..., MOV B,A ;into B reg to count. ORA A ;We are finished RZ ;if NULLS = 0. MVI C,0 ;This is a null. NLOOP: CALL PTROUT ;Print a null, DCR B ;decrement count JNZ NLOOP ;and loop until 0. MVI C,0DH ;Restore CR to C. RET ;LPT logical printer driver does handshaking ;and calls PTR physical drivers. Reg C preserved. LPTST: ;LPT logical status routine. ;Return 0FFH if ready, 0 if busy. CALL PTROST ;Is hardware busy? RZ ;Yes LDA HSTYPE ;Should be 0FFH, ACK or XON MOV BUSY ;XOFF properly rcvd. NLEGAL: LDA LPTFLG ;Not legal hs char so ORA A ;return with prev status. RET READY: MVI A,0FFH ;Mark ready STA LPTFLG ;at software flag ORA A ;and return NZ. RET LPTOUT: ;LPT output routine from register C. CALL LPTST ;Get status JZ LPTOUT ;Wait until ready CALL NULLOUT ;Then print char LDA HSTYPE ;Load protocol type CPI ACK ;Using ETX/ACK? RNZ ;No, exit. ;Process ETX/ACK protocol here. ;Check for ESCAPE sequence first. LXI H,BUF. ;Handshaking variables BUFCNT: DS 1 ;ETX/ACK buffer count. LPTFLG: DS 1 ;LPT status flag. ;Ready=0FFH, Busy=0 WINITR: ;Any warm boot initialization goes here. DB 0,0,0 ;Patch room RET CINITR: ;Hardware initialization on cold boot goes ;here if needed. Make sure it ends with a RET. MVI A,0FFH ;Mark printer ready STA LPTFLG ;at software flag. MVI A,BUFLEN ;Initialize STA BUFCNT ;buffer count. LDA USRIOB ;Load initial IOBYT STA IOBYT ;and store. DB 0,0,0 ;Patn-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 0,1,...,n-1 ; fsc is the first sector number (usually 0 or 1) ; lsc is the last sector number on a track ; skf is optional "skew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (word) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of tracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defines disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is defined by ; disks 4 ; diskdef 0,1,26,6,1024,243,64,64,2 ; dsk set 0 ; rept 3 ; dsk set dsk+1 ; diskdef %dsk,0 ; endm ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the biotors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dn dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;; u als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocation vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate the block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fi > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; now generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries per block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks elte the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endifs, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a large disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,0000h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc vecproduces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variable for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif gcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set statements for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eqlls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not found yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkval set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks)se dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb %blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate table, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; genera nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm enddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; ͯ Un:_::9OY#9.3ͳ.:2 ͳ 6b&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm eREAD-ME file for CP/M2 on North Star Last updated: July 22, 1981 Current CP/M2 version is 2.23a DQ - Jul 22, 1981 This file contains up to date information that is not yet in the User's Notes. It should always be read immediately whenever your CP/M is updated. The meaning of a version number such as x.xyz is as follows. The first two digits "x.x" are the Digital Research version. The "y" is the Lifeboat release number, with optional "z" being a minor patch in same. "DQ" means double/quad change it accordingly. Also make sure the equates in your file for BIOS and USER are the same as the file on this disk. The information below reflects various version changes. (9/29/79) Version 2.00 This is the first release of CP/M2 on North Star. (11/24/79) Version 2.01 allows 4 logical drives to be used with a single physical drive. (12/28/79) Version 2.011 corrects possible stack overflow when using PIP. (5/8/80) Version 2.20 This version is the first Lifeboat issue of Digital cally for a Horizon which will boot up directly upon inserting the disk and pressing RESET on the computer. The USER AREA will be exactly as produced by HORUSER.ASM which is on this disk. MOVCPM.COM will further ask if your PRINTER is connected to the left serial, right serial or parallel port and will change the IOBYT accordingly (HORIOB in HORUSER.ASM) such that the printer is ready to go upon boot up. Typing a control P will echo all console characters to the printer. In the Horizon confi takes input from the currently assigned reader and outputs to the currently assigned list device. If you have answered NO to the Horizon question, CONFIG.COM MUST be on your disk, properly patched for your terminal number, when doing the first cold boot. You may patch CONFIG by using the GOCPM procedure in the USERS NOTES. (11/13/80) Version 2.21A This corrects a minor bug in ver 2.21 when a single drive system is being used. MODE BYTE bit 7 set to 1 will now give correct prompts to insert and "SD" means single density. The files USER.ASM and HORUSER.ASM on this disk are the same as produced by CONFIG.COM version 4.x, except for some minor differences in initialization. These are similiar to previous CP/M version 1.4 USER AREA's with the exception that an extra jump for initialization on warm boots has been added. This has the effect of moving all JMP's in the jump table, except for the first (cold init), down one. If you are using an old USER.ASM file which you have modified, Research's CP/M version 2.2. A new utility SETDRIVE.COM has been included which will both display the current setting and allow changes to be made in the CONFG byte. Each drive may be independently set for one or two sided operation and fast or slow seeking. SAVEUSER.COM should be run after SETDRIVE.COM to permanently save any changes on disk. (10/27/80) Version 2.21 MOVCPM.COM will now ask if you have a Horizon computer when it is run. If you answer YES, the system will configure automatiguration, CONFIG.COM is not required on any disk. You may use STAT.COM to change the configuration of the CONSOLE, LIST, PUNCH or READER device as follows: Device name Left Right Par Par serial serial port port Console CON: TTY: CRT: BAT: UC1: Reader RDR: TTY: PTR: UR1: UR2: Punch PUN: TTY: PTP: UP1: UP2: List LST: TTY: CRT: LPT: UL1: For example, to use a printer attached to the right serial port, use the command: STAT LST:=CRT: Note: BAT: above refers to a special device that the proper disk in the single drive. (3/2/81) Version 2.22 This version corrects the following bugs. 1. CONFIG ver 4.0 corrects device selection in DSPCH routine of Horizon User Area. RRC now RLC for you software types at location 105F in CONFIG 3.x. 2. Read after write has been fixed. 3. An attempt to write onto a disk with a write protect tab will now give an immediate disk error message. 4. Cold boot loader now returns to E800H PROM upon error. (5/12/81) SETDRIVE.COM Version 2.1 This version of SETDRIVE replaces Version 2.0. The CP/M version and all other files remain the same. (7/9/81) Version 2.23 DQ A new version of the User's Notes, Rev 1.2 June 1981 is now supplied. It's much better than the old one. A new utility SETCPM.COM replaces SETDRIVE which is now obsolete. SETCPM is much more versatile and will allow you to set all system options either in memory or on disk. Definitly run this program and test some of the options. Note: If you change thst run. (7/22/81) Version 2.23a DQ Minor fix to SETCPM.COM.onger used to select a printer port, this should be done with either "CONFIG P" or SETCPM. If you use CONFIG, you may now do the "SAVE 24 CONFIG.COM" at any time, which allows you to test a system and do an immediate SAVE if it works, usually followed by "CONFIG P" to install the printer. The old one wouldn't work for different memory sizes if you SAVEd a CONFIG that had jue AUTO command line, exit with U for update to disk as the command line must be written on disk to work. MOVCPM.COM is no longer used to select a printer port, this should be done with either "CONFIG P" or SETCPM. If you use CONFIG, you may now do the "SAVE 24 CONFIG.COM" at any time, which allows you to test a system and do an immediate SAVE if it works, usually followed by "CONFIG P" to install the printer. The old one wouldn't work for different memory sizes if you SAVEd a CONFIG that had ju