TSS/C  CPM-UTIL 110H 00896C 02468C DOUBLE-DDISKETTE^--------CPM FORMAT N*S --------DIR.SEC1DIR.SEC2DIR.SEC3DIR.SEC4--------CPM DATADATASEC1DATASEC2DATASEC3DATASEC4........ SYSTAT COMTIME COMJOBNUMBRCOMONECOPY COMFORMAT COM PIP COM: XSUB COMED COM4ASM COM@ !"#$DDT COM&%&'()LOAD COM*+STAT COM),-./01DUMP COM2DIRDUMP COM 34SPOOL COM5DUMP ASM!6789:)Copyright 1981 North Star Computers, Inc.1`0/}$~#(_tl TSS/C SYSTAT Release 1.1.0H - :2:20 2!5: t:I 007t<>/t:<>/t:<> t:<>:t:<>:t:<l :A2;ˁ><"8* A0t*Ͱl Jobs Availabl<"8* A > 0t*l ~ <~ <l ~`҈@8@2lRead 8) 2lWritel Channel (*Ͱl)!~0 o&))))~*(t#~ݶl/~(lD~(lSl *#"*+"|E*#"*+"|3l Disk Spooler: Space In Use = *G[IR<"*ͰlK, Space Available = *G<"*ͰlKl File System::Bl l(*Ͱl) [ ~#t!ͫl - ɷG><'(98l In Use By TSS/C/2l In Use By JobDIRDUMP ASM;<=>?@ABCDEFGHIJDIRDUMP ASMKLTSSCEQUSBAKrMNOPQRSTUVWXYZ[HDOSEQUSASMl\]^_`abcdefghiSUBMIT COM jkTSSCUSERBAKlmnCOPY COMopqTSSCUSERASM rsTSSCEQUSASMrtuvwxyz{|}~N*Se, !":Ao"[~(*#"*+"| *Ͱl In Use. ]l&"SlCurrent User Login: ́lJob #*Ͱl l Op Sys Mem Pri Stk Statusl l-------- ----- ----- ------ -------------- ! "!"2*A&"!"[~!: /2́l lJob #*Ͱl: ~!>0 o&))))N~*(t#~2*Ͱlk ~2@ˁ> #*Ͱl Not In Use.l For Use With TSS/C Only * TSS/C * HDOS * CP/M * * ????* Running* Port Wait* FMNGR Queue* SunMonTueWedThuFriSat 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  !  #)Copyright 1981 North Star Computers, Inc.1p@?[!"6 } F$~#(_͒͊ For Use With TSS/C OnlyU"{uH*~ 4͊ :w2t:u2s0 2s!t5:s ͒:ux 007͒k>/͒:vk>/͒:wk> ͒:xk>:͒:yk>:͒:zkUG><'. K w ((# 6 )Copyright 1981 North Star Computers, Inc.1p@?} F$~#(_̓{ For Use With TSS/C Onlyw]l&"S{ Current User Login: (;ˁ><"8* A0̓*{) [ ~#̓!M{ - Job Number *w{ 1x ^"G!\~=x2E #~ 2C+!ͷ!y ": !l "< "> :C^"" : ʷ22 2 2 <ˆ"ð*: 6#6#! ": =Ɓo& ͷ<ˆ:CJ*: $."B :2D /1*B "@ <"1*@ :D =&*< 4#*@ "@ 7"M*B "@ :9 !% ##p <"þ  <"þ*@ :D *> N#Fx p+q " Mg"/*@ "@ Í1F/ TIME MM/DD/YY HH:MM:SSU*~ | }*~ #"͊ SunMonTueWedThuFriSat "< *: ȯ2 ! 6#w#6#6#6*>  "> *: ȯ29 ! Y>.e!e Y_  <"þ*@ :D *> N#Fx p+q " Mg"/*@ "@ Í1F/ r!s^#"p6*p"pͭ6\@;;G:;"j.Fj#w#w#w"p+~?b Zx*x͋{> #wj͋Âaڙ{ҙ_ _.:>п~ #í~#· !:l=_:B"  :E _!?) $ Although drive qualification is allowed on the command line, You may not specify a drive letter at this point; ABORTING$ Enter filename (just RETURN begins copying): $ FILENAME NOT FOUND$ UNEXPECTED OPEN FAILURE (COPY INCOMPLETE) OF FILE: $ I/O ERROR WHILE READING: $ Mount INPUT Diskette and type RETURN$ Mount OUTPUT Diskette and type RETURN$ ABNORMAL TERMINATION OF ENTIRE PROCESS$ OUTPUT DISK OR DIRECTORY FULL, WRITE ERROR IN FILE: $ Mount SYSTEM Diskette, type RETURN to WarmBoot$JMP CINIT ; cold boot init JMP CONST ; console test for input JMP CONIN ; console input JMP CONOUT ; console output JMP LIST ; printer output JMP PUNCH ; punch output JMP READER ; reader input JMP LISTST ; printer status test ; JMP 0 ; *** reserved *** JMP 0 ; *** reserved *** ;>FORMAT VERSION 1.1 COPYRIGHT,1981 NORTH STAR COMPUTERS,INC.1@!2!Dʂ!jQʂ!2ʂX!Sʂ!?NG~2#"!"B202:@:@:G:Nb* G:6!EQ  !"N b!%"!y 6# *0"!4F:Q!y 2> ͎*-!y 6# WW:Sp!y 2> ͎!y 6 # „„!":2 !ʺ!^"!º!@"!!2!y >͎G`_ ~# format Quad-Capacity *** CPMGEN was told that Drive is NOT Quad$ *** ERROR - BAD DRIVE NUMBER$ *** ERROR - Only N=NINE Format Permitted since CPMGEN was told drive is N-TYPE$ *** ERROR - N Format cannot be done since CPMGEN was not told drive is N-TYPE$ Select one of the format options below: D = Double-Density Single-Sided = D Q = Quad-Capacity (Double-Sided)= Q N = Nine-Capacity, N-Drives only= N S = Single-Density = S X = eXit - Warm Boot from A: = X Enter option letter.SEC4--------CPM DATADATASEC1DATASEC2DATASEC3DATASEC4........ Tracks...$ity-DriQUAD.CAPDOUBLE-DNINE-CAP CP/M 2.2 XXXXXXXXDISKETTECPM FROMNORTH * STAR ---------SYSTEM--TRACKS-BIOS USER CPM CCP CPM BDOS --------DIR.SEC1DIR.SEC2DIR.SEC3DIR(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$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:> !/>A11? when ready,$ Diskette Successfully Initialized $ Enter Drive number(1-4): $ To format as: Octal-Capacity Diskette: $ To format as: Quad-Capacity Diskette: $ To format as: Double-Density Diskette: $ To format as: Single-Density Diskette: $ *** ERROR - Can NOT (D,Q,N,X): $ - Proceeding to Format 35 * Tracks - $ - Proceeding to Format 70 * Tracks -... $ - Proceeding to Format 160 * Tracks...$ity-DriQUAD.CAPDOUBLE-DNINE-CAP CP/M 2.2 XXXXXXXXDISKETTECPM FROMNORTH * STAR ---------SYSTEM--TRACKS-BIOS USER CPM CCP CPM BDOS --------DIR.SEC1DIR.SEC2DIR.SEC3DIRABORTED$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͈*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= 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!f6!!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!gq2% ͋*-"*$$$ 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= *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 :! *+"! 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*: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*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$$$$$$$LIB1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH á 4êü /L9ASMPRNHEX:*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!)ͼ !ͼ :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=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ͷ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.Ͱ>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 >N 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# O!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  !  # ë «   Ͷ ͐ =« 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) 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+: Y23 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 S! _^! ^#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": 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+: Y2tatus : 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*(&L!*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!)*)) *)) 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!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" 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!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+++ ##0*"!>8 !9"1C>?!hw#w#w#w!":\M_\ ]!\6? ͣM\ʿƀ_r* "ͣ!ͬr~# £4~:60+~0Ҭ60ì5 !**}|> "!C>M6 #=Bͣ >. * ͣR .A  A  ! ^v#~_RSʴBʁX F͡vʛvG͡v2*#~0? ?{vvGv{ F}k))_iG)|g64 (Hard Disk is 256) $ No Files Matched, will show ALL FILES$ Enter S and a decimal Sector Number "S349" or Enter B and a hex Block Number "B2A" or Enter R to reprint dir.dump, X to exit: $ Incorrect - Unrecognized Input$ Sectors 0 to 19 are in the system track area They are not accounted for as a CP/M BLOCK$ Enter S and a decimal Sector Number "S349" or Enter B and a hex Block Number$ CP/M BLOCK XX CONTAINS SECTORS ump, X to exit: $ Incorrect - Unrecogni $)Copyright 1981 North Star Computers, Inc.1p@?[!"6 } F$~#(_͒͊ For Use With TSS/C OnlyJS*~ 4͊ Spooler Command (S, C, A, R, or P) RequiredJ`S(C(-A(GR(ePʩ>͊ Output Suspended>͊ Output Continued>͊ Print Job Aborted>͊ Print Job Restarted>͊ Print Jobs Purged͊ For Device #;ˁ><"; 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 GRAPH}o2|v*#~0 ?)T]))_!!(6 #8i*[)W)###tt+#tt F##~!+~} }022}0221{ ҷ {022z22+!>)) =33=~#~0:~0:#1)T)_!! User- FileName-EXTENT -#of - BLOCK NUMBERS ALLOCATED TO FILE (in Hex) -Number -RECS- 1- 2- 3- 4- 5- 6- 7- 8- 9-10-11-12-13-14-15-16 $ TOTAL FCBs listed = 0 Directory Capacity is 8* A0͒*J*#~  "S~ Ì cK w ((# 6 C!=H!= 0:?0))) O C"8: :0 2*͊ Illegal Output Device NumberJ͊ Output Device Number RequiredJ͊ Are You Sure? i !k[j6 :k_Y ͊ ͊ Command AbortedJ͊ *~ #"a{ <; 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 AREA (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 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 ;; Multi-Purpose North Star CP/M Disk Utility ; ; Primary function is to dump the contents of the ; CP/M Directory in a formatted Hexadecimal fashion. ; It shows Filename, Extent, and CP/M Blocks owned by the file. ; This function applies to diskettes and Hard Disk. ; ; Invoke from CCP with: DIRDUMP ; which will show all files, or: DIRDUMP filename.ext ; which will show only filenames which match. ; ; Upon completion of the dump, the secondary function ; of converting decimal sector numbers t 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 ;o CP/M block ; numbers or vice versa may be performed. ; This facility is most useful if COPY discovers errors ; and you wish to locate the damage to assess bad files. ; ; For Example: A CRC error is reported in sector 047 ; When prompted, enter S47 and this program will tell ; you that CP/M Block xx contains sectors 042 & 047, ; where block xx = 0C (if D diskette) or 06 (if Q diskette) ; or 03 if an N-Diskette. ; ; You may now look for block xx in the directory dump listed ; to determine which file had the error and its surrounding ; block numbers (which can be translated to sector numbers). ; You could now use DOS or the skeleton disk access code ; (illustrated below) to inspect the surrounding sectors ; to assess the damage (also use COPY's surface check facility). ; Note to N-Drive owners, sector numbers reported by the BIOS ; for D or Q diskettes must be hand translated by dividing the ; the track number by 4 on side 1 (side 2 is too complicated.) ; ; ; This source code contains an ------- ; ORG 100H ;USUAL COM FILE ORIGIN START JMP LOADDIR ;GO LOAD DIRECTORY INTO RAM ; ; ; ; ;**************************************************** ;****** ILLUSTRATION OF HOW TO USE THE DISK DRIVER IN ; THE BIOS FOR DOS STYLE I/O (UP TO FULL TRACK) ;****** THIS CODE HAS NOTHING TO DO WITH THE REST OF ; THIS PROGRAM - IS SHOWS THE ACCESS TO THE ; DISK DRIVERS AS FORMAT,COPY,SYSGEN DO IT. ; LXI D,30H ;OFFSET TO RTCOM ENTRY POINT-3 LHLD 1 ;ADDRESS OF BIOS(+3) DAD D ;ADD - NOW HLH ;HANDY RETURN TO DDT JMP IOLOOP ;LOOP TO ACCESS AGAIN ;****** END OF ILLUSTRATION OF HOW TO ACCESS BIOS DISK DRIVERS ;-------------------------------------------------------------- ; ; DDDD III RRRRR DDDD U U M M PPPPP ; D D I R R D D U U MM MM P P ; D D I R R D D U U M M M P P ; D D I RRRRR D D U U M M PPPPP ; D D I R R D D U U M M P ; D D I R R D D U U M FIELDS ; ;INITIALIZE LOOP CURSOR LXI H,BUFBASE-32 ;PREP TO RUN THRU BUFFER SHLD BUFCUR ;INIT CURSOR ; ;SELECT DRIVE (IF NOT DEFAULT) LDA DFCB ;GET SPECIFIED DRIVE (IFF NE 0) ORA A ;SKIP SELECT-DISK IF 0 JZ RESTART ;DEFAULT FCB ALREADY REQUESTED LOG'D DRIVE MOV E,A ;MAKE DEFAULT DRIVE DCR E ;CONVERT TO ZERO-ORIGIN MVI C,14 ;"LOG-ON" REQUEST CALL BDOS ;NOW REQUESTED DRIVE IS CURRENT ; ; ;*** PREPARE TO LOAD MATCHED ENTRIES INTO BUFFER RESTART MVI C,17 ;GET FIRST FCB FROM DIRECTORY B LXI D,DFCB CALL BDOS CPI 0FFH ;IF END OF DIRECTORY JZ GETDONE ;ALL DONE WITH GET MIDLOOP RRC ;MULTIPLY BY 32 RRC ;WITH 3 ROTATE RIGHT RRC ;SHORT WAY AROUND ADI 80H ;DMA AREA AT 80 MOV E,A ;POINT DE @ FCB IN DMA AREA MVI D,0 LDAX D ;INSPECT FIRST BYTE ORA A ;IF D7 IS ON, FILE IS ERASED JM GETLOOP ;WAS ON, BYPASS LHLD BUFCUR ;GET BUFFER CURSOR LXI B,32 ;ADVANCE 32 & ALSO SET C=COUNT=32 DAD B ;PRE-ADVANCE BUFFER CURSOR SHLD BUFCUR ;UPDATE CURSOR XCHG ;REVERSE SRC & DESTadditional feature: ; The calling sequence to the DOS style Disk Driver ; is illustrated so you could use it with DDT or ; write your own utility without having to revert to DOS. ; It accomodates Multiple Sector I/O (up to full track). ; ; PETER GOLITZEN - SEPTEMBER 1980 ; REVISED JULY 1981 to accomodate N-Series Diskettes ; ; Since this SOURCE program is rather bulky, you probably ; will want to erase it from your standard System Diskette. ; ;--------------------------------------------------- POINT TO RTCOM SHLD BJMP+1 ;PLANT IN CALL BELOW ;ENTRY POINT IS ESTABLISHED ; ;LOAD DESIRED PARAMETERS INTO THE REGISTERS AS FOLLOWS IOLOOP LXI H,0 ;HL=BUFFER ADDRESS MVI B,0 ;B=TRACK NUMBER (0-34,69 IF QUAD) MVI D,0 ;D=SECTOR NUMBER (0-9) MVI C,81H ;C=DRIVE NUMBER (1-4) + ;D7 (80H) IS DOUBLE DENSITY BIT. MVI A,1 ;NUMBER OF SECTORS (NOTE A+D MUST BE ;<=10, I.E. ALL I/O IS ON ONE TRACK) MVI E,1 ;OPERATION - 0=WRITE, 1=READ, 2=VERIFY BJMP CALL 0 ;ENTRY POINT PLANTED IN HERE CALL 38 M P ; DDDD III R R DDDD UUUUUU M M P ; ; ;********************************************** ;***** READ ENTIRE DIRECTORY INTO BUFFER ***** ; LOADDIR LXI H,0 ;SAVE CCP STACK POINTER DAD SP ;HL=CCP SP SHLD CCPSP ;STASH AWAY LXI SP,STACK ;USE OUR OWN STACK ; ;FILL OUT WITH ? DEFAULT FCB TO REQUEST ALL EXTENTS MVI A,'?' ;GET ALL EXTENTS LXI H,68H ;EXTENT NUMBER IN DEFAULT FCB MOV M,A ;PICK UP ALL EXTENTS INX H ! MOV M,A ! INX H ! MOV M,A INX H ! MOV M,A ;IN ALL OVERFLOW LXI D,DFCB ;DEFAULT FCB PROVIDES PATTERN CALL BDOS ;GIT IT CPI 0FFH ;IF NONE RETURNED, JNZ MIDLOOP ;FOUND ONE, ENTER LOOP BELOW ; ;NO FILES MATCHED, COMPLAIN, THEN PROCESS ALL (AS IF *.*) LXI D,NOFMSG MVI C,9 ;TELL USER CALL BDOS LXI D,DFCB+1 ;PREPARE TO SMEAR FILENAME LXI H,DFCB ;& USER WITH ?????????.??? MVI M,'?' ;PLANT ? IN USER-BYTE MVI C,11 ;11 BYTES NAME CALL MOVER JMP RESTART ;START ABOVE ; ;LOOP LOADS BUFFER WITH ALL ACCEPTABLE FCB'S GETLOOP MVI C,18 ;ASK FOR NEXT FC REGS CALL MOVER ;NOW MOVE FCB INTO HUGE BUFFER LXI H,FCBCT+2 ;DECIMAL ASCII NUMBER CALL CNTD ;COUNT FCB'S DECIMAL-ASCII-NUMBER JMP GETLOOP ;REPEAT UNTIL END ; ;THE USUAL MOVE ROUTINE MOVER MOV A,M ;GET BYTE STAX D ;PUT BYTE INX H ! INX D DCR C JNZ MOVER RET ; ;ASCII DECIMAL COUNTER (COUNTS FCB'S LOADED) CNTD INR M ;BUMP DIGIT MOV A,M ;SEE IF OVERFLOW CPI ':' RC ;NOPE, DONE MVI M,'0' ;RESET TO 0 DCX H ;ADVANCE TO NEXT DIGIT MOV A,M ;SEE IF WAS <0 CPI '0' ;(TAKES CARE OF LEAD BLANKS) JNC CNTD ;LOOP MVI M,'0' ;MAKE 0 JMP CNTD ; ;***** DONE WITH DIRECTORY ACQUISITION ; ; ; ; ; ; ; ;***************************************** ;***** PRINT THE FCB'S IN THE BUFFER ***** GETDONE NOP LXI D,TITLES ;PRINT HEADER MVI C,9 CALL BDOS ; REPRINT LXI H,BUFBASE ;INIT CURSOR ; ;LOOP TO PRINT ALL FCB'S PRTLOP CALL FCBPRT ;USE PRINT ROUTINE BELOW LHLD BUFCUR ;ADDR OF LAST FCB READ XCHG LHLD PRTCUR ;VERSUS PRINT BUFFER PTR MOV A,L ;CHECK IF EQUAL CMP E ;COUNT EIGHT BYTES MAX CALL MOVER ;GET 8 BYTES MOVED BAKBL DCX D ;BACK UP PRINT CURSOR LDAX D ;GET LAST BYTE CPI ' ' ;IF BLANK JZ BAKBL ;KEEP BACKING UP OVER BLANKS INX D ;RETURN TO LAST BLANK MVI A,'.' ;STAGE A PERIOD STAX D ;PLANT AFTER FILENAME INX D ;DE TO WHERE EXTENSION GOES LXI B,9 ;OFFSET TO FILENAME EXTENSION LHLD PRTCUR ;REFRESH FCB ADDRESS DAD B ;HL@EXTENSION MVI C,3 ;THREE BYTES CALL MOVER ;MOVE EXTENSION LXI D,PRTEXT ;EXTENT NUMBER ;NOTE HL @ EXTENT NUMBER CALL H ; ; ; ; ; ; ;****************************************************** ; PROMPT FOR SECONDARY FUNCTIONS ; (SECTOR-TO-BLOCK OR BLOCK-TO-SECTOR CONVERSIONS) ;ASK WHAT TO DO NOW? NOWHAT LXI D,DOWHATMSG ;ASK WHAT NOW MVI C,9 CALL BDOS ; LXI D,USERRESP ;ADDRESS USER RESPONSE MVI C,10 ;GET LINE FROM CONSOLE CALL BDOS LXI H,USERRESP+1 ;EXAMINE RESPONSE MOV E,M ;GET LENGTH (-1) DCR E ;LEAVE IN E FOR LATER USE JM BADIN ;IF WAS 0, NOW MINUS, ASK AGAIN ;NOTE - CONTROL-C REBOOT'S DIRECTLY FR JC BADIN ;IF CY ON, REJECT DCR E ;SEE IF ONE BYTE JZ GOTB ;WE GOT BLOCK DCR E ;CHECK FOR ONLY TWO BYTES JNZ BADIN ;REJECT IF OVER 2 BYTES RLC ! RLC ! RLC ! RLC ;PUT LEAD DIGIT IN FRONT MOV B,A ;GET IT OUT OF THE WAY CALL HEXIN ;GET ANOTHER DIGIT JC BADIN ;BAD IF C ORA B ;MASH THE TWO DIGITS TOGETHER GOTB STA BLOCK ;GOT THE BLOCK NUMBER JMP SHOWB ;GO SHOW THE BLOCK ; ;EDIT AND CONVERT A HEXADECIMAL DIGIT FROM ASCII STRING HEXIN INX H ;ADVANCE INPUT STRING CURSOR MOV A,M ;GET DIGIT DECIN ;USE ASCII-TO-DECIMAL ROUTINE JC BADIN ;IF CY ON, REJECT DCR B ;COUNT DOWN LENGTH JNZ DECLOP ;LOOP THRU INPUT STRING ;NOW WE HAVE SECTOR NUMBER, CONVERT IT TO BLOCK LXI B,-10 ;DIVIDE BY 10 CALL DIVIDE ;USE DIVIDE ROUTINE BELOW ;AFTER DIVIDE, DE=QUOTIENT(TRACK), HL=REMAINDER(SECTOR) MOV A,E ;INSPECT TRACK NUMBER DCR E ;REMOVE 2 FROM TRACK NUMBER DCR E ;SINCE 0&1 ARE SYSTEM TRACKS CPI 2 ;IF TRACK 2 OR HIGHER JNC CVTKB ;TRACK# IS OKAY LXI D,MSYST ;TRACK 0 & 1 ARE SYSTEM TRACKS JNZ CURNE MOV A,H CMP D CURNE JZ PRTDONE LXI D,32 ;ADVANCE TO NEXT FCB DAD D JMP PRTLOP ; ;****** PRINT A DIRECTORY ENTRY (FCB) SUBROUTINE ****** FCBPRT SHLD PRTCUR ;SAVE FCB ADDRESS XCHG ;INTO DE LXI H,PRTBUF ;BLANK BUFFER MVI A,LPRTBUF BLKLOP MVI M,' ' ;BLANK IT INX H DCR A JNZ BLKLOP ; ;PRINT BUFFER NOW BLANKED, COPY IN FILENAME XCHG ;FCB CURSOR BACK INTO HL LXI D,PRTBUF-1 ;INIT BUFFER CURSOR CALL HEXNZ ;DISPLAY USER CODE INX D ;ADD BLANK BEFORE FILENAME MVI C,8 EX ;OUTPUT A HEX DIGIT CALL HEXNZ ;OUTPUT IF NON-ZERO CALL HEXNZ ;OUTPUT BYTE 14 IF NZ CALL HEXNZ ;OUTPUT BYTE 15 IF NZ INX D ;MOVE D ALONG INX D ;TO EXTENT DISPLAY MVI C,16 ;DO 16 BYTES XPLOP CALL HEXNZ DCR C JNZ XPLOP ; ;PRINT THE LINE FORMULATED LXI D,PRTLIN ;NOW DO PRINT MVI C,9 CALL BDOS RET ;BACK TO CALLER ;****** END OF FCBPRT SUBROUTINE ********************** ; ; ; ;DIRECTORY IS NOW PRINTED, REPORT COUNT PRTDONE LXI D,ENDMSG ;SHOW FCB COUNT MVI C,9 CALL BDOS ; OM BDOS INX H ;EXAMINE FIRST BYTE MOV A,M ;GET FIRST BYTE ANI 5FH ;MAKE UPPER CASE LETTER CPI 'R' JZ REPRINT ;REPEAT ABOVE LIST CPI 'S' ;REQUEST TO XLAT SECTOR# JZ STOB ;XLAT SECTOR TO BLOCK CPI 'B' ;REQUEST TO XLAT BLOCK# JZ BTOS ;XLAT BLOCK TO SECTOR CPI 'X' ;X=EXIT JZ CCPEX ;EXIT TO CCP BADIN LXI D,BADINMSG ;TELL USER UNRECOGNIZED MVI C,9 CALL BDOS JMP NOWHAT ;DID NOT RECOGNIZE REQUEST ; ;BLOCK-TO-SECTOR REQUEST, CAPTURE HEX BLOCK NUMBER BTOS CALL HEXIN ;GET FIRST DIGIT FROM STRING SUI '0' ;REMOVE ASCII BIAS RC ;IF <'0', EXIT WITH CY ON CPI 'G'-'0' ;IF >'F' CMC ;EXIT WITH CY ON RC CPI 10 ;IF 0-9 CMC ;WERE DONE, SO EXIT RNC ;WITH CARRY OFF CPI 17 ;IF WAS ':' TO '@' RC ;ERROR WITH CY ON SUI 7 ;REMOVE 'A' BIAS RET ;DONE ; ; ;REQUEST WAS TO CONVERT SECTOR-TO-BLOCK STOB MOV A,E ;GET LENGTH SPEC ORA A ;CHECK IF 0 JZ BADIN ;NO GOOD CPI 5 ;MUST BE 1 TO 4 DIGITS JNC BADIN MOV B,A ;COUNT LENGTH IN B LXI D,0 ;INIT NUM TO ZERO DECLOP CALLMVI C,9 ;TELL USER NOT IN CP/M'S SPACE CALL BDOS JMP NOWHAT ;ASK AGAIN ;CONVERT TO "KILOBYTE NUMBER" CVTKB MOV A,L ;DE-SKEW SECTOR NUMBER CPI 5 ;IF SECTORS, 5-9 JC NOT59 ;SKIP IF NOT SUI 5 ;MAKE INTO 0-4 NOT59 EQU $ ;NOW A=0-4 A "KILOBYTE NUMBER" MOV L,E ;NOW HL AND DE ARE TRACK NUMBER DAD H ;HL=TRK*2 DAD H ;HL=TRK*4 DAD D ;HL=TRK*5 "OTHER PART OF KILOBYTE NUMBER" MOV E,A ;SECTOR COMPONENT OF KILOBYTE NUMBER DAD D ;NOW HL=KILOBYTE NUMBER PUSH H ;SAVE "THE KILOBYTE NUMBER" CALL DISKTYPE ;DETERMINE BLOCK SIZE (1,2,4K) SUI 2 ;NOW A=1,2,3 CORRESPONDINGLY MOV B,A ;PLACE ITERATION COUNT IN B POP H ;RESTORE KILOBYTE NUMBER DAD H ;PRE-COMPENSATING LEFT SHIFT ;RIGHT SHIFT LOOP RSHFTL MOV A,H ;SLIDE HIGH BITS DOWNWARD ORA A ;CLEAR CARRY RAR MOV H,A ;PUT HIGH BYTE BACK MOV A,L ;DO LOW DIGIT RAR ;PICK UP BIT FROM HI BYTE MOV L,A DCR B ;COUNT POWER OF TWO IN BLOCKSIZE JNZ RSHFTL STA BLOCK ;;A=ONE BYTE BLOCK NUMBER MOV A,H ;CANNOT HANDLE BLOCKS>256 ORA A ;CHERCVD INTO E MVI D,0 ;SIGN EXTEND TO 16 BITS DAD D ;ADD IN LAST DIGIT XCHG ;LEAVE IN DE POP H ;RESTORE CURSOR RET ;BACK TO CALLER ; ;***** SHOW ALL SECTORS IN THE CP/M BLOCK SHOWB LXI H,BLOCK ;POINT TO BLOCK NUMBER LXI D,BMBLK ;MSG RECEIVING AREA CALL HEX ;CONVERT BYTE@HL TO HEX LXI H,BMSEC ;SECTOR AREA OF MESSAGE MVI B,40 ;COUNT BLLOP MVI M,' ' INX H DCR B JNZ BLLOP ;BLANK LOOP ;VECTOR UPON BLOCKSIZE (1,2, OR 4K) CALL DISKTYPE ;DETERMINE IF D,Q, OR N LHLD BLOCK ;STAGE BLOCMINE DISK TYPE - DOUBLE OR QUAD OR N-SERIES DISKTYPE MVI C,31 ;ASK CPM FOR DPB VECTOR CALL BDOS INX H ;ADVANCE TO BSH FACTOR INX H ;THIRD BYTE IN DPB MOV A,M ;EXPECT 3,4, OR 5 CPI 4 ;CY=1K, Z=2K, NC&NZ=4K RET ;LET USER EXAMINE TRICHOTOMY ; ; ;WIERD BINARY TO DECIMAL CONVERSION ;OF KILOBYTE NUMBER TO SECTOR NUMBER MAKSECT PUSH H ;SAVE INPUT NUMBER LBMSEC EQU 30 ;LENGTH OF MOVE LXI D,BMSODD+LBMSEC ;SLIDE UPWARD ALL PRIOR RESULTS LXI H,BMSEC+LBMSEC ;FROM RIGHT END OF MESSAGE MVI B,30 +9 LXI B,-10 ;NOW DIVIDE TRACK NUMBER CALL DIVIDE MOV A,L ;LOW DIGIT OF TRACK# IS ADI 30H ;APPLY ASCII BIAS STA BMSEC+3 ;TEN'S DIGIT OF SECTOR# STA BMSEC+8 MVI D,'1' ;INIT 1000'S DIGIT TO ONE MOV A,E ;HIGH DIGIT SUI 10 ;IS THERE A THOUSANDS DIGIT JNC THOU1 ;YES, IS 1000+ MVI D,' ' ;NO, RESET 1000'S DIGIT TO BLANK MOV A,E ;RE-STAGE HUNDRED DIGIT THOU1 ADI 30H STA BMSEC+2 ;STORE HUNDREDS DIGIT STA BMSEC+7 MOV A,D ;STAGE 1000'S DIGIT STA BMSEC+1 STA BMSEC+6 POP H ;RECOVER OISOR JC DIVSOK ;IF C, SUBTRACT WAS OK POP H ;TRY FAILED, RESTORE TRIAL DCR A ;COUNT DOWN JNZ DIVLOOP ;LOOP BACK RET ;EXIT DIVSOK INX SP ;LEAVE HL, SO KILL THE INX SP ;SAVED JUNK ON THE STACK INX D ;PLANT A ONE IN THE QUOTIENT DCR A ;COUNT DOWN JNZ DIVLOOP ;LOOP BACK RET ;EXIT ;HL=REMAINDER, DE=QUOTIENT ; ; ; ;****** CONVERT BYTE @HL TO HEX ****** ; HEXNZ IF BYTE=0, ADVANCES CURSORS (LEAVES BLANK) HEXNZ MOV A,M ;STAGE SOURCE BYTE INX D ;ASSUME ONE BYTE LEAD BLANK ORA A ;TESTCK NOW ZERO JNZ BADIN ;NO, REJECT INPUT JMP SHOWB ;GO SHOW ENTIRE BLOCK ; ; ;VALIDATE DECIMAL ASCII DIGIT, MULTIPLY DE * 10 AND ADD DIGIT DECIN INX H ;ADVANCE CURSOR MOV A,M ;GET BYTE SUI '0' ;REMOVE ASCII BIAS RC ;ERROR RETURN WITH CY ON CPI 10 ;IF >10 CMC ;FLIP CARRY RC ;ERROR RETURN WITH CY ON PUSH H ;SAVE STRING CURSOR XCHG ;PREVIOUS CUMULATIVE RESULT DAD H ; *2 MOV D,H ; COPY *2 TO DE MOV E,L DAD H ; *4 DAD H ; *8 DAD D ; ADD *2 TO MAKE *10 MOV E,A ;LAST DIGIT K NUMBER JC BLK1K ;D=1K, SKIP AHEAD DAD H ;CVT BLOCK TO 2KB VALUE JZ BLK2K ;Q=2K, SKIP AHEAD DAD H ;N=4K, MAKE INTO 4KB VALUE INX H ! INX H ! INX H ;;DO +3 FIRST CALL MAKSECT ;DO FOURTH KILOBYTE CALL MAKSECT ;AND THIRD KILOBYTE DCX H ;NEED THIS TO FALL BELOW BLK2K INX H ;DO SECOND KILOBYTE FIRST CALL MAKSECT BLK1K CALL MAKSECT ;SHOW THE FIRST KILOBYTE ;WRAP IT UP BY SENDING MESSAGE LXI D,BMSG ;SEND MESSAGE MVI C,9 CALL BDOS JMP NOWHAT ;LOOP AND ASK FOR MORE INPUT ; ; ;DETER;THREE SETS OF SECTOR NUMBERS RLMOVL DCX H ! DCX D ;RIGHT-TO-LEFT MOVE LOOP MOV A,M ;NOTE PRE-DECREMENT STAX D DCR B JNZ RLMOVL POP H ;RECOVER NUMBER PUSH H ;KEEP A COPY ;BEGIN SUCCESSIVE DIVISIONS LXI D,10 ;OFFSET 10KB FOR SYSTEM TRACKS DAD D ;=20 SECTORS LATER XCHG ;TO DE FOR DIVISION LXI B,-5 ;DIVIDE BY 5 CALL DIVIDE ; E=TRACK, L=SECTOR MOV A,L ;FIDDLE WITH SECTOR NUMBER ADI 30H ;ADD ASCII BIAS STA BMSEC+4 ;SECTOR DIGIT INTO MESSAGE ADI 5 ;SECOND SECTOR SKEWED STA BMSECRIGINAL NUMBER DCX H ;HANDY TO REDUCE BY ONE RET ;DONE ; ; ; ; ;***** DIVIDE ROUTINE (UNSIGNED 8080) ***** ; ENTER WITH DIVISOR (NEGATED) IN BC, AND DIVIDEND IN DE DIVIDE LXI H,0 ;SIGN EXTEND TO 32 BIT DIVIDEND MVI A,16 ;LOOP COUNTER DIVLOOP DAD H ;LEFT SHIFT DIVIDEND XCHG ;PUT LOW HALF IN HL DAD H ;LEFT SHIFT LOW HALF JNC DIVNOPR ;NO CARRY TO PROPOGATE INX D ;YES, PROP INTO DE DIVNOPR XCHG ;NOW PUT HIGH HALF INTO HL PUSH H ;SAVE BEFORE TRIAL SUBTRACT DAD B ;TRY SUBTRACTING DIV IF NZ JNZ HEX ;NZ, GO SHOW HEX DIGIT INX D ;Z, WAS ZERO, LEAVE BLANK INX D ;IN ALL THREE BYTES INX H ;LEAVE INPUT CURSOR ADVANCED RET ; ;ENTER HERE IF ZERO-SUPPRESS NOT WANTED HEX MOV A,M ;REFETCH BYTE ANI 0F0H ;PICK LEFT NYBBLE RRC RRC RRC RRC ADI '0' ;ADD ASCII BIAS CPI ':' ;IF 0-9 JC LHOK ;LEFT HEX IS OK ADI 7 ;ADD MORE TO MAKE A-F LHOK STAX D ;PLANT BYTE INX D ;TO RIGHT DIGIT MOV A,M ;REFRESH SOURCE BYTE ANI 0FH ;PICK RIGHT NYBBLE ADI '0' ;ADD ASCII BIAS CPI ':' JC RHOK ADI 7 RHOK STAX D INX D ;LEAVE DE ADVANCED INX H ;BUMP SOURCE CURSOR RET ;DONE ; ; CCPEX LXI SP,0 ;RESTORE CCP'S STACK CCPSP EQU $-2 RET ;EXIT ; ; ; ;****** WORKING STORAGE - VARIABLES ****** BLOCK DB 0 ;CPM'S BLOCK NUMBER DB 0 ;ALLOW LHLD ; ; PRTCUR DS 2 ;PRINT LOOP CURSOR BUFCUR DS 2 ;DIRECTORY BUFFER CURSOR ; ;USER RESPONSE BUFFER USERRESP DB 20,0 DS 20 ;MESSAGE RECEIVING AREA ; ; ;***** MESSAGE TEXTS ********************************** TITLES DB 0DH,0AH,0A 'Enter B and a hex Block Number "B2A" or' db 0dh,0ah db 'Enter R to reprint dir.dump, X to exit: $' BADINMSG db 0dh,0ah db 'Incorrect - Unrecognized Input$' MSYST db 0dh,0ah db 'Sectors 0 to 19 are in the system track area' db 0dh,0ah db 'They are not accounted for as a CP/M BLOCK$' ; ; ;PRINT LINE STAGING AREA FOR DIRECTORY PRINT PRTLIN DB 0DH,0AH PRTBUF DS 15 PRTEXT DS 11 ;EXTENT AREA DS 51 ;BLOCK NUMBERS LPRTBUF EQU $-PRTBUF DB '$' ;TERMINATOR ; ; ;PRINT LINE STAGING AREA FO; ; TSS/C-EQUS Release 1.0.1H ; Sept 14, 1982 ; ; This file contains the equates for use in all modules ; of the North Star TSS/C Multi-User Operating System. ; ; ; Miscellaneous system equates ; JOBS: EQU 5 ; maximum number of jobs PORTS: EQU 10 ; maximum number of ports in system PRNTRS: EQU 2 ; number of spooled printers PRJOBS: EQU 100 ; number of active print jobs supported HDCPYL: EQU e of system communication channels TOTCH: EQU SYSCH + 4 ; total number of channels in TSS/C CCBBSZ: EQU 16 ; channel buffer size (must be power of 2) SPLJOB: EQU JOBS ; job controlling internal spooler SPLXCH: EQU SYSCH ; Mutual-eXclusion SPLCCH write channel SPLCCH: EQU SPLXCH + 1 ; command channel for communication to spooler SPLRCH: EQU SPLCCH + 1 ; result channel from spooler commands SPLPRI: EQU 5 EQU 015H ; LSER TxRDY interrupt arm LTXDAR: EQU 014H ; "" "" disarm RTXARM: EQU 01DH ; RSER TxRDY interrupt arm RTXDAR: EQU 01CH ; "" "" disarm HSIO1: EQU 010H ; HSIO - board 1 - base port number HSIO2: EQU 020H ; - board 2 - base port number HTXARM: EQU 006H ; - TxRDY interrupt arm HTXDAR: EQU 004H ; - TxRDY interrupt disarm PARAH DB 'User- FileName-EXTENT -#of - BLOCK NUMBERS' DB ' ALLOCATED TO FILE (in Hex)' DB 0DH,0AH DB ' -Number -RECS- 1- 2- 3- 4- 5- 6- ' DB '7- 8- 9-10-11-12-13-14-15-16' DB 0DH,0AH,'$' ENDMSG DB 0DH,0AH,0AH DB 'TOTAL FCBs listed = ' FCBCT DB ' 0',0dh,0ah DB 'Directory Capacity is 64 (Hard Disk is 256)' db 0DH,0AH,'$' NOFMSG DB 0DH,0AH DB 'No Files Matched, will show ALL FILES$ ' DOWHATMSG DB 0DH,0AH db 'Enter S and a decimal Sector Number "S349" or' db 0dh,0ah dbR BLOCK-SECTOR DISPLAY ; BMSG DB 0DH,0AH,0AH DB 'CP/M BLOCK ' BMBLK DB 'XX CONTAINS SECTORS ' BMSEC DS 10 BMSODD DS 10 BMSND DS 20 ;ADDED FOR N-DRIVES 4K BLOCKS DB 20H,0AH,'$' ; ; ;PAGE ZERO CP/M DEFINITIONS BDOS EQU 5 DFCB EQU 5CH ; DS 100 ;STACK AREA STACK DS 1 ; ORG ($+100H) AND 0FF00H ;ROUND TO PAGE BUFBASE DS 2048 END START  PRTEXT DS 11 ;EXTENT AREA DS 51 ;BLOCK NUMBERS LPRTBUF EQU $-PRTBUF DB '$' ;TERMINATOR ; ; ;PRINT LINE STAGING AREA FO 32 ; maximum HDCOM byte save count OFDS: EQU 200 ; number of Open File Directory entries MRUS: EQU 7 ; number of Most Recently Used CP/M VOLume ; and sector blocks to maintain OUTCH: EQU 0 ; base of port output channels INPCH: EQU OUTCH + PORTS ; base of port input channels USRCH: EQU INPCH + PORTS ; base of user defined communication channels SYSCH: EQU USRCH + 5 ; bas ; spooler priority while idle SPLHLT: EQU 'C'-40H + 80H ; character causing stop while printing SRVCHR: EQU '^'-40H ; character to enter Service Processor SRVJOB: EQU SPLJOB + 1 SRVCH: EQU SPLRCH + 1 CLKARM: EQU 0C0H ; 3.328ms RTC interrupt arm CLKDAR: EQU 040H ; dis-arm CLKFRQ: EQU 4 ; dispatch freq on RTC interrupt as ; a multiple of 3.328ms. 4=13.312ms LTXARM:RM: EQU 041H ; RAM-16 / RAM-32 / HRAM parity arm PARDAR: EQU 040H ; "" parity dis-arm MEMPRT: EQU 0C0H ; "" control port ; ; Mode 2 Z-80 interrupt vector locations ; INTPAG: EQU 0FF00H ; base page for mode 2 interrupt tables VI0: EQU INTPAG + 0C7H ; VI0 - 3.328ms clock interrupt VI1: EQU INTPAG + 0CFH ; VI1 - undetermined VI2: EQU INTPAG + 0D7H ; VI2 - HSIO-4 interrupts (all) VI3: EQU INTPAG + 0DFH ; VI3 - LSERial interrupts VI4: EQU INTPAG + 0E7H ; VI4 - RSERial interrupts VI5: EQU INTPAG + 0EFH ; VI5 - RAM Parity Errors (all banks) VI6: EQU INTPAG + 0F7H ; VI6 - undetermined VI7: EQU INTPAG + 0FFH ; VI7 - undetermined ; ; Operating system identification values ; OSTSS: EQU 0 ; Internal TSS operating system func OSHDOS: EQU 1 ; North Star HDOS operating system OSCPM: Eevice ownership flags ; NOTUSE: EQU 0FFH ; -1 marks device not in use ; 0..JOBS marks device in use ; ; System Module and Code segment origins ; SEXEC: EQU 0F000H ; base of TSS/C's executive ; ; System entry points and jump vectors ; SENTRY: EQU SEXEC + 0 ; entry point to TSS/C initialization SREVN: EQU SENTRY + 3 ; version ID area, x.y.z format ; SCHI: EQU SREVN + 3 ; "HDOS like" character inpSHDCOM: EQU SFMNGR + 3 ; HDCOM operation trap ; SOFD: EQU SHDCOM + 3 ; OFD command entry point SBIOS: EQU SOFD + 3 ; BIOS select read/write entry point SSPLRQ: EQU SBIOS + 3 ; spooler command entry point SWTFM: EQU SSPLRQ + 3 ; wait until File System (FM) is available SRELFM: EQU SWTFM + 3 ; release the File System ; ; System data pointers ; JCBPTR: EQU SEXEC + 38H ; the following point to the base of PRPTR: EQU JCBPTR ; ** reserved ** ; ; Spooler Variables ; SPLSIZ: EQU RE3JOB + 1 ; spooler file size in sectors SPLLFT: EQU SPLSIZ + 2 ; sectors remaining in file ENPRS: EQU SPLLFT + 2 ; number of printer connected ; ; Reserved space ; REMISC: EQU ENPRS + 1 ; ** reserved ** ; ; Other miscellaneous data items ; HSCNT: EQU REMISC + 2 ; number of HSIO-4s installed in system HSBAUD: EQU HSCNT + 1 ; baud rate command table for 8 chan1 ; memory on command JCBHM: EQU JCBMON + 1 ; high memory page JCBPRI: EQU JCBHM + 1 ; job priority JCBPRC: EQU JCBPRI + 1 ; job priority count (PRI..0) JCBSTK: EQU JCBPRC + 1 ; job's stack pointer JCBRGS: EQU JCBSTK + 2 ; job's registers AF', BC', DE', HL', ; AF, BC, DE, HL, IX, IY JCBSTO: EQU JCBRGS + 20 ; job's spooler time-out value JCBSIZ: EQU JCBSTO + 1 ; ; Channel ControQU 2 ; Digital Research CP/M operating system ; ; Job runtime status values ; STRUN: EQU 1 ; 01H = job running STDET: EQU 2 ; 02H = waiting on detached console STFMQ: EQU 3 ; 03H = FMNGR queue (All file systems) ; STWCH: EQU 20H ; 20H = BASE for write channel wait STRCH: EQU 40H ; 40H = BASE for read channel wait ; STSUSP: EQU 080H ; 80H = MASK for job paused ; ; Dut SCHO: EQU SCHI + 3 ; character output SCON: EQU SCHO + 3 ; control-C detect SAOUT: EQU SCON + 3 ; COUT, W/O additional dev SISTAT: EQU SAOUT + 3 ; input status check SOSTAT: EQU SISTAT + 3 ; output status check SOFTEN: EQU SOSTAT + 3 ; OFTEN handler ; SDCOM: EQU SOFTEN + 3 ; DCOM operation trap SFMNGR: EQU SDCOM + 3 ; FMNGR operation trap + 2 ; the JCB & PR tables RTCPTR: EQU PRPTR + 2 ; pointer to base of RTC string ; ; System and Job variables ; CURJOB: EQU SEXEC + 40H ; current job executing ENJOBS: EQU CURJOB + 1 ; number of enabled jobs FMJOB: EQU ENJOBS + 1 ; job using any File System SPJOB: EQU FMJOB + 1 ; job owning spooler MX queue RE1JOB: EQU SPJOB + 1 ; ** reserved ** RE2JOB: EQU RE1JOB + 1 ; ** reserved ** RE3JOB: EQU RE2JOB + 1 nels CPMVLS: EQU HSBAUD + 8 ; number of CP/M volumes available ; ; Job Control Block (JCB) offsets ; JCBPRT: EQU 0 ; port number of owner console ; bit 7 = 1 if detached JCBALO: EQU JCBPRT + 1 ; alternate channel for job output JCBALI: EQU JCBALO + 1 ; alternate channel for job input JCBOS: EQU JCBALI + 1 ; operating system identifier JCBST: EQU JCBOS + 1 ; status of job JCBMON: EQU JCBST + l Block (CCB) offsets ; CCBHD: EQU 0 ; head (write) pointer CCBCNT: EQU CCBHD + 1 ; buffer variables CCBBUF: EQU CCBCNT + 1 CCBSIZ: EQU CCBBUF + CCBBSZ ; ; Port Control Block (PCB) offsets ; PCBSTA: EQU 0 ; status port PCBDAT: EQU PCBSTA + 1 ; data port PCBINT: EQU PCBDAT + 1 ; interrupt control port PCBTXA: EQU PCBINT + 1 ; interrupt arm PCBTXD: EQU PCBTXA + 1 ; interrupt disarm PCBNAM: EQU PCBTXD + 1 ; port name (user or device name) PCBSIZ: EQU PCBNAM + 14 ; ; Extended File Manager Functions ; XFMREL: EQU 80H ; release CPU for one dispatch cycle XFMTIM: EQU XFMREL + 1 ; return HL=.MM/DD/YY HH:MM:SS string XFMJP: EQU XFMTIM + 1 ; return HL=JOB, DE=PORT XFMJCB: EQU XFMJP + 1 ; return IX=.JCB of job #HL XFMCCB: EQU XFMJCB + 1 ; return IY=.CCB of channel #HL XFMPCB: EQU XFMCCB + 1 ; return IX=.PCB of port #HL XMIJOB + 1 ; illegal channel number - out of range XMIPRT: EQU XMICH + 1 ; illegal port number - out of range XMNPRT: EQU XMIPRT + 1 ; no std port attached XMPRT: EQU XMNPRT + 1 ; std port attached XMNJOB: EQU XMPRT + 1 ; no open jobs available XMJNO: EQU XMNJOB + 1 ; job not owned by this port XMFPV: EQU XMJNO + 1 ; file protect violation XMFMI: EQU XMFPV + 1 ; FMNGR operation illegal under TSS/C ; ; Spooler Print-Job EC + 2 ; length in sectors PJQLB: EQU PJQLEN + 2 ; bytes in use in last sector PJQSIZ: EQU PJQLB + 2 ; ; Spooler Print-Job definition block, 1 for each job which may output to ; the spooler. ; SPJPJQ: EQU 0 ; Print-Job-Queue entry number or NOTUSE SPJTOC: EQU SPJPJQ + 1 ; time-out counter, refreshed from JCBSTO SPJLB: EQU SPJTOC + 1 ; bytes in use in this sector buffer SPJBUF: EQU SPJLB + 2 ; disk sector buffer pointer SPJSIZ: Etrolling print status ; bit 0: printer temporarily stopped ; bit 1: printer to stop at end of print-job ; PRLCT: EQU PRHLT + 1 ; line counter (PRPLEN..0) PRBCT: EQU PRLCT + 1 ; count of characters in buffer PRPOS: EQU PRBCT + 2 ; position of next character to print PRLEN: EQU PRPOS + 2 ; number of sectors printed PRBUF: EQU PRLEN + 2 ; pointer to tory command structure ; OFDADD: EQU 0 ; add to open file directory OFDEXA: EQU OFDADD + 1 ; search for an exact entry OFDVIL: EQU OFDEXA + 1 ; search for a violating entry OFDDEL: EQU OFDVIL + 1 ; delete an existing entry OFDRST: EQU OFDDEL + 1 ; reset portions of the OFD OFDINC: EQU OFDRST + 1 ; increment the open count of the entry @IY OFDDEC: EQU OFDINC + 1 ; decrement the open count of the entry @IY OFDEOL: EQU OFDDEC XFMWCH: EQU XFMPCB + 1 ; write character in B to channel #HL XFMRCH: EQU XFMWCH + 1 ; read character from channel #HL to B XFMCHS: EQU XFMRCH + 1 ; return B=characters in channel, C=space left XFMSHO: EQU XFMCHS + 1 ; shared file open XFMEXO: EQU XFMSHO + 1 ; exclusive file open XFMEOL: EQU XFMEXO ; end of XFM list ; ; Extended File Manager Error Codes ; XMIJOB: EQU 200 ; illegal job number - out of range XMICH: EQU queue definitions ; PJQST: EQU 0 ; status: ; bit 0: complete ; bit 1: being printed ; PJQDEV: EQU PJQST + 1 ; device number PJQJOB: EQU PJQDEV + 1 ; originating job number PJQPRT: EQU PJQJOB + 1 ; originating port number PJQNAM: EQU PJQPRT + 1 ; originating user name PJQSEC: EQU PJQNAM + 14 ; starting sector number PJQLEN: EQU PJQSQU SPJBUF + 2 ; ; Printer / De-spooler definition block offsets ; PRPRT: EQU 0 ; output port number PRTITL: EQU PRPRT + 1 ; print title pages flag PRPAG: EQU PRTITL + 1 ; generate page breaks flag PRPLEN: EQU PRPAG + 1 ; usable page length in lines ; PRPJQ: EQU PRPLEN + 1 ; Print-Job-Queue entry number or NOTUSE PRQCT: EQU PRPJQ + 1 ; number of print-jobs queued for this printer PRHLT: EQU PRQCT + 1 ; flags consector read buffer PRSIZ: EQU PRBUF + 2 ; ; Open File Directory entry structure ; OFDDES: EQU 0 ; OS unique entry identifier OFDOS: EQU OFDDES + 2 ; operating system ID (0..254) OFDJOB: EQU OFDOS + 1 ; job ID (0..254) OFDNOD: EQU OFDJOB + 1 ; *** node ID, NYI, leave 0 OFDSHC: EQU OFDNOD + 1 ; SHARE open count (0..255) OFDEXC: EQU OFDSHC + 1 ; EXCLUSIVE open count (0..255) OFDSIZ: EQU OFDEXC + 1 ; ; Open File Direc ; end of OFD list ; ; Open File Directory open mode attributes ; ATSHR: EQU 32 ; sharable flag, bit 5, sharable when 1 ; ; User Directory Entry Structure offsets ; UDTYP: EQU 0 ; entry type UDNAME: EQU UDTYP + 1 ; user name UDPASS: EQU UDNAME + 14 ; password UDCMND: EQU 128 ; initial HDOS command line UDCPMW: EQU UDCMND + 64 ; CP/M workfile pathname UDCPMC: EQU UDCPMW + 33 ; CP/M startup command UDNEXT: EQU UDCPMC + 64 UDSIZ: EQU 512 ; ; CP/M interface data, VOLume definition block; tables swapped to and ; from disk on drive selects ; VOLTYP: EQU 0 ; volume type & status: 00 = never assigned ; 01 = floppy disk ; 02 = hard disk ; VOLOFB: EQU VOLTYP + 1 ; vol Open File Block VOLSBL: EQU VOLOFB + OFBSZ ; CP/M sectors per block at BLC: EQU VOLBTK + 2 ; sector number ; VOLPAD: EQU VOLBSC + 1 ; start of pad to 200H bytes VOLSIZ: EQU BPS ; ; ; END of TSS/C-EQUS ; VOLVDT: EQU VOLCKV + 16 ; volume info dirty flag VOLSBC: EQU VOLVDT + 1 ; unallocated sectors-per-block count VOLBDT: EQU VOLSBC + 1 ; sector buffer dirty flag VOLBTK: EQU VOLBDT + 1 ; track number VOLBS; ; H D O S ; EQUS ; NOVEMBER 13, 1981 ; ; This file contains the equates for use in all modules of the ; North Star Hard Disk Operating System. ; RLEAS: EQU 2*16+0 ; Release 2.0.0 MAJORRV: EQU 1 ; Major disk revision level MINORRV: EQU 0 ; Minor disk revision level DSPCH: EQU 100H ; SYSTEM ORIGIN BADDR: EQU 0E800H ; Micro Disk Controller address PADDR: EQU 0 ; Motherboard I/O ports NTRAC: EQU 35 ; Number of tracks per side on a Micro Disk ZTRACEQU DSPCH+10 ; Entry point from boot PROM CHO: EQU DSPCH+0DH ; Character output routine CHI: EQU DSPCH+10H ; Character input routine INIT: EQU DSPCH+13H ; Terminal initialization routine CON: EQU DSPCH+16H ; Control-C check HDERR: EQU DSPCH+19H ; Nonrecoverable Micro Disk error vector DLOOK: EQU DSPCH+1CH ; Micro Disk file lookup routine DWRIT: EQU DSPCH+1FH ; Micro Disk directory update DCOM: EQU DSPCH+22H ; Lowest level Micro Disk driver DLIST: EQU DSPCH+25H ; Micro Disk directory lister RSTRT: ast HDCOM error HDEDA: EQU DSPCH+37H ; Sector address of last HDCOM error HDEDN: EQU DSPCH+39H ; Drive number of last HDCOM error MDCB: EQU DSPCH+3AH ; Personalization byte, address of Micro Disk Controller FTPTM: EQU DSPCH+3BH ; Storage for processor speed indicator HMEM: EQU DSPCH+3CH ; Memory limit indicator ADEV: EQU DSPCH+3DH ; Additional output device number AOUT: EQU DSPCH+3EH ; Character output bypassing additional device feature ISTAT: EQU DSPCH+41H ; Input device status check OSTAT: EQU DS ; VOLDPH: EQU VOLSBL + 1 ; CP/M standard DPH VOLDPB: EQU VOLDPH + 16 ; DPB VOLALV: EQU VOLDPB + 15 ; volume allocation vector VOLCKV: EQU VOLALV + 129 ; volume directory-check vector (floppies only) ; VOLVDT: EQU VOLCKV + 16 ; volume info dirty flag VOLSBC: EQU VOLVDT + 1 ; unallocated sectors-per-block count VOLBDT: EQU VOLSBC + 1 ; sector buffer dirty flag VOLBTK: EQU VOLBDT + 1 ; track number VOLBS: EQU 18+35+35+1 ; Initial track counter value for Micro Disks MAXIO: EQU 7 ; Maximum legal I/O device number NLINE: EQU 80 ; Length of input line for Command Processor DFSTP: EQU 26 ; Default processor speed constant (Z80A) ; ; SYSTEM DISPATCH TABLE ADDRESSES ; TRAKT: EQU DSPCH ; Micro Disk track table REVN: EQU DSPCH+4 ; Sequential revision number CNFG2: EQU DSPCH+5 ; Secondary configuration byte SUNIT: EQU DSPCH+6 ; Last used Micro Disk drive OFTEN: EQU DSPCH+7 ; Poling vector CBOOT: EQU DSPCH+28H ; System restart address RWCHK: EQU DSPCH+2BH ; Read after write and interrupt flags DOSER: EQU DSPCH+2CH ; Micro Disk argument error vector DEN: EQU DSPCH+2FH ; Micro Disk density flag AUTOS: EQU DSPCH+30H ; Command processor autostart flag PAGES: EQU DSPCH+33H ; Personalization byte, number of console display lines CONFG: EQU DSPCH+34H ; Personalization byte, Micro Disk drive combination RESLT: EQU DSPCH+35H ; Storage for result of last disk operation HDEMC: EQU DSPCH+36H ; Type of lSPCH+44H ; Output device status check LINED: EQU DSPCH+47H ; Line input editor FMNGR: EQU DSPCH+4AH ; Hard disk file manager entry point HDCOM: EQU DSPCH+4DH ; Lowest level hard disk driver entry point ; ; ORIGINS OF SYSTEM MODULES ; LINE: EQU DSPCH+100H-NLINE ; Space for a line of text TSTAK: EQU LINE ; Space for small argument stack for overlays BUFF: EQU DSPCH+100H ; Shared sector buffer UIOB: EQU BUFF+200H ; Users' I/O block HDCORG: EQU 0500H ; Hard Disk driver FMGORG: EQU 0D00H ; File manager origin TSSORG: EQU 01F00H ; Transient system border CMPORG: EQU 02600H ; Command Processor ; ; ; ; MFDOS result codes ; ; ; MFSNF: EQU 1 ; sync not found MFCRC: EQU 2 ; CRC error MFVFY: EQU 3 ; verify compare error MFNIP: EQU 4 ; no index pulse found MFDMM: EQU 5 ; density mismatch on read or verify MFWRP: EQU 6 ; attempt to write on protected diskette MFCCX: EQU 7 ; control C detected from console MFIDW: EQU 8 ; illegal call to DWRIT MFIDN: EQU 9 ; illegal drivC: EQU FMLOK+1 ; lookup account information FMCTY: EQU FMLAC+1 ; change file type FMCAT: EQU FMCTY+1 ; change file attributes FMCFS: EQU FMCAT+1 ; change file size FMCAP: EQU FMCFS+1 ; change the auto-load-and-go pathname FMABT: EQU FMCAP+1 ; abort the calling program FMRST: EQU FMABT+1 ; reset the File Manager FMLX: EQU FMRST+1 ; load and execute a file of type FTMI FMFSZ: EQU FMLX+1 ; return a file's size to the caller FMCA: EQU FMFSZ+1 ; create account FMDA: EQU FMCA+1 ; delete accoug buffer used FMINI: EQU FMFBU+1 ; initialize after bootstrap FMEOL: EQU FMINI ; end of FM list ; ; ; Message Codes ; MOK: EQU 00H ; ok, must be zero! MANE: EQU 20 ; account not empty MDDUP: EQU MANE+1 ; directory: attempt to add duplicate symbol MDFUL: EQU MDDUP+1 ; directory: directory is full MDFND: EQU MDFUL+1 ; directory: matching symbol found MDBAD: EQU MDFND+1 ; directory: bad directory structure MDFNF: EQU MDBAD+1 ; directory: file name not found MDANF: EQU MDFNF+1 ; directount delete protected MCCPF: EQU MADEP+1 ; can't change protected field MPARA: EQU MCCPF+1 ; pramater in error or out of range MFRT: EQU MPARA+1 ; file of wrong type specified MFNO: EQU MFRT+1 ; file not open MFOPN: EQU MFNO+1 ; file is open MFAIL: EQU MFOPN+1 ; general failur MEOLA: EQU MFAIL+1 ; end of list with available space MEOL: EQU MEOLA+1 ; end of list with no available space MIFMR: EQU MEOL+1 ; illegal File Manager request MFZNZ: EQU MIFMR+1 ; file size not zero MIFZ: EQU MFZNZd MDNACC: EQU 126 ; drive not ready for command MCNPR: EQU 125 ; controller not there MDWNR: EQU 124 ; drive went not ready after command started MCNFTS: EQU 123 ; can not find target sector MDRDFL: EQU 122 ; failure in drive read electronics MTSHDR: EQU 121 ; targ sec has crc error in header MBADRV: EQU 120 ; drive number too big MDERDS: EQU 119 ; drive error during seek MHSLER: EQU 118 ; head select error MCYLER: EQU 117 ; drive on wrong cylinder MHDCRC: EQU 116 ; crc error in headere number MFIDA: EQU 10 ; illegal disk address MFITL: EQU 11 ; illegal transfer length MFIDC: EQU 12 ; illegal command to DCOM MFTDM: EQU 13 ; track density mismatch error ; ; ; ; ; File Manager Definitions ; ; ; ; ; File Manager Operation Codes ; FMCRE: EQU 00H ; create file FMDEL: EQU FMCRE+1 ; delete file FMOPN: EQU FMDEL+1 ; open file FMCLO: EQU FMOPN+1 ; close file FMTFR: EQU FMCLO+1 ; transfer sectors to/from file FMLOK: EQU FMTFR+1 ; lookup file information FMLAnt FMSDV: EQU FMDA+1 ; set/return default values FMCM: EQU FMSDV+1 ; compose a standard message code message FMFIN: EQU FMCM+1 ; finish executing the calling program FMRDS: EQU FMFIN+1 ; return disk statistics to the calling prog FMADE: EQU FMRDS+1 ; access directory entry FMRDV: EQU FMADE+1 ; return default values to the calling prog FMCAN: EQU FMRDV+1 ; change account name FMPD: EQU FMCAN+1 ; power down a specific unit FMPU: EQU FMPD+1 ; power up a specific unit FMFBU: EQU FMPU+1 ; flary: account name not found MCADS: EQU MDANF+1 ; cant allocate disk space, disk possibly full MOFUL: EQU MCADS+1 ; cant open file, Open File Table full MOAVL: EQU MOFUL+1 ; OFT entry available MILDN: EQU MOAVL+1 ; illegal decimal number MILFN: EQU MILDN+1 ; illegal file name MILAN: EQU MILFN+1 ; illegal account name MILUN: EQU MILAN+1 ; illegal unit number MILID: EQU MILUN+1 ; illegal account ID MWRP: EQU MILID+1 ; write protect MDEP: EQU MWRP+1 ; delete protect MADEP: EQU MDEP+1 ; acco+1 ; illegal file size MEOF: EQU MIFZ+1 ; end of file reached during transfer MPEOF: EQU MEOF+1 ; transfer attempted past EOF MMEMP: EQU MPEOF+1 ; memory protect violation MUNPU: EQU MMEMP+1 ; unit not powered up MNYI: EQU MUNPU+1 ; function not yet implimented MFMO: EQU MNYI+1 ; file is multiply opened MDLRE: EQU MFMO+1 ; Disk level revision error MDNSL: EQU MDLRE+1 ; Drive label mismatch error MDNSS: EQU MDNSL+1 ; Drive size mismatch error MDNRDY: EQU 127 ; drive not ready-out of spee during position verify MILLDA: EQU 115 ; illegal disk address used MCNTFL: EQU 114 ; read/write ff will not set in controller MDWRTE: EQU 113 ; write unsafe or attempt to wrt on prot cyl MFWSOR: EQU 112 ; found wrong sector during read or verify MRDSHE: EQU 111 ; crc error on read sector header MDCRCE: EQU 110 ; data crc error MVDATE: EQU 109 ; compare error in data during verify MVCRCE: EQU 108 ; crc error on data during verify MRCER: EQU 107 ; drive error during command execution MRDFL: EQU 106 ; failure to be able to format drive MSHDR: EQU 105 ; Pll sync error on read MMIPLS: EQU 104 ; Missing index pulse MBUFRD: EQU 103 ; Buffer error ; ; ; ; Unit Structure ; SPD: EQU 128 ; sectors per directory SPH: EQU 4 ; sectors per hunk as a power of 2 HPM: EQU 153*4 ; hunks per unit DLDA: EQU 0 ; disk label disk address HTDA: EQU 1 ; hunk table disk address BHTDA: EQU 2 ; bad hunk table disk address BPS: EQU 512 ; bytes per sector ; ; ; ; File Attributes ; ATBAK: EU 4 ; BACKUP/RECOVERY compressed directory FTRP: EQU 5 ; BACKUP/RECOVERY packets FTCC: EQU 6 ; CP/M work file FTCU: EQU 7 ; CP/M unit FTPC: EQU 10 ; PASCAL connection table FTPV: EQU 11 ; PASCAL volume FTAS: EQU 18 ; ASP sequential file FTAR: EQU 19 ; ASP random file FTAI: EQU 20 ; ASP index file ; ; ; FMLX Option Codes ; LXRLE: EQU 0 ; return load errors, execute loaded code LXALE: EQU 1 ; use FMABT for load errors, execute code LXRET: EQU 2 ; return on load errors, donot execute LXXPO: EQLNSRT: EQU DLDSZE+2 ; number of sectors reserved for testing DLNHSZ: EQU DLNSRT+2 ; hunk size as a power of two DLDRSZ: EQU DLNHSZ+1 ; directory size (sectors) DLDIR: EQU DLDRSZ+2 ; base disk address for the unit's directory DLXXX: EQU DLDIR+2 ; reserved space DLSIZ: EQU BPS-DLXXX ; structure size ; ; ; Hunk Table Structure ; HTALC: EQU 0 ; the count of allocated hunks HTMAP: EQU HTALC+2 ; the bit map of hunks, a 1 bit means inuse ; ; ; Directory Entry Structure ; DETYP: EQU 0 ; entry DEOSM: EQU 0FH ; entry-of-sector lower mask ; ; ; File Structure Discriptor ; FSDAT: EQU 0 ; attributes FSDFZ: EQU FSDAT+1 ; file size in sectors FSDLB: EQU FSDFZ+2 ; bytes in use in last sector FSDHS: EQU FSDLB+2 ; nHunk size as a power of 2 FSDMU: EQU FSDHS+1 ; unit number FSDH0: EQU FSDMU+1 ; hunk 0 address divided by SPH FSDSZ: EQU FSDH0+2 ; structure descriptor size ; ; ; File Directory Entry ; FDESD: EQU DEBAS ; structure descriptor FDEAT: EQU FDESD+FSDAT ; attributes FD ; ; Index block ; IXSIZ: EQU BPS/2 ; one half sector long EPI: EQU 129 ; entries per index ; ; ; Open FIle Block (OFB) ; OFBDE: EQU 0 ; directory entry number OFBDB: EQU OFBDE+2 ; base disk address for directory OFBIL: EQU OFBDB+2 ; index length (1..EPI) OFBSD: EQU OFBIL+1 ; the file's structure descriptor OFBAT: EQU OFBSD+FSDAT ; attributes OFBFZ: EQU OFBSD+FSDFZ ; file size in sectors OFBLB: EQU OFBSD+FSDLB ; bytes in last sector OFBHS: EQU OFBSD+FSDHS ; nHunk size OFBMU: EQU OFQU 1 ; backupable flag, bit 0, backupable when 0 ATDRT: EQU 128 ; file dirty flag, bit 7, dirty when 1 ATWRT: EQU 2 ; write protect flag, bit 1, protected when 1 ATDEL: EQU 4 ; deleteable file flag, bit 2, not deleteable when 1 ; ; ; Directory Entry Type Codes ; ENTNU: EQU 0 ; never used entry ENTIU: EQU 1 ; entry in use (account or file) ENTDE: EQU 2 ; deleted entry ; ; ; File Types ; FTMI: EQU 1 ; memory image file FTBP: EQU 2 ; BASIC program file FTBD: EQU 3 ; BASIC data file FTRD: EQU 080H ; extended path option bit ; ; ; FMTFR Operation Codes ; TCORD: EQU 1 ; read TCOWR: EQU 0 ; write TCOVF: EQU 2 ; verify TCOWC: EQU 3 ; write 'clean' ; ; ; Disk Label Structure ; DLILL: EQU 0 ; illegal directory address DLALX: EQU DLILL+2 ; auto-load-and-execute path name DLASZ: EQU 35 ; auto load&execute pathname length DLMAJOR: EQU DLALX+DLASZ ; major disk structure revision level DLMINOR: EQU DLMAJOR+1 ; minor disk structure revision level DLDSZE: EQU DLMINOR+1 ; disk size Dtype DESYM: EQU DETYP+1 ; The entry's symbol DEACN: EQU DESYM ; the account number DENAM: EQU DEACN+2 ; the name protion of the symbol DENMZ: EQU 14 ; name length in symbol DESYZ: EQU DENAM+DENMZ-DESYM ; symbol length DEBAS: EQU DESYM+DESYZ ; base for account and file data DESIZ: EQU 32 ; the size of an entry DESZ2: EQU 5 ; the size of an entry as a power of 2 DEPS: EQU 4 ; directory entries per sector (2^DEPS) EPD: EQU 2048 ; entries per directory DIRM: EQU 07H ; entry number upper maskEFZ: EQU FDESD+FSDFZ ; file size in sectors FDELB: EQU FDESD+FSDLB ; bytes in use in the last sector FDEHS: EQU FDESD+FSDHS ; sectors per nHunk as a power of 2 FDEX1: EQU FDESD+FSDMU ; reserved space FDEH0: EQU FDESD+FSDH0 ; hunk 0 disk addr divided by SPH FDEFT: EQU FDEH0+2 ; file type FDETD: EQU FDEFT+1 ; type dependant data FDEXX: EQU FDETD+3 ; reserved space, 2 bytes ; ; ; Account Directory Entry ; ADEAN: EQU DESYM+DESYZ ; account number ADEXX: EQU ADEAN+2 ; reserved space, 13 bytes ;BSD+FSDMU ; unit number OFBH0: EQU OFBSD+FSDH0 ; hunk 0 address divided by SPH OFBI: EQU OFBSD+FSDSZ ; index block OFBCB: EQU OFBI+IXSIZ ; OFB check byte OFBSZ: EQU OFBCB+1 ; OFB size OFBUM: EQU 0FH ; unit mask in OFBMU ; ; ; Create Information Block ; CBTYP: EQU 0 ; file type CBATR: EQU CBTYP+1 ; attributes CBNHZ: EQU CBATR+1 ; nHunk size as a power of 2 CBPNA: EQU CBNHZ+1 ; pathname address CBTDD: EQU CBPNA+2 ; type dependant data CBSIZ: EQU CBTDD+3 ; create block size ; ; ; Transfer Command Block ; TCOP: EQU 0 ; operation code TCMEM: EQU TCOP+1 ; begining memory address TCSEC: EQU TCMEM+2 ; begining sector number TCLEN: EQU TCSEC+2 ; transfer length in sectors TCEMA: EQU TCLEN+1 ; ending memory address TCESN: EQU TCEMA+2 ; ending sector number TCSNT: EQU TCESN+2 ; sectors not transfered TCBLB: EQU TCSNT+1 ; bytes in use in the last sector TCDRT: EQU TCBLB+2 ; the 'or' of all dirty bits seen TCSIZ: EQU TCDRT+1 ; TC size ;  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>}|ͧ; ; TSSCUSER.ASM ; ; North Star TSS/C Release 1.0.1H - user bank BIOS USER routines ; Copyright 1981 North Star Computers, Inc. ; ; This module contains all CP/M 2.2 sequential I/O routines. ; CPMBAS: EQU $ CCP: EQU CPMBAS + 0100H BDOS: EQU CCP + 0800H BIOS: EQU CCP + 1600H USER: EQU BIOS + 0700H ; INITIO: EQU 01000000B ; initial I/O byte IOBYTE: EQU 3 ORG USER ; TSS/C USER jump vector JMP CINI Cold boot init routine, called before first entry into CCP ; CINIT: MVI A,INITIO ; set initial I/O byte STA IOBYTE RET ; ; CONST - Return console status ; ; Output: ; A = 00: console not ready ; FF: console input ready ; CONST: LDA IOBYTE ; check ISTAT of console device ANI 00000011B ; console is 2 lsb CALL SISTAT MVI A,0FFH ; set true return value if ready RZ ͧ!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>}|ͧT ; cold boot init JMP CONST ; console test for input JMP CONIN ; console input JMP CONOUT ; console output JMP LIST ; printer output JMP PUNCH ; punch output JMP READER ; reader input JMP LISTST ; printer status test ; JMP 0 ; *** reserved *** JMP 0 ; *** reserved *** ; ; CINIT - XRA A RET ; ; CONIN - Read console character ; ; Output: ; A = character ; CONIN: LDA IOBYTE ; read character from DOS device #0 ANI 00000011B JMP SCHI ; ; CONOUT - Write console character, flush write pending ; ; Input: ; C = character ; CONOUT: LDA IOBYTE ; write character to console, via AOUT ANI 00000011B MOV B,C JMP SAOUT ; ; LIST - Write printer character ; LIST: LDA IOBYTE ; write character to list device ANI 11000000B RLC RLC MOV B,C JMP SAOUT ; ; PUNCH - Write character to punch device ; PUNCH: LDA IOBYTE ANI 00110000B RRC RRC RRC RRC MOV B,C JMP SAOUT ; ; READER - Read character from reader device ; READER: LDA IOBYTE ANI 00001100B RRC RRC >COPY VERSION 1.1.1 COPYRIGHT,1981 NORTH STAR COMPUTERS,INC.1*!0" !~2X@w"Z!"###""!a W%p2 2 ! p%ҹF²>2 !Z%pù>p>2 ! p:\: : .:  x!j f! fx.: *  !j fx : * Ux!Of!f!fx!qf!f!& ~2 #!: †!6: <ʆ!G! ʺQNʭDp: p: p)): p): p)}2 !35 # F!701!60{222"th Star CP/M 2.2 Diskette Copier (ver 1.1.1) Copies Double-Density Diskettes (DQ capacities) $ Mount the Diskettes to be processed and- Enter INPUT Drive number(1-4): Or Mount System Diskette and RETURN to Exit: $ To Surface Check Only, Enter "N", To Verify-Compare two diskettes, Enter "V", To Copy, Enter OUTPUT Drive number(1-4): $ Enter SECOND INPUT Drive number(1-4): $ Proceeding to copy xxx track diskette $ Surface-Checking (read & CRC check) xxx track diskette $ Verifying-Comparingette Enter D or RETURN for one-sided$ Input lacks CP/M capacity code Enter RETURN or D for one-sided$$ Input is CP/M N-type Diskette Enter RETURN for N-type$ Input is not an N-type diskette Enter N to force an N-type$ Copy COMPLETE$ Surface Check COMPLETE$ Verify COMPLETE$ *** but ERRORS were FOUND & BYPASSED $ *** COPY ABORTED *** OUTPUT ERROR CANNOT BE FORCED $ Diskette is coded as N-type (F2 code), Must have N-series disk drives to process it$ N-t ; CINIT - Cold boot init routine, called before first entry into CCP ; CINIT: MVI A,INITIO ; set initial I/O byte STA IOBYTE RET ; ; CONST - Return console status ; ; Output: ; A = 00: console not ready ; FF: console input ready ; CONST: LDA IOBYTE ; check ISTAT of console device ANI 00000011B ; console is 2 lsb CALL SISTAT MVI A,0FFH ; set true return value if ready JMP SCHI ; ; LISTST - Return status of list device ; LISTST: LDA IOBYTE ; check status of list device ANI 11000000B RLC RLC CALL SISTAT MVI A,0FFH ; set true return value if ready RZ XRA A RET ; READER - Read character from reader device ; READER: LDA IOBYTE ANI 00001100B RRC RRC ""z2 : ": ">2 !" _: G: ix2 7: ʢ: Œ>!2 " : O: G>  ! 4* : =Zâ_: G: ix2 “* }0 :  : < : # <H pL pO$O~#: O!> A,15?0G*O~ ?怰HG++~ M@>2!" !O@|: 2 V* |g: ʢ>"Ҟ#<âxG> ү2 #~#<: 2      Nor two xxx track diskettes $ Verification/Comparison: $ Surface Check: $ Copy: $B Input is CP/M Quad-Capacity Diskette Enter RETURN for normal two-sided$ Input is CP/M Single-Sided Diskette Although Q will Force two-sided process, Enter RETURN for normal one-sided$C Input is not recognized as CP/M Diskette Enter D for one-side or RETURN or Q for two-sided$ Input is CP/M Quad Diskette BUT drive(s) not two-sided per CPMGEN, D Forces processing ONLY one-sided$ Input is CP/M Single-Sided Disk RZ XRA A RET ; ; CONIN - Read console character ; ; Output: ; A = character ; CONIN: LDA IOBYTE ; read character from DOS device #0 ANI 00000011B JMP SCHI ; ; CONOUT - Write console character, flush write pending ; ; Input: ; C = character ; CONOUT: LDA IOBYTE ; write character to console, via AOUT ANI 00000011B MOV B,C JMP SAOUT ; ; LIST - Write printer character ; LIST: LDA IOBYTE ; write character to list device ANI 11000000B RLC RLC MOV B,C JMP SAOUT ; ; PUNCH - Write character to punch device ; PUNCH: LDA IOBYTE ANI 00110000B RRC RRC RRC RRC MOV B,C JMP SAOUT ; ; READER - Read character from reader device ; READER: LDA IOBYTE ANI 00001100B RRC ; ; TSS/C-EQUS Release 1.1.0H ; March 9, 1983 ; ; This file contains the equates for use in all modules ; of the North Star TSS/C Multi-User Operating System. ; ; ; Miscellaneous system equates ; JOBS: EQU 5 ; maximum number of jobs PORTS: EQU 10 ; maximum number of ports in system PRNTRS: EQU 2 ; number of spooled printers PRJOBS: EQU 100 ; number of active print jobs supported HDCPYL: EQU e of system communication channels TOTCH: EQU SYSCH + 4 ; total number of channels in TSS/C CCBBSZ: EQU 16 ; channel buffer size (must be power of 2) SPLJOB: EQU JOBS ; job controlling internal spooler SPLXCH: EQU SYSCH ; Mutual-eXclusion SPLCCH write channel SPLCCH: EQU SPLXCH + 1 ; command channel for communication to spooler SPLRCH: EQU SPLCCH + 1 ; result channel from spooler commands SPLPRI: EQU 5 EQU 015H ; LSER TxRDY interrupt arm LTXDAR: EQU 014H ; "" "" disarm RTXARM: EQU 01DH ; RSER TxRDY interrupt arm RTXDAR: EQU 01CH ; "" "" disarm HSIO1: EQU 010H ; HSIO - board 1 - base port number HSIO2: EQU 020H ; - board 2 - base port number HTXARM: EQU 006H ; - TxRDY interrupt arm HTXDAR: EQU 004H ; - TxRDY interrupt disarm PARAs (all) VI3: EQU INTPAG + 0DFH ; VI3 - LSERial interrupts VI4: EQU INTPAG + 0E7H ; VI4 - RSERial interrupts VI5: EQU INTPAG + 0EFH ; VI5 - RAM Parity Errors (all banks) VI6: EQU INTPAG + 0F7H ; VI6 - undetermined VI7: EQU INTPAG + 0FFH ; VI7 - undetermined ; ; Operating system identification values ; OSTSS: EQU 0 ; Internal TSS operating system func OSHDOS: EQU 1 ; North Star HDOS operating system OSCPM: E RRC JMP SCHI ; ; LISTST - Return status of list device ; LISTST: LDA IOBYTE ; check status of list device ANI 11000000B RLC RLC CALL SISTAT MVI A,0FFH ; set true return value if ready RZ XRA A RET ;  32 ; maximum HDCOM byte save count OFDS: EQU 200 ; number of Open File Directory entries MRUS: EQU 7 ; number of Most Recently Used CP/M VOLume ; and sector blocks to maintain OUTCH: EQU 0 ; base of port output channels INPCH: EQU OUTCH + PORTS ; base of port input channels USRCH: EQU INPCH + PORTS ; base of user defined communication channels SYSCH: EQU USRCH + 5 ; bas ; spooler priority while idle SPLHLT: EQU 'C'-40H + 80H ; character causing stop while printing SRVCHR: EQU '^'-40H ; character to enter Service Processor SRVJOB: EQU SPLJOB + 1 SRVCH: EQU SPLRCH + 1 CLKARM: EQU 0C0H ; 3.328ms RTC interrupt arm CLKDAR: EQU 040H ; dis-arm CLKFRQ: EQU 4 ; dispatch freq on RTC interrupt as ; a multiple of 3.328ms. 4=13.312ms LTXARM:RM: EQU 041H ; RAM-16 / RAM-32 / HRAM parity arm PARDAR: EQU 040H ; "" parity dis-arm MEMPRT: EQU 0C0H ; "" control port ; ; Mode 2 Z-80 interrupt vector locations ; INTPAG: EQU 0FF00H ; base page for mode 2 interrupt tables VI0: EQU INTPAG + 0C7H ; VI0 - 3.328ms clock interrupt VI1: EQU INTPAG + 0CFH ; VI1 - undetermined VI2: EQU INTPAG + 0D7H ; VI2 - HSIO-4 interruptQU 2 ; Digital Research CP/M operating system ; ; Job runtime status values ; STRUN: EQU 1 ; 01H = job running STDET: EQU 2 ; 02H = waiting on detached console STFMQ: EQU 3 ; 03H = FMNGR queue (All file systems) ; STWCH: EQU 20H ; 20H = BASE for write channel wait STRCH: EQU 40H ; 40H = BASE for read channel wait ; STSUSP: EQU 080H ; 80H = MASK for job paused ; ; Device ownership flags ; NOTUSE: EQU 0FFH ; -1 marks device not in use ; 0..JOBS marks device in use ; ; System Module and Code segment origins ; SEXEC: EQU 0F000H ; base of TSS/C's executive ; ; System entry points and jump vectors ; SENTRY: EQU SEXEC + 0 ; entry point to TSS/C initialization SREVN: EQU SENTRY + 3 ; version ID area, x.y.z format ; SCHI: EQU SREVN + 3 ; "HDOS like" character inpSHDCOM: EQU SFMNGR + 3 ; HDCOM operation trap ; SOFD: EQU SHDCOM + 3 ; OFD command entry point SBIOS: EQU SOFD + 3 ; BIOS select read/write entry point SSPLRQ: EQU SBIOS + 3 ; spooler command entry point SWTFM: EQU SSPLRQ + 3 ; wait until File System (FM) is available SRELFM: EQU SWTFM + 3 ; release the File System ; ; System data pointers ; JCBPTR: EQU SEXEC + 38H ; the following point to the base of PRPTR: EQU JCBPTR ; ** reserved ** ; ; Spooler Variables ; SPLSIZ: EQU RE3JOB + 1 ; spooler file size in sectors SPLLFT: EQU SPLSIZ + 2 ; sectors remaining in file ENPRS: EQU SPLLFT + 2 ; number of printer connected ; ; Reserved space ; REMISC: EQU ENPRS + 1 ; ** reserved ** ; ; Other miscellaneous data items ; HSCNT: EQU REMISC + 2 ; number of HSIO-4s installed in system HSBAUD: EQU HSCNT + 1 ; baud rate command table for 8 chan1 ; memory on command JCBHM: EQU JCBMON + 1 ; high memory page JCBPRI: EQU JCBHM + 1 ; job priority JCBPRC: EQU JCBPRI + 1 ; job priority count (PRI..0) JCBSTK: EQU JCBPRC + 1 ; job's stack pointer JCBRGS: EQU JCBSTK + 2 ; job's registers AF', BC', DE', HL', ; AF, BC, DE, HL, IX, IY JCBSTO: EQU JCBRGS + 20 ; job's spooler time-out value JCBSIZ: EQU JCBSTO + 1 ; ; Channel ControBTXD + 1 ; port name (user or device name) PCBSIZ: EQU PCBNAM + 14 ; ; Extended File Manager Functions ; XFMREL: EQU 80H ; release CPU for one dispatch cycle XFMTIM: EQU XFMREL + 1 ; return HL=.MM/DD/YY HH:MM:SS string XFMJP: EQU XFMTIM + 1 ; return HL=JOB, DE=PORT XFMJCB: EQU XFMJP + 1 ; return IX=.JCB of job #HL XFMCCB: EQU XFMJCB + 1 ; return IY=.CCB of channel #HL XFMPCB: EQU XFMCCB + 1 ; return IX=.PCB of port #HL ut SCHO: EQU SCHI + 3 ; character output SCON: EQU SCHO + 3 ; control-C detect SAOUT: EQU SCON + 3 ; COUT, W/O additional dev SISTAT: EQU SAOUT + 3 ; input status check SOSTAT: EQU SISTAT + 3 ; output status check SOFTEN: EQU SOSTAT + 3 ; OFTEN handler ; SDCOM: EQU SOFTEN + 3 ; DCOM operation trap SFMNGR: EQU SDCOM + 3 ; FMNGR operation trap + 2 ; the JCB & PR tables RTCPTR: EQU PRPTR + 2 ; pointer to base of RTC string ; ; System and Job variables ; CURJOB: EQU SEXEC + 40H ; current job executing ENJOBS: EQU CURJOB + 1 ; number of enabled jobs FMJOB: EQU ENJOBS + 1 ; job using any File System SPJOB: EQU FMJOB + 1 ; job owning spooler MX queue RE1JOB: EQU SPJOB + 1 ; ** reserved ** RE2JOB: EQU RE1JOB + 1 ; ** reserved ** RE3JOB: EQU RE2JOB + 1 nels CPMVLS: EQU HSBAUD + 8 ; number of CP/M volumes available ; ; Job Control Block (JCB) offsets ; JCBPRT: EQU 0 ; port number of owner console ; bit 7 = 1 if detached JCBALO: EQU JCBPRT + 1 ; alternate channel for job output JCBALI: EQU JCBALO + 1 ; alternate channel for job input JCBOS: EQU JCBALI + 1 ; operating system identifier JCBST: EQU JCBOS + 1 ; status of job JCBMON: EQU JCBST + l Block (CCB) offsets ; CCBHD: EQU 0 ; head (write) pointer CCBCNT: EQU CCBHD + 1 ; buffer variables CCBBUF: EQU CCBCNT + 1 CCBSIZ: EQU CCBBUF + CCBBSZ ; ; Port Control Block (PCB) offsets ; PCBSTA: EQU 0 ; status port PCBDAT: EQU PCBSTA + 1 ; data port PCBINT: EQU PCBDAT + 1 ; interrupt control port PCBTXA: EQU PCBINT + 1 ; interrupt arm PCBTXD: EQU PCBTXA + 1 ; interrupt disarm PCBNAM: EQU PCXFMWCH: EQU XFMPCB + 1 ; write character in B to channel #HL XFMRCH: EQU XFMWCH + 1 ; read character from channel #HL to B XFMCHS: EQU XFMRCH + 1 ; return B=characters in channel, C=space left XFMSHO: EQU XFMCHS + 1 ; shared file open XFMEXO: EQU XFMSHO + 1 ; exclusive file open XFMEOL: EQU XFMEXO ; end of XFM list ; ; Extended File Manager Error Codes ; XMIJOB: EQU 200 ; illegal job number - out of range XMICH: EQU XMIJOB + 1 ; illegal channel number - out of range XMIPRT: EQU XMICH + 1 ; illegal port number - out of range XMNPRT: EQU XMIPRT + 1 ; no std port attached XMPRT: EQU XMNPRT + 1 ; std port attached XMNJOB: EQU XMPRT + 1 ; no open jobs available XMJNO: EQU XMNJOB + 1 ; job not owned by this port XMFPV: EQU XMJNO + 1 ; file protect violation XMFMI: EQU XMFPV + 1 ; FMNGR operation illegal under TSS/C ; ; Spooler Print-Job EC + 2 ; length in sectors PJQLB: EQU PJQLEN + 2 ; bytes in use in last sector PJQSIZ: EQU PJQLB + 2 ; ; Spooler Print-Job definition block, 1 for each job which may output to ; the spooler. ; SPJPJQ: EQU 0 ; Print-Job-Queue entry number or NOTUSE SPJTOC: EQU SPJPJQ + 1 ; time-out counter, refreshed from JCBSTO SPJLB: EQU SPJTOC + 1 ; bytes in use in this sector buffer SPJBUF: EQU SPJLB + 2 ; disk sector buffer pointer SPJSIZ: Etrolling print status ; bit 0: printer temporarily stopped ; bit 1: printer to stop at end of print-job ; PRLCT: EQU PRHLT + 1 ; line counter (PRPLEN..0) PRBCT: EQU PRLCT + 1 ; count of characters in buffer PRPOS: EQU PRBCT + 2 ; position of next character to print PRLEN: EQU PRPOS + 2 ; number of sectors printed PRBUF: EQU PRLEN + 2 ; pointer to tory command structure ; OFDADD: EQU 0 ; add to open file directory OFDEXA: EQU OFDADD + 1 ; search for an exact entry OFDVIL: EQU OFDEXA + 1 ; search for a violating entry OFDDEL: EQU OFDVIL + 1 ; delete an existing entry OFDRST: EQU OFDDEL + 1 ; reset portions of the OFD OFDINC: EQU OFDRST + 1 ; increment the open count of the entry @IY OFDDEC: EQU OFDINC + 1 ; decrement the open count of the entry @IY OFDEOL: EQU OFDDEC nd UDNEXT: EQU UDCPMC + 64 UDSIZ: EQU 512 ; ; CP/M interface data, VOLume definition block; tables swapped to and ; from disk on drive selects ; VOLTYP: EQU 0 ; volume type & status: 00 = never assigned ; 01 = floppy disk ; 02 = hard disk ; VOLOFB: EQU VOLTYP + 1 ; vol Open File Block VOLSBL: EQU VOLOFB + OFBSZ ; CP/M sectors per block at BLqueue definitions ; PJQST: EQU 0 ; status: ; bit 0: complete ; bit 1: being printed ; PJQDEV: EQU PJQST + 1 ; device number PJQJOB: EQU PJQDEV + 1 ; originating job number PJQPRT: EQU PJQJOB + 1 ; originating port number PJQNAM: EQU PJQPRT + 1 ; originating user name PJQSEC: EQU PJQNAM + 14 ; starting sector number PJQLEN: EQU PJQSQU SPJBUF + 2 ; ; Printer / De-spooler definition block offsets ; PRPRT: EQU 0 ; output port number PRTITL: EQU PRPRT + 1 ; print title pages flag PRPAG: EQU PRTITL + 1 ; generate page breaks flag PRPLEN: EQU PRPAG + 1 ; usable page length in lines ; PRPJQ: EQU PRPLEN + 1 ; Print-Job-Queue entry number or NOTUSE PRQCT: EQU PRPJQ + 1 ; number of print-jobs queued for this printer PRHLT: EQU PRQCT + 1 ; flags consector read buffer PRSIZ: EQU PRBUF + 2 ; ; Open File Directory entry structure ; OFDDES: EQU 0 ; OS unique entry identifier OFDOS: EQU OFDDES + 2 ; operating system ID (0..254) OFDJOB: EQU OFDOS + 1 ; job ID (0..254) OFDNOD: EQU OFDJOB + 1 ; *** node ID, NYI, leave 0 OFDSHC: EQU OFDNOD + 1 ; SHARE open count (0..255) OFDEXC: EQU OFDSHC + 1 ; EXCLUSIVE open count (0..255) OFDSIZ: EQU OFDEXC + 1 ; ; Open File Direc ; end of OFD list ; ; Open File Directory open mode attributes ; ATSHR: EQU 32 ; sharable flag, bit 5, sharable when 1 ; ; User Directory Entry Structure offsets ; UDTYP: EQU 0 ; entry type UDNAME: EQU UDTYP + 1 ; user name UDPASS: EQU UDNAME + 14 ; password UDCMND: EQU 128 ; initial HDOS command line UDCPMW: EQU UDCMND + 64 ; CP/M workfile pathname UDCPMC: EQU UDCPMW + 33 ; CP/M startup commaS ; VOLDPH: EQU VOLSBL + 1 ; CP/M standard DPH VOLDPB: EQU VOLDPH + 16 ; DPB VOLALV: EQU VOLDPB + 15 ; volume allocation vector VOLCKV: EQU VOLALV + 129 ; volume directory-check vector (floppies only) ; VOLVDT: EQU VOLCKV + 16 ; volume info dirty flag VOLSBC: EQU VOLVDT + 1 ; unallocated sectors-per-block count VOLBDT: EQU VOLSBC + 1 ; sector buffer dirty flag VOLBTK: EQU VOLBDT + 1 ; track number VOLBSC: EQU VOLBTK + 2 ; sector number ; VOLPAD: EQU VOLBSC + 1 ; start of pad to 200H bytes VOLSIZ: EQU BPS ; ; ; END of TSS/C-EQUS ;