DiskMgr1p SX26U#61}<((}!"!?'}Wy :"@w }}Boot error Press any key for retry $MSXDOS SYS*Q:G!QRvd:mHӥ /2&@a m@o  @`!#@%')+-/1 3@5`79;=?A C@E`GIKMQ S@U`WY_a eikmo/su`wy{} @` @ ` @ @ @o  @`!#@%')+-/1 3@5`79;=?A C@E`GIKMQ S@U`WY_a eikmo/su`wy{} @` @ ` @ @ HPE HLP ! ED80INSTCOM JCOMMAND COM H" MSXDOS SYS   BIRTHDAYPAS !" DIS COM !&ODIS PAS !:QED80 COM !O"ED80 HLP !XEXTRA WOK !ZHEX PAS ![PRIMES COM AK]JABBER WOK !cPRIMES PAS !dREAD ME !fTURTLE PAS !gTURTMSX PAS !lED80INSTMSG qHP COM tPHP80 COM CHP80 ERR HPE COM 'RANDREC PAS RANDREC COMar*TURTLE COMtr*Cursor Moving commands ---------------------- ^K Character Left 5. Alter com Character Right ^@ Character Left (Alt) 2. Alter scr Word Left 7. Load Inst Word Right ^G K Tab Left ^G < Tab Right ^I K Start of line ^I < End of line 6. Alter use Line Up ^P Line Down ^G 6. Alter use Top of Screen ^G ^P Bottom of Screen ^J Page Up 4. Save ED80 Page Down ^I J Start of File ^I ; End of File Press [RETURN] to end; any other key for more Help Text deleting commands ---------------------- ^Q Delete Line w Delete last character 8. Save Inst Delete this character ^G L Delete word left ^L Delete word right ^I w Delete to start line ^I Q Delete to end line Block commands -------------- ^C : Mark Start of block ^C C Mark End of block ^C N Move Block ^C ; Copy Block ^C Q Delete Block ^G H Paste Deleted Block ^C J Read Block from disc ^C O Write Block to disc Press [RETURN] to end; any other key for more Help Quick cursor movement --------------------- ^G ? Go to Line ^I : Go to start of block ^I C Go to end of block ^C ( Remember position ^I ( Return to position Find and Substitute ------------------- ^I > Find First ^D Find Next ^G D Substitute & Find ^G 9 Substitute All Leaving ED80 ------------ ^C I Quit and Exit ^G I Exit without Backup ^C P Exit with a Backup Press [RETURN] to end; any other key for more Help Toggles ------- ^N Toggle change/insert ^G A Toggle auto indent ^G 7. Load Inst Toggle space display Miscellaneous ------------- ^A Deliver TAB character ^G J Restore line ^C > Disc Directory ^C B Erase file from disc ^H Control meta-key ^B Help key ne ^C > Disc Directory ^C B Erase file from disc ^H Control meta-key ^B Help ì LMP TÝ*X^#VSѷ7> ͪ> ͪ_*-*3[1K/*5"3"-S1C/"50?:|(!R!^VR0##HB8E|( >-ͪ!R!0>0^VR8<(ͪ ##ͪ'd DG> ͪ~#ͪɷ !!~ͪ#FALSETRUEE <!"%!4*PZhw !"%!.ͨ SE():<( !> 2!"!Nw#!{":< 2 !\ !:: #~@#w> 2mͨ >2!"!N HP .COM HPE .COMBINST ;G*~ #^#V#~! ^#VM 2#^#V  Halt at PC=OverflowOut of RAM/ by ZeroIndex too LowIndex too HighMaths Call ErrorFile ErrorNumber too largeNumber expectedT]^#VɯR0Z)0 zGR0 Z)80 Z8|o>g||ժDM!I>)=0j 8B=  *%ͅ*%^#V++F+N*%&^#V###~= +++r+s (##N#F##B1#~<# #N#~ 6 6 #6  ! r+s+p+q4##( fT] 6 ~=fN#Fy(C p+q##N#F#~_| {!(M 5 (!@##,#,!wɯ5#~a{ ̈́# T] 6#6+>Ow!(s#r#N#F#`iRDM bk66###<66*%^#V+͸_^#V###~##ͧ ^#V ><ͧ ( ͂ -(7+̧9!400_ 90W( )))|͗ R*%^#V (w#Wɯw#!9O999G7 *#//R> ɷR> -{(-(-(-(Ezͭ {OͶ yƐ'@'ͪS!!"*! *B (08"x<( BO>GC 4 s#r#Kq#p*s#rs#r^#V#N#F"!>w#w#w#w [R0"!R"9N#F!!^#VB 8q#p#q#p+++s#r+}  R s#r#|<( s#r+++|a_ W>z8 :2 D>! 9 ~o&}w~w3 !9!9[nf(nfs#rnf*!}w!nfut!!nfut !9i !9!9[nf(nfs#rnf*!}w!nfut!"nfut !9 !9!9[nf####!}w!nfut7!9!9[~o&>0o&Rut3m!9!9[!!}w~!}(>ʂ~w3û!9!9[*%!"%"% (Y/N) ?*%!"%!! >OͼA"%;;ʹm;3ʹ̓ ;w~22 >N w>Y w:2 D>! 9 *%!"%~ͪ"%~>Y>(w3È!9!9[â (!"%!~!"%>Yͪ!"%>Nͪ) !"%!3!9!9[nf~3ʹ͈*%!"%"%7 (Y/N/ENTER) ? *%!"%!(! >OͼA"%;;ʹm;3ʹ̓ ;w~22 >N w>Y w! } w:2 D>! 9W~! }(>*%!"%~ͪ"%nf~>Y>(w*%!"%"%nf~w3 . !9!9[*%!"%N[ESC] to abort!@"%*%!"%{Omit file type (.!j!Û assumed)! "%üEnter Filename *%!"%!"%!!!utnf#utR3!nf +!nf+~w!ut;ʹm;w~>:>(nf!ѯR <ʙ!!+!!+~w!ut~! }>(ʯ~22 !} w!} w:2 D>! 9~!}(>ʚnf!ѷR>ʗnf+ut~!}>(~!}>(^*%!"%!}ͪ> ͪ!}ͪ"%Á*%!"%!nf+~ͪ"%!nf+> wnf! R>;~3ʹ̓ ;w!nf+~w*%!"%~ͪ"%nf#ut~! }>(~!}>(<*%!"%"%nf!~!}(>w!9!9j!9!9[!!w!~*~!}(>*%!"%! not found ! "%>w!9!9!9[;ʹm;w~22 >0_ W>98 ! } w:2 D>! 9 ~! }(>ʗnf~3ʹ7s#r*%!"%~ͪ"%~! }(>w3ó!9!9[ (!"%!nf~o&!DM@) ? !;!ʹ;d!utnf)T]))nfut;!ʹ;nfnf}w!"%3z!9!9[!utènf#ut R'!knf))T])nf+~!}(>$!"%nf"%!knf))T])nf+~ͪnfnf^#V#s#rÛ!"%nf"%> ͪnfnf^#V#s#r!9`!9!9[nf"Ã9!!ut*~o&ånf#utRnf*#nf+~o&nfʹzØ!9!9!9[~!}>(+[ESC]!"%!Ï~!}>(WF[DEL]!"%!AÏ~> G>ʃ!"%>^ͪ~o&@}ͪÏ!"%~ͪ!"%> ͪ3ä!9!9[!"%nf~!}>WARNING -INPUT FILE MISFORMED!"%!nf!}w ( !"%!!ut~U!nf!ʹ`ìnf"ac!ut*a~o&Ånf#utR*a#nf+~3ʹxô) ( !"%!!utnf~o&nf#utR!"%nf#nf+~o&w> ͪ) -!"%!38!9!9[;ʹm;w~22 >0_ W>98 :2 D>! 9-!}w*%!"%~ͪ"%~o&)T]))~3ʹ7}w;ʹm;w~22 >0_ W>98 :2 D>! 9ʖ~w*%!"%> ͪ"%M~! }(>M~3ʹ~w]!9!9[!ut*%!"%~ͪ"%nf)T]))~o&>0o&Rut;ʹm;w~22 >0_ W>98 ! } w> w:2 D>! 9ʵ~22 >0_ W>98 :2 D>! 9{*%!"%> ͪ"%nf}w33f!9!9[!utÔnf#utR!ynf+Ϳnf+~!}(>nfnf^#V#s#r!"%nf"%!ynf+Ϳnf+~ͪÇ!9#!9!9[!ut!ynf+Ϳ!+~0ƒnfnf!ʹf1¼nfnf!ʹf!"%nf"%2!"%nf"%!9!9!9[w!utnf#ut!ynf+Ϳ!+~0@nf#utÓ1M>wÓ2z~jnf##utwnf#utÓ3“~ʓnf#ut~nf!RѯR  ! nf^#VR>ͼͪnf! s#r!nfnfʹf!9!9!9[nf! +>Hwnf! +>Lwnf!+>Pw!nfb!####!}wnf! +>Cwnf! +>Ownf!+>Mw!>"V!X!*V!2~o&!PR>w*V!3~o&+ut!ut!utnfnf~3ʹnfѷR>!wwwnf+utnf#ut!ynf+Ϳ!+~0 "~a"!"%!"%> !%nfR>ͼͪnf!ͤÝ"~ʄ"nf!>wÝ"nf!ͤL#1"~ʴ">w"!ut!nf!ʹfͤ>wL#2;#!utnf #nf#utR)#!"%!"%>-ͪ"ͤ!utL#3L#~L#ͤ~nf!RѯR  G>%$~o&>@o&}wnf#nf+;~3ʹ̓ ;w#3!9!9!9[nf!ѯR %nf~o&ut+%nf ~o&ut!utnf !Ͷ#nf!Ͷ#!#!## <ʐ%nf#ut%!#nf+~!#nf+~>(%nf#utÐ%nfnfѷR>'*%!"%&WARNING : There is a conflict between!%%"%3&the *%!"%!/&"%!nfʹ#*%!"%t& and the !j& "%!nfʹ#*%!"%î& Commands!& "%&Do you wish to continue anyway*%!"%!&"%;ʹͻ;w 'w !9! 9'!9!9[!utnf#!xnfͿ## >8<}'nf#ut<'nf!R++ѷR>nf~!}>w~'*%!"%'This command must be a single key-press!''"%C)nf!ѷR>S(!xnf+Ϳ"$(&(<;*$(nf*$(^#VnfʹY$;w~ʣ(!xnfͿ"t(v(f ;*t(nf*t(^#VnfʹY$;w~C)!5utnf#(nf+utշR)!xnfͿ!xnf+Ϳ(!xnfͿ") )+*)nf*)nfs#r~w3!9[)!9!9[!ut!xnfͿ^#VnfѯR(<ʵ)nf#uty)nfut!5+)nf#utR*!xnfͿ!xnf#Ϳ)*!9!9[nf"=*?**=*~o&#ut]*nf#utR*nf#nf+!}wP*Í*!9!9[wwnf~3ʹͤ;ʹm;w~22 >0_ W>98 :2 D>! 9ʅ+!utnf#utnf#nf+;~3ʹ];w;ʹm;w~! }>(nf!ѯR < +nfnf}wÛ,~! }>(ʠ+>wÛ,;~3ʹ̓ ;B¿+~wÛ,A+C+E+>wÛ,D+nf!}wÛ,!utnf#utnf#nf+~w!ut~G,!~o&!ʹzU,~3ʹ;ʹm;w~! }>(nf!ѯR <+nfnf}w~~,nfʹ*nf~3ʹͤ*%!"%"%*%!"%"%~w!93 -!9!9[!"%-- ( !"%!*-nf~!}(>c-nf~3ʹk-) ( !"%!f-nf~o&w> ͪÑ-) -!-;ʹ8;w~>->(-!}w~! }>(->w!"%.-Ok?!"%!-nf~w;ʹͻ;w~-%.!9!9[;L. ED80INST.MSG!>.ogB9ʹj;ʃ.!7 s#r!utÜ.nf#utRR/!C"%!"%ͧwͧw!ynf+Ϳ o !wnf+~3ʹ7)T]))~3ʹ7}wÏ.!ut//nf#utRb/!C"%!"%!knf))T]) o "/m/!9!9[!>"/Í/*/^^#Vut!ut!5++/nf#utR0!nf+T]))"//+!ut*/nf~!}(>M0nf#ut*/#nf+*/nf~wnf#ut/*/nf}wnf#ut*/~!}>(*/#!+~!}>(ʠ0*/!}wõ/!!4+T]))"0û0*0!}w*0#!+*/`~w!!5+T]))"00(*0!}w*0#!+*/A~w!ut+1nf#ut5RT1!nf+T]))ʹ*1!92e1!9!9[!>"1Å1>*1ʹ!^#V~wʹ!ʹ!^#V#s#rʹ!^#V!R>2!"%2Too many characters in commands!183!9!9[!>":2<2~*:2^^#V+ut!}3e1!ut!5++}2nf#utR3!nf+T]))"2à2w*2~!}>(2!}3e13!ut*2~o&2nf#utR3*2#nf+~3e12!}3e1p2!}3e1*:2,*:2*:2R*nf#s#r*:2`!!4+T]))#!+~w*:2A!!5+T]))#!+~w!9à3!9!9[!ut3nf#utR4!C"%nf"%ͧw!>nf+~w3ʹm/34!9!9[!""!"%\4 HPED80 Install Program!?4!"%Î4 Copyright HiSoft 1985,6!p4!"%!"%4Normally the working copy of ED80 is!4$!"%5read in from a file called ED80.COM!4#,5Use another file instead!"%!5!օ! ;ʹͻ;ʛ5;!օb5COM!_5ogB9ʹ;ʛ5!7 s#r!utô5nf#utR5!"%ç5!"%5 HPED80 Install Program!5!"%!"%*6 Copyright HiSoft 1985,6! 6!"%!"%!"%c6 Loading ED80 from !P6!օ!"%Ö6 .....Please wait!6!utú6nf#utR6!"%í6!"%6When prompted for a code sequence!6!!"%07use ENTER to keep the old sequence!7"!"%b7or 'D' to remove the sequence!D7!utÆ7nf#utR7!"%y7;!օogB9ʹj;7!7 s#r!ut7nf#utR8!C"%!"%!nf+ͧw7!!+^#V"*"!ut*R8nf#utR}8!C"%!"%!nf+ͧwE8!ʹ͠3!utä8nf#utR8!"%×88!9!9[!>nfRut!j^#V*R!nfRR!ut!utnfF9nf#utR9nf#ut!nfnfʹi utnfut99!ʹ !9!9ò9!9!s9[!>"99!utnfnf##+~w*9nf+~wnf#ut~> >(~>.>(~!}>(9*9nf++>.w*9nf+>Hw*9nf#+>Lw*9nf##+>Pw*9nf###+!}wʹ2!nfb!ut*+!+ut!utnf;nf#utRR;!nfnfʹi utnfut;*+!#ut!utnfÆ;nf#utR;!onf+nfnf+~wy;nf#ut;nf#utRnfnfR+~w;nf#ut!nf!oʹi utnfnfʹ8nfʹͰ !9w"<×<~*<4!}w*<5! }w*<6!}w*<7!}w*<?!}w*<<! }w*<=!-}w*<@!}w*<9!}w*<:!}w*<>!"}w*<;!)}w*<8!2}w^=!9!9[!>"|=~=*|=4!}w*|=5! }w*|=6!}w*|=7!}w*|=?!}w*|==!}w*|=@!}w*|=8!}w*|=9!}w*|=:!}w*|=;!!}w*|=<! }w*|=>!"}wI>!9!9[!>"g>i>!"%Í>User patch area starts at #!r>*g>+*g>R*!͗ ʹm/;!ȅ>COM!>ogB9ʹ;ʪ?;!ȅogB9ʹj;ʪ?*g>+utnf~w!!nfʹ ut!!nfʹ utnf~o&utnf~w*g>^nf+s#rʹ2!9ø?!9!9[!>"??[?How many screen columns!"%!?*?2ʹͳ*?2~!P}G?>5@ʹw<>@ʹ^=U@How many screen rows!"%!A@*?3ʹͳ×@Cursor position lead-in sequence!"%!w@ ;*?E3ʹ͍*;w*?E~!}>(w~/AAIs the row sent before the column!"%!@!*?D;*?Dʹ;wCAOffset for column!"%!2A*?1ʹͳsAOffset for row!"%!eA*?0ʹͳêAClear screen sequence!"%!A;*?J3ʹ͍*;wAClear to End of Line sequence!"%!A;*?O3ʹ͍*;w6BInverse video on sequence!"%!B;*?a3ʹ͍*;w{BInverse video off sequence!"%!aB;*?f3ʹ͍*;wñBUse lead-in!"%!B *?B;*?Bʹ;w*?B~DCBEnter code sequence!"%!B;*?T3ʹ͍*;w~*?T~!}>(wSCUse lead-out!"%!GC *?C;*?Cʹ;w*?C~CáCEnter code sequence!"%!C;*?Y3ʹ͍*;w~*?Y~!}>(w~*?J~!}>(DʹI>!D*?^!+#s#r3,D!9!9[!x!Ϳ"VDXD[*VD!}w*VD#!+!}w!"*!ѷR>*!RR>ʮE!*ʹ#!y*+Ϳ!+~>0>(ʤE!w*+~o&ut;!nf+T]))>3ʹ͍*;CE;!nf+T]))*ʹ';@E*#"áE*+"*!ѯR 0>(CE*!ѷR>ʡE*ʹ[)ëE*#"zDùE!9!9[!>"EE[*!"%ESize of tabs!"%!E *E6ʹͳ"FTabs per scroll!"%!F*E7ʹͳ!"%`FEnd of line display!"%!MF*E.ʹ -ÕFEnd of file display!"%!F*E/ʹ -ýF!9!9[;!ȅFE80!FogB9ʹ;-G;!ȅogB9ʹj;-G!ʹ͠36G!9!9[;!ȅVGE80!SGogB9ʹ;ʕG!!ȅb!!ʹ8!"ëG*#" RG!"%äG%.4!"G*#" RG!"%G!"%HED80 INSTALLATION MENU!G!"%:H----------------------!$H!"%_H1. Return to CP/M!NH!"%ÈH2. Alter screen codes!sH!"%ìH3. Save ED80 as !H!օ!"%H4. Save ED80 as another file!H!"%I5. Alter command codes!H!"%7I6. Alter user options!"I!"%nI7. Load Installation from .E80 file!KI#!"%ãI8. Save Installation to .E80 file!I!!"%IType desired number !"%!I;!;I!"I*#"RJ!"%I2*R+J>2JR=J͸?JRSJ!օͲ9JRJ;!ȅhJCOM!eJogB9;ʍJ!ȅͲ9JR¢J,DJR´J͹EJRJͽFJRJ6G:䅷G!"J*#" RK!"%JU!B;*?T3ʹ͍*;w~*?T~!}>(wSCUse lead-out!"%!GC *?C;*?Cʹ;w* '*.25=@HVY]besv !&+.14:ENSVYbeknvy  *-58;CFIP\c "03=ADGNQX]eux"%(?Vcjm!$';>Qfpsvy !'*-69<FKORWZ]`cfknqt{~ !$',25:=@CFJMPX]`ip|      ' / : > H N W [ e r u {   # , I e s v z   4 > C I W  ) L O [ g x   % - 6 X c f i o t  #-2<?BGL\mrw| ,0;NVat#-?(2!<(|  !"+"-#"!w#T!O:W!GO!^#V#z( |g~w`."('ĜO{(k ʑ 4 Gŷ1xx(1,(͔+>*y, uCu+:iB(z*?#"?:>Ļ*?:?GÑ)*:>:?U<2?>*͖#ͨy,(:>=+G2>:>= 2>:>1!"N8C~#_~#W x S:<2 !w/ / !"P"R#"=>2> 2:8 ͖AUTOEXECBAT COMMAND version 1.11 $7:?(!͖W  B(?:?”+!"&?,7, "&?x(7, ~, #"&?, "&?y121pF͊!20A{>>{*O": N> :O8 >2O> 2/.!"=/PͿ% .Ϳ%(' (#08 0!o~#fo(~#ͼ(8 {Q2OͿ/!' :/2> !R0 {u:O *"O p!Ph~# x22\>h2l>h22|!~ &#~ ! #^#V### _#~ : /   !?(2!<(| !"+"-#"!w#T!ON#!T #~ͼ8 ͐ͼ #͐8 s#r#+! /%>2B͊*} 2*R0(!! ! %*']!\> h:!w>(: <2324>2522:\2\ : !24:¥ :(  :=ʥ !ҥ *'[)&*#}(x:=(r!0hy}_L)))|W9! :(##*!}(3:=(-!0#yD888)))|?o`Q:{!45(> {':324:= J͊p:( !55 6q  :2*3|(p :"yp:\__ͰͰi`&\!"}"#"j\!'}(( {+} pl\ !]>?#  p_NY \!]~O #~N( F # #~ .'s:2R22!"<"J!\k "L[  k y2 ! >!]͓ !?_O!]O:R2Q2N2S:ͥ :ͥ 2:S(p͹ !>! ͓ 2O2P ;:S9G >2O*<6':Q  *<!!2P:S(E! T *L[ (! ]T!T͓ w:2Qr $ (*L\^ "L wͿ {:*<"J p ͐+ &>2R#>h( :0<ͥ  ɯG  ~#? ~# 2Q(2N:Q*JRԿ*J"<!-"J!!w#*Ju%t& :O[ *<  #!"+"-2 *<)!!"[J!R '*J:Q({( *JBK> +*<:P "Ju%t&RͿ*<-R^!V"u!t"04# 4$R2P*J6!"J~<"<-:(( !24*%!"<!-"%"J:' <2'G G !"*<-*%R&:N !):O G *<6(:ͥ *J6#"Ju%t&!g A *OO!' y : :0##Q8QG:x @8Ds8?W~# 9m84_Ws8+_~# <8  *:8{ZW+ mG͆8+mOHdͰ&H!lyP0! ~#G/(.(-7m!g " ,Q *"Q8AG~#: m82_~#: m8&W~k` (_A( P | 0( g- | 0 g!͐m87(4Q00)8G:(%xG͐ x!0 2!o2!l*'h"@!h%@kpO 6#W _ p#p#p#pG( ͐ͼ #͙͐8(O#~+:y ##A8!18><~. #y͙8"( ͙(!8#(*( ?( {_>  >?6 # ͐ͼ #͐/ #͙(8#!L(#80xOyBAVPW >  u!͐ ͆O͆8 yO y~0 ?#~#(+~a8{0 :."[]_/+=;, :\<!]= \ >?#>=dMD]Q:0"PŸ́H!>-2> 2(xAÖ́*"> 2> 2>-)| >a8>p2| 0  MG̈́>.2> 2>:22!!x͡y͡z͡{͡>0!6 / 0:p#w##!x0G!x8 R0?GɷR p! y~#{:2o&& :2=>sUC6C8 )!6~'w# !9~e> O~+e(0 > {> > __DIR COPY TYPE % REN w DEL DATE TIME RENAME w ERASE PAUSE q REM VERIFY MODE BASIC PFORMAT V Insert disk with batch file and strike any key when ready $Strike a key when ready $Invalid drive specification$Bad command or file name$Program too big to fit in memory$ $ file$ bytes free$File not found$Are you sure (Y/N)? $Rename error$Invalid parameter$File cannot be copied onto itself$Content of destination lost before copy $File creation error$Write error$Insufficient disk space$ copied$Current date is $Invalid date$ Enter new date: $Current time is $Invalid time$ Enter new time: $SunMonTueWedThuFriSatCOMBATy5x5A $$DOS ?0610F' MSX-DOS version 2.2 by Tim Paterson 03/06/84[Aaterson 03/06/84ELPS    (/4:Dcfs  AUZiqt /; 2Jy, uCu+:iB(z*?#"?:>Ļ*?:?GÑ)*:>:?U<2?>*͖#ͨy,(:>=+G2>:>= 2>6 MSX-DOS version 1.03 Copyright 1984 by Microsoft $1!0@:@! BRo|O!^#V#z( |g~w,(͔+>*y, uCu+:iB(z*?#"?:>Ļ*?:?GÑ)*:>:?U<2?>*͖#ͨy,(:>=+G2>:>= 2>:>! "#!"%!@~t2ð$_TT(=‚4=2?<2>Â5:>_2>W!>7~ ,>0w!>4:?ʑ2?!>(4:>=2 ?͐,z͐,z/(į:>͂=:>͂7:?(!͖W  B(?:?”+!"&?,7, "&?x(7, ~, #"&?, "&?y1mAy [2"!yG(! (( ( &ET̓Q_I R A2h1 :;( ]S:(QET_N(Y 2k1 h! "!">22ͩP*K~#_~#W x *R *k[ bD( pNT!"| "~ #"i !"=[ !ͲG(kG>2y10s1  S [!! ~#F#fh2=(">@O< ~O@hk:=(O[>!@< O:(o`{{ETSnTtTeTTTbTNTP=s1 hx@k{ys1 h͏@k{COMMAND COM PROGRAM birthday; { This program is a small example of the use of the random access facilities in the file RANDREC.PAS. In fact this simple program could be written more efficiently using several ordinary sequential files. } CONST rsize=38; {the record size : calculated below } TYPE name= ARRAY[1..32] OF CHAR; rec= RECORD n:name; {32 bytes } day,month,year:INTEGER { 6 bytes } END; VAR f: TEXT; r: rec; com: CHAR; {$F RANDREC } FUNCTION upper(c:CHAR):CHAR; BEGIN IF c IN ['a'..'z'] THEN c:=CHR(ORD(c)-ORD('a')+ORD('A')); upper:=c END; PROCEDURE NewFile; BEGIN REWRITE(f,' BIRTHDAY.DAT'); r.n:='}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}'; WRITERAND(f,0,ADDR(r),rsize); END; PROCEDURE GetRec(VAR r:rec); BEGIN WITH r DO BEGIN WRITE('Enter the person''s name '); READLN; READ(n); WRITE('Enter their data of birth dd/mm/yy '); READLN; READ(day); GET(INPUT); READ(month); GET(INPUT); READ(year); END END; PROCEDURE PrintRec(VAR r:rec); VAR i:INTEGER; BEGIN WITH r DO BEGIN FOR i:=1 TO 32 DO IF n[i]<>CHR(0) THEN WRITE(n[i]); WRITELN(day:10,'/',month:2,'/',year:2); END; END; {Finds the number of the last record in the file starting at i } FUNCTION FindEnd(VAR r1:rec;i:INTEGER):INTEGER; VAR dum:BOOLEAN; BEGIN WHILE r1.n[1]<>'}' DO BEGIN i:=i+1; dum:=READRAND(f,i,ADDR(r1),rsize); END; FindEnd:=i; END; PROCEDURE InsertRec(VAR r:rec); VAR r1:rec; i,j:INTEGER; dum:BOOLEAN; BEGIN i:=0; WHILE READRAND(f,i,ADDR(r1),rsize) DO NewFile; WHILE r.n>r1.n DO BEGIN i:=i+1; dum:=READRAND(f,i,ADDR(r1),rsize); END; IF r.n=r1.n THEN WRITERAND(f,i,ADDR(r),rsize) ELSE BEGIN {Insert record in file} FOR j:=FindEnd(r1,i) DOWNTO i DO BEGIN dum:=READRAND(f,j,ADDR(r1),rsize); WRITERAND(f,j+1,ADDR(r1),rsize) END; WRITERAND(f,i,ADDR(r),rsize); END END; FUNCTION DeleteRec(VAR r:rec):BOOLEAN; VAR r1:rec; i,j:INTEGER; dum:BOOLEAN; BEGIN i:=0; IF READRAND(f,i,ADDR(r1),rsize) THEN NewFile; WHILE r1.n'}' THEN PrintRec(r); i:=i+1; UNTIL r.n[1]='}'; END; BEGIN RESET(f,' BIRTHDAY.DAT'); IF EOF(f) THEN NewFile; REPEAT WRITELN; WRITELN('Type one of '); WRITELN('(I)nsert '); WRITELN('(D)elete '); WRITELN('(E)xit '); WRITELN('(P)rint '); READLN; READ(com); CASE upper(com) OF 'I': BEGIN GetRec(r); InsertRec(r) END; 'D': Delete; 'E': CLOSE(f); 'P': Print END; UNTIL upper(com)='E' END. BEGIN GetRec(r); InsertRec(r) END; 'D': Delete; 'E': CLOSE(f); 'P': Print END; UNTIL upper(com)=ì LMP TÝ*X^#VSѷ7> ͪ> ͪ_*-*3[1K/*5"3"-S1C/"50?:|(!R!^VR0##HB8E|( >-ͪ!R!0>0^VR8<(ͪ ##ͪ'd DG> ͪ~#ͪɷ !!~ͪ#FALSETRUEE <!"%!4*PZhw !"%!.ͨ SE():<( !> 2!"!Nw#!{":< 2 !\ !:: #~@#w> 2mͨ >2!"!N HP .COM HPE .COMdis ;G*~ #^#V#~! ^#VM 2#^#V  Halt at PC=OverflowOut of RAM/ by ZeroIndex too LowIndex too HighMaths Call ErrorFile ErrorNumber too largeNumber expectedT]^#VɯR0Z)0 zGR0 Z)80 Z8|o>g||ժDM!I>)=0j 8B=  *%ͅ*%^#V++F+N*%&^#V###~= +++r+s (##N#F##B1#~<# #N#~ 6 6 #6  ! r+s+p+q4##( fT] 6 ~=fN#Fy(C p+q##N#F#~_| {!(M 5 (!@##,#,!wɯ5#~a{ ̈́# T] 6#6+>Ow!(s#r#N#F#`iRDM bk66###<66*%^#V+͸_^#V###~##ͧ ^#V ><ͧ ( ͂ -(7+̧9!400_ 90W( )))|͗ R*%^#V (w#Wɯw#!9O999G7 *#//R> ɷR> -{(-(-(-(Ezͭ {OͶ yƐ'@'ͪS!!"*! *B (08"x<( BO>GC 4 s#r#Kq#p*s#rs#r^#V#N#F"!>w#w#w#w [R0"!R"9N#F!!^#VB 8q#p#q#p+++s#r+}  R s#r#|<( s#r+++|a_ W>z8 :2 D>! 9V ~o&>ao&R>Ao&}w~w3f +!9!9[nfut+nfnfR> !"%nf"%nf!͗ nfutnf+ nf#utR" +!"%nf"%> ͪnf~o&!͗ !"%nf"%> !>ͼͪnfutnf+j nf#utR +nf~w~!}>ʟ ~o&}w~> G>ʴ >.w!"%nf"%~ͪ] nfut!"%nf"%Ê 3!9+!9!9[!ut!ut+nf^#V~22 >0_ W>98 >A_ W>F8 :2 D>! 9ʋnfͅ,+nf))))nfutnf^#V~22 >0_ W>98 :2 D>! 9nf^#V~o&>0o&Rutnf^#V~22 >A_ W>F8 :2 D>! 9enf^#V~o&>Ao&R utnf^#V~22 >a_ W>f8 :2 D>! 9nf^#V~o&>ao&R ut!utnf!ѯR(<nfͅnf!ѯR <ʋnfut#+!9!9[!\~w~!}>(]> wm!@~o&}w!C!+|!}!~w!utänf#utR+!Cnf##+|!}!!\nf~w×! utnf#ut R8+!Cnf###+|!}!!\nf~w3C+!9!9[!"hj}*hnf*Rs#r*h##nf*Rs#r*h####~w!*+|R!T]))!!ut+!^#V!nf+|R!T]))^#VѷR>.nf#ut*utnfOnf+utշR+!nf#+|R!T]))!nf+|R!T]))B*#"!nf+|R!T]))!! 9!9+!9!9[!Cʹ!Cʹ~3ʹC3@+!9!9[!C"%͎ ut*+"nfut*Ïnf#utR+!nf+|R!T]))!nf#+|R!T]))Â+!9!9[!ut*++nf#utRd+!nf+|R!T]))"^`!"%nf"%nfw> ͪ*^^#V*!͗ *^##^#V*!͗ *^####~!"%nf"% Byte!O!"%nf"% Mess!O*!"%nf"% Space!OO!"%nf"%G Word!A!"%nf"%p+!9!9[!C! +|!}!>Dw!C! +|!}!>Iw!C!+|!}!>Sw+!9!9[ʹp!#!Cb!"%!#"%*!͗ *!͗ !#ʹO+!9!9[ʹp!#!C!"!#ʹ"!#ʹ"+!#~u!C"%!#"%͎ ut!#ʹut!#ʹut+*#~> >(!#ͅ*#~B#wGM0>wGS=>wGWG>wnfnf~3ʹC!C"%!#"%o å!9Ã+!9!9[**~o&"*#"û+!9!9[ʹ̓*utʹ̓*utnf!ѷR>nfutnf!ѯR nf*ѷR>w+!9!9[;nfʹr;ʱnf*Rut!nf!| R! Ϳ"2!nf!| R! Ϳ ogB9 nf!} w !"C 6  [2!9û+!9!9[ʹ̓*!@"*!@"*!"*!"*!")+!9!9[ʹ̓*!ѷR>l!utu!utnf***utÝ+!9!9[!*+|R!T]))"*####~**~22! ogB9:2 D>! 9L!"2! ogB9 [2!9!ut~!"2! ogB9 [2!9*####ut·!"2!b ogB9 [2!9!ut!"2!b ogB9 [2!9*####ut*#"!*+|R!T]))##^#V#ut+*nfR>*!}22!*!| R! Ϳ ogB9:2 D>! 9*nfR>**~22! ogB9:2 D>! 9*#"*nfѯR <*#"+!9!9[ʹͻʹk?+!9!9[:ٷe*#"+!9!9[*!*+|R!T]))^#VR>ʹ͝ʹͻ*R”*R*!ѷR>ʹ)ʹÑR4*}1ʹÑR]*!ѷR>ZʹÑRqRy?ÑR‘?ʹ̓RʨR°?R*RʹR1*Rʹ.Rʹͻ?.R%R.ʹ̓RGʹR*}*RtʹRʈR™>2ʹkRʹͻ*!ѯR <*!ѯR <ʹRʹ̓ù!+!9!9[:ٷ !"%= Performing first pass!( >2!*+|R!T]))!s#r!utÍ nf#utR +!nf| R! Ϳ"2  [2!9À !"!"+2ٯ2*!*+|R!T]))^#VR>ʝ!!*+|R!T]))"D!F!*D!####~>>(ʆ!+**D!##^#VѷR>ʆ!ʹ\!*D!##^#V#"*#"æ!ʹk**ѷR> F!+!9!9[: "!"%ʹ!^#V"%"HL!!_"7"!"%ʹ!^#V"%,"IX!*"_"_"!"%ʹ!^#V"%W"IY!U"h"+!9!9[ʹ̓!"%ʹ!^#V"%>#ͪ*!͗ ø"+!9!9[ʹͻut;nfʹr;#!"%ʹ!^#V"%>Lͪ1#!"%ʹ!^#V"%>#ͪ!"%ʹ!^#V"%nf!͗ _#+!9!9[!"%ʹ!^#V"%>(ͪʹ͸"!"%ʹ!^#V"%>)ͪÿ#+!9!9[!"%ʹ!^#V"%#DEFW !#*"ʹ͸"$+!9!9[ʹ)ut;nfʹr;s$!"%ʹ!^#V"%>LͪÎ$!"%ʹ!^#V"%>#ͪ!"%ʹ!^#V"%nf!͗ ü$+!9!9[!"%ʹ!^#V"%>(ͪʹ!**##~o&"*#"*!ѷR>N%!"%ʹ!^#V"%*!DM@v%!"%ʹ!^#V"%>+ͪ*!DM@!"%ʹ!^#V"%>)ͪÚ%+!9!9[nfR%!"%ʹ!^#V"%>HͪÝ&R&!"%ʹ!^#V"%>LͪÝ&RM&:ٷ%&ʹͼ$J&!"%ʹ!^#V"%B&(HL)!>&Ý&Ru&!"%ʹ!^#V"%>AͪÝ&!"%ʹ!^#V"%nf>Bo&}ͪç&+!9!9[nfR&!"%ʹ!^#V"%&NZ!&"(R'!"%ʹ!^#V"%>Zͪ"(RM'!"%ʹ!^#V"%B'NC!@'"(Ru'!"%ʹ!^#V"%>Cͪ"(R¥'!"%ʹ!^#V"%Ú'PO!'"(R'!"%ʹ!^#V"%'PE!'"(R'!"%ʹ!^#V"%>Pͪ"(R"(!"%ʹ!^#V"%>Mͪ,(+!9!9[nfRz(!"%ʹ!^#V"%o(BC!m((Rª(!"%ʹ!^#V"%ß(DE!((R(ʹ!(R(!"%ʹ!^#V"%(SP!((+!9!9[nfRE)!"%ʹ!^#V"%:)BC!8)ø)Ru)!"%ʹ!^#V"%j)DE!h)ø)R‹)ʹ!ø)R¸)!"%ʹ!^#V"%ð)AF!))+!9!9[nfR*!"%ʹ!^#V"% *ADD A,!*q+RH*!"%ʹ!^#V"%=*ADC A,!7*q+Rz*!"%ʹ!^#V"%o*SUB !k*q+R®*!"%ʹ!^#V"%ã*SBC A,!*q+R*!"%ʹ!^#V"%*AND !*q+R+!"%ʹ!^#V"%+XOR !+q+RC+!"%ʹ!^#V"%8+OR !5+q+Rq+!"%ʹ!^#V"%i+CP !f+#F~++!9!9[:ٷʤ+*#"ʹͻ:ٷʻ+*+"*RY-*R+!"%ʹ!^#V"%+RLC !+V-R/,!"%ʹ!^#V"%$,RRC ! ,V-R`,!"%ʹ!^#V"%U,RL !R,V-R‘,!"%ʹ!^#V"%Æ,RR !,V-R,!"%ʹ!^#V"%ø,SLA !,V-R,!"%ʹ!^#V"%,SRA !,V-R'-!"%ʹ!^#V"%-SLO !-V-RV-!"%ʹ!^#V"%N-SRL !J--R‹-!"%ʹ!^#V"%À-BIT !|--R½-!"%ʹ!^#V"%ò-RES !--R-!"%ʹ!^#V"%-SET !-*!ѷR>'.!"%ʹ!^#V"%*!DM@>,ͪ*ʹ͚%/@.+!9!9[*Rƒ.!"%ʹ!^#V"%>Iͪ/R«.!"%ʹ!^#V"%>Dͪ/R.!"%ʹ!^#V"%.IR!./R/!"%ʹ!^#V"%/DR!.+!9!9[ʹͻ*R3*R¢/!"%ʹ!^#V"%e/IN !b/*ʹ͚%!"%ʹ!^#V"%×/,(C)!/Ê3R/!"%ʹ!^#V"%/OUT (C),!/*ʹ͚%Ê3R\0*}$0!"%ʹ!^#V"%0ADC HL,!0L0!"%ʹ!^#V"%D0SBC HL,!=0*ʹ,(Ê3R0!"%ʹ!^#V"%Â0LD !0*}0*ʹ,(!"%ʹ!^#V"%>,ͪʹ_#0ʹ_#!"%ʹ!^#V"%>,ͪ*ʹ,(Ê3R:1*R71!"%ʹ!^#V"%/1NEG!,1Ê3R«1*Ry1!"%ʹ!^#V"%n1RETN!j1è1R¨1!"%ʹ!^#V"%à1RETI!1Ê3RN2*R1!"%ʹ!^#V"%1IM 0!1K2R2!"%ʹ!^#V"%2IM 1! 2K2RK2!"%ʹ!^#V"%C2IM 2!?2Ê3RŠ3*R2!"%ʹ!^#V"%Ä2LD I,A!~2Ê3R2!"%ʹ!^#V"%ø2LD R,A!2Ê3R2!"%ʹ!^#V"%2LD A,I!2Ê3R+3!"%ʹ!^#V"% 3LD A,R!3Ê3R\3!"%ʹ!^#V"%Q3RRD!N3Ê3RŠ3!"%ʹ!^#V"%Â3RLD!3 5R 5*R3!"%ʹ!^#V"%ÿ3LD!3@. 5R4!"%ʹ!^#V"%3CP!3@. 5R94!"%ʹ!^#V"%)4IN!'4@. 5R 5*Rx4!"%ʹ!^#V"%m4OUTI!i4 5Rª4!"%ʹ!^#V"%ß4OUTD!4 5R4!"%ʹ!^#V"%4OTIR!4 5R 5!"%ʹ!^#V"%5OTDR!45+!9!9[*R 7*Rm5!"%ʹ!^#V"%b5NOP!_5 7R¤5!"%ʹ!^#V"%Ù5EX AF,AF'!5  7R5!"%ʹ!^#V"%5DJNZ !5ʹ$ 7R6!"%ʹ!^#V"%6JR !6ʹ$ 7RW6!"%ʹ!^#V"%C6JR NZ,!=6ʹ$ 7R“6!"%ʹ!^#V"%6JR Z,!z6ʹ$ 7R6!"%ʹ!^#V"%ü6JR NC,!6ʹ$ 7R 7!"%ʹ!^#V"%6JR C,!6ʹ$ê<R7*}y7!"%ʹ!^#V"%=7ADD !97ʹ!!"%ʹ!^#V"%>,ͪ*ʹ,(7!"%ʹ!^#V"%Õ7LD !7*ʹ,(!"%ʹ!^#V"%>,ͪʹ͸"ê<R¸9!"%ʹ!^#V"%7LD !7*R68!"%ʹ!^#V"%+8(BC),A!%8õ9Rj8!"%ʹ!^#V"%_8A,(BC)!Y8õ9Rž8!"%ʹ!^#V"%Ó8(DE),A!8õ9R8!"%ʹ!^#V"%8A,(DE)!8õ9R 9ʹ_#!"%ʹ!^#V"%>,ͪʹ!õ9RF9ʹ!!"%ʹ!^#V"%>,ͪʹ_#õ9R9ʹ_#!"%ʹ!^#V"%t9,A!r9õ9Rµ9!"%ʹ!^#V"%ä9A,!9ʹ_#ê<R6:*}:!"%ʹ!^#V"%9DEC !9*ʹ,(3:!"%ʹ!^#V"%:INC !:*ʹ,(ê<Ru:!"%ʹ!^#V"%]:INC !Y:*ʹ͚%ê<R´:!"%ʹ!^#V"%Ü:DEC !:*ʹ͚%ê<R;!"%ʹ!^#V"%:LD !:*ʹ͚%!"%ʹ!^#V"%>,ͪʹh"ê<Rª<*RU;!"%ʹ!^#V"%J;RLCA!F;ê<R‡;!"%ʹ!^#V"%|;RRCA!x;ê<R¸;!"%ʹ!^#V"%í;RLA!;ê<R;!"%ʹ!^#V"%;RRA!;ê<R,ͪ*ʹ͚%g=+!9!9[*ʹ)*ʹ͚%â=+!9!9[*R=!"%ʹ!^#V"%=RET !=*ʹͧ&-CR=?*}?*RD>!"%ʹ!^#V"%9>RET!6>?Ru>!"%ʹ!^#V"%j>EXX!g>?R>!"%ʹ!^#V"%Ü>JP (!>ʹ!!"%ʹ!^#V"%>)ͪ?R?!"%ʹ!^#V"%>LD SP,!>ʹ!:?!"%ʹ!^#V"%%?POP !!?*ʹ(-CRŸ?!"%ʹ!^#V"%c?JP !`?*ʹͧ&!"%ʹ!^#V"%>,ͪʹ͸"-CR‰A*R?!"%ʹ!^#V"%?JP !?ʹ͸"ÆAR?ʹ~+ÆAR\@!"%ʹ!^#V"%$@OUT (!@ʹh"!"%ʹ!^#V"%Q@),A!N@ÆAR´@!"%ʹ!^#V"%Å@IN A,(!@ʹh"!"%ʹ!^#V"%>)ͪÆAR@!"%ʹ!^#V"%@EX (SP),!@ʹ!ÆAR)A!"%ʹ!^#V"%AEX DE,HL!AÆARYA!"%ʹ!^#V"%NADI!LAÆAR†A!"%ʹ!^#V"%~AEI!|A-CRA!"%ʹ!^#V"%ñACALL !A*ʹͧ&!"%ʹ!^#V"%>,ͪʹ͸"-CRB*}ʖB*R@B!"%ʹ!^#V"%,BCALL !'Bʹ͸"ÓBR`B>2>2ʹx+ÓBRvBʹ/ÓBR“B>2>2ʹx+B!"%ʹ!^#V"%ôBPUSH !B*ʹ(-CRB*ʹ)ʹh"-CR-C!"%ʹ!^#V"%CRST #!C*)))!͗ D9C+!9!9[!"%ʹ!^#V"%oCDEFB !jC*ut*+ÖCnf#utR D+nf*ѷR>C!"%ʹ!^#V"%>,ͪ!"%ʹ!^#V"%>#ͪnf*~o&!͗ ÉC+!9!9[ʹ͝!*+|R!T]))####~bD9CF! 9ʢD9C9E!"%ʹ!^#V"%DDEFM "!D*ut*+Dnf#utRE+!"%ʹ!^#V"%nf*~ͪD!"%ʹ!^#V"%>"ͪF€E!"%ʹ!^#V"%_EDEFS !ZE**R!DM@FF**RRʥEREõEError in DEFW!"%!E !C"%o FREʹͿ#FRFʹͿ#!"%ʹ!^#V"%>,ͪʹ͸"+!9!9[*!*+|R!T]))^#VR>xFDFʹͻ*R–F5FR¨FͳʋG*#"LG*!ѷR>G!*++|R!T]))##^#V*R>G*+"+2ٯ2*"*"ʹk~H!"%nf"%**!͗ > ͪ**R!ѷR>^H!"%nf"%! }ͪôH*ut*+}Hnf#utRH+!"%nf"%*nf~o&!͗ pH!"%nf"%> !>ͼͪ! }ͪ*"*"*!}22!*!| R! Ϳ ogB9:2 D>! 9aI!"%nf"%>Lͪ**!͗ ~ʁI!"%nf"%! }ͪÕI!"%nf"%> ͪ#F~**R!ѷR>cJ!"%nf"%>;ͪ*ut*+Inf#utRbJ+*nf~o&"*!ѷR>-J*"*! R>IJ>.o&"!"%nf"%*}ͪI!"%nf"%*nfѷR>G3ØJ+!9!9[!C! +|!}!>Gw!C! +|!}!>Ew!C!+|!}!>Nw!Q!Cbʹ!"%:KPerforming second pass!$K!Q3ʹF^K+!9!9[!"%ÎKB Byte Data!K!"%úKD Display data areas!K!"%KE,X Exit to CP/M!K!"%LG Generate dissassembly to disc!K#!"%5LH Help!+L !"%]LK Kill data area!IL!"%ÇLL List disassembly!qL!"%íLM Message Data!L!"%LP Put .DIS file to disc!L!"% MR Get .DIS file from disc!L!"%1MS Space data!!M!"%TMW Word data!EM!"%#!!C!~ʨM!"%ÚMNo file!Mï p!#!C!#~7NMRun Address ?!"%!M !C"NEnd Address ?!"%!M !C"%o !C*R"!" _ W>~8  [2!9!b"2 !}_ W!}8  [2!9!"2!b ogB9! ogB9 !/"C 6  [2!92+!C"%o !C"%ͧ2;:3 ;2:22 >B w>K w>R w>S w>W w:2 D>! 9WO2:BjO3PD{O!PGˆO͘JPK•O@PHʟO?§O^KPL¼O!>3FPMO>3PPOPROOPSO>3PWP>3:>E>(:>X>(NU!͗ ü$+!9!9[!"%ʹ!^#V"%>(ͪʹ!**{$r,y,l- } PROGRAM disassembler; {$O- is used so that e.g. #7F80+#99 does not give overflow} { (C) Copyright David Nutkins 1984. This program lets you disassemble a .COM and interactively set up data areas which may be saved to disc (in a .DIS file) so they do not have to be re-entered on subsequent sessions. Disassembly may be of all or part of the program and sent to disc (as a .GEN file) or screen. When compiled use DIS filename.COM to disassemble filename.COM There are 4 sorts of data areas that may be specified: 1. Messages. Disassmbled as DEFM and DEFB 2. Byte Data. Disassembled as DEFB 3. Word data. Disassembled as DEFW - useful for jump tables etc 4. Space. Disassembled as DEFS - avoids disassembling junk. Commands are entered in the form of a single letter normally followed by two hexadecimal numbers. For details of the commands use the H (for Help) command and see the procedures in this file. Only exit using E or X do not use CTRL C. Some of the techniques used in this program are very machine specific and it is not an example of how to program in Pascal in general but it does show how to use the Hisoft Pascal extentions to provide a systems programming tool of pratical use. If there is a feature that you dislike or think should be added, then feel free to improve it. } LABEL 99; CONST tablesize=31; { X*4-1} fsize=64; { X*8 } gsize=1; datasize=30; TYPE flag=(B,W,S,M); {Byte, Word, Space, Message } filename=ARRAY [1..14] OF CHAR; datarec=RECORD sta,fin:INTEGER; drtyp:flag END; VAR runstart,codestart,finish,size:INTEGER; i,ch,oldcx,cx,dnext,olddx,dx:INTEGER; com:CHAR; Xreg:(HL,IX,IY); firstdone,indexed:BOOLEAN; opc:0..63; typ,top2:0..3; top,bot:0..7; legal,meslegal,mesilleg,allchars: SET OF CHAR; data:ARRAY[1..datasize] OF datarec; table:ARRAY[0..tablesize] OF SET OF 0..255; dfile:TEXT; infile:TEXT[fsize]; gfile: TEXT[gsize]; fname:filename; {$F HEX } PROCEDURE getfname; VAR i:1..11; ch:CHAR; BEGIN ch:=PEEK(#5C,CHAR); IF ch=CHR(0) THEN ch:=' ' ELSE ch:=CHR(64+ORD(ch)); fname[1]:=ch; FOR i:=1 TO 8 DO fname[i+2]:=PEEK(#5C+i,CHAR); FOR i:=9 TO 11 DO fname[i+3]:=PEEK(#5C+i,CHAR) END; PROCEDURE DataEnter(lo,hi:INTEGER;f:flag); VAR i,j:INTEGER;cur:datarec; BEGIN WITH cur DO BEGIN sta:=lo-runstart;fin:=hi-runstart;drtyp:=f END; data[dnext]:=cur; i:=1; WHILE cur.sta>data[i].sta DO i:=i+1; FOR j:=dnext DOWNTO i DO data[j+1]:=data[j]; dnext:=dnext+1; data[i]:=cur END; PROCEDURE EnterCommand(f:flag); BEGIN DataEnter(READHEX(INPUT),READHEX(INPUT),f) END; { K command - removes data area i where i is as given by the D command } PROCEDURE KillData; VAR i,j:INTEGER; BEGIN READ(i); dnext:=dnext-1; FOR j:=i TO dnext DO data[j]:=data[j+1] END; { D command - displays the current data areas } PROCEDURE ListData(VAR f:TEXT); VAR i:INTEGER; BEGIN FOR i:=1 TO dnext-1 DO WITH data[i] DO BEGIN WRITE(f,i,sta+runstart:6:H,fin+runstart:6:H); CASE drtyp OF B: WRITE(f,' Byte'); M: WRITE(f,' Mess'); S: WRITE(f,' Space'); W: WRITE(f,' Word') END; WRITELN(f) END END; PROCEDURE extdis; BEGIN fname[12]:='D';fname[13]:='I';fname[14]:='S'; END; { P command saves the address and data information to .DIS file } PROCEDURE PutDIS; BEGIN extdis; REWRITE(dfile,fname); WRITELN(dfile,runstart:4:H,finish:6:H); ListData(dfile) END; { R command retrives the info from a .DIS file - useful if you have made a lot of mistakes } PROCEDURE GetDIS; VAR lo,hi,junk:INTEGER; f:flag; BEGIN extdis; RESET(dfile,fname); dnext:=1; runstart:=READHEX(dfile); finish:=READHEX(dfile); WHILE NOT EOF(dfile) DO BEGIN READ(dfile,junk); lo:=READHEX(dfile); hi:=READHEX(dfile); WHILE dfile^=' ' DO GET(dfile); CASE dfile^ OF 'B': f:=B; 'M': f:=M; 'S': f:=S; 'W': f:=W END; DataEnter(lo,hi,f); READLN(dfile) END END; PROCEDURE getch; BEGIN ch:=ORD(PEEK(cx+codestart,CHAR)); cx:=cx+1; END; FUNCTION getaddr:INTEGER; VAR lo,hi:INTEGER; BEGIN getch;lo:=ch; getch;hi:=ch; IF hi>127 THEN hi:=hi-256; IF hi=-128 THEN getaddr:=#8000+lo ELSE getaddr:=256*hi+lo END; FUNCTION inrange(i:INTEGER):BOOLEAN; BEGIN i:=i-runstart; inrange:=(i>=0) AND (i<=finish) END; PROCEDURE enter(adr:INTEGER); BEGIN IF inrange(adr) THEN BEGIN adr:=adr-runstart; table[adr DIV 256]:=table[adr DIV 256] +[adr MOD 256] END; END; PROCEDURE getbits; BEGIN getch; typ:=ch DIV 64; opc:=ch MOD 64; top:=opc DIV 8; bot:=opc MOD 8; top2:=top DIV 2; END; FUNCTION eaddr:INTEGER; VAR off:INTEGER; BEGIN getch; IF ch>127 THEN off:=-256 ELSE off:=0; eaddr:=off+ch+cx+runstart END; PROCEDURE defmod; VAR maxcx,enddef:INTEGER; BEGIN WITH data[dx] DO BEGIN CASE drtyp OF M: IF PEEK(cx+codestart,CHAR) IN meslegal THEN BEGIN legal:=meslegal;maxcx:=MAXINT END ELSE BEGIN legal:=mesilleg;maxcx:=cx+4 END; S: BEGIN legal:=allchars;maxcx:=MAXINT END ELSE BEGIN legal:=allchars;maxcx:=cx+4 END; cx:=cx+1; enddef:=data[dx].fin+1; WHILE (cx=data[dx].sta THEN defmod ELSE BEGIN getbits; CASE typ OF 0:CASE bot OF 0: IF top>1 THEN enter(eaddr); 1: IF NOT ODD(top) THEN nn1; 2: IF top>3 THEN nn1; 4,5: r1; 6: BEGIN r1;getch END END; 1,2:r1; 3:CASE bot OF 2:nn1; 3:CASE top OF 0:nn1; 1:BEGIN getbits;r1 END; 2,3:getch END; 4:nn1; 5:IF ODD(top) THEN CASE top2 OF 0:nn1; 1,3:BEGIN indexed:=TRUE;pass1byte END; 2:BEGIN getbits; IF (typ=1) AND (bot=3) THEN nn1; END END; 6:getch END END END END; PROCEDURE FirstPass; LABEL 99; VAR i:INTEGER; BEGIN IF firstdone THEN GOTO 99; WRITELN('Performing first pass'); firstdone:=TRUE; data[dnext].sta:=MAXINT; FOR i:=0 TO tablesize DO table[i]:=[]; cx:=0; dx:=1; REPEAT Xreg:=HL; indexed:=FALSE; IF cx>=data[dx].sta THEN WITH data[dx] DO BEGIN IF drtyp=W THEN WHILE cx<=fin DO nn1; cx:=fin+1; dx:=dx+1 END ELSE pass1byte UNTIL cx>finish; 99: END; PROCEDURE SecondPass(VAR gfile:TEXT;prn:BOOLEAN); VAR i,secondfin:INTEGER; PROCEDURE gX; BEGIN CASE Xreg OF HL:WRITE(gfile,'HL'); IX:WRITE(gfile,'IX'); IY:WRITE(gfile,'IY') END END; PROCEDURE n; BEGIN getch; WRITE(gfile,'#',ch:2:H) END; PROCEDURE nn; VAR i:INTEGER; BEGIN i:=getaddr; IF inrange(i) THEN WRITE(gfile,'L') ELSE WRITE(gfile,'#'); WRITE(gfile,i:4:H) END; PROCEDURE bnn; BEGIN WRITE(gfile,'('); nn; WRITE(gfile,')') END; PROCEDURE oneDEFW; BEGIN WRITE(gfile,'DEFW '); cx:=oldcx; nn END; PROCEDURE e; VAR i:INTEGER; BEGIN i:=eaddr; IF inrange(i) THEN WRITE(gfile,'L') ELSE WRITE(gfile,'#'); WRITE(gfile,i:4:H) END; PROCEDURE Xb; BEGIN WRITE(gfile,'('); gX; ch:=ORD(PEEK(codestart+oldcx+2,CHAR)); cx:=cx+1; IF ch>127 THEN WRITE(gfile,ch-256:0) ELSE WRITE(gfile,'+',ch:0); WRITE(gfile,')') END; PROCEDURE reg(no:INTEGER); BEGIN CASE no OF 4:WRITE(gfile,'H'); 5:WRITE(gfile,'L'); 6:IF indexed THEN Xb ELSE WRITE(gfile,'(HL)'); 7:WRITE(gfile,'A') ELSE WRITE(gfile,CHR(no+ORD('B'))); END; PROCEDURE cc(i:INTEGER); BEGIN CASE i OF 0:WRITE(gfile,'NZ'); 1:WRITE(gfile,'Z'); 2:WRITE(gfile,'NC'); 3:WRITE(gfile,'C'); 4:WRITE(gfile,'PO'); 5:WRITE(gfile,'PE'); 6:WRITE(gfile,'P'); 7:WRITE(gfile,'M') END END; PROCEDURE dd(i:INTEGER); BEGIN CASE i OF 0:WRITE(gfile,'BC'); 1:WRITE(gfile,'DE'); 2:gX; 3:WRITE(gfile,'SP') END END; PROCEDURE qq(i:INTEGER); BEGIN CASE i OF 0:WRITE(gfile,'BC'); 1:WRITE(gfile,'DE'); 2:gX; 3:WRITE(gfile,'AF') END END; PROCEDURE addop(a:INTEGER); BEGIN CASE a OF 0:WRITE(gfile,'ADD A,'); 1:WRITE(gfile,'ADC A,'); 2:WRITE(gfile,'SUB '); 3:WRITE(gfile,'SBC A,'); 4:WRITE(gfile,'AND '); 5:WRITE(gfile,'XOR '); 6:WRITE(gfile,'OR '); 7:WRITE(gfile,'CP ') END END; PROCEDURE byte; VAR i:INTEGER; PROCEDURE cb; BEGIN IF indexed THEN cx:=cx+1; getbits; IF indexed THEN cx:=cx-1; CASE typ OF 0: CASE top OF 0:WRITE(gfile,'RLC '); 1:WRITE(gfile,'RRC '); 2:WRITE(gfile,'RL '); 3:WRITE(gfile,'RR '); 4:WRITE(gfile,'SLA '); 5:WRITE(gfile,'SRA '); 6:WRITE(gfile,'SLO '); 7:WRITE(gfile,'SRL ') END; 1:WRITE(gfile,'BIT '); 2:WRITE(gfile,'RES '); 3:WRITE(gfile,'SET ') END; IF typ>0 THEN WRITE(gfile,top:0,','); reg(bot) END; PROCEDURE ed; PROCEDURE idr; BEGIN CASE top OF 4:WRITE(gfile,'I'); 5:WRITE(gfile,'D'); 6:WRITE(gfile,'IR'); 7:WRITE(gfile,'DR') END; END; BEGIN getbits; CASE typ OF 1:CASE bot OF 0:BEGIN WRITE(gfile,'IN ');reg(top);WRITE(gfile,',(C)') END; 1:BEGIN WRITE(gfile,'OUT (C),');reg(top) END; 2:BEGIN IF ODD(top) THEN WRITE(gfile,'ADC HL,') ELSE WRITE(gfile,'SBC HL,'); dd(top2) END; 3:BEGIN WRITE(gfile,'LD '); IF ODD(top) THEN BEGIN dd(top2);WRITE(gfile,',');bnn END ELSE BEGIN bnn;WRITE(gfile,',');dd(top2) END END; 4: CASE top OF 0:WRITE(gfile,'NEG') END; 5:CASE top OF 0:WRITE(gfile,'RETN'); 1:WRITE(gfile,'RETI') END; 6:CASE top OF 0:WRITE(gfile,'IM 0'); 2:WRITE(gfile,'IM 1'); 3:WRITE(gfile,'IM 2') END; 7: CASE top OF 0:WRITE(gfile,'LD I,A'); 1:WRITE(gfile,'LD R,A'); 2:WRITE(gfile,'LD A,I'); 3:WRITE(gfile,'LD A,R'); 4:WRITE(gfile,'RRD'); 5:WRITE(gfile,'RLD') END END; 2:CASE bot OF 0:BEGIN WRITE(gfile,'LD');idr END; 1:BEGIN WRITE(gfile,'CP');idr END; 2:BEGIN WRITE(gfile,'IN');idr END; 3:CASE top OF 4:WRITE(gfile,'OUTI'); 5:WRITE(gfile,'OUTD'); 6:WRITE(gfile,'OTIR'); 7:WRITE(gfile,'OTDR') END END END END; PROCEDURE typ0; BEGIN CASE bot OF 0:CASE top OF 0: WRITE(gfile,'NOP'); 1: WRITE(gfile,'EX AF,AF'''); 2: BEGIN WRITE(gfile,'DJNZ ');e END; 3: BEGIN WRITE(gfile,'JR ');e END; 4: BEGIN WRITE(gfile,'JR NZ,');e END; 5: BEGIN WRITE(gfile,'JR Z,');e END; 6: BEGIN WRITE(gfile,'JR NC,');e END; 7: BEGIN WRITE(gfile,'JR C,');e END END; 1:IF ODD(top) THEN BEGIN WRITE(gfile,'ADD '); gX; WRITE(gfile,','); dd(top2) END ELSE BEGIN WRITE(gfile,'LD ');dd(top2);WRITE(gfile,',');nn END; 2:BEGIN WRITE(gfile,'LD '); CASE top OF 0: WRITE(gfile,'(BC),A'); 1: WRITE(gfile,'A,(BC)'); 2: WRITE(gfile,'(DE),A'); 3: WRITE(gfile,'A,(DE)'); 4: BEGIN bnn;WRITE(gfile,',');gX; END; 5: BEGIN gX;WRITE(gfile,',');bnn END; 6: BEGIN bnn;WRITE(gfile,',A') END; 7: BEGIN WRITE(gfile,'A,');bnn END END END; 3:IF ODD(top) THEN BEGIN WRITE(gfile,'DEC ');dd(top2) END ELSE BEGIN WRITE(gfile,'INC ');dd(top2) END; 4:BEGIN WRITE(gfile,'INC '); reg(top) END; 5:BEGIN WRITE(gfile,'DEC '); reg(top) END; 6:BEGIN WRITE(gfile,'LD '); reg(top); WRITE(gfile,','); n END; 7:CASE top OF 0: WRITE(gfile,'RLCA'); 1: WRITE(gfile,'RRCA'); 2: WRITE(gfile,'RLA'); 3: WRITE(gfile,'RRA'); 4: WRITE(gfile,'DAA'); 5: WRITE(gfile,'CPL'); 6: WRITE(gfile,'SCF'); 7: WRITE(gfile,'CCF') END END END; PROCEDURE typ1; BEGIN IF opc=#36 THEN WRITE(gfile,'HALT') ELSE BEGIN WRITE(gfile,'LD '); reg(top); WRITE(gfile,','); reg(bot) END END; PROCEDURE typ2; BEGIN addop(top); reg(bot) END; PROCEDURE typ3; BEGIN CASE bot OF 0: BEGIN WRITE(gfile,'RET '); cc(top) END; 1:IF ODD(top) THEN CASE top2 OF 0:WRITE(gfile,'RET'); 1:WRITE(gfile,'EXX'); 2:BEGIN WRITE(gfile,'JP (');gX;WRITE(gfile,')') END; 3:BEGIN WRITE(gfile,'LD SP,'); gX END END ELSE BEGIN WRITE(gfile,'POP '); qq(top2) END; 2: BEGIN WRITE(gfile,'JP '); cc(top); WRITE(gfile,','); nn END; 3: CASE top OF 0:BEGIN WRITE(gfile,'JP ');nn END; 1:cb; 2:BEGIN WRITE(gfile,'OUT (');n;WRITE(gfile,'),A') END; 3:BEGIN WRITE(gfile,'IN A,(');n;WRITE(gfile,')') END; 4:BEGIN WRITE(gfile,'EX (SP),');gX END; 5:WRITE(gfile,'EX DE,HL'); 6:WRITE(gfile,'DI'); 7:WRITE(gfile,'EI') END; 4:BEGIN WRITE(gfile,'CALL '); cc(top); WRITE(gfile,','); nn END; 5:IF ODD(top) THEN CASE top2 OF 0: BEGIN WRITE(gfile,'CALL ');nn END; 1: BEGIN indexed:=TRUE;Xreg:=IX;byte END; 2: ed; 3: BEGIN indexed:=TRUE;Xreg:=IY;byte END END ELSE BEGIN WRITE(gfile,'PUSH ');qq(top2) END; 6:BEGIN addop(top); n END; 7: WRITE(gfile,'RST #',top*8:2:H) END END; PROCEDURE dodata; VAR i:INTEGER; PROCEDURE dodefb; VAR i:INTEGER; BEGIN WRITE(gfile,'DEFB '); FOR i:=oldcx TO cx-1 DO BEGIN IF i>oldcx THEN WRITE(gfile,','); WRITE(gfile,'#',ORD(PEEK(i+codestart,CHAR)):2:H) END END; BEGIN defmod; CASE data[olddx].drtyp OF B: dodefb; M: IF PEEK(codestart+oldcx,CHAR) IN mesilleg THEN dodefb ELSE BEGIN WRITE(gfile,'DEFM "'); FOR i:=oldcx TO cx-1 DO WRITE(gfile,PEEK(i+codestart,CHAR)); WRITE(gfile,'"') END; S: WRITE(gfile,'DEFS ',cx-oldcx:0); W: CASE cx-oldcx OF 1,3: BEGIN WRITE('Error in DEFW');READLN END; 2: oneDEFW; 4: BEGIN oneDEFW; WRITE(gfile,','); nn END END END END; BEGIN {Byte} IF cx>=data[dx].sta THEN dodata ELSE BEGIN getbits; CASE typ OF 0: typ0; 1: typ1; 2: typ2; 3: typ3 END END END; BEGIN {SecondPass} FirstPass; IF EOLN THEN BEGIN cx:=0;secondfin:=finish END ELSE BEGIN cx:=READHEX(INPUT)-runstart; secondfin:=READHEX(INPUT)-runstart END; dx:=1; WHILE cx>data[dx].sta DO dx:=dx+1; IF dx>1 THEN IF data[dx-1].fin>=cx THEN dx:=dx-1; REPEAT Xreg:=HL; indexed:=FALSE; oldcx:=cx;olddx:=dx; pass1byte; IF prn THEN BEGIN WRITE(gfile,oldcx+runstart:4:H,' '); IF cx-oldcx>4 THEN WRITE(gfile,CHR(9)) ELSE FOR i:=oldcx TO cx-1 DO WRITE(gfile,ORD(PEEK(codestart+i,CHAR)):2:H); WRITE(gfile,' ':2,CHR(9)) END; cx:=oldcx;dx:=olddx; IF cx MOD 256 IN table[cx DIV 256] THEN WRITE(gfile,'L',runstart+cx:4:H); IF prn THEN WRITE(gfile,CHR(9)) ELSE WRITE(gfile,' '); byte; IF prn AND (cx-oldcx<=4) THEN BEGIN WRITE(gfile,';'); FOR i:=oldcx TO cx-1 DO BEGIN ch:=ORD(PEEK(codestart+i,CHAR)); IF ch>127 THEN ch:=ch-128; IF ch<32 THEN ch:=ORD('.'); WRITE(gfile,CHR(ch)) END END; WRITELN(gfile); UNTIL cx>secondfin END; { G command - Generates a .GEN file of disaassembly } PROCEDURE Generate; BEGIN fname[12]:='G';fname[13]:='E';fname[14]:='N'; REWRITE(gfile,fname); FirstPass; WRITELN('Performing second pass'); SecondPass(gfile,FALSE) END; PROCEDURE Help; BEGIN WRITELN('B Byte Data'); WRITELN('D Display data areas'); WRITELN('E,X Exit to CP/M'); WRITELN('G Generate dissassembly to disc'); WRITELN('H Help'); WRITELN('K Kill data area'); WRITELN('L List disassembly'); WRITELN('M Message Data'); WRITELN('P Put .DIS file to disc'); WRITELN('R Get .DIS file from disc'); WRITELN('S Space data'); WRITELN('W Word data'); WRITELN END; BEGIN getfname; RESET(infile,fname); IF EOF(infile) THEN BEGIN WRITELN('No file'); GOTO 99; END; extdis; RESET(dfile,fname); IF EOF(dfile) THEN BEGIN WRITE('Run Address ?');runstart:=READHEX(INPUT); WRITE('End Address ?');READLN;finish:=READHEX(INPUT)-runstart; dnext:=1 END ELSE GetDIS; codestart:=ADDR(infile)+40; meslegal:=[' '..'~']; allchars:=[CHR(0)..CHR(255)]; mesilleg:=allchars-meslegal; firstdone:=FALSE; REPEAT READLN; READ(com); com:=upper(com); IF com IN ['B','K','R','S','W'] THEN firstdone:=FALSE; CASE com OF 'B': EnterCommand(B); 'D': ListData(OUTPUT); 'G': Generate; 'K': KillData; 'H','?': Help; 'L': SecondPass(OUTPUT,TRUE); 'M': EnterCommand(M); 'P': PutDIS; 'R': GetDIS; 'S': EnterCommand(S); 'W': EnterCommand(W) END; UNTIL (com='E') OR (com='X'); 99: END. ': GetDIS; 'S': EnterCommand(S); 'W': EnterCommand(W) ? : 08 $v*j!RG>^ : 8x@:"" > :#": G: OQ> :b!GN %: 8!C"~( G#~: 8>  2b!: O(( (  O  0  : DO:i!Gy(_D8ZO:*"=2b![WO 7ZO Zё02b!*R v(>2b!BW8: Ox[n!: GO %! v˞(*R  BW8: 0 [W[!>w: D<2_!: O $! v(ͫFˆNˎRR! ́P?: G: OQ!C"~#:&"ì:,">: (6V˖!<##= ^#V:("G7:3">f #!?*l![j!R͘V> (>*!D* [l!R͘FREE:BLOCK:O:&"Py:-"[c!0J0 V*g!N v R(> >!"g!͞J:."0V(v N [e!R> >!"e!Dä:_!O:i!( Gg8&o!COL:LINE::/">! f(!9F(!-!3I/AUTOINSERTCHANGE:4">*}!:0"q:)"G! :1"q!!>> >$:2">!cͿͿͿͿͿ! ˞xì>/<8R0! ^ ~# > + >G8 ( 0 !8h 8>? !2 0 >^@[ESC][DEL]˿O: (: G:%"O!9"~# w"͐:8"(xAOyx!>"~# u"7ԐW~# =O: 0OɷG> >(_CY!!c"_!*R"R"͔n(V(KY!Q_(n 'w o ( ( {#~( {n(!~# ~( {7X{yT]O ~# ~( # OV!~(7Իn(!5"(!T" ͻ 3n( !c#({*_!w#6"_!́KY!Q!"  <(%x:'"O^  ͻ x!@ h ûHelp file not found> > ͵ ~#~# !}  !  x:# :<@2[!:&"2Y!G (!o0$ T ! :  #˾ :Y!:[! >:> #>.> :Y!GT Hit a key ? 8B, ! (7 < |  3 !#  |  <>ȯ>6B#6A#6KBAK~*(#6?# !v (c!r (j q   < ~6(!O5 y!(>w# ( 5  <(p>  J  J^# { ( x  7? !z  > 8R( x : 0> <(  ͵ ~# ((OR0>>  ( !6# "!  (̓ #  y7) >!$ ͉ ͉ ) O!$  ~?7*7# N#~: y̓ #@?+ͮ ( 8 ͮ ?ͮ ͮ 7O>yLST:PUN:RDR:*.*a{ ~#.(̓ !8 ! ɿɷ7<>,;:=[]_%|()/\:#  :7K͘: Gg[ 0 7w# ( (7: D(o:*"g}(0, y:*" 0( ( 7[n!Sn![n! Sn![ "RŷRE: Obkx($~  =O 0 # : 0DOyO{!i!w(:i!(GO: D-;>2b!*c!8++#"c!T][ " R Cc!:'"?=G* "R( 0Sn!G: GT!!~(# 7R*[ "R*T]>07*+6 ͘6 <~ *T] >07f bk+~(6 ͘~(6 <ɷR0}/o|/g#:o0$*[RR:[_0RDMT]*R(ͫ8R(ͫ0 ͫ0 ͫ8R:2w!ͪ+R0 !z!͝R?~:w!<7v:z!<7zR?ڂw!ͪ!z!͝RDMx/Gy/OCr!"p!T]>!t!#N#F++B w###!t!#^#V*p!R(0*r!r+s##>.>*>&>">>>>> >  > > > 2 ɼ*?LZfyOut of memoryLine is too longUndefined commandBlock start unmarkedBlock end unmarkedInvalid destinationBlock marks reversedNo such lineBlock too bigMarker lostNo block in bufferNo file/Bad filenameDisc fullv R*[RR0n[j!*l!R[[R0V7* "l!RS SR}2}*o0$*[:Oѷ:*O [R7(<2*շRDMT]+vŷR*[R:_R(ԦO*[[j!T]Sj!#KBDMxRDM#[T]*j!#BDMx( RDMSj!> E I+_~#V+~ # +I(+~ (ͫ8I(+~ͫ0#*~# ~( ##?(ͫ0?(ͫ8+TI+~ (T ~ #(+#~ ( (T bk bkbkIÝ #*n!T]: Ox(K= : G4: Ox(K= : G[n! 7K8: 0bk+KT*n!I:'"o----K8͝Y- Ý:'"o---; 0 ͝Y7K- I!"c!* "T]"n!: GT 0*c! "c!bk+:'"==R}{z~ Î#^#Vob0$Yt!ͨ!t!v([! ˶:&"2b!bkT~:*j!o0$[l!RV8j* "l!! SS[:ob0$+6 f: : 2 : 2 w!ͨ~ +~ z!ͨ~# T]!w!!z!õ !ͻ˯YSure? >> >G: OQ!:&"G:,"O:%"OQ: !a!ͦAbandon text: !6V(>> i^U to abort commandSee manual for details>2_!*}!#~ : !M<#V(::_!0 Ė '*j![ "RDM͘ n.=̖(͚#| DM[ " x( 0ÆbkY!  !!>-2]!ͻ( (0 0(w#0x(+6!x(( ))) o0$Go to line: ͽjUͽ*j! [ RڊC_!:w!2w![j!RDM[_!T]Sj!K_!!w!͝bk{T]rY *x!YVʒ* [ R#[j!8+Rڊ* K CY!BDM*l![j!S[!R"_!R#"]!*_![Y!+[ 8R8 շR#"_![[!"[!K]!Sp!T]K_!"Y!+[ R *[!"j![ R8 * "l!" *p!T]{T]rY!ͦAbandon block: !6V(͘ ( =̖(͚ !>-2]!!~(#ͻ((, ( 8((w#x(+6!xFilename: *R"R" :]!G~# "Y!!6Vʀ* [j!RDM*Y!T]*j!RDMC_![ Sj!Sl!S[!x(H =( =(SY! ͖͊j[Y!*[!RDMK_!Sj!*Y!T]{rY:0"! "_!2Y!8':1"!!"_!2[!8:W!!U!!S!w~(=#w#+#3830Y~:U!O"[!ˋyq:)"G*[!yqK(+~#˃ͻG!T" C(C(? +'>-2]!x(F>+2]!x(7x(() (" 8K(z x(w#6K'zP7 K)z)+~6( ( 0'*_!!!~# !  !T]!2!:Y!2U!:[!2W!+ #~(( #(~( ((?7"_!KS!*j! [l!R0Wx(;*j! "j!*_![U!x( T]BŷBDMŷRDM*_!!KW!x(bkѷj*_!7ɯ>!6V((q % =̖(ɯ >> >2a!=>2a!͘j n`:a!( 8vͰ>2b!T͘j nT]DM*:o0$:a!8(DM ͗ŷBDMͰ>2b!T! ˶[*j!#KŷBDMx +R[j!"j!ŷRDM+#Ý* [j!R|"_!2Y!z!ͪR8B:Y!ʃz!ͪSY!* "[!*j!R"]!*Y![_!Rw!ͪ8R0 *Y!R#"_!*Y![[!K_!"Y!S[!#K]!w!ͪR "j!*[!"l!#" =2w!2z!*j!RDM#Sj!~#^#Vbo$#^#V_ "! FlHmZgr{/-&|xzS "()[]{}=+-*/<>^;:,#$&\ED80.HLP # % ! YEKy5, FSDSDEXRCGBKF B K V C YP W R 00F LA QQ X JI RTYDSD|~ BK B E M C Y P W R 00 Q SA QQ X JI RTCursor Moving commands ---------------------- ^S Character Left ^D Character Right ^H Character Left (Alt) ^A Word Left ^F Word Right ^O S Tab Left ^O D Tab Right ^Q S Start of line ^Q D End of line ^E Line Up ^X Line Down ^O E Top of Screen ^O X Bottom of Screen ^R Page Up ^C Page Down ^Q R Start of File ^Q C End of File Space for more [ENTER] to quit Text deleting commands ---------------------- ^Y Delete Line [DEL] Delete last character ^G Delete this character ^O T Delete word left ^T Delete word right ^Q [DEL] Delete to start line ^Q Y Delete to end line Block commands -------------- ^K B Mark Start of block ^K K Mark End of block ^K V Move Block ^K C Copy Block ^K Y Delete Block ^O P Paste Deleted Block ^K R Read Block from disc ^K W Write Block to disc Space for more [ENTER] to quit Quick cursor movement --------------------- ^O G Go to Line ^Q B Go to start of block ^Q K Go to end of block ^K 0 Remember position ^Q 0 Return to position Find and Substitute ------------------- ^Q F Find First ^L Find Next ^O L Substitute & Find ^O A Substitute All Leaving ED80 ------------ ^K Q Quit and Exit ^O Q Exit without Backup ^K X Exit with a Backup Space for more [ENTER] to quit Toggles ------- ^V Toggle change/insert ^O I Toggle auto indent ^O F Toggle space display Miscellaneous ------------- ^I Deliver TAB character ^O R Restore line ^K F Disc Directory ^K J Erase file from disc ^P Control meta-key ^J Help key ine ^K F Disc Directory ^K J Erase file f) OF 'I': BEGIN GetRec(r);InsertRec(r) END; 'D': Delete; 'E': CLOSE(f); 'P': Print END; UNTIL upper(com)='E' END. ðð , C s1 h4@k{>=s1 hx@k{ys1 h͏@k{COMMAND COMѷR>ʪ%* !" ÿ$WARNING : There is a conflict between!$%s" $the * !" !$s" !nfl*ood And burbled as it came! One, two! One, two! And through and through The vorpal blade went snicker-snack! He left it dead, and with its head He went gallumphing back. "And hast thou slain the Jabberwock. Come to my arms, my beamish boy! O frabjous day! Callooh! Callay!" He chortled in his joy.  Come to my arms, my beamish boy! O frabjous day! Callooh! Callay!FUNCTION upper(c:CHAR):CHAR; BEGIN IF c IN ['a'..'z'] THEN c:=CHR(ORD(c)-ORD('a')+ORD('A')); upper:=c END; PROCEDURE DUMP(VAR f:TEXT;start,finish:INTEGER); {writes a hexadecimal & ASCII dump of memory from start to finish to file f} CONST bytesperline=16; {for screens of width of 72 or more} VAR i,cur:INTEGER; ch:CHAR; BEGIN cur:=start; WHILE curCHR(127) THEN ch:=CHR(ORD(ch)-128); IF ch<' ' THEN ch:='.'; WRITE(f,ch) END; cur:=cur+bytesperline; WRITELN(f) END END; FUNCTION READHEX(VAR f:TEXT):INTEGER; {Reads a hex number from the file f} VAR res,i:INTEGER; BEGIN res:=0;i:=0; WHILE NOT(f^ IN ['0'..'9','A'..'F']) DO GET(f); REPEAT res:=res*16+i; IF f^ IN ['0'..'9'] THEN i:=ORD(f^)-ORD('0') ELSE IF f^ IN ['A'..'F'] THEN i:=ORD(f^)-ORD('A')+10 ELSE IF f^ IN ['a'..'f'] THEN i:=ORD(f^)-ORD('a')+10 ELSE i:=-1; IF i<>-1 THEN GET(f) UNTIL i=-1; READHEX:=res END; E IF f^ IN ['a'..'f'] THEN i:=ORD(f^)-ORD('a')+10 ELSE i:=-1; IF i<>-1 THELMP TÝ*X^#VSѷ7> ͪ> ͪ_*-*3[1K/*5"3"-S1C/"50?:|(!R!^VR0##HB8E|( >-ͪ!R!0>0^VR8<(ͪ ##ͪ'd DG> ͪ~#ͪɷ !!~ͪ#FALSETRUEE <!"%!4*PZhw !"%!.ͨ SE():<( !> 2!"!Nw#!{":< 2 !\ !:: #~@#w> 2mͨ >2!"!N HP .COM HPE .COMprimes ;G*~ #^#V#~! ^#VM 2#^#V  Halt at PC=OverflowOut of RAM/ by ZeroIndex too LowIndex too HighMaths Call ErrorFile ErrorNumber too largeNumber expectedT]^#VɯR0Z)0 zGR0 Z)80 Z8|o>g||ժDM!I>)=0j 8B=  *%ͅ*%^#V++F+N*%&^#V###~= +++r+s (##N#F##B1#~<# #N#~ 6 6 #6  ! r+s+p+q4##( fT] 6 ~=fN#Fy(C p+q##N#F#~_| {!(M 5 (!@##,#,!wɯ5#~a{ ̈́# T] 6#6+>Ow!(s#r#N#F#`iRDM bk66###<66*%^#V+͸_^#V###~##ͧ ^#V ><ͧ ( ͂ -(7+̧9!400_ 90W( )))|͗ R*%^#V (w#Wɯw#!9O999G7 *#//R> ɷR> -{(-(-(-(Ezͭ {OͶ yƐ'@'ͪS!!"*! *B (08"x<( BO>GC 4 s#r#Kq#p*s#rs#r^#V#N#F"!>w#w#w#w [R0"!R"9N#F!!^#VB 8q#p#q#p+++s#r+}  R s#r#|<( s#r+++|@F(^|G~O" ˼Kn0g~00Z_Qt j" xg!\Ut!9Fp ~" PK^z˺˼~R0ZjR0)/o|0y/g{/| " _|g<>c !RZtu )k gt>O˼>( G< !R!!@Ͳ t>O˼z >G < < #!R !+))) J!@U]!-?0fn^Vh  PdN _^G 5NjzP B8`i :1<21:?*3[5}{2?}22>(="3S5 ˼=i21!@&:2 Ͳ "7S9>:1O:2=22y Rz 0D :1(W> ͪz=*7[9I>0ͪ:1 >.ͪz*;[=D( o&V Ͳ Ph R0>0ͪIA>-ͪ";S=z U:2!:20ͪ#>228<t(|(˼>-> ͪzMbjG?0) |21 E:2_!z^#V#N#fiͲ EBS\ej)>0ͪ>.ͪ:20ͪ>Eͪ:1)DO>-O>+ͪy 08 0Gyͪxͪ/?0) |/21Dh z!Ph !15fffQ6AhS 0.E+00|&S5"3*K3K5 Ͳ ͂ -( +̧ͧ>g9!T] 0OB 0 90W  90W.lWͧ9J( 0OB 0 90W 90WQE Wͧ- ͧE(z +̧O{ s )C]l`yh D 0  !Nj# ;90"0G 9W0OxGG 9 Exponent Expected{!*9!!Y! ͭ;!"K*#"(R+!*|)R! Ϳ"2 !}_ W!}8  [2!9D!!|)R! Ϳ"2!!|)R! Ϳ ogB9 !} w !/"C 6  [2!9!"!"ϯ2!"!"%!!DM@++*}22!*|)R! Ϳ ogB9:2 D>! 9ʞ*#"G**#"*!2ѷR>t*!"!"%*!DM@*!*"*!dR>^*! R>C%00!"%!#*!DM@[!"%>0ͪ*!DM@q!"%*!DM@Õ!"%!**!DM@*#"*!ѯR <ʽ!"%!"*"*"+*!(ѷR>ʜ!*|)R! Ϳ"2!*|)R! Ϳ ogB9 *} w !/"C 6  [2!9**)"**"+*!ѷR>ʙ*#"*"o!*|)R! Ϳ ogB9  !j "] P >2!"+:*!(R>O*#"!*|)R! Ϳ ogB9  !j "] P 2:ϷDU(A~#x(G>_V(> 2 JABBERWOCKY Twas brillig, and the slithy toves Did gyre and gimble in wobe; All mimsy were the borogoves, He took his vorpal sword in hand: Long time the manxome foe he sought - So rested he by the Tumtum tree, And stood awhile in thought. And as in uffish thought he stood, The Jabberwock, with eyes of flame, Came whiffling through the tulgey wood And burbled as it came! One, two! One, two! And through and through The vorpal blade went snicker-snack! He left it dead, and with its head He went gallumphing back. "And hast thou slain the Jabberwock. Come to my arms, my beamish boy! O frabjous day! Callooh! Callay!" He chortled in his joy.  Come to my arms, my beamish boy! O frabjous day! Callooh! Callay!PROGRAM PRIMES;{$O-} CONST w=40; {(w+1)*500 gives the number up to which primes are found. For each increment of w, 32 bytes of storage are needed} max=4; {maximum number of primes to be displayed on one line} VAR Sieve:ARRAY [0..w] OF SET OF 0..249;{Sieve in which the primes are contained} Count:1..max; { Number of primes on this line} high,low:INTEGER; { The upper and lower parts of the current prime} word,bit:INTEGER; { The current position in te sieve} j,k:INTEGER; { The current position that we are deleting from the sieve} t,c:INTEGER; { Temporary storage for initialise and how many elements to skip} empty : BOOLEAN; { Is the Sieve empty flag} BEGIN { Initialise} FOR t:=0 TO w DO Sieve[t]:=[0..249]; Sieve[0]:=Sieve[0]-[0]; word:=0;bit:=1; empty:=FALSE; Count:=1; WRITE(2:8); REPEAT {Find next prime} WHILE NOT(bit IN Sieve[word]) DO bit:=SUCC(bit); c:=bit+bit+1; {Write this prime} IF word>50 THEN BEGIN high:=word DIV 2; WRITE(high:5); low:=(word MOD 2)*500+c; IF low < 100 THEN IF low < 10 THEN WRITE('00',low:1) ELSE WRITE('0',low:2) ELSE WRITE(low:3) END ELSE WRITE(500*word+c:8); Count:=Count+1; IF Count=max THEN BEGIN WRITELN; Count:=0 END; {Remove multiples of current prime from Sieve} j:=bit;k:=word; WHILE k<=w DO BEGIN Sieve[k]:=Sieve[k]-[j]; k:=k+word*2;j:=j+c; WHILE j>249 DO BEGIN k:=k+1;j:=j-250 END END; {Skip to the word which contains the next prime} IF Sieve[word]=[] THEN BEGIN empty:=TRUE;bit:=0 END; WHILE empty AND (word 0 THEN BEGIN left(parity * 90); hilbert(len, level-1, -parity); fwd(len); right(parity * 90); hilbert(len, level-1, parity); fwd(len); hilbert(len, level-1, parity); right(parity * 90); fwd(len); hilbert(len, level-1, -parity); left(parity * 90) END END; PROCEDURE poly(side,angle:REAL); BEGIN fwd(side); right(angle); IF side<180*(2+TRUNC(angle/90))/3 THEN poly(side+1,angle) END; PROCEDURE P(X,Y,col:INTEGER;side,angle:REAL); BEGIN pendown(col); sethd(0); setXY(X,Y); poly(side,angle); END; PROCEDURE circles; VAR i:INTEGER; BEGIN FOR i:=1 TO 9 DO BEGIN arcr(1,360);right(40) END; END; PROCEDURE petal(s:REAL); BEGIN arcr(s,60); right(120); arcr(s,60); right(120) END; PROCEDURE flower(s:REAL); VAR i:INTEGER; BEGIN FOR i:=1 TO 6 DO BEGIN petal(s); right(60) END END; PROCEDURE turtle; BEGIN INIT; heading:=0; Xcor:=300; Ycor:=200; penstatus:=TRUE; mode(2); border(1) END; BEGIN turtle; flower(2); setXY(50,200); hilbert(10,4,1); READLN; MODE(0); INK(15); PAPER(4); END. (1) END; BEGIN turtle; flower(2); setXY(50,200); hilbert(10,4,1); READLN; MODE(0); INK{$T,Y Compile this program using HP TURTMSX } {$L-,C-} PROGRAM turtle; VAR Xcor,Ycor,heading : REAL; penstatus : BOOLEAN; { * Turtle Graphics for MSX * } { * Written by Bottin Gianpaolo * } { * See example programs GRAPH1 * } { * & GRAPH2 for details of use * } { * Global variables for turtle * } heading,Xcor,Ycor,PI:REAL; penstatus :BOOLEAN; { * PROCEDURE TO CALL HGR * } PROCEDURE INIT; BEGIN POKE(#FB00,8); POKE(#FB01,#DB); POKE(#FB02,#A8); POKE(#FB03,#F5); POKE(#FB04,#E6); POKE(#FB05,#F0); POKE(#FB06,#C3); POKE(#FB07,#F38C); END; PROCEDURE CALL(IND:INTEGER); BEGIN INLINE(#DD,#E5, { PUSH IX } #DD,#6E,2, { LD L,(IX+2) } #DD,#66,3, { LD H,(IX+3) } #E5, { PUSH HL } #DD,#E1, { POP IX } #3A,#AF,#FC,{ LD A,(#FCAF } #CD,0,#FB, { CALL #FB00 } #DD,#E1); { POP IX } END; PROCEDURE line(X1,Y1,X2,Y2:INTEGER); BEGIN POKE(#FCB7,X2); POKE(#FCB9,Y2); POKE(#FCB3,X1); POKE(#FCB5,Y1); INLINE( #DD,#E5, { PUSH IX } #DD,#5E,2, { LD E,(IX+2) } #DD,#56,3, { LD D,(IX+3) } #DD,#4E,4, { LD C,(IX+4) } #DD,#46,5, { LD B,(IX+5) } #DD,#21,#FC,#58, { LD IX,#58FC } #CD,0,#FB, { CALL #FB00 } #DD,#E1); { POP IX } END; PROCEDURE CLS; BEGIN CALL(#C3); END; PROCEDURE mode(I:INTEGER); BEGIN POKE(#FCAF,CHR(I)); CALL(#5F); END; PROCEDURE ink(I:INTEGER); BEGIN POKE(#F3F2,CHR(I)); POKE(#F3E9,CHR(I)); CALL(#62); END; PROCEDURE paper(I:INTEGER); BEGIN POKE(#F3EA,CHR(I)); CALL(#62); END; PROCEDURE border(I:INTEGER); BEGIN POKE(#F3EB,CHR(I)); CALL(#62); END; PROCEDURE pendown(I:INTEGER); BEGIN penstatus:=TRUE; ink(I); END; PROCEDURE PENUP; BEGIN penstatus:=FALSE; END; PROCEDURE sethd(AN:REAL); BEGIN heading:=AN; END; PROCEDURE setXY(X,Y:REAL); BEGIN Xcor:=X; Ycor:=Y; END; PROCEDURE fwd(len:REAL); CONST PIby180 = 1.745329E-2; VAR newX,newY:REAL; BEGIN newX:=Xcor+len*COS(heading*PIby180); newY:=Ycor+len*SIN(heading*PIby180); IF penstatus THEN line(ROUND(Xcor*3/8),ROUND(Ycor*192/400), ROUND(newX*3/8),ROUND(newY*192/400)); Xcor:=newX; Ycor:=newY END; PROCEDURE back(LEN:INTEGER); BEGIN heading:=heading+180; fwd(LEN); heading:=heading-180; END; PROCEDURE right(AN:REAL); BEGIN heading:=heading-AN; END; PROCEDURE left(AN:REAL); BEGIN heading:=heading+AN; END; PROCEDURE arcr(r:REAL;deg:INTEGER); VAR i:INTEGER; BEGIN FOR i:=1 TO deg DO BEGIN fwd(r); right(1) END; END; PROCEDURE polyspi(side,angle,inc:REAL); BEGIN fwd(side); right(angle); polyspi(side+inc,angle,inc); END; PROCEDURE arcl(r:REAL;deg:INTEGER); VAR i:INTEGER; BEGIN FOR i:=1 TO deg DO BEGIN fwd(r); left(1) END END; PROCEDURE hilbert(len,level,parity:INTEGER); BEGIN IF level <> 0 THEN BEGIN left(parity * 90); hilbert(len, level-1, -parity); fwd(len); right(parity * 90); hilbert(len, level-1, parity); fwd(len); hilbert(len, level-1, parity); right(parity * 90); fwd(len); hilbert(len, level-1, -parity); left(parity * 90) END END; PROCEDURE poly(side,angle:REAL); BEGIN fwd(side); right(angle); IF side<180*(2+TRUNC(angle/90))/3 THEN poly(side+1,angle) END; PROCEDURE P(X,Y,col:INTEGER;side,angle:REAL); BEGIN pendown(col); sethd(0); setXY(X,Y); poly(side,angle); END; PROCEDURE circles; VAR i:INTEGER; BEGIN FOR i:=1 TO 9 DO BEGIN arcr(1,360);right(40) END; END; PROCEDURE petal(s:REAL); BEGIN arcr(s,60); right(120); arcr(s,60); right(120) END; PROCEDURE flower(s:REAL); VAR i:INTEGER; BEGIN FOR i:=1 TO 6 DO BEGIN petal(s); right(60) END END; PROCEDURE turtle; BEGIN INIT; heading:=0; Xcor:=300; Ycor:=200; penstatus:=TRUE; mode(2); border(1) END; BEGIN turtle; flower(2); setXY(50,200); hilbert(10,4,1); READLN; MODE(0); INK(15); PAPER(4); END. (1) 001Cursor Moving commands 002 020Character Left 040Character Right 030Character Left (Alt) 003 050Word Left 060Word Right 070Tab Left 080Tab Right 090Start of line 100End of line 110Line Up 120Line Down 130Top of Screen 140Bottom of Screen 150Page Up 160Page Down 170Start of File 180End of File 002 001Text deleting commands 002 420Delete Line 003 460Delete last character 470Delete this character 480Delete word left 490Delete word right 500Delete to start line 510Delete to end line 002 001Block commands 002 240Mark Start of block 250Mark End of block 260Move Block 270Copy Block 280Delete Block 290Paste Deleted Block 310Read Block from disc 300Write Block to disc 002 001Quick cursor movememnt 002 190Go to Line 003 200Go to start of block 210Go to end of block 320Remember position 330Return to position 002 001Find and Substitute 002 340Find First 350Find Next 360Substitute & Find 370Substitute All 002 001Leaving ED80 002 380Quit and Exit 390Exit without Backup 400Exit with a Backup 003 002 001Toggles 002 220Toggle change/insert 430Toggle auto indent 230Toggle space display 003 002 001Miscellaneous 002 440Deliver TAB character 450Restore line 010Disc Directory 410Erase file from disc 520Control meta-key 530Help key 002 ^@ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z [ESC] ^\ ^] ^^ ^_ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ [DEL]  {;]<!P}ZMu ͷ   KU.?  COM PAS PAS,>>!:a(0> !"SU**Y!P.!"*UR}͠!.M:R2*S"!W)!!"!222͠<  R~(@>:#HPE COMHP.COMError messages not available > ͋> > Ô_!"~#͋!9~QKn0g~00Z_t jQ2=ͷ x !9~QKfn~R0ZjR0)/o|0C{/gx/| Q_I<))) J!@U]!?0fn^V PdN _^G 5NjJE(i2= | "C>z zé!T]͸0OB 0 0  8. 0J(͸0OB 0 0 8QE -  2=z + O{ I s )C]l`yD 0Y Y!Nj# ;S 00G 00OxGG N2=0^V>/ ͋##'d z_{hƐ'@'ËR0 {Z)80 5÷ *Uw#"U!.?~ #zG͉ (͋#:] z2_vZ*Y!P.É~( *Y#"YFKFĢ*W~#"W *W?R>P2](ү2]2_FĀ> .?SWP*~((5# ( (6 #6 "[*(!SF(J!,>"!"͙*"*["Y!.?6 #6 [vR*WҬ !!!v# Symbol Table Full Sorry, can't find errora8{0 ! #( #P7!-( + $!"+(- ~/ݦw,(~ݶ~!!- jZv([M*v# ++[E!'v[M[ERZ̀:a(&!Ao&!T.4vv(! wZ[> FŠ:<U>O}iO)D!wZR1 R"|ogR"~(̀ wZ (*"v(" [Sx G!WK F ̀͢!J*W~ ( ++.?B[]F({( :_G͉"SB ( zG͉͉>2R>^͋k&2  <(:E!}(~ # ̀W} !~͋#  !V.!a4~ÈHP80 ERRW0?:A?[a8g0 A8G?7 ?00?:> N := ( A [02!5Ww 0 #+ 8:5! 0N {( / a0/ $ [[W͚\0FF B*"*Y"[!"Y!"#G22y2!>"!-?"x,(SW }( * ) &  8r: >= }2=y'ʩ #(c( *| ƀO > 8x=(< w>(z= |> =y {s>5"CSA>~{> 8o& 8))))o3ͷ "C g"C~ G'(́ '(2= +~+++o&"C>v !ͷ y2Av*C͵>u Dͷ LOCSIA PACKE$ FIL# NI"$ FORWAR* PROGRA4 I > OC O H T M DR IW SE\ NOb MO h DIn VA t ANz FO EN GOT WIT TYP CAS ELS THE LABE! CONS ARRA UNTI WHIL BEGI RECOR DOWNT REPEA FUNCTIOPROCEDU End Address: Minimum D option value:Errors : *ERROR* Write Error No Source File: Error:No more text No EOF.PAS!bk#͹>.͋͹̀~#͋ Compiling [< !c=A͔>:͔*#~͔! (2O:(q#>O2(w#6 # !? ,.<>;:=?*[] B x(z( _x{z{ ÷  ͷ   "  }#    ÷ *U[S"S=B s#r# !5~"Uͷ 6#*S0~#N#F#÷ x`i5N#F# #7*Q|>?ʷ ^#V#N#F*CB #^#V#:`=7÷ _2:t<́2{++ +!N#K| w#́v~#́v2 2*2!{́z͆+r+ss#rwK~ ++2Yn[RB1 *!p#606?ͻ!? sy(#rͿ"Ϳ*#"ͻz2?ȷ(%  z ( t>g !Rɷ()(Z(*Cu(G(= [A~(4 v(/ ÷ R ͟zͧ&=ķ ^#V#~#fo :AO z y=(= ÷ ^#V#F:`2́!/j!3jͦ2z< {={}ʹV!Bj+ y /÷ >((>>G>G?>?>ѯR <ѯR(< ѷR> R> R>͊ ѷR>͊ # <> >8< >0< >8< >0<B B <B B(< >gͲ >t(>gͲ >t(>gͲ >>gͲ > !j "] P !j "] P  !s "] P !x "] P aXipx !=-ZMo DL!b++ v#+r+s̀3K@ @-!@h@~@@(Їo&^#Vͪ7!r6L,(HgVT]R B E~! ?#N#F#~ 5#~! /#^#V) #~) !#~ #~ #~   !Lb͐Dʒ%{+  ( +22Sͪ2"ê ( +22sn22rn2 2un22t{͆2w ( ( !! b!\! H͟D&KK͟D͚Dͧ(+ Cp&(p x +2[pͪ!j4÷ ?##F###^#V:`͙WN#Fws#r DMs#r#q#p [2!9F ʝ͢yT_+~#N#F{( 6XT!Dx (("+2[pͪ!j(͚  ( (23ͧN#F^#V#~!`D2́!jê! ogB9ʹz!e^T2n!j(͚>; D+v+ ͪGy2e=x zQ͘!j(͚>T]+O ŷB (Ͷ!eF o!epg+Ͷ++>(.( sG:e&#+++ vͶv+ oŔ *c(5( (2w2!"j!0 X (2 /22ês#r^#VͰ ķ y2e"c ͐D"p ( ķ  *e&Dy= @!͍G# B [pRDMbk+g###!j+*c3 !!bj2*c:eeO"c(S(! ([2w0!j͵#!0%2 2nn22fn%2~n ( 2:ͪ͟!(j=vͶV ;22+(2!j+fetgͶ͵V2͙R