kU-BAMDUA TK1pCPMDIR FL3 [<MTAB FL3eINSWP COM\"rNSWPHINTTXT ( PROUSARTFL32RESOURCECOM"ORESOURCEDOCqREZ80 COM=5REZ80 DOCrWS33 DOCtWS33MSG PATc\ZAP35 COMiRZDT COM8 -BAMDUA.TK1 Thi specia librar volum i Georg Borys "Hacker Patchers disk I contain informativ article o th director structur o CP disks ho t progra th 8251 USAR chip th layou o th MTA tabl i th BIOS an hint o usin th NSW program WS33.DO contain th actua patc addresse fo WordSta Ver 3.3 Als containe o thi dis i cop o th lates versio o NSW (Vers 2.07) versio o th SuperZa progra (ZAP35.COM) versio o DD tha use Z8 mnemonic an tw disassemblers RESOURCE.CO i War Christenson' 808 disassemble an REZ80.CO i versio tha use Z8 TD mnemonics B sur t rea th .DO files!  Ralp W Mathisen Dept. of History Univ. of S. Carolina Columbia, S.C.29208 INSIDE THE CP/M DIRECTORY I th October/Novembe 198 issu o MOR discusse metho o modifyin th dDas I director i orde t retriev dat whic otherwis woul b lost simila metho als ca b use fo th CP/ directory whic i foun o ever dis whic ha CP/ file o an kin o it Althoug CP/ user ar usuall unawar o th functionin o th directory it importanc canno b overemphasized Onl b mean o th informatio i thi director ca CP/ acces th res o th dat o th disk I anythin wer t happe t th directory o i i wer t hav incorrec informatio i i som o al o th files o thei data o th dis coul becom inaccessible Ther ar severa way i whic thi kin o disaste coul happen Sometime th director ca b accidental overwritten perhap b dis driv malfunctio o b accidentall writin o th dis wit non-Morro compute (I'v ha bot happen) Or a abnorma terminatio i th mids o dis writ operatio ca preven th director fro bein properl updated an th dat ma no b eas t recreate especiall i i ha jus bee rea i ove modem o just entered at the keyboard. I i possibl t recove fro thi kind o error however b writin directl t th directory Bu i an change ar goin t b mad i th CP/ dis directory i i firs necessar t kno ho i i organized Unfortunately th CP/ 2. Operatin Syste Use Referenc Manual whic come bundle wit th Morro syste i n hel here I discusse th function o th director (pp.89-12 i m version) bu i doe no discus ho th informatio i th director i actuall organized littl bi o investigation however answers this question. I no migh b stresse tha an alteration i th director requir th us o utilit (suc a DU- 77 whic wil allo th use t acces specifi groups tracks an sector o th disk an bot t rea fro an writ upo them Becaus th use ha complet contro ove exactl wha byt value ar written an exactl wher the ar written thi kin o utilit i no a dangerou a i ma sound! Th 1/ inc single-side doubl densit flopp disk contai 200 byte o 4 track (numbere throug 39) o 5 byte pe track Th physica track ar divide int 1024-byt physica "sof sectors. O m computer Morro M (RO revisio 2.3A) th firs tw track (0-1 ar reserve fo th CP/ system CP/ wil no normall writ dat there Th CP/ system however accesse th dis b logica "sectors an "groups, rathe tha b physica track an sectors I divide th dis int logica "sectors o 12 byte eac (th lengt o th standar CP/ "record") an logica "groups o 1 logica record (therefor eac "group contain 12 1 204 o 2 bytes) Th 3 user-accessibl physica tracks therefore ar divide u int 9 logica group (188 bytes) whic begi wit grou 00 whic itsel begin a th beginnin o trac (tha is a trac 2 secto 1) Thi explain wh th use canno us CP/ t acces track 0-1 fo the ar "hidden belo grou 00 Whic bring u t th directory i i locate a th beginnin o grou 00 tha i a th beginnin o trac (bea i min tha th numberin o th track an group begin wit "0, wherea tha o th sector begin wit "1") Group 0 an 0 ar reserve fo th directory th dat begin wit grou 0 (physica trac 2 logica secto 33) Becaus ther i n obviou correlatio betwee th logica group an th physica track (group an track overlap tha is som group li o tw contiguou tracks) an becaus CP/ work wit th groups th followin discussio wil b writte fro th poin o vie o th "groups, an th 128-byt logica sector containe withi them. Not too tha al reference t "sectors refe t th 128-byte logical sectors no t th 1024-byt physica soft sectors. Th bes wa t lear t wor wit th CP/ director i t b abl t loo righ a it bu failin that thi i ho th individua entrie i th P/ director ar se u (thi i ho th firs entr migh appea whe printe b DU-77): 00 NN NN NN NN NN NN NN NN EE EE EE LL LL LL LL GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG Th firs byt i th entr (byt 00 valu 00 ha th valu 00 i th fil i active th valu E5 i th fil ha bee deleted Thi explain ho fil ca b "undeleted (presumin i ha no ye bee writte over) jus chang th E bac t 00 Th byte liste a "NN (byte 0 throug 08 includ th he value o th nam o th fil (8-characte maximum) an th "TT byte (3-characte maximum contai th he value o th fil extension Blank ar represente b he blank (20H) an ther i n perio betwee th nam an th extension Knowin thi als ca b useful Fo CP/ wil allo som kind o softwar t creat fil wit lower-cas letter i th name bu i wil no allo suc fil t b accesse b CP/ routine suc a PI o eve REN I ca b ver frustratin t discove tha on ha inadvertentl create valuabl fil wit lower- cas letter i th name an the no b abl t acces it T correc th error al on nee d i t writ th nam i uppe cas directl t th CP/ directory. Th "LL value giv th numbe o CP/ record (tha is th numbe o 128-byt logica sectors i th file an ar calculate a follows Th firs "LL (presumabl i hex bu I'v neve ha fil larg enoug t fin out i multiplie b 128 an i adde t th numbe (give i hex i th fourt "LL. Presumably th secon an thir "LL" ar use fo ver larg files bu unde ordinar circumstance thei valu remain 00H Th tota numbe o byte o dis storag use fo th fil ca therefor b calculate by multiplying the sum of the "LL" values by 128. Th "GG value ar th mos important fo the tel CP/ whic group th dat i an fil ar store in Now fo newly-writte fil o freshly- formatte disk th "GG value shoul rea 0 0 0 0 0 an s o (unuse "GG" rea 00) Not tha ever grou tha contain dat fo thi fil mus b cite i th directory an thes group mus b liste i th orde i whic thei dat appear Th group nee not however b allocate b CP/ i sequential o eve ascending order Thi explain ho CP/ ca "find al th part o file eve whe i i scattere al ove th disk I als explain ho CP/ know whic group ar availabl fo dat storage al o thos group not liste a containin dat fo a activ file Not tha eac director entr contain 3 bytes wit 1 o the use fo th grou numbers i fil require mor tha 1 groups CP/ merel write anothe entr i th director fo thi file thi explain th "EXT entr whe on doe "DIR" fo th numbe her i th numbe o entrie i th director (no tha on eve ha muc us fo it!) Not als tha whe CP/ write a additiona entr fo file onl th value o "LL i th final entr ar valid thos i earlie entrie merel reflec th numbe o CP/M record i thos entries Thi explanatio als indicate wh numbe o smal file ca ea u lot o dis space fo th smalles uni tha CP/ ca allocat i on grou (2K) s fil o eve on lin wil us u 2 o storag (d DI o dis wit severa file o varyin length eve th smalles wil hav 2K an al th number wil b even fo CP/ arrive a th amoun simpl b multiplyin th numbe o group use fo storag b two). Arme wit thi knowledge th adventurou use no ca attac mangle directory Th fil nam an extensio ca b writte i easil enough an calculation wil yiel th nunbe o CP/ records whic als ca b entere (thoug hav no foun nee fo grea accurac here) Th toug par ca b i insertin th "GG values Fo CO files thi ca onl b don i on ca reasonabl assum tha th fil wa store i sequential ascendin groups Fo ASCI dat file th tas i relativel easier Simpl us th DU-7 (o whatever searc comman ("= i DU-77 t fin th locatio o th beginnin o th file not dow th grou numbe (i wil b xx.0--her th secto number begi wit "00"!-- fo al file star a th beginnin o group) an ente i int th firs byt i th second lin o th director (a above) The hop tha th nex grou contain th nex sectio o you dat file i so ente th grou numbe i th sam way I not i wil b necessar t pag bac t th las secto o th previou grou t se wher th fil leave off an the us th searc comman t fin th nex part Continu i thi manne unti al th group containin dat fo thi fil hav bee entere int th directory An d not forge t writ you complete director ont th disk yo wil b ver frustrate i yo do Thi procedur nee no b don fo ever fil o th disk onl fo th mos importan ones. Thi metho als ca b use fo thos rar occasion whe CP/ record dat o th wron group/track t correc this on nee onl ente th valu o th correc grou i th appropriat locatio i th directory Thi ca b especiall usefu fo larg file whe th erro occur nea th beginnin o th file. Ther i als anothe us fo thi metho whic th mor adventuresom reader migh wis t try rewritin director o CP/ disk writte b non- Morro computer (includin CP/ 86) bu whic canno b rea usin IBM.COM OSB.COM o XER.COM Firs o all tr th DI comman usin thes variou formats I yo ge rea error forge it Bu i i come bac simpl "NO FOUND whe yo kno there' somethin ou there you'r i business No tr th STA *. command Thi migh a leas lis th name o th file ou there Th nex thin t d i t experiment wit th dis i questio i th B drive execut DU-7 (o whatever i th A driv an loo aroun you disk Yo ma fin (a have tha th director wa jus writte i th wron place o tha th wron number wer inserte fo th "GG values Tr movin th director around an ever s ofte tr th DI comman again Wh knows yo migh ge lucky An i pinch yo ca alway cop th entir disk o a leas relevan parts secto b secto t Morro formatte disk fo whic yo als wil hav t creat you ow director entry But again yo migh no wan t tr thi unles yo hav n othe wa o eve bein abl t rea th foreig dis unde it prope format.*** MTAB.TEC *** by Clarence Heier via SBBS mid-March 1986 Also wil includ genera discussio o MTAB Perhap yo coul distribut an ge feedbac o this I suitabl - g ahead and publish. Thanks, Clarence MTAB.DOC MTAB ANALYSIS Clarence Heier 637 Boston Drive Davenport, IA 52806 Recently ɠ hav fielde severa question regardin th modificatio o th operatin syste whe changin drives Ther hav bee severa ver goo article writte o th variou conversion bu non describin th concep o MTAB Thi synapsi i intende t b quit genera bu deal specificall wit a MD- syste BIO RE 3.1 RO 2. an th MD- syste BIO RE 2.1 RO 2.3 B awar tha ther ar man variation ou ther an your ma o ma no b similar I i expecte tha ver littl o thi informatio i o valu t Har Dis M owners. Driv specification ar supplie t th BIO i sectio calle MTAB MTA mus b modifie i yo chang t differen typ o driv (i.e qua density o i yo wis t quie you drive o make other modifications. MTA contain on byt entr fo eac logica drive Th byte of each entry are defined as follows: Byte 0 DSKDEF0: Bit 0-2 Motor control bit Bit 3-4 Double sided mode: 00=Even tracks on side 0, Odd tracks on side 1. 01=1st 40 (or 80) tracks on side 0, remaining tracks on side 1. 10=Both sides are treated as a single track with twice as many sectors. Bit 5 Double sided drive if = 1. Bit 6 Sectors start a 0 if = 1. Bi Foreig driv forma i 1. Drive A B C C E MD-3 Hex 21 22 21 21 21 MD-3 Bin 00100001 00100010 00100001 00100001 00100001 MD-2 Hex 01 02 01 01 01 MD-2 Bin 00000001 00000010 00000001 00000001 00000001 Th significan bi her i th thir on fro th left I indicate tha yo hav doubl side drive I yo ar changin you MD- o MD- t doubl side drive thi valu mus b change t 1 Usuall thi wil chang th he value i eac o th drive fro t (i.e 0 become 21). NOTE Ther i som descrepanc betwee th fil CBIOS.MA supplie wit th M serie an th wa thes byte ar actuall configure i th operatin system Th MD- syste looke a ha th 2n bi (thir fro right se t fo drive an D Logi woul mak thi 0 th sam a driv an E Byte 1 DSKDEF1: Bit 0-1 Physical drive address. Bit 2 Double sided media if = 1. Bit 3-4 Sector size: 00=128 01=256 10=512 11=1024. Bit 5 Tracks: 0=40; 1=80. Bit 6 Density: 0=single; 1=double. Bit 7 Virtual drive: 1=virtual. Drive A B C C E MD-3 Hex DC 5D DC DC DC MD-3 Bin 11011100 01011101 11011100 11011100 11011100 MD-2 Hex D8 59 D8 D8 D8 MD-2 Bin 11011000 01011000 11011000 11011000 11011000 Bi i significan i changin fro singl side drive t doubl side ones Bi i significan i changin t qua densit drives Bit an ar significan whe addin drive to your system. Byte 2 Motor on wait time in increments of 4 ms. Drive A B C C E MD-3 Dec 125 125 125 125 125 MD-3 Hex 7D 7D 7D 7D 7D MD-2 Dec 88 88 88 88 88 MD- He 5 5 5 5 58 Usuall wil no hav t b changed Moto wil sta o 50 ms befor turnin of o a MD- an 35 m o a MD-2 ɠ don' understand why there should be a difference. Byte 3 Head settle time (after seek) in increments of 4 ms. Drive A B C C E MD-3 Hex 04 04 04 04 04 MD-2 Hex 05 05 05 05 05 Currentl se fo 1 m settl tim fo a MD- an 2 m fo a MD-2 Controlle b th drive specifications Tea 55B' hav a 15 ms settling time. Other DSDD drives are similar. Byte 4-5 The two parameter bytes for the FDC specify command: Byte 4 = SRT/HUT Byte 5 = HLT/ND ND must be 1. Byte 4: Drive A B C C E MD-3 Hex BF BF BF BF BF MD-2 Hex 6F 6F 6F 6F 6F Th mos significan nibbl (th o th MD- an th o th MD- i th ste rat o eac drive Th tabl belo determine ste rate: F = 2 ms B = 10 ms 7 = 18 ms 3 = 26 ms E = 4 ms A = 12 ms 6 = 20 ms 2 = 28 ms D = 6 ms 9 = 14 ms 5 = 22 ms 1 = 30 ms C = 8 ms 8 = 16 ms 4 = 24 ms 0 = 32 ms Mos DӠ drive i a MD- shoul operat wit ste rat o ms Thi wil mak th drive faste an quiete tha before MD-2' generall us Shugar SA200' an the operat a 2 ms D no chang thi wit a MD-2 Tea 55B' hav ste rat o 6 ms minimum. Byte 5: Drive A B C C E Decimal 3 3 3 3 3 Hex value 03 03 03 03 03 Binary 00000011 00000011 00000011 00000011 00000011 MD-3 and MD-2 values the same. Byte 6 EOT byte for FDC read or write commands. Drive A B C C E Decimal 5 5 5 5 5 Hex value 05 05 05 05 05 Binary 00000101 00000101 00000101 00000101 00000101 MD-3 and MD-2 values the same. Byte 7 GPL byte for FDC read or write commands. Drive A B C C E Decimal 28 28 28 28 28 Hex value 1C 1C 1C 1C 1C Binary 00011100 00011100 00011100 00011100 00011100 Byte 8 Current track. Drive A B C C E Hex value FF FF FF FF FF Binary 11111111 11111111 11111111 11111111 11111111 MD-3 and MD-2 values the same. reca o th MTA tabl value appear below I yo ar modifyin you syste t D drive follo th MD- table Th onl byt yo ma wan t chang i Byt i increas th ste rat o you drive an thu quie the down IMPORTANT Othe change ar necessar t ge workin Doubl Side System Thi only deals with MTAB. MD-2 ORIGINAL MD-3 ORIGINAL A B C D E A B C D E Byte 1 01 02 01 01 01 21 22 21 21 21 Byte 2 D8 59 D8 D8 D8DC 5D DC DC DC Byte 3 58 58 58 58 587D 7D 7D 7D 7D Byte 4 05 05 05 05 0504 04 04 04 04 Byte 5 6F 6F 6F 6F 6FBF BF BF BF BF Byte 6 03 03 03 03 0303 03 03 03 03 Byte 7 05 05 05 05 0505 05 05 05 05 Byte 8 1C 1C 1C 1C 1C1C 1C 1C 1C 1C Byte 9 FF FF FF FF FFFF FF FF FF FF T fin wher MTA  i locate o you syste follo th instructions below. indicates hitting the RETURN key. Format and Sysgen a scratch disk. Transfe DDT.CO an SYSGEN.CO ont thi disk Nothin els shoul b o thi disk. Boot the system with this disk. When you get to the A> enter the following command: SYSGEN Sysge wil sig o an wil as fo sourc driv - ente . Sysgen will then ask for the destination drive - just enter a . (No destination.) Sav you sysge imag (i i currentl i memory b entering SAVE 48 CPM64.COM Enter DDT by typing DDT CPM64.COM. DDԠ wil sig on Ente S2344 Th syste wil respond 234 HH Recor th value o HH an ente Th nex respons wil b 234 F7 Ente .?!" .".!^#6#6!M ͼr@Drive :.AQ:.<>*Q>? =__o&S2.@:!.]@ !" .#"+."-.w!=.͊}+h#" .!e2*.+" .#͈".!"."/."1.1=:.2:.d* .#}»@ No files.XL'SʪÀ9*.͈dG!!5~ȸ###^#V:._:.__1*-.@K in #@ files. *+.@K free. u uBXSDTUVPEkL'CM A RcFWY%?Q *.#".* .,Ҁ!".9À*.|+".€9* .".À@ Which drive? @:!AڀQҀ :.GA2.9rw9*+.@K remaining on drive AQ>:Q9x2.rÀ@ Which flags (1-4,R,S,A)? @!o. 6#L!!~ʀ#">.*>.#">.ʊ!o. ʄ#w_>_> 1234zzzzRSA@ Delete file? Y€*.;À͈]2\ `6`__^_:e!@ R/O. Delete? Y:e2e\\_* .*.{ozg))))xV~# xL* .+" .*.,+".@ Erase Tagged or Untagged files (T/U)? TʤU€T>ʬ2 .@ Do you wish to be prompted (Y/N/A)? ʀAʀNY>¯24.!".͈4~G: .f@ Deleting ---> :4.W@ Delete (Y/N/A)? AzYfʃ;h#* .#}z+,!".À!".Ü ~6ʩ#*1."1.*/."/.*/.@K (*1.@K).*.͈4͌u@ Tagged files = *.͈ͩu4~6#*1.~"1.*/.~"/.@ New drive/user/mask? @!!~ʀ#">.:\`:.<=2.:;.y#~*>y:.2.:] ‘!]^ 6?`!\. `992.~ʸV#ª2.@ Illegal drive code.Àͥ:.2;.:.29.~0ں:AںQҺA29.#~:ȷ*:0:'G#~:33036302;.x 2;.>2;.! !!^#6#p#~iwV@ Copy to drive/user? @!!~ʀ r#:D.::.G:;.ʧ:9.G:.@ Can't copy to same drive and user.À*.͈2H.I. `~2:.@ Copy to (filespec)? @!!~ʀ#">.*>.ͥ:] > !I.] ~#4 :\=29.!I.]NT ͙!]I. 怶w#\ !\n. `:.G:9.ʅ  r À@ Squeeze, Unsqueeze or Reverse (S,U,R)? 2.S U R€> 2D.9:.2:. a!͈4~+Fƒ x2:.:D.O :.G:9.O ::.G:;.O @ Skipping, same drive & user --> à :D.s ʊ @ Copying --> Þ @ SQ/USQ --> Þ @ Setting --> @ to :D.) !o. ~ #» !w. ~  ~ # e ~Q#  1 2 3 4 R/W R/O SYS ARC :9.AQ:;.< ::.o& G >:Q:.e @ with CRC.:D.z ʴ } z 6ʜ #* ., 9ñ @ --- Aborted ---ÀH. `~6`2:.d!I.o. ~ww# H.!I. `} !͈4~3 @ Retagging --> > Q4͌#* ., À"@(~#a QS @)~ Q#j ".͵ *."".*. v,­ *.:.U$ R$ *.:.Rʽ U !0͂#*. 0!H.n. 6`!w.~ 6Q#6Q#6Q@(!o.j >.Qj @)s*.!H.͘'}0!0D C @ Not a SQ file.">."B.:;.2;.!\n.6 `s!"| _h *B.,}0@ ERROR - Checksum error in file nngo͵ @ Premature EOF on file... aborted.À0*:9.G:.::.G:;.ȸ!H.n. `2n.!"@.sd*."5.:.–H.l"5.*7.,ܺCͺ}0 |g}o{))))))),*.*7.~y|±}ڳ.&],H.͇"5. ||¥ͺÖ͏ʀl&͇"5.l:.@ Verifying --> R!z.{.6`n..!]~ ʀ ~ µ6?#­@ !/€".À@ Tag what? @!!">.!]~ ʀ@ !/€@ Tagging --> ͈> Q4͌#* .,J͈]N/> ~?\#Q*.͈ ~2:.@ New name, or *? @!!">.!l#~ ʀ ?#¡:;.¶::.w*.͈. r*.* .#" .e2*.+" .".,ڀ!".À:.29.\2\ `d:e9:e2e:u2u\:;._::.F__!mI. `2H.H.*.͊}ʒ@ Destination file exists! rÀ:;.ʢG::.::.___\__!m `::.__!\H. `2H.>?2T.*.H.͊}ʽ" .H.R!mI. `H.!)))))*. T.`H..ý@ Directory full.À<¨!=!o `*7.,@ OUT OF MEMORY?<¨i`@ Old name? @!!">.!.:. ʀ:;.2 .@ New name? @!!">.!n.:o. ʀ9!͈.¢@ Renaming -->  ~2:.@ to !mG:2#* .,R9>. r~ F: .?G># ɯ/o.m> ?~#=:;.::.:.AQ n&} 5 >:QyJ> Qͧ>.QͧJ*.#@. #~#> Q@K : ʢ*ʢ#yQ~Q#§9>2=.92=.<23.@Press ^X to abort, L to advance a line, cr to advance a page. >2<.*.͈ v,!nD*."".!0D D9!"L*.""."bnu>-_ ‚:3.<23.:<.O:=.O:3.G:OLʹlʹ23.O:3.=23.O0ÀO iiX!T.U.6`H.2H. `~2:.d*.""." .H.<@ Can't open file!À__:9._:;._ :._::.^*."&."$."(.R"n.<:w.ʻ:w.2w."!w.E.`6$#6$#6$ ""<@ Destination disk directory full.À!z.{.6`dH.<@ Can't close file!ÀRn."Rn.<=m"!n.~.`!E..`n.<=!E.w.`:Q.G:w.2w.:y.2y.n.*(.*$.G,xw#"$.*$.*&.,R:.,n.Y*$.,*&."$.*&.*$.~}yC#|N}P.],n.V͏%* .*".,ʂ~#"".d*.""." . :.H.¼* ." .—n*".* .,n= ,*".H.͏*"." .n͏ʀl&͇*"." .ü* .!==~V# `~##~#~  x$>[I* .".+|*.|ȯ|g}o".„#".* .+}o|g".!".*.".*.*.".*.*.}o|g".á*.#".*.,oÛ*.͈".*.͈". ~O## *.*.Fwx# |}!".".#".* ." .Q͟h*.".#".* .+" .|E*.͈*.`*.#".*.͈".*.͈". #•*.~ F. x:.?G># ɷ!"-.* .#}!=*-."-. x',?,$?d,2?} =?yRR> Q=G ] |S{0Q }0*0#*0~.Ҙg xʩ|-“#Ï}o|g:*.ʽ)=õ"+.:._.*:GxG|g}o ý^)))))#~&o))))o$#:*.ZK<}>o}}o}}o}#~#`a{_:._<ʀ0`:02*."0L L* .9ͩ9L*>.!\w=L!\*>.:. O0O:77:.Lx,yH,py2;.ͷr#*b6?dwQͷyh#6 r.¢ͷʢ#*’6?ÔwͷʩØ#6 ¢#6«">. =_.:;<> !.!yg)>g>!or$s%# :.~#, *@.O!. ~W$^"@. @ ~#Q@ _{dldr_!u! ~#G~d#z))))= NSWEEP - Version 2.07 07/17/1984 (c) Dave Rand, 1983, 1984 Edmonton, Alberta $ A - Retag files : Q - Squeeze/Unsqueeze tagged files B - Back one file : R - Rename file(s) C - Copy file : S - Check remaining space D - Delete file : T - Tag file for mass E - Erase T/U files : U - Untag file F - Find file : V - View file L - Log new disk/user : W - Wildcard tag of files M - Mass file copy : Y - Set file status P - Print file : ? - Display this help X - Exit to CP/M : cr, sp - Forward one file $"x#"z#!9""c#v]#>2t#2w#c#"~#*x#n͝"Gp#Œ"<"c#"#]#c">*z#"|#|ʓ"c#s#r#c#s#r#*|#+h"1>*x#*~#a{_USQ section (C) 1983, 1984 by Dave Rand (403) 484-4114!9"":w#"=2w#:v#####>==2w#:v#2v#:u#O:t#.#nŒ"O>=2t#yO*z#=###^#Vz#y2u#z>Z#{/|}nŒ"nŒ"go>2+"B,!9",1,*B,}o>͍+"+">,"@,&+2+W+#>Ð'vͨ+#>Ð'}2++|#c+?$!+$#456$~6 $G+~+#6$>+<+6$6$#4~#>+~6+:+2++#:+Q$>+<+*>,^#V#N#zl$#V$>Ð'~*@,w#s#r#q#"+>2+#^#V#N#~#2<,{$:+G*@,#ͮ+ڶ$####Ÿ$y2=,$*+y2=, }O|GT]+++:<,w#s#r#:=,w*+####"+:+<2+„$:+!*%45 %%%#%!*p27,28,l*g2+2+<27,29, '>29,! ,,ͻ+&29,!,:5,͍+::,Nw:6,/< 'G:;, '4x26,&!$,,+!,:5,͍+~2:,:6,&w:9,#%! ,,+#%>26,:*!5,4!'>28,#%~!,͍+~2;,&! ,̈́,2+*+))>͍+ ,",!",!,͒+~w6#w#w#w͒+̈́,!+̈́,*+* ,ͨ+>Ґ'*,* ,:+ʡ'"D,!9",1,!v(*+(!͡+"+*D,#~ ')#'>.)x͍+~ ')#')*+())*+~)#z(2+2+>2+c+v(c+(!+Y(#45v(~6J(G+~(=(v(>(<(v(v(#4~(>(~6(:+2+((:+ʑ(>(<(>́+###(:+ʰ(G:+¨()>2+*+|>(*,((́+F#^#V:+O{_zW:+ ()2+(y2+})|:8,I):+*+*+G:+Os#r#}0) z:)`)%)"+"+y2+!+4~`)2+!+~w:*=Gp)>':8,~):7,¤&!*p:8,#%28,27,#%́+:+w#*++2,,+!"," ,,!,e- ,!,͒+:+!$,͍+4!+5:8,)*+6:+O})7zW{_~*A+~+}* *~)*s#r*+/w#6#"+}!+4>́+###!I*͗)*+>+w+,կ++ä,**x!+4#4#4#4++*o&))*>,4#4#4ɯGO*>,w#w#w#q# ,+!+w#w#w#w#!+++!"+c+oc+gnk+*+͍+"+!+4#4#4*>,G͍+x͍+xo$շ#•+}o|g|}##~+~+~H + +x ~#+x ~++yxX+G]T~w+”,kb ,xG-"L-"N-Hi&)))#"T-!W-^-Aw#,!W-"P-!^-"R-*N-A#,C-A*L-~w#,!T-5,#5G-*P-A~w#-y2V-*R-DM*P-*N-#:V-=2V--?,*P-*R-"P-"R-,7H-*P-xH "-!- "-i`)))#"-A!-6#„-A*-+~w-kbA+~w›-Һ-*-!-Aw#°-!-5Œ-#455Ì-..@comment[from Eugene KUG Newsletter, Sept., Nov., & Dec. 1985 issues] HINTS ON NSWEEP FROM THE HORSE'S MOUTH by Doug Sears I have written about Micro Cornucopia's SOG (Semi-Official Gettogether) before in this publication. During some strenuous excavations in the dark corner of my computer room, I rediscovered my SOG notes in a pile of ancient manuscripts, and now I can tell you about one of the highlights of the SOG, Dave Rand talking about his program NSWEEP. Dave is working on the Definicon 32-bit board for a living (see Micro C #25 and August and September BYTE), but continues to improve NSWEEP in his spare time. You should all have v 2.07; there is a v 2.08 out, an unauthorized update by an unknown person, which should be avoided because it sometimes destroys files. Dave is working on v 2.09, using a smaller, faster SQueeze algorithm, and since that will save about 4K of space, he may add some features, possibly a bidirectional View or a left margin for the Print file command. Dave had some useful comments on how to use NSWEEP. I won't say anything about whether features are "undocumented" or not, because people (me included, of course) sometimes miss perfectly well documented things. 1. To move a file to a different user number, just rename it, and include the user number in the file spec. For example, B0:NSWEEP.COM R B14:NSWEEP.COM . You can also do this with the wildcard rename. I guess you can throw MOVE.COM away now (I dumped SQ and USQ long ago, and use NSWEEP instead). 2. The little-known "Y" command. To understand this command, you need first to know about the mysterious "eighth bit," also known as "bit 7" (counting from 0 to 7), the "high bit," or the "parity bit." Up to now, standard ASCII has been a seven-bit code, leaving the eighth bit of a byte free for other uses (there is a new eight-bit ASCII, but that's the subject of a different article and irrelevant here). In particular, the inner workings of CP/M ignore the eighth bit of each letter you give it in a file name, and then proceed to use some of those eighth bits for marking special files. You will usually not see these high bits, even on '84 model Kaypros which show letters with the high bit set as graphics characters, because directory listing programs also ignore the high bit. If you do "STAT *.*" you'll be shown if there are any Read-Only (R/O) or System (SYS) files. A file which has the eighth bit set on the first letter of its extension is a R/O file. The second letter marks a SYS file, and the third letter marks a file for programs that make backup copies of all files that have been changed (this is the Archive bit). So there you have the "RSA" you see when you try to use NSWEEP's Y command: R for read-only, S for system, A for Archive. Y also lets you change the high bit of the first four characters of the file name, called 1, 2, 3, and 4 in NSWEEP's terminology. High bits in characters 5, 6, 7, and 8 have very special meanings in TurboDos, so they aren't used, in the name of compatibility. Here's a summary for that famous hypothetical file FILENAME.EXT. FILENAME.EXT ------------ 1234____.RSA NSWEEP can display the marked characters in inverse video, underlined, or whatever your screen can display, and NEWSWEEP.COM included in ONKUG vol. 1 no. 9 is already set up for newer Kaypros, the ones with graphics. Unfortunately, '83-model Kaypros show extra "0" characters instead of highlighting with that setup. To simulate highlighting on '83-model Kaypros, you can make the lead-in and lead-out strings be appropriate printable characters, such as "<" and ">". This disturbs the alignment of columns, but it's better than nothing. The lead-in string is at location 104H (length of 0 to 6 at 104H, string starts at 104H). The lead-out string is at 10BH (same format: length plus up to six characters). I recommend SUPERZAP as the easiest program to use for making simple patches like that. Now that you know something about high bits, we can finally get to NSWEEP's Y command. The only trick you need to know is that it only works on tagged files (just like the Q command). So all you do is tag the appropriate file, type "Y", and specify which positions you want to change (any or all of 1, 2, 3, 4, R, S, or A, separated by commas or not). Any bits not specified will be reset back to zero, so if you specify something other than 1-4 or RSA, say some random letter like "k", then all bits will be reset. Some obvious applications come to mind. Sometimes I get Read-Only files from other people, and this saves me from having to hunt up a disk with STAT on it. Conversely, you can set your precious files to R/O to keep yourself from accidentally erasing them. People with hard disks especially might want to look into the programs that use the Archive bit for selective back-ups. You could use one of the other bits just to mark a group of files. for making simple patches like that. Now that you know something about hi**** prou-ad1.023 **** Thi i th revise version receive earl Januar '86. BIO Gre Haveng i recen graduat fro Michiga Technologica University an hold bachelor' degre i Compute Science H live i Gran䠠 Rapids Michigan an i a associat o Meijers Inc Whe he' no gettin gree ta fro terminal h enjoy restoring classic cars, cooking, and playing guitar. Programming the 8251A USART Chip by Gregory A. Havenga [Now wh woul yo eve wan t progra th USAR o you Morrow I yo eve hav reaso t cal mainfram (large central computer you simpl mode progra jus won' do Mos mode program assum tha you'l b communicatin wit micr bulleti board whic requir "8-bit on sto bit n parity"--a agreemen o ho t ge byte across mainfram ma requir somethin lik "7-bit tw sto bits od parity. You' nee t ge mode progra tha wil giv yo th necessar option fo change or handl th proble yoursel b doin wha thi articl wil teac you --Ed.] Thi articl shoul hel thos user wh wis t kno littl mor abou th interna working o thei Morrows Becaus i i writte fo th genera user no jus u technoids mor tha fe term hav t b defined Thi ha th wondrou effec o takin u muc space Th firs sectio wil describ wha th 8251 USAR chi i an defin th term on need t kno i orde t us it Th secon sectio actuall get dow t bras tack b introducin programmin examples. Par 1 EXPLORIN TH 8251 USART Essentially th 8251 i chi tha convert "paralle data fro you computer' microprocesso t "seria data an vic versa Th letter USAR stan for Universa젠 Synchronous/Asynchronou Receiver/Transmitter Th 8251 chi i use i th MD1 MD2 an MD3 i harddis MD's differen chip ar used Befor w ca actuall ge t th subjec o programmin th chip w nee t understan wha i does an wh i doe it Also w nee t defin fe terms th mos importan bein seria an paralle form o dat transmission. Parallel and Serial Data Transmission I paralle transmission eac byt o dat i transmitte al eigh bit a once throug eigh separat wires whil i seria transmission th dat i sen ou throug on wire on bi a time I you compute ha Centronic por ou th bac o i (usuall use fo you printer) yo wil notic (i mos cases tha th cabl connectin th compute an th printe i fla an wide Thi i becaus th transmissio forma i paralle an therefor require (a least eigh wire t carr eac byt o dat fro th compute t th printer (There' lo mor tha eigh wire i tha cable bu discussio o wha th othe one ar i goo topi fo anothe articl Anyon ou ther car t tak sta a it?). Man computer us paralle dat transmissio internally an seria dat transmissio whe the ar sendin t o receivin fro externa equipment That' wher th 8251 come in I function a kin o "switchbox i convertin seria dat int paralle dat fo you compute an vic versa Se th illustratio belo fo typica us o USARTs. Practical Uses of Parallel and Serial Modes Wh us paralle ove seria dat transmissio o vic versa fe importan reason (ther ar more ar 1 speed 2 th distanc tha th signal ca b transmitte䠠 reliabl withou needin砠 outsid amplification an 3 simplificatio o th cable neede t connec computer t device lik modem an printers. A fo speed paralle i generall faste tha seria dat transmission Th reaso fo tha i simple Thin o paralle transmissio a bein lik larg supermarke checkout Man peopl ca g ou throug separat lane al a th sam time Thin o seria transmissio lik grou o peopl standin i lin al waitin thei ow turn Th purpos o th USAR i t conver strin o seria bit int grou o paralle transmitte bit an vic versa. Th堠 distanc tha dat ca b堠 transmitte reliabl thoug regula non-amplifie cabl depend upo th strengt o th voltage used Seria transmission ar stronge tha paralle becaus the ar designe t cove lon distances wherea paralle signals designe t b use withi th computer ar comparativel weak S whe yo us paralle signal t transmi ove lon cables yo ma hav problem Th signal ca loos muc o thei strengt an becom susceptibl t th introductio o nois int th transmission. Th cable use t transmi seria dat usuall nee onl thre wires on t transmi dat i on direction on t transmi dat i th opposit direction an on fo "handshaking. I paralle cable ther hav t b a leas eigh wire fo on wa transmission S fo tw wa dat transmission w nee a leas eigh mor wires plu al th wire necessar fo handshaking etc Thi i wh th cabl i s wid an flat Beside that ribbo cabl i mor expensiv tha mos cabl use fo seria dat transmission. Ho doe al thi relat t ou lowl littl USARԠ o boar th Morrow Well th swee littl 8251 chi ca handl almos an for o seria transmissio o data--becaus i i programmable Now ɠ kno ther ar fe grumble ou ther fro peopl wh se nothin bu hassle wit havin t progra somethin els (afte all jus programmin th compute itsel i difficul enough!) Bu really thi thin i snap However readin Intel' documentatio o i i n fun spen thre day tryin t understan wha the wer talkin about Th chi i designe t b ver flexible bu m experienc ha bee tha flexibilit breed confusion Give te differen way t d something te differen peopl wil implemen th solutio i te differen ways I ou case Mr Morro an cre hav simplifie thing fo us an䠠 w堠 wil concer ourselve wit蠠 th implementatio use fo th Morro Micr Decisio only. Accessing The 8251 USART Ho doe th microprocesso i you Morro tal t th chip I doe i b mean o "por addresses. Whe i want t sen o receiv byt t o fro th USAR chi associate wit th printer/mode connecto o floppy-syste Morrow i use th por addresse 25 an 255--$F an $F i hex Usin thes por addresse i conjunctio wit th USAR i th wa fo th microprocesso t ge throug t th outsid world. Por locatio 25 i wha i terme th USAR Command/Statu port W ca chec th curren statu o th por b readin th valu a th port o se i b sendin valu t th port. Por locatio 25 i th USAR Input/Outpu port Thi i wher informatio i actuall sen t an receive fro th USART. Accessin thes port i don i numbe o way dependin upo wha languag i used I Assembly ( know "yuck Assembl language! sa al yo non- hacker ou there!) ther ar tw command use t communicat wit ports--OU an IN A yo migh guess OU send somethin ou throug th port an I receive somethin i throug th port I Turb Pascal yo hav por array (Bles Phillip Kah fo thi littl gem I yo don' alread hav it ge it ɠ don' us BASI anymore! T sen somethin ou t th port merel mak a assignmen t th por array T receiv somethin fro th port se somethin equa t th port Her i a example: port[255] := ready_for_transmission; Thi put numeri valu store i th variabl "ready_for_transmission ou t th por } while ( port[255] and 4 ) <> 4 do wai fo por t hav th bi thir fro th right to be set to one } Othe language shoul hav simila commands I MBASI an Nevad FORTRAN fo example th command ar IN an OUT wit IN bein functio returnin th valu a th port an OU bein subroutin (o statemen i BASI terminology tha set th por t particula value wil us Pasca terminolog fro no o becaus i i th closes t plai Englis an i eas t conver t othe languages (Also Pasca allow m t sho structure example whic i importan t me bein compute scienc major! Communicating with the 8251A O t th bee o th subject Th procedur fo communicatin wit th chi i outline below. 1 We ge th chip' attentio, lettin i kno we want to program it. 2 We assemble a instructio wor containin th bit se tha wil se th chi u t transmit in the manner we want it to. 3 We check an set th port t th chip. Let' begi b tryin t ge th堠 USART' attentio b resettin it Thi i accomplishe b sendin th th USAR Command/Statu por (255 thre zeros followe b on $4 hex Here' a example: port[255 : $00 Tell por tha we'r } port[255] := $00; { getting ready to reset it } port[255 : $00 port[255] := $40; { Internal Reset Command } Important Terms No tha th chi ha ou attention we'r read t tel i wha t do Th wa w d thi i b settin th bit i byt registe i th USARԠ tha correspond wit th wa w wan t transmi data Ther ar fe term t becom familia wit her s w wil kno wha w ar actuall tellin th chi t do Her ar th terms: Bau Rate--Th spee a whic w transmi data A 30 baud w transmi abou 3 character pe second. Characte Length--Th lengt o th dat (i bits tha w wan t transmit I mos applications thi wil b o bits dependin o th receivin device' requirements Fo communication progra applications thi wil b whateve th hos compute requires M experienc ha bee tha th Sperr mainfram tha hav acces t require dat bits whil mos bulleti board requir dat bit pe character. Parity-- for o erro checking Sometimes i th cours o transmission bi o tw (o more i th transmissio i reall bad! ma ge switche fro bein t 0 o vice- versa Parit checkin i don b addin u al th bit withi eac transmitte byt a i the wer littl numbers Now suppos tha w ar usin eve parit (ther i even od an n parity) I al th bit ad u t a eve number the th parit bi i se t 0 I th bit ad u t a od number th bi i se t 1 makin th tota a eve number I od parity a yo migh guess th opposit occurs--th parit bi i se t mak th tota o al th bit withi th byt a od number Usin n parity th parit bi i stil ther bu i merel ignored (Th parit bi i adde to the left side.) Her ar som examples: 1. Eigh dat bits Eve parit: 10010100 - parity bit set to 1 This is what gets sent: 100101001 2. Seven data bits, Odd parity: 1110100 - parity bit set to 1 This is what gets sent: 11101001 Sto Bits-- bi o informatio sen alon fo synchronizatio purposes I yo loo a th complet signa tha i use t transmi on complet byt o information yo wil notic tha ther ar tw mor bit adde t dat an parit bits Thes ar th star bi an th sto bit Thei functio i t ensur tha th receivin en know whic o th dat bit i which Tha i calle synchronization Th whol trai o bit seriall transmitte start wit star bit followe b o dat bits followe b parit bit followe b sto bit I look lik this: -------------------------------------------- ILLUSTRATION -------------------------------------------- Th star bi i alway "1 an th sto bi i alway "0. Tha i clu t th circuitr i USAR wher th (variable dat an parit bit begi an end Al th bit ar equall lon i tim whe transmitte a "u an down electrica signals excep th sto bit I i th onl bi tha ca hav lengt equa t 1. time o 1. time o 2. time th lengt o eac o th othe bits Th settin o th lengt o th sto bi agai depend o th requirement o th remot equipmen yo wan t communicat with. Necessary Description Conventions Th chip' dat transmission/receptio mod i programme b sendin wor containin th bit se t contro baud-rat factor characte length parit characteristics an numbe o sto bits W mus no establis conventio fo namin th bit i byt i orde t avoi (create? confusion W wil refe t th lef mos bi o a eigh bi byt a bein th sevent bit an a th highes bi o th byte Th right-mos bi wil b referre t a th zeroth o lowes bit Thi notatio i use becaus i represent exactl wha eac蠠 bi represent numerically Th lowes bi represent 2^0 o tw t th zerot power B mathematica convention an numbe t th zerot powe i 1 Th firs bi represent 2^ (tw t th firs power) Again b mathematica convention an numbe t th firs power i jus tha number i ou case 2^ equal 2 Th sevent bi represent 2^ (tw t th sevent powe whic i 12 t u peopl wit 1 finger an 1 toes Thi 2^ notatio i ho ou compute count a eac bi i eithe o zero Thin o th compute a havin onl on finger--o thum i you compute i particularl clumsy (Chec ou boo describin ho computer ar se u an ho the wor i yo ar intereste i ho binar arithmeti i performed It' kin o interestin t kno jus ho dum you compute is I put yo an you compute i th prope perspective--YO ar th boss!) Command Instructions Ok now, what bits mean what? Consider our command instruction (one byte). *-------------------------------* | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | *-------------------------------* Bit an contro th numbe o sto bits (We'l ge t th bit marke "X a w g along.) *-------------------------------* | 0 | 1 | X | X | X | X | X | X | *-------------------------------* 1 Stop bit *-------------------------------* | 1 | 0 | X | X | X | X | X | X | *-------------------------------* 1.5 Stop bits *-------------------------------* | 1 | 1 | X | X | X | X | X | X | *-------------------------------* 2 Stop bits Bit 5 Sets either Even or Odd parity. *-------------------------------* | X | X | 0 | X | X | X | X | X | *-------------------------------* Odd Parity *-------------------------------* | X | X | 1 | X | X | X | X | X | *-------------------------------* Even Parity Bi Enable parity Fo eve o od parity this bit must be set to one. For none, zero. *-------------------------------* | X | X | X | 0 | X | X | X | X | *-------------------------------* No Parity *-------------------------------* | X | X | X | 1 | X | X | X | X | *-------------------------------* Parity Bits 3 and 2 control character length. *-------------------------------* | X | X | X | X | 0 | 0 | X | X | *-------------------------------* Character Length 5 bits *-------------------------------* | X | X | X | X | 0 | 1 | X | X | *-------------------------------* Character Length 6 bits *-------------------------------* | X | X | X | X | 1 | 0 | X | X | *-------------------------------* Character Length 7 bits *-------------------------------* | X | X | X | X | 1 | 1 | X | X | *-------------------------------* Character Length 8 bits Bits 1 and 0 control the baud rate factor. *-------------------------------* | X | X | X | X | X | X | 0 | 0 | *-------------------------------* Synchronou Mod fo IB - typ data formats *-------------------------------* | X | X | X | X | X | X | 0 | 1 | *-------------------------------* Clock rate * 1 *-------------------------------* | X | X | X | X | X | X | 1 | 0 | *-------------------------------* Clock rate * 16 .pa *-------------------------------* | X | X | X | X | X | X | 1 | 1 | *-------------------------------* Clock rate * 64 Fo th Morro MD3 Rev 2 th bau rat facto shoul b se t th Cloc rat 1 setting Settin th bau rat shoul b don wit th bau rat generator Th documentatio o ho t d thi ca b foun i tw differen place tha kno of Th firs i righ i th firs issu of-- yo guesse it--MOҠ (Vol 1 #1 Apri 1984 p 16 i Dav Block' column Th othe plac t fin thi i anothe Dav堠 Bloc렠 creation/publication Micr Decisio Question an Answer (availabl fro Morrow Inc.) PART 2: PROGRAMMING EXAMPLES A las w ca loo a som programmin example tha sho actua softwar manipulatio o th 8251A Th followin i writte i Turb Pascal bu hav trie t us meaningfu variabl name an hopefull clea logi s tha i shouldn' b to har fo someon t translat thi fro Turb t anothe language Yo ca se u th chi t transmi dat i th followin format Th bau rat ha bee specifie b runnin th progra SETUP Th followin specificatio i fo dat bits eve parity an sto bit Th mod instructio wor shoul loo lik thi whe w ge done: *-------------------------------* | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | *-------------------------------* .pa This is affected by the following code: program set_it_up; var baudrate, stopbits, parity, wordlength : integer; {************************************************* * * * p r o c e d u r e i n i t i a l i z e * * * *************************************************} procedure initialize_USART_mode( baudrate, stopbits, parity, wordlength : integer ); (Th cod i thi procedur i par o progra copyrighte b myself bu th method use ar commo an ma b use b anyone However i woul b greatl appreciate i credi wer give t th author Som codin styl ha bee sacrifice t fi th MO 5 colum requirement Thanx Gre Havenga) const USART_command_status = 255; var program_word : byte; { this is where we will store the Mode Instruction } begin { procedure*initialize_USART_mode } { set all bits in the instruction word to zero } program_word := 0; { set baud rate factor to Clock * 16 } program_word := 2; { Set first bit in byte to 1 } if wordlength in [ 5, 6, 7, 8 ] then begin case wordlength of 5 d nothin - leav bot bit an at zero } ; 6: program_word := program_word or 4; { set bit 2 equal to 1 } 7: program_word := program_word or 8; { set bit 3 equal to 1 } 8: program_word := program_word or 12 { set bits 2 and 3 equal to 1 } end { case } end else begin writeln( 'Bad wordlength, 7 bits assumed ' ); program_word := program_word or 8 end; { if } if parity in [ 0, 1, 2 ] then begin case parity of 0: { none - leave bits 4 and 5 equal to 0 }; 1: { odd } program_word := program_word or 16; { Set bit 4 equal to one } 2: { even } program_word := program_word or 48 { Set bits 4 and 5 equal to one } end end else begin writeln( 'Bad Parity, even assumed ' ); program_word := program_word or 48 end; { if } if stopbits in [ 0, 1, 2 ] then begin case stopbits of 0: { 1 } program_word := program_word or 64; { Set bit 6 equal to 1 } 1: { 1.5 } program_word := program_word or 128; { Set bit 7 equal to 1 } 2: { 2 } program_word := program_word or 192 { Set bits 6 and 7 equal to 1 } end end else begin writeln( 'Bad Stopbit selection, 1 assumed ' ); program_word := program_word or 64 end; { if } progra Uar } port USART_command_status : program_word end; { procedure initialize_USART_mode } begin { main*program } baudrate = 300; stopbits = 1; parity = 1; wordlength = 7; initialize_USART_mode( baudrate, stopbits, parity, wordlength ); end. Well tha conclude th progra tha describe ho t se th USAR communication mode No w ca mov o t actuall communicatin usin th USART W nee t kno ho t d fou things: 1 Chec th statu o th Command/Statu port Thi don b usin th followin code or some equivalent. variable := port[255]; W ca perfor logica AN an O operation o th bit usin th followin logic: bit_two_set : boolean; { true/false } . . . bit_two_set := ( port[255] and 4 ) = 4; bit_two_se wil hav th valu tru i bi tw o th command/statu por i set false otherwise. 2. Se bit i th command/statu port Jus follo th sam logi a give fo settin bit fo th mod instruction Se progra above for details. 3. Receiv dat fro USAR I/ port Thi i don i th followin manner W wan t wai fo th command/statu por t tel u tha i ha byt fo us A thi point w retriev the byte from the I/O port. enable_for_rea ha th correc bit se to ready the I/O port for a read } port[255] := enable_for_read; { wait for data } while (port[255] and 2) <> 2 do port[255] := enable_for_read; { retrieve data from port number 254 } byte_of_data := port[254]; 4. Sen䠠 datᠠ ou th I/Ϡ port Thi i accomplishe b logi simila t # abov wit th followin code. { set value of byte to be sent } byte_of_data := ord( 'A' ); wai fo por t b read fo transmission of byte } while (port[255] and 4) <> 4 do { wait }; enabl USAR I/ por fo transmissio o byt b settin th appropriat bit i the Command/Status port } port[255] := enable_for_write; { send byte out port } port[254] := byte_of_data; Interpreting the Status of the Port Belo ar description o wha happen whe particula bi i se i th Command/Statu por b writin byt t it. BIT DESCRIPTION --- -------------------------------------- Ente Hun Mod - Use fo synchronou communication only. 6 Interna Reset - B careful thi i wha w us fo resettin th chip onl d thi whe yo wan t rese th chi i orde t se th chip' communicatio mode. Reques t sen - Set th RT pi o th chi t zero Use t contro th RT pi o th seria por t zer. Fo a actua DB2 pi number consul you owner manua, Appendi D. Erro Rese - Mak sur thi bi i se whe yo wan t se bit and/o 2 Ha th effec o resettin erro flags Mor on the error flags in the next section. 3 Sen Brea Character - Se thi bi t forc th signa o th Tx pi o th chi low Us zer i thi positio fo norma operation. 2 Receiv Enable - Se thi bi whe yo wan t b abl t receiv byt fro por 254 Don' forge t se bi alon wit thi on o i won' work. 1 Dat Termina Read - Settin thi bi force th DTRba pi o th chi t zero Correspond t pi o th DB2 connector. Se Appendi o you owner' manual for an actual connector pin number. 0 Transmi Enabl - Se thi bi whe yo wan t transmi characte throug por 254. Th followin tabl explain th meanin o eac bi o th byt rea fro th Command/Statu port. BIT DESCRIPTION --- -------------------------------------- 7 Dat Se Read - Whe thi bi i set i indicate tha th DS pi o th chi i a zer (low level Th DS pi i connecte t th DB2 connecto o th back of the machine. 6 SYNDET/BRKDE - Use fo synchronou communication only. 5Framin Erro - Thi fla i se i vali sto bi i no detecte a th en o ever character T rese it us th Erro Rese bi whe sendin th nex instructio t th Command/Statu (255 port. 4 Overru Erro - Thi fla i se whe th nex byt arrive fro th seria por befor th las on i rea fro it I yo ge thi one you othe logi i to slo t kee u wit th dat rat comin int th port Decreas bau rate o optimiz you code Rese wit Erro Reset as above. 3 Parit Erro - Thi fla i se i parit erro i detecte a pe th discussion of parity appearing above. Reset with Error Reset as above. 2 Tx - Thi bi i se i th I/ por i fre - read t accep th nex byt fo output. 1 RxRD - Thi bi i se i ther i byte at the I/O port ready to be read. 0 TxRDY - Thi bi i se i th I/ por i fre - read t accep th nex byt fo output. Review S let' recap Th procedur fo usin th USAR i a follows First d maste reset ge th堠 chi read t accep communication mod instructio - creat th instruction settin th appropriat bits Sen tha t th Command/Statu port The chec th statu o th Command/Statu por t se i yo ca transmi o nee t receiv byte Se th Command/Statu Por t th appropriat value settin bit t allo eithe readin o writing dependin o whic functio yo wis t do The eithe sen byt t o receiv byt fro th I/Ϡ port Continu t monitor the se th Command/Statu por sendin o receivin byte unti yo ar throug usin th por fo dat transfer. .pa That' abou al ther i t workin wit th 8251A I reall doe hav som goo feature (eve thoug ɠ hea Zilog' SI an PIϠ chip ar eve nicer An MD1 owner ou ther wit som insid scoop?) I anyon spot an error i thi article pleas writ t m s tha ca mak sur tha th materia presente her i vali an correct (I ther ar significan corrections wil submi the t MOR. hop tha thi articl ca hel yo becom mor familia wit th interna working o you compute t mak i eve mor enjoyabl t use Shoul an question aris concernin thi article sen Self-Addresse Stampe Envelope an wil tr t answe you question a soo a bes can Hav Goo One an goo tomMorrow! Gregory A. Havenga 1212 Jasper Ave. Houghton, Michigan 49931 (906) 482 - 1421<== 103H IS RESTART ADDR RESOURCE by Ward Christensen (AS OF 03/03/81) (C) Copyright 1981 Type H for help, -H to delete help $"Permission for non-commercial use and distribution of object code granted"1(# p x24262!1(ͬ!N~ ʸ=ʕ-.N;ʹ/ABCʕDʽEʻFʏ HI8KL MNO PʪQvRD S UXtZ ? S? :O ڋ2SC/R = L command 2O:2N:,S++Help has been deleted++ :OHd:H!6I#")wG#w#<w#2*D}!&"/OxGwx># 1"##6S++Already deleted++ !N*"SY/N purge all symbols & CTL?:NYNt!O~ ʋT ,‹#>24Z ORG z%{>HT ‹*##~++~#~ +~#~d#F#~+Ap#~+p-pF>24#~.Z EQU ~%+~T%W>H24##~ #ͬd>26N !O~# ‡Congratulations, you found the patch area!**"!O~ Sʜ=,*"  ,‹#"*"*" ‹*ͬ ~#}}}.~ TV>.#}hI"::##",  Ë!P~.´Dҷ*F÷*^#V#~ F#~#ͬ÷:727SNo Saddresses will print as comments * !O~  ‹"!O~ ʋ S,S ‹# ‹*##~+~+w~~w#~w+##~#oa$a:5/2\2h!O:P ʋ:³:O@2\##]~*"Ç~ #.~ .#> >2;2<>2<2;2<2;24:22 !O~ [,O O=q" [ O,‹#" 2 ͬ: o:=}* :: :;**:NMž>A2Nê~#ž~#Ҫ+ *>Bͫ>Iͫ*|*##F>24͏#~\*͖+###~29IgE #^#V*Q"D24SʔHBWS: INVALID CTL ENTRY ͵24[#{ʋ22~#,8 8 Ë:/o: /g#>24ZDS |%}>H"[>24ZDW **^#V*##"[[2:<24ZDB **:9H~ 6  r 6 %>H::2:; 0#*#":DS :E *͖::2:>,>'::<2:~~'#*#":D  :E *͖ ::<2:&  +~# ~  >'E >'[SSYMTBL=* * SPC =* SOFFSET=* *|G SCOMNTS=* * SCTLTBL=* ~###24ZEND 24:5>Ͳp25S++ASM FILE CLOSED++ ͌:5/"e >2!.͇n .‘ *̈́ "##6:! +͇q1͇( *:5 \ :« S++TRUNCATED TO AVOID BDOS OVERLAY++  + q1‹͉*̈́ "6#6 S++NO, THAT WOULD OVERLAY THE DISASSEMBLER BECAUSE OFFSET IS TOO SMALL:  ʇ ʇ ʇ s#r## ʺ ʺ w#ç pÇ  f: 0))))of ͌" .͇>2!.r *O^#V#~#G6 V > Ͳ~Ͳ# > Ͳ> Ͳ >Ͳp:!:eD+͇/zͲzͲ{Ͳ{ò+/1%‹>2524OS++WRITING .ASM ENABLED Use Lfrom,to (or QLfrom,to for quiet) to list to disk Use Z command or E control to close the file++ ͉*##6* S++NO FILE ACCESSES PERMITTED UNTIL .ASM CLOSED S++UNEXPECTED EOF !eâ!ew# Œ!O~ ʸ/-P@ ʲ ʿ,‹#~ͽ*(͖S++None to change, I went back 40 ^#V#~++ͫ~ ,‹#"> 2O !P~ ʋ">,‹#,‹#"B"@*B~#~,‹#*>ͽ*>">~#,j ‹*@*>}|ͬg͖+ڸ###Ѿ2=͖ :=ZK‹G !~#+<w#+++IWBSEH:=Kʋ‹*~###<###*|/g}/o+++^!+~{@z@`is#r#:=w##wS++CTL TBL FULL: INVOKING "/" TO COMPRESS IT++ *~#+<7#z+¬{###Ù͖û*ͬ^#V#z<G ͖~#>: >,~#û*~#<#~IW#!#O*^#V#z,Ͳ~Ͳ> Ͳ> Ͳ#5>Ͳp:!1͇*ʪ,ʞ:ڎ0))))o}s#r#w#w6#6:!G Ë ͉!O~;#~ 9# 3 ,‹d~ *s#r##w #"6#6p*~#+<7#z+){##~ #<*ͬ^#V#z< >;F#~T#<~#<+T]##~ #~#O24*͖ښH~+ʙ-ʙ# d4>::7ʓ͊͊͏* Ú24* >24͊Q**" *#"~G!P~ʜO#~#~2=#~.*:= # #"_!* BENW`lþ%TZ`t͊͊͊͊ͅo͊* #" * ~ ڢ[Ң:=ڢҢ~>'͊͏~ ڳ%>H0͊* ~͔͖ͅ:<4:7͊͏z>0 z%{>H{ %0 ͊:;:=͔JO>Iͽ>WD>BDͫ%ͫ͊* ~0͊* ~ͅ~H>,> >;* #^#VZDB >2=v* ~!> ~#~.>''* ~~>S>PZPSW* ~* ~!N ~o$>0~#4NZZ.NCC.POPEP.M.BCDEHLMAACI.ADC.ADD.ADI.ANA.ANI.(C...'CALL/CMA.?CMC.CMP.CPI.'DAA. DAD.DCR. DCX.DI..EI..vHLT.IN..INR.INX.(J...'JMP.:GLDA. LDAX*LHLDLXI.@ MOV.MVI.NOP.ORA.ORI.OUT.PCHLPOP.PUSH R...RAL.RAR.RET.RRC.RLC. RST.SBB.SBI."SHLDSPHL2GSTA.STAX7STC.SUB.SUI.XCHGXRA.XRI.XTHL!L6L#z{!LDs#r*T]xo|g"##6++DM*F{,z3 "s#r#p#w;*##~#ʌx‚O͢qڌ~#oI$I++ѷO͢eÌH͢ʌe++"F7*~#¤~ʳ#~7#oҙ$Ù#~#G7!O~ ,‹#~+.‹͚! "">2xV͖7!O~#+ +6.#HH!O~#~ &ûHT]+- : Qw#HS++NO SYM WITHIN 129 BYTES !~02*~O++!OÓw# w#w# 0|}> ~09 +- , ~#+9-F+Tz/W{/_~#ʴ.ʸ$@~*0ڋ:ڇAڋGҋ0))))o#l~*0ڋ:ҋbk)))0_|W#Õ>22Dڋ^#V*#~!"H2|\w$\\<ʋ2|!"H\œ\ > >*_:6:5!4{IJ{ :  !5L>N !M^#6 !M#~ ,Ha,{,_w,:O;,2426~~ n#~[#ͬ*"##6> 2O*+6I#6#6*|"6#6# ¢ S ABORT Y/N _Y ȷ ?/)/ ???ASMCOMCTLSYMDOCa,{,_w,:O;,2426~~ n#~[#ͬ*"##6> 2O*+6I#6#6*|"6#6# ¢ S ABORT Y/N _Y ȷ ?/)/ ???ASMCOMC#~ bG!e~# 7~7~~# G~ GGS Use ^S to stop/start help, C/R to quit A symbol is always preceeded by a ".": .BDOS A hex number has no "H": 5C All numbers default to hex. Use "#" for decimal numbers: #99 Use "$" or "@" for curr P.C.: L$-20 Arithmetic may combine any of above, with "+" and "-": L.FOO-#20 bracketed operands ([,addr]) are optional carriage return means same as L Use =x to change it to another 1-letter command -H Delete help function (pick up about 2K bytes) -nn Back P.C. up nn =x Change C/R to mean "x" ? Show statistics . Sort symbol table / Slash redundant I/W from ctl ; Dump comments table ;addr,\comment\ Put in comment ;addr, Delete comment ;;addr,\comment\ Enter lower case comment A[addr][,addr] Attempt to find DB/DW/INSTR B[addr][,addr] Build dflt syms C Dump ctl table Caddr Dump ctl from addr Caddr,type Add ctl entry (B,W,S,E,H,I) Caddr,K Kill ctl entry C/ Del most recent ctl C-n[,addr] Back up most recent ctl by n optionally, Laddr CPloaddr,hiaddr,type,length[,type,length...] Enter a pattern of control entries D[addr][,addr] Dump memory D=nn Change default dump size DS[.symbol] Dump symbol table Eaddr,.symbol Enter/replace symbol into table Eaddr,+ Enter sym as nearest lower + offset Faddr[,startaddr] Find 1st occurrence of addr F, Find next occurrence H Help with commands See also "-H" Hx Help with command "x" Iaddr,offset Increment every symbol from addr on, by "offset" K.symbol Kill symbol entry L[addr][,addr] List (Disassemble) L=nn Change default # lines in list M[addr][,addr] Make a DB then list (Disassemble) N No address comments toggle O Show current offset Oaddr Set offset for disassembly Ploaddr,hiaddr Prolog: ORG loaddr, EQU's for all syms now betw. lo - hi Q any command Quiet mode (no console out) Rname.type Read .COM, .DOC, .CTL, OR .SYM file Set offset before reading a .COM Set "Uaddr" before reading a .DOC Rname.* Read name.SYM, name.CTL, name.DOC Sname.type Save .ASM, .DOC, .CTL, OR .SYM file When saving .ASM, use "Lfrom,to" to list to disk, then "Z" to close the file. Sname.* Save name.SYM, name.CTL, name.DOC Uaddr Use addr for base of comments table X Purge all symbols and control Z Close .ASM file  RESOURCE A disassembler for 8080 programs by Ward Christensen CP/M U.G. 1/80 Suggestions? Call me eve's at (312) 849-6279 ---------------- RESOURCE commands are inconsistent at best. - RESOURCE is a kludge based on years of disassembler experience and hacking, and was never "planned" - just coded sitting at a tube, and modified over 2 years before being contributed to the CP/M UG. For example, to kill a symbol: k.label but to kill a control value: caddr,k and to kill a comment: ;addr, but RESOURCE does the job like no other I have seen. ---------------- N-O-T-E: Pardon the editorial, but I feel hardware without good software is useless to 99% of us. Most good software has to be paid for. I strongly support the legitimate purchase of licensed software. I do not regularly use any programs which I have not purchased. (Yes, I do occasionally "try" one, but then buy it if I plan on using it). I have been asked by software businesses to NOT distribute RESOURCE - because of it's ability to produce good .asm source quickly. But, there are so many disassemblers out, why not a good, conversational one? Please use it in the spirit in which it was contributed: to enlarge your understanding of the micro- computer world around you, and to allow you to customize programs which you legitimately own, for your own use. "Semper non rippus offus" ---- NOTE: any command taking a hex address (Dnnnn, etc) may take a value in the form .label but arithmetic may not be performed. (i.e. d.start is ok, but d.start+8 not) ---------------- Overall structure of RESOURCE: It is a .COM file, which runs at 100H. It goes thru 1700 or so, then the stack. At 1800 is a 512 entry table for control commands. Each is 3 bytes long, and controls the format of the re-sourced list, i.e. is it DB, DS, DW, instructions, etc. At 1E00 is the start of the symbol table. It has no defined length as such. If it is not used, it occupies only 2 bytes. If you want to re-source something which is in memory, such as a PROM, a program previously loaded in high memory, "CP/M itself", or whatever, you can just do so. However, typically you want to disassemble a program which runs at 100H, which is were RESOURCE runs. Bob Van Valzah would have solved that by making resource relocatable and moving itself up under BDOS. I wasn't that industrious. Instead, RESOURCE uses the concept of an "invisible" OFFSET. After all, what do you care where it is as long as it LOOKS like it's at 100h? So, you set an offset. O2F00 sets it to 2F00 Hex. Reading a .COM file (RFOO.COM) causes it to come into 3000 on. If you say D100 or L100 it dumps or lists what LOOKS like your program. Internally, RESOURCE is adding the offset to the D and L addresses. What should you set the offset to? Well, that depends upon how many symbols you will use. O1F00 will load the program at 2000, thus allowing only 1E00-1FFF for symbols, i.e. 512 bytes or about 50-60 labels. If you didn't leave enough space, then used B to build a default symbol table, the table could run into and clobber your .com file! (easy recovery, however: just change the offset to being higher, and read in the .COM file again) Each entry takes 3 bytes + the symbol length, and if you like 7 byte labels like I do, that means 10 bytes/label. An offset of 2F00 should be adequate. If you want to put comments into the disassembled program, you will have to designate an area to Use for the comments. The U command (e.g. U4000) specifies what area is to be used. Before issuing the O (offset) command, do: L5 7 which will show the JMP to BDOS, which is the highest memory you may use. (Note if you have, for example, an empty 4K memory board in high memory, you can Use THAT for comments). Let's take an example: You have an 8K file, FOO.COM which you want to disassemble. It will have about 300 labels. 300 x 10 is 3000, or call it 4K (what's a K unless your tight). The symbol table starts at 1E00. 4K more is 2E00. Let's load the .COM at 2E00, so since it normally starts at 100H, the offset is 2D00. O2D00 is the command. We then RFOO.COM to read it in. It says 4E00 2100 which means it came into actual memory to 4E00, but 2100 if we are talking with respect to loading at 100. Thus, we could set our comments table up after the .COM program - say at 5000: U5000 The ? command shows the memory utilization for control, symbol, and comments entries. (no, I never put in anything to keep track of the .COM - you'll just have to do that yourself). If you ever want to dump real memory, you'll have to reset the offset to 0: O0 but then set it back. If you are not sure what it is, typing O will tell the current offset. Hoo, boy! Hope this kludge of documentation is enough to get you going - hmmm, better give you some of the gotcha's I've discovered... ---- WATCH FOR ---- * Symbols overflowing into the .COM. (Use ? command to see how full symbol table is) * Control entries overflowing into .SYM (altho I can't believe anyone will have a program with more than 512 control entries!!!) * Comments overflowing into BDOS (ug!!) * Using an offset which is not in free memory and overlaying BDOS or whatever. * The B(uild) command gobbling up too much when building a DB: "B" will take a DB 'GOBBELDY GOOK' followed by LXI H,FOO and take the LXI as a '!' (21H) so you'll have to manually stick a new "I" control entry in at the address of the LXI. You might also delete the incorrect "I" entry which RESOURCE stuck in (typically at the second byte of the LXI) * Trying to dump real memory without setting the offset back to 0. (then forgetting to set it back to its proper value) * Forgetting how big the .COM file you are disassembling was. * Using RESOURCE to rip off software (yes, I know, you heard that before, but only 3 in 100 needed to be told, and 2 in 100 needs to be told again, and 1 in 100 doesn't give a rat's fuzzy behind anyway!!) * Forgetting to take checkpoints when disassembling large files. You may even want to rotate the names under which things are saved: STEMP1.SYM STEMP1.CTL STEMP1.DOC * Missing a label: Suppose you have a control entry for a DW, resulting in: DFLT: ;172C DW 100H but somewhere in the program, the following exists: LDA 172DH Even if you did a B and have a label L172D, it won't show up since it's in the middle of a DW. Instead, do this: K.l172d kill the old label e172d,.dflt+1 put in the new label as a displacement off the beginning. * improperly disassembling DW's (see previous item). You might be tempted to make DFLT a DB so that DFLT: ;172C DB 0 L172D: ;172D DB 1 Note that while this disassembles and reassembles properly, it is not "as correct" as the technique used in the previous item. * Having the "B" command overlay your "E" control entry. What? Well, "B"uild is pretty dumb. If he finds 8 DB type characters in a row, he fires off a DB from then on until he runs out of those characters. Suppose your program was 200 long (ended at 3FF), and you had zeroed (aha! Nice DB candidates) memory there (there meaning at your offset address + whatever). Then you QB100,400 and viola!! RESOURCE overlaid your "E" control with a "B". ---------------- RESOURCE is relatively complete. (well, actually, the phrase "rampant featureitis" has been "mentioned"). ...But there's always another day, and another K... SO... Here's my "wish list" ..it might save you telling me YOU think such-and-such would be nice... * Targets of LHLD, SHLD should automatically be flagged as type DW in the control table. Ditto LDA and STA as DB or as second half of DW. Ditto targets of LXI as DB (?). * E5C,.FCB followed by E6C,.FCB+ should automatically calculate the appropriate displacement, and put it in the symbol table. * The comments facility should be enhanced to allow total SUBSTITUTION of entire line(s) of the code, i.e. at address such-and-such, replace the next 3 bytes with the following arbitrary line. This would help those "how do I explain what was being done" cases such as: LXI H,BUFFER AND 0FF00H * Add the ability to, in one instruction, rename a default (LXXXX) label to a meaningful name. ---------------- RESOURCE types an "*" prompt when it is loaded. You may then enter any of the following commands. Each command is a single letter followed by operands. Commas are shown as the delimiter, but a space will also work. ---------------- ---------------- ; Put comments into the program. (must execute 'u' command first, to assign area for comments to be placed) ;addr,comment enter a comment ;addr lists existing comment ; lists entire comments table ;addr, deletes existing comment note that '\' is treated as a new line, i.e. \test\ will be formatted: ; ;TEST ; ---------------- Attempt to find DB's while listing the program. - This command works just like 'L', but attempts to find DB's of 8 chars or longer. (see 'L' command for operand formats) ---------------- Build default sym tbl (LXXXX) labels for each - 2 byte operand encountered. Note 'B' is identical to 'L' except labels are built. (see 'L' command for operand formats) ---------------- Control table usage: - c dump ctl tbl cnnnn dump from starting cnnnn,x define format from nnnn to next entry. values of x: B = DB (attempts ASCII printable, 0DH, 0AH, 0) W = DW (attempts label) S = DW to next ctl entry I = instructions K = kill this ctl entry E = end of disassembly NOTE every control entry causes a "control break" (NO, RESOURCE was NOT written in RPG) which means a new line will be started. Thus if you have a string in memory which disassembles as: DB 'Invalid operand',0DH DB 0AH You might want to change it putting the 0DH,0AH together on the second line - just enter a "B" control entry for the address of the 0DH. The same technique could be used to make DB 'TYPESAVEDIR ERA REN ' appear as DB 'TYPE' DB 'SAVE' DB 'DIR ' DB 'ERA ' DB 'REN ' ---------------- dump: - dxxxx Dumps 80H from xxxx on daaaa,bbbb Dumps from aaaa thru bbbb d,bbbb Continues, thru bbbb d Continues, 80H more NOTE 80H is the default dump length. If you have a larger display, you can change the default via: d=nn nn is the HEX new default. For example, a 24 line tube could display 100H: d=100 or.. d=100,200 Defaults to 100, dumps 200-2ff ---------------- enter symbol: - ennnn,.symbol symbol may be of any length, and contain any char A-Z or 0-9, or "+" or "-". This allows: E5D,.FCB+1. Note the "+" is not checked, i.e. E5D,.FCB+2 would be wrong (assuming FCB is at 5C) but would be allowed to be entered. Note if you enter two symbols for the same address, whichever one is first alphabetically will show up on the disassembled listing. If you have a label which has the wrong address, you need not explicitly kill the old one before entering the new. A label which is spelled exactly the same as an existing one will replace the existing one even if the addresses are different. ---------------- Find occurrence of address or label. Note this function - runs until interrupted (press any key). fnnnn,ssss find address nnnn in memory. Start the search at ssss. Runs forever. Press any key to stop. f continue previous find command fnnnn find nnnn starting at address you last stopped at in the f command ---------------- kill symbol from table - k.symbol ---------------- list (disassemble). This command is used to list the - file, or to list it to disk after enabling the .ASM file save via 'SFILENAME.ASM' command l lists 10 lines from prev pc lssss,eeee lists from ssss to eeee l,eeee lists from current pc to eeee lssss lists 10 lines at ssss Note that if you have a control 'e' entry, then the list will stop when that address is found. This allows you to 'lstart,ffff'. The 10 line default may be changed via: L=nn where nn is a HEX line count, e.g. L=14 set to 20 lines/screen You can change the default and list, e.g. L=9,100 Dflt to 9 lines, list at 100. NOTE when using L to list the .ASM program to disk, you should either list the entire program at once using: Lssss,eeee or, you can list small pieces at a time. As long as you list again without specifying a starting address, (L or L,nnnn) then the output file will continue uninterrupted. You may do dump commands, and others, without affecting what is being written to disk. ---------------- offset for disassembly - o print current offset onnnn establish new offset (note the offset is always added to any address specified in an a, b, d, or l command. to dump real memory, the offset must be reset to 0 (O0) before the dump.) ---------------- prolog generation - this routine generates an - ORG instruction, and equates for any label outside of a given low-hi address pair. (the start and end addresses of your program). e.g. if disassembling from 100 to 3ff, it will generate 'fcb equ 5ch' if FCB is in the symbol table. In typical use, you would 'sfilename.asm' then use the P command to write the prolog, then the L command to write the program itself. Pstart addr,end addr quiet command: any command which is preceeded by a q - will be done 'quietly'. For example, to save a .asm program, you could just do: ql100,3ff or ql100,ffff if you have set the 'e' control in the control table. Another use is to build a default symbol table by taking a pass thru the program: QB100,xxxx ---------------- read .com, .ctl, .sym, or .doc file - rfilename.com reads in at offset+100h rfilename.ctl loads the ctl table rfilename.sym loads the sym file rfilename.doc loads the comments table (note 'u' command must have been issued) ---------------- save .asm, .ctl, .sym, or .doc file - sfilename.asm use 'l' command to write, z to end sfilename.CTL saves the CTL table stablename.sym saves the sym file sfilename.doc saves the comments table ---------------- use area of memory for comments table - unnnn such as ud000 if you had an open board at 0d000h ---------------- purge sym tbl and CTL tbl x - ---------------- close .asm file (note that a preferred way to close the .asm file is to have specified a control entry for the end address (e.g. c1ff,e)) z - -------------------------------------------- -------------------------------------------- Here is a sample of the RESOURCE usage. Given: a COM file (lets say test.com) which runs at 100 (as any good COM file should), and goes thru 2FF. lines preceeded with ---> are typed by you. ---> RESOURCE ---> o2200 set the offset to 2200, which means the program will read into 2200 + 100 = 2300. ---> rtest.com reads the com file into memory. system says: 2500 0300 which is the actual hi load addr, (2500) and the original hi load addr (300) REMEMBER this address (300) because you might want to put a "E" (end of assembly) control entry there. <<<>>> that all 'L' (disassembly list) and 'D' (dump) commands work with the offset added. Thus, you should learn to forget that the disassembler is in memory, and think of it as if your program were actually at 100. D100 will dump your program. also note: if the program being "RESOURCEd" will have a fairly large symbol table, then you will have to set the offset higher: o2f00 or some such. (the ? command will show symbol table usage: if your symbol table is nearing the .com file, then just set a new offset (higher) and re-load the .com) if you want to dump r-e-a-l memory, you would have to reset the offset to 0: o0 (but don't forget to reset it to 1f00 before continuing with your program.) If you are disassembling something which is in memory at it's correct address (such as looking at ccp) then don't set the offset. It defaults to 0 when dis is first loaded. ---> l100 list your program - lists "about" 10 lines. ---> d100 do a dump of your program. NOTE that typically here are the steps to disassembling a program which has just been read into memory: Use the dump command to find the ASCII DB areas. Note that the 'a' command may be used to automatically find the db's, but you must then check them to insure that they don't extend too far. All printable characters, 0dh, 0ah, and 00h are considered candidates for ascii db's. At least 8 characters in a row must be found to make sure that long sequences of mov instructions won't be taken as db's. Use the cnnnn,k command to kill erronious entries put in the control table by the a command, but then immediately put in the right address, such as via cnnnn,i if you wanted to scan the program for ascii db's yourself, use the 'c' (control) command to set the beginning and end of ascii areas. For example, a program which starts out: 0100 jmp start 0103 db 'copyright .....' 0117 start ..... would show up in the dump as: 0100 c3170144 4f50xxxx xxxxxxxx xxxxxxxx *...copyr ight....* 0110 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx *xxxxxxxx ........* thus you would want to instruct the disassembler to switch to db mode at 103, and back to instruction mode at 117, thus: c103,b c117,i Continue doing this, bracketing every ascii db which is in the middle of instructions, by a b control instruction and an i control instruction. Note that multiple db's in a row need not have separate cnnnn,b instructions, but that these do cause a 'line break', i.e. if you have a table of ascii commands, for example: 02e5 db 'load' 02e9 db 'save' the disassembler would disassemble these as: 02e4 db 'loadsave' you could put in an additional control entry: c2e9,b, which would cause the disassembler to generate: 02e4 db 'load' 02e8 db 'save' which is much more readable and realistic. Note that before generating each byte of a db, a symbol table lookup is done to determine if there is a label at that location, and if so, a new line is started. Thus if 'loadlit' and 'savelit' were in the symbol table, as the labels on the 'load' and 'save' above, no separate 'b' control instruction would be required as the label would cause the break. <<<>>> that at this time the automatic label checking is n-o-t done for ds instructions. Make sure that each ds instrucion references only up to the next label. This means that multiple ds's in a row must each be explicitly entered into the control table. Presence of a label is not sufficient. ---- steps, continued: After building the control entries with cnnnn,b and cnnnn,i put in a control entry cnnnn,e which defines the address of the end of your program. The l command will then automatically stop there, and in addition, if you are in 'save xxx.asm' mode, the output .asm file will be closed. If you do mot define a control 'e' entry, then you will have to use the break facility to stop the l command (don't use control-c as that will re-boot cp/m). If you were writing an .asm file, you would have to user the z command to close the file. Next, you would list your program to determine how it looks. when you recognize a routine by it's function, insert a label. For example, if you saw that location 7ef was a character out routine (type) then enter a label into the symbol table: E7EF,.TYPE NOTE that all symbols start with a '.', so as to be dis- tinguished from hex data. NOTE that if you want the disassembler to make default labels for you, use b (for build labels) instead of l (for list program). The b commands causes lnnnn default labels to be inserted in the symbol table for every 2 byte operand encountered (LXI, SHLD, JMP, etc). It will undoubtedly make some you don't want, such as L0000. You will have to: K.L0000 kill label L0000 from the table. When you encounter data reference instructions, try to determine what type of area the instruction points to. Typically,, LXI instructions may point to a work area which should be defined as a DS, or to an ASCII string, in which case we will have already made it a 'b' control instruction. Operands of LHLD and SHLD instructions should be made DW instructions. For example if you encounter LHLD 0534H, then issue a control instruction: C534,W NOTE that whatever mode you are last in will remain in effect. Therefore if 534,w is the last entry in the control table, all data from there on will be taken to be DW's. Suppose that you determine that address 7cf is a 128 byte buffer for disk I/O. You want it to disassemble to: DKBUF ;07CF DS 80H You do this as follows: C7CF,S to start the DS C84F,B to define it's end, and E7CF,.DKBUF to put the symbol in the table. Continue, iteratively using the 'l' command and the 'c' and 'e' commands until you have the listing in a nice format. You will then probably want to save the control symbol, and comments tables. Or, you could have been saving them at checkpoint times (so if you make a major mistake you could go back to a previous one). To save a control file: sfilename.CTL (any filename, may include a: or b:) To save a symbol file: sfilename.sym To save a comments file: sfilename.doc (not ".com" of course) NOTE that the filetypes must be used as shown, but that any legal filename (or disk:filename such as b:xxxx.CTL) may be used. You could now control-c to return to CP/M, and come back later to resume your disassembly: RESOURCE o2200 rtemp.com rtemp.sym rtemp.ctl uxxxx (such as u4000) rtemp.doc This will take you back exactly where you left off. If you want to save a .asm file out to disk, do the following: Make sure that there is a control entry defining the end of the program (such as c200,e) or else you will have to specify the ending address and manually type a z command to close the file. sfilename.asm A message will indicate that the file is opened. Any subsequent a, b, or l command will have whatever is listed written to disk. Encountering a 'e' control, or typing a z command will then close the .asm file. The listing may be interrupted, and continued. Since the l command types only 10 lines, use laddr,ffff to list thru the end of the assembly. If this is the 'final' save of the .asm file, you will probably want to put an 'org' at the beginning of the output file, as well as generate equ instructions for any references outside of the program. For example, a typical cp/m program will have references to: bdos at 5 fcb at 5ch tbuff at 80h the 'p' (for prologue) command generates the org, then scans the symbol table and generates equates: BDOS EQU 05H FCB EQU 05CH (etc.) If you have a "e" control entry in your file, you can list as follows: laddr,ffff - the listing will continue until the "e" control entry is found additional commands: if you entered a label in the symbol table but now want to get rid of it: k.symbol note to rename a symbol, such as when you had a system- assigned lnnnn label but now want to make it meaningful: k.l0334 e334,.type you could even: e.l0334,.type k.l0334 but that takes more typing. here are some more commands: ? prints statistics on symbol and control table usage, etc. c prints the entire control table cnnnn prints the control table starting at address nnnn ds dumps the symbol table. Interrupt it by typing any key. ds.symbol starts dumping at the specified symbol, or the nearest symbol. thus "ds.f" starts the dump at the first label starting with the letter 'f'. ....have fun, and let me know of any problems or suggested improvements ------------------------ RESOURCE "Quick" command summary Any address may be replaced by .symbol i.e. D.START ;addr,comment Enter a comment ;addr Lists existing comment ; Lists entire comments table ;addr, Deletes existing comment A(see "L" for operands) Attempt to find DB's B(see "L" for operands) Build default sym tbl (Lxxxx) C Dump ctl tbl Cnnnn Dump ctl starting at nnnn Cnnnn,x Define format from nnnn (B,E,I,S,W) Dxxxx Dumps 80H from xxxx on Daaaa,bbbb Dumps from aaaa thru bbbb D,bbbb Dump thru bbbb D Dump 80H more D=nn nn= Hex dump size default. Ds Dumps the symbol table. Ds.symbol Sym dump starting at .symbol Ennnn,.symbol Enter symbol into table Fnnnn,ssss Find address nnnn starting at ssss F Continue previous find command Fnnnn Find nnnn K.symbol Kill symbol from symbol table L Lists 10 lines from prev pc Lssss,eeee Lists from ssss to eeee L,eeee Lists from current pc to eeee Lssss Lists 10 lines at ssss L=nn nn is hex list default # of lines O Print current offset Onnnn Establish new offset Pstart addr,end addr Generate program prolog Q Before any command suppresses console output: QB100,200 Rfilename.COM Reads in at offset+100h Rfilename.CTL Loads the ctl table Rfilename.SYM Loads the sym file Rfilename.DOC Loads the comments table (note Sfilename.ASM Save .ASM file. Write w/L, Z to end Sfilename.CTL Saves the CTL table Sfilename.SYM Saves the sym file Sfilename.DOS Saves the comments table Unnnn Use nnnn for comments table X Purge all symbols and control Z Write eof to .ASM file ( ? Prints statistics (sym, ctl, comments) BRESOURCE by Ward Christensen (AS OF 01/08/80) $Copyright 1980 !9"1w Memory open to *+  ͌2E2G1E!V~ w;2 ABC{ D,EFK3LOTP+QRS, UwXZʉ?ʓ2E2Gw? wwY/N purge all symbols & CTL?E:VYtNw!W~  A,#>2E~ .LOC z͐{ͼ>H  !"##~w++~#~ڌ+~#~#F#~+A#~+-™F>2E#~°~ = ~Đ+~ͼ>H 2E##~͋#Ϳr>2GV!W~# ÄCongratulations, you found the patch area!**1"!W~ ʋS =,]*1" v l,#"*"*" *Ϳ|~ͼ#}}}~ >.#}ø "::Ҏw##"1,Q Q w!X~.#r͘&*K&!"^#V#~wF#~#6 Ϳ&* w!W~ H "w:F+ 2\2h!W:X :“:W@2\##]͡͡~ ʾ#.ʾ¡~ .#ó> ¾>2O2P>2P2P2O2E:32425!W~ *, =("# * ,#"%25Ϳ:5>:4=wL*%:#:$w:Oʆ*#*~چ#]~#i+|*#>B͞ >I͞ *)|*#͇ ##F>2Eʽ#~\¶ Û¨ *#Q +###~IEʉ#^#V*#ʹ"H2ESHBʩW{w: INVALID CTL ENTRY w2E*#{23~#,  w:#/o:$/g#>2E~.BLKB |͐}ͼ>H "#*>2E~.WORD *#*^#Vn*###"#* *2J<2E~.BYTE *#*~  "͐>H:J2J0#*##"#:H:Iʍ*#ң:J2Jң>,û>':J<2J~~'#*##"#:HP:Iʈ*#҈:J<2J#Ҁu+~# ʈ~ ڀ/>'>' *wSYMTBL=!"*! wPC =*# wOFFSET=* *)|wCOMNTS=*)*+ wCTLTBL=!~###<+++ w!W~ S"/*"- S C,# *"-*/Ϳ*-~#"-W~W|+W:/_: /Wʹ>2E~.END 2E:Fw>ͧ2Fw++ASM FILE CLOSED++ wl:F+ !e?͵!" "!##6Ó!e9͵G *|z \/  | w!e<͵X !eB͵ *) "+6#6Ów++NO, THAT WOULD OVERLAY THE DISASSEMBLER BECAUSE OFFSET IS TOO SMALL: H>  s#r##> w# p  b : 0))))o>b  l:F+ !e?͵š !"͆^#V#~#Gs ~ > ~#] > > J >ͧwzͬzͰ{ͬ{Ͱ!e<͵ʼ !eB͵ !e6͵>2F2E͆w++WRITING .ASM ENABLED USE Z COMMAND OR E CONTROL TO CLOSE FILE++ w *+##6*)G w++NO FILE ACCESSES PERMITTED UNTIL .ASM CLOSED ww++UNEXPECTED EOF w!W~ s  m ʖ ,#~Ͱ wQ +ګ ###Ѿ2QQ :QIM WM BM SM EM K!~#+< w# +++:QKE B W I S!~###: >,~ #v ͆!^#V#z< ~ >,~> > # >ͧw!>* , : 0))))o> s#r#>w# 6#6 !W~ ʫ # ʥ Q ,͇ c ~ w*+s#r##w n #"+6#6pw*)~#+<7#z+› {##~͋#Ê ͇ î *)Ϳ^#V#z;F#~ #î ~#<+T]##~͋#~#O2E*#H~+-# ͟>:*# 2E*#>2Eʹ2*#*"'#"#F!~O#~0#~2Q#~S:U.E*#:Q?x x#u#"#_!*'͌-*##"#Zú<Tar~ÍÜ v l ? l*'#:#"'*'~ A[A:QAA~+>'~ R͐>H 0 *'~?*'#^#V҄:Pʍ:Í͟z>0ʣzʩ͐{ͼ>H { ڵ͐á0ãgú *'~0 *'~l~M|g#"'F!Æ>X>Y2#~(͌͌#~2#F"'!Æ"'͌#~2G!]Æ#~͌*#_On~<~0: :glv ~:>M#~:g>-|/1|. , g>0|0!ß>,> >;~.BYTE >2Q*'~!͋~#~.>''*'~z~dd>S>P~PSW*'~z*'~!͋~Mʣo$ڼ>0ü~#ŸNZZ.NCC.POPEP.M.BCDEHLMA ..... ...............ACI..ADC..ADD..ADI..ANA..ANI..C....CALL./CMA..?CMC..CMP..CPI..DAA.. DAD..DCR.. DCX..DI...DJNZ.EI...@EXAF.@EXX..vHLT..IN...INR..INX..J....JMP..JMPR. JR...:LDA.. LDAX.*LHLD.LXI..@ MOV..MVI..NOP..ORA..ORI..OUT..PCHL.POP..PUSH. R....RAL..RAR..RET..RRC..RLC.. RST..SBB..SBI.."SHLD.SPHL.2STA..STAX.7STC..SUB..SUI..XCHG.XRA..XRI..XTHL.@BIT..RES..SET..RLCR.RRCR.RALR.RARR. SLAR.(SRAR.8SRLR.CSBCD.SSDED.sSSPD.KLBCD.[LDED.OSTAR._LDAR.GSTAI.WLDAI.{LSPD.DNEG..ERETN.MRETI.FIM0..VIM1..^IM2..LDI..LDIR.LDD..LDDR.CCI..CCIR.CCD..CCDR.INI..INIR.IND..INDR.OUTI.OUTIROUTD.OUTDRBDSBC.JDADC.gRRD..oRLD..@INP..AOUTP.BDSBC.JDADC.)DAD. DAD.POP..PUSH."SID.*LID.#INX..+DCX..F MOV..ADD..ADC..SUB..SBB..ANA..XRA..ORA..CMP..pMOV..4INR..5DCR..6MVI..!LXI..SPI.XTI.PCI.NNMMDDYY?????!T6L#z͟{͟!T͘Ws#r*!T]xo|g"!##6++DM*K{€zʇ vs#r#p#w!"##~#O͵~#oҝ$Ý++ѷO͵ҹH͵ҹ++"K7!"~#~#~7#o$#~#G7!W~ ,#~.rMw!W~.r͘DM##~o|g#*!{_zfU`i"!##6w#~#+v-v0ڗ:vAڗ[v+ͬw#Ͱw# ڹ0ͬͰ|ͼ}ͼ> ~.~0:AG0))))o#r͘^#V~!"M2|\w[\\<2|!"M\\ > >*_:G:F!E{{ A:5A!45T>N !U^#6 !U#~ a`{`_w`2E2G~#~#ɯ2"!""!> 2W!">I2*)|"+6#6# µ  ww ABORT Y/N _Yw ȷ ? *()" ASMCOMCTLSYMDOC REZ80.COM is a Z-80 version of Ward Christensen's RESOURCE.COM. It uses TDL mnemonics. The operation of the program is the same as the original RESOURCE. END  CUSTOMIZATION OF WORDSTAR 3.3 ---------------------------------------------------------------------- Update 04/23/84 by Guy Gamble 74375,257 CPM SIG Compuserve Added about five new labels and verified Milton's with the set of labels found at the end of WS.INS file. This file contains a listing of all the known (to date) labels and patch addresses that I have been able to verify. If you know of any not listed here, please contact the following person so that this list can be updated for the benefit of all. Author: MILTON HICKS 222 Pacific Avenue Long Beach, CA 90802 Evenings: (213) 924-6429 or MicroNet [70250,467] ---------------------------------------------------------------------- LABEL ADDR DESCRIPTION SETTINGS PATVER 010C PATCH VERSION 0D MSGVER 010E MESSEGE VERSION WSVER 0110 WORDSTAR VERSION 1B COPRIT 0112 COPYRIGHT NOTICE SIGNON 014E WORDSTAR SIGN ON MESSAGE 0179 SERIAL NUMBER IDTEX 018A TERMINAL ID TEXT PIDTEX 01AE PRINTER ID TEXT PROTTX 01D2 PRINTER PROTOCOL TEXT PDRVTX 01F6 PORT DRIVER TEXT 0218 WRAPF 021B* WFLAGS 021B* ABSVAR 021B* 00 JUSTF 021C 00 VTABF 021D 00 SHYPF 021E 00 HYPF 021F 00 SHOWCF 0220* 00 SHOWDF 0220* SHOWHF 0220* SHOWMF 0221 00 PAGON 0222 00 PAGDIS 0223 00 LSPACE 0224 00 MOVETY 0225 00 DISDIR 0226 00 INPORT 0227 00 AUPAV 0228 00 MSGLEN 0229 00 INSTLD 022A 00 PCLAS 022B 00 SAVEND 022C 00 022D 00 PTEXTS 022E 00 022F 00 POVSTB 0230 00 0231 00 HITE 0232 SCREEN HEIGHT IN LINES (24) 18 WID 0233 SCREEN WIDTH IN COLUMNS (80) 50 CLEAD1 0234 CURSOR POS LEAD-IN 00 00 00 00 00 00 00 00 00 CLEAD2 023D CURSOR POS BETWEEN COL/LINE 00 00 00 00 00 CTRAIL 0242 CURSOR POS TRAIL 00 00 00 00 00 CB4LFG 0247 CURSOR POS #0 FOR COL FIRST 00 LINOFF 0248 CURSOR POS LINE OFFSET 00 COLOFF 0249 CURSOR POS COLUMN OFFSET 00 ASCUR 024A CURSOR POS #0 FOR BINARY 00 UCRPOS 024B CURSOR POS JUMP TO OWN CURSOR POS 00 00 00 00 00 ERAEOL 0250 ERASE TO END OF LINE ## 00 00 00 00 00 00 LINDEL 0257 DELETE LINE ## 00 00 00 00 00 00 LININS 025E INSERT LINE (CR) ## 00 00 00 00 00 00 00 00 IVON 0267 TURN ON HIGHLIGHTING ## 00 00 00 00 00 00 IVOFF 026E TURN OFF HIGHLIGHTING ## 00 00 00 00 00 00 TRMINI 0275 TERMINAL INITIALIZATION STRING ## 00 00 00 00 00 00 00 00 TRMUNI 027E TERMINAL TERMINATION STRING ## 00 00 00 00 00 00 00 00 INISUB 0287 SPECIAL INIT STRING FOR CUSTOM 00 00 xx UNISUB 028A SPECIAL TERM STRING FOR CUSTOM CUR POS 00 00 xx USELST 028D USE LAST COLUMN/ROW DISPLAY FLAG 00 DELCUS 028E DELAY AFTER CURSOR SET 00 DELMIS 028F DELAY AFTER OTHER FUNCTIONS 00 MEMAPV 0290 MEMORY-MAPPED DISPLAY TERMINAL 00 MEMADR 0291 ADDRESS OF FIRST CHAR, MEMORY-MAPPED 00 00 HIBIV 0293 INVERSE VIDEO BY HI ORDER BIT 00 HIBCUR 0294 DISPLAY CURSOR, MEMORY-MAPPED 00 CRBLIV 0295 FF TO BLINK CURSOR, MEMORY-MAPPED 00 ZAFCIN 0296 FIX FOR BACKSPACE ON DELETE 00 00 RUBFXF 0297 FIX FOR BACKSPACE ON DELETE 00 RFIXER 0299 FIX FOR BACKSPACE ON DELETE 00 UCNSTA 029A OPTIONAL USER CONSOLE CHAR READY 00 00 00 UCONI 029D OPTIONAL USER CONSOLE INPUT 00 00 00 UCONO 02A0 OPTIONAL USER CONSOLE OUTPUT 00 00 00 SWIN 02A3 OPTIONAL ROUTINE BEFORE DMA 00 00 00 TO VIDEO BOARD 00 00 00 SWOUT 02A9 OPTIONAL ROUTINE AFTER DMA 00 00 00 TO VIDEO BOARD 00 00 00 DEL1 02AF SHORT DELAY - CURSOR BLINK 03 DEL2 02B0 MEDIUM-SHORT DELAY - CURSOR BLINK 09 DEL3 02B1 MEDIUM-LONG DELAY - TO PREFIX MENUS 19 DEL4 02B2 LONG DELAY - TIME FOR NOTE DISPLAYS 40 DEL5 02B3 DELAY UNTIL SCREEN REDISPLAY 09 TRSCRS 02B4 FOR TRS-80 ONLY 00 TRSCIF 02B5 FOR TRS-80 ONLY 00 HETHBS 02B6 FOR LIFEBOAT CP/M FOR HEATH-89 00 APLFLG 02B7 FOR APPLE ONLY 00 MPMFLG 02B8 MP/M FLAG 00 DEFDSK 02B9 LOOK FOR WSOVLY1.OVR AFTER DEFAULT 01 SCRLSZ 02BA # OF COLUMNS FOR HORIZONTAL SCROLL 14 MORPAT 02CB USER PATCHED CURSOR POS ROUTINE 00 | | | PBGMEM 034B TOP END ADDRESS OF WORDSTAR 00 00 ITHELP 034D INITIAL HELP LEVEL 02 NITHLF 034E =0 FOR MAXIMUM HELP MESSAGE FF ITITOG 034F INSERT: =0, OFF; =FF, ON FF ITDSDR 0350 NO-FILE DIRECTORY =0, OFF; =FF, ON FF INITPF| 0351 LINE HEIGHT, 1/48'S 08 | PAPER LENGTH IN LINES (66) 42 | PAPER LENGTH IN 1/48'S 02,10 | LINE HEIGHT AGAIN 08 | MARGIN AT TOP IN LINES 03 | MARGIN AT TOP IN 1/48'S 00,18 | LINE HEIGHT AGAIN 08 | HEADING MARGIN IN LINES 02 | HEADING MARGIN IN 1/48'S 00,10 | LINE HEIGHT AGAIN 08 | BOTTOM MARGIN IN LINES 08 | BOTTOM MARGIN IN 1/48'S 00,40 | LINE HEIGHT AGAIN 08 | FOOTING MARGIN IN LINES 02 | FOOTING MARGIN IN 1/48'S 00,10 | LINE HEIGHT AGAIN 08 | =0 FOR STANDARD CHAR WIDTH 00 | STD CHAR WIDTH IN 1/120'S 0C | ALT CHAR WIDTH IN 1/120'S 0A | PAGE OFFSET IN CHARS 08 INITLM 036A INITIAL LEFT MARGIN LESS 1 00 INITRM 036B INITIAL RHT MARGIN LESS 1 UP TO WID-4 40 INITSR 036C INITIAL SUB/SUPER-SCRIPT ROLL IN 1/48'S 03 INITWF| 036D WORD WRAP FLAG, OFF=0; ON=FF FF | JUSTIFY FLAG, OFF=0; ON=FF FF | VARIABLE TABS FLAG, OFF=0; ON=FF FF | SOFT HYPHEN FLAG, OFF=0; ON=FF 00 | HYPEN-HELP FLAG, OFF=0; ON=FF FF | PRINT CONTROL CHARS FLAG, OFF=0; ON=FF FF | RULER LINE DISPLAY, OFF=0; ON=FF FF | PAGE BREAK DETERMINATION, OFF=0; ON=F FF | PAGE BREAK DISPLAY, OFF=0; ON=FF FF | LINE SPACING 01 | 0=BLOCK, FF=COLUMN MODE 00 NONDOC 0378 DIRECT ENTRY 0=DOC, FF=NON-DOC EDIT 00 DOTSON 0379 FF=ENABLE, 0=DISABLE DOT COMMANDS 00 DECCHR 037A DECIMAL POINT CHARACTER 2E DOTCHR 037B CHAR TO BEGIN 'DOT' COMMANDS 2E BLNCHR 0386 NON-BREAK SPACE CHAR (^O) 0F CMTCHR 0387 00 ENDEXP 0388 00 RVELIM 0389 DELIMITER FOR DATA VALUES 2C RVQUOT 038A DELIMITER FOR ENCLOSED VALUES 22 038B 00 TXBACK 038C 00 038D 00 VARCH1 038E DELIMITER THAT INTRODUCES VARIABLES 26 VARCH2 038F DELIMITER THAT TERIMATES VARIABLE 26 VAROPC 0390 CHARACTER AFTER NAME B4 OPTION LETTERS 2F 0391 OPTION LETTER FOR OMIT LINE IF VBL NULL 4F 0392 00 0393 00 0394 00 0395 00 COMPOP 0396 00 LOGICP 03B7 00 HZONE 03C9 HYPHENATION CRITERION 00 00 00 00 00 VOWTAB 03CE TABLE OF VOWELS 00 00 00 00 00 NONCON 03D3 TABLE OF NON-CONSONANT LETTERS 00 00 00 00 00 00 00 00 00 00 BOFCHR 03DD BEGINNING OF FILE FLAG 3A CONCHR 03DE FILE LINE CONTINUATION FLAG 2B EOFCHR 03DF END OF FILE FLAG 2E FDTCHR 03E0 MERGE-PRINT COMMAND FLAG 4D HARDCR 03E1 HARD CR FLAG 3C LFCHR 03E2 LINE ENDS IN LF W/O CR FLAG 4A OVPCHR 03E3 OVERPRINT LINE FLAG 2D PAGCHR 03E4 END OF PAGE FLAG 50 SOFTCR 03E5 SOFT CR FLAG 20 03E6 00 SOFHYC 03E7 CHARACTER USED FOR SOFT HYPHENS AD PAGFIL 03E8 CHARACTER USED FOR PAGE BREAKS 2D MARKS | 03E9 CHARACTER USED FOR START OF BLOCKS 42 | CHARACTER USED FOR END OF BLOCKS 4B | 00 | 00 | 00 | CHARACTER USED FOR USER MARKS 00 00 00 | 00 00 00 | 00 00 00 | 00 PODBLK| 03F8 DISK FILE OUTPUT DEFAULT, 0=NO, FF=YES 00 | USE FORM FEEDS, 0=NO, FF=YES 00 | SUPPRESS PAGE FORMATTING, 0=NO, FF=YES 00 | PAUSE BETWEEN PAGES, 0=NO, FF=YES 00 NOUFF 03FC #0 FOR SUPPRESS FORM FEED QUESTION 00 ITPOPN 03FD PRINT PAGE NUMBERS, 0=ON, FF=OFF 00 ITMIJ 03FE MICROJUSTIFY SWITCH, FF=ON, 0=OFF FF ITBIP 03FF BI-DIRECTIONAL PRINT, FF=ON, 0=OFF FF FNWSCM 0400 NAME OF WORDSTAR PROGRAM WS.COM DSKTNA 040C NAME OF MESSAGE FILE WSMSGS.OVR FNOVLY 0418 NAME OF OVERLAY FILE WSOVLY1.OVR FNMRGP 0424 NAME OF MERGE-PRINT OVERLAY MAILMRGE.OVR AUTOBS 0430 AUTO BACK-SPACE TABLE 00 00 00 00 00 00 00 00 00 00 00 00 BSCHR 043B AUTO BACK-SPACE CHARACTER 00 NOFTAB 043C 00 VTAB 0489 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0499 SET HELP LEVELS ^JH 00 00 xx xx 049D MOVE CURSOR LEFT ^S 00 00 xx xx 04A1 BACKSPACE ^H 00 00 xx xx 04A5 MOVE CURSOR RIGHT ^D 00 00 xx xx 04A9 MOVE CURSOR LEFT WORD ^A 00 00 xx xx 04AD MOVE CURSOR RIGHT WORD ^F 00 00 xx xx 04B1 MOVE CURSOR DOWN ^X 00 00 xx xx 04B5 MOVE CURSOR UP ^E 00 00 xx xx 04B9 MOVE CURSOR TO LEFT MARGIN ^QS 00 00 xx xx 04BD MOVE CURSOR TO END OF LINE ^QD 00 00 xx xx 04C1 CURSOR TO BOTTOM OF SCREEN ^QX 00 00 xx xx 04C5 CURSOR HOME ^QE 00 00 xx xx 04C9 CURSOR BLOCK-BEGINNING ^KB 00 00 xx xx 04CD CURSOR BLOCK-END ^KK 00 00 xx xx 04D1 CURSOR POSITION - ^QP 00 00 xx BEFORE PREVIOUS COMMAND xx 04D5 CURSOR TO SOURCE, etc. ^QV 00 00 xx xx 04D9 CURSOR TO MARKER 0 ^Q0 00 00 xx xx 04DD " " " 1 ^Q1 00 00 xx xx 04E1 " " " 2 ^Q2 00 00 xx xx 04E5 " " " 3 ^Q3 00 00 xx xx 04E9 " " " 4 ^Q4 00 00 xx xx 04ED " " " 5 ^Q5 00 00 xx xx 04F1 " " " 6 ^Q6 00 00 xx xx 04F5 " " " 7 ^Q7 00 00 xx xx 04F9 " " " 8 ^Q8 00 00 xx xx 04FD " " " 9 ^Q9 00 00 xx xx 0501 MOVE TO TOP OF FILE ^QR 00 00 xx xx 0505 MOVE TO BOTTOM OF FILE ^QC 00 00 xx xx 0509 FIND ^QF 00 00 xx xx 050D FIND & REPLACE ^QA 00 00 xx xx 0511 SET LEFT MARGIN ^QL 00 00 xx xx 0515 SCROLL DOWN CONTINUOUSLY ^QW 00 00 xx xx 0519 SCROLL UP CONTINUOUSLY ^QZ 00 00 xx xx 051D DELETE TO BEGINNING OF LINE ^Q 00 00 xx xx 0521 (SAME AS ^Q ) ^Q_ 00 00 xx xx 0525 ERASE TO END OF LINE ^QY 00 00 xx xx 0529 REPEAT NEXT COMMAND ^QQ 00 00 xx xx 052D REPEAT FIND & REPLACE ^L 00 00 xx xx 0531 MOVE SCREEN UP ONE LINE ^Z 00 00 xx xx 0535 MOVE SCREEN DOWN ONE LINE ^W 00 00 xx xx 0539 SCROLL DOWN SCREENFUL ^R 00 00 xx xx 053D SCROLL UP SCREENFUL ^C 00 00 xx xx 0541 DELETE CHARACTER LEFT 00 00 xx xx 0545 SAME AS ^_ 00 00 xx xx 0549 DELETE CHARACTER RIGHT ^G 00 00 xx xx 054D DELETE LINE ^Y 00 00 xx xx 0551 ERASE WORD TO RIGHT ^T 00 00 xx xx 0555 INSERT MODE ON/OFF ^V 00 00 xx xx 0559 REFORMAT TO END OF PARAGRAPH ^B 00 00 xx xx 055D INSERT LINE ^N 00 00 xx xx 0561 TAB 00 00 xx xx 0565 CARRIAGE RETURN 00 00 xx xx 0569 PRINT COMMAND PREFIX ^P 00 00 xx xx 056D HIDE/DISPLAY MARKED BLOCK ^KH 00 00 xx xx 0571 MARK/HIDE BLOCK BEGINNING ^KB 00 00 xx xx 0575 MARK BLOCK END ^KK 00 00 xx xx 0579 SET/HIDE MARKER 0 ^K0 00 00 xx xx 057D " " 1 ^K1 00 00 xx xx 0581 " " 2 ^K2 00 00 xx xx 0585 " " 3 ^K3 00 00 xx xx 0589 " " 4 ^K4 00 00 xx xx 058D " " 5 ^K5 00 00 xx xx 0591 " " 6 ^K6 00 00 xx xx 0595 " " 7 ^K7 00 00 xx xx 0599 " " 8 ^K8 00 00 xx xx 059D " " 9 ^K9 00 00 xx xx 05A1 MOVE BLOCK ^KV 00 00 xx xx 05A5 COPY BLOCK ^KC 00 00 xx xx 05A9 DELETE BLOCK ^KY 00 00 xx xx 05AD COLUMN MODE ON/OFF ^KN 00 00 xx xx 05B1 ^KZ 00 00 xx xx 05B5 INTERRUPT COMMAND IN PROGRESS ^U 00 00 xx xx 05B9 DONE-SAVE-EXIT ^KX 00 00 xx xx 05BD DONE-SAVE-RETURN TO MENU ^KD 00 00 xx xx 05C1 SAVE-CONTINUE EDIT ^KS 00 00 xx xx 05C5 ABANDON EDIT-RETURN TO MENU ^KQ 00 00 xx xx 05C9 INSERT/READ FILE INTO TEXT ^KR 00 00 xx xx 05CD WRITE BLOCK TO ANOTHER FILE ^KW 00 00 xx xx 05D1 DELETE FILE ^KJ 00 00 xx xx 05D5 DIRECTORY ON/OFF ^KF 00 00 xx xx 05D9 PRINT FILE ^KP 00 00 xx xx 05DD CHANGED LOGGED DISK ^KL 00 00 xx xx 05E1 COPY FILE ^KO 00 00 xx xx 05E5 RENAME FILE ^KE 00 00 xx xx 05E9 LEFT MARGIN SET ^OL 00 00 xx xx 05ED RIGHT MARGIN SET ^OR 00 00 xx xx 05F1 TAB SET ^OI 00 00 xx xx 05F5 TAB CLEAR ^ON 00 00 xx xx 05F9 SET MARGIN/TABS FROM FILE LINE ^OF 00 00 xx xx 05FD WORD WRAP ON/OFF ^OW 00 00 xx xx 0601 JUSTIFICATION ON/OFF ^OJ 00 00 xx xx 0605 VARIABLE TABBING ON/OFF ^OV 00 00 xx xx 0609 DOT COMMAND DISPLAY ON/OFF ^OD 00 00 xx xx 060D RULER DISPLAY ON/OFF ^OT 00 00 xx xx 0611 PAGE BREAK DISPLAY ON/OFF ^OP 00 00 xx xx 0615 SOFT HYPHEN ENTRY ON/OFF ^OE 00 00 xx xx 0619 HYPHEN HELP ON/OFF ^OH 00 00 xx xx 061D PARAGRAPH TAB ^OG 00 00 xx xx 0621 MARGIN RELEASE ^OX 00 00 xx xx 0625 CENTER LINE ^OC 00 00 xx xx 0629 LINE SPACE SETTING ^OS 00 00 xx xx 062D PRINT DIRECTIVES ^JD 00 00 xx xx 0631 EXPLAIN STATUS LINE ^JS 00 00 xx xx 0635 EXPLAIN FLAGS ^JF 00 00 xx xx 0639 EXPLAIN PLACE MARKERS ^JP 00 00 xx xx 063D EXPLAIN PARAGRAPH REFORM ^JB 00 00 xx xx 0641 EXPLAIN TABS AND MARGINS ^JM 00 00 xx xx 0645 COMMAND INDEX ^JI 00 00 xx xx 0649 EXPLAIN MOVING TEXT ^JV 00 00 xx xx 064B EXPLAIN RULER LINE ^JR 00 00 xx xx 0651 ^JA 00 00 xx xx XTAB 0655 00 USER4 FPTAB 067A 00 CLCHR 0691 00 CRCHR 0692 00 LITCHR 0693 00 DIRCH 0694 00 00 00 STPCHR 0697 00 ERELCH 0698 00 POSMTH 0699 CHARACTERISTIC OF PRINTER 00 BLDSTR 069A NUMBER OF STRIKES FOR BOLDFACE 00 DBLSTR 069B NUMBER OF STRIKES FOR DOUBLE-STRIKE 00 PSCRLF 069C STRING TO ADVANCE TO NEXT LINE ## 00 00 00 00 00 00 00 00 00 00 PSCR 06A7 STRING TO RETURN CARRIAGE TO SOL ## 00 00 00 00 00 00 PSHALF 06AE AND HALF LINE-FEED 00 00 00 00 00 00 00 PBACKS 06B5 PRINT BACKSPACE 00 00 00 00 00 00 PALT 06BB SET ALTERNATE CHARACTER WIDTH ^PA 00 00 00 00 00 PSTD 06C0 RESET STANDARD CHARACTER WIDTH ^PN 00 00 00 00 00 ROLUP 06C5 ROLL CARRIAGE UP PARTIAL LINE ^PT 00 00 00 00 00 ROLDOW 06CA ROLL CARRIAGE DOWN PARTIAL LINE ^PV 00 00 00 00 00 USR1 06CF USER FUNCTION #1 ^PQ 00 00 00 00 00 USR2 06D4 USER FUNCTION #2 ^PW 00 00 00 00 00 USR3 06D9 USER FUNCTION #3 ^PE 00 00 00 00 00 USR4 06DE USER FUNCTION #4 ^PR 00 00 00 00 00 RIBBON 06E3 CHANGE TO ALTERNATE COLOR RIBBON ^PY 00 00 00 00 00 RIBOFF 06E8 CHANGE TO BLACK RIBBON ^PN 00 00 00 00 00 PSINIT 06ED STRING TO INITIALIZE PRINTER 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PSFINI 06FE STRING TO TERMINATE PRINTING 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 SOCHR 070F CHARACTER FOR STRIKEOUT 2D ULCHR 0710 CHARACTER FOR UNDERLINING 5F PRINIT 0711 CUSTOM PRINTER INIT STRING 00 00 00 PRFINI 0714 CUSTOM PRINTER TERM STRING 00 00 00 CSWTCH 0717 WHERE TO SEND OUTPUT 01 00 00 HAVBSY 0718 00 LIBSY 0719 BUSY TEST ENTRY 00 00 00 LISEND 071C OUTPUT CHARACTER 00 00 00 00 00 00 00 00 LISINP 0724 INPUT CHARACTER 00 00 00 POBSY 0727 PORT DRIVER STATUS ENTRY 00 POSTAT 0728 OUTPUT STATUS PORT # 00 00 00 POMASK 072B WHICH BIT IS OF INTEREST 00 00 POOM 072D FOR PRINTER READY 00 00 00 00 00 POSEND 0732 PORT DRIVER SEND CHAR ENTRY 00 POOP 0733 OUTPUT DATA PORT 00 00 00 POINP 0736 PORT DRIVER INPUT CHAR ENTRY 00 PISTAT 0737 INPUT STATUS PORT 00 00 00 POINSK 073A WHICH BIT IS OF INTEREST 00 00 POIM 073C FOR INPUT CHAR READY 00 00 00 00 POIP 0740 INPUT DATA PORT 00 00 00 00 PUBSY 0744 ENTRY POINT CSWTCH = 2 00 00 00 PUSEND 0747 PRINT CHARACTER 00 00 00 PUINP 074A INPUT CHARACTER 00 00 00 ACBSY 074D BUSY TEST ENTRY 00 00 00 ACSEND 0750 SEND A CHARACTER 00 00 00 00 00 00 00 00 00 ACINP 0759 INPUT A CHARACTER CSWTCH = 4 00 00 00 00 00 00 00 00 ACFIN 0763 EXIT ROUTINE 00 ACSTA1 076F RESET IOBYTE 00 00 00 ACSTAR 076C ENTRY ROUTINE 00 00 00 00 00 CONFIE 0774 SET IOBYTE 00 00 00 00 PROTCL 0778 SET PRINTER PROTOCAL TYPE 00 EAKBSZ 0779 ETX/ACK MESSAGE LENGTH 00 USER5 DVMILE 077A VERTICAL MOTION INDEX LEADIN STRING 00 00 00 00 00 00 00 00 00 DVMITR 077F 00 DVMMIN 0784 MAXIMUM DVMILE (FOR 0) 00 00 DVMRNG 0786 MINIMUM DVMILE 00 00 DHMILE 0788 HORIZONTAL MOTION INDEX LEADIN STRING 00 00 00 00 00 DHMIFG 078D 00 DHMIN 078E MAXIMUM DHMILE 00 00 DHRNG 0790 MINIMUM DHMILE 00 00 DFWD 0792 SET FORWARD PRINT 00 00 00 00 DBAK 0797 SET BACKWARD PRINT 00 00 00 00 00 DSP 079C FORWARD SPACE 00 00 00 00 00 DBS 07A1 BACKWARD SPACE 00 00 00 00 00 DLF 07A6 LINE FEED VMI 00 00 00 00 00 DRLF 07AB REVERSE LINE FEED 00 00 00 00 00 DPHSPC 07B0 PRINT PHANTOM SPACE 00 00 00 00 DPHRUB 07B4 PRINT PHANTOM RUBOUT 00 00 00 00 DNPROS 07B8 SUPPRESS PROPOR SPACING 0=ON, FF=OFF 00 DMJWB 07B9 ALTER MICROJUST. ALGORITHM 0=NO, FF=ALT 00 PSTAB 07BA PROPORTIONAL SPACING TABLE 00.... .... 083A END OF USER AREA ----------------------------------------------------------------- For users desiring to incorporate PROPORTIONAL SPACING into WS for their precision printers, an instruction manual is available for $20.00 from: Writing Consultants 11 Creek Bend Drive, Suite 144 Fairport, New York 14450 1-800-227-3800 ext. 7018 (toll free) ----------------------------------------------------------------- **** THE END FOR NOW **** WS33MSG.PAT 04/23/84 Wordstar 3.3 (Osborne Executive) This patch will bypass the time consuming signon messeges that come up when Wordstar is started. Put a working copy of WS.COM in drive B. A>SID B:WS.COM <----Read the WS.COM SID VERS 3.0 NEXT MSZE PC END 4600 4600 0100 D7FF #A3CF1 <----You type in these lines 3CF1 JMP 3D27 #W B:WS.COM,0100,45FF This overwrites the old file #G0 Exit to CPM I think this patch will work on any WordStar version 3.3 that came with the Osborne Executive. I found this saves about 30 sec when you boot WS. -Guy Gamble- FOG or 74375,257 CPM SIG r SUPERZAP 3 for CP/M 2.2 and CP/M 3.1 W.M.Davidson H.J.Sheldrake *T()= ~  2SUPERZAP version 3.5VIDNCTION $RT ;In???????????DSK:V JR VMSET $RTN VMNDrive Track Sector Empty and CP/1 W.M.DavidsoINIT*. >/|0<2 *>0!*""2!""22:\(=2!#~( (#~: #+2% Ϳ' ͫ'!]~ ( ~?(#͵'!]:^# :^#!O"MAIN:!i4' nJ')(:_ ** Invalid Disk SpecifiedXFDPz ENDR2FDMD*C">2'2K:(ͫ':(*2>(!c(!E:(!T(!(>L(&:'( |!ͤ!2'!('!4'((J':F à\COM Select Function ===> $Enter Hex Sector 5File Offset 5Load AddressN Next sectorP Previous sectorT Top of fileE Last sector of file6Z Exit from Superzap6L Exit to file listC Change SectorS Select Sector6X Scratchpad operationsA Find ASCII stringH Find HEX sequence File-Name Access $Current-Sector d:filename.typ R/s Scratchpad :- Find : NOT FOUND  - HIT FOR START @NEXT (Y/N) ? KEY INPUT INTERRUPT... ) 7 - NPTEZLCSXAH,K''pNr NXFS*#"% >2'(PRFS*| (+"% >2'k(FSCH:(( :Y (&%>22'FRFS!"%>2'LSFS\#*}+"%>2'SFSN!(*"!0(!"|!('!I#4' *&"0 *"$ !g+g %((2(: ((!g(>2'FSPM>(!(!F(:A'>:'!~)!)*p)!W(ͦJ'>22'ɡOFSPXSPCI!('!h4'((DSPI: !)J= (!):A'!)*p)!)*p):A'>:'!)!)*p)FXSP: (!:((K%&%O%FLSP![:2!~ *">2DFSI!(*p)!(*<2:(#"O"('!h4'((DSPI: !->FASC>2" FIND:q 2!"C"CAѷ !(>L(!(\ >2*K:2O "C (u n #(  D "C n y2ú 2y2*"KC>2 D !:  (#:ͼ 2*K* K: !"C:( Kͼ 2 !B} >=2`"*%%%"%Ͱ%͐)!$)͛)!('Y`"*%%%"%Ͱ%((q :   !(>L(!(:F( !('T ͙>22'GTNXT:F‘ ,|%I*i[k} *_"iW&GOBAK:FKgW&SHSEC:F(|!ͤ!DCCT!5ASIŃ ;' (9 2@ !A 4' E J' ( 0(P :!4 ( PASTR*:_'w:"('_)FHEX2"ͩ SSTR22>L(!(*">2!"HXIŃ 2` !X$)` '!I#4' <:w 2P !4'!I#4' E:w 2!5` P :![ 4ì : (QW  :ʬ =2ì (ì : !5 '4$( !g~ !5ì ( 2HXSC*:Gga(HXADo&&}DRMD*">2:::(>(! (#2:&:'! 4'(( J':D Ï ^H Cursor left^L Cursor right^K Cursor up^J Cursor downP Previous directory pageN Next directory pageU Change user number6Z Exit from Superzap6C Change disk6S Select track/sector6M Set directory selectionE Edit fileT Type file EZCSMPNTU 4''I?ds| ** No records in file** File not foundeDIRP:( 22&!X%#(DIRN: !022&!X%#(FBS:G!:=2(0FUP:G!:2(0FDN:G!:2(0FNL:G!:2(!0FFS:G!:<2(02/!"_'F!6":/_'fha( STFL?͵'CFCB: (!(":G:&o[&] 2hTYPE?K:.222<22*"">2u2v:v(^2v22x>(!4(!(!|)!(*p)!(*p)!(*p)!(*p)!(*}p)!('!\4'((eJ':u(å>2: N Next pageR Return after Paging2L Exit to file listP Previous pageT Top of file2Z Exit from SuperzapF Forward pagingB Backward pagingEnter Selection ==>Page  Sectors ,-2vTYPR*[R(R>2vTYPL2uTYPB[*R(R>2vTYPT*>2vTYPZ'2uTYPGͻ! (2w22:wª::(!:ª:wªç > !: Þ (!(!(!(+!(%(: :!_'~ E> !E!: *m"RQPGE*[R ![SLPGE"%TGET: $!~4!_'~2: *#"2%:TPUTG:O E:w : x9)!4TYNL2*"}m"!4> >2w: > '> 'FTYPHA K!(*p)!(*p)!(*p)̓!(*p)!(*}p):(͢1BTYPHA I!(*p)!(*p)()!(*p)!(*p)!(*p)1PGEND(22x=2u2vPAGIN>2x2: ='o>'gCHUN!(>2:!('08 8 8(_ ^#2 Enter user number or press ESC ===>CHDD! (>2:! ('(A^# (2 Enter Drive Name or press ESC ===>** No Files on DriveSAFN>(!(>2:! /222*">2!";' (+('!4' J'!4'( ڰX(( !r$2:;<>[]press ESC ===>CHDD ^H Cursor Left^L Cursor Right^G Delete Character^V Insert On/Off6^I Edit Name/Type6ESC Use Current SelectionEdit File Name ===>%<= File Type ===> <= Insert  .* AFNP: AFND*:O_'T]#:=(O> /AFNS> 2 AFNQ>?2 AFNF*:G_':G: w#/ DAFN!(!~'#!(!~'#PAFN:(́*:_'w':(/AFNM*:=_'T]+:O:=(OAFNL:(= :=G=*_'> +x2AFNR*:_'~  :!4 AFNI:/2!(((AFNT2:/2 >*>*2"SAFNC*:ga(TFLE2\< !(">2Ï!""]k%:\@2|%( !">2PSMD* ">22>":2:OVS!"k*_"i:(2>(!(!"(&!('!H4'((WJ':P ã:"@S>C<2;;RG}(x:2C*:ga(TFLE2\< !(">2Ï!"" Enter Hex Track Enter Hex Sector *Enter Hex Block =Enter Drive IDN Next sectorP Previous sectorI Next trackO Previous trackT Select trackS Select sectorB Select blockD Select drive6Z Exit from Superzap6L Exit to file list6X Scratchpad operations6C Change sectorA Find ASCII stringH Find HEX sequence Current-Track Current-Sector *Current-Block =Current-Drive 6Scratchpad :-   / 3 CNCPSITOZLBDXAHIg}+'wr PTOD:^#ͫ'CHPD!(!E(:A''( ( A^# ((>2!(PRDDW&!ͤ!DPSI!3(*ip)!9(*kp)!?(*mp)!E(:A'UBLK[iKRj'[k[gR0Ke͉'*WR0SmNXPS*k#"k[RR8 !"kPRPS*k| ;*R+"kSPSN!(*k" !(!"k!<('!I#4' *k&"k= * "k1 !lg+g" *k[RR8 (* "k2(: ((Õ!(UFRTR*i#"i[cR8!"iSPTN!(*i"!q(!"i!6('!I#4' *i&"i= *"i1 !jg+g" *i[cR8 (*"i2(: ((C!(BWTR*i| *c+"iSPBL!(*m"}!(!"m!B('!I#4' *m&"m_ *}"mS !ng+gD =[m*WRD(*}"m2[mKej'[gKR͉'Si"k(: ((!(gPSPM>(!(!F(!):A'!)*ip)!)*kp)!W(ͦlJ'>2ESC Return to sector displayC Copy current sector to scratchpadE Exchange current sector with scratchpad Current :- Scratchpad :- CEv{PSPXPXSP: (K%&%͞PLSP![:2*i"*k">2DSPD:( >"*ͤ!LSEL PSCH :Y (&>2SCCH! X%!Z (>2Y 2"2X 2"2`"Ͱ%' A ! 4'(( J':"("":X ^H Cursor left(^L Cursor right^K Cursor up(^J Cursor down^I Change Side(CR New Line^Q Cancel changes(^Z Save Changes !)!:!I!X!y!!!LEFT:" :=2:" :"/2"TOGL:"/2">2"DOWN:2UPWD:2RGHT:" :"/2":" :<2NWLN>2":p2CHND>2X 2Y QUIT>2X WRBF2կ2%k"Ͱ%O":2͢"Ͱ%_)(!4> (> ~wͶ"!%5Ͱ%>|'9)!4> >|'~©! #&),0369?@ABCDEFGHIJKLMN( yO>wͶ"Ͱ%9)X!0123456789ABCDEFCHDR2#OV| :OV# !"&"&B*L:(*NR[RK_j'"g:U_SeKWj'[RKR͉'Sc:#2<2\2r$>)DLST!Z$(:A2|k%!|)[:&o&"2:G:!(/~:'([k%!~)*"!4> ( Directory list - RDIR222*""+"(9!_'"$*"(!_'"$$*#"[*#!4*[R %*# 2% %!$S*#RDM*"x-%CPST2S%y(G~2S% # :S% CLRA|EL(<!"FMTN!~w#6.#2w#:>W(>O22!2% >2:%o:%ga(IOADDR[%DMASETC%ɀRDFSů2*}"*"}%\!2( *""}WRFS%\"PHYS3:( :a<=(8)SECPNT*k:b!) =PSRD%KiYKk%&(*&B K&*iB A&[%C&*i"&[BkDM\:()_b:( %A&[%PSWR:(A&*%)_e%H16D))))ERRP*|(!()!"*|(!(")(!"MTCHN# B+EXVA)T'LDHL~#foAAHL_MULT>!j|' |'=ʄ')p'DIVD>!))Җ'#B' =ʦ'Î'SETD>D2SETF>F2SETP>P2SETX>X2CHRID2FOLDa8{0_CHRF''CHRO_ALRM>'SPCO> 'CLRS!P$)!"DHDR)(!(CLRL&oa(!X$)CURS!p$):͌(!x$)=͌(!$)COORD(::_: ͮ({'DECOUT 8B|Į(>0'DPNLF#(DFLDT'a(##)CFLDT'a(##)CSTR~((##STRO~('##STRLF#(~'ASCOĐ)!0 0>.'ě)HEXO))HEXW|_)}_)HEXCƐ'@''VMINV!` VMNORM!h$)1:=W!~# xb{,~#o}o5 x!. Ë,y$ K <! 6 # )! wK# <5KByE<80ɾ# d * {~#z +++ r : <>H2 ~@̸¬#™ ŽA #2HXY: [! m<y!~<4: ]<: <~: G: G: $-<x<>--x,/<2>! ͆< y3<3<=:H<:H<g:H~X>ʺ>ú* " : <! m<yW͊E!6>!>*w#"/_~úK d.d!6!56>ú!w! ͆¬yƛ` foڎ<ʟڮڳ<ʾ<(2FS\p|!|!N!E*yoxg |<}ր!ͺEͺx@WGäOWͶͺN7G3<< \=×GFs]ú N<WOs]<O 7WG͸OͰyWCÔ@OͰöWBGͰF\]!ͰO! pGyʕÔF¦:<> : J¼ͧCͧͺyÚR<͊**{zd~#": >o&) N>[$/$+$-/<̈́]:H%>X>YyO ~@/$#D"z8UO! ~$#~$""U‹SP/$͞*ͷq!9"2!!"<<2*!ͨd!~5d͖2W!id d dd|@ozSʇwrj!zU‹! BW@!fr!>!U>*+"+V2W@!>=!B==ʶz!d!={U!F>!w!6z@!BUÍz2Wv{Fozpz Xz4==ʾz"a!ʑz>z!Bz!{*#~{~!V!Bw!C\JlR\zʵ==ʾ!z=ʩڣ>wBw!w!BU!!BU!BUz!=W_ö! =Ä!: =!=+÷_W! BzÄ͞?*!9"͖"*"O*'/7?v (08"*2:DEFGMOVW^_goSI@DLI@DPCI@SPI@XTI@DAD@OTDRINDRCCDRLDDROTIRINIRCCIRLDIROUTDIND CCD LDD OUTIINI CCI LDI RLD RRD LDARIM2 LDAIIM1 STARRETISTAIIM0 RETNNEG DSBBDADCINP OUTPSBCDLBCDSDEDLDEDSHLDLHLDSSPDLSPDRLCRRRCRRALRRARRSLARSRARSLLRSRLRBIT RES SET POP PUSHRST LXI INX DAD DCX STAXLDAXMVI INR DCR ADD ADC SUB SBB ANA XRA ORA CMP MOV CALLJMP LDA STA LHLDSHLDJRC JRNCJRZ JRNZJMPRDJNZCPI ORI XRI ANI SBI IN SUI OUT ACI ADI EI SPHLDI XCHGPCHLXTHLEXX RET HLT CMC STC CMA DAA RAR RAL RRC EXAFRLC NOP *"NZZ NCC POPEP M B C D E H L M A B D @ SP PSW DB ZDT VERS 2.0.00 - CPU IS 8080Z-80"*" ! "!"L2!""" 1N! ( 3"!"H! 7E ! !\$ :] !t 15!_ ͞>-$K A_! ^#V   > e  a  7A~#$ ů2#2D$ A="HA "= "=> âA1 ! "=1 =< *}o͘*ͷ"͂Y }G ""~Ϳ#}` = ADM#}O|G{zr 7 s# x sT]x ͞ADM "L=  = YP >28!"97 14G1B*L" *J!~42 #~#~#2 2 ~#s#r#w>A͞ͷ"ᯕo>g÷2D2$K !%:ʾ w# K.ʏ w ʙ 6 #Ï .± K ʱ w# à ʻ 6 #ñ 6+~l r 7 ~# x r  # x ͘ ͷ"~̈́"!-~H#~E#~X* }| " >M>>> !@ *** ATTEMPT TO OVERLAY ZDT *** A!t =  ʩ # O$  È :© W _ O { `i"L# w#  é GWxL !* * ͷ"*L÷ NEXT PC D!"AhDM=h=l="l* + ʂN͎#v yғ{<_P͇:͎{i*di~#i²iÂe 2$   DA"L:< "͇:͎Wi*Ld>ii͇!~6<_!Eq#3U$ :!E $ <!k *** DISK WRITE ERROR! ***  ͎ !^4!Eq2UA=͞ͷ"~̈́>-$1  +ʵ#s #þ> $ø2A!=}+"x'%y O> , ~6#~+####~,?$_   !"> _  a_!~> b5*~#"B|i}WvƐ'@'OÎ~#͍Ɛ':'$ͨ_ > $> $ |̈́}Ä $>.$z{ , 0 !))))o1^#V#K6 K))))oK!s#r#!4K!6 iV6#iiɷ!Fʁ!:? ƒOʛw> $z$z$>=$w>$V#^#~#Nڋ"z${ $>=$!N ~ʄ#fo÷!$7!I!R"*L">͢*L"7![͞ͱ####~C Z M E I A B D H X Y S P c z m e i a b d h IV!""J+"L!91J7W15*L~!~6=G#^#V#~x#"L! N#F͐ ̈́*>7 *|+"ͨ:5 ̈́>*$*L"ͷ*J"_ *LF#xvʱ!Jxʮx"CFxE8C!x@xDFGOVW^_go!CFxvʱ&!x"#x Fx64pñ##~ñ#+~*8*6#ßC7ñxʙʥʟ7 =xm=ʵͿͿC~#+^#V#: : *H^#VͿ Ϳ xʱ8_*JÜC>>>><7 $@ID  @$!$I$@B@BA"I!!"D @ ! !  !BB!$I @HB $$$!$B"@D $$A" H! AB@HHB@!$@$H! B $I$B@H $H$ " @D $BB I$I$I$II$I I$$ @HIHUUUUUU@$$I$II$D"I HH D@I@@HH D BHB !  "I AI HB"A"$@@I$@A H DBAB!$ I$!! ! @ I !I$BB HH"B$@DHI$ $  D @ !!$BA@$!"AI$I$@$B!! I$$ B @I "$$$I B H !BA$I @!B!DI$B$A"HH