IMD 1.16: 7/06/2007 20:17:00 -PUB 010747 BASK 747 DOC?ARC DQC6ARC EXEG !"#AZM LBR$%&'()*+,-./0123AZM LBR456789:;<=>?@ABCAZM LBRDEFGHIJKLMNOPQRSAZM LBRTUVWXYZ[\]^_`abcAZM LBR defghijklmnopqrsAZM LBR tuvwxyz{|}~B5MEP AQM2DISKBUFSHQXDISKDOC LBReDISKED LBRGDISKIDX LBRIDISKLIB BQSDISKMAP COMDISKMON LBR'DISKRTN EXELDISREL LBRcDISSASM LBR^DND $$$DND $$$:PROGRAM NAME = JETSET:IFR FLIGHT SIMULATOR (BOEING 747)F:CREATED 06/28/81 BY JEAN SZYMANSKI:REVISED 02/25/82 - INSTRUCTIONS IN NOVEMBER 1982 'BYTE MAGAZINE' :SYSTEM "CLOCK OFF" ':BEGIN CRUISE MODULE HERE: : .e M$()KR.e:XQ@"RS: () RS8RW()()ERWRSRW]:SET UP WIND TABLEl WA( ,)" I :WA(I,)(g):$ I  :WA(I,)Z():&A( I  :WA(I,)()A:AA:)RS$()(,"_")*RS$()( )". ."( )8+RS$()( )". ."S,RS$()()( ,"_")u-:VOR STATION FREQUENCY TABLE. VF()/VF()g:VF()c:VF()ffa0VF()ffk:VF()k:VF()ff`1VF()j:VF()g:VF()h$2VF()33c:VF( )i:VF( )jO3VF( )`:VF( )k:VF()ffg`4VF()a>:ILS CONSTANTS FOR AIRPORTS? VG(,)@VG(,):VG(,)BVG(,):VG(,)EVG(,)Z:VG(,)GVG(,)+:VG(,)HVG(,):VG(,)*0OVG(,)U:VG(,)KSd:VOR STATION COORDIATES TABLEbe VP(,)fVP(,)1":VP(,)NjgVP(,) :VP(,)qhVP(,)n):VP(,)j iVP(,) %:VP(,) jVP(,)*:VP(,)"kVP(,)9:VP(,)H(BlVP(,)ff:VP(,)?#bmVP(,)#:VP(,)jnVP(,)F+:VP(,)YoVP(,)n%:VP(,)R$pVP( ,)5+:VP( ,)r'qVP( ,)R82:VP( ,)c0rVP( ,)!0&:VP( ,)Ѣ0*sVP( ,):VP( ,)LtVP(,)'1(:VP(,)&nuVP(,)J:VP(,)# FUEL,LBS,%,VHF,MHZ,THRUST,MAX,IDLE,REV PITCH," +"," -",DEG,FLAPS,UP,DWN,WHEELS,UP,MID,DOWN COMPASS,AIRSPEED,KTS," VERT",SPEED,FPM ALTITUDE,FEET,CLOCK) P$()B I : P$(I):O S$()l I :S$(I)(I): I :F(I)::INIT FLIGHT VARIABLES TO STATE AT LIFTOFFFU>:FP?:CCK:ZS|:RC0:F$"#####":V1AL: (#":DISPLAY THRUST" I  2" (I), :" ";()8"N" (TR), :">";b":DISPLAY FLAPS" I  : (I),:" ";():" (FL),:">""F$"+###""YP:XP:V1FA: (#" F() SX: ,:  # SX SX: ,: #SX:# F()  ,:" ": ,O#:DISPLAY BRAKESx# I  : (I),7:" ";():# (BR),7:">"#:WHEELS# I  : (I),?:" ";():# (WH),?:">"# F() $:DISPLAY LAT/LONGDITUDE/$YP:XPE:F$"###":V1DP(): (#W$YP:XPI:F$"##.#":V1DP(): (#~$YP:XPE:F$"###":V1DP(): (#$YP:XPI:F$"##.#":V1DP(): (#$ ,O:"N"$ ,O:"W"$ $:DISPLAY RUDDER POSITION% ,!: ,: S$(),% ,(RP): (): ,: ]=% F() V%:DISPLAY VOR VALUES%YP :XP&:F$"###.#":V1VO(): (#% ,: ,(: VO$(): ,%YP:XP':F$"###":V1VO(): (#%YP:XP&:ALlMZz:TR:FL:FA :BR :WH <RA:ZS()|:FA() :CC()K:AL()l:RP(dDP()':DP()4:DP()K:DP()L1w:G1:LL()L1:GL()G1:LS()L1:GS()G1VO():VO$()"OUT ":VO():VO()yGX():GY()XO:YO TV$: :TLTDTW()TD  O* XD,K$: (K$) 0N.  X0 {O:DISPLAY PANEL (HEADERS ONLY)T ,: P$();S$();P$();S$();P$();S$();S$();S$();P$()U  ,7: P$( );S$();P$()V  ,9: P$();S$();P$()$W  ,9: P$();S$();P$()JY ,: P$();S$();P$( );S$()^^ ,E: P$()c ,: P$();S$();P$();S$();S$();S$( );P$()h ,: P$( );S$( );P$();S$();P$();S$();P$()m ,: P$()r ,(: P$();S$();P$();S$();P$()Ew ,: P$();S$( );P$();S$();P$( );S$()X| ,: P$()~} ,E:"VLF OMEGA": ,B:"LAT"~ ,A:"LONG" ,!:". . . . : . . . .": ,(:"RUD"  ,!: ();(:F$"###.#":V1VO(): (#& ,: ,#: S$( ): ,.& VO$()"OUT " J& ,(VO()): ()P&g& :KEY POLL SUBROUT&% K$"F" K$"S" KK: R&* K$"," K$"." KK: R&+ K$"/" RA: W&9 K$"U" K$"D" KK: R'> K$"W" KK: R'C K$"V" KK: R8'D K$"R" KK: RR'E K$"L" KK: Rl'F K$"A" KK: R'G K$"Q" KK: R'H K$"M" KK : R'I K$"C" KK : R'R KK ,,,,,,,,,,'W (:THRUST KEY,( K$"F" TRTR : TRTR@( TR TR:R(:RUDDER KEYSp( K$","  : RARA( RA RA((RARA: RA RA((:ELEVATOR KEYS(J: BR J( K$"U" FAFAJ : FAFAJ ) FA( FA( ) FA( FA(4) FA FL:H) FA FL:S)FL:d):WHEELS KEYz) WH WH :) WH WH :):SET VOR FREQ) ,8) "VOR FREQ ";VX$:VO()(VX$)),);() X  0   Y  ) (Y),(X): ();1 Y9 X_ ,!: ();(,);();  ,(:"VOR":  ,-:"MHZ" ,':"RANGE" ,$:".....:....." ,':"RADIAL" ,(:"DME": ,-:"NM"; Y  : (Y), : ():5 Y  : (Y),: ():Y ,: ();(,);()o X    Y   (Y),(X): (); Y X ,: ();(,);(); ,:"ILS"  ,:"MARKER": ,:"> <" GX():GY()(  4B  ,:  ,:" "l  ,:  ,:"RADAR ALT";);"STALL"   ,:"> <" W X:DISPLAY INSTRUMENT READINGS Y  ]YP:XP:F$"######":V1FU: (# ^ ,C: ,: : ,!bYP:XP:F$"###":V1FP: (#5!gYP:XP':V1CC: (#P!lYP:XP':V1ZS: (#w!qYP:XP.:F$"######":V1RC: (#!vYP:XP7:F$"##,###":V1AL: (#!{YP:XP:F$"###":V1MZ: (#!| F() YP :XP ,8: ):):SET VOR RADIAL * ,81* "VOR RADIAL ";VX$:VO()(VX$)F* ,8: ):V*:FLAPS KEYl* BR BR :* BR BR :*:AUTO - OBS KEY*F():*:REVERSE THRUST KEY* F() TR**:MISSED APPROACH KEY+ F() F() ++:FLARE KEY8+ F() FA:FL:H+FA:FL:g+:SITUATION UPDATE ROUTINE+TV$: :TJTDTL:TLTD+ L+ j+ y+ TR  : d+ R+ Z+ F() @+ x+ , AL AF:  (, F() K9, AL ,L,  F() BW, F()a, TYYNo,TXXN, FA AF:  , FA AF:  , F() &, AXd AF:  , AXP AF:  , WH AF:  - TX AF:  0-  TX) AF:  M-" (TY)d AF:  W-$ Kf-&AF:  y-, F() :-. FA 4-0 FA F()-2 K-4 F() AXAL:F()-5 TR 8-6N5L MY Q : Q5M P6N MY Q : Q06P MX MAZ: VA6RMQ(MYMX)R6TMA(MQ)KRi6V Q MAZMA:6X Q MAZMA:6Z Q MAMA:6\MAMA6^6x:GET POSITION FOR OMEGA DISPLAY6zZS()ZS:FA()FA:CC()CC:AL()AL!7|ZSZS():FAFA():CCCC():ALAL()C7~ ZS()ZS FA()FA e7 CC()CC AL()AL 7F(): TDTW()< 7AJZS((FA)KR)7 7DNGS(TDTW())7CNTK:L1LL():G1GL()7  8F():TW()TD:LL()L2:GL()G2!8LS()L2:GS()G2=8 J :DP(J)CP(J):q8ZS()ZS():FA()FA():CC()CC():AL()AL()8ZSZS():FAFA():CCCC():ALAL()88TW()TD:F()8AJZS((FA)KR)8 8DNGSTJ9CNTK:L1LS():G1GS() 9 "9LS()L2:GS()G259 F() K9LL()L2:GL()G2U9 g9:VOR ROUTINE{9 VO() 9 J : VO()VF(J) 9: 9LCVP(J,):GCVP(J,)9LBL2:GBG29 FA RC: K .7FA:FL:RC: K(.8FA:FL:RC,: KA.: AL AF:  T.<TR:FA:FLd.>AF :  .B XN& (YN)d F.C ZS K.DAF:  .FAF:  .K .L:UPDATE FUEL.NFUFU(TR)TJ: FU FU/PFPFU0 :/R F() RC:)/S F() G/TRCZS((FAKR))33K]/V FA RCRCc/Xy/Z:UPDATE ALTITUDE/[ F() /\ALALTJRC</^ AL AL:/` AL/ AL//b/d:UPDATE AIRSPEED/eZS dTR0fZSZSFA0g BR (0hZSZS:;0j F() lN0k F() vb0l RA RT:{0m RA J : J0nRA(RA): RA RT: q0o RA RT : q0p RA RT : RT0qRTJRT:RAJRA0rCCCCRT1s CCh CCCCh:&1t CC CChCC,1u;1v RA [1w RA CCCC : CCCCj1xRA: s1y:UPDATE RUDDER POSITION VALUE1zRP(RARA:1:COMPUTES DIST & BEARING TO A KNOWN POINT LOCATIONARVG(J,):LLVG(J,)9LOhLL: : DR, 3: CRh CRCRh=: *O:VO$()"FROM"t:VO()CRVO(): VO() :VO()VO()h: : VO() VO()VO()h: (VO())Z I1VO(): : VO$()"FROM" I : I ; I VO()I1-;VO()(I(VO()):VO()DRG; VO()# VO()"a; VO()- VO().k; ;VO$()" TO ":VO()VO(): VO()h VO()VO()h; ;VO$()"OUT ":VO()y:F():;  DR DR MK: <  AL MK: 6< F()  J : J [< CRARJ CRARJ MK: q<F():MK: < ,: MK ,:" ": ,:: " "< MK F():<" CCLL CCLL <$ RA <&F():F()<( =* F() VO()CR:F()(=,  :=@:ILS ROUTINER=BZNAL:TH 4:MKu=CDWQXRWTJ: F() DW=D F() CCLL:RA=FCJCC=H CJ CJhCJ:CJCJ=JHALOCJ=LDChHA:TS2VL(LBLC):BL(): LBLC BL()12VG(GBGC):BL(): GBGC BL()A2LALC: ` K2M1MP[2LALB: ` r2M2MP:DM(M2M1)2 DM 2QOVG(DM<): QO.e 2CAKR(QO):DRVL((CAKR)): 2CAZ:DRVG(LCKR) 3DRDR<: BL() ,3 BL() CRCA : CRhCA23W3 BL() CRCA : CRCA]33:GET WIND VECTOR FOR CURRENT ALTITUDE3I(AL): I I 3WDWA(I,):WVWA(I,)33:SOLVES WIND TRIANGLE3ACC:LAJ: 4MXLX:MYLY4 04AWD: Ah AAh?4LWV: [4MXMXLX:MYMYLY: Fk4TKMA:GSVZq44:RESOLVES A VECTOR INTO RECT. COORDS4 AZ Q:BZA: 4 A Q:BAZ: 4 A Q:BA:  5Q:BA*5LXL(BKR):LYL(BKR)85  Q O5" Q LYLY:o5$ Q LXLX:LYLY:|5&LXLX5(5F:COMPOSES X,Y COMPONENTS INTO A POLAR VECTOR5HVZ(MXMY)5J MX : HA DCHA:TS>N DC DCDC:TSTS,>PTL$"W": TS TL$"E"?>RDDQXZSTJc>TDYDD(DCKR):DXDD(DCKR)>VXNXODX: TL$"E" DYDY>XYNYODYDW>ZLMKR(ALXN)>\BEKR((YN)(XN)): BE MK>^J(LMTH):J(J)?` J J?a J J/?dBEBE:BE(BE)C?e BE BEU?f BE BEk?g YN BEBE|?h MK p?j XN XNp p?l XN XN p?nMK?pGX()BE:GY()J?r 4@v ,: MK ,:" ": ,:: " " @~XOXN:YOYN1@ F8 D@ XN. M@F8[@ I t@ (I),2: RS$(I)|@ I@ F8 @ ,(XQ):" "@YU(YN):XC@YU@ XC1 XC1@ XCO XCOA ,(XC): () AXQXCA A (A EA:REVERSE THRUST APPLIEDXA  F() uA VOZSt(<:F()AVVO( O)TJA V VAVOVAZSV(t(<)AA:COMPUTES NEW POSIT$()"---------- AN IMPROPER LANDING WAS MADE ----------"?J M$()"NO DAMAGE OR INJURIES OCCURRED.WJ RL: TXd RLsJ RW: (TY)d RWJ N$()"FEET INSIDE OF RUNWAY"J TX N$()"FEET SHORT OF RUNWAY"J N$()"FEET TO LEFT OF RUNWAY CENERLINE"&K TY N$()"FEET TO RIGHT OF RUNWAY CENTERLINE">K RX(TX):RX(RX)VK RY(TY):RY(RY)gK AF K ZS(AX):FA(FA):ZS(ZS)K AF  ,N , , , , ,H ,z , , K tK YP:XP7:F$"##,###":V1AL: (#L ,: M$()!L "YOU FLEW INTO THE GROUND."iL" "THE INSTRUMENT READINGS AT TIME OF THE CRASH ARE SHOWN AS ABOVE."oL$ uLN LP M$()LR M$()LT M$();AX;"FEET."LV M$()LX M$()LZ N$()M$()L\ L^ L L M$()%M "YOU FLEW INTO THE GROUND DURING FINAL APPROACH."kM "AT THE TIME OF THE CRASH THE AIRCRAFT PROFILE WAS AS FOLLOWS :"M M$();FA;"DEGREES"M M$();ZSM N$()M$()M M M M M$()M M$( )M IONB CN CA:LB():LB(): 6B CN CNZ CACN:LB():LB(): mB CNZ CN CACN:LB():LB(): B CN CN CACN:LB():LB(): BCAhCN:LB():LB()B CA3 CDLDN(CAKR):DLDL<:LB()LB()"C LB() L2L1DL: 3CL2(L1DL)CCLAL1: ` MCM1MP]CLAL2: ` gCM2MPCDM(M1M2):DGDM(CAKR): CL2L1:DGDN(L1KR)CDGDG<:LB()LB()C LB() CG2(G1DG)C CG2G1DG#DCP()(L2):CP()(L2CP())<HDCP()(G2):CP()(G2CP())<NDpD4:PLOT GLIDE SLOPE CROSSHAIRSD5 XO D6X0GX():X1GX():Y0GY():Y1GY()D8 Y : (Y),(X0):" ":D: (Y0),: (, )E< Y : (Y),(X1): ():8E> (Y1),: (,)UE@ (Y1),(X1): (+)eEB ,:"O"EDGX()GX():GY()GY()EFE` :COMPUTES MERIDIONAL PARTS, MPEd KM()h]wEf KM()q&:Eh KM$( );AX;"FEET."N M$( )"FUSELAGE."N N$()M$()N #N )N ?N WH M$()N WH "---------- A MINOR CRASH HAS OCCURRED ----------"N M$( )N M$( );AX;"FEET."N WH THE % Q M$( )N WH M$( )"FYU19"O WH "THE IMPACT DAMAGED THE LANDING GEAR."\O WH "ALL THE PASSENGERS HAVE BEEN SAFELY EVACUATED."lO N$()M$()vO |O O O M$()O M$( )O "THE AIRCRAFT LANDED ON ITS BELLY, CAUSING MODERATE DAMAGE."P "ALL THE PASSENGERS HAVE BEEN SAFELY EVACUATED."#P N$()M$()-P" 3P$ 9PH FPJ M$()SPL M$()cPN N$()M$()mPP sPR yPz P| M$()P~ "YOU FAILED TO EXECUTE A FLARE PRIOR TO TOUCHING DOWN."P "THIS IS A VIOLATION OF COMPANY PROCEDURES."Q M$()Q N$()M$()Q "Q (Q 5Q M$()kQ "YOU ROLLED OFF THE RUNWAY AFTER TOUCHING DOWN."xQ M$()Q N$()M$()Q Q Q XN& "YOU ROLLED PAST FAR END OF RUNWAY" R (YNM()= W|Ej KM()X_t Fn LA LA<,Fp LA(Y;<) LAY;<=Fr S1(LAKR)SFt S2S1S1:S3S1S2nFv TM()((-LA)KR)Fx TM()KM()(TM())( )Fz TM()KM()S1F| TM()KM()S3F~ TM()KM()S2S3F MPTM()TM()TM()TM()F G :ABORT ROUTINES;G M$()"---------- A CRASH HAS OCCURED ----------"G M$()"YOU ACCIDENTLY STALLED THE AIRCRAFT DURING FINAL APPROACH."G M$()"THE STALL OCCURRED AT AN ALTITUDE OF"G M$()"THE AIRCRAFT STRUCK THE GROUND IN A NOSE-HIGH ATTITUDE."9H M$()"THE IMPACT RUPTURED THE TAIL SECTION OF THE FUSELAGE."aH M$()"---- LOCATION OF CRASH ----"H M$()"---- LANDING POSITION ----"H M$()" PITCH ANGLE="H M$()" AIRSPEED="I M$( )"YOU FLARED AT TOO HIGH AN ALTITUDE DURING FINAL APPROACH."AI M$( )"THE RESULTING STALL OCCURED AT AN ALTITUDE OF"gI M$( )"THE IMPACT RUPTURED THE "I M$( )"YOU FORGOT TO LOWER THE LANDING GEAR."I M$()"YOU FAILED TO TOUCH DOWN INSIDE THE RUNWAY."J M)d "YOU ROLLED THROUGH RUNWAY SIDE BORDERS"R R TR "----- YOUR MISSED APPROACH SIGNAL IS ACKNOWLEDGED -----"R "YOU HAVE FOLLOWED PROPER PROCEDURES."R RR"----- YOU HAVE SUCCESSFULLY COMPLETED THE FLIGHT -----"R"ALL PROCEDURES WERE PROPERLY EXECUTED."SN$()M$()7S"CONGRATULATIONS ON A SUCCESSFUL FLIGHT."AS GScSXN(XN):JN(XN){SYN(YN):YN(YN)S "YOUR AIRCRAFT CAME TO REST AT THE FOLLOWING POSITION:"S!" ";JN;"FEET INSIDE THE RUNWAY"T"" ";YN;"FEET FROM RUNWAY CENTERLINE"T$ETt:SUBROUTINE TO CLEAR LOWER PART OF DISPLAYTTv I jTx (I),: O);rTz IxT|T:LANDING STATISTICSTT ();N$()TT RL RX;N$()T RL ,: RX;N$(): ,T U RW RY;N$().U RW ,: RY;N$(): ,4UnU"--- SIZE OF RUNWAY IS 10,500 FEET X 200 FEET ---"tUU:TIME DELAY PADU I TQU IUU:CONVERT RTC TO TIME OF DAY IN SECONDS ABSOLU);S$();P$()^i(  ,>: P$();S$();P$();S$();P$()G^n( ,>: P$();S$();P$();S$();P$()X^p( F() ~^s( ,: P$();S$();P$( );S$()^x( ,E: P$()^}( ,: P$();S$();P$();S$();S$();S$( );P$()_( ,: P$( );S$( );P$();S$();P$();S$();P$()_( ,: P$()G_( ,(: P$();S$();P$();S$();P$()y_( ,: P$();S$( );P$();S$();P$( );S$()_( ,: P$()_( Y : (Y), : ():_( Y : (Y),: ():_(_(:DISPLAY HORIZONTAL LINE `( F() ( `(  ,: (P);2`( HY (M`( (HY),: (P,"_")S`(b`(OH:HY r`( IHY `( (OH),: (P);`( (I),: (P,"_");`(OHI`( I`( ,(IO):" ";`(`(:DISPLAY RUNWAY`( F() ) a(S :Xa( Y Fa) (Y),(X): ".";(S);" ";(S);".";Va )XX:SS\a)ja)S$S$( )pa)a):PRINTS RUNWAY GRAPHICSa") N h)a') (OY),(OX): (WM);a,) (NY),(NX): MK$;aTEUJU I VTC$(I)(TV$,J,)VJJ'VTC(I)(TC$(I))KVTD(TC())("d):DISPLAY PITCHd) I : (I),:" ";():d) (FL),:">"d)F$"+###"d)YP:XP:V1FA: P-e):DISPLAY FLAPS#e) F() *Le) I  : (I),<:" ";():ae) (BR),<:">"ne):WHEELSe) I  : (I),D:" ";():e) (WH),D:">"e):BRAKESe) I  : (I),L:" " : P$(I):Y' S$()Z' I :S$(I)(I):+Z' I :F(I):QZ':INIT VARIABLES FOR TAKEOFF MODExZ'FUPC:FP:CCK:ZS:RC:ALZ'MZk:TR:FL:FA:WH :IX(:HY:BR :BK Z'ABZ' ,:"AIR CANADA 312 CLEARED AS FILED"Z':)['" SURFACE WINDS VARIABLE, GUSTING TO 15."d['" MINIMUM CEILING CONDITIONS ARE IN EFFECT."['" SKY CONDITIONS AT 20,000 SCATTERED."['" AT 30,000 BROKEN."[(:\("UPON TAKEOFF, MAINTAIN HEADING 075 TO 3000, THEN PROCEED AS FILED."N\(::" STANDBY FOR TAKEOFF CLEARANCE"_\(TQX: -e\(\(  ,:"AIR CANADA 312"::\("YOU ARE CLEARED FOR TAKEOFF AT 0800 HOURS"\#(TQ : -\((\-("07:59:00": :\2(TV$: #-:TLTD]7( Z(]<( (]A( (&]F( w)@]K(K$: (K$) U(J]P( &*T]U( *w]Z(:DISPLAY PANEL (HEADERS ONLY)]_( ,: P$();S$();P$();S$();P$();S$();S$();S$();P$()]d(  ,<: P$( );S$();P$(;():e) (BK),L:">"f*:DISPLAY RUNWAY ALIGNMENT INDEX-f * F() Cf* ,(IO):" ";]f* ,(IX): ();gf*IOIXmf!*f&*:POLL KEY SUBROUTf+* K$"F" KK: D*f0* K$"," K$"." KK: D*f5* K$"B" KK: D*f:* K$"U" K$"D" KK: D*g?* K$"L" KK: D*2gA* K$"W" KK: D*LgB* K$"S" KK: D*sgD* KK N*,]*,q*,*,*,*,J*ygI*gJ*:THRUST KEY (DECREASE)gK* F() BR TRgM*gN*:THRUST KEY (INCREASE)gO* F() gS*F():TR:h]*:RUDDER KEYSh^* F() *hb* ZS2 Lhg* K$"," CCCC : CCCCRhl*_hq*:BRAKESphv* F() h{*F():BK :h*:PITCHh* F() h* ZS2 h*FD : K$"U" FD h*FAFAFDh* FA< FA<i* FA< FA<i* FA FL:,i* FA FL:7i*FL:Ci*:FLAPSbi* F() WH BR :si* F() i* F() F():BR :i*i*:WHEELSi* F() WH i*i*:SITUATION UPDATE ROTHIN THE RUNWAY BOUNDARIES."5r,"AS A RESULT, YOU VEERED OFF THE RUNWAY AND COLLIDED WITH"Pr," THE RUNWAY LIGHTS."Vr,r," YOU RAN OUT OF RUNWAY. AS A RESULT, YOU ROLLED INTO THE"r," MARSHLANDS LOCATED";(YY));"FEET PAST THE END OF THE RUNWAY."r, F() s-::" YOU FORGOT TO LOWER THE FLAPS."`s-" AS A RESULT, THE AIRCRAFT COULD NOT DEVELOP SUFFICIENT LIFT."fs -{s-:TIME DELAY PADs- I TQs- Is-s#-:CONVERT RTC TO TIME OF DAY IN SECONDS, ABSOLUTELYs(-Js-- I s2-TC$(I)(TV$,J,)t7-JJt<-TC(I)(TC$(I))@tA-TD(TC())(+ +kC+ +kH+ I : (I),: (P);:kM+HYkR+ (kW+ k+k\+ z+ka+ $,kf+ A(lk+:NOW DO DEPARTURE PROCEDURESlp+ F( lz+:UPDATE FUEL0l+FUFU(TJ>l+FPFU0 Dl+_l+:UPDATE RATE OF CLIMBl+RCZS((FA33e))9X<l+ FA RCRCl+l+:UPDATE ALTl+ALALTJRC<l+ AL ALl+l+:EQUATIONS OF MOTIONl+TTJ m+VV0AT!m+VB(VV0):V0V,m+SVBTCm+ TD(TX) +Mm+TXTD]m+WBRS()jm+CCCCWBm+DA(CCK)33em+DYS((DA))m+DXS((DA))m+ DA DXDXm+YYYYDYm+XXXXDXS FOLLOWING LIFTOFF."Hv/" THE PROPER TRIM SEQUENCE, WHICH MUST BE COMPLETED BELOW 1200 FEET, IS AS FOLLOWS:"gv/" 1-RAISE LANDING GEAR"v/" 3-REDUCE THRUST"v/" 2-RETRACT FLAPS"v/v/"--------------- END OF PROGRAM --------------"v/v:/ z+v/ +wC/ F(w2:END OF LISTINGv/v/"--------------- END OF PROGRAM --------------"vm,ZSVXm, ZS ZSZSWS#n ,IX((XX): IXO IXO5n, IX IXMn,ZP(YY (N))hn, ZP NN: ,nn,n$,:VARIABLES FOR RUNWAY GRAPHICSn),MP( ( ZP) )n., N V,n3,NYMPn8,JNY n=,NXXM(J)nB,FWWM(J)nG,S$(J)9oL,MK$M$(N)S$(J)"_"S$(J)"_"S$(J)"_"S$(J)"_"S$(J)"_"?oQ,eoV,:IN ZONE 4-MARKER IS RUNWAY EDGEoo[,NYMP{o`,JNY oe,NXXE(J)oj, N oo,MK$(WE(J),"_")ot,oy,AB: ,o~,AB: YY) ,o, I p, (I),: (P);p, Ip, ,p,:ABORT.p, I Lp, (I),: ,: (P);Tp, I~p,  ,:"*** TAKEOFF FAILED ***"::p, AB ,,,p, ,#: ,:"END OF PROGRAM";p,p,"YOU PULLED BACK ON THE STICK AT TOO SLOW A SPEED, OR YOU"7q,"PULLED BACK THE STICK TOO FAR WHEN AT PROPER SPEED."wq,"AS A RESULT, THE TAIL OF THE FUSELAGE SCRAPED THE RUNWAY"q,"AND THE AIRCRAFT SPUN OUT OF CONTROL."q,q, YY) ,q,"YOU FAILED TO STAY WI TYJETSET.DOC 747 FLIGHT SIMULATOR (JETSET) --- ------ --------- -------- The program on this BBS called 747.BAS was originally written up in the November, 1982 issue of BYTE magazine under the title JETSET. The documentation that follows is only excerpts from the complete documentation found in that magazine. To try to reproduce all of it here would take too much memory. Also, there are drawings that cannot be reproduced. With the Jet Simulator Electronic Trainer (hence JETSET), you'll maneuver an aircraft through the three stages of flight - takeoff, cruising, and landing - in less than ideal conditions. The program, originally written for the TRS-80 and modified for the IBM-PC, uses the keyboard and screen to make a personal computer verf_on of a commercial flight simulator. You and the controls, of course, remain firmly planted. C. Apply full throttle (F key). D. Steer along the 075-degree runway using the left/right rudder keys (< and >). Coordinate steering with the COMPASS reading and the position of the arrow located at the base of the runway graphic. E. As soon as the AIRSPEED indicates 150 knots, press the U key once to gently lift the jet off the runway. F. After the horizon line drops below the screen, press the W key to raise the landing gear. G. Retract the flaps (L key). H. Throttle back the engines (S key). I. Sit back and relax for a minute or so as the jet gains altitude. PRACTICE FLIGHT -------- ------ A. Execute the takeoff form Philadelphia as described above. B. Level off at 10,000 feet. C. Steer approximately north. D. Adjust airspeed to 600 knots. E. Tune to the frequency of the Buffalo VOR station (115.5 MHz). F. Input the value of 278-degrees radial into the receiver. G. When the VOR needle moves to center, alter course to on the ground. JETSET is flown according to Instrument Flight Rules (IFR). Listed below are the keyboard keys, functions, and definitions: KEY FUNCTION DEFINITION --- -------- ---------- F THRUST INCREASE* INCREASES POWER TO JET ENGINES S THRUST DECREASE* DECREASES POWER TO JET ENGINES Q THRUST REVERSE REVERSES ENGINE THRUST DURING LANDING D PITCH DOWN* LOWERS NOSE OF AIRCRAFT BY 5 DEGREES U PITCH UP* LIFTS NOSE OF AIRCRAFT BY 5 DEGREES \ PITCH CANCEL SETS NOSE TO LEVEL FLIGHT < RUDDER LEFT* INCREASES RUDDER LEFT BY ONE INCREMENT > RUDDER RIGHT* INCREASES RUDDER RIGHT BY ONE INCREMENT / RUDDER CANCEL RETURNS RUDDER TO CENTER POSITION L FLAPS RAISES AND LOWERS FLAPS W WHEELS RAISES AND LOWERS LAN 295-degrees (COMPASS). H. Now steer to keep the VOR needle centered. This indicator, not the compass, will provide exact guidance for the remainder of the flight. I. Use the DME indicator to keep track of the distance remaining, in nautical miles, to Buffalo. To estimate the remaining flying time (in minutes), simply divide the DME reading by 10. J. When the DME readout reaches zero, the jet has arrived. INSTRUMENT LANDING ---------- ------- A. Execute the takeoff procedures. B. Continue to climb to an altitude of 3000 feet on a course of 075 degrees. C. At 3000 feet, alter course to 000 degrees and continue climbing. Adjust thrust for airspeed of 580 knots. Tune VOR to Philipsburg station (115.5 MHz), and set radial to 278 degrees. D. Steer along 278-degree radial when intercepted. Level off at 40,000 feet and proceed to Philipsburg at 600 knots. E. At DME=20 NM, retune VOR to Buffalo (116.4 MHz) and set DING GEAR B BREAKS RELEASES WHEEL BRAKES FOR TAKEOFF M MISSED APPROACH SIGNALS AN ABORTED LANDING ATTEMPT V VOR FREQUENCY TUNE INPUTS A FREQUENCY TO VOR RECEIVER R VOR RADIAL SELECT SELECTS A RADIAL VALUE FOR NAVIGATING A VOR AUTO SELECT AUTOMATICALLY ROTATES RADIAL SELECTOR DIAL NOTES: 1. The CAPS LOCK key must be engaged throughout the simulation. 2. An asterisk (*) identifies keys that may be typed additional times to increase their control function. The following procedures will allow you to takeoff from the Philadelphia airport and, hopefully, land at the Buffalo airport. To get a more detailed description of how this simulator works, I strongly advise obtaining a complete copy of the documentation. See note at the end of this writeup. TAKEOFF PROCEDURE ------- --------- A. Lower flaps (L key). B. Release breaks (B key)radial to 346 degrees. F. Upon intercepting the 346-degree radial, alter course to follow the radial to Buffalo. G At DME=73 NM, begin decent to 1900 feet (descend at approximately 11,000 FPM). H. Level off at 1900 feet. Remain aligned with the radial. I. Begin initial approach trim when DME=20 NM as follows: 1. Reduce airspeed to 300 knots (S key). 2. Drop landing gear (W key). 3. Lower the flaps (L key). 4. Adjust altitude to between 1700 and 1900 feet (elevator keys). 5. Keep the VOR needle centered (rudder keys) to stay on the initial approach radial. J. Be alert for the flash of the MARKER lamp (which occurs when the DME=12). At this signal the jet must be maneuvered for the final approach: 1. Quickly swing the nose until the compass shows 042 degrees. 2. Use rudder and elevator keys to keep the ILS indicator needles centered as the jet descends vHarc.doc_  ! "$#%&'(*)o+,.-/1032457689:;=<>?@BADCEGFHIJKLMPNQORSTUVYXWZ]\[^/ jL1$24gprL1dZUC/k572E,yr VAԷ3C&L5g%efSL1X/v(nl':!>6S̽bIW?&V}%;y?o?Hf#~#S4rؘbf~{Hj}͆6%;y?ogM7\i&pNb?0[]!MW)PF乛 '6ܭ + @Nb2R7U~~/6Ga/Д WԽQ~tB`cz0[Œ O o lw~ q>&5Ͷ7-<< ~1R}3U;/ 1Tfgl u¸1TVT8BJvFSL14VOcpNj{Y \ ^k&&,MԯIp4 /uGWT[DhBaT*?o+pm \along the glidepath. 3 As soon as the runway graphic appears on the screen, use the graphic arrow as a guide to apply rudder corrections. K. When the MARKER lamp flashes again to announce arrival at the decision- height point, check the runway alignment using the graphic displayed on the screen. If necessary, press the M (Missed Approach) key to abort the landing attempt. Otherwise, if the plane is lined up safely, take all cues from the RADAR ALT from here on in: 1. At 100 feet, idle the engines (S key). 2. At 50 feet, flare up the nose (\ key). 3. At 0 feet, the jet is on the runway. Slow it down by applying reverse thrust to the engines (Q key). Your JETSET flight concludes with a display of the landing information that tells you how well you handled the jet. This information specifies where ground contact occurred and where the jet finally rolled to a halt. If you made a mistake at the m14VObۂh8n6aiWoNnOttI(f޷ %^4ِ{ǻU}Lmȝ@zmdZyL@8_gŻb?2 fo5 {+\4ٓ_A,w/SX6+=wvo#~^+ v/mS ݾwv?[ vzL1f w/奔; 'p#욫a jS.p6N~[s7ofX뼏饲qm/s58^N!/^`̸ czcQ w%I e {8m{pO/H>O^*=N3qmwn1|v/ Mޭz@Xmn1LOgmpǤv߶ &,M WN=ڤVn1a#)ė)b alɇjLSKSLlO0 γB8w/sH_`էKele&@e蒿՗gJbn1RYk:+|^<+uv}X;nhێ+KeBL1TVmt^Nnk&{ǫ#^! ѯ^*Z_ G!w lupyKeM >cw6vAx1T&6xp|V7L1f~ mxڤ]6  A f irwp}8 }gm?P7ؘbij $bZbʈc@zm>γ6X^'J\|?V/pBSL/ink/o K饲%S?d_~k&Ke%S _4MXlL/ST _4MXlL//1ziddle marker, the landing report will print out the consequences. This only a small part of the capabilities of the JETSET simulator. There are about 15 to 20 additional airports built in. It is conceivable that you could fly all over the United States. Remember though, this simulator is flown real-time. If it takes 6 hours to fly from New York to San Fransico in a real aircraft, it will take you the same 6 hours flying the simulator. If you would like to have the complete documentation (11 pages worth), send $2.00 to cover copying and postage, and your name and address to: BILL LYON 2351 CHAMPION COURT RALEIGH, NC 27606 ~r  k&{w8zL/N=/o? K饲KL+*FMX\4٘^*thm{EH?o*Keөi y{L/KL޷ K=1TcγB׶Z+|ƶJXac)!h̄Y5>V6,sLSK'2~m{ apmd?v C 3A}1 py8z8 0+g0^۞‚Pd(<&w86/?,_p'.\Cpǻk&SFlZMSqW;^C 7|P,Q2 xk&@ W?vrq|G>^<+cq<=^*f}A=M)ʆ2Mܷ;cɸ+ ᎟qW_~8±'pc&,M$2A28Y!1R0[>g2)&2(;^CrW:B'•ķ?&y52f &,M`0%;V8^]6wzL1T6Vv3fŻE2)a&o+*JJWnZͯ8MXcZF?|@>&'qqkW6aiɭ _  |7w wZN 7^4S[C1w{mdOޗW'ϫW5 SL11`f\cl33aijIRci؄~m}Xr{ 3X.pgVgoT\VMXA `JvrWq|p/x'8+N:]GNL1T6V>ug̊b٨Zcl33aijIbi؄~mzS^!w0n֛L3.pw#- gnj#r ]1u#75ǾwKY!\9SLU7퀾޵ l:MQk?L /c~Sw&,M8 ޯ?ٶ )/{,v?0ֻܰyVlL1e{M^[MorW X<Pb|k&{yf0f.䮅ouw1 %a/]3wLJn/1m7~;_9J q|@w|~n/ jc6p/o28p͝SL/ V>ug;q wp! /o^[ cId2MXA dFluB$0[9uLnw_Cws28p͝SL/ +ܛv{ܥ1dNe_Q;~k/8@ &,M4(70[. Exڮ %v.;=^*fʧ.ba16CU3ԒSJ|,pmd?޷}5yV_c_unǶw~X a[}LfCsorrWw~X "w1Tc_( |\~L> 쟹]µ K=vߐr~,vn1i&{mLunBnqwHv+mݪ__V+>Q>g b.p6mx6>q٘bʈ[7w*.io+&pmd:o Slupl>&"9.n/bi7۸{L28p͝SL/ .a wQ^zI<+}ku6Neo5\ڄtA d wd_Q W_~BnNƨ}20T}LmE[ Gc{^V6, j1M-Iޘb Ǽ+ _~,pmd?vL0^Y!FlZM;bOW6ai7= tޗۗʪ8/1S4м1M-I?$jZjIb2)![cTK#t Sxi3H},%Ngd4&bky)c|u/1Uw7fbcq gp {W 홳1DU!aij)Sva'>V p֯/ԕ[v 竓wFRI4# wP.FwfvE'=Ͷ±?ɶNVGw|~Om wmMb d['f lhn{1pB`a qj6ai1^!_m}B?fG?+ۚ6 >&wf(Om 96aimS}lGߏ`p𶦊 ۻsɶNl)gr'^_W*n6tpvIѼc#w2ad˾=w @zJw_nej,}/jBN =nvc&,M'(fu5w[[NɶN>6ۮMXlj=?gwDfuC_~~k +>?&!Bl::$s[[w7ί؅?&_8oƴBzSrW|PSL1\C '܇+utI(Vrw |+v> |\~L> 쟹]µ K=vߐr~,vn1i&{mLunBnqwHv+mݪ__V+>Q>g b.p6mx6>q٘bʈ[7w*.io+&pmd:o Slupl>&"9.n/bi7۸{L28p͝SL/ .a7R·f4^jj1d2}^*/)~4?4ۧYKLL3:i6|{y Ӏɂv?n { uptlN~w 9X`N9]!E[V6aiۻ݇6\Xv7.. u{Ƿu%[FRI)k&*FLswp n7̰ѬγBe g٘bʈ[7w*.oror{o/tB8i20Th8_ڄtA d q|E7uM1iݪ;q~nwe/p.;=^*fχO;BEL1aSL/ Շـ"b*YBb %2_~YؐALSKSLlf#~]6ۻJ^~p)̵_~Un ְ] rBQk.\SA|~k WV=wl؅+|k / %}5[®c̵V}Mm?=wd>x tT tvP+]vFPV.33҉F͉V3FՍvVvVvN u6N.FV6NvVa  tbFPFP1 tFFPFPl1 |46LvVd vv6L6N 6NT.FV댋F t,V tvP+Pvv6N +)V tvP*3Pvv6N*V tvP*6L-FVK6LvV vV6Lv 3Pvv6L*6LvVs Pvv6Lr*v,F t%FPc+ tT tFPP*]U 3P F tw6LvV tc3FFF;F}'vF4FP  tFFыF tvvVHPvv6L)!6LvVH tvvV3P" ]UfF t#vP(PB)v6+6L ]ËV tvP3P)T uHPvPF uv+vPKP( tKlP(6+dPFPvP"vvYu vNu뮍vNu)vPPi(Pvtt 6Ls(]ÍPvPF t1T tvPP(Pvtt 6LMZ 2 9 l-,9O9U3F~|P1VP1P1P1P1P1P1,P1bP1oP1P~1Ps1Ph1P]15PR1_PG1P<1P11P&1P1:P1fP1P0P0P0]ÍPP Pv40P 4PPPP/P3v4vv uvPo*vvPP) t*F tvPFPP"8vFfvBu R RvWu3T ?v((]vv6Lvtvtvbvy*]U"3FPP33RP6L'6L*FV3P3RP6L'~|6L( t6L' tPPPV'F6L KK uKu6LPPvV6LPPvV6L*FV;V|u;FvFPP&F,vV3P6L tFFPP&~~ P&"F tvލ$P{& 8Pn&]U F t LP/.PA6NvV u3FFF;F}'vF4FP  tFFыF t-Pvv6N&V tFPtP%"6LvVvv6L6N[[3K6LvVPD]U Pq%Pf%3PXF tr6LvV t^3FFF;F}'vF4FP- tFFыF t vVWPvv6L %26LvV t vV#Pvv6L$3Pj]U vD %FvD%FvD%FvD %FvD%?FvD%FvttvP#P*$KP41P$86P $Nu3V ,v-u v/uvP4P7F5F t MP7FPFMtPFPFPFPFP FPtPFPFP:rFPFP \]WFPFP AFPcP6/Z1 CTLPXEDMUA]]]3]U3F܉FމFF;F|tPPvF4-tPtPP-3PtP/F؉Fڋvڊ t&T ttPPI.v+Bvڊ t8FދFPv%F܋Fڋv܋VރvFڊ tF33FFH;F~rF@FF;F}]v܋F4v܋F43 ~6v܋F4vڋv܋F4~܋F5Fڋv܋VFF3FFH;Fv܋F@4v܋F4H3 tPPv܋F4)3 tPv܋F4 3 t2FFFH;F~v܋F@4~܋F5FNFYF t P4P 3FF;F}vv܋F4eFދN t66NvV:  t$6LvVk vv6L6N 3K6LvVA P]U@3FPv F+;P#@P#' d3ҋv\LQSd3QSvtt =QS[Y+RPEP#~ ~paPv~ ~F FPdPFP[R6\ FH4vOPO#]U nPPPPiPx"P tPpP*PF u6NvV to3FFF;F}'vF4FP tFFыF t vVi"6LvVvv6L6N86NvV9 t vV$3K6LvVXP]UPPF tPP)V tvPP!vv6N3P3RPv!6L$FVK6Lvv6Lv(3Pvv6L!6LvPvtt 6L!v$P" tT tPP}F;v]Í6}F>}F;u-6}F>}FE;D~]3]U F~vFvNFvFHP3PvvF}V‰FFFvFvDFvD6}F6}Vv6}Ft6PPv]UvP$&vKP&K t]vPPv!vD;X ~vD;X u vD;Z ~vDX vDZ ]UF tvv%u P/']UFV FV t%vvP]%u P&Nj]UdF uPPN u6Nt!PP tKP6+dPFPvPvvYu vNu뮍vNu P:&P| PPPL u6L PPP tPPP P% PPN tP P%@ PPPL tPPC P%:PPa P{ PPP`L tPP~ PQ%* PPP4L tPP P%%]UF t9N t 6NR t P=6Z 6X 6L6L]Uv3 v* v t v tmvPvZ;tRv?tGv*t3]Ëv tv.tFv tv.tFFF}]UF%6t V3V3]U33҉FV3F~}<6F}Ft+@vDFHP3Pv&v]UF;F~FF]U3F~}V36}V36}VD6}VD6}VDF3F~}33ҍ6#^TFދ]U3F~}36VF]U6}FDF6}FDF~uI~uBF6V#+^#6!V~~3]Á~t0VЋ##Љ#vF@PXu]Á~t.V# Љ#vF@P#u]3]U >}3FF tvPPvVF''3FFF;F|6}FDF6}FDF~}F@+FF~}F@+FFF t(vPPvV>vPPvV*FNa]U3FF';F|D~uF]Ë'+VV ЉVF''F)'F%]Á>'~'+VV ЉV')F>'u3'~uF]v'u'6!''6''*U3+vD T+RP6#Ft4qXZ^Nʉ^NF뽸3RPFVRPXZFV>}3F^Nʉ^NFV]UV t  Pe3'3҉''''''3|v''3P3RPv<'vD''vDT3|'';'ku;'wc'';'Uu;'wMV t  PK''vD TvFtvv'';'Tu;'sLV t  PXK''vD TvFtvv_V t  P KvvFtvvl''Ջ''vD TV t  P]UvFt ''F]U|0P|v']Ë'Pz3|3]ø]ø'v';'u>'}'ߋ'P)'']ø|']ø|](|'']ø|']Í P{ eCV]Uv t]vF''v6''F]U zvu}+3'KPvFtv6++vv[vFtv6+Y+vv(cvvvkRT tvP Pm PbPvtt vm]r"""C"u"vD;+t T tvPI P]3]U'P'v+]vF=t F+]vl+ t'.++]ËF+]++ t'+]6'k PB##0#}#]U++ t]Á++v]Uc+vPPvV~}~|vP P6'6'3FF;F}HvPP6'FPvPP6'FPFv.Ftv6++vvЋ]U'P'v+]vF=t F+]vl+ t'.++]ËF+]++ t'+]6' Pvf%$$I%]U3F~}++~Bv +u]3+6'F#+‹F06'Fv 3RP6+RPXZ6+D v 6+T +‹6+D F6+D6+DPP6++6+6+D6+D 6+D6+D~ |P PP!P  vFPvAуP ]UFFv;t P P P: ,FFv4v tF;FwFFFF܋F;Fu믋v4~5Fv,;Ft4FVvT;u!vDvDvDv4~5 FFFFF t2FVvT;uvDvDvDv4~5& VvT;uF& 3v]U3PRPv v ~3vF0:u&3F~}vF%vVF߸F\Pv t/Pv tu3Fv0\t8v0/t,~A} FF}v%vVFF뼋v0/u v%\vVFFgCFv%t-v0.t!~K}v%vVFFɸLFv%t!~P}v%vVFFՋ]U\PvFPvz3vv%tF\Pvv%tF\Pvv%tFC\CPvv%tFL\LPvR++Z#‹FtF@؉F~uFF]UWFv~FvVVb%tv P FvFv]UWFv4FFFFFvVV %tv P@ ]UvD]U3FF3Fv%uvF0PbFދF tFNȋF tFF tFN룋F%tN F%tN +awrb'P':'+'' 'FPM3PFFPv F~t~u>,t*PFFPv FJY ''''~u~tP33RPv#~t6+F4Ƌ]3]U3FFH;F~0v{F~uFvVF0 u3vvF tF]3]Ë]U3FF;Fs>vvv PF tF;FtFFVЉVF뺋F]P2 PPPSQRVUWFVv~u y ؃ y ރS 3SN;w r;w+@N^Yt tu t؃FV_]^ZY[XUPRF fF FfF FfFV ZX]U3FF@%FF tovDFvV+ЉV6,vF]UvVv6+;P@P ]Uvub$ t V=tJF VN<t <t<t7ڋDDʋӰB\!3ɉLLLI#ى\ A+ˉL ]DxD @Ћ]Uv%tvDvD0u]Ëv~E;Dt3]øDFvDFvVV%t@v ЉF%,F%t5]UFFAFvVvVVi%t]3]U@3FFvVlFFƋFFčvVPQNFvVV%tQFPF@PvF u3]ÍFPFFPFP@VЉVOF띋F@Pv]U3FF;Fs-vvv P ;FtFVЉVFˋF]_ȎX& A&5؎UߎNj~33Iыv~tF]U3Fv% tv;uF36+~U>FvDFvvVV%tF%,]ËF]UP33RPv]_Ȏ[&+&;]r&aUFFv%t-v0arv0zwvЈFɋF]U*3FFvuHv0:u93Fց~}vv֊0PvvֈF3vFFF tvD;Fs v4vF t%F;FtvFPFPFFvF tTF;FsFFF tF;FtvvFPDF;Fv3PF+FPFVPF]UF0Pv:]U^u% u,G;G}5w@2G<tQ< tX]À'G2]S=t^S?O W_![rK=tGGG GG tO.tuSl=t'< tO 끀@G]UvVeFFVFFFFFvVV%t]3]U^7CC_^ZY[X!WVRQSP^ 6CCX]UFa|FzPZFˆFF]UX" t P PP FFvF%FFN t&v0 u v0 u3vF3vFFFvF%@FFN t@v%t-FvVF~ |v%tFNF3vV>v vv PP6++6+6+D6+D 36+D6+DDFFvVVQF%t;PPY6++6+6+D6+D6+D EFFvVVv PP6++6+v 6+DFFv tv v #t)FFF;v sFFFFFv F=V‰F3FFFvVvVVG%t%FFFFDFvVV%tF%t]F%t3DFFFF% FvVV%tF F%tF%tFFv F3F܁~ }6+F4 tF߁~ ulPFރP F tPF@%vFދvDvD FvDF܋vDF6+VF܋]ËF%,F t vs-F t&>FFFvVV%t F%,F t v]UߎNj~33Iы~vtututH@]UF^' t;~ twF@GO;O }P]tS P=t ^ˀ t'tcSPPPSt=tP[ 떃u w!S@OW_![r%;u3GGG GG 'ߋF]GwG@]( !P ,،4 &;z v+z ߁;sǾ;s+;x r;t vt ߋ+=v+Y׋3UQW0! u2[" t[X+؉$ J!s$  +ۋPÿK ,+3BPIU6 P6+ vVvF,Fv4v tovD;Fr[FvT;r6v4Fvv4~5vD+FvDFv vDFv4~5 FFF tFPF t7FvFvDFF;Fv3PF+FPFVPF]UF3RPF3RPXZFVFVruv3FvF t3PvvF]Uv sT拜+ tHuCN#tJ~2QSWr!=t = t YF]tYIYF+PN P PG u;O|+G;} tSQS4Y[=uy~uWtww+ȸGG)NWJ#+8PS?_![Yr-FQWGP=tF]PGIX'띋؀@G]UvD]U3Fv%tF%v;uFFF؋F]UߎNj~33Iыы~3IOtF]UvVvvvP@P]Ët T\DUv@\LT!r;uLLD )D $ߋ]ÈDDw @]UF00s t tF09v t t1]U3PvVFF0et ukF0gt tGF} t uF~ t u1 t 6+M P@P@ P6+ Pc]UFD t(x t"PVD )B ! t 9nvnX" tL!62 ,±$'@'NuU3F~ }6+F4 t vKFvj]U؎v~N;rNO]UfV!]Uv%t"F%vF;u NF]3]Uv vv6+F4]U~v3]ËF@%F| FPF+& 3Z;s3]Ë& FF& Љ& F]UߎNj~33I-+]U؎~NF]Uv%uv0%tAFFFv%tv0%tF+F3PvvvփFFFFv0-tȉF tFv%F~0uF Fv0*uv F FF53Fv0P t FvF0‰FЋv0.tȉF tXFv0*uv F FF53Fv0P2 t FvF0‰F3Fv0PltȉF tFv0PPF tFF Fv0PvbFPvFV=FFF MFF FFFF tBv0As t t!v0t1 t u1 t uF} t u1F tF FFPvV VЉV~|FF PvF tFPv FP9^vF uzEvF~}-vFF؉F +vF PvFRPF}+F@PF+FPv0P+FPv5F0gu+Nv00u 3vv0.u3vv 8]U3FvVXFPJ PI X tFP:rFP) F3FFPP X t~}3]ËF t\~~F*PFP NF t2PFPP ۍFPFPP FP"P, X tk FFN tXVV6 FVPFPIX t'6FV.FP',P FFPPX u FFN tXVV6FVFP`X t'6 FVFPPN랍FPPX t"PtFPmrP_N3RPFPJFFFFv%-@vFP%FPPFP "PX tFPPxX t3PvVpZv t t1FF t!F FvFTFVFF ,~}v F FVv F 3҉FVv捆bPvv F ubFFV usFvFF tBF@;Fv9F@PFV@V+Pv0PF@+FPvF@FF@PFV‹V+@PFV‹V+P.vV+VbFP^FF FvF4vV>FFF F tF;FsFF3FnF F FF3FVFFF3FCcsdDxXuUoObBgfe??O?==========i=i=i=F t^F;FvVF t/v0-u#~0uPFFPvvփNNFN;FvPvVvvփF;FvF)F3FvvvvփF t&F tFN tPvVvvփF]Uv sD拜+ t8u3 uNvt/2QVSPL=t^YF]øPI P, PG +G;+ȑPS@O W_![r];uSY2W;|J#+PS@_![r8;u.Y O 'GGG GG F]GwG@]À u&'tSPPPST=t[ U~v3]ËF@%VЉVF t FPFPvVF]UF FFPPX tFPzFPi-vF~}G0vF.vFFF~} F)F3FFF } 0vF`FP XZF0vF"PFPFRPFPNF t벋F t .vFFN tDFP)XZF0vF"PFPFRP5PzFPd3vF+F 3ҋ]U*3FVփ!V~ |FVusFFV؃FV6:3RPF RPvvXZ؃RPXZ%NvF ؙRPvvXZFV t\FVFV6:3RPF 3RPvvXZRP1XZ%NvF RPvvuXZFV t밋F t -NvFփ!+F3҉F@PvvF]PSQRVWUfF]_^ZY[XÃFFvDFDFDFFU6+F4]UFA|FZ PZFˆFF]U@NV!r;u]øPSQRVWUfF]_^ZY[XЎW_E %E%] VW_^D %  DEËE E E E uE6E tm ]]]]E n = suppress notes and comments t = test archive integrity c = convert entry to new packing method NOTE: All files must be in the current directory of the current disk. .ARC.BAKAUMDXEPLTCCannot mix %c and %c%c is an unknown commandI have nothing to do!I don't know how to do %c yet!*.*X:\No files match: %s I have no work to do!rbCannot read file: %s Updating existing file: %s Adding new file: %s Adding new file: %s Cannot unsave %s File: %s Extracting file: %s rbWARNING: File %s already exists! Overwrite it (y/n)? %s not extracted. wbCannot create %s %s is not an archive or is out of sync Archive truncated in file %s File %s is okay More than twenty errors detected %d errors detected No errors detected You must tell me which files to delete!Deleting file: %s Name Length Comp SF Date Time ============ ======== ==== ==== ========= ====== JanFebMarAprMayJunJulAugSepOctNovDec%-12s %8ld -- Pack SQ  ueUUU )]UF tv ]= vHF%1FF0CP3PPPpF^ t؉F v F%1FF0CP3PPP2FV^ t؃FVv! vFtF uv~vv~~D+EtyEȻYKKyً3x CC%CCE y3CC1Wp^~NF uF vFVvF33SS0vFV vF3SS y ؃πvRP0CPS~F tFuv~vvzv~q3SSSSSS_|P"P . t.] .]CCsCCtڋF-0@FFދF3FF܋[~8" " " " Fuv~F uFFF F ~ v[Y3PPPPQS v5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1F~v~[ &nv! y2y:}!ĹR9u NN$t w$t$t2 F ~FFEFEFE~iF???? %3d%% %2d %3s %02d %2d:%02d%c .TMPrTemp file %s already existswrbUnable to create temporary file %sConverting file: %s reading,Cannot unsave %s %s is not an archive%s is not an archive, or is out of sync Archive length errorInvalid header in archive %sI don't know how to handle file %s in archive %sWrite fail (disk full?)Write fail (disk full?)rbWARNING: Backup copy %s exists! Delete it (y/n)? Old backup not deletedrbCannot rename %s to %srbCannot open renamed archive: %swbCannot create new archive: %sCreating new archive: %s abCannot create archive: %srbCannot read archive: %s analyzing, storing, packing, squeezing, done. Bug - bad ncr state I don't know how to unpack file %s I think you need a newer version of ARC WARNING: File %s fails CRC check Bad NCR unpacking state (%d)File %s has an invalid decode treeBad NCR unpacking state (%d)Get timestamp fail (%d) Set timestamp fail (%d) NEEDS DOS 2.0$ TOO MANY ARGScFREE$ , NO CORE$ ABORT:- FvD3۹%u؋8FV^F;+~FVt^^Fxu=Ff ~F%-?=}#=~)F-8yV^F 3~EARC - Archive utility, Version 3.06, created on 04/22/85 at 15:25:13 (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED You may copy and distribute this program free of charge, provided that: 1) No fee is charged for such copying and distribution, 2) You distribute this as a complete set of all files, and 3) It is distributed ONLY in its original, unmodified state Usage: ARC {audxelbwnt} [ . . .] Where: a,u = add files to archive m = move files to archive d = delete files from archive x,e = extract files from archive p = copy files from archive to stdout l = list files in archive b = retain backup copy of archive w = suppress warning messages  $WRITEREAD @AAŁ@ Aρ@ ʁ@  AAہ@ށ@Aԁ@AAс@01A3@26@754A<@=?>A:;A9@8(@)+*A./A-@,$%A'@&"@#! A`aAc@bf@gedAl@monAjkAi@hx@y{zA~A}@|tuAw@vr@sqpAP@QSRAVWAU@T\]A_@^Z@[YXAHIAK@JN@OMLAD@EGFABCAA@@$@Y@@חA7yACnF?O8M30HwZ?sOu~ ?{Gz?-C6?:0yE>ؗҜ<2#I9 The assembler will read in the file TEST.AZM from the current drive and create an object file TEST.HEX and a listing file TEST.PRN. Controlling Output......................................................... Either of the output files (or both) may be omitted. In addition, the files may be located on different drives. Since the source file must always have a .AZM extention we may use the extention to control the output. Z80MR TEST.sol The letter in the 's' position tells the assembler where to find the source file and may be any disk drive letter from A to D. The letter in the 'o' position tells the assembler where to locate the object file and may be A-D as above or Z if the file is not desired. The letter in the 'l' position tells the assembler what to do with the listing file. It can be any drive letter from A-D or Z if the file is not desired. In addition the listing f -25DISK DOCzAZM-COM DOC*jCHEATER DOC"MAC-AZM DOC#~PHASE DOC7EPHASE1 AZM| README Z80QZ80 COM@Z80 Z80<?Z80A Z80DØZ80B Z80F$$Z80C1 ZQ0j]Z80C2 ZQ0?)Z80D ZQ0KnMZ80E ZQ0J7Z80F ZQ0BXZ80MR COMEiZ80MR DOC The Z80MR creates two output files from an assembly language source file with a .AZM extention. The assembly language file can be any combination of Z80 mnemonics or assembler commands and pseudo-ops in the correct form as described in the file Z80MR.ile may be sent to the console if an X is in that position. Loading Hex Files.......................................................... The object file must be translated from Hex format to machine executable values by another program. If the program was written to ORG at 100H the program may be loaded with the CP/M utility LOAD.COM. All of the programs on this disk with a .COM extension are ORGed at 100H. This is where CPM loads its transient programs. To load TEST.HEX with LOAD.COM just enter LOAD TEST The extention of .HEX is assumed. If you have a program that does not ORG at 100H you must use DDT to read in the .HEX file which it does by translating the Hex format to binary as it reads it into memory. Once in memory you may manipulate it with DDT even SAVE an image of the program in memory actually creating a .COM file. If you write a program that ORGs where CP/M resides you can wipe out CP/M and have to reset the computer to recover. See the file PHASE.DOC for some more informa< Reformat when in wrap mode .alc (continued) .all .brp SPECIAL COMMANDS ---------------- Continue Search/Replace...^S Insert Control Character..^C Enter/Leave Command Mode..^[ Set Block Marker.......^P^P Block Copy.............^P^C Clear Block Marker.....^P^U Block Move.............^P^M Clear all Markers......^P^K Block Delete...........^P^D AUTO-SCROLL MODE COMMANDS ------------------------- '1'-'9' or '0'........change scroll speed to this value '-'...................reverse direction of scroll any other key.........end scrolling REPLACE MODE COMMANDS --------------------- Continue, No Replace......^S Replace and Stay Here....^J Replace and Continue......^M Center Find on Screen....^] Begin Editing.............(Any other Key) PHASED code One of the limitations of this assembler is the lack of a .PHASE directive. This directive causes the assembler tion on ORGing files at High memory locations. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .brp .fif .pdw 80 .inb 0 .ctd \ .fbb \\%pageno%\\ .fbe .inl 8 .alc Control Command Cheat Sheet (non-modified system) ------------------------------------------------- .all Cursor Control -------------- Cursor Left.......^H (Backspace) Next Tab..........^I Cursor Right......^L Previous Tab......^U^I Cursor Up.........^K Cursor Down.......^J (Linefeed) Next Word.........^W Previous Word.....^A Indent............^U^W Undent............^U^A Start of Line.....^U^H End of Line........^U^L Top of Screen.....^U^K Bottom of Line.....^U^J Top of Buffer.....^U^R Bottom of Buffer...^U^Tto generate addresses for a different section of memory for labels than the actual place the code is to be loaded. This is important for the Kaypro since when the ROM is called, the lower 32K of memory is no longer available. Simply ORGing at higher location later in the program and jumping there will cause the entire area of memory between 100H and the end point of the program to be saved resulting in a huge .COM file when loaded with LOAD.COM. There are many ways to phase code and still end up with a reasonable sized .COM file. Here I will present two of the most common methods. Label+OFFSET Method........................................................ In order for code to be assembled in one area to run in another, our only concern is how the addresses are calculated by the assembler. Normally, an assembler sets a location counter when it sees an ORG pseudo-op. As it produces each byte of the it increments the location counter to calculate the next address. If it finds a label, it s Start of Line/Screen/Buffer.....^^ on some terminals End of Line/Screen/Buffer.......^N Carriage Return.................^M SCROLLING COMMANDS ------------------ Scroll Down One Line......^F Scroll Down Continuously..^U^F Scroll Up One Line........^G Scroll Up Continuously....^U^G Next Page.................^T Center Cursor Line........^] Previous Page.............^R EDITING COMMANDS ---------------- Rubout.................... Delete Word...............^V Delete Character..........^D UNdelete Word.............^U^V Insert Single Space.......^E Delete to End of Line.....^Y Partial Insert Mode.......^Q UNdelete End of Line......^U^Y Toggle Full Insert Mode...^U^Q Insert Line...............^X Delete Line...............^Z Toggle Entry Mode.........^\ UNdelete Line.............^U^Z Break Line................^B Concatenate Lines.........^O  ets the label's address according to this location counter. The programmer has another method of setting the address of labels, with EQU. If every label in the program takes the form of Label+OFFSET where the offset is a constant, then the assembler will produce the code to run in high memory while creating a file that will load in low memory. The following short program which re-loads your monitor ROM from the ROM to RAM illustrates this. ;************************************************************************** ;** Rom Save Program ** ;** Run and then enter SAVE 16 ROM.COM ** ;** ROM.COM will contain object code of your monitor ROM ** ;************************************************************************** ORG 100h TRUE EQU 0FFH FALSE EQU 0 OLD EQU TRUE ; TRUE IF NOT 10 OR 4-84 IF OLD SYSPRT EQU 1CH ; old kaypro 2's and fours ELSE SYSPRT EQU 14H ; tens, 4-84's, 2-84's ENDIF O** Loader.azm Loads relocating code to its destination *** ;************************************************************************** ORG 100H BYTCNT EQU 100H ; we can either supply a value here that we ; know will load enough code or assemble ; the high code first and let the assembler ; give us this value (examine print file) HISTRT EQU 8000H ; where the relocation code goes HILOAD EQU 200H ; where the other file goes LD DE,HISTRT ; the destination of the High memory code LD HL,HILOAD ;the source code is just beyond this loader LD BC,BYTCNT ;the number of bytes to move (end - start) LDIR ; move it up there JP HISTRT ; jump to it ; memory code segment END ;************************************************************************** ;** Phase2.azm *** ;** Relocate with DDT *** ;*************************************************FFSET EQU 8000h ; offset for calculating high addresses LD DE,HISTRT ; the destination of the High memory code LD HL,LODEND+1 ; the source code is just beyond this loader LD BC,HIEND-HISTRT ; the number of bytes to move (end - start) LDIR ; move it up there JP HISTRT ; jump to it LODEND: NOP ; to calculate end of loader/start of high ; memory code segment HISTRT EQU $+OFFSET ; BEGIN USING OFFSET IN A,(SYSPRT) ; get present sysport data SET 7,A ; bank select bit OUT (SYSPRT),A CALL MOVIT ; move the code routine IN A,(SYSPRT) RES 7,A ; back to ram bank OUT (SYSPRT),A CALL TPAMOV ; now move to 100H for save JP 0 ; back to CP/M MOVIT EQU $+OFFSET LD HL,0 ; Source is at 0 (in ROM ) LD DE,OFFSET+1000H ; Load above us LD BC,1000h ; pick up 4K (2732) LDIR RET TPAMOV EQU $+OFFSET LD HL,OFFSET+1000H ; destination becomes source LD DE,100H ; move to TPA start LD BC,1000H ; 4K bytes to move LDIR RET HIEND EQU $+OFFSET ; end of code to************************* TRUE EQU 0FFH FALSE EQU 0 OLD EQU FALSE IF OLD SYSPRT EQU 1CH ; old kaypro 2's and fours ELSE SYSPRT EQU 14H ; tens, 4-84's, 2-84's ENDIF BYTCNT EQU HIEND-HISTRT ORG 8000h HISTRT: IN A,(SYSPRT) ; get present sysport data SET 7,A ; bank select bit OUT (SYSPRT),A CALL MOVIT ; move the code routine IN A,(SYSPRT) RES 7,A ; back to ram bank OUT (SYSPRT),A CALL TPAMOV ; now move to 100H for save JP 0 ; back to CP/M MOVIT: LD HL,0 ; Source is at 0 (in ROM ) LD DE,9000H ; load above us LD BC,1000h ; pick up 4K (2732) LDIR RET TPAMOV: LD HL,9000H ;destination becomes source LD DE,100H ; move to TPA start LD BC,1000H ; 4K bytes to move LDIR RET HIEND EQU $ END Now we can use DDT to join the two files. DDT LOADER.HEX H200,8000 8200 8200 ; in this case both numbers are the same (we want ; second IPHASE2.HEX ; prepare to load file R8200 ; read in with offset ^C ; exit to CPM SAVE 1 PHASE3 be relocated END Assemble this program (the source is on the disk as phase1.azm so you don't have to type it in). Examine the listing file. Notice that the assembler generated high memory addresses though the program loads low. Using DDT.COM.............................................................. With this method you would split the above program into two parts, the loader and the code that is to be relocated. You can assemble the loader and pick an arbitrary source address for the code to be relocated (say 200h). Then you can assemble the relocatable portion with an high ORG. (8000H say). Now you can join the two HEX files together with DDT.COM reading in the high portion with an OFFSET. To get the offset use DDT's Hex sum and difference command in the form of: H, The second number will be the OFFSET. The program we wrote above would go together like this. ;************************************************************************** ; .COM ; and the com file is created ORGing High ( CP/M modifications )......................................... DDT.COM can be used to load .HEX files anywhere in memory despite where the load point (ORG) was set. It does this by reading the file in with a negative offset with the R command. Usually CPM is modified by saving the SYSGEN image and then overlaying the image with the modified section and re-SYSGENing. Lets say you wrote a new BIOS for your Kaypro. The BIOS for the old Kaypros ORGed at FA00H. You assemble it with the assembler with the ORG at FA00H. The object file is KBIOS.HEX If you want to overlay the present bios with your new bios immediately to see if it works it is done as follows: Enter DDT by entering DDT IKBIOS.HEX ; this sets up DDT for a file read R ; actually reads the file in and overlays ; your old bios with the binary code ^C ; returns you to CPM and if all is well ; with your new bios you will warm boot Noegment HISTRT EQU $+OFFSET ; BEGIN USING OFFSET IN A,(SYSPRT) ; get present sysport data SET 7,A ; bank select bit OUT (SYSPRT),A CALL MOVIT ; move the code routine IN A,(SYSPRT) RES 7,A ; back to ram bank OUT (SYSPRT),A CALL TPAMOV ; now move to 100H for save JP 0 ; back to CP/M MOVIT EQU $+OFFSET LD HL,0 ; Source is at 0 (in ROM ) LD DE,OFFSET+1000H ; Load above us LD BC,1000h ; pick up 4K (2732) LDIR RET TPAMOV EQU $+OFFSET LD HL,OFFSET+1000H ; destination becomes source LD DE,100H ; move to TPA start LD BC,1000H ; 4K bytes to move LDIR RET HIEND EQU $+OFFSET END g  _ 1>"o6^Ew: <2 8>2!!1͎͍͍8(88(͕(C e:!O(ɯ2/2!2R!<2 !/"!! w#p>|2N!>2I!2J!:R!(2!>O2L!2K!2!2!2Q!2!2S!2T!: :!2!2H!<2G!d* 6!~ # (=;(9A8 w you want a permanent copy of your new bios on your system tracks. Once done you will be able to copy your new system onto any disk with SYSGEN. SYSGEN copies the system into memory but not at the same place the system runs. The BIOS image actually begins at 1F80H in the SYSGEN image. We must read the file in at 1F80H even though it ORGs at FA00H. We can do this with DDT also. First we must save the SYSGEN image to a file. sysgen KAYPRO SYSGEN V2.2 SOURCE DRIVE (OR RETURN TO SKIP)a ; get the system from A: SOURCE ON A THEN RETURN ; enter a carriage return DESTINATION DRIVE (OR RETURN TO REBOOT) ; enter a carriage return save 40 cpm.com ; save it to a file Now we use DDT to work on it ddt cpm.com h1f80,fa00 ; we ask for the sum and difference ; of desired address - load address ; DDT prints this. The second number is the ; offset ikbios.hex r ^C Now when we return to CP/M we run sysgen to save the new image to system tracks. SYSGEN !#>84~8x2=!~ ( (; !!͚(:!7(" ͻ* , @# ; ˰~' p +~F(x@G ( (,(; p(#x˸~( ~) #+>!~0  #y a' # y2=!(S!!͚(DOq :!(y %~+(- yO(V@("!""!ѧR @(9@("!"!x(!~#((#N#y@(2!2!Ú<ͻůG2!2!Rʽ~8+8+.(G'(([((ʖ]()ʥ$(͝+' E[S!#l:!( @(]2! =8@(_:!G{0{:!(pˀ{=(g#>(Yˀ#(T(=(G( (9=(0!():! #H(A<IV!OSB~0#+~B(D(hHʸO(.Q(*Y~020 0O#B #~7~0800O #O(Q #~7~0:00OBK#D #~~0G00 8O #H #~7A8GH( O(Qarriage return> KAYPPRO SYSGEN V2.2 SOURCE DRIVE (OR RETURN TO SKIP) ;enter return (use the memory image) DESTINATION DRIVE (OR RETURN TO REBOOT) ;we will put it on B DESTINATION ON B THEN RETURN ; another return FUNCTION COMPLETE DESTINATION DRIVE (OR RETURN TO REBOOT) ; one more return Now when when we boot with the disk in drive B the new system will be loaded.  ORG 100h OLD EQU 0 IF OLD SYSPRT EQU 1CH ; old kaypro 2's and fours ELSE SYSPRT EQU 14H ; tens, 4-84's, 2-84's ENDIF OFFSET EQU 8000h ; offset for calculating high addresses LD DE,HISTRT ; the destination of the High memory code LD HL,LODEND+1 ; the source code is just beyond this loader LD BC,HIEND-HISTRT ; the number of bytes to move (end - start) LDIR ; move it up there JP HISTRT ; jump to it LODEND: NOP ; to calculate end of loader/start of high ; memory code s (7)V 0V =!W ^#VU#` ^#` V#` 7ɧ~' #~'ɯ#~0 =!W#. :=!0!!͚F#b((2!= ~* >52!#!!:! 0O <2!w<ɯ!!:!( =2!O <~!!:!0O 2!s#r<ɯ!!:!(2!O ^#V!(8˰˸z |  | R p x(!(!( zW{_!(!( zW{_w > ͙̈́xw >͙>Wy͙xw >:͙͐yw H>͙̈́H>6͙Wb}͙x HH>͙̈́͐xH ( >͙>K̈́H>*͙͐H>pq͙Wyw H>͙>Gy͙yw >2͙͐yA ( >͙>C̈́H>"͙͐xAOH>Fy͙WH>y͙b}͙>@qHy͙x yA H>͙:!G:!X>P(>͙Xb}͙|(<(VGyGyGy}͙|͙*!:\!_~(Lw{2\!*S!:\!_"S!:!S*!  z2\!:J!(T̓%ɯ2!2!!"!"!"!!!ˆˎ*S!"U!!M!4* " " ^> " ~ >2J!{7?!!7ɯ2J!2]!2\!2[!!^!"!1w#=w2M!*S!"W!> 2P!!!˞P! ! " O(x (v:N!y-R C ((('(;(c` )IB J(ˊxP0+~# ('(, qyJ a8{0_w##B q#> ww#6 ZLJ R J ˂q> Ñq> !!"U!:M!"Y!>2[!: ̖*!\! _"!!]!{w͓:!O:J!G:P!O x(3({w:K! *W!:]!W!^!:[!(*Y!= z(3~ͦ##(${ !(!( zW{_!(!( R !(!(zƀW|ƀgR0!(!(zƀW|ƀgR0!(!( R0!(!( R0S|; }$0>$2L!oT!!!DM :! 5~ 1( :!(G~(x w>(w/͹ ; T}2N!; :O!9:I!>2O!*  ʹ W :w#~+: ~@w##{ y. #~08#NO> !:!2I!:!ʹ ; }ʹ 2K!*  ʹ y 8͹ !y(` >2Q!!R!4*  ($y([!A `~# y2\!(͹ ' '#T]` ~ (#  ( ;(͹ <͹ :!(:! :!G:!O*![!:!(ME:!_! ^#V5G~#(&(/( ͹ "(##N#fi! &Eͻ     ! ( / / 3 @ M Q [ e o v z   p#0@@@pO@^^op@@ $>N}zQ%1wCyWtp{pwyt{vr}"g2IBVmG'B׷t{yw _=( ͠:!_(͠C ͠_:Q!(:!. }2!-͠!!͎2Q!! :L!_~O#( ( (   > 2 GOxOzW 007  :!G oUM!!:I!:! w|ͦ}ͦ:!O:!G(2!:O!<2O!9Wx2!CROWE (TH/DC/JGO) Z80 1.3e. Page  d!1͎!M͎͜2O! ͠!!͎~(O#!H!ͮ+ͮoͻoͻoG B 0Ox*G!}'o|'g"G!SYMBOL TABLE OVERFLOW! :!Ww!͎!O!44(:O!TT!/~(SG#N# C ͠#~ͦ+~ͦ##  N#(M(  ͠:O!90 <2O!T :!G>2!!!N(5EF(<:\!G(3*U!:! "!#"U!*!Y~!!:!_w{<2!  :!(,G: xͦ*!ͦ!!~ͦ# zͦ2!: Wͦ*!ͦzͦ#x( ~8p~0#A8[08:?(_(7?7:=!G_~#fo>!~(# ~ ~# xŁ=_!/N ()!=!F##~8 ## ((# . 8 :!_! ^#V C 5 *!"S!TJS:!( T5( S*S!DM(50( jSc (: (PHmC: (.##N(M/ +p+q#+V+^B(q#pP## F "!T!!b}͙͐[S!"S!J:! (>͙:!͙:!Hq͙:!͙b}͙H:!͙WH:!y͙H:!4͙Wx HH:!͙̈́| } (͙>Fy͙>͙H:!q͙H>͙W:!͙} >͙:!qMy͙} AH>͙MW:!y͙H>͙H>y͙͐>͙͐P H^> y͙}͙^>͙}͙^>͙}͙[S!R}怴(}/(Ry͙͐>͙͐>͙H>y͙}Ǵ }͙xw z>͙{͙>͙H>@y͙>͙>Ay͙yw |>͙}͙:! HH:!͙̈́Ay H>͙x >͙x y >͙xw :!q͙xw :!͙b}͙xw AH:!͙Wx y >͙:!B͙̈́xw >q͙xw >͙b}͙xw AH>͙Wx y y H> ͙̈́x ( >O  :6!(< Z80 Z80DIF TITLECHAINNLIST PRN LISTW!AwBpCqDrE HEXR!AFBCDEHLSPIXIYN!!6!\ ; ;************************************************************************* ;CONSTANTS ;************************************************************************* YES EQU 255 NO EQU 0 CR EQU 0DH ; ASCII CARRIAGE RETURN LF EQU 0AH ; ASCII LINE FEED HT EQU 09H ; ASCII HORIZ. TAB FORMFD EQU 0CH ; ASCII FORM FEED NUL EQU 0 ; ASCII NULL SPACE EQU 20H ; ASCII SPACE DEL EQU 0FFH ; ASCII DELETE CTL EQU 40H ; CHAR.-CTL EQU CONTROL CHARACTER. CTOK EQU 71H ; TOKEN FOR UNCONDIT. OPND KW 'C' CCOND EQU 8BH ; TOKEN FOR CONDITIONAL OPND KW 'C' XYMASK EQU 0FBH ; MASK TO RECOGNISE IX/IY TOKENS IXORIY EQU 1AH ; COMMON VALUE OF IX/IY TOKENS INTTOK EQU 90H ; OPERAND TOKEN FOR 'INTEGER' ORGTOK EQU 1 ; TOKEN FOR 'ORG' PSEUDO-OP EQUTOK EQU 2 ; TOKEN FOR 'EQU' PSEUDO-OP DEFLTK EQU 3 ; TOKEN FOR 'DEFL' PSEUDO-OP DEFSTK EQU 7 ; TOKEN FOR 'DEFS' PSEUDO-OP PLUTOK EQU 07H ; TOKEN FOR MONADIC PLUS MINTOK EQU 0FH ; TOKEN FOR MONADIC MINUS LBTOK EQU 0B0H ; TOKEN FOR '(' EXPTOw~ (=Q0@2w~ (-Q8@2~ (Q8X @2ͬ: :!GWij: :!G}Wr u (ͦu CO!'"CO!+" !w w ww u <(!'"!5 ( u NO SOURCE: $u u TDISK ERROR,ASSEMBLY ABORTED $'* +*}(6ŷR <E(ͯu u u O}ƀo0$*|/(q#"n !+ͯ!+*|+(q#"n !'ͯ!'*|'( ~n #"n #>u u ( {_0 !#:G:yr _ LIST TITLE 'Z80.Z80 2/12/84A' ;MAIN LOOPS. VERZ EQU 13H ;I.E., 1.3 TEST EQU 0 REV EQU 'e' ;This source consists of several files tied together by the ;fabulous CHAIN command. The files are: my notes (jgo) ; Z80.Z80 ;Main loops. This filK EQU 35H ; TOKEN FOR EXPONENTIATION ASKTOK EQU 3DH ; TOKEN FOR MULTIPLY MAXFSK EQU 10D ; MAX SIZE OF ARITHMETIC ; FUNCTION STACK MAXASK EQU 20D ; MAX SIZE OF ARITH STACK PLINES EQU 66 ; NO OF LINES ON LIST DEVICE PAGE LBFSZ EQU 80 ; LINE BUFFER CAPACITY LTERM EQU CR ;TOKEN FOR A SUB-LINE ENDING IN LINBUF. GTERM EQU LF ;LTERM,GTERM IS PHYSICAL LINE ENDING IN LINBUF. ACBSIZ EQU 50 ; SIZE OF ASSD CODE BUFFER. TITSIZ EQU 32 ; SIZE OF TITLE BUFFER RECSIZ EQU 16 ; MAX NO OF DATA BYTES PER OBJ RECORD SPERL EQU 5 ; NO OF SYMBOLS PER LINE ; IN SYMBOL TABLE LISTING STKSIZ EQU 68 ; SIZE OF STACK ; CP/M LINKS CPM EQU 5 ;FDOS ENTRY SETDMA EQU 26 ;CP/M FUNCTION OPNFIL EQU 15 ;OPEN FILE CLSFIL EQU 16 ;CLOSE FILE DELFIL EQU 19 ;DELETE FILE MAKFIL EQU 22 ;CREATE FILE RDNR EQU 20 ;READ NEXT RECORD WRNR EQU 21 ;WRITE NEXT RECORD PRBUF EQU 9 ;PRINT STRING ON CONSOLE DFCB EQU 5CH ;DEFAULT FCB DEFBUF EQU 80H ;DEFAULT BUFFER CTLZ EQU 1AH ;EOF CHARACTER Ie. 1 ; Z80A.Z80 ;Parse line. ; Z80B.Z80 ;Expression evaluation. ; Z80C1.Z80 ;Process output of parser. ; Z80C2.Z80 ;Process output of parser. 1 ; Z80D.Z80 ;Produce input/output. 1 ; Z80E.Z80 ;Symbol handling; fixed symbol tables. ; Z80F.Z80 ;CP/M links; variables. Last file. 1 ;Descriptions are approximate. Notes: (1) references pass number. ;COPYRIGHT 1978 BY PAT CROWE. NLIST ;********************************************************************** ; Z80 ASSEMBLER VERSION 1.2 ; WRITTEN BY PAT CROWE ; 22 RINGSBURY CLOSE ; PURTON ; SWINDON ; SN5 9DE ; ENGLAND ; ; THE 'LBFSZ-1' AND ; THE "EX AF,AF'" BUGS FIXED BY ; THOMAS HAMEENAHO ; DJAKNEGATAN 7 ; S-754 23 UPPSALA ; SWEDEN ; ; MACHINE DEPENDENT ROUTINES REPLACED ; WITH CP/M FUNCTION CALLS 9/8/83 BY ; DANA COTANT/ MICRO CORNUCOPIA TECHNICAL DEPT ; ; Various things, j.g.o. 1/84  NCON EQU 1 ;CONIN FUNCTION OUTCO EQU 2 ;CONOUT FUNCTION ;**************************************************************************** ;START OF PROGRAM. ;I/O ROUTINE JUMP TABLE. ;THE USER SHOULD PLACE THE ADDRESSES OF HIS ;OWN I/O SUBROUTINES IN THE LOCATIONS IN ;THIS TABLE CONTAINING THE DESTINATIONS OF ;JP INSTRUCTIONS. ALL I/O IS PERFORMED VIA ;THIS TABLE. ;**************************************************************************** BOOT EQU 0000H ; ORG 100H START: JR MAIN ; JUMP PAST JUMP TABLE ;NOT USED: CI: JP CONIN ; JUMP TO USER CONSOLE IN SUBR CO: JP CONOUT ; JUMP TO USER CONSOLE OUT SUBR LO: JP LSTO ; JUMP TO USER LIST OUT SUBR RI: JP RDRIN ; JUMP TO USER READER IN SUBR PCHO: JP PCHOUT ; JUMP TO USER PUNCH OUT SUBR MEMCHK: JP MEMCK ; JUMP TO USER MEM CHECK SUBR EXEC: JP BOOT ; JUMP TO USER MONITOR ENTRY POINT ;MAIN PROGRAM LOOP. ;**************************************************************************** MAIN: LD SP,STACK ; SET STACK POINTER CEMTOP LD (HL),A INC HL LD (HL),B RET ;**************************************************************************** ;INITIALIZE PASS ;**************************************************************************** INITP: LD A,'|' | LD (SLNMRK),A ;INITIALIZE SUB-LINE MARKER TO A VR. LD A,YES | LD (DOLST),A ;DEFAULT IS LISTING. LD (EOLINE),A ;FORCE NEW PHYSICAL LINE. LD A,(TITCNT) | CP 1 | JR Z,ITP10 ;DON'T CLEAR TITLE ;BUFFER IF ONLY ONE COUNT. XOR A | LD (TITBUF),A ; EMPTY TITLE BUFFER. ITP10: LD A,79 | LD (LWIDE),A ;INIT LIST WIDTH TO 79 COLUMNS. XOR A LD (LSTCNT),A ;SET HEX LINES TO PRINT TO 256. LD (IFST),A | LD (NOASBL),A ;CLEAR IF SITUATION. LD (TITER),A ;CLEAR TITLE ERROR FLAG. LD (OBJCNT),A ; CLEAR OBJECT BUFFER COUNT LD (ADREFC),A ; SET ADDR REF CNTR = 0 LD (ADREFC+1),A LD A,(PASSNO) | CP 2 | RET NZ LD A,(OFLAGS) | AND +(1.SHL.LSTFIL).OR.(1.SHL.LSTCON) RET Z ; NO LIST, NO HEADR. LD (LFLAGS),A ;SET LISTING FLAGS. XOR A | LD (PAGE+1),A | INALL INITA ; INITIALIZE ASSEMBLER CALL DOFILS ; DO FILE SETUP. CALL PHRLD ; PRINT HERALD MAIN1: CALL SETIO ; SET-UP IO FOR A PASS. CALL PASS ; PERFORM A PASS. CALL ENDIO ; CLOSE FILES, ETC. LD A,(PASSNO) ;CHECK OUT PASS SITUATION. INC A LD (PASSNO),A CP 3 | JR C,MAIN1 ;NOT FINISHED. JR EXEC ;FINISHED. DEPART. ;**************************************************************************** ;PRINT HERALD ON CONSOLE DEVICE. ;**************************************************************************** PHRLD: LD A,1.SHL.LSTCON LD (LFLAGS),A LD HL,PHEAD ;POINTER TO HEADER MATERIAL. CALL LSTST ;LIST IT. CALL DCRLFX ;PERFORM CARRIAGE RETURN LINE FEED. RET ;**************************************************************************** ;PERFORM A PASS ;**************************************************************************** PASS: CALL INITP ; INITIALIZE FOR PASS PASS1: CALL ABORT ;CHECK IF USER IS UPSET. CALL GLINE ; GET A LINE JR C,PASS4 ; A CTL-Z WAS DC A | LD (PAGE),A ;PAGE # := 1. CALL HEADR ; MAKE A HEADER PLEASE. CALL PWARN ;ADVISE OF SYMBOL OVERFLOW. RET CHAIN 'Z80A' ;END OF Z80.Z80.  LIST TITLE 'Z80A.Z80 1/28/84' ;PARSE LINE. NLIST ;********************************************************************** ;GET LABEL ;LOCATES LABEL (IF ANY) IN LINBUF AND PUTS IT IN LABBUF. ;LEAVES POINTER TO CHARACTER AFTER LABEL IN LINPNT. ;ZERO SET IF NOTHING ELSE TO PROCESS ;********************************************************************** GLAB: PUSH HL ; SAVE REGS PUSH DE PUSH BC LD HL,(LINBAS) ; SET POINTER TO CURRENT ; POSITION IN LINE BUFFER. LD DE,LABBUF ; SET POINTER TO LABEL BUFFER LD B,0 ; CLEAR STATUS REG GLAB1: LD A,(HL) ; SCAN TO FIRST NON SPACE CHAR CP SPACE JR NZ,GLAB2 SET 2,B ; SET 'NOT FIRST COL' FLAG INC HL ; POINT TO NEXT CHAR JR GLAB1 GLAB2: CP LTERM ; NULL LINE? JR Z,GLAB8 ETECTED. CALL GLAB ; GET LABEL JR Z,PASS4 ; JMP IF NO MORE PROC. REQD. CALL GETOR ; GET OPERATOR TOKEN JR C,PASS3 ;NO OPERAND PROCESSING REQUIRED. JR Z,PASS4 ; NO MORE PROC. REQD. CALL GTOD ; GET OPERANDS. JR Z,PASS4 ; JMP IF NO MORE PROC. REQD. PASS3: CALL PTOK ; PROCESS TOKENS PASS4: CALL PFRLO ; PERFORM RELEVANT OUTPUT LD A,(AFLAGS) ; TEST FOR END STATEMENT BIT 1,A JR Z,PASS1 ; GO PROCESS ANOTHER LINE IF NOT RET ;************************************************************************** ;INITIALIZE ASSEMBLER ;************************************************************************** INITA: XOR A ; CLEAR ACC LD (SYMTAB),A ; CLEAR SYMBOL TABLE LD (AFLAGS),A ; CLEAR ASSEMBLER FLAGS. LD (TITCNT),A ; CLEAR TITLE COUNT. INC A LD (PASSNO),A ; START WITH PASS 1. LD HL,SYMTAB ; PUT SYMBOL TABLE START ADDR LD (SYMEND),HL ; INTO 'END OF SYMBOL TABLE' STORE CALL MEMCHK ; GET HIGHEST AVAIL MEM IN B-A LD HL,MEMTOP ; SAVE IN M CP ';' ; COMMENT? JR Z,GLAB8 CP 'A' ; IT IS A-Z? JR C,GLAB5 CP 'Z'+1 JR NC,GLAB5 CALL GSYM ; PUT SYMBOL IN BUFFER LD A,(HL) ; FOLLOWED BY ':'? CP ':' JR Z,GLAB3 ; JUMP IF FOLLOWED BY ':' ; I.E. IT'S A LABEL BIT 2,B ; STARTED IN FIRST COLUMN? JR NZ,GLAB6 ; JUMP IF NOT LABEL JR GLAB7 GLAB3: INC HL LD A,(HL) GLAB7: CP SPACE ; FOLLOWED BY SP/LTERM/;? JR Z,GLAB4 CP LTERM JR Z,GLAB4 CP ';' JR Z,GLAB4 GLAB5: CALL DNOPS ; RESERVE 4 DEFAULT NOP'S CALL ADJARC ; ADJUST ADDRESS REF COUNTER XOR A ; SET ZERO FLAG JR GLAB8 GLAB6: LD HL,(LINBAS) ; SET POINTER TO START OF CURRENT LINBUF XOR A ; SET 'NO LABEL IN BUFFER' LD (LABBUF),A GLAB4: LD (LINPNT),HL ; DEPOSIT LINE POINTER XOR A ; CLEAR ZERO FLAG INC A GLAB8: POP BC ; REPLACE REGS POP DE POP HL RET ;********************************************************************* ;GET OPERATOR TOKEN, ;LOCATES OPERATOR (IF ANY) AND PUTS TOKEN AND VALUE FOR IT IN ORTKBF. ;LEAVES POINTER LD B,0 ; CLEAR B (OPERAND COUNTER, ; 'BRACKETS' FLAG & 'QUOTE' FLAG) GTOD1: CALL SCNSP ; SCAN TO FIRST NON SPACE CHAR CP ',' ; IS IT A COMMA? JR NZ,GTOD2 BIT 0,B ; YES, FOUND 1 OPERAND? JP Z,GTOD25 ; NO, SYNTAX ERROR INC HL ; YES, SCAN TO NEXT NON SP CHAR CALL SCNSP JR GTOD3 GTOD2: CP ';' ; IS IT A ';'? JP Z,GTOD24 CP LTERM ; OR A LTERM? JP Z,GTOD24 GTOD3: PUSH HL ; NO, SET POINTER TO START POP IX ; OF OPERAND IN IX ; SCAN TO NEXT DELIMITER RES 6,B ; CLEAR QUOTE FLAG GTOD4: LD A,(HL) ; GET CHAR IN A CP '''' ; IS IT A '? JR NZ,GTOD18 ; JUMP IF NOT BIT 6,B ; QUOTE FLAG SET? JR NZ,QUOTE ; IF SO, QUOTE PUSH HL ; PREP TO CHECK IF AF' DEC HL ; POINT TO PREV CHAR LD A,(HL) POP HL ; RESTORE POINTER CP 'F' ; IS IT 'F'? JR Z,GTOD28 ; YES, THEN NO QUOTE QUOTE: LD A,B ; COMPLEMENT QUOTE FLAG XOR 01000000B LD B,A JR GTOD28 ; AND CONTINUE TO SCAN GTOD18: CP LTERM ; IS IT LTERM? JR Z,GTOD5 ; FOUND DELIMITER TO CHARACTER AFTER OPERATOR IN LINPNT ;EXIT: Z,NC: NOTHING ELSE TO PROCESS. ; Z,C: SKIP OPERAND PROCESSING. ; NZ,NC: DO ALL SUBSEQUENT PROCESSING. ; NZ,C: NOT ALLOWED. ;********************************************************************** GETOR: LD HL,(LINPNT) ; FETCH POINTER TO LINE BUFFER GETOR1: CALL SCNSP ; SCAN TO FIRST NON SPACE CHAR GETOR5: CP LTERM ; IS IT LTERM? JR Z,GETOR2 CP ';' ; IS IT ';'? JR Z,GETOR2 ;WITH 0 FLAG. CALL ALPHA ; IS IT A LETTER? JR NC,GETOR3 ; NO, SYNTAX ERROR LD DE,SYMBUF+1 ; SET POINTER TO SYMBOL BUFFER LD B,0 ; SET COUNT = 0 GETOR4: LD (DE),A ; PUT CHAR IN OPERATOR BUFFER INC HL ; INCR LINBUF POINTER INC DE ; INCREMENT SYMBUF POINTER INC B ; INCR CHAR COUNT LD A,5 ; GREATER THAN 5? CP B JR C,GETOR3 ; YES, SYNTAX ERROR LD A,(HL) ; GET NEXT CHAR CALL ALPHA ; IS IT A LETTER JR C,GETOR4 ; YES, LOOP LD A,B ; SAVE # OF OPR CHARS IN SYMBUF LD (SYMBUF),A LD A,(HL) ; FETCH NEXT CHAR AGAIN R, JUMP CP SPACE ; IS IT SPACE JR Z,GTOD27 ; JUMP IF SO CP ',' ; IS IT A COMMA? JR Z,GTOD27 ; JUMP IF SO CP ';' ; IS IT ; ? JR NZ,GTOD28 ; CONTINUE SCAN OF NONE OF THESE GTOD27: BIT 6,B ; IS QUOTE FLAG SET? JR Z,GTOD5 ; JUMP IF NOT, FOUND DELIMITER GTOD28: INC HL ; POINT TO NEXT CHAR JR GTOD4 ; AND LOOP ; FOUND DELIMITER GTOD5: PUSH HL ; SET POINTER (IY) TO CHAR POP IY ; AFTER END OF OPERAND INC B ; INCR # OF OPERANDS FOUND LD A,B ; IS IT > 2 ? AND 3 CP 3 JP Z,GTOD25 ; YES, SYNTAX ERROR RES 7,B ; CLEAR BRACKETS FLAG LD A,(IX) ; DOES IT START WITH ( ? CP '(' JR NZ,GTOD6 LD A,(IY-1) ; DOES IT END WITH ) ? CP ')' JR NZ,GTOD6 SET 7,B ; SET BRACKETS FLAG IN B INC IX ; AND CLOSE IN POINTERS DEC IY GTOD6: PUSH IX ; GET POINTER TO START OF OPERAND POP HL LD DE,SYMBUF+1 ; SET POINTER TO SYMBUF LD C,0 ; ZERO CHAR COUNT GTOD10: LD A,(HL) ; FETCH A CHAR CALL ALPHA ; IS IT A LETTER? JR NC,GTOD7 LD (DE),A IN CP SPACE JR Z,GETOR6 CP LTERM JR Z,GETOR6 CP ';' JR NZ,GETOR3 ; INVALID SYNTAX GETOR6: EXX ; SET UP PARAMETERS FOR OPTOK LD HL,ORLSTP LD DE,ORTKBF LD C,2 CALL OPTOK ; GET TOKENS FROM LIST EXX JR Z,GETOR3 ; INVALID SYNTAX, NOT IN LIST LD A,(ORTKBF) ;GET THE RESULTING TOKEN. CP PSUTOK ;PSEUDO TOKEN (NO ARGUMENT PROCESSING)? SCF ; JR Z,GTO20 ;YES. GETOR2: OR 0FFH ;RESET CARRY, MAKE NZ. GTO20: LD (LINPNT),HL ; DEPOSIT LINE BUFFER POINTER RET GETOR3: CALL DNOPS ; RESERVE 4 DEFAULT NOP'S CALL ADJARC ; ADJUST ADDRESS REF COUNTER XOR A ; SET ZERO FLAG, NC. RET ;********************************************************************** ;GET OPERAND TOKENS AND VALUES ;LOCATES OPERANDS (IF ANY) AND SETS TOKENS FOR THEM IN ODBT1/ODBT2 ;AND CORRESPONDING INTEGER VALUES (IF ANY) IN ODINT1/ODINT2. ;ZERO FLAG SET IF NOTHING ELSE TO PROCESS ;********************************************************************** GTOD: LD HL,(LINPNT) ; GET LINE BUFFER POINTE C C ; INCR COUNT INC HL ; AND POINTERS INC DE LD A,C CP 3 JR NZ,GTOD10 JR GTOD9 ; MORE THAN 2 LETTERS, GO ; EVALUATE EXPRESSION GTOD7: CP '''' ; NOT LETTER, IS IT '? JR NZ,GTOD8 LD (DE),A ; SAVE IT IN BUFFER INC HL ; POINT TO CHAR FOLLOWING INC C ; INCREMENT COUNT GTOD8: LD A,C ; PUT COUNT IN SYMBUF LD (SYMBUF),A AND A ; IF COUNT=0 THEN JR Z,GTOD9 ; GO TO EVAL EXPRESSION EXX ; GET OPERAND KEYWORD TOKEN LD HL,OPKLST LD DE,TEMP LD C,1 ; 1 BYTE PER TOKEN CALL OPTOK EXX JR Z,GTOD9 ; JUMP IF NO KEYWORD FOUND LD C,A ; SAVE TOKEN IN C CP CTOK ; TOKEN FOR C? JR NZ,GTOD12 LD A,(ORTKBF) BIT 7,A ; IS OPERATOR CONDITIONAL? JR Z,GTOD12 LD C,CCOND ; TOKEN FOR CONDITIONAL 'C' GTOD12: LD A,C ; GET TOKEN AND XYMASK ; IS IT IX/IY ? CP IXORIY JR NZ,GTOD14 LD A,(HL) ; GET FOLLOWING CHAR CP '+' JR Z,GTOD13 CP '-' JR NZ,GTOD14 GTOD13: LD A,C ; CONVERT TOKEN TO DUMMY VALUE AND 0FH OR 0C0H LD ND OF EXPRESSION ;ON EXIT: ; HL CONTAINS VALUE OF EXPRESSION ; AND ZERO FLAG IS SET IF SYNTAX ERROR ;************************************************************************ EVAL: PUSH DE ; SAVE REGISTERS PUSH BC EXX PUSH BC XOR A ; CLEAR ROUTINE FLAG REGISTER LD B,A EXX LD (ARCNT),A ; CLEAR STACKS LD (FCNT),A PUSH IX ; POINT TO START OF EXPR. POP HL EVAL1: PUSH IY ; END OF EXPRESSION? POP DE ; I.E. HL=IY ? EX DE,HL AND A ; CLEAR CARRY SBC HL,DE EX DE,HL JP Z,EOEX ; END OF EXPRESSION JP C,EVAL6 ; END OF EXPRESSION ERROR LD A,(HL) ; GET A CHAR CALL DIGIT ; IS IT A DIGIT? JR C,LIT ; YES, GO PROCESS LITERAL CALL ALPHA ; IS IT A LETTER? JR C,SYMB ; YES, GO PROCESS SYMBOL CP '.' ; IS IT A '.'? JR Z,MCF ; YES, GO PROCESS M/CHAR FUNCTION CP '''' ; IS IT A '? JR Z,ASC ; YES, GO PROC. ASCII CHAR CP '[' | JR Z,XBK10 ;USE []S, TOO. CP '(' ; IS IT A '('? XBK10: JP Z,LBKT ; YES, GO PROC. LEFT BRKT CP ']' | JR Z,XBK20 C,A PUSH HL ; CLOSE POINTER IN TO START OF EXPRESS POP IX CALL EVAL ; GET VALUE OF EXPRESSION IN HL JR Z,GTOD25 ; SYNTAX ERROR BIT 0,B ; FOUND 1 OPERAND? JR Z,GTOD15 LD (ODINT1),HL ; SAVE VALUE IN 1ST OPERAND BUFFER JR GTOD11 GTOD15: LD (ODINT2),HL ; SAVE VALUE IN 2ND OPND BUFF JR GTOD11 GTOD14: PUSH IY ; END OF OPERAND? POP DE AND A ; CLEAR CARRY FLAG SBC HL,DE JR NZ,GTOD25 ; SYNTAX ERROR JR GTOD11 GTOD9: CALL EVAL ; EVALUATE EXPRESSION ; RESULT IN HL JR Z,GTOD25 ; SYNTAX ERROR BIT 0,B ; FOUND 1 OPERAND? JR Z,GTOD17 LD (ODINT1),HL ; SAVE VALUE IN FIRST OPERAND BUFFER JR GTOD16 GTOD17: LD (ODINT2),HL ; SAVE VALUE IN 2ND OPND BUFF GTOD16: LD C,INTTOK ; SET TOKEN FOR 'INTEGER' GTOD11: BIT 7,B ; WAS IT IN BRACKETS? JR Z,GTOD21 ; NO LD HL,BKLST ; YES, CHECK IF VALID, POINT TO LIST GTOD20: LD A,(HL) ; GET A TOKEN INC HL ; POINT TO REPLACEMENT TOKEN AND A ; IS TOKEN 0 ? JR Z,GTOD25 ; YES, NOT IN LIST, SYN. ERR. CP C ;  CP ')' ; IS IT ')'? XBK20: JP Z,RBKT ; YES, GO PROC. R.H. BRKT CP '$' ; IS IT '$'? JR Z,CURLC ; YES, GO PROC. CURR. LOC. SCHF: CALL PSCF ; PROCESS AS SINGLE CHAR. FUNCTION JP Z,EVAL3 ; INVALID CHAR ERROR JR FUN LIT: CALL PLIT ; PROCESS AS LITERAL JR OPND SYMB: CALL PSYMB JR OPND ASC: CALL PASC ; PROCESS OS ASCII STRING JR OPND CURLC: LD DE,(ADREFC) ; CURRENT VALUE OF ADDR REF ; COUNTER REQUIRED INC HL ; POINT TO NEXT EXPR CHAR JR OPND1 OPND: JP C,EVAL4 ; 'VALUE' ERROR OPND1: CALL PUDE ; PUSH VALUE (IN DE) ONTO ; ARITHMETIC STACK JP Z,EVAL5 ; STACK OVERFLOW ERROR EXX ; SET 'LAST UNIT' FLAG SET 0,B EXX JR EVAL1 MCF: CALL PMCF JP Z,EVAL6 ; SYNTAX ERROR FUN: LD A,(FTOKR) ; GET FUNCTION TOKEN CP PLUTOK ; IS IT TOKEN FOR +? JR Z,FUN1 CP MINTOK ; IS IT TOKEN FOR -? JR NZ,FUN2 ; +/- FUN1: EXX ; WAS LAST UNIT START/(/FUNCTION ? BIT 0,B EXX JR Z,FUN3 ADD A,5DH ; CHANGE TOKEN TO DIADIC LD (FTOKR),A JIS IT EQUAL TO ACTUAL TOKEN? JR Z,GTOD19 ; YES, GO REPLACE IT INC HL ; POINT TO NEXT TOKEN JR GTOD20 GTOD19: LD C,(HL) ; REPLACE TOKEN WITH ; BRACKETTED VERSION. INC IY ; OPEN OUR FINAL POINTER AGAIN GTOD21: LD A,C ; SAVE TOKEN IN RELEVANT BUFFER BIT 0,B ; FOUND 1 OPERAND? JR Z,GTOD22 LD (ODBT1),A ; SAVE TOKEN IN 1ST OPND BUFF JR GTOD23 GTOD22: LD (ODBT2),A ; SAVE TOKEN IN 2ND OPND BUFF GTOD23: PUSH IY ; POINT AT NEXT THING POP HL JP GTOD1 ; GO PROCESS NEXT TOKEN GTOD24: XOR A ; CLEAR ZERO FLAG INC A GTOD26: RET GTOD25: CALL DNOPS ; APPEND DEFAULT NOP'S CALL ADJARC ; ADJUST ADDRESS REF COUNTER XOR A JR GTOD26 CHAIN 'Z80B' ;END OF Z80A.Z80  LIST TITLE 'Z80B.Z80 2/9/84A' ;EXPRESSION EVALUATION. NLIST ;************************************************************************ ;EVALUATE AN EXPRESSION ;ON ENTRY AND EXIT: ; IX POINTS AT FIRST CHAR OF EXPRESSION ; IY POINTS AT CHAR AFTER E R FUN3 FUN2: CP 3DH ; DIADIC FUNCTION JR C,FUN3 EXX ; WAS LAST UNIT START/(/FUNCTION? BIT 0,B EXX JP Z,EVAL6 ; SYNTAX ERROR FUN3: CALL POFU ; GET PREVIOUS FUNCTION JR Z,FUN4 ; NO PREVIOUS FUN, PUSH NEW ONE LD E,A ; SAVE TOP OF STACK IN E LD A,(FTOKR) ; GET NEW FUNCTION TOKEN AND 7 ; MASK OFF PRIORITY BITS IN NEW OPR LD B,A ; SAVE IN B LD A,E AND 7 ; MASK OFF PRIORITY BITS OF TOS CP B ; COMPARE PRIORITIES JR NC,FUN5 ; GO DO A FUNCTION ; NEW FUNCTION HAS HIGHER ; PRIORITY SO PUSH IT ON ; STACK. LD A,E ; FIRST PUSH BACK TOP OF STACK CALL PUFU FUN4: LD A,(FTOKR) ; THEN PUSH NEW FUNCTION CALL PUFU JR Z,EVAL5 ; STACK OVERFLOW ERROR EXX ; CLEAR 'LAST UNIT' FLAG RES 0,B EXX JP EVAL1 FUN5: LD A,E ; PUT T O S IN ACC CALL FUNC ; PERFORM A FUNCTION JR Z,EVAL6 ; SYNTAX ERROR JR FUN3 ; GO TRY NEXT FUNCTION ON STACK ;.................................................. LBKT: INC HL ; POINT TO NEXT EXPR CHAR ? JR NC,PLIT2 INC HL ; YES, POINT TO NEXT CHAR JR PLIT1 PLIT2: DEC HL ; NO, GO BACK TO LAST CHAR LD A,(HL) ; FETCH IT TO ACC. POP HL ; REPLACE POINTER TO START OF LIT. CP 'B' ; WAS FINAL CHAR 'B' JR Z,PBIN ; BINARY LITERAL CP 'D' ; 'D'? JR Z,PDEC ; DECIMAL LITERAL CP 'H' ; 'H'? JP Z,PHEX ; HEX LITERAL CP 'O' ; 'O'? JR Z,POCT ; OCTAL LITERAL CP 'Q' ; 'Q'? JR Z,POCT ; OCTAL LITERAL JR PDEC ; DECIMAL LITERAL ;********************************************************************** ;PROCESS BINARY LITERAL. ;********************************************************************** PBIN: PUSH BC ; SAVE REGISTERS LD DE,0 ; CLEAR 16 BIT ACC. PBIN1: LD A,(HL) ; GET CHAR CALL HEXDG ; VALID IN A LITERAL? JR NC,PBIN2 CP '1'+1 ; VALID IN BINARY LIT.? JR NC,PBIN2 SUB '0' ; CONVERT ASCII TO BINARY LD C,A CALL SHLDE ; SHIFT DE LEFT CALL ADCDE ; & ADD NEW DIG. TO DE INC HL ; INCREMENT POINTER TO NEXT CHAR. JR PBIN1 PBINLD A,LBTOK ; SET TOKEN FOR '(' CALL PUFU ; PUSH ON FUNCTION STACK JR Z,EVAL5 ; STACK OVERFLOW ERROR EXX ; CLEAR 'LAST UNIT' FLAG RES 0,B EXX JP EVAL1 ;.................................................. RBKT: INC HL RBKT2: CALL POFU ; POP FUNCTION STACK JR Z,EVAL7 ; EMPTY, BALANCE ERROR CP LBTOK ; IS IT A (? JR Z,RBKT1 CALL FUNC ; PERFORM THE FUNCTION JR Z,EVAL6 ; SYNTAX ERROR JR RBKT2 ; MORE OPS TO DO ? RBKT1: EXX ; SET 'LAST UNIT' FLAG SET 0,B EXX JP EVAL1 ;................................................. ; END OF EXPRESSION EOEX: CALL POFU ; POP FUNCTION STACK JR Z,EOEX1 ; NO MORE FUNCTIONS CP LBTOK JR Z,EVAL7 ; BALANCE ERROR CALL FUNC ; PERFORM THE FUNCTION JR Z,EVAL6 ; SYNTAX ERROR JR EOEX EOEX1: CALL PODE ; GET EXPR VALUE IN DE JR Z,EVAL6 ; SYNTAX ERROR (STACK EMPTY) LD A,(ARCNT) ; CHECK IF STACK NOW EMPTY AND A JR NZ,EVAL6 ; SYNTAX ERROR EX DE,HL EXX BIT 1,B ; TEST FOR ARITH OVERFLOW EXX 2: CP 'B' ; CHAR NOT BIN. DIG.. IS IT 'B'? JR NZ,PBIN4 INC HL ; YES, POINT TO NEXT CHAR LD A,(HL) ; GET IT IN ACC CALL HEXDG ; VALID CHAR FOR A LIT.? PBIN3: POP BC RET PBIN4: SCF ; SET CARRY FOR ERROR JR PBIN3 ;********************************************************************** ;PROCESS OCTAL LITERAL ;********************************************************************** POCT: PUSH BC LD DE,0 ; CLEAR 16 BIT ACC. POCT1: LD A,(HL) ; GET CHAR CALL HEXDG ; VALID IN LITERAL? JR NC,POCT3 CP '7'+1 ; VALID IN OCTAL LIT.? JR NC,POCT3 SUB '0' ; CONVERT ASCII TO BINARY LD C,A LD B,3 ; SHIFT DE LEFT 3 TIMES POCT2: CALL SHLDE DEC B ; DONE 3 SHIFTS YET? JR NZ,POCT2 CALL ADCDE ; ADD NEW DIGIT TO DE INC HL ; INCR POINTER TO NEXT CHAR JR POCT1 POCT3: CP 'O' ; CHAR NOT OCT DIG. IS IT 'O'? JR Z,POCT4 CP 'Q' ; IS IT 'Q'? JR NZ,POCT6 POCT4: INC HL ; YES, POINT TO NEXT CHAR LD A,(HL) ; GET IT IN ACC CALL HEXDG ; VALID CHAR IN A LITJR Z,EOEX2 LD C,'A' EOEX4: CALL ERROR ; INDICATE ARITH OVERFLOW EOEX2: XOR A ; CLEAR ZERO FLAG INC A EOEX3: EXX POP BC EXX POP BC POP DE RET EVAL3: LD C,'I' JR EVAL8 EVAL4: LD C,'V' ; VALUE ERROR LD HL,0 ; SET RESULT=0 JR EOEX4 ; NOT FATAL EVAL5: LD C,'O' ; STACK OVERFLOW ERROR JR EVAL8 EVAL6: LD C,'S' ; SYNTAX ERROR JR EVAL8 EVAL7: LD C,'B' ; BALANCE ERROR EVAL8: CALL ERROR ; SET ERROR INDICATOR XOR A ; SET ZERO (ERROR) FLAG JR EOEX3 ; AND PREPARE TO EXIT ;********************************************************************** ;PROCESS LITERAL. ;THIS SUBROUTINE INCLUDES PBIN, PDEC, ;PHEX, POCT. ;ON ENTRY: ; HL POINTS TO FIRST CHAR OF LITERAL ;ON EXIT: ; HL POINTS TO CHAR AFTER LITERAL ; DE CONTAINS VALUE OF LITERAL ; CARRY FLAG IS SET FOR VALUE ERROR ;********************************************************************** PLIT: PUSH HL ; SAVE POINTER TO START OF LIT. PLIT1: LD A,(HL) ; GET CHAR CALL HEXDG ; IS IT VALID DIG FOR LIT. .? POCT5: POP BC RET POCT6: SCF ; SET CARRY FOR ERROR JR POCT5 ;********************************************************************* ;PROCESS DECIMAL LITERAL. ;********************************************************************* PDEC: PUSH BC LD DE,0 ; CLEAR 16 BIT ACC. PDEC1: LD A,(HL) ; GET CHAR CALL HEXDG ; VALID IN A LIT.? JR NC,PDEC2 CP '9'+1 ; VALID IN A DEC. LIT.? JR NC,PDEC2 SUB '0' ; CONVERT ASCII TO BINARY LD C,A LD B,0 PUSH BC LD B,D LD C,E CALL SHLDE ; DE X 2 CALL SHLDE ; DE X 4 CALL ADCDE ; DE X 5 CALL SHLDE ; DE X 10 POP BC ; RECOVER NEW DIGIT CALL ABCDE ; ADD IN NEW DIGIT INC HL ; POINT TO NEXT CHAR JR PDEC1 PDEC2: CP 'D' JR NZ,PDEC3 INC HL LD A,(HL) ; GET IT IN ACC PDEC3: CALL HEXDG POP BC RET ;******************************************************************* ;PROCESS HEXADECIMAL LITERAL. ;******************************************************************* PHEX: PUSH BC LD DE,0 ; CLEAR 16 BIT ATION ;********************************************************************* ADCDE: PUSH BC EX DE,HL LD B,0 ADD HL,BC EX DE,HL POP BC RET ;********************************************************************* ;PROCESS SYMBOL. ;GET SYMBOL AND FETCH ITS VALUE FROM THE SYMBOL TABLE. RETURN VALUE ;IN DE. ;******************************************************************** PSYMB: PUSH BC ; SAVE REGISTERS LD DE,SYMBUF ; SET PNTR TO SYMBOL BUFFER CALL GSYM ; GET SYMB FROM LINE TO SYMBUF PUSH HL ; SAVE PNTR TO CHAR AFTER SYMB CALL LOCATE ; FIND SYMB IN SYMTAB JR NZ,PSYMB1 ; NOT IN TABLE? LD E,(HL) ; MOVE VALUE TO DE INC HL LD D,(HL) JR PSYMB2 PSYMB1: LD C,'U' ; INDICATE 'UNDEFINED' ERROR CALL ERROR LD DE,0 ; SET DE=0 DEFAULT VALUE PSYMB2: POP HL ; REPLACE REGISTERS POP BC AND A ; CLEAR CARRY FLAG SO RET ; AS NOT TO INDICATE 'VALUE' ERROR ;********************************************************************* ;PROCESS ASCII LITERAL. ;RETURN VACC. PHEX1: LD A,(HL) ; GET CHAR CALL HEXDG ; VALID IN A LITERAL? JR NC,PHEX4 CP 'F'+1 ; VALID IN A HEX LIT.? JR NC,PHEX4 SUB '0' ; CONVERT ASCII TO BINARY CP 10D JR C,PHEX2 SUB 'A'-'0'-10D PHEX2: LD C,A LD B,4 ; SHIFT DE LEFT 4 TIMES PHEX3: CALL SHLDE DEC B ; DONE4 SHIFTS YET? JR NZ,PHEX3 CALL ADCDE ; ADD NEW DIGIT TO DE INC HL ; INCREMENT POINTER TO NEXT CHAR JR PHEX1 PHEX4: CP 'H' ; CHAR NOT HEX. IS IT 'H'? JR NZ,PHEX6 ; NO INC HL ; YES, POINT TO NEXT CAR LD A,(HL) ; GET IT IN ACC CALL HEXDG ; VALID CHAR FOR A LIT.? PHEX5: POP BC RET PHEX6: SCF ; SET CARRY FOR ERROR JR PHEX5 ;******************************************************************* ;HEXDG. IS CHAR IN ACC VALID IN A LITERAL. ;CARRY SET IF HEX DIGIT OR H/O/Q. ;******************************************************************* HEXDG: CALL DIGIT ; CARRY SET IF 0-9 RET C CP 'A' JR C,HEXDG1 CP 'F'+1 RET C CP 'H' JR Z,HEXDG2 CP 'O' JR Z,HEXDG2 CP 'Q' ALUE OF 1 OR 2 ASCII CHARACTERS. ;ON ENTRY: ; HL POINTS TO START QUOTE ;ON EXIT: ; HL POINTS TO CHAR AFTER CLOSE QUOTE ; DE CONTAINS VALUE ; CARRY FLAG SET IF ERROR ;*********************************************************************** PASC: LD DE,0 ; CLEAR 16 BIT ACC. DE INC HL ; POINT TO CHAR AFTER QUOTE CALL DOUBQ ; IS NEXT CHAR CLOSING QUOTE? JR NZ,PASC2 ; JUMP IF SO LD E,(HL) ; OTHERWISE SAVE CHAR IN E INC HL ; POINT TO NEXT CHAR CALL DOUBQ ; NEXT CHAR CLOSE QUOTE? JR NZ,PASC2 ; JUMP IF SO LD D,(HL) ; OTHERWISE SAVE IN D INC HL ; POINT TO NEXT CHAR CALL DOUBQ ; NEXT CHAR CLOSE QUOTE? JR NZ,PASC2 ; JUMP IF SO PASC1: SCF ; ERROR, SET CARRY RET PASC2: AND A ; NO ERROR, CLEAR CARRY RET ;...................................................... ;DOUBLE QUOTE. ;IS NEXT ITEM IN STRING A CHARACTER OF THE END OF THE ASCII ;LITERAL? ON ENTRY: HL POINTS AT THE NEXT ITEM, ON EXIT: HL ;HAS BEEN INCREMENTED IF DOUBLE  JR Z,HEXDG2 HEXDG1: AND A ; NOT HEX DIG., CLEAR CARRY RET HEXDG2: SCF ; HEX DIGIT, SET CARRY RET ;********************************************************************* ;SHIFT DE LEFT 1 BIT - ENTER 0 FROM RIGHT. ;SET 'VALUE' ERROR IF OVERFLOW. ;********************************************************************* SHLDE: EX DE,HL ; DO SHIFT BY ADDITION IN HL ADD HL,HL EX DE,HL RET NC ; NO CARRY, SO RETURN PUSH BC ; CARRY, SO INDICATE 'V' ERROR LD C,'V' CALL ERROR POP BC RET ;********************************************************************* ;ADD BC TO DE - SET 'VALUE' ERROR IF OVERFLOW. ;********************************************************************* ABCDE: PUSH BC EX DE,HL ; DO ADDITION IN HL ADD HL,BC ; DO ADDITION EX DE,HL ; GET RESULT BACK TO DE JR NC,ABCDE1 LD C,'V' ; CARRYOUT SO INDICATE 'V' ERROR CALL ERROR ABCDE1: POP BC RET ;********************************************************************* ;ADD C TO DE - NO OVERFLOW INDIC QUOTE. ZERO SET IF CHAR. ;...................................................... DOUBQ: LD A,(HL) ; GET CHAR CP '''' ; IS IT A QUOTE? JR NZ,DOUBQ1 ; JUMP IF NOT INC HL ; POINT TO NEXT CHAR LD A,(HL) ; GET IT CP '''' ; IS IT A QUOTE? RET ; ZERO SET FOR CHAR ; CLEARED IF LAST QUOTE WAS ; CLOSE QUOTE. DOUBQ1: XOR A ; LIT CHAR. SET ZERO. RET ;******************************************************************** ;PROCESS MULTI-CHAR FUNCTION. ;ON ENTRY: ; HL POINTS TO FIRST CHAR OF FUNCTION STRING ;ON EXIT: ; HL POINTS TO CHAR AFTER FUNCTION STRING ; FTOKR CONTAINS TOKEN FOR FUNCTION ; ZERO FLAG SET FOR ERROR ;******************************************************************** PMCF: PUSH BC ; SAVE REGISTERS PUSH DE INC HL ; POINT TO CHAR AFTER '.' LD A,(HL) ; GET IT CALL ALPHA ; IS IT A LETTER? JR NC,PMCF1 ; NO, SYNTAX ERROR LD DE,SYMBUF ; SET POINTER TO SYMBUF CALL GSYM ; GET FUNCTION IN SYMBUF INC HL ; INCR PNTR PUSH HL ; AN ; LOAD START OF STACK ADDR LD A,(FCNT) ; GET STACK COUNTER CP MAXFSK ; IS STACK FULL? JR NC,PUFU2 LD C,A ; COMPUTE TOP OF STACK LD B,0 ADD HL,BC ; TOP OF STACK IN HL INC A ; INCREMENT STACK COUNTER LD (FCNT),A ; AND STORE NEW VALUE EX AF,AF' ; GET FUNCTION BACK LD (HL),A ; PUSH ONTO FUNCTION STACK XOR A ; CLEAR ZERO FLAG INC A PUFU1: POP BC ; REPLACE REGISTERS POP HL RET PUFU2: XOR A ; SET ZERO FLAG (STACK FULL) JR PUFU1 ;*********************************************************************** ;POP FROM FUNCTION STACK TO ACC ;THE TOP BYTE ON THE FUNCTION STACK IS ;POPPED INTO THE A REG. IF THE STACK WAS ;ALREADY EMPTY, THE ZERO FLAG IS SET ON ;EXIT ;*********************************************************************** POFU: PUSH HL ; SAVE REGS. PUSH BC LD HL,FSTK ; LOAD START OF STACK ADDR LD A,(FCNT) ; GET STACK COUNTER AND A ; TEST FOR EMPTY STACK JR Z,POFU1 DEC A LD (FCNT),A LD C,A LD B,0 ADD HL,BC XOR A ; CLEAR ZED SAVE IT ON STACK CP '.' ; WAS CHAR AFT. FUN. '.'? JR NZ,PMCF2 ; JUMP IF NOT LD A,(SYMBUF) ; GET NO OF CHARS CP 5 ; MORE THAN 4? JR NC,PMCF2 ; JUMP IF SO LD DE,FTOKR ; PNTR TO TOKEN REG. LD HL,MFLSTP ; PNTR TO OPR LIST LD C,1 ; 1 TOKEN/ENTRY IN LIST CALL OPTOK ; GET TOKEN JR PMCF3 PMCF1: XOR A ; SET ZERO TO INDICATE ERR. JR PMCF4 PMCF2: XOR A ; SET ZERO TO INDICATE ERROR PMCF3: POP HL PMCF4: POP DE POP BC RET ;*********************************************************************** ;PROCESS SINGLE CHAR FUNCTION. ;ON ENTRY: ; HL POINTS AT FUNCTION CHAR ;ON EXIT: ; HL POINTS TO CHAR AFTER FUNCTION CHAR(S) ; FTOKR CONTAINS TOKEN FOR FUNCTION ; ZERO FLAG SET IF ERROR ;*********************************************************************** PSCF: PUSH BC ; SAVE REGISTERS PUSH DE LD B,(HL) ; GET POTENTIAL FUNCTION INC HL ; & INCR PNTR LD DE,SCF1 ; SET UP POINTER TO LIST PSCF1: LD A,(DE) ; GET LIST ENTRY AND A ; IS IT ZERO? JR Z,PSCF3 RO FLAG INC A LD A,(HL) ; GET STACK TOP TO ACC POFU1: POP BC ; REPLACE REGS. POP HL RET ;*********************************************************************** ;PUSH FROM DE TO ARITHMETIC STACK ;THE WORD IN DE IS PUSHED ONTO THE ;ARITHMETIC STACK. IF NOT POSSIBLE ;OWING TO THE STACK BEING FULL, THEN ;THE ZERO FLAG IS SET ON EXIT. ;*********************************************************************** PUDE: PUSH HL ; SAVE REGS. PUSH BC LD HL,ARSTK ; LOAD START OF STACK ADDR LD A,(ARCNT) ; GET STACK COUNTER CP MAXASK ; IS STACK FULL? JR NC,PUDE2 LD C,A ; COMPUTE TOP OF STACK LD B,0 ADD HL,BC ; TOP OF STACK IN HL ADD A,2 ; INCREMENT COUNTER BY 1 WORD LD (ARCNT),A ; STORE NEW VALUE OF COUNTER LD (HL),E ; PUSH DE ONTO STACK INC HL LD (HL),D XOR A ; CLEAR ZERO FLAG INC A PUDE1: POP BC POP HL RET PUDE2: XOR A ; SET ZERO FLAG (ERROR) JR PUDE1 ;********************************************************************** ;POP FROM ARITHM ; END OF LIST, INVAL. CHAR CP B ; MATCH? INC DE ; INCR. PNTR. TO TOKEN JR Z,PSCF2 ; JUMP IF MATCH INC DE ; OTHERWISE POINT TO NEXT ENTRY JR PSCF1 ; LOOP PSCF2: LD A,(DE) ; GET THE TOKEN LD (FTOKR),A ; & PUT IN TOKEN REG. CP ASKTOK ; IS IT * ?(MAYBE **) JR NZ,PSCF4 ; JUMP IF NOT LD A,(HL) ; GET NEXT CHAR CP '*' ; IS IT '*'? JR NZ,PSCF4 ; JUMP IF NOT LD A,EXPTOK ; PUT TOKEN FOR ** IN REG LD (FTOKR),A INC HL ; AND INCR PNTR AND A ; CLEAR ZERO FLAG JR PSCF4 PSCF3: XOR A ; SET ZERO TO INDICATE ERROR PSCF4: POP DE ; REPLACE REGS POP BC RET ;*********************************************************************** ;PUSH ACC TO FUNCTION STACK. ;BYTE IN A IS PUSHED ONTO THE FUNCTION ;STACK (FSTK). IF NOT POSSIBLE OWING TO ;THE STACK BEING FULL, THEN THE ZERO FLAG ;IS SET ON EXIT. ;*********************************************************************** PUFU: PUSH HL ; SAVE REGISTERS PUSH BC EX AF,AF' ; SAVE FUNCTION LD HL,FSTK ETIC STACK TO DE ;THE TOP WORD ON THE ARITHMETIC STACK ;IS POPPED INTO THE DE REG PAIR. IF ;THE STACK WAS EMPTY, THEN THE ZERO ;FLAG IS SET ON EXIT ;********************************************************************** PODE: PUSH HL ; SAVE REGS PUSH BC LD HL,ARSTK ; LOAD START OF STACK ADDR LD A,(ARCNT) ; GET STACK COUNTER AND A ; IS STACK EMPTY? JR Z,PODE1 SUB 2 ; DECR STACK COUNTER LD (ARCNT),A ; AND SAVE NEW VALUE LD C,A ; COMPUTE TOP OF STACK LD B,0 ADD HL,BC LD E,(HL) ; POP STACK TO DE INC HL LD D,(HL) XOR A ; CLEAR ZERO FLAG INC A PODE1: POP BC ; REPLACE REGS POP HL RET ;********************************************************************* ;PERFORM A FUNCTION ;ON ENTRY: ; A CONTAINS THE COMBINED FUNCTION ; TOKEN/PRIORITY VALUE. ;ON EXIT: ; THE REQUIRED ASSEMBLY TIME FUNCTION ; HAS BEEN PERFORMED USING VALUE(S) ; ON THE ARITHMETIC STACK AND LEAVING ; THE RESULT THERE. ; IF THE STACK DID NOT CONTAIN ENOUGH ; VALUES THEN THE ZERO RET ;************************************************************** ;FUNCTION NOT ;************************************************************** FNOT: PUSH DE ; SAVE REG. CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FNOT1 ; JUMP IF EMPTY LD A,D ; COMPLEMENT DE CPL LD D,A LD A,E CPL LD E,A CALL PUDE ; PUSH BACK ON ARITH STACK FNOT1: POP DE ; REPLACE REG. RET ;************************************************************** ;FUNCTION HIGH. ;RETURNS HIGH BYTE OF ARGUMENT AS RESULT. ;************************************************************** FHIGH: PUSH DE ; SAVE REGISTERS CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FHIGH1 ; ERROR IF EMPTY LD E,D ; PUT HIGH BYTE IN DE LD D,0 CALL PUDE ; PUSH RESULT ON ARITH STACK FHIGH1: POP DE RET ;************************************************************** ;FUNCTION LOW. ;RETURNS LOW BYTE OF ARGUMENT AS RESULT. ;************************************************************** FLOW: PUSH DE ; SAVE REGIST FLAG IS SET. ; ;THE FOLLOWING SUBROUTINES STARTING WITH ;THE LETTER F ARE ALL ASSEMBLY TIME ;ARITHMETIC/LOGIC FUNCTIONS, OPERATING ON ;THE ARITHMETIC STACK, AND BEING CALLED ;INDIRECTLY BY FUNC ;******************************************************************** FUNC: PUSH HL ; SAVE REGS. PUSH DE PUSH BC SRL A ; GET (FUNC TOKEN)*2 SRL A AND 0FEH LD C,A ; COMPUTE POINTER TO SUBROUTINE LD B,0 ; START ADDR POINTER LD HL,FUNLST ADD HL,BC LD E,(HL) ; PUT SUBR START ADDR IN HL INC HL LD D,(HL) EX DE,HL LD DE,FUNC1 ; CALL RELEVANT FUNCTION INDIRECTLY PUSH DE JP (HL) FUNC1: POP BC POP DE POP HL RET ;............................................................. ;FUNCTION LIST. ;CONTAINS POINTERS TO THE FUNCTION ;SUBROUTINES, USED BY SUBR 'FUNC' ;FOR AN INDIRECT SUBR CALL BASED ON ;THE VALUE OF THE ARITHMETIC ;FUNCTION TOKEN. ;............................................................. FUNLST: DEFW FMNPL DEFW FMNMN DEFW FNOT DEFW FHIGH DEFWERS CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FLOW1 ; ERROR IF EMPTY LD D,0 ; LOW BYTE ONLY REQD CALL PUDE ; PUSH BACK RESULT FLOW1: POP DE ; REPLACE REGS RET ;*************************************************************** ;FNCTION RESULT ;CLEARS ARITHMETIC OVERFLOW FLAG ;*************************************************************** FRES: EXX ; CLEAR OVERFLOW FLAG RES 1,B ; BIT 1 IN REG B EXX RET ;*************************************************************** ;FUNCTION EXPONENTIATE ;*************************************************************** FEXP: PUSH HL ; SAVE REGS PUSH DE CALL PODE ; GET EXPONENT FROM STACK JR Z,FEXP5 ; JMP IF ARITH STACK EMPTY EX DE,HL ; PUT EXPONENT IN HL CALL PODE ; GET OTHER NUMBER IN DE JR Z,FEXP5 ; JUMP IF STACK EMPTY LD A,H ; EXPONENT ZERO? OR L JR NZ,FEXP1 ; JUMP IF NOT LD DE,1 ; RESULT = 1 CALL PUDE ; PUSH IT ON STACK JR FEXP5 FEXP1: BIT 7,H ; EXPONENT NEGATIVE? JR Z,FEXP2 ; JUMP I FLOW DEFW FRES DEFW FEXP DEFW FMULT DEFW FDIV DEFW FMOD DEFW FSHR DEFW FSHL DEFW FDIPL DEFW FDIMN DEFW FAND DEFW FOR DEFW FXOR DEFW FEQ DEFW FGT DEFW FLT DEFW FUGT DEFW FULT ;************************************************************** ;FUNCTION MONADIC PLUS. ;************************************************************** FMNPL: PUSH DE ; SAVE REG CALL PODE ; SEE IF VALUE AVAILABLE ON STACK JR Z,FMNPL1 ; JUMP IF NOT (ZERO SET) CALL PUDE ; PUSH BACK ON STACK FMNPL1: POP DE ; REPLACE REG RET ;************************************************************** ;FUNCTION MONADIC MINUS. ;************************************************************** FMNMN: PUSH DE ; SAVE REGS. PUSH HL CALL PODE ; GET VALUE OFF ARITH STACK JR Z,FMNMN1 ; JUMP IF EMPTY LD HL,0 ; PUT 0 INTO HL AND A ; CLEAR CARRY SBC HL,DE ; SUBTRACT VALUE FROM 0 EX DE,HL ; GET RESULT IN DE CALL PUDE ; PUSH BACK ON STACK FMNMN1: POP HL ; REPLACE REGS. POP DE F NOT LD DE,0 ; RESULT = 0 CALL PUDE ; PUSH IT ON STACK JR FEXP5 FEXP2: CALL PUDE ; PUSH THE NUMBER FEXP3: DEC HL ; DECR EXPONENT LD A,H ; IS IT ZERO NOW? OR L JR Z,FEXP4 ; JUMP IF SO CALL PUDE ; PUSH THE NUMBER CALL FMULT ; & MULTIPLY JR FEXP3 ; LOOP FEXP4: XOR A ; CLEAR ZERO FLAG INC A FEXP5: POP DE ; REPLACE REGISTERS POP HL RET ; ******************************************************************* ; FUNCTION MULTIPLY ; ******************************************************************* FMULT: PUSH HL ; SAVE REGISTERS PUSH DE PUSH BC EXX PUSH DE LD E,0 ; CLEAR E' (SIGN FLAG) EXX CALL PODE ; GET A VALUE FROM ARITH STACK JR Z,FMULT6 ; JUMP IF EMPTY BIT 7,D ; IS IT NEGATIVE? CALL NZ,NEGDE ; IF SO, NEGATE, AND COMPLEMENT ; SIGN FLAG EX DE,HL CALL PODE ; GET ANOTHER VALUE FROM STACK JR Z,FMULT6 ; JUMP IF EMPTY BIT 7,D ; IS IT -VE CALL NZ,NEGDE ; IF SO, NEGATE, AND COMPL. ; SIGN FLAG AND A ; CL************************************************** ;DIVIDE ;THIS SUBROUTINE IS USED BY FDIV AND FMOD ;IT DIVIDES DE BY HL, LEAVING THE QUOTIENT ;IN DE AND THE REMAINDER IN HL. ;SIGNED 16 BIT ARITHMETIC IS USED. ;********************************************************************** DIV: PUSH BC ; SAVE REGISTERS EXX PUSH DE LD DE,0 ; CLEAR DE' (D'=PLACE COUNT) ; (E'=SIGN COUNT) EXX BIT 7,D ; IS DIVIDEND -VE? JR Z,DIV1 ; JUMP IF NOT EXX ; OTHERWISE FLAG IN E', BIT 7 SET 7,E ; TO GIVE SIGN OF REMAINDER EXX DIV1: BIT 7,D ; IS DIVIDEND -VE? CALL NZ,NEGDE ; IF SO NEGATE, AND INCR ; QUOTIENT SIGN BIT (E' BIT 0) EX DE,HL ; SWAP NOS. BIT 7,D ; IS DIVISOR -VE? CALL NZ,NEGDE ; IF SO NEGATE AND ; INCR QUOTIENT SIGN FLAG LD A,D ; IS DIVISOR ZERO? OR E JR NZ,DIV2 ; JUMP IF NOT LD C,'Z' ; FLAG 'DIV BY ZERO' ERROR CALL ERROR LD HL,0 ; RETURN ZERO RESULTS LD DE,0 JR DIV6 ; GO TO END DIV2: EXX ; INCR PLACE COUNT INC EAR CARRY SBC HL,DE ; TEST FOR LARGER NO. ADD HL,DE ; MULTIPLIER SHOULD BE SMALLER JR NC,FMULT1 ; JUMP IF CORRECT EX DE,HL ; OTHERWISE SWAP NOS. FMULT1: LD B,H ; PUT MULTIPLICAND IN BC LD C,L LD HL,0 ; CLEAR HL FOR ACCUMALATOR FMULT2: LD A,D ; IS MULTIPLIER 0? OR E JR Z,FMULT5 ; JUMP IF FINISHED SRL D ; SHIFT DE RIGHT INTO CARRY RR E JR NC,FMULT4 ; JUMP IF ZERO CARRY AND A ; CLEAR CARRY ADC HL,BC ; ADD MULTIPLICAND TO RUNNING TOTAL JP M,FMULT3 ; JUMP IF OVERFLOW TO BIT 15 JR NC,FMULT4 ; JUMP IF NO O/F TO BIT 16 FMULT3: EXX ; SET OVERFLOW FLAG SET 1,B EXX FMULT4: SLA C ; SHIFT MULTIPLICAND LEFT RL B JR FMULT2 ; LOOP FMULT5: EX DE,HL ; GET RESULT BACK IN DE EXX ; SHOULD RESULT BE -VE? BIT 0,E ; (PRODUCT SIGN IN E') EXX CALL NZ,NEGDE CALL PUDE ; PUSH PRODUCT ONTO ARITH STACK FMULT6: EXX ; REPLACE REGS. POP DE EXX POP BC POP DE POP HL RET ;*******************************************************************D EXX SLA E ; SHIFT DIVISOR LEFT UNTIL SIGN RL D ; SET, COUNTING NO. OF PLACES JP P,DIV2 LD BC,0 ; CLEAR QUOTIENT REG BC DIV3: SLA C ; SHIFT QUOTIENT LEFT RL B SRL D RR E AND A ; CLEAR CARRY SBC HL,DE ; SUBTRACT DIVISOR FROM DIVIDEND JR C,DIV4 ; JUMP IF TOO MUCH SUBTRACTION INC BC ; OTHERWISE INCR QUOTIENT JR DIV5 DIV4: ADD HL,DE ; REPLACE EXCESSIVE SUBTRACTION DIV5: EXX ; DECR PLACE COUNT DEC D EXX JR NZ,DIV3 ; LOOP IF NOT FINISHED LD D,B ; TRANSFER QUOTIENT TO DE LD E,C EX DE,HL ; SWAP WITH REMAINDER EXX ; GET SIGN FLAGS INTO C LD A,E EXX LD C,A BIT 7,C ; WAS DIVIDEND -VE? CALL NZ,NEGDE ; NEGATE REMAINDER IF SO EX DE,HL ; SWAP BACK NOS. BIT 0,C ; IS QUOTIENT -VE? CALL NZ,NEGDE ; NEGATE IF SO DIV6: EXX ; REPLACE REGISTERS POP DE EXX POP BC RET ;************************************************************************* ;NEGATE DE ;USED BE FMULT AND DIV TO NEGATE CONTENTS OF DE ;AND COMPLEMENT **** ;FUNCTION DIVIDE ;*********************************************************************** FDIV: PUSH HL ; SAVE REGISTERS PUSH DE CALL PODE ; GET DIVISOR FROM ARITH STACK JR Z,FDIV1 ; JUMP IF EMPTY EX DE,HL ; PUT IN HL CALL PODE ; GET DIVIDEND FROM ARITH STACK JR Z,FDIV1 ; JUMP IF EMPTY CALL DIV ; DO THE DIVISION CALL PUDE ; PUSH QUOTIENT (IN DE) ONTO STACK FDIV1: POP DE ; REPLACE REGISTERS POP HL RET ;********************************************************************** ;FUNCTION MODULO ;********************************************************************** FMOD: PUSH HL ; SAVE REGISTERS PUSH DE CALL PODE ; GET DIVISOR FROM ARITH STACK JR Z,FMOD1 ; JUMP IF EMPTY EX DE,HL ; PUT IN HL CALL PODE ; GET DIVIDEND FOM ARITH STACK JR Z,FMOD1 ; JUMP IF EMPTY CALL DIV ; DO THE DIVISION EX DE,HL ; GET REMAINDER IN DE CALL PUDE ; PUSH ONTO ARITH STACK FMOD1: POP DE ; REPLACE REGISTERS POP HL RET ;********************A SIGN FLAG HELD IN E' BIT 0 ;************************************************************************* NEGDE: PUSH HL ; SAVE HL LD HL,0 ; NEGATE SIGNED NO. IN DE AND A ; CLEAR CARRY SBC HL,DE ; SUBTRACT DE FROM 0 EX DE,HL ; GET RESULT INTO DE EXX ; COMPLEMENT PRODUCT SIGN ; BIT IN E' RR E CCF RL E EXX POP HL RET ;************************************************************************ ;FUNCTION SHIFT RIGHT. ;************************************************************************ FSHR: PUSH DE ; SAVE REGS. PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FSHR3 ; ERROR IF EMPTY EX DE,HL ; OTHERWISE PUT IN HL CALL PODE ; GET VALUE TO BE SHIFTED JR Z,FSHR3 ; JUMP IF EMPTY, ERROR FSHR1: LD A,H ; TEST HL FOR ZERO OR L ; AND CLEAR CARRY JR Z,FSHR2 ; JUMP IF NO MORE SHIFTING SRL D ; SHIFT DE RIGHT ONE BIT RR E DEC HL ; DECR NO. OF SHIFTS REQD JR FSHR1 ; LOOP FSHR2: CALL PUDE ; PUSH RESULT BACK ON STACK FSHR3: POP ; PUT IN HL CALL PODE ; GET SUBTRAHEND JR Z,FDIMN6 ; JUMP IF EMPTY EXX ; CLEAR +VE/-VE FLAGS IN B' RES 6,B ; (-VE EXPECTED FLAG) RES 7,B ; (+VE EXPECTED FLAG) EXX LD A,D AND A ; TEST SIGN OF SUBTRAHEND JP M,FDIMN1 ; JUMP IF -VE LD A,H AND A ; TEST SIGN OF MINUEND JP P,FDIMN2 ; JUMP IF OF OPPOSITE SIGN ; NO OVERFLOW POSSIBLE EXX ; OTHERWISE SET SET 7,B ; +VE EXPECTED FLAG EXX JR FDIMN2 FDIMN1: LD A,H ; TEST SIGN OF MINUEND AND A JP M,FDIMN2 ; JUMP IF OF OPPOSITE SIGN ; NO OVERFLOW POSSIBLE EXX ; SET '-VE EXPECTED' FLAG SET 6,B EXX FDIMN2: EX DE,HL ; GET SUBTRAHEND IN HL AND A ; CLEAR CARRY SBC HL,DE ; DO THE SUBTRACTION EX DE,HL ; GET THE RESULT IN DE EXX ; PREPARE TO EXAMINE B' JP M,FDIMN3 ; JUMP IF -VE RESULT BIT 6,B ; RESULT +VE, WAS -VE EXPECTED? JR NZ,FDIMN4 ; JUMP IF SO JR FDIMN5 ; OTHERWISE NO OVERFLOW FDIMN3: BIT 7,B ; RESULT -VE, WAS +VE EXPECTED? JR Z,FDIMN5 ; JUMPHL ; REPLACE REGS POP DE RET ;*********************************************************************** ;FUNCTION SHIFT LEFT ;*********************************************************************** FSHL: PUSH DE ; SAVE REGS. PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FSHL3 ; JUMP IF EMPTY, ERROR EX DE,HL ; GET VALUE IN HL CALL PODE ; GET VALUE TO BE SHIFTED JR Z,FSHL3 ; ERROR IF EMPTY FSHL1: LD A,H ; TEST HL FOR ZERO OR L ; AND CLEAR CARRY JR Z,FSHL2 SLA E ; SHIFT DE LEFT 1 BIT RL D DEC HL ; DECR NO. OF SHIFTS REGD. JR FSHL1 ; LOOP FSHL2: CALL PUDE ; PUSH RESULT ON ARITH STACK FSHL3: POP HL ; REPLACE REGS. POP DE RET ;********************************************************************* ;FUNCTION DIADIC ADDITION ;********************************************************************* FDIPL: PUSH HL ; SAVE REGISTERS PUSH DE CALL PODE ; GET 1ST VALUE TO BE ADDED JR Z,FDIPL6 ; STACK EMPTY- ERROR EX DE,HL ; PUT 1ST VAL IF NOT FDIMN4: SET 1,B ; SET OVERFLOW FLAG (1,B') FDIMN5: EXX ; SWITCH REGS BACK CALL PUDE ; PUSH RESULT ON ARITH STACK FDIMN6: POP DE ; REPLACE REGS POP HL RET ;********************************************************************** ;FUNCTION AND ;********************************************************************** FAND: PUSH DE ; SAVE REGISTERS PUSH HL CALL PODE ; GET VALUE FROM STACK JR Z,FAND1 ; JUMP IF EMPTY EX DE,HL CALL PODE ; GET THE OTHER VALUE JR Z,FAND1 ; JUMP IF STACK EMPTY LD A,D ; DO 16 BIT LOGICAL AND AND H LD D,A ; WITH RESULT IN DE LD A,E AND L LD E,A CALL PUDE ; PUSH RESULT ON STACK FAND1: POP HL ; REPLACE REGS POP DE RET ;********************************************************************* ;FUNCTION OR ;********************************************************************* FOR: PUSH DE ; SAVE REGS. PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FOR1 ; JUMP IF STACK EMPTY EX DE,HL ; PUT IUE IN HL CALL PODE ; GET 2ND VALUE JR Z,FDIPL6 ; STACK EMPTY ERROR EXX ; CLEAR +VE/-VE FLAGS IN B' RES 6,B ; (-VE) RES 7,B ; (+VE) EXX LD A,H ; BOTH VALUES -VE? AND D JP P,FDIPL1 EXX ; YES, SET 'BOTH -VE' FLAG SET 6,B EXX JR FDIPL2 FDIPL1: LD A,H ; BOTH VALUES +VE? OR D JP M,FDIPL2 EXX ; YES, SET BOTH +VE FLAG SET 7,B EXX FDIPL2: AND A ; CLEAR CARRY FLAG ADC HL,DE ; ADD THE 2 VALUES EXX JP M,FDIPL3 BIT 6,B ; RESULT +VE JR Z,FDIPL5 JR FDIPL4 ; SET OVERFLOW FLAG FDIPL3: BIT 7,B JR Z,FDIPL5 FDIPL4: SET 1,B ; SET OVERFLOW FLAG FDIPL5: EXX EX DE,HL ; GET RESULT IN DE CALL PUDE ; PUSH RESULT ON STACK FDIPL6: POP DE POP HL RET ;******************************************************************** ;FUNCTION DIADIC MINUS. ;******************************************************************** FDIMN: PUSH HL ; SAVE REGS. PUSH DE CALL PODE ; GET MINUEND FROM STACK JR Z,FDIMN6 ; JUMP IF EMPTY, ERROR EX DE,HL N HL CALL PODE ; GET THE OTHER VALUE JR Z,FOR1 ; JUMP IF STACK EMPTY LD A,D ; DO 16 BIT LOGICAL OR OR H ; ON HL AND DE LD D,A ; RESULT IN DE LD A,E OR L LD E,A CALL PUDE ; PUSH RESULT ON STACK FOR1: POP HL ; REPLACE REGS POP DE RET ;******************************************************************** ;FUNCTION EXCLUSIVE OR ;******************************************************************** FXOR: PUSH DE ; SAVE REGS PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FXOR1 ; JUMP IF STACK EMPTY EX DE,HL ; PUT IT IN HL CALL PODE ; GET THE OTHER VALUE JR Z,FXOR1 ; JUMP IF STACK EMPTY LD A,D ; DO 16 BIT XOR ON HL AND DE XOR H LD D,A ; RESULT IN DE LD A,E XOR L LD E,A CALL PUDE ; PUSH RESULT ON ARITH STACK FXOR1: POP HL ; REPLACE REGS POP DE RET ;******************************************************************* ;FUNCTION EQUALS ;******************************************************************* FEQ: PUSH DE ; SAV*********************************************************** FUGT: PUSH DE ; SAVE REGS PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FUGT2 ; JUMP IF STACK EMPTY EX DE,HL CALL PODE ; GET THE OTHER VALUE IN DE JR Z,FUGT2 ; JUMP IF STACK EMPTY AND A ; CLEAR CARRY SBC HL,DE ; COMPARE VALUES LD DE,0 ; RESULT IN DE (0 OR 1) JR NC,FUGT1 ; JUMP IF NOT GREATER THAN DEC DE ; OTHERWISE RESULT= -1 FUGT1: CALL PUDE ; PUSH RESULT ON STACK FUGT2: POP HL ; REPLACE REGS POP DE RET ;******************************************************************** ;FUNCTION UNSIGNED LESS THAN ;******************************************************************** FULT: PUSH DE ; SAVE REGS. PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FULT2 ; JUMP IF STACK EMPTY EX DE,HL ; PUT VALUE IN HL CALL PODE ; GET THE OTHER VALUE IN DE JR Z,FULT2 ; JUMP IF STACK EMPTY EX DE,HL ; SWAP NOS. AND A ; CLEAR CARRY SBC HL,DE ; COMPARE VALUES LD DE,0 ;E REGS PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FEQ2 ; JUMP IF STACK EMPTY EX DE,HL ; PUT IT IN HL CALL PODE ; GET ANOTHER VALUE IN DE JR Z,FEQ2 ; JUMP IF STACK EMPTY AND A ; CLEAR CARRY SBC HL,DE ; COMPARE VALUES LD DE,0 ; RESULT IN DE (0 OR 1) JR NZ,FEQ1 ; JUMP IF VALUES NOT EQUAL DEC DE ; OTHERWISE LET RESULT= -1 FEQ1: CALL PUDE ; PUSH RESULT ON STACK FEQ2: POP HL ; REPLACE REGS POP DE RET ;********************************************************************* ;FUNCTION GREATER THAN ;********************************************************************* FGT: PUSH DE ; SAVE REGS. PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FGT2 ; JUMP IF STACK EMPTY EX DE,HL CALL PODE ; GET THE OTHER VALUE IN DE JR Z,FGT2 ; JUMP IF STACK EMPTY LD A,D ; ADD 8000H TO EACH NO. ADD A,80H LD D,A LD A,H ADD A,80H LD H,A AND A ; CLEAR CARRY SBC HL,DE ; COMPARE VALUES LD DE,0 ; RESULT IN DE (0 OR 1) JR NC,FG RESULT IN DE (0 OR 1) JR NC,FULT1 ; JUMP IF NO LESS THAN DEC DE ; OTHERWISE RESULT= -1 FULT1: CALL PUDE ; PUSH RESULT ON STACK FULT2: POP HL ; REPLACE REGS POP DE RET CHAIN 'Z80C1' ;END OF Z80B.Z80. vfZ80C1.Z80^  "!#$%'&(o)+*,-./0132547689:<;=>?@ACBDFEGIHJKLMNOPQRSTUVXWY[]Z\ʾԛN-ki鿓ȸ;Q%rklc*LSٷ;@RH^<ך+F䅭-(`H5׵זcChm )T'ebYaMd+x/akK!j Oy8=Ѿx,aпHxPsCkZ[L2[{z3'Ø+#XQe`k7̐d*%̐ Ck^[ T00)!*T;2cQA}|_qNNж^~Z5Jn-v(N $8P.F{~FQ0ݲ}U]/SF}q;gy[SyFl힟S m^UN}q^[T1 ; JUMP IF NOT GREATER THAN DEC DE ; OTHERWISE RESULT= -1 FGT1: CALL PUDE ; PUSH RESULT ON STACK FGT2: POP HL ; REPLACE REGS POP DE RET ;********************************************************************* ;FUNCTION LESS THAN ;********************************************************************* FLT: PUSH DE ; SAVE REGS PUSH HL CALL PODE ; GET VALUE FROM ARITH STACK JR Z,FLT2 ; JUMP IF STACK EMPTY EX DE,HL ; PUT VALUE IN HL CALL PODE ; GET THE OTHER VALUE IN DE JR Z,FLT2 ; JUMP IF STACK EMPTY LD A,D ; ADD 8000H TO EACH NO. ADD A,80H LD D,A LD A,H ADD A,80H LD H,A EX DE,HL ; SWAP NOS. AND A ; CLEAR CARRY SBC HL,DE ; COMPARE VALUES LD DE,0 ; RESULT IN DE (0 OR 1) JR NC,FLT1 ; JUMP IF NOT LESS THAN DEC DE ; OTHERWISE RESULT= -1 FLT1: CALL PUDE ; PUSH RESULT ON STACK FLT2: POP HL ; REPLACE REGS POP DE RET ;******************************************************************** ;FUNCTION UNSIGNED GREATER THAN ;********* qm O븞2k+3yNQ]L9b2?+-ꝌDF!j 2=? d%NJ9cQGX\}9WKOdrPAxAƁʤ%+2Ge{~F|Ø+#8P"~eZY=~=De[as2/>avS,9ŋa✴-w3>ө/Ny[g 1W^ ݘaVft[*XA"Ȼwzbx*}+cK֙r$A8ckY^cKZSfFp^[*: LY}9WKgS9Yl힟Q,4*a G @XįL"~*cQS_ckb%1WFqRK,Weʏ*Ql힟Q,\Ɓʤ%?{ ϣ\Y>gI ,/a٧uT2e BO[gW#-},s>l✴-pF=ө/NԱ{~Fq2lgV@I cR$x~hr][:c: "j0[BUBomyeyjX2W,wbk-ז֟.20Ne+ ==*+S%k1'SY:0✜햅z3婒?8 NBb?^kKexzz*9U?fé[baS%NOКeNeiόOb}|s2|3Tɱ=?XyWbsed?jLq*T1~>l힟Q!3g7IUz|ɏ3ֵ{MF}NUz^sힿKwpZ۾:wWFuj2=WF ;Iz;=3:?zX;֖Uˌ)+mF2'zzUT W"*=x2nCduF?k|bk˜Gז 3C1}#*,J%uFs[- +'}^2 qm1}i3Zzσбu&<{>X*Jݒ?N0W$JU{($S~4MۏxΖ}fWsbk]2Wv_q٤?'"+Zsk WK+yp9iToXT sM5=EK7U-3* &a֢BgA6 g_a;\As*GsUsv%1v\R*][9bk*]}ε{bn #rXR%(tl~9euru[/xnЯM oϙ1~7;s[?XbkEFR `9°{.n>gN~)TNڭ\[w:S:7)w!yyT) [8gF{5_n-vQOrFxy}IK&!LzUKL?z [[L?z [U$-M(_7itcko~1Yղ|_f{&WXZR=z2W5^+(p`&Wg];=-գQsZfăz'-[Ckk˃z'|^*ŧ5^+s;Huum/lo~9Kk[.vԾofg6h [{ힿKb\Uڭ\@o~_{ힿ/|RKDz'3x=]7U@c]j'-ѾMrB*C;s:Ix ;I*K8WXZ}5|7T mvt9;ItUڭW7ɘ>=P۾:&9skW}9^nFG)'Zu`UMR9W!\jkUk[@ D&iҋGZsYU@v_qFn*}uz#z0.}kǵ[]m_ +pM*ҾȔMF}knfAMZs-_HY5 Tԡ}!ÈB4s8t&d0t =.p1Cp(q4!81q4<bm9q8݇ !Аac19֖Uzhu|q8:~m+пuO@|I'থkX[v3 DÃƂ:!_,߯ڲeg:<:~a,-cb|wS0C1}]0MK-b-ZԌ>|m e3@wS=$d8c0ehKĥq3txg0t jB֖14e ᘃ8Èƙ2%rm Ks:LMHpD4cvtׄhȰ`+˃%":3i0ЌSÈՄR;t(uF\[3<s0>@aXF&gPHgPAF> LJ 1krH _<J-kTZ[s0tf,`0q4NkN#r|ch9С!Ne|G b11p8ǵ 1֖!kL_Zj 嘃8~7~Alm[}X #hTj ;Df!|jWlힿ?OJb\זSǃz'cQGei΄ ̆q/-+g'J.$}h-[N;\0F?ө/NԱ;WFqRKFۖhN BO[8'GhICk23+v(N1WFqRKFۖ_{~}Wz%12k˱km So:_So: 2'zzUT W"*=x2nCdSoug]z/WlmH=ڒtf5r}U%{U dh~nK&c 9&&@CjBi0ܸ&D3CaXgPC;\8P ˀ ECCе~]CSi8&ΠRsq jBCS: # е8ÈBth0 sG u*uѬ-3tj=zguЮg_!j.{b9(L[Ǘo`svpF `6WN_=S43,[MgNM*k=Sn}5_n-3>*U9f0>d2AUL^ˬ}*͞],MGUz^*]}ε{bۏxn}T\8gM ?aT{.MF}NX _=G|R7Iũ>_xYȩ[U$U*01g7+ a΃z'=}fé죙\jken>TLQ_BTNkn&X&F]L)C+2ezRvkn[e֌>\S -2lKk@m- @^{`?;Iz̆SG]ZsJ9M{vs0vpT+>K/ku __ @&ye!2=P[K/;IBHe(:n>g7IUz|ɏ_xZUk@m2`M2ϙ3\ @}s:Ĭ-jFJNSSٷvt9;1@`ힿO|=OZ!j>g7I*Q0VGk}N - Q{CkbgsYTyeM2+I~SK/kUdgPk×}9 vp5_n-s+pƢ$rk9csk@m2xm2@?8g?M2>+^յۏ:@@:<}7\[bמ)~?;IVkwshhdZCpyns-`kOF@)~vp1͡A8rns-`kOFng7Ir*͡A8M&XJkwsh1 oM|vpc*un ‘}g7Ɍ>SIkwsh#Mwcε% o&aekwsh1 \{7nF8:;Is#\v7(葟$ш͡A8kwShtvp#~Ϲv7( ^ƜkK,@piߨwS40M2(ֵ94GhnF:;IfXŴv7@^ß$3b%ܲ:*ᖕ^in Q!xn.nVFnY 94G)z4:;IfXyNڵ94GE)n̹Ă=]n>;Iźv7MHg7? ]kwS4pdQ,[VG%ܲ+͡A8MM2(Ց_-+=Av7v7EFg7?ωpX  ]1 `,\{7n&9?X.n{in Mg7E[ })$g) }kwS4g7Y.n{Ikwsh~):ܮ-?&ST-jFJNeN[[&ϗ!2Tt^:Y[FZ\؁m׊+?eh;Izzn":Sv֖X xm kZf5\b1rzQ%uk2 BOעES9}vm2a͗[K}Zf5\ ֌B-@0׉Ӿn 5O%ɕ)3Cv7%tvpL蜬}*9M\CO:;I&tN֌>&WzڗM2sd4kwsi=|7IOn=#&kwsinan=wpnzwMr*pT͡}wn+͡}U BȔטzw/:IY=23_COW7ɘ>sQ -Z͡}MR߯9$pn=nu^vFzVi\COFnzXݮ͡}Q7v7;IԵ9o$HZkwsi(|7+ιv7vpӾ$}kwsiJkwsiH7Ɍ9oM$pn=n~v7n_ŵv7n9o;Iοv7yʨ% -v7Lh1v7!߻9y--ii_B'ϵ% =wSd͡Axv7E#nV%p:Uzz]C~n-ii!g7`ZCpm§1g˲rzR>=imH }w t?;I~7v7ȵ)nY %͡A8>;IrJ%1͡A8qmwSnRIpn /hg7Y>g JeWZCp)8;I*Ց_-+=Av7_kwS40Mr~V1͡A8n>;I*ֵ94G&9?-ωpo1Т#wS\gs T`ՙטZG˚ѧe z'ugf5o}# dh1[kLϴhTBbkwSn d,l3C1}WN_=S,)x ws>W˔טH4]9}TNqz=C)t?əטǩAwbkwSnZ[~hk||*Sf^cV$j֯ڲ{lr˴>z>u3VB[[9M=ZG֕AO^2V}f4}~8:я;\0F?Zr,3 󷋱Y?ugfhQ||SF[/"sb%Qd,ukۏxn#w:խs:I0^[ZSO_tQe]Т/ wsSo|M_ I(Dz.h 9 [~7µ3鋓3ʱ Złan:Jkv_gT/dn3j_#LK[{, \GHg7Y=gv|Z80C2.Z80@ o !?s}؟QVlv}e-i +~v㙋\ ^qse xݕ=s[:gTw 2׌m&^H.κ̽o؟Qv 2>| ^H> xYWUbze8s{b?s}Ҟ7B#-@j>3)=Da/xZPgEbo>! ~/:;s^?s;ox+\cUޫ̤pf߬ Aڜ,Q{^Y$ڻۛg-4[3W.L g&ͺC,Q{k_C"!z'6p̤pf߬ AZ-@jCU,Qb;,~{mws^h|k8u3^<^jk\DM>>! ʺ̤pf߬ p̤pfZS폛M,}g[DNԵ3Kb;/7M}ZX`C#ߙk_XY$|  &383)$7BEi?!"0( Z[}fRH83H%I!VMSߦV&>94y3Zݬ,mӘK<ęk_mUT& w`K\z߇h"!z~AOm4A]?s3B™-@j-/L gJa~i~B#ǒ&q涿"#$&%(')*,+-./0123546789:;<=>?Y397nUJWoU%BT .[00l5}Ꙍ=qfRq0_zU-BE}bNE83YUYP`"=83Q*gh[/G_KH~fZKx9 6"\*qiL;m(p2=3Q*Nx9 6"\*13S<*Lp 'h#?pg&ʵ &kxBWL=B{ߣu'h#\b8\I!3әI!3f]_>/+q{_Y$Wg.ƞ ЌEb ė?Mx8s;s-k+Dcٝ9/+{^tlTw Ya]hPwKlETa/|m~ﻉ 㟹ǃHq4>O _=s}qe(r_'da[9yRLlT+ZH})q*ퟹgbRb5ve8s}>3oօ`;/r=+{I!3?S"Q8s1?s15Oh4unb ?G@+D*;[/3^H9ݙҿg[:g*]Y$^d)vV!n, gNUo̵?sbҕy&g*޻~{mwKE;+jn r6 ̵}f,G`Om4A]~+!7gbO+D s^g|Bm k_8s3B3S[Z^ޫC.rmPr÷AI!%jmk_#`H,=Ù#x{t߯3>qԷջ6,F%MmUTFUf7^~&2k_܇hW#p4>!u}Bf,G dWk~̤̄Y9pˋ3B3S[/L i,Q jvX3>qԷջ6,FU<aR9՜InSZh܁ /m?s}3|/W9 ,<ęk_XY$>Ds4ǙI!͙-@jꐋ\uT\mP}fRHsfZPXzEb\\{ gn}E㦩oSwKl Y˫4y/jr9s_VUVkvKp6 ̵}f,Gh4A]?s}! 3V#5_gqfRHsf* Z%sUHr!L i,Q Vl}YY$>@~W u_Y$ڻۛ5_k[G7: sDqς mh4A]?s3B3f]f /֫L i,Qa~_Y$>x&<},M,=sq-]\3S4^s\ }_}Z\𺏛+,{7ұ?sׁk6\cŽW,םu%sgs&gnb}{o"73GƴL3-3, 2|0sxa~OتwgA|BPU̵{P+@5E;s;oEbwpپN3׾o̽ULτXzHQ̑"1s<̽U̕K|0sx؟b;/ [nb,OʞW=sұ?ׁkvhWבu%eyh\ǪŽWo؟EuA暱3Z"1G &uk_^t&gbzeX`nzn,`gxKM4\3q۽Eb`Ьzgnjݜv^3/gT3?j+V.+8A3,KlX# ŽW,\p~vX/}eX`q4"[Y$Ӿg0v]7ve"6 l"0zhV~=pq^cFUM4\ӯ^?sj{_Y$zY{qպ=ss{gnjݜ7"E`N?ԺH4\S37Goe,9Vl[Y$b0s=s;ӵECu ?s}+NԵ3>]jeZXzmg}o"1Gig}C4ce=Gh8MPgqfRHsf߬ m!m!;/>3)93HmK3B,Q[a澲H|U4g}C4ce8@i>s;"@N9Ҟ폛MM,}!9Wig}o˕Eb2&q>D3̤T [K^{uE C.r6>3)9DmT9+ć#x{hÙk~t53׾!H|U4g}/da"!zB؟uA\pvا_?n6z7ȱJ8s_jn r6 ̵}f,Gh|Bm >L Lu!h>B ^HU[}fR|f* 4?3)d>DUV]bC`Kg]&ƙ#S{O+D\0Mms_"*oMJNmg5npw 2Ma澲H|U4&kg}C4Oh4mjnb ȱJ8s}^,mӘ,<ęaW8i\z ˕Em3<ęk_XY$>Ds4ǙI!gjyI_{uE C.r6>3)UR%68%j1h9X:H5_ !?3EXUN+ X)Uq&W{o"@5EvX3׾7Gze=s"~׸.M4\3ʯg8s;"^~涿* s>D3V#p4ǙI!̄Y9-@L g&3S[TCOg&3KTCanV6pg 꾲Hb8o^׸.M4\3oOEbKb8,*]aߙT&a>Qؑ[D3̤pf* j(^̤pfj(O:W#muh4A]?s}gnYY$>hé2G3>]j5&63+D4&G&q>D3VgqfRH83oօ` /ZII!̤pf* j%䅭I!JԊO:W#muh4A]?s}+3>]jTh܁ /m?s}3|/WiL%M̵}f,Gh4A]?s3B3S[T+%/bL i,QDb;"@N3 u_Y$j1h7 ~/kxK&^d8s;+DM ʢҕn}JekS376] W#m&kg}C4O+ć?G k_8s3B3f]b !ؐoR3B3KTb;/V&>héWHѿ&p^E8gnYY$>hé2G3׾7Gze=s"~ssWa~i~B#*M̵K\Y$ڦ19:ė?M̵}f,Gh4A]?s3B™ .oR}g&3B™-@ssWa澲H| /m'~sՙk_8s;"#U "A8k_ YH|+Oh4mjnb ȱJ8s_jn r6 ̵\Y$ڦ19:s^Cь383)dyf߬ kE[T3Bg&,LoRUyɋ{U!9\}fRUYT}o"!z^E^*߯3>]W~_Y$>D׹u̵}fǙI!3S[TU^Z=3B3HU%c<3)d}fZivاkmEClxi8G k_8s}bhXY$>D̤ .?/T}fR̤-@JV3Bg*kX%ݬ,MBC0Ds^[G7: sMtퟹfe`ON9Ҟ^,KlqxJg},Vu7g]qJekS376]Uvf7^~f^,mӘE#Hk_XY$>Ds4}eX dYxg}C4ce=G }LoRU%̤~fRZbeh_A Y`5ǙT&a>Qؑ[]W#m&kgr}+383)$왩-@|g&3KTRvاEb &L g&ͺ|`C( >3)$jxɧ3B™%FtH,}!ЄS=s-nPE&y̽ƍtnuA暱 gn}E㦩oSwKl,F%M}V+ U+1/5OdgnjejeavM;mg}o˕Em{O8s}+ćh9MP̤vLoR5I!%Fb;"@N̵BW@ w37E8ׁk6tퟹ폛MM,}'d1r,igZYZM|y&8s_UjUYhn r6 ̵}f,Gh4A]?sj{_Y$>?s佟~+ĺЬӰ3|1|vاECqx韣u̵}fǙI!황-@Oꐋ\uT\mP}fRH{fb;"@N̵BW@ w37E8ׁk6tퟹve`CREoMú} |ߙ?#xƆgnlxvا"!z6 u̵}f}e=! h4A]?s}gqfRH?3mpB؟uqfRH?B/"Q8s15ŃﵭM,}|~ignvWJxЬgV9?s_}+D}+! Ϻ`6٫gn}z_Y$ڻۛg%4yU_}VJ̙뿷t Y(, 2׌gn}z_Y$ڻۛl׽>s_*3g3b_ y뿷t Y(, 2׌gZBk"1G tퟹgnUV忱]kᾲH| /mh4A]?s}g}C +ć}Lu!}-@W>3)$LoR/L g^It"!z6 u̵}fǙI!T +֞,QRvXEb &<*s=s;UU+oM4A+D4&Gm-!\z߇h"!z6 u>L g&ͺb-@_}fRH8D+V.1j^-0Sr%{Z=DI{QRRi%3>,M3ʯg`?s_UU,TY3 s9s}sW#0G*:W1|1|vا_?n6z7ȱ}V+ U+1/5OdgnjeBkvM;mg}C4ce=h4A]?sj{_Y$>YU8Bf,G dYxqx韹+>L g^ucCC=DI!U|vاEb &qԷջ6,F%MgZML iLu!xQ U[}fRH{fRH{f* %L i,QjvاEb &D3V#p4ǙI!황-@|z,L i,QJanV6pg 꾲Hb8o^׸.M4\3oOۿ,G`K\z߇h}eX`K̑~V,Jf-44gn}z_Y$>D9MP\z߇hƙ}T UK>ޫC.rmPr÷AI!U[ivاEb &D3\z߇V#0383)$ ="j{Br̤pf*O+Mx8ktH`0G3⪡+DM c4W׸tnuAy0 gjV`>=$WkqU9sKTׁ97x!*$){O:W#׹&<̵}fZU+QUh܁ /m?s}WiL%O8sQ:DZ9+ć#x{k~t%"3G3KT(U}C4ce=^~>аH|9/ǙI!3S[TŽW\۠:"o3BgtHE=s;a\zECU5_gn}VBUf7^~f^,mӘK<ęk_XY$>D^,Kqx9\z_ŒEC,&<+>L Y I!3KT*Zݬ,1l4T#aSUM4A+D4&G&q>D3V#m&kgW-~+s^g3׾ozeXWU_o3>,G`K&kg}C4>L Y I!3,G`5_gqfRH83HBrXxfRH8D*_feX`C 3EXU5+DM CrUHW՚37E8ׁk6tퟹveX`C ҙ"Eb̃ƆD\\pvاk2VDlxik_HMcrt~//<ęk_8s3B™ .;-@P}fRH83)$ />3)$Y jvاEb &=3B™%TfeX`C zZP+DM ƻ{o"@5c:t}e={h9MP\z߇hOתZU& w`K\z ˕Em{IǙk_XY$>Ds4ǙI!aLoR^1V,QJ+>ݬ,Kl4T\*}e Ġqx7D̤g/yaluxL ganW6p*7T"QAn{y^[G7: s؆N3Zݬ,1l4T#aW՚Dlxik_HMcrt~//<ęk_XY$>Ds4ǙI!황-@KT+>]j5&63׾7"6)Z{I8s;͙k_{HMcrt%M̵}f,G`K̤~f* *{U!9|fRH?DO7+Mx83⪕W@ 37E8ׁk6tퟹveX`C ҙanW Hsfe Ġq{H 3Zs^[G7: s؆N3׾7Gze=s"~ssWaH| /mh4A]?s}gqfRH{f*} ?3SsU\etg"8M4g&˘lE`[^zU{g&߂ g{NUq1̔Y [͆_|ބ_WL1ӝYpܝolE3ӸgA4DN,h_wgC/™ _4|>krtg{?3oօȱoyQUYTs49ڙ ;1݁_=3ZWQqfTѶ8^lE 'L ilfT,Ʈ,ū4Oh`ZX*haH 4gZ{_Y$jɆ_Ș~oJe=׃9B4y3;sm"Ѷ(ml"gC/™+oX Mx8s;sHYgqfRHsf*=Ù#xY u ?3H+LQxfub|  &kY0W}3B3s+䱕fe>sX3[+؈\\3~D\hvاWz3׾!H| /m?s}! 3V#@p߯3׫\Eb9/3Gk_k7[H+*{ 7 aW#0FԵ3׾!q~g&g/ilxȽ U!9xfRH{f*~vاEb &Ds4Y *־!qzՂH,}0{?s}bhXY$>D̤pf* *^rnꐋ fRH8D*XzECU5_gn}VV*cvM;mg}o˕Em{I8s}+ć6pFԵ3׾0ce=G ?sW}LoR^2|,Q+tH,}!ЄS̵BW@ w: sƙaᾲH`׹&DNԵ383)93ٻۛl׽fT!7kvfRHslub k"QNc"%mcIlBdӝgoe-M3-oZM5EuoEb'/UeyQg[lk36B7*XY$q: g_\z_3fՊņk";gƞǙI!ߙ)GP["=83Q*gi[/G_3rr &\lƮ,cΕOw_\iUrlЩ۲\RP\/o"z54Jn4 :6e ,뽾v||=@\j_%7],ù_P~XF{_%7|,SToc]!mYh`1n|Ұ:"Q`G/KI\NVqߑPt+BFks7¹{˛\Oz=+{:Rp7^_#W-$G|F8{}S4-`HvX8{}kkU`BhP\D^ѹ>Hv}!PWW1!rG}dlG\S9קT_b^ 's^JYM`6G65s}O*f&ӫjsͥt\*,ݮ,KlE g}V+oD7b'Y[Lzp4%Ol"}gw涿feh ǝx%M8sHYgqfRH{fz'kLwm4A]?3)=!O+ć[h3׾!qvاW#;Mxk_8s3B3C4Oט@ifRH{C4b1Ex,qb ~zվZ ,ū&<98s;OX0z7Q Fq}g]b|Bm OxBlջވ*Mxh3úV vehO8s޻H|r{ބ73}g[Cj7Wb#~P{|3ǰKPiWmYPp#.;rh8W>Y<rMC*vlz8s}@wE@Wd8{}嚆؈CbӮ\MC#+"ù_h+U`uXVڰ iGl4s:՚ks|PzG͝9 ptFz14*,ac^Jh/׼MK>a|,r(2 jZ*@sۑ evӀNkYlx>q[N'nq+`6=࢑wRT|r '@ocQFG>R.6=+|Ǎe̥dR$۽ V,b# TUP)6@(f.eݛ|M@=W2.;VO'nfU-lp{>q[Zq9EX\/o<-_{zh6¹↍rxO^_{#Wl# bAoc]sׯMīZDJs)wMMp &yp RD/=3f1[,K=P7}7A.lstMMdo>Qqшk\q+rm  1z!l=¹?x>wG~.F8{+ A ľS+&$Ι4zxN:{}jOt}zXc(`C\I1dH Jb#9Mཌྷ8l꿢ag\6J t~Zųb!] o.Chp.uvwÐ.K ¹>_ :z>{N%s}b\i?mi}4_ѩ0I^lW6[b5H{)a~CXY$پ8^\z_3޻~# keYTq$KګgnU΄RZ̻d ha9Zޯ-۠kp߾NxAq337G)GKۂ8v}88x{7!jW<tMpSyB\=s;b&ͻ 3p\lƮ,cW3_{V%ZHJVJWϼ=Hq{+ć[h3׾!qvاW#;MxvnZ80D.Z80L  "!$#o%'&()*+,-/.0123457689:;<=>@?ABCFDEGIHJKe.H//EqFصM|X+ v+p.]Ro\*0 x>=Xc%Ċ%ƺ<C9\*Eb\6 ;A4!вJb\4n;GltF5Խ,26X8%26rse cXm@JkT RpR8~sݽקFk1\\i'2vzNSKx>Υ9N.Xt\6¹>Dx>sOd'r|tWuw9<C>Y2y}¹>~Me\W?~ZzxN햹>/Ts=< GәIe=Ј)p?&tW ՒAhP\SS U@#BD!#\i}׽rqh+F]@(T:ziOxų g\s}#toXG71s͎:[!Jذnp?*-k̵ѽ jbEb&tWg ʻH Jb#뫥]$`øn;E#>55s}>/(\irߺjľƭ?uoeO ¹?p5^`Υrlf[ Ѷ bZECgA(5[,+{+wM>*wlf[,D7A%KF <]#+t m.4iSd{5 EgAdSQiOܼҽb]\ B 5HnPS)E8 |"U4,jGv{$k7WwM`SU7{Gg 8G4_Bb?pOvp&sSUL5D7 g zOsͥ=TEjbIs9wkT euq¹>+lrQ{@ùTIkpԻ j\lDQ^ŚP^\ktb#|¹>^_{ F\&Qt=De>߸pMW7|@\?LzB/W<\m=a2ͺ}¹t>MW[ <]z8wh2nBU8K81\.ǐ.F8Wཌྷ>6=s=4ȈW< ubawA: (D>]*vBs }"/s׷FTD|lԿ:d|dSzxN]o 2wy^m.M W^ 6 uO7"zWIW' ؀l+<>MOH{ !bX Ұ{V}< j %bX9wۿ2g[)sקW`# ݰԧ?p'_Fre맦3J6'rJܑ;%/s)B$tH% z+ (j pEaŠ'*rtpqSpO|ro3JùS)WT.Z{Gi¹>:74sGWg`c'^?ntW'XǍ^?5Q>V  ED%Wl#X8{1dmqf_mgs0K7s(0$Aڧo76Sq$z>6SRg H:{ q6"~DQ_sWP,64(=@( p;\sWPݥS5( &2엇%탹N(DEp.upo^O".Clv*;aG6\8+^:]\qj"^PW!";v+.p.v/Eƭ}^qy#YDQ$rw邹>;j^{P^,64 Jn4 YccɕOqlҽb]\8MxCa\?DSհnBU8K8{}m.4_V0AIl q zO*c|HzS$7sƺ<ChP7|RC acx{gȦҁ~kĆczC'r9+i?ҽb0<޺| Թ>\s)8+K+X$WP%CQO5~̥nm4࢑w!W>AGvTr%`.K>AJ>֑ ;n(cuRzV1.Atp=KuI\uX塀}$6 SCaA&gm+.ot : ^AQth/l|&sͥ Ձn!j;j̉aAbqy:ݤϥ2xOb rAB.CN(lh =+|Puy>re9lba}5[=ý723wmp| &T{}-՚4jY%1Pph#W.6|L\\?Lpق2.\NŚWe]Bù+) 7( TiU7As0k.ϥr(qVX+!0~b}^-}z*_u2NADiv߯eحV%Q1M8ozq+wD. uC>`;"A\oEݢ@Ob\6  s׿RO5W b]"n"m^?N T~v{D`c6YẼS6|,>58izo +]\k񯪡POpZڿwE@K=ոkٚpZ]\e@=ոs}OsIпJn4@=ճùzS*0х)犊p;fE6CPl3P&sͥh.[a #vc| q[6 WԍV\Lb^rs\"U}*$G 5x>րvnPp.Fsm?qy™`mP E~_ްq⶜뽂4(ƈ+ =s \ˊoO nsWXC( kr Ȇ5v{εe{}jkzzv+%K8'B]IUbQة%c4O\FBA.%ƺ<؈C?l?qY\vPe5%( 4~ F% 䲃 k%kj p'. *\"w¹ZBEQ~"#^}$Pù+js?E"wo`W7 k)qܿxڭV !]4(pPQi#^Q] #poG爻Z#H=l?qf ̻'j8\O\{FEZ6Nܖ^س 1x>-K\l\60Lq:.~l#H\4s= (f`!Ns0k.R E!ldC5l.ڭOoz#\_4[Ky'6Jpِ'|@)A6 zy.uY1UK9JtѠ$6:TVX+rYt.%ldC5L5\J.CC eP(ǎB\2gH;Z1RF{8~Ksyݳ_:q}qC+t2<1xS?WL {m#\?F~DsDsM! )g\VLR^?57nEGP+'>5 b(|z:#oz'DZ)aj 8[w KQ]K>Glp7ٯصMVu<1]iGP] 0v+X8{}j_Tz^k/4^tEzgk¹D]yܥ#SKs"c\Rt\gȆ^٩:aWgs}"΋ʫyx;bp&sͥ\s v ݢKD]9<k V,\]ܽקFk1+;x='rx>ci&Wg 5Z#nK+7)ȇ˺`c쁸-K\SCJ8'Qu6l=t^_&SS*Wg#K{@] i¹~ wI&S?JD_{6vmAswӿ:^tY*\s=H\S%^|Q>_hj] #!v ]@Ya\zgkbyb^C]m:{\Pin 꽆H\srDvc np*F.S1rG7 zO6wb\\iz (X/TFTAQ$r.Tz(f|Q8܏n˻Yۯ7mp\=w7ցae8׳;\ʎepﲃAJ6\G錒MF>(\|$Ddx>;\|>\6A=ˊz^aZl s#ƕܿx^7B`F['\tY*\zˠ$8v1Ol1dHl ØS2 a2 o4WU|}dD^!eCEA6qY\RsGTSSQ8|ȻZB*Qa2 og.[ahLa4| YlccI ոr2mׄs4,{4{Ԥ1'r={x9'r=׳>Ns0k.VΥv+166s)r}^NA׼JK>Js}/+.74NҵU.Qw>.+nl `-kgmW s^V Jù>ޥ+]Pf7s}"?Y8{O>}aZ1'riҞf\?LK7sn/+ mG'l) \42n\e4;t z*=xZ/)KF&8VKxt&ڳ v+M32 v렲\%{/>{}ju{ͫԻEc5x)=zOvNA׼ LO] kSù?p"~+܅{}j>{\>{\?LRoϥ<CiVQ] Bn1f۽yp.VY{0,]ls}"ixYg.[SqztЩz2;wIhSݥS5sO ^8MWM݀|@p."w=_Rt^4-wI (txs0yοF<} zxA8\yQWMoz60 Q1wܽ׿鼨Pv>t^4m.Hv^6|S%:/o`6\yQ>55+&H ԧrGplls=<΋FF+(C.w;P6{X+H=|^ߚ^3J֑v{|_7B>isGyx\yQ{h/M ]4\  dsT|_7B>is}7B4%C:2jt@:2zi󢢓ߛ!8[Peuqc+&茒u~j:d+ЩحV  D[I+Q>IȀlp6{}jkWL {'6׳__ozN\js}"%v+ˊj/^|$𰇈ybsקF{ozYDK,+VX+l70 |_7dDF[1<>^?5Qv+:ds}"/sOMgoznPC.茒qlkWt Mtozm>i|Ćf4yQ~e%Ζ맦0Z7B(d0Z8w^T^aZAh׿΋1#s=<΋m!\S%^v+Dg^?n zxHp7 ߛݽקF_!0c8;{Xx(v FOj~e%IO+wC>i1^_D_x΋n+Щ\yQ'NA^?nU'.Cjǰ#)\O~/62엇ޥ̮ a<.i\i4_ ǐv{$eTms^_S5 ^c>4{}c^y>]| :"Es}b<뺸*a˨Q\14{`u]zOM*0ALA>)\^:]Ыa]0xp4mqWe>_Vù~5~˨>ոr.zrݧ~(뫕s'R'E*(뫕/ jeZ.N #0p%ĺ(1 uBKE20.E2FaX8W+㏘]ZB{G\_?bjwk^*rQeTù꾌ݳ_ Â>׳_맦#Zֹ>>_Fur'@n^s=4׳~5@};U,Ht[EC>Y2y}¹.:_ް˨߻tyF> Q^]D]ܟ#20 6¹>ث|Ұ\_ pZ4 ^?5(~6'rJ^|3Jù_H-G;ұKH7mYژw2'růކc茒pO5 /a2\Ky.#AF&1Tɴ]ΥʹKgm>N+t2 .]"S\7B`Bht b]P͇d\iKsO MK- GeO{'+䓆EGlޥK 7˻t)xl ØS2 \?LRo\|\#YۯozN\aAYۯ6{jM ɍj SqF^Q`Er l#`.jc΋n+Щ΋FF}"ixY'jɕsOMGs}"/s0KqKoI[as)f# kĎiWC !1K]VLRc|Kr( e0,QvRD3p.c{}jt fee^]V kE\?LYۯoz Â>׳__mgm>Nsק&2엇_ux^_S5 "f#¹_P;Snc|d\3swm!8[D7kOPIuOۆX{%=\cUe5k],h/M@>O)@71s+(C.qaoz֞t=\cv:߽OM ɍؑ٠+Ү-KsקFK=ճ5 txyb^v5s׏^ ԧ86vߺ=<1 6ʐKpl_h܇_!0:Psg \>{}j;#:<<|c%Aܖ s=7\8͎~e%뽾vX:4 ݐ6j3 [)#TkIT@͝aX0{}-՚4"SA1O QPiWCܖ\+21ߒ n\/oS_|$Hv{E¹[W`zH, jsׯM\OMҎV Ȁl<1{@^ژ>55+&ybs? +t2*͎q[+;[mY^_etd T뽾54SySoz;2 t{\oOeCe bJz\ t*1;c%Aܖ?;Rs}ܟ)XmWƜaXz_>Txs)6DA> ou.v` ~xqDώoz6j߸0Nc>'rv+Pse^-pr~̥[KPse.\H 8MЉ0,~ ,H=2z:#k?ABȂs}#7|plls=4H H tAwh gplS0;RwqM! )맆W`#A>ؑ|^xg}WƜaX0[K哆Eù[+We^F(0ͿB`FlhuCT5sקW' xCWC(vQ%s0yοRر sͥ:/oPe}/wxp#~y]>TF>}-뽾rMCr[SQw^s>{.seG'zy\Oz嚹>5jEQC| :坧s΋'rU7NA166Ĝ;`ī[a45{}ji^VX+!]$| $:=DSc+&1iG| aQ;,shWƜ!\K=sWB(aXڣ옿uo 2'r]̻aZA%! K{Թv:|ҧIâv+Ү-K#c>^Z8Ds=[Tl}=70 Â>׳;\6a2~ R * aXڣΥv+JBh{>ŽˊZQԎiWCGd.̵t_7B'.ðWYۯ\h]"ue9өO+,:zxNT_Fr1{X+H=|^?5w+VX+(0'r7l ոr&ozFTQ PzOM7n'#s}"%遹_h%C[a`Xڣjs}"܅\_  =* \=we7;mM Ǝq[6uX{Or  * !sX|_7B>is} @푹?p]ߛ!8[zOM^aZA,mtO2'rs}xW&8;.:q[1{}鈦v =70 Â>׳;\6a2~s kv*v2aXڣΥv+;D0,Q!=B5l.|#S1ߒ#J2~smWejs=kq~j WحV0,QQ`O,]{/ozF:TQhA^64'r]b^aZFC푹_hPC :D տTVX+2*J cقaiHM8Hޟۚg:G;1w.-n);U-ߩbc3g;pun75xߩb<^aȹ35}<0if5C慹y$WҬ}YhNC?5]qxE#ft6OjUg^S3fu+)^99kS5mn^wzwl};GǝkD|&U*B֌NJ5;Y} ͪb&}!ЪVLlG2y.w_sdc4[|,|2T9BTi+ٲ`1r_Cee@t<;lY3r2!ؿsDҋP%{,:U)S9މ q7Wج7=::m.fN4d<^Ysx߉s;>nz<lnyY=d'#g@*斻yRϪNfT2SSŜV̙+ld#u#lz߉H{߱7Wوl=maVyR}'~n';ʚ3N4OFJWy >Cf^wv|2Rnz1'^"B͹}7ϼ\"{킝mR"D5oz kTѹ>{\k^l ØS2 \6js=/\s}(//B" ]sru_:̻aZA%! K{ԹvvZ80E.Z80F  !"o#%$&')(+*,-/.0123547689:;<=>@?CEDABTF;`$gm8eXSE1r_ɳt-IޏT&{"ej[mRd Y0G&D2<;ۤjr5Ug[mRd zD_1.'aS-Mer&{ o'iVy"uUg4CIZ/}egyxf'$cy"uUG.=V&zdT67;U̱<^᭫:rӬCU 0G#lz 59NyV#TzT1vx*6nMVS*0lst+nPe iaVY6'}'~nGcst\lTW04^9E7W ]ҜbeJwlG ѩB!rOst1Z!+nK+̄}]&߷yan޸f3@!mnN+}ćNrq7W$*k+jTiN13͹WiN}'؎ *斿D r_4߿4K0G_Sg방8tw<^MV+ؿW4b<գY3K&U]N]#w|2|N37W֜=v-{\>ԡossZkM^mn^+"tٜ1\Hog6TȥʄZcu$4V*O-5#u<kZcX6TTi~LץT æZ*mRzd-)_1ULru$ϋׇ<^3 $c]ĸ.WI>!CU.+}ߵBnPrǬ}'~nNjd+Dz ȹ4ߩb<^ш!gͨS]z+Za ]*};I떻y"uUJSgB.wnRN~E:Z#ץy ѱwr__-W6FH)';G:<˕5#\Y3r_SN=pnl)'ljPmn W4?u ,ߵ+Za U};G\|;U-9;[-2e}õ+9c&T1"5з9+7Yg4Aܼ}z:h޿mV2j=#2MVk#u5<^*UN4\}, ѩB!r].'wB53!JY=4[=޿JWul6JY=4[=޿bׄP+R9E:h4xl[;pҜ"}gJ*)_9Eo~߉]w-^<^ҜUS$>t] ?Ҝm~}'~nW9d1nR9]o=1xG4x%y+USE c\fzeVbR<0fNz*<[rJF2W̳-jidI5é\&UG.߿bmRd \TE ̑5[gJFMLȚխReTZcO5UgYJLGU*T$_1ZLա2߿b} pM Qsp*AޟۚՇul7Wlkd`#kV$;G;1 ݯzEMLHٯ*r ;G/;o'i07WY*e:lԊ3hkPEz͓Z+<'y"Ve\*B*Y}i7r {w;}׈nmRzdͰ9F905t;G;1w[st\}|<^<ۤjɬ6h"-:U&Sޟۚc.'os$J jid$Ʉ0 UkPEx9މY. W¬NJ5<^2tŨ}'~n75I_ٷܥfB8YM>pn GGY=w{W8*斻yB&U|ߩb Wvs[ zȨҕ=BY3+VZ߱7WC+{yR}z'f+^aVh:ۚd+fY3l֛os<^Q3fY3l֛ossl7Wj ̓]MVhy6OjȚխRN=!CU.;ۜ+eJwf 3j=#2{<^aYu(MaE©\;G|7j.M5é\Y~9:ۑ<^!gVgj} rLss[©\Df ѩB!jwWB~G5߬&<^QsZ=vac_6 %1r*1/ s4TDaz}d/f@סo~߉R]m~+!H t}n@.az>z4ǘ#9UyZT5I޿J5_1faS-MsY=޿JWuʨs,*j.K!Vo[+Ks_11 ¦Z*c0 Ys j9Yg;jǘce[e;jǘ#Tk>Ezi$I&{ǘ9FԲp#:BFs;G;@ WTʄsܸg4}g3K꺣eJ]>z9kߒ$8TH9lg7Wj]ݹMBBzҽϪ$brӬIOrӬw4k7W ]ёf]N4\0d$9"=´Tt*sxer׬#BM1GBl:G1 w}:hkp*Wkf#-:U&S¦Z9Kl(!&[ %a6~5A޿C+LuEp*jidC+LuE@OƔךխd`,5Aޟ[5бAV-BvxeTT=ZD|n"nfN%3!s s9JuEp*s!l(!Ql(e %7#$P"l6xGHD}?Pr!Ql(Eʾl(!Qg %;B %D %vGH@ %w}GH %7#$PBl %#$PBLJ þ?j un wJȢ:wawJȆ}?Pƾ#$PB& un 6: 6 unZqGH:7l(!}?PV쎐`Cm6Թչ;B % u 6@~ν;B %}?PbU?|?Pp ~0A߿Ь.3Za8j.סcCq2ux2+bP+}džX7Wh m<^b1߱8uxEn;6?ðnM}dždux}dž⤑+b;6'wl(Na<^+L}džcCqC1&cCqi wl(nm<^ wl(nn}%(cCqцuxEP@úy"wl(nV Tf'h8)TT.f_k;tlgql "^38c H_3 :67ޯ:6~qP\;6~wemwl&}dž}džomwl(n_38Pwl(NewlS~߱8(cChyP*k/U|43z˜-kVz#WNLW\*BN$)Ҙz5G4?5AӚޕ=9_kV 9&O3sJ\бA yMVp*W̲lѩ ">+lgn=# ">y7Wh$Ʉ0|߱A cqz5G8+tp1Ϭ|V{U J >|?PxG6F6}?P&d!Pb`Cmw`Cl`C`C;B,F6}?Pl(1l(9o unw`Cm`C:w;B6BĀb6Թi}G6m#J þls~G6`#JȆ}?Pl(1F6 unqG6& %a6Թl(!k!Pb`C!Pb %F5ӕ=Eðq`C*vG6h#J þlsc;B@!Pb!Pb`C[+#J f#J ~=l(16B0:wWtG66B0:w+#J R6B0:wWT % %ܨ!Pbh!PB,ʾls % %`6Թ;B6B< unl(1l(9/ʾls % %a6Թw`Cm`C Y}?PC % %d!Pb!Pbhþlss;B(6B:7!Pb!Pbh}?Pf %F %m6ԹUR:xG6F6`C{ #Jb#JHe6Թw`CQl`C:7UxG6F6Z u9 }džоP-wl(~}džoicC3оP;6u޾P]1cC}dža;674پP}~߱E H:6~[J `wl(n4 _*0GآSSH޿%pC nl#kSޗ ȇ ߕ;6ewl~߱}dž~߱8Y}߱cChwl>}džΰ;6~WcCqQ ߤ~߱(mwl&cC ߤ{P\4پP];6-ھPx}gVSW+̄;`4ɹgYPƾ#$PB&v~Z80F.Z80Z   !#"%$&(')+*-,/.10o23546789:;=<>?@ABCDEGFIHJKLMNPOQRSVTUWYX c/F-JvD;RpQYؑl2@g?(k5T <.c$$k.;t#~PcվUt>mvpGҤIA]סK{RD#C#&ge^J{:jߥK\)].eI4[RvwHj:2M_GVOjRܡK)/mݓ}&#.R!E`u)?+jXy+Kw܊$ކѤŻCÈ ߇ymN&cyqȎ{qz;(9}/{'V J>LvM28amޏ*aBgQrnDӿ#F14QĸaVP!kus&& m? qdȶ(ƕ\WJ&+*"5SìpG<${>JrgOJ0!i?(Q#Ur;JN>|ޛU3c>ndW3=ǁ҇)—GaZc-f_ok@>|צC[0C,}*j^H0n^z釛ޛU30ٽ7Ebk?}ajü6HЭ~Ʀeì\l2wr\]E>Yia)}n^nɣ Xg2!}0+ػ535Sl+^Vfa^:\30 :b7j؆E xüfևY>V. ;ɛLYo2-jg6 kccDKݍgü66&aF!ъؘEe5ìT˶r\-Kn^:\30ٽ7fa^y&& m?y܇^+'Qa^2ݪEr:1ʂ޿?|Wk?WZ$_5/;9%C0M Wü64dyͬڵ}19|j^.bn^E:2y̦{7YhaRૌݴt0-*W?L*֗ò~U$M*4GaZT:y}ΫEGe݈ i16-,fz[=;t.Vv.i_JR}Ly)to>C.JRdoUخ]\IۧY%ee/mRӤ$uRi[Ҟ:J!E$PYؑ4)v)ɤtRevH+Re]Ӥ4);LrZ]:@ri:Aʔ{ SL*M+ >MǮ㒲uԡK.gWۧ9i[b/%Ki@ʪՑ}]RZCKI );rȲVXxo,v+2Iyqq]{Kcdt7-*e%M*4~U~tA}kiQϨ!x] ~kQ2W~7-<L;jƲvw uռ80-(B jg{/ѽ>!L_s|>6rHT׸0"2IŽPrwT5/Czq|s]ז *븏ky'G;8mKvls~Oj1{z%q(9sɳuK0ٳ-ڐ%Gg)%ِ%yFan{|eca^f:J_W3q{a4"_.|g|Himqռ88㹜{J0b~7+?k7Yma{oÈ"Ňy.jތ> +LJ>4Lvڵc-zMU6,\.*b[?ݴhԋb흣eq4iQaZT:~UmZk?Cޝ~mr}҇\n^C[Q-N!n/տxry[+<_0C(Ѯfzղ. ;^#3!|#U{ڎOGݼv->t3*Yxuya^6}$/Ѭ~Pd[k7NUog+rYh|sk8ߎL$ч^LJQ޾a^;Y_ËROv+ 3*q7b~hQlj'x}΍Sn]vk}Qٽ|:ǁgѭXz݊yFz~_w+nE.qp|Qذ3Ew5>koF8_^wGZca^cp݇BFdwtn>(bZ̨dLO:rüvYQ]8 3?LvM2~PsT|$~kq~_ok}PF1->(baDCaZfh:nE.u]9a^;Z;f&ʶf҇EL>|צkFlO>Lvܖ?(bü6->5#6&Fn>(bLü6N1 $rT#m8hO; !}5zGmע񡈌҇h-~5>뭒I2h%Ioømm帶m҇i ɣN+IZHȒa^5SK}#!}hLz7mL"9rT2H҇b0kVI(_N.+Ed>>"ac&gT5/EdZ%kwj^HfNjnc,?V?|P}$"UbnpuZB(JVh#I$}ƦDRw>VNKZ%ktH&[JC>hOa뭒NQ҇!҇bh?Bjyq("K>(_N,y!}8ۘ=hŠc뭒NQH^t$?.B0<9ۘ=cUT+'寚"w?kck*ݬ}C X{xlѨeŅ (}Pq{" 6e7ٽ7+`Mmj^׵7?yCHdü6N? ?{W6 N8#J>ktRK凡D5OwH\XllŇ:(}Qĸay<ݍzyqec&? Aj}Pr Q?2}.7SW0A9߮k|a!nr{V$ r,>oqpX~,aVQpo|\+z xDÇymnSsIյw˥PG#6{ćE\݇z? Aj-/SRcղ.ϫ9߮[R؝(s=}u>ѭ}zM}tw>>W6_.rB r_6ލذ?ذFlO>k?ݦe9Vkxa^;TMZ[HN'C$Mt{V|uzEQ޾NZc]>kg?K=o4[oȇ\V\0M R߇ ?M}$v#66.n}׎Fө݊\V;üvHЭ( ղ>ڵHL?LvM}tԇE 3*|w˩GnuF!h$'%zMܯJ8# ɫ!݈ È iaĆüvmea^;&ytDҖvI8nYaMFmPrn^;YyF!{3vѭX|MDs'üv6Ya$ïCCލذ?kGnTt5uwnE.y?d㣑40] !LgTjYdGA}Q<ǽ+/nu9üv2Z㣑40krµ>˶r\5/-_>gh҇ՖCÈ ߇yʂJ|ϱ>kdq62ݪEr:"i(/|>}W^nFrˊOpn^;rF%/n},F%>}=~jk?\׸duѐ*v6ֹ3^0߇ylpeRߌBg'XI_\yݼv4ݺ3vg@;+yZ2jlcS'xEkt0e>nE.}ü66-,uaĆ0b~h0]1dd!a^:\30]WkFp|yl>Jvq}$l,6><\ېG=|_. CMX q3Wlvռ>\wעG=l|PD6dǦxuCyG E!2~x-C >aEvmE!S >ںR|tJٵvӢGө->:jY ߴWDP5nZTh:j/GZc}\RnZTh:g6"ic}nZTh:g6˩9ևGvT_W7.~p+{MCM: rɇry-ݴ8K8LM: rɇriQqS@v9u7-*Nh:!zuXqÔH$MRrI鵦Nސ-Od-on}Ppeݴ8tb 2nZTr:1}$VwӢӉ)|PpOfGwӢ⤏SɴcG_\+!s>L6*|Ro[z琯gwK_!L_˥ѭX6vtHanwӢG1!\ !2*.+"{46![5+ ~y!"y4!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :71!\ !2*.+"{46![5+ ~y!"y4!4w_#~ ʸ A:4$VڇBFÈ"#&#SOyq0u\A}1N8MƵvN }u>뭤}E>:NՊv+rY 0"(_\<Wn럎+ӭ(d䇱^urNݼvN?3*|IWVutJ= ^x^{浣MJXy~6$-g+]qsfPre݈ g/"icnh\ U}a?->ذ}(dވsԇdQoF%rVղνwѥ#iaDCY>syBwTYؑ/_6̦el˨;v\. mYh=)!ߊA%dm!}bh>Ol_ĆH$>L$UU}b\=/dd!HڳD}8WuW&D׿D>Q|v_$fP5ZN>\2έpEpM EE!S]o} u9▓,km}їݴ8t&XnZTh:Չb<:.[>ݴ8Q|$p8GZcInZT(Qry[+<ng=Vk,3nu7-*Σ->f=Vkbyݴ8VܷhQ'|t59JDTwt5ܓVwӢGөdZѭXKnZTh: E:VnZTV ҇(MCk|tg|-!gϻiQqȣ&XW==lG{h{l0އt*3҇մMC7ƺR/nqg~Mv!Ňt* 3{+u5_ZAy7-*y;~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :71/Rͣ:Z !H 4~?! 2rGD͑$%*."p&:.2r&%:C[!:A ' :B ' Gï Z80MR VER 1.2 FILE 12345678 ?ʻ w# !ͼ ? !ͼ !) 0000 ERROR(S) ASSEMBLY COMPLETE !"*y4~!}! ~# Nwy#" j ͆go2Z22C "D "F "A 2&"&"&"&!+~m~#d^F#N#">2>2*y4*!~̢! Ã:<2*:> > > >2> :PG $0ɃUNDEFINED@@DOUBLE DEFINEDERRORREDEFINEDPUBLICEXTRN#ASEGCSEGDSEG SYMBOLS!Z w#”!I 4͌*!͏n!.:C !.*_: : #':C ; &m:C !2"_!.EJECT AHEADIN:INCLUDLIST WMACLIS^2I I:H rPe2Be2<ɗ2I 2"_!|.&>OFF  rduI|WϰAq~]ޭgqC/>ru5|ʙzrYq;F qã9AqoD&wϽW<[L>dԊ\Vq{.j|R!LߞWnZT((3>Nv+5:8 G;.a4 TgMvŠMCMg|dCE h:[=_MڊwӢGөεVXs\.X\knZTs@fPW6KknZTkG7 ݻ|ecnZT ݻq9 6tm%vӢGo&;3Ku4|MCuHW=R!L_˥ ݻ>҇/iQqȣa.эohG!_Xl,}pݴ8.S4!L_˥ѭX6vtHanwӢGb<Z^ɎMba4!m>aݴ8l;E:6Vk'oiQqT'\vɴcG_|(SiMCM"b9.븤?,vӢGөmwdǦQ&E!S]oVkQ&E!S]oVkݴ8t+"|m4㙸8NuErֽ->\wӢGө!La4VG _km]3gs:jGxFcaupOǎb^}.a4VG AGx <ךt`.^\RPsIMCU6Ȧ/5}$ ON >>:!!w# !# 2: 2!:93A<2.!"> w#w#w!" ;&!4933w#93 LIBH# 4^#V*_~ ##.!ʡ ʃw# o>GxPWʡ v6 #6 #622"_:=!6 #6E#6N#6D#Ã2R :# Æ   ;&!4933w#93 LIBH# 4^#V*_ : E: X E k:_J :I :H *}>+ʉ2Y :J ʩ:B '2B :A '2A G:B:8/*C *}o:</P!J >6 #=2I 6 #6 #6!P " : X :0  !' " m&!K z' {' *  8 0w2I #: E: X E k:_J :I :H *}>+ʉ2Y :J ʩ:B '2B :A '2A G:B j D͆ ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6 @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRIT>*W7w#"7!rø PRINT WRITE ERROR >2: Eڜ>2:2! !2!6P#6R#6N26: @2!"ø PRINT FILE CREATE ERROR >:W!/ø OBJECT WRIT>*W7w#"7!rø PRINT WRITE ERA#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_' " m&!K z' {'* >\   O >X !4 ! ~#" !" !  !2! 6ROR >2: Eڜ>2:2! !2!6P#6R#6N26COND \ELSE END ENDC ENDIF IF \ASEG rCSEG wDATA DB DDB DEFB DEFL JDEFM DEFS 5DEFW $DS 5DSEG |DW $EJEC AENDM EQU QEXTRN LIST LOCAL MACRO NAME NLIST ORG XPUBLICSPAC TITLE X*}&: &!&!# 933w#q &#,62R͌m͏!Xzs*4 UxBp#@\p##̐w# @"4̓!Z4&*46#"4*_: &!~ʽ~~#Ô&ʺ33$YM &!&!# 933w#q &#,62R&*|&#&933&!*4+6#933Qw#A6# '  ' 6#"4,"^#V*_|:C ***4>q#p#=œ"4"#'!*4"6#:' :' 6#"4̓*#"*P~#Z{  ʟ# ͵*Q#,+33>?͵͵~#F͵9~&#>#͵*>+F+N=_"4""*+"G*A#6Z#6M2 : @ڞ ʞ Ҟ 2  ͭ  ø INPUT FILE OPEN ERROR ! > ~ 4 6_>*w#"!/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒʒҒ2!"ø OBJECT FILE CREATE ERROR HEXOBJ>~ 4 6_>*w#"!/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22: @ڒ*>ʿ:ʲ>û!—!:~#"!"29ͭ ! 2ø 12345678ABC INCLUDE FILE OPEN ERROR !/ø OBJECT WRITE ERROR >2D: ZZ>22! !2!>r!22:~#ʎ€~# ڊ͵Î> > "ͣ G> ͵q# '93,!;w# &'w#'w##~'w+~'w*{4~ k*{4*y4!w#xLyL*y4 "y4*{4 "{4!2*4s#r̓:4<*y454!9%ø MACRO OR EXPRESSION NESTED TOO DEEP-STACK OVERRUN #!"""*}4"4*{4~ 6#6#R.:J y&|%!!I 4m+}%ɗ2I 2! ڈw#HÈ!'2 &ڈ'ʁw&#f'u6 #6 # ˆ6!2#'#'>2j2:33 &3*w4 ~w& &93,í#'>2j2:33 &3*w4 ~w93,93AO!0 q93,Mͳ'M0'M͠':&g &O͐&#'>~>~>2&ʈ2j#'2: "_!.&INPAGEPAGE û:&&!#=q: &#''M͆$,2.2.'  &2.͆$'!Y$6 $6#'M#,'#'My&&͐&!&;&R.*D #"D :C "F R.y&}>2C&&#͐&A&ʲ&"&:&ڨ&:&"&&"&"&:&&:&"&:H &*&ME*&*&*&:J '++~A2J 2I ## : 3'͍'͠'ͪ'3:H l'*w4y_'ѱw#s#r&~@w>H&y&yѩ&z&{&!P z' {' y&: &͍'͠'ͪ'3*w4~'O_'y|ѱw#s#r())4))))))@*e*e*++$+L+++g,,,,,,,,ADC:HL,BC/ED4A;ADC:HL,DE/ED5A;ADC:HL,HL/ED6A;ADC:HL,SP/ED7A;ADD:HL,BC/9;ADD:HL,DE/19;ADD:HL,HL/29;ADD:HL,SP/39;ADD:IX,BC/DD09;ADD:IX,DE/DD19;ADD:IX,IX/DD29;ADD:IX,SP/DD39;ADD:IY,BC/FD09;ADD:IY,DE/FD19;ADD:IY,IY/FD29;ADD:IY,SP/FD39;CCF/3F;CPD/EDA9;CPDR/EDB9;CPI/EDA1;CPIR/EDB1;CPL/2F;DAA/27;DEC:BC/B;DEC:DE/1B;DEC:HL/2B;DEC:IX/DD2B;DEC:IY/FD2B;DEC:SP/3B;DI/F3;EI/FB;EX:(SP),HL/E3;EX:(SP),IX/DDE3;EX:(SP),IY/FDE3;EX:AF,AF'/8;EX:DE,HL/EB;EXX/D9;HALT/76;INC:BC/3;INC:DE/13;INC:HL/23;INC:IX/DD23;INC:IY/FD23;INC:SP/33;IND/EDAA;INDR/EDBA;INI/EDA2;INIR/EDB2;JP:(HL)/E9;JP:(IX)/DDE9;JP:(IY)/FDE9;LD:(BC),A/2;LD:(DE),A/12;LD *D }&*F }|:C 2C *D |&+"D *F +xy"F 2C #'R.͠'y2.*}&*D }&!Z4#'!,#~2 #^#V*_'!Y$~':AQQo&)^#V!bʅ;E<͔# T&~`j G#b+/{:~; З/ʙ*_bE"_ͩ}͔#;™^.ͮ;0 ڼ))))oͪ-:.&$@$,:. 8&&G: 2 ͪ-:.&: ͔##!>;ͪ-,: :. 8&& 2 ͜-:.&:AS *.:.Ok &:.&:.o:.g++|&y&|<~ =&}>2.&".|2.: ͔#͆$$%&͜->͔#:.':.'*.|'}''>F-#>Vʔ#>^Ô#z-:.!@2 :. !:.a&>͔#: Ô#̓#&&>͔#Æ$z-:.!A2 :. 9!:. >͔#$͜-:.̓#a!:.["$: *2 5#G: Ô#͜-:.':.'*.}Ǵ': Ô#z-:.&:.&*.}&>o: 2 !͜-:.̓#!O: 2 >͔#: Ô#: >2 5#Ô#z-:. l":. ʾ":.̓#2"@2 :.̓#ұ":.["$: p&5#:.̓#$2 :.["$͔#: pv&͔#$mo?m>>:.@!#Œ":.̓#Җ":A,(BC)/A;LD:A,(DE)/1A;LD:A,I/ED57;LD:A,R/ED5F;LD:I,A/ED47;LD:R,A/ED4F;LD:SP,HL/F9;LD:SP,IX/DDF9;LD:SP,IY/FDF9;LDD/EDA8;LDDR/EDB8;LDI/EDA0;LDIR/EDB0;NEG/ED44;NOP/0;OTDR/EDBB;OTIR/EDB3;OUTD/EDAB;OUTI/EDA3;POP:AF/F1;POP:BC/C1;POP:DE/D1;POP:HL/E1;POP:IX/DDE1;POP:IY/FDE1;PUSH:AF/F5;PUSH:BC/C5;PUSH:DE/D5;PUSH:HL/E5;PUSH:IX/DDE5;PUSH:IY/FDE5;RET:C/D8;RET:M/F8;RET:NC/D0;RET:NZ/C0;RET:P/F0;RET:PE/E8;RET:PO/E0;RET:Z/C8;RET/C9;RETI/ED4D;RETN/ED45;RLA/17;RLCA/7;RLD/ED6F;RRA/1F;RRCA/F;RRD/ED67;SBC:HL,BC/ED42;SBC:HL,DE/ED52;SBC:HL,HL/ED62;SBC:HL,SP/ED72;SCF/37;+:;BIT @!CALLDJNZ7 IM IN JP JR  OUT !RES !SET !RLC !RRC !RL !RR !SLA !SRA (!SRL 8!LD @!ADC u#ADD u#AND M#CP M#OR M#SBC u#SUB M#XOR M#RST l!INC A!DEC A!ͪ-!.. ~6#†-,ʜ-&ͪ-;!&-:.k·->&2.m-n-:.&&y}'|&".<'!ME".".(.>@2..)&2:33A..3y ..:. 2.R.|>.}F.:.2.:.G*.:.O̓x(2G.xŸq.GU.".2.y2.33":.["Ң"!#:."#ɇ͔#͆$͔#>6͔#$͆$G: v&Ô#:.@&!%#:."#G &x"&<&O ~Ĕ##~&Ô#:K[*{**!1!!2CS"s"":.["&͔#: ͔#͆$͜-:. d#: F͔#͆$:.̓#5#G: Ô#z-:.'P#$kŠ#>& (?*I-̥#2#!#Ê$@Ҵ#''''''!.#!.:Y$O~O#^#V#"}$p$> ${ZW> $>0$'y!Z$o|gF>0$'AON%{̈́&>0Q$lyN%z̈́&f$ yB2X y z$ZP!.Ê$!.#*y4:j"w4ͩ$%$%!~s&2!o&6#w#w#6*w4 "w4~ N> $>$y$$#^#V:1%>.%$%:*&%:*&ƌ2r&"p&}%%"p&>ƀ2r&>2o&*w4s&2:H :>y»%}:o&ʡ%ҡ%_:&G:r&¡%*p&&z¡%{¡%s&*o&&w!o&4%&"p&>2o&y2r&2s&%"s&yO:&2r&&"p&>2o&:r& %>2o&*}$u&2%:o&*p&U\"p&!o&~G>::j6&~O#&2o&~W&#O6&2o&W&> > Z& h&0:&G:r&¡%*p&.:.O:.ʒ..".:.O*.:.GU.-:.k&2.*.*.!0..O!C/~.#F#~#foɷ####.2:73 ?/.?/!l/33~>/O#/ѱ6/###/F#~#fo\0*1/1+0-0&1^"1=\0>u0<0NOT 0RES 0MOD 1SHR F0SHL .0AND 1OR "1XOR 01EQ \0GT u0LT 0UGT 0ULT 0HIGH/LOW /y&>1x&:.2.‡.2.lgÇ.y&>1x&:.2.‡.2.gÇ.y&x&Ç.ͅ1x0xʇ. )<0ͅ1xʇ. |g}oM0ͅ10}o0!Ç.!Ç.ͅ10+|o0i0ͅ10|o0i0ͅ10i0|i0o0ͅ10o0i0ͅ1|'.!z0͞10Ç.&Ç.>1 Ç.O10Ç.yoxgy&ͅ1x&}/o|/gÇ.ͅ1xgyoÇ.ͅ1xgyoÇ.ͅ1xgyoÇ.:.|1y|1o1:.|1o1:.o1:.2.:.2.&:.O2.:.2.Oo1ͅ1͞1Ç.!x@3yʳ1 é1@3ͅ11Ç.ͅ11*.Ç.}1&!".|x@3ᯰ@3 1@3 ".@3".*.@3".*.93!'K2(g23:҇20I3Ç2 '_2%$&eoK2'U2:2=222R.:2<22)0 mnemonics are a great improvement to 8080. Thought was given to logical, universal mnemonics that are much easier to remember and use. I learned assembly language on the 8080 and resisted the change to Z80 at first. But after using Z80 mnemonics for a short time I became very unwilling to do anything with 8080 code. Now I run almost every 8080 program that comes in through a 8080 to Z80 translating program (XLATE2.COM on Kaypro disk #17). Even if you are writing programs for the 8080 it is still far easier to write in Z80 mnemonics. There is a special listing command that flags Z80- only instructions for this very reason (described later). Macros..................................................................... Macros are a way of writing subroutines in assembly language and then calling the subroutine by entering the 'macro name' into the source. The macro may be called as many times as necessary anywhere in the program. When the assembler is operated, the lines of source code that & 2–2:33$&3yʲ2y &>&>O!33.2~# y2!2:!2!93+6 2933:30 3w #9333_Z?139013%$!ɿK2(g` >O>GͶ393Hʈ3͡393Oʈ3Qʈ3͎393Bʈ3393Dʈ33&33!930)oÑ3!930)))oä3!930 3 ))))où3!930  o& 33!3!33" 4*y4"w433~O4+4#4*w4N#~#fo*w4 4;4ø NOT ENOUGH MEMORY *y4"w4"y4:4<54w#f46#p#p44[544B C D E H L A AF BC DE HL SP IX IY I R NZ Z NC PO PE P M $  Documentation for Z80MR............................A Z80 Macro Assembler ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Introduction ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Z80MR ismake up the macro will be inserted into the file by the assembler. Note that using a macro does not reduce the size of the object code that is produced since all the lines of code that make up the macro definition are assembled into the object file at assembly time. This is called expanding the macro. By using the *MACLIST ON option, the lines of code produced by the expansion of a macro are listed in the .PRN file. Then the code can be examined and at times optimized in certain locations. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Assembler Syntax ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Components and General Form of Assembly Language Programs.................. The structure of an assembly language program is more important to an assembler than the actual instructions you write. A program that would run beautifully can fail to assemble if the syntax is not correct. A program with no errors at assembly time is not guara a Z80 macro assembler with syntax closely following RMAC and MAC. It assembles standard Z80 mnemonics into an Intel Hex format. The resulting file (which has a .HEX extension) can be translated to a .COM file with LOAD.COM (on your CP/M disk that you received with your Kaypro) if it ORG's at 100 (hex). If it ORG's elsewhere the .HEX file may be read into memory and manipulated with DDT.COM. Why Z80.................................................................... The assembler you received with your Kaypro (ASM.COM) is an 8080 assembler. The Kaypro actually runs a Z80 c.p.u. The reason this is possible is that the Z80 actually runs all of the 8080 instructions but in addition there are more instructions unknown to the 8080. The extra instructions were designed for increased speed, easier programming, and more compact code. For this reason it is to your best advantage to program in Z80 code for the Kaypro. Z80 Mnemonics.............................................................. Z8nteed to run correctly ( or as expected ). The assemblers report of 0 errors means that it understood all of the instructions you entered, not that your program is logically correct. Fields..................................................................... Assemblers are almost always field oriented some to a greater degree than others. A field is a flexible position in the line of code with respect to the right margin. This assembler recognizes 4 fields in an assembly language source line. label operation operand comment The assembler knows when it has reached the end of a field when it sees a 'field delimiter'. This can be a space or a tab for this assembler though some require tabs so it is a good habit to always use tab characters as delimiters. Label Field................................................................ A symbol is a word used to represent a number. Symbols that refer to addresses are called labels. The assignment of a number to a label can either be uage this is the case. The first line OR's the accumulator with the accumualator (used to see if the accumulator contains a 0). Notice that the second line uses the operand field to contain the condition for a conditional jump (in this case the zero flag). The third line uses the operand field to contain both the target register for a load and the number to load. The last line is an unconditional return which uses the same operator (RET) as the conditional return but does not use the operand field because there are no conditons to place there. This structure makes Z80 programs much more readable than 8080 programs as well as making the instructions easier to remember. The following is the same code written with 8080 mnemonics. Notice the different philosophy on the use of the fields. GOBACK: ORA RETZ MVI A,0FFH RET Also the LD command in the Z80 is used for all data moves while 8080 users must remember a different mnemonic for different types of moves. 8080 Z80 MOV H,A LD H,defined as the lines below TEN EQU 10 START EQU 100H or calculated by the assembler as an address for branching instructions. START: JP FINISH NOP NOP FINISH: JP START Also notice that the label is optional and is only for the programmers conveniance. Labels must appear in the label field. Some assemblers allow you to indent labels but this one won't. START EQU 100H START: JP FINISH Will give you a problem. The EQU must be in the operation field and the label in the label field. Most assemblers require that the undefined labels be terminated in a colon but this assembler does not require a colon for symbols in column 1. START JP FINISH will not generate an error but colons are another good habit and also make your code more readable. This assembler only examines the first six characters of any label or symbol so that if the following labels were used in the same program FINISH1 EQU 1000H FINISH2 EQU 2000H A 'D' error (duplicate symbols) would be generatA MVI H,00 LD H,00 LXI H,0000 LD HL,0000 The Comment Field.......................................................... Comments are not limited to the comment field and can actually be the entire line. All assemblers recognize the semicolon as the beginning of a comment and most ignore the rest of the line. For compatability between assemblers it is a good to begin comments with a semicolon. But for this assembler the following methods of inserting comments are good syntax. 1. Beginning a line with an '*' in column one causes the assembler to ignore therest of the line except if one of the assembler commands (described below) immediately follows the asterisk (no embedded spaces). 2. A semicolon will cause the assembler to consider everything following it to be considered a comment. 3. The first blank encountered following the beginning of the operand field will cause the assembler to consider the rest of the line to be considered a comment. ***********************************ed. Operation and Operand Fields............................................... The operation field follows the label field and may either contain a Z80 op code mnemonic, an assembler directive (or pseudo op), or a macro call. Assembler directives and macros are described later in this file. This field will usally contain the mnemonic for a Z80 instruction. Some Z80 instructions only use this field while others contain an operand which will be located in the operand field. GOBACK: OR A RET Z LD A,0FFH RET The way Z80 mnemonics were designed, the number of nmenonics in the operation portion of instructions is kept to a minimum since the operands really distinguish the differences between similar instructions. The first line above is a good example of this. The operation is an 'OR' operation on the number in the accumulator (implied) with another register. It makes sense that the operand should be the register containing the other number in the 'OR' operation. In Z80 assembly lang******* ;An adventure in Comments * A short tale START: JP FINISH ; finish this story NOP ASM can't handle this FINISH: RET Thats all folks Would assemble with no errors. Comments do not appear in the object code. Numbers and Bases.......................................................... The assembler will accept numbers in HEX (base 16) BINARY (base 2) or DECIMAL. Hex numbers must end with an H and binary numbers must end in a B. Decimal numbers should have no suffix letter. When a HEX digit begins with a letter, the letter should be preceded with a 0. LD A,0F3H OR 01001000B LD HL,4000H+28 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Commanding the Assembler ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: The primary responsibility of the assembler is to translate Z80 mnemonics into object code. The assembler also recognizes certain commands and directives that the programmer can use to manipul0H ; ; LD DE,MES ; LD C,9 ; CALL 5 ; RET ; ;MES: DB CLRSCR ; DB ESC,'=',12+20H,12+20H ; DB '*Your Message Here *',CRLF ; DB '*Or Here*','$' ; ; END ; ; If you've been waiting for an example to enter assemble ; and run, try this one out. Just enter it (with out the ; semicolons of course) assemble it and run it as described ; in AZM-COM.DOC. ; ; The program clears the screen, positions the cursor at ; row 12 column 12 and prints the message using the BDOS ; function 9 (print string). ; ; The symbol CLRSCR is defined by an EQU to the hex code to ; clear the screen on the Kaypro (^Z). ; ; The cursor positioning sequence on the Kaypro consists of ; the two lead-in characters (escape and an equals sign) and ; then the row+20H and the column+20H. ; ; Since the next bytes are just a carriage return, line feed ; pair the second part of the message will appear at the ; left side of the screen. We could include extra ate the assembler's output. These are often referred to as 'pseudo-ops'. This assembler requires these pseudo-ops to be in upper case. A description of these commands follows: ORG ; Sets the origin of the code or section of code. Actually ; it sets the reference number that the assembler uses to ; generate addresses for labels and instructions. ; could be a number or a previously defined symbol. ; e.g. ORG 0 ; ORG START END ; Determines the end of an assembly language program. ; if present describes the first executable instruction of ; the program. DW wordlist DEFW wordlist ; Both of these have identical meanings. In assembly language ; programs, 8 bit values are called bytes and 16 bit ; values are called words. Addresses are assembled with the ; most significant byte (MSB) following the least significant ; byte (LSB) because this is how the microprocessor handles ; these values. The DW pseudo-op allows us to describe thesDB's to ; position the cursor anywhere on the screen if we like. ; ; BDOS function 9 (summoned by loading a 9 in the C register ; and calling 0005H) prints the characters it finds at the ; address in the DE registers until it sees a '$'. DS n DEFS n ; Reserve data space ( n bytes ). This is used to position ; allocate or label data storage space in a program. n is ; a number describing the number of bytes reserved. ; DS 16 ; Reserves 16 bytes. The next instruction will be located ; 16 bytes from the location counter when the DS was ; encountered. label EQU ; ; The EQU sets the label equal to the expression. The ; label should not be terminated with a colon when used ; with an EQU pseudo-op. The label can be any symbol ; (byte or word) and the a number in any of the ; following forms: ; SWEET EQU 16 ;decimal ; SWEET EQU 10H ;hex ; SWEET EQU 00010000B ;binary ; ; With this assembler the EQU must be located in te ; values in the way we are used to (MSB first) and still ; assemble correctly for the processor. ; DW 8000H ; will assemble the same as ; DB 00H ; DB 80H ; ; If more than one word is to follow a DW following values ; should be seperated by commas ; e.g. DW 8000H,0F000H,0000H ; The wordlist can also be symbols ; e.g. START: JP FINISH ; DW START,FINISH ; FINISH: JP START DDB wordlist ; This pseudo-op is a way of assembling 16 bit values with ; the MSB first (opposite of DW). ; DDB 8000H ; will assemble the same as ; DB 80H ; DB 00H DB bytelist DEFB bytelist DEFM bytelist DATA bytelist ; These four pseudo-ops have identical meanings. The bytelist ; can be one byte or multiple bytes seperated with commas. ; The bytes can be any mix of symbols, ascii characters in ; quotes, or numbers on the same line. This is familiar ; code in Kaypro programs: ; ;ESC EQU 1BH ;CLRSCR EQU 1AH ;CRLF DDB 0D0AH ; ; ORG 10he ; operation field. ; A label defined with an EQU cannot be redefined later ; in the program. label DEFL ; ; This assigns the value of the to the label like ; the EQU pseudo-op but a label defined with a DEFL can ; be redefined later in the program. *INCLUDE ; This pseudo-op causes the assembler to stop assembling ; lines in the file it is presently in and read in the ; file . It then begins assembling lines in this ; included file until it reaches the end of the file when ; it returns to the original file and resumes assembling ; lines in it once more. The can be any CPM ; filename.ext though if the extent is left off it looks ; for the given filename with an extent of .LIB. The asterisk ; must appear in column 1 with the word INCLUDE immediately ; following with no embedded spaces. ; ;*INCLUDE DRIVER.AZM ; will begin assembly on ; the file DRIVER.AZM ;*INCLUDE Z80MACRO ; will begin assemblys assigned the high byte of a ; 16 bit value .LOW. ; byte value is assigned the low byte of a 16 ; bit value Conditional Assembly Operators ( return TRUE or FALSE to IF ) = ( or .EQU. ) ; logical equivalence > ( or .GT. ) ; greater than .UGT. ; unsigned greater than < ( or .LT. ) ; less than .ULT. ; unsigned less than Listing Options Pseudo-Ops................................................. There are a number of listing options. All of these options only effect the print file (.PRN). The options include some for debugging as well as some for the actual format of the file on the page. The .PRN file is the basic tool assembly language programmers have for examining the output of the assembler. The pseudo-ops beginning with an asterisk must begin in column 1. *EJECT ( or EJEC ) ; The next line of the listing should be placed at the top ; of the next page. *HEADING ; Place the text ( following this command ) on the top of ; each page. Usu on ; the file Z80MACRO.LIB ; Conditional Assembly Pseudo-Ops............................................ IF ELSE ENDIF Conditional assembly is a way of writing a single program so that it can be assembled different ways or with different options by only changing a couple of lines of codes. When the assembler encounters an IF pseudo-op it evaluates the symbol . IF is non-zero it assembles the following lines until it reaches an ELSE or an ENDIF. If is 0 the lines are ignored until the assembler encounters an ELSE or an ENDIF. If the ELSE is encounter the assembler begins assembling lines again. The ENDIF pseudo-op causes the assembler to resume assembling all lines. You can not have an IF without an ENDIF. Any of these pseudo-ops must appear in the operation field. TRUE EQU 0FFH FALSE EQU 0 KPRO2 EQU TRUE KPRO10 EQU FALSE IF KPRO2 BITPRT EQU 1CH ELSE BITPRT EQU 14H ENDIF Operators.................................ally used to date the listing file. TITLE 'text' ; Place the text in the quotation marks (either double or ; single on the top of each page in the listing file. SPAC n ; Leave n blank lines in the listing. Used to leave white ; space in the file with out using a page break. *LIST ON *LIST OFF ; Turn the listing on or off. This is usually used to omit ; long comments or certain sections from the .PRN file. *MACLIST ON *MACLIST OFF ; Turn the expansion of macros on or off. Seeing how the ; macros are being expanded is handy for optimizing code ; but can waste paper when that is no longer the area of ; interest. LIST options NLIST options ; These pseudo-ops allow you to turn any of the supported ; listing file options on (LIST) or off (NLIST) without ; changing the other options. Both of these pseudo-ops ; must be followed with one or more of the following option ; letters. If these pseudo-ops is used some options are ; on by default ( marked with (on) in the f................................. Operators allow the programmer to make the assembler do arithmetic and logical operations. They are usually used to manipulate operands or generate symbols. Some of them are used to create tests for conditional assembly. There should be no embedded spaces when using these operators as the first blank encountered terminates the operand field. The operands may be symbols or numbers in any of the bases. The operators supported by this assembler are: Arithmetic Operators + ; arithmetic addition. - ; arithmetic subtraction * ; arithmetic multiplication / ; arithmetic division (truncating the result) Logical Operators (Bit Manipulation) & ( or .AND. ) ; logical AND operation ^ ( or .OR. ) ; logical OR operation .XOR. ; logical exclusive OR operation \ ( or .NOT. ) ; logical inversion .SHR. ; shift left operand to right by right operand .SHL. ; shift left operand to left by right operand .HIGH. ; byte value iollowing list. ; ; A ; List all bytes in DB, DW, DDB, etc. Otherwise ; ; only the bytes that can fit in one line are ; ; included in the listing ( others are implied ). ; B ; Place symbol table into object file. ; G ; Place system generated symbols into object files ; I (on); List lines of conditional code following a false ; ; conditional. If off only the code actually ; ; assembled is listed. ; M (on); Expand macros in listing files ; O (on); Produce an object module. That is show the bytes ; ; being generated by the assembler otherwise just ; ; the source and (optionally) macro expansions. ; R ; use absolute displacement for JR and DJNZ ; S (on); List source code in listing file ; T (on); List symbol table in listing file ; X ; Generate and list cross references in listing file ; Z ; Generate an error for Z80 only opcodes. Allows you ; ; to write in Z80 mnemonics for an 8080 processor. ::::::::::::::::::::::::::::::::::::: 8080 will see a few of these. P ; Phase error. A 2 pass assembler builds a symbol table on ; the first pass and generates the object code on the second. ; If a number that it calculates for a symbol on the first ; pass does not agree with a number it generates in the ; pass this error is shown check the symbols in the line ; the error appeared. Q ; Questionable operand. Actually theres no question about it ; it is a bad operand. Typo's give you these as well as ; blowing op code format. Usally easy to find your mistake. S ; Syntax error. You broke one of the syntax rules described ; above. T ; Symbol table full. Not much you can do with this except ; pare down the code. U ; Undefined symbol. You used a symbol but forgot to define ; it in with an EQU. V ; Value error. Usually means you are trying to do a 16 ; bit operation with an 8 bit number or the other way ; around. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Error Reporting ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: When the assembler is unable to understand what you are instructing it to do it generates an error message. These are almost always due to typo's or bad form. It displays the error code below and the line the error was found on to the console and also displays the error codes in the listing file. D ; Duplicate symbol definition. You will see this error ; message if you do any of the following: ; Use the same symbol twice. ; FORMATX ; FORMATC ; will generate an error (only 6 significant ; characters). ; Upper and lower case symbols with the same letters ; FORMAT: ; format: ; are identical to the assembler. ; Assigning a different value to a symbol that was ; previously defined with a EQU pseudo-op. ; If you are going to reassign use DEFL. E ; Relocation error. I believe this occurs if the assembler ; cannot reass: Macros ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: The macro is a powerful method of writing assembly language programs. It makes it possible to write assembly language programs in a way that resembles higher level languages. In fact by creating a library of macros you are in essence creating your own language, and your own compiler. Often times in assembly language (particularly writing for CP/M) each program contains source lines that are used again and again in other programs. By using macros the routines only need to be written once and then may be called in any program. The best thing about a macro library is that only the macros that are called produce object code. So there is no penalty in having a macro library that is large and complete even if you are only going to call one macro. Macros have a form that is unique and must be followed closely for correct results. The general form of a macro is name MACRO #parameter1,#parameter2,.... instruign an address as expected. F ; Format Error. You will see this if you break any of the ; rules regarding field use and macro format. K ; Keyword error. This means you tried to use one of the ; assemblers reserved words or pseudo-ops as a symbol. ; ORG: JP END ; NOP ; END: JP ORG ; is in very bad taste. L ; Label error. The attempt to assign a value to a lable was ; unsuccessful. Also remember that labels do not end in a ; colon when preceding EQU. ; START: EQU 100H ; is bad news ; START EQU 100H ; is perfect M ; Missing label. The symbol you are using was never defined. N ; Macro nesting error. Macros can be nested (that is a macro ; can call another macro) but if the nesting gets to deep ; the assembler will quit and give you one of these. Also, ; you can only call macros that were previously defined. O ; Op code error. If you see this, look in the operation and ; operand fields. Consult the mnemonic table. People ; switching over fromction instruction instruction . . . ENDM The name is the symbol that will be used to invoke the macro. MACRO is a keyword that will indicate to the assembler that a macro is being defined. The parameters always must begin with a '#' sign in macros and they are seperated by commas. The instruction can be Z80 instructions, or any of the assembler commands listed above incuding conditionals. The instruction can also be another macro call (called nested macros) but only if the nested macro has been already defined. The ENDM keyword tells the assembler that it has reached the end of the code that must be assembled when this macro is called. Do not use a colon behind the macro name. The previous message program example can be rewritten to look like this with macros. ORG 100H *INCLUDE Z80MACRO BDOS PRNSTR,MES RET MES: DB ESC,'=',12+20H,12+20H DB '*Your message here*' DDB CRLF DB '*Or here*' END With the following macro library called Z80MACRO.LIB ;Call Bmples and as much information as I could come up with on this assembler. AZM-COM.DOC How to get from an assembly language source file to a .COM file. Includes options for output control. PHASE.DOC How to get around the phase and dephase operators found in M80 files. MAC-AZM.DOC What you need to know to change .MAC (MicroSoft's M80 assembler source files to .AZM files. ........................................................................... Example Z80MR source files PHASE1.AZM Sample program described in PHASE.DOC ........................................................................... Z80.COM *.ZQ0 This is the Crowe assembler extensivly modified to do conditionals, as well as a number of other new tricks. To view the source and documentation files, create a blank formatted disk with system tracks and place it in drive A, with a copy of user #25 in B. Make sure you are logged onto drive A and then enter B:UNSQ B:*.ZQ0 and the file unsqueezer will do tdos function #FUNCT using paramater contained in #DE ESC EQU 1BH ; ascii escape CRLF EQU 0D0AH ; ascii carriage return line feed PRNSTR EQU 9 BDOS MACRO #FUNCT,#DE LD C,#FUNCT ; FUNCTION NUMBER GOES TO C LD DE,#DE ; GET PARAMETER CALL 5 ; CALL BDOS ENDM We could also rewrite the cursor positioning sequence into a macro. Note how just this small example can save us time in future programs. Also, the macro library is a great place to keep frequently used symbols like ESC and CRLF. But what about using address symbols in macros? How can we avoid the 'D' error if we call the macro more than once. The other keyword unique to macros is LOCAL. This makes the assembler generate its own unique label every time the macro is expanded in a program. Following the word LOCAL ( which must be on the second line of the macro ) are the symbols we want the compiler to generate unique labels for. These symbols must also be proceded with a '#' sign. AJUMP MACRO LOCAL #ADR_Z,#BACK OR A Jhe rest. The assembler itself is Z80.COM (not squeezed) and the documentation for it is in the file README.Z80. Yes it assembles itself! ............................................................................ To verify the files on this disk enter: CRC ............................................................................  Most of the assembly language programs released on Micro Cornucopuia disks are set up for the M80 assembler. If you've been wondering what the .MAC extension is for, those are M80 source code programs. Many of the people that got this disk did so to assemble the Kaypro Tinkerkit (source of the rom monitor and bios) without spending $150 for M80. It can be done. For the most part .MAC files can easily be translated to .AZM with very few changes. Unfortunately M80 is as extremely versatile assembler which when used to its full advantage contains some pseudo-ops and directives that Z80MR does not understand. I will reveal tR Z,#ADR_Z LD A,40H JR #BACK #ADR_Z: LD A,04H #BACK: LD DE,0 ENDM The macro itself is not really useful but it is correct and shows the use of local labels. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  User Disk #25 Z80 Macro Assembler This disk contains a Z80 macro assembler that is the nicest I've seen in the public domain. We spent quite a bit of time documenting this to find all the syntax requirements so you didn't have to find them out the hard way (assembler errors). We intend to make this the target assembler for all asembly language source files we put out on disk from now on. If you find any 'GOTCHA's' with this assembler please send them in so we can keep this assembler fully documented. We are also going to put together a macro library for this assembler. If you've got some that you'd like to donate, send them in. Z80MR.COM The Z80 macro assembler itself. Z80MR.DOC This is our documentation file crammed with exahe most common of these and provide some help on getting around them in this file. First things first......................................................... Rename the file to have a .AZM extension. Edit the file. Near the beginning of the file you will see the pseudo op that tells M80 what mnemonics you will be using. M80 can handle both Z80 and 8080 mnemonics. You can even switch in the middle of the program. Two pseudo-ops .Z80 and .8080 tell the assembler which mnemonics to recognize. If there is a .Z80 there delete it. If there is a .8080 there you will need to run the program through an 8080 to Z80 translator (like XLATE2.COM on disk K17). At this point what I usually do is run the program through the assembler. The assembler is very good at finding errors, so I let it tell me what it doesn't like. You can run the program through the assembler without generating any output files (see AZM-COM.DOC) and still get the error report on the console. A ^P before running the assembler wil........................................... The M80 macros go through Z80MR pretty well for the most part. There are some syntax changes to be made. Precede the parameters with # signs (including locals). Also there are some macro pseudo-ops that are not supported (also not widely used). If some one writes Z80MR macros to substitute for these (and a MOD operator) please send it in and we'll include it in the macro library that we are developing for this assembler. .phase and .dephase........................................................ These are used to make the assembler generate label addresses for some other part of memory than where the file will be loaded. The file PHASE.DOC offers some alternative ways of doing this. ; ; TITLE 'README.Z80 J.G.OWEN 2/12/84b' | LISTW 255 | SUBLN 0 ;::::The Reborn CROWE (TH/DC/JGO) Z-80 Assembler. ; ;Pat Crowe (England) wrote this assembler originally; Thomas Hameenaho ;(Sweden) fixed some bugs; and Dana Cotal dump to the printer as well. Now you can go back into the file and fix the syntax where the assembler generated errors. Dual mnemonic files........................................................ XLATE2 is a great translator on 8080 only files. It also will only translate the 8080 mnemonics in a file that has both. Unfortunately there are a couple of Z80 mnemonics that are the same as 8080 mnemonics and will be dutifully translated by XLATE2. The problem is that the mnemonics are the same but the instructions they represent are not. So the file will assemble OK but will run with unpredictable results. An example. JP is a valid Z80 mnemonic. It is also widely used since it is an unconditional jump (JMP in 8080) JP is also a valid 8080 mnemonic. It is the jump on parity instruction. So a Z80 JP is translated as if it was the 8080 JP which will make it JP P in the output file. Bad news. This in itself is enough to make it too undependable to use on dual mnemonic files. To avoint (Micro Cornucopia) did much of the ;CP/Ming of the code. James Gregor Owen (me; Long Island) is responsible for ;subsequent revision to this point. ; ;The assembler is a CP/M two-pass Z-80 assembler with a command file named ;"Z80.COM". Using it is quite similar to using the CP/M "ASM.COM" assembler, ;where the drives for the various files are specified by using letters in the ;extension field; the source is assumed to have a "Z80" extension. "Z80 ;Z80.ABZ" would cause the assembler to assemble itself, finding the source on ;A, putting the .HEX output on drive B, and generating no listing. The CP/M ;utility LOAD has to be used to make a .COM file out of the .HEX file. "Z80 ;README.AZX" would send the listing of this file to the console. A "T8" option ;must be used when listing .PRN output ("PIP LST:=README.PRN[T8]"). ; ; ;::::Syntax Notes. ; ;The assembler expects a source file written in standard Zilog mnemonics, in ;upper or lower case (case has no syd the grief you can do one of two things: Translate the 8080 sections by hand if they are small enough. Split the file into smaller files where the mnemonics change. Run the 8080 sections through the translator. You can let the assembler rejoin the files using the *INCLUDE statement or use pip or your editor to rejoin and assemble the whole mess. What I'd really like to see is someone rework XLATE2 so that it would stop translating when it saw .Z80 (and also comment the pseudo-op out) and start again when it saw .8080 (and comment it out as well). Also some of the other minor syntax changes could be fixed as well. Yes XLATE2 can be assembled with Z80MR (it is a .MAC file). After removing the .Z80 at the beginning of the file the only error I got was for the MOD operation on the version number (MOD not supported by this assembler). My solution, just enter the version number there. Having the assembler figure out the ascii just wasn't that important. Macros..........................ntactic significance). Any symbol starting ;in the left-most column will be processed as a label; alternately, the first ;symbol on the line, if it is succeeded by a colon, will be treated as a ;label. A label on an ORG line will assume the value of the ORG. ; ;Sublines: ; ;Like ASM, the Reborn CROWE (TH/DC/JGO) Z-80 assembler allows multiple logical ;lines: "LD A,(WIMWAM) | BLIP: OR A | JR Z,WOMBAT". The subline delimiter is a ;vertical rule, instead of ASM's exclamation point. If a label is not directly ;next to the subline delimiter, it must have a colon. ; ;Other: ; ;Examination of the assembler source which can be assembled correctly by ;itself should help to resolve syntax questions. ; ; ;::::Expression Operators. ; ;+ Monadic plus. ;- Monadic minus. ;.NOT. or \ Logical NOT. ;.HIGH. Value of most significant byte. ;.LOW. Value of least significant byte. ;.RES. Result. ;** Exponentiation. ;* Multiplication. ;/ Division. ;.MOD. Modulo (remainder). finished before the new file is opened. An extension of "Z80" ;is assumed unless the extension is specified. A period will specify no ;extension, i.e., "CHAIN 'FILENAME.'". A drive specification is allowed. ; IF, ELSE, ENDIF ;If the argument to an IF is non-zero, then the code between the IF and a ;subsequent ENDIF or ELSE is assembled; if it is zero, then the code is not ;assembled. If an ELSE is encountered, the sense of assembly is reversed; the ;sequence is terminated with an ENDIF. Any kind of IF/ELSE/ENDIF error is ;treated as if it were an ENDIF. No nesting is allowed. ; NLIST, LIST ;Listing will be suppressed after NLIST until a subsequent LIST appears. ; LIST arg ;With an argument, LIST specifies how many lines of HEX will be listed for ;each physical line, and has no effect on LIST/NLIST status. Zero is not ;allowed. ; LISTW ;Specifies the width of listing lines; default is 79. ; EJECT ;Causes a form feed and a header to be inserted i 7.MOD.3 => 1. ;.SHR. Logical shift right. ;.SHL. Logical shift left. ;+ Addition. ;- Subtraction. ;.AND. or & Logical AND. ;.OR. or ^ Logical OR. ;.XOR. Logical exclusive OR. ;.EQ. or = Equals. 7.EQ.7 => 0FFFFH. 7.EQ.6 => 0. ;.GT. or > Greater than. ;.LT. or < Less than. ;.UGT. Unsigned greater than. ;.ULT. Unsigned less than. ; ;Parentheses and square brackets may be used interchangeably in expressions, ;but NOT to indicate indirection. "LD A,[25]" loads the accumulator with 25 ;but "LD A,(25)" loads the accumulator with the data contained in location 25; ;this provides a handy way of avoiding the latter case when using complicated ;expressions. ; ; ;::::Pseudo-Ops. ; ; ORG ;Sets the assembler program counter. ; EQU ;For assigning a value to a label (can appear only once per label). ; DEFL ;Also assigns a value to a label but can be used to assign different values to ;a label at different places in the program. ; END ;Terminates assembly. An optional anto the listing. If an ;argument is present, then ejection only occurs if the specified number of ;lines exceeds the lines left on the page. ; SUBLN 'x' ;Changes the sub-line delimiter from the default '|' to the specified ;character, starting with the next physical line. If you pick the wrong ;character you can get into big trouble (i.e., don't use '*', '(', etc.). ; ; ;::::Errors. ; ;Errors are indicated by a letter in the left-most column of the listing; ;lower-case signifies that the line contains more than one type of error ;(single or multiple errors of the same type will result in a capital letter). ;Some of the errors are: ; ; S ;Syntax. Covers a multitude of sins, but is particularly popular when you ;give the wrong arguments to an op-code or a psuedo-op. ; U ;Undefined symbol. ; M ;Multiple definition of a symbol. ; V ;Value. I've only seen it for overflow -- trying to stuff a word-size value ;into a byte-size location. ; rgument will appear in the appropriate ;.HEX record. The assembler will treat an end of file as an END statement. ; DEFB ;Defines the content of one byte of memory at the address the pseudo-op ;appears in the program. ; DEFB 'x' ;Same as above but defines the byte to be the ASCII code for the character ;between the quotes. ; DEFW ;Defines the contents of two bytes of memory. ; DEFS ;Reserves bytes in memory beginning with the address at which the pseudo-op ;appears. ; DEFM 'xxxx...' ;Defines the contents of memory to be the ASCII string specified; produces an ;error if the string is too long. ; TITLE 'xxx...' ;Defines the title that will appear in the listing header. When the assembler ;prints errors to the screen, they will be accompanied by the appropriate ;title. ; CHAIN 'FILENAME' ;Causes the current source to be abandoned, and source lines to be gotten from ;the file named. If CHAIN appears on a sub-line, then the current physical ;line will be B ;Balance. The expression evaluator is upset about parentheses. ; L ;Line is too long; the input source line exceeded the 80-character limit. ; I ;Illegal character. ; P ;Phase; a symbol assumed a different value in pass 2. Unfortunately, it's up ;to you to figure out why. ; ; -end- eject LISTW 79 ORG 100H SUBLN '|' SUBLN '@' | DEFM 'SING THE HAPPY SUBLINE' SUBLN '|' @ NOP @ NOP @ NOP ;DELIMITER CHANGES NEXT LINE. VAR1: DEFL 12 | VAR2: DEFL 12 | VAR3: DEFL 13 ;ARGUMENT ERRORS: SUBLN 25,35 TITLE ; 1234567890123456789012345678901234567890123456789012 TITLE 'COME HERE WATSON I NEED YOU. OH HAPPY DAY. TOO LONG.' ;STRING TOO LONG. DEFM 'COME HERE WATSON I NEED YOU. OH HAPPY DAY. TOO LONG.' CHAIN EJECT 25,12 LISTW 2,3 LISTW ;VARIOUS ERRORS: OR A | WAMBAM | IF VAR1.EQ.VAR3 | OR B | ENDIF | OR C ;ERROR IN SUBLINE. ;ASSEMBLER LIKES TO CREATE 4 NOPS FOR MANY SYNTAX ERRORS, WHICH COULD ;BE HANDY FOR PATCHING IN VERY LONG ASSEMBLIES. ;THE FOLLOWING LINEALUES, SIGNIFIED ;WITH THE "=" SIGN ... WIFBAT EQU 17H WIMBAT DEFL 5432H | LD A,(17) | DEFM 'HELLO MOTHER' ;BUT OMITS SUCH DISPLAY WHEN INCONVENIENT: NOP | WIMBAT: DEFL 1234H NLIST ;THIS LINE SHOULD NOT APPEAR IN THE LISTING LIST WOMP: | NOP | NOP | NOP | JR WOMP ;RELATIVES TAKE NORMAL ARGUMENTS. ld a,35 | ld (35),a | nop | nop | blim: defl 12h ;lower case defw BLIM ;is allowed but not significant. ;THE FOLLOWING LINE CONTAINS ONLY SPACES. ;THE FOLLOWING LINE WILL HAVE AN ERROR BECAUSE IT IS THE ;END OF THE FILE BUT DOESN'T END WITH A CARRIAGE RETURN, ;LINE FEED (THERE'S A SPACE) -- AND AN END STATEMENT HASN'T OCCURED. ;A FILE THAT ENDS WITH A CARRIAGE RETURN LINE FEED WILL ;BE TREATED AS IF AN END STATEMENT HAD OCCURRED. ;(NOTE THAT THE LISTING PROPERLY TRUNCATES THESE COMMENTS.) S GENERATE ERRORS, BUT DON'T CRASH PROGRAM: {|{|{|{|{|{|{|{|{|{|{| LD DE,(17) | LD DE,(17) | LD DE,(17) LIST 3 ;ONLY LIST 3 LINES. {|{|{|{|{|{|{|{|{|{|{| DEFM 'WOMRATS OH MY WOMRATS'| DEFM 'B' {|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{| LD DE,(17) |{|{|{|{|{|{|{|{|{|{|{|{|{| LIST 255 ;LIST LOTS OF LINES. BEEP: DEFL 12 | BEEP: DEFL 12 | BEEP: DEFL 12 | BEEP: DEFL 12 | BEEP: DEFL 12 | BEEP: DEFL 12 | BEEP: DEFL 12 ;THE ABOVE LINE IS TOO LONG; IT EXCEEDS THE 80-CHARACTER LIMIT OF THE ;INPUT BUFFER. BEEP: DEFL 12 ;THE ASSEMBLER WON'T GENERATE AN ERROR UNLESS THE LINE IS TOO LONG IN A NON-COMMENT REGION. NOTE THAT "LISTW" ONLY AFFECTS THE OUTPUT OF THE ASSEMBLER. LISTW 255 ;PRINT WIDE LINE. LD A,(2+4)*(1+2) ;BALANCE ERROR. ASSEMBLER BECOMES CONFUSED ;BECAUSE IT THINKS OUTSIDE PARENTHESES ARE INDIRECT REFERENCE. THE ;EXPRESSION EVALUATOR REALLY OUGHT TO FIGURE THESE THINGS OUT, BUT LD A,[2+4]*[1+2] ;WORKS AND IS APPEALING, SINCE ;THE USE OF THE []s TENDS TO HELP THE PROGRAMMER vEB5MEP.ASMb  !"#$%&'()*+,-./0123o456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`airiJЗy3)V yW?)zyX+:ꗫV 9Cr~1o&Ţ*_C!n /.JZ%ADOY3>)N:2SD?a$ZUЗM1槛a2'!wn`2'J@SGhPYOxRMWTa\D 2' &Zo`ؽԄʉC4Xud Up͔U -|:{/'Z% Mgh /.p2lh;9VI\`e{ 82{oJZ%3 ׇh=_JZ%14[g{Ԅ@F %Ģ/b*iZ;AShtPJZ% i F|w3*x`(qr(ofomZ`tPi[S@4X:cXK}?Y+?3s—F29C, L&Zi펯|93'|b!e1nC0+#4CQl.ѓV|07ވ2&Vnw|uŜp錡 mؽDVâ|ۯ|uƜpi PwjͰۯ+e{`N QXWpUUH+x<-9^(m\Zxn;ŢaN(|.WO9#nFV-}1PVI49M]f AjBn(qlm3DUpG(\e VI+>/̜B. *'DXGs-s t!zHMXud U8x~q3s‹ Oo5QZi-s ?Q+_fN]yAUN`ψ^,R+x<-9^(m\Zxn;,pN ˆܠ]ЊۢVZqxb3'\ ]G -@jҊOCܠ]pPJ+>/̜B. *'ыy۸'?r-PqvA+_Vܿι^2'̽ őZi-nYőZi-sS0ʙbahI ` Kg̽ V<8Y+sŭV<8Y+>/̜C /Ⱥʉu!mV<ǖE9eX0'\b!5a錹ҊۢV/ƑP ]VZ%3A7@"dV|ܟ_9a@^0ۢ) ]bquZguV+_VܿιV+_VܿιV+_fN!d]aLҊ(8vϛwK@,(D+nwZG~(sB+tvB' VZ9a py]kŋ8r˜pO(^,<qM^(hU*i&*iRrC>) zHMȜ|z%d`mX) u(R!#WEϳLUWBe!u4ȜD9C{gY+DXRh|uƜpi P'AS;^]mWW۫Px S90hUBS6}@ө!1;mn(­ip1ǁC>)e}D/`0]#+!seh|#s—N +YNZa, |bNx7#)rCq~w0 U0\k5\{Kg̽ 3N f; FBkhJ.sB널9#fCg]A(̢wB7Z ͼ/|8#d2PwW P#!͵V~޼s8>0'죬` f]A(̢wB7Z chZ.ӏ =6'Ȝdv=w^ kES4Âǁ;P'AW:|sow7X_\>?1'XS>[B, Xnw7^ +k]9\>|suÜ,yΨw7^f`jxq E.\M?+28 +ka\>|s#sEěWBZ rrn|sBCaPSŒWBZ _msq1'4fѻ w7XP\>|s'aYWa3Bgs/>b󳷂PVC{1ǁonnZ{3*LcFlw^ ][AnŠY_,|'>\z ow7X 7TaEհ/q77oS`\GWBZ mǁo>Ȝnstu,[!72ۙo>~J&Lm7ө!1p0 v[#Nrs O4LjhfX0ǁ$7jpon]kc(aNHE_|#sBސ Z-}{2SnC ].SHM-*'NVܿy})qM /$mpU^+ȻJ+sm?}`N WBыԄ8@N+nwZq:~{Ŝp .qh|/|J+>/̜Ж3XbܷES<<,,mBb lMA+\l{|>[SݍWBZ)2'45"zmV<8r/|֊+۞9:+WBS|>[SЊMqV+_*iJiJ0$7H\{`=ʹJZx[^4E3,^H En(rZxnh}yN Bl.s!E;?r _a GVܿy]M_y !Л®=, Rf ge*x_#BU*MN*iw RзC[ȗu/u:{`Ҋ1x(ZRGRG C ͽP0ZiLJ _Q@Vh .C2'Ԅ|YW Z)=|E `!5>Bgs/ҊQ^/Zi//0'4(0k}Xr)FVI49VI=W.=s  LAjB_6ňu>RЊ s(pyZ_~ŋˋcÜN t $baWESeNKBjX(R}[4tJA+_eN(';Ԅ^(`j}[4V<89R6z ˦P23DKd.hJZߴJZ-./Zq:b{[\`#D@Z)2'̽ !5aܷES`Oő[愢zr#HMmX腂VP6̜@0+ Z%VirVIlCVZ/?1'ħ(+Hc\V ek?2'!ffdې4sDů_`NZeXd~jP+ǁǜ@2''٘Z\MxA8'"=U56d~j04(=sh7v:\=fBFů~2/ 9#+!tv6s2ƌ0w_>յVZ%VZ% R!  >}Jr<-|ÏgvNSo9/3*t6BAb<-ǁ>|83's}˱?e̺ ͽPJ+&C7xzv~CVZÂq૫ -M'HMص)-z)qMq_1'Kb!F/ -BEű( s!̽A⌴J SHMlED+rX̜pOz: 320V+gnv$BM R;cCXiŗ;rXrU+VI49ML0y KDH{BnRGIm+E&P'pu9 e{/l*!sBar-e u4.˰o k?UҊ9ۏ?0' @oB @WSY+_901V/Ƒwa/sB'BؽY+ů/0'\%mari& -VIUMVܿy})qM /$mpULa^jbyZiᕋmϜB ]pPЊs-s uWܗah.& {"bLEU[=V<8r/|֊+۞9:+WBS|>[SЊMqV+_*iJiJ0$7H\{`=ʹJZx[^4E3,^H En(rZxnh}yN Bl.s!E;?r _a GVܿy]M_y !Л®=, Rf ge*x_#BU*MN*iw RзC[ȗu/u:{`Ҋ1x(ZRGRG C ͽP0ZiLJ _Q@Vh .C2'Ԅ|YW Z)=|E `!5>Bgs/ҊQ^/Zi//0'4(0k}Xr)FVI49VI=W.=s  LAjB_6ňu>RЊ s(pyZ_~ŋˋcÜN t $baWESeNKBjX(R}[4tJA+_eN(';Ԅ^(`j}[4V<89R6z ˦P23DKd.hJZߴJZ-./Zq:b{[\`#D@Z)2'̽ !5aܷES`Oő[愢zr#HMmX腂VP6̜@0+ Z%VirVIlCVZ/sjZZђփ+pΓy=9uwxuߏAdPp+`=Dxx79O}T> N{y>s~~nbȥjΟv.=փ篝+nB~<9U~~n6'U({6zpzrXxM|}??7?ޗcm}s=ȕ{7!*^#9nhsMȏ''U(ss?ê4G'UQ+nB&sOu{6|8ygss?lN|b 7pu_ TW͹'}~p3Q(2jq^Ϗ'g]G浟/\~eF9g|zU_`sz0u-z6z;l^T OXoz{rS~2c&I94}Q(ab@~͊yiVxB lsy^z"z0ztRVs3V ~:vz>ar?%?f}T*_2yiVGFfX=4L5U(v\PzT>M??7K2F~͊w~~n]&ΘqK4Ьz]kC3U>u*.듛-Xx$xPCN}S{??7|*9t>dDQqdŊ!Yu||??7TGwh}5z䡙Pܔ҃PVeē{*vz>v~??7u R(a>/rC?*w~~n3c*A~.JfXPn}??7UȠdtP\{*Եo~~n@e<_VP=9\ծOZKJӹ~l}??7~/9xST#MeTW*>|~l*WDyqͼĬbf9g⼏^3ܬ^{R5A~.JfXPn}??7UȠdtP\{*Եo~~n@e<_VP=9\ծOZKJӹ~l}??7~/9xSvfRDISKBUFS.HEX( o !"#$%&'?7_7͟֋(?₟p1 ùo?yN`@K~~nxGJKo?Kz{9gy=UFq_}_xBQ]vt (x܀6'csjx K'9ߗk8^}]()/ x|oqx c= w~??7~4GSw?+߯hX8sζ|2,Sr(^ύw6ǻS8~Ւ+:ʽxjs'l]ʽדêPrK"~~nDV b@a6g~~n$Gc5QÊOgshȽx>"|rXuZ]VGB~rX1(nB~<9UF~?9FӠ(~Bp}r&roGɻ8F͟$Êo>VlN ~~nPzpa*^s7zlt](H!ODF+F@<"!Êzq7u#=s d"V !>*e=փO==8z]kX4u-W +U& d _g"s W{&a}^"I<*gFlbUh%sȽEa6MJΛWMLDFkim}s=& 1I0~+_' ڵ~~n=u1LǥydCx|'ꙸ1oV1X]z -z'4duJܘɫ϶lpȝL^}e;[/_jU?bgydCx|'P%zjU~z8 '[/V3a΋ٰp+Zwe67-Rz%̂w?tKğ=/Ltmm \ ~S2Lyd;ʝ!;/fipLy&D煬\-yd[pcEJo΋ٖy&n$V,mO DB#WíR5č<7f+6oNhU#;5Lğ=7fLܘIXڄ枬wdjU9;/&zw]/gĝX_Z n3qc&QZkȆNpT[ΐa4s]DkpV)d}';l˼n̴H-y12čĊmrc&oN6l?7f}*7f+ߢ7~Lğ }gh;'k˝WL^}e;f15.—WíR5ԗ(vG6w.n( NP];lpȝ!;/fipy]D煬`w[Zȍ I +LbM'{ޘ~ܘrc&bi"!$#%&('*),+.-/501J62354768:9;=<>?@BACDEGFIHSmpobn|gbCx|'IoW[L^}e^̆W թ6c~17ƆNJyܘ[g[gCu _̍olw*7fw/7yZ6w w _̍o!<TF+q'"MNP9=ĝX _̍olq%1[̆NPq%DO _̍oD!<`' g/NH陘~bn|gbCx|'eWLYԨĝʍ&qw֏yu&Qzl 2;#7It^̝Hi $J#dw6{ӨĄs<;JܘIT5[w*7fJ&Ć?&Qzl[&<[Ε1dk|癸1Ӗyܘi#w;1y;ʍl *wΑ;1yl٠NPus[ƌ5+];3 w.~.wgL[⛼dÊipUn̴e^3y1*;y%nEgOi#w^3y1VL;WN,hpG|G6w̲~0~&n$**[[Nt^ZxEfX ?w]&*a"YwkyމY ?wܘɫ+;˝Y-)5.~6E;QU#;HDw{L> 1;lp'Q9EDQTW][emipuU[Sx־}ob 񝠼1*~]?jeM",~jM",~?~5Gr< zHָyѹ1Wm܉ydCx|'.jk5ZܹT";rёָUnu1Xy&n$4* "~'ʍ.7f+6'ki+qrc&>۲#w""l i si52y"l;/fId<Jܘ[ f xlX8R];N<6$}'tsw^̆!-k:ً<ܘ+qc33΋ٰp2$}e"zETQBo<(62y=y<;[G6w~<ߑTpc&zpc&[g_FFлEJ3'3YBo<(EJ7fM^w;ONxgV}q1oVVV;A{qq1G<7fb6,:68 )!sC * ʪz (Sa&CG3c,)5"|)گhF_+7YY7D3 hˍ*܀v܀vD(7FTB*bhT#!JOẌPn`1ܨb1bf IOTbU3=yǨ䡂Lj%UB4?,0ZG;p'bfYAQ|wmUgXdz?OĎ 95QT#Z| kDКHQ IZB-[Qs~2kxjGQպB(jg ꌨ:H#?#i1F^uA#K V>jYkQUzUy49e ?zge2]FGʢUYG z)ƚt@ū~d+5}?*ѣ( 溺Bz?^XxGW?ˊInQ+#x鏸X z^╺ Br} ^ J#KehOZ+֤L_עx嫺B+z u f+LZSW^╺ OQezH.ZPTkעx.S>bp^>)Vk|BQj-e+5}2꾠RFѻRSGVQ[{UTVןעx.S>bp^>)עx.S>bp^>) j+{UG}ث.?ڢK$~^╺ OQezH$~?)])~ytעx.#A OQezH?.ʔ=X ?ďZ#xkQR!Z|U>!#b)}B|U(^ (ukWE#b)}v/ꙸUp_\3n`JܘAiP=y]ndHn`TSyN?HTg\LTg\3BӸ7fKk\3 dhadHnUwrc&Cw;GӸ.7f3 PwNPu1G6c\L#Uw X^3uJܘ[L[fHnX8 \3ZlX8۲A.7f2nX8ZlX1ydCxҸ.7fG<#7fk|'P]V1L[⛼Un䕸1ӖA`A#qN,hpǬbZM4wwgčDDYDY l,p5čoy%Uz&nj ʯ~+qc&gii y^$:ն(~<ȝQy^/j["& Qm+w1}'0j_̝Hi76w}1w*7iҋM3k[G6w}17Ix?{#[ȍoLl`|'0>r'<<-R ׾X>S 񝠮u3 ܑ㛼Un| XbkiW+w޸187fT TWt *LW{(^ kXF)\d }Eʇj)55)ZK!~dt]+*(_YV!z=EJ]}^2SOz|$S9qYkգ\‚~+_˲}LQI\o_Zj(WYQ(?QG:ZWQGtzn_WWQSp(菺h(<(yG.G^\3yOJuEq"E BUEWx-j=}u)_h}uע6#]IWק/*LO_WBQI?}]~GcMEL{}u)_hwSϣ˗d^AG2_2U O_WkXF?hӫ.B((YԊy-WꂠyOQh}eEbZ+G4T՘B_ѻ#{uL_WgezH.ZPTkעx.S>bp^>)Vk|BQj-e+5}2꾠RFѻRSGVQ[{UTVןעx.S>bp^>)vDISKDOC.DOCQ  ! "#o$%'&()*+-,.0/12435678:;9<=?>A@BSMt1-q]nPIt^3;Yy%nE͆NlPe|'Iˍ6,<2u1m~ָ.7f/r'f4#7 gg\;1#opg&5>10q]Č?~J?LLx?{Ϟ gͫr̈́WlX1 gr畸MG6,)#w}=q]n|*D 4ˍoǸ.7{.&z&oAyˍo7Dc =NğEȆNii;r'ZȍoVAf&R6: +wwr<2oNjΒa}k r[C$>O۝G*98 KIaX!a9jcy,mVvrKy|۔0:aq 2oho8.".{`i0?@9:E0L\ ?Ⱦm.{wiӧ 힟#.[UI ހ9:a@oh-<5tԟ}&^/npxɎMr Ȃ@3i3߯~g{ø=uA9Q&M TEX >G' ۞ZDa;~ rb>g[ϖχR6-RǯJ1Z( ﭮvyg>O`E[6|yyyv,Gގ{p.e&@9ܺ2'֓wn^枰 5K4_2Xh6hE}b+q,RP;A鎺.h(9X"]8j0iIJg:NiOMF$ >?D! .XiOMFWxvo[GmR³sO7H:8XIST]%~H{j={[s ]Ǹ=)/8hr.{|mQJH(Pr/.Q.H8i#S|h+T?=5| \%ONmR:W{@3DA>X>X_Trc=9k^֯V fGڸz_6A6 Cw| K;_2_Bq5/[W%sTfj}d~.T2?UFޗ[5Uͻ-mCwn9>ՖOSKmQ T?~]d~5/-٭ ),R6,JkJ`z0HSF5)_7$0?|˰z{oSr4{%aG'h3̟-mYCG5G;[2_󲥍6 C,W[?99kJ@a;\ ?K6ew _I֯^1W*R_h"fKʝ|mmc؟|ɡ۰P"ru ^]mw_՝5,ȝk~9R6624TwCqU|=9RtOXE9oi6;賎bݻvA[>t6IrsAn]Obܟ|^_G',~SCG9x|^G'tJmFK5gOťۼNn8ݟ|^f*bTInW[S{kgfhF~dǷ֯&0q('0f5 P. R+H|PfZRQ.կ'!.T?&w3Xh3{zfRʟ3|l|˳ ur[m{AO>/nG',<Jg 'uS(VBqynkVRה{% g__`)s~oKa~ˇ'?9mfK泥6a P̷V|5|֓gz,¿ P_Ob\?fS-NX^CZzm{,33ٿIkW k$vHrtͷcUSp+t6hSu޽ 6еYgtu__m./RΗn6̆ηK-]__l7FuV-Rjpysb0͇!{Fudk(rO>/|oKvft";n<7ȍ>h3oK V1|fqSX_Trc=9k^֯V fGڸz_6A6 Cw| K;_2_Bq5/[W%sTfj}d~.T2?UFޗ[5Uͻ-mCwn9>ՖOSKmQ T?~]d~5/-٭ ),R6,JkJ`z0HSF5)_7$0?|˰z{oSr4{%aG'h3̟-mYCG5G;[2_󲥍6 C,W[?99kJ@a kDISKED DOCDISKED OBJD0The DISKED.OBJ program is a disk editor, sinilar to DU. Has built in help functions and should work on any CP/M 2.XX machine, including APPLE. SYSOP *K͞+""<"'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!s! !!!!@ ͭsZ h!!!!@ ͭ! s#r! w#w͐\? ͐! ͐s! ^#Vr+s h\|g}o\!͡\|g}o! s#r\|ʊ ! w#w͐\Ҋ \\͐n&| Ê ! ^#Vr+sO \\\?͐! s#r͐ | ͐ \ ͐ \ !͡! w#w͐\? ͐!͡! w#w͐g ͐͐! n&!͐͡+++|Y !͡! ^#Vr+s ! w#w͐ ͐͐! n&|g}o!B s!B n& ͩ !B n}͝ !. !B n!B s!B n&͹! ^#Vr+so ͼ| ! ~#fos#r ! ͹h!\+!!@ ͭ! s#r\ *s#r*6͐ \ ?! s#r͐\\*##s#r͐\*s#r!Ͱhw! s#6*6\`is#r\! s#r\! s#r\*##s#r*w#w!Ͱ! w#w͐\ P͐?! \\ͳ!Ͱ! ^#Vr+s ͐*##s#r͐*s#r͐*s#r͐"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!yV5:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":=$,v+2#:$=>$$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5*s! w#w͐һ͐!E 6! ^#Vr+sÔ! w#w\ ))! s#r! w#w͐͐ ҽ͐ ?! !G$ s#r̓G$ n!C s͐`!D s!D n& D!D n&0s!D n&$f!D n&7s!D n&>҈!D n&=s!D n&MҪ!D n&s!D n&T!D n&s!D n&Z!D n&s!D n&^!D n&!s!D 6_!C n}$ï͐ |=!B 6 C!B 6 !B n&͹! ^#Vr+s̓G$n}k!=n!*!B s̓G$ 6̓G$#!B n&!D n&!͡!C n}!C n&!͡! ͡!G$ ~#fos#r!G$ ^#Vr+sn&!̓͡G$!E$ s#r!B n}=¯\+j! w#w͐g̓E$~#fo!E !D ns! ^#Vr+s!E$ ^#Vr+s(ï! w#w͐ү̓G$n&!E !D ns! ^#Vr+s!G$ ^#Vr+sr! ^#Vr+s!E 6͐ |M! w#w͐\M͐@|! ͹͐|! ͹͐!E n}7͐!E n&:!.͹! ^#Vr+s! ͹hhͿ̓@ 6h?ͼ|v!I$9$#͞*D)͏,Ͷ,v++4ʱ$W!n"dæÄ!Ù!!9DM!͡!͡!@ 6#6̓@ n&|g}o*s#r\ͤ! w#w! ͪ!@ s#rn&ͧQ?̓@ #n}y!@ ^#Vr+sn!B s{k!B n&ͧ>Tp> >S|>> >Dˆ>ʎ >N”> >R > >W¬>ʄ >E¸>& >F>ʫ >P> >B>>M>ʨ> >X>? >[[! \!!@ ͭ*##s#r*6#6*6h! \\!@ ͭ\*s#r*6#6*6!Ͱh! !!!@ ͭ! s#r͐ͤ| ͐*s#r !͡h\Ͱh\`is#r\! s#r\! s#r! w#w͐\S ͐?! \\ͳ!Ͱ! ^#Vr+s ͐*##s#r͐*s#r͐*s#rh\`is#r\! s#r\! s#r! w#w͐\ ͐?! \\Ͷ!Ͱ! ^#Vr+sî ͐*##s#r͐*s#r͐*s#rh\?! s#r!͐+!!@ ͭ! s#r̓@ n} ¨ ͐͐Ҩ ! ^#Vr+ Disk Edit Utility Version 1.2 8-Jun-84 press ? for help No such disk track%4d sector%4d block%4x.%2d %4x %2x %c%c%s/%x %3x!!n!9DM*6#6*6*6#6*6#6*6#6!! ͐ ! `is#r͐| ͐! s#r͐ ~#fo! s#r͐~#fo*s#r͐~#fo*s#r͐##ng* s#r͐ ~#fo! s#r* w#w͐|E! ~#fo)s#r* ~#fo\ s#r͐~#fo*s#r͐ ~#fo*s#r\\\ ?\*s#r*6#6*6\*##s#r*w#w!\|g}o*s#r\\+*s#r͐!9(W!!9DM`iw#w͐;~#fon} S͐;^#Vr+s6͐;^#Vr+sn&! s!0! n&9͐A! n&s!9! n&?͐A͐?! nѯg`is#rS͐;^#Vr+s͐͐=͐͐?O͐!_! "!5 s#r͐A͐?͐=!5 %`is#r͐V!79bad number %d !9DM*~# ^#Vr+s`insè! ^#Vr+s`insÉ͐6!9æ!9DM͐n}! ^#Vr+sn&ͽ!9DM! n&aͯ ! n&zͯ!  !9DM͐͐ q ͐^#Vr+s͐ ^ ͐0f ͐7s!&ü ͐ ͐͐ ͉͐ `is͐ ͐͐ )͐ `in&#&ü !9!9DM! n&0ͯ ! n&9ͯ !9DM`iw#w͐~#fon& }G!͐ ?͐^#Vr+snѯg`is#r!͐N!!9 6  #F#x!~#r!:w&o o&:woʨ!2w&!o ! . &7:O*o`7*+++:G_*DM!" _ "  ^#Vr+s! n}!0! s͐! ^#Vr+sns{K! ^#Vr+s"! n}|! ^#Vr+s!|! ^#Vr+s6 UÒ!fo͐s#r\\*##^#Vr+s*~#fo\s#r\|w}\\n*s#6 \n\*s#r \*s#r(!!9DM͐! %͐! %͐! %! %j!!9DM͐! g͐! g͐! g!gì"!9DM! n&ͩ!d!\!\\!!!&!a!!!!!"!_!|\+!! 'n' is decimal, 'x' and 'a' are hex Dn set current disk number to n (0-15) Tn set current track to n (0-%d) Sn set current sector to n (%d-%d) N set next logical track and sector/block next sector if last set command was for track or sector next block if last set command was for block R read sector/block into buffer W write sector/block from buffer P print out contents of buffer, with track/sector/block numbers Ea x [x..x] edit buffer starting from 'a' with successive values of x Fx Fill buffer with value x Q exit program Bx set current track and sector to point to block x (0-%x) M print disk allocation map Kú!y9DM! `i`i!9!9DM! n&|@! n&E! n&Z !h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʫ`in}%•! ! s#r! 6#6! s! s! s͐n}-! ^#Vr+s! 4͐n}0! 4͐n&Q}! T!! s#r! ^#Vr+sn`is{.b! T! s#r! 4! ^#Vr+sn`is`in&W}DʎUXOC"SS͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ! 6! 6! ~#fo! n&! ^#Vr+s~#fo! Nѯgs#r! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s! n}f! 6#6! ^#Vr+s~#fo! s#r͐n}͐|! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sÁ͐6! ! s#r! n}"! ^#Vr+s!"! ^#Vr+s! n}!0! s͐! ^#Vr+sns{K! ^#Vr+s"! n}|! ^#Vr+s!|! ^#Vr+s6 UÒ! ö!n*2h*6DISKIDX DQCDISKIDX BQS*o+=oͶz{ov7DISKIDX.DOCM   !"#$&%'o(*),+-./1032456789;:><=?@ABCFDEGJIKHL|vۣ#G_ OP6uDÃgjܷnʤʶ{ɀqǚ.wRy=8@LUkM#֕'xt 0 < \/vڷŅym_꘠ K*zHS򬯼qhz^. Z2[oWt/s<)7ޛ&4Bz8&`W¸{{,] ^>a:a[xZzR[kp#r"?q7w7L2W+3<5O3ZkRx1ơuswsa] qx=+SĨ"dO\mIvqh%<΅]2 [p'"N>HX'"B3i"dH8)ާ* &xW!ʬ_sM4SsUkHd>5O kopLLe\*$w ;}j'8ׁ n-a݄…ʵz7 8<1j%C{+!]n;ӛ^y2F%LlwWYh\묓?z~&tu/xesWfxj\CIϻRrb}j +Scq<5\Qz%d 5w..]כy;dDÃi*W'"ϗ Lmxj湢4av@q,Z/RC8Rwm!OA8GG>=}(P G7ӢDW}w.!i%L;Ǣ5,4.v](^W^ۇb>_( 85O3ܖ0!"IXSHݤߠKWj͵veM^ꮯ 15|\X*j T/CⶄqL{Uk5sA1.w.8bdd_y}~d@>Un?ybԾ=`M!b SĨ}Շ nWj0su)bN!u0jm2Atd;]`yȾ21u.>fpWfd@ҵq(?糖^2 Ok==t |8{ڦ;{Զ@9>z /}j6Ow.!S>md0]Xk''̉|}JS2/ƽw.{-#Pb|.E k2*)+-,/.0124356789:;<=>o?A@BDCEGFIHJLKMONPQRSUTVWXY[Z^]\`ab_;-LxE |;SP=W'[ī3It z^"U|!/`qذ\G ^"U| éT3@ g6ήW;"^SmŖú_s6vz(:=aGs e0}kZUaÚeX˦ 2j^;E۴C ukRȰ*MGV)Je0s mFM<=jhhӪGn{n7 ͪ>Kհatk7t3UlWL* GS[ j.m}+zs#:MGjU.>m7EPR)Je0QTUMtTaj*TQ*%%T᷽ZٮNBJQ/(EvNnZDG6LЉ&}kZUUeX\_j}Pd %]GRPl۫d*'r4*ڰiUu/ouBuk-T7aN44zK_o{(]*E vwUuJaBӣ|AFCGsmfvJ]5U˦JP/ UlնW3vqlWo-_;zH zU(W3zm+ax5)̮W3"^$x5(ՙƗR.CV& w a_;i5 |L2${:g*;T zj&9Q)kw.>v-sXkm$ƅ+3<5O7#Pxȕ_yo }~e841)r̺qx=w YRw_aM&Ezn}9ص7# ;W\aR:wRcwe3dM>ϘuO*ǡs uW̺}1b=`M>weoȊ5ySc[5ygVyXk yƬ5+f[`Mz\Ś|vk?CbMfRpS3>Z{=Jw[d{R9r17ר-k{W̺G GzOSst=+(e97dM5NuuRVn秔MA8qH۴޹{v+q>v-beM^y/蝋87$_k\oa{ɀaےknI!\{=bnz UY<vGXnџݒy+5s;(MWNa nr&?\qBǤ%+8Q !4eM^y/x+\dRxVu(:pn2Atw%+SĨ}sg}Yǚ2ϵrbo[R w{cޖ0tcM& zDOKݣW}w.!i%L;Ǣ5,4.v](^W^ۇb>_( 8?6[OmXy((2/a2qjWn;{;Ը/a\y~}*C88ʧOPIR7*u`w}) F>ux?a|e}Qp;T(\-;OV|uu`L/ w PW.6^'ʃ>vu} ӵXY]q]gӸyϻU6}u]KyA.54/6+<ЩK,۵yP$ݎ|0T;aX!`.̀<.l;uspx"\d7\3n-ioqphoqn\7^ D( Q_ֱ;usڜpx"\Do2ue]a wCA:CAͅOjs֩́!-?.Ab8%6maN\6;;*/.uGwotn-ߩ M"\L^7 ue[ؿS7>zpxpA&ׁ'fC]bͅOj$\7^!\DuIQ_vc w'q́qyw Kl/Ŷn.|Rpxp~7M;[ؿS7>̆p\v#\7^_C\< P_vmaN\6+9:D=(L?~G%6%6 [ؿwuetncKl/;~.ݎd wn@]bٱ-$uu?twWL$uV́q%6Wg`\ؿS7C~@4܉^2u'.8\j+~ .Vd'.;use;;«Cne:PP.Cazp>W'0T~n{OXwB?P?Q4\y?P5Ծ4:=lT~C7JGAO\́w$kzBC\ev¶-:5$Q铒˺9Of2.ʸ"_btCkznޙ-=VOXAnޙ-=VZw|R*_ӫpl2x |̖+s;>P\x 9䆪P2WY^32,x;FP\xQwIB*|9S =(L?>6+x_+l5<?O/EIR{\?3cg&@]bMv f7HȚQ&i.uRo T(\-;OV|`@ ^̂8%6xQaN3TQ_w]l)SkuPq]?ƅ;ʹ#I C🭱i31u-AiC]bk*iL>ӎʾج3 K,۵$LIo&>SzON}O]G@KPMFU7ptz B ϊ 91vb8`~Đ}9%68E2TؿS#ϙ"ž')߁K07{p5Ծ4:=lT~C7JG& l_0};*7ek1"Z*ru9'K,ZfDv]aN548>u llOᛇqg| ; ͅOj!\#Ά쨈&ׁu܅:Py/[;ir цÍe,[,+~$u:_"]W.u.kٍw;448>뙺Wf6ŧ_ؿӬ3Py Y̦>Ɠ&ׁw:5I@me)|,pYPş\? R13>yЅ'M*|YP$xjrxg=@4W>3CTg&S~7T>3u:{/YvƉy|ft*3P{5P vDISKLIB.BASZ  ! "$#%'&(*),+-./0123457698:;<>=@?AoCBDEFGHIJKLMNOPRQSTUVYWXCX~*DdJ{C([0z~O_V`4[1냤T2צѷ wi)1 _>Qv1|yս6 ѳSkEY7QeTDr|6 }vi,{m_VaϪV}tϰ8|>|>|>|>|>|>|>{Z \F;k6|pzߍvrT6,#RM @ii@8pj  #N|y{W&9H)+SV6zi"caIVN ɼ= 5zi"@)Q_V᪷h8vBߢ.D_V;PVuž ߫1{_L:ǦaW Wa(Q. +ƦaWe][jwPE(!2/}O/mB$޳E~?|piߵ#i{] &"MTY$ _fl?M=n<{E%zgx&^ڄdMKa;' }pb"ZPe}ϛemb }({w-E_PeFW}( {\(S {VEI6!{zi"@Kl*] CEb~4y {\D?Zd( 4[_4ʞI6F/mB2}|>|>|>|>|>|>|>yHu&]1",JBߢ]~Z cG.]CO Ĭ6lGP+m𩄀֦6AgVs%5?6#6T_EV 9:2MhsH CxGs3aӰ{ 1p#獘Wa{Ʀa߅=._2*dzz/\rKдd-Z}`ֳ 0 17ʔ6W٤+FlnJs66榄?'G=׼9`[C4GP)@VIjIZn⒖FM &lnJs65{=i >HYirFqc*&g'mzL%$={ զo9BSr3s![>y<J M: P8pj LZn`|1 ={f Şizi"521 ޳bId\P WZ}ljwomk]-3i R2I߫טr=U/G>H!M)AC̠o9-|>|>!9"=1=~#$MO@_? $>1O>0O*#"&o ڊ |ā{0O? Nonstandard disk parameter block error $*=!:\2?BITMAP 2.2 AS OF 7/1/80 $2:=2:_"^#V#"*##~ңڣ?Allocated disk block size is $2!)=t́? bytes per block $*:_+0^#~emz ʦʫï^^:AO?: R/W, Space: $:*=)́?k $|>|>|>|>\濇9KlB%h hgF$2Ĝjzf¦a{_濬ֹT3Խt'ՏkL9˥?@CR^\Uqge^ݫdsAOnW}c|>|>|>|>|>2^ڄ0,I$~/з R_E.#f h ?Ąp~مE]ȼJrMþ_[1i&4|5_*^Rsfg~4uScYbԍ^ڄ~L ~~L ~~L A~@$j^ڄc+T񾿷*Ѭ}4\"uƔ4,iA rN-7h&4ŹM3: V1k)hs&&K̫&T3'5wQFȅE]>~"Q3fƷ_*T>  \"L L.{.%XODaL bw˼ZufH!M)AC̠o9-|>|> MlH ׇ+M ^O ѦUoF&2 Uu2Asn&hºFZ:BjSc+!=*\ޙmJ*~rL6%z3+̄hSª7LjqbT\ Scj*y:9.ذ> w%hal15UoFʥ" ѦI Ѧ2aL(g&D&g&D"ʄ/H2a2ARdI "T1~Y>L."1A25Uu2Asy``}5ъj$I3S yWoUz\DP>LxXi+L[1ʴVVq]F&QUu2Asb& Vl1j35&o/4$gq80wraBr^`Br7 ^-7 YX&xX&$gqbLj]?g&<1ԘJ޴N&cc5AG+5⃷?HCrɅ ^-'&$gU&x8T&$gὉLjqxw2eBrsfWsfSs)LcT,_FՊ|Ϊ k`jLK[LV, Mlp+p6eK[L^hp+{܊eawb,#S1}^.ƺ`D}yUby{d+1b^woj\pR/&TB3yby7D5.x[aU n|woj\&jP} !}ݙ{[1_}w#-Xxoםi܊Xԋ l}y44Kϱ1xou zj# Xo;pmp+kcc&jNA\U y!>_ug܊v ^hn:'kLïbyPsi' )U_;܊ DISKMON AQMDISKMON COM vtDISKMON.ASM6  !"#$%&'()*+,o-./012345U6,/#7r|lX_g32yD <2M*0e52! ˼,#ʀKaBy525&_-7WajL1mJ1HaBzT6&KE_mJTP.L6%L*L[<2!/4E\ bLP[&K ңbOe51YDŽGoLH>P[&DŽ %_0v˄!15miLNj?)UMCzT>bB)1!ڔ(͏ɔrΆ!Ʉ8T, ~ R2aL6% b+L6%MdB)r&Dʀp257 낫`jLbkH ׇL6%x?9&DVe°?R΃4 yO&ġbY1 G dB)a3XaB)r&DSyh6%&2!3,LCrLx2 <ScjiL3iфuߍVN7՚>忰>Lr4&˄p}y_ :8&19X&QUu2k68M: [^a40$c;}^>3;=ofpI ƺ3}^%zFC2֛{}^3b}^y{̥Ʌ -Akk>/Lp+vG;LpR/f ܊}}n&x}ya[Ƿ8f7Q}ya[8fºFW+Z[Ή~ ܊ݼ b [{}^V71^0XŨ n~{c]&jo{K.Uaw#{}^V)UM&jo{K.aw#Asp{}^Vi+C|u{}^VOobt)hqK %; ܊ugz*&qT9Nћw"X&^a;!wBuLp'NjNn V D̥0&1w"RN\ ܉Ka;s)Lp'b. D̥0&1w"RN\ ܉Ka;s)Lp'b. D̥0&1ŔK4U$Jm! "*$aڍ2,eRFHYjUuB~ .u,P KH?l cf Ÿmy A?_!og!͉=ͤ*ÿ́7b͉=ͤÿ́'̚iX*":<–:<2>2:O:O:O!*DM$ :BA>:V:o::\] .o.g 670AN>P>2͉2͉2͉2Li{}4$gqxP'eB*_Lx~`'eBr: ,Z*ʥea$IZD&QUu2k uRlc]0"YB1ۛ vrAG73ibԈhmJ15&#!=*\/3!ڔUmJ1HaejL ~[%oZ'α1 b+Ƈ{`b Y)U Sc V8\P[&DILHP9P[&DQ YD&|A ѦoԛȄ4&˄/XȄ/=1!ڔb FSVɛɄsq !gノ&ML+5SAJCzTUf&D8\eaؔr0}_w&<6odSCCT۝Mʥ"&D&g&G^ Ѧ'DŽ, ѦQaBzTUL6%x?9&$gqxmJ&G^ Ѧ'DŽ,Wϙ ѦQaBr+fTM q2\*baB>2a GL6%L*L C2 LOL6%L*LLmiL\*u9hB̓05&'P.eB)aRyfejL ~[%oZ'4c.F0<&Isx Z35Y:Ԙtm6?b'T|~?L6%|eBn0?    `eeB)(J` b15miLnb&Xk ,%{a40me5Ԙ\6ġb#"Lgde27XWq]F&QUu2Asn&hz1L)NңafB)1\*bmJTydщeBTؾLx*?6K'praSs)LoMdG;LG!=*\^mJ*~rL6%z32 RSVɛ!v DԘ!͉2ͤͤoAڬ70:2:2:2:2:2:2:2:2:2:2 READ ERROR $ SELECTED PARAMERERS: SELECTED DRIVE IS: $ SELECTED TRACK IS: $ SELECTED SECTOR IS: $ BUFFER STARTING ADDRESS IS: $ WHICH DRIVE (A OR B)? $ WHICH TRACK (IN TWO DIGIT HEX PLEASE)? $ WHICH SECTOR (IN TWO DIGIT HEX PLEASE)? $ BUFFER STARTING ADDRESS: $ HOW MANY SECTORS DO YOU WANT TO WRITE? (2 DIGIT HEX PLEASE) $ HOW MANY SECTORS DO YOU WANT TO READ: (2 DIGIT HEX PLEASE) $ COMMAND MODE : OPTIONS A=CHANGE DRIVE B=CHANGE TRACK C=CHANGE SECTOR D=CHANGE BUFFER STARTING ADDRESS E=PRESERVE PARAMETERS F=RESTORE PARAMETERS G=READ SECTOR(S) FROM DISK TO BUFFER H=WRITE SECTOR(S) FROM BUFFER TO DISK I=JUMP TO SID J=RETURN TO CP/M COMMAND MODE $9VetN-:\] .o.g 670AN>P>2͉2͉2͉2 This program accesses and utilizes the codedinformation in the directory and file allocation table of the default drive toperform file manipulation tasks. SELECTION 2: The names of the files currently in thedirectory INCLUDING erased and hidden files are listed beside their position in the directory. The directory has the capacity for 64 names.A filename whose first letter is a represents an erased file. SELECTION 3: The addresses of the sectors on which afile resides are listed. The 320 sectors are numbered from 0 to 319. SELECTION 4: The directory contains the address ofthe first sector on which a file resides. DOS erases a file by replacing thefirst letter of the name with a and wiping out the linkages to thesucceeding sectors which were contained in the file allocation table. If thefirst sector has not since been overwritten by DOS, then that data isaccessable. The is replaced with a Z, thereby rendering the dataon the first sector available to DOS. *** PRESS SPACE BAR TO CONTINUE ***$ --- DESCRIPTION continued --- SELECTION 5: A file entry encoded to be hidden fromdirectory searches is recoded to be included in directory searches. SELECTION 6: A normal file entry is encoded to behidden from directory searches. WILLIAM HT BAILEY Phone: 215-924-0771 April 1982 *** PRESS SPACE BAR TO CONTINUE ***$STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK STACK MZ y.+PK ! !<7u<1|u ޚt x! ! ! !ùy$ DISK UTILITY ROUTINES --- MENU --- 1. DESCRIPTION 2. LIST FILE NAMES IN DIRECTORY 3. LIST SECTORS OF A SELECTED FILE 4. RECOVER 1ST SECTOR OF AN ERASED FILE 5. UNCOVER A HIDDEN FILE 6. HIDE A NORMAL FILE 7. EXIT ENTER SELECTION NUMBER$ --- DESCRIPTION --- !$ $$ 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 SELECTED FUNCTION WRITES TO DISK DIRECTORY HAVE YOU MADE A BACKUP OF THIS DISK? (Y/N)$ BACKUP THE DISK BEFORE ACTIVATING THISFUNCTION.$ DISK READ ERROR. FUNCTION ABORTED. PRESS SPACE BAR TO RETURN TO MENU.$ --- FILENAMES --- $ *** PRESS SPACE BAR TO CONTINUE ***$ --- LIST SECTORS ---$ EMPTY DIRECTORY ENTRY. NO ACTION TAKEN. PRESS SPACE BAR TO RETURN TO MENU.$ں   <2u> t,> t%  <3u> t (  ˀ> t- ! ! *ɚ > th f !!%[s ! !  +&Ƅ F@ Ku@ >tK" u+&$u&Ɔ E  !~ ! !ô !<. u ! !ù !V޾    !^+&Ƅ F=ue=u]P6 0&&<t%6 0&&<t0&   !X˜Ës%놴 ~ ! ! $ ENTER FILE NUMBER OR 0 TO ABORT FUNCTION.$ INVALID ENTRY. RE-ENTER.$ DISK WRITE ERROR. FUNCTION ABORTED. PRESS SPACE BAR TO RETURN TO MENU.$ EMPTY DIRECTORY ENTRY. NO ACTION TAKEN. PRESS SPACE BAR TO RETURN TO MENU.$ --- RECOVER 1ST SECTOR OF ERASED FILE ---$ ACTIVE FILE SELECTED. NO ACTION TAKEN. PRESS SPACE BAR TO RETURN TO MENU.$ --- UNCOVER HIDDEN FILE ---$ --- HIDE A NORMAL FILE ---$Zttˈ>...<4u&>t P*Ҋ><5u>t*<6u>t *뷴 !d=.ы.8t -! !Ìю8BuC10+$! ynjig_^\ZTOIF@8)' sb;(;;cHT%e8'Smf[dD9Xr/Ga{ } P7NzƱݫ=#*C x^g՟T]}w˞3̥8řq+ř8s1q&3̕8s>L9θMgn|硿֖rNx t6y=> wtOwsn+>|x+>;> ffAg0s^<>O&fS-xxZxW;7fhW||g0s%^4|_/Vw^8\v5P7O?r!joj&LHě߹X;;~O:Wnjo ~k4̃Ʒ?ՅAgpĕx qk|x\v [.L\;q9z(}wЕ>P7ߚ8/y{wao|NM}c)̩8s)xqd3}qf6gL ̱8s%Μ38SɸMgnn~o8 #ic Cպ~@I1ɔWjojU|NMx8WRytpC߱.{?8Wڲ}] ^7wԋ{<_6?Ts`ߺ1s*\'N ! !ÌюZB˜Ër  ы.ѹ6ô ~!=.ы.8Bu ! !ÌюB ѹô !a=.ы.8Bu ! !ÌюB ѹùy$*ô ! !> t> t > t A!ؠ -1=|=à +Ҋ < u0,00 ̃|<|<|.-ô!&[rú] ! !ƻn;ŁgyZoݘ9(MP7b<> 8/C9q)^|Ж⣇W55Oܶߟkmx\kSOܶߟkmo6Z.~9q*6s*ϵNٜ8t?|u֍fu{7|x+>;> ff~`؟jmZ78/^;1s>Gb=f\ 2NNP kyZz3/^x?jom}Gt8v7ĕx˻8llP7Cg&ċݕ3T[3nkgNB9U~S~b?{& p%s>ĸfݾ;ucεCպԧ7 FNW1ZjoO_{_iԏ[?3ǭM~y}]:L6]cqwO/F=wD?%|]/<94 vVW&~S/s~ۿ~u]NqB pmz+0qҡ?F/'G?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi.jklmnopqrstuvwxyz{|}~o6= 5H<-P*M>:%}m]EA3"e[J?974&wulhYWN/|xtrqpa`XUQB {zvkfdcSRKD"oP7D9>ֺߺ1s2ΜCwm۹x/{gg' 4I|_s7#>{T+?:|OBWx\c S)78i7W8]Fu. <Nnq`\%)ە`sr 2``8nWڃw ``8nWڃ,pqx:7.l:HQ8Ʀqr;8.l<0qeAylw~.œ}Gt\TޡዋʡዋߔdNŧ.^\ŝӇřC١tw~u>;t׶c{pպ7fNřK١&?;֋neNպ7f.gڶsݷ;֋neNպ7f.gڶsݷt[.^|p{.s*^1s)>;t׶zGm;={7 {zYoرKn^N º)BI8R˺T ˺ zÎnRI!S]pgzÎ%vtX%N %a] T(X {JK%vt.5V9ɷ7 B7캐bׅ.Xv]pu® .D/dׅ4/ )6^rl4X6^6^*l4xl4D/d!MC7  7 7 Q ٸiHq=Hq=ȱq=l\66׃l\ҜRIS*5qJ&S*5q8X TkqJ&Q 9X4TӒ `ZrRL `ZN)xRLKTBN%)@FRRd$)@F,Tq8HS*xRd$x!TIsJ.)N%)XN `]*R)D/ `]ҜRlT%)fRlS*R `xRl⅜Rl4T8%)@,S*XNbpJ)@,Q 9%)8Tb9S*ypJ0/TUS*yIsJERRlT[rJENHS*-qJErJE:$Ůc`Mr:IJX]Tu Ǯc`MX4iIi:a10-v:%ͮc #)vɱȈe1]@F*:2HTBvIXuɱXˮc`]vRa1.u*^Ȯc`]:6K]fɱ,]fqu l ,Q u l4XR:bɱŲa1K]@,X%ͮc`^R:%Ǯc`^,yqu K]x:%x!yI")v[$Ǯc`Xv[a1E*:Ǯc`D/d1El$ `MrlIJqXT8 `MqX4'iIq'ila0-6Nql% #)6NɱqȈe@F*l2qHTB6NIqX'uɱqX'ܮ[ӳwpglzÎì7f]jt soo֥BS-K0wz{JKì7a]jtpoo֍|SnW;={7wƮ/ްc/ ;Kn<')7T(pT`]jaaG7@u P$P֍|u^ZW6@Xkm^YezeuZW6@Xkm i ) Ye2:_k4uhHuhHu(I/| P| P| PUZ$ì6@IzXkmYkmXkmUeV:_kJuXUZ`UYkmUaV%:_kJu^Z`X6XkmaYeeuZ`X6Xkmez:_kHuUZGYkmaz$:_kHuK/| | | UZ /ì6@^zX\:_k:_ku(Hu(Hu(*| PaZ =6@A6@A @/B`](J *B0̺P*.JyօR Pj. օRĺPj.ì @Bg](5 ne=vs/@ͽ%c7`ͽ=nȳzXo/@Xo/@Xo/*^ac=z{z{ ; ; օŽ*Ž0Ž@Ž@uaGzow@@*a{ =vv k^ֵ@uPb].uY׺ =ks2y{msO}6s/ܝs/=>ܹG=67ྙ}/ڷ}O}ud?}_}jK7}g}k߶}K׷l߾^޳mc{ۿj_sm?}Ƕ7NLESkSO=15<52w*7uiL:M}>;S_NԿziꝩ?wS>mSN%{{&,ٴGlȞҞ=ynӷសŞ{{=o=ZuAJ\ȺXQ.kAœT;(mJ*;XNZ5֞%i֪ rB}rXm*r,ruC`:bYp%Zu(;@ Ų6T<w< QZ7kuY{ҢX.p$ʅBqXm*X;H : ֞UT$ʅB6TldW[[m϶~s[{WgSM';V檗zkUZ;X=]}߬~+IWl]Sx]98ypo;7<>xృ???k&qۓÓ=_<5L>03oL0swN8{ɇ&?o&dg444YX]w{RKܥ[^l陥7^X;^\ڽthCK,ݷWKsZ^Z[]X,O,.߻ܽL˩S-O/?//,嗗|-G/|`22#+̯ܴһ++OʏVnWW+r孕?\ٽʟ+ʯ,tpqG fpb7^Rz9ȱaA]/^ ͮnr99pusPáǮ9HA]rz`a׃ xzU]#kA3B kir!cDP,Yֺ!bUUbw,P=kYf-keY ,k*unVUrYeYZ.LHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHٴijl޴eӵV76&gaMOo_&B¯7o6~q!/oo>4>:9}0;6:1::2JHH(!%$$$|`QG _z5(!!!ˣWG蟏}2G uZPEIXUpdzb7xn(UWTuZPEQExTQnUDu RŬU&NHVYT1k Z`TQ,'Dʄg!'*f2!pYb*'G"UZeBijPHV8,xb*'HVPRg!RŬU&pYT1k 'HVPijb*J8,Dʄ'HVPg!-*f2!pb*'iDʄ9HV81%RŬU&N]"UZeBBYLb*'YT1k ;T}.HV{zoTS̆g "Sbڳ`fE#&$$$$$$$$$$$$$$ (The default extension is .REL) Example: DISREL OBSLIB DISREL B:PASLIB.ERL The documentation on the .REL file format can be found in the Microsoft and DRI manuals. Good luck! Pierre Schwob n RELDUMP.COM by Ron Fowler. It performs a two pass disassembly of .REL files (Microsoft/DRI format) both in 8080 and Z80 opcodes with labeled entry-points. 8080 opcodes are given in upper-case mnemonics, in Intel format. Z80 opcodes are given in lower-case mnemonics, in Zilog format. Have fun disassembling the libraries attached to the various Microsoft and DRI languages! - Indexed Relocatable Files: When you need to disassemble a .IRL file, use DDT to remove the first few sectors used for the indexes and move the rest down to 100H; save it as a .REL file and then use DISREL. - Syntax: Use the following comman AZ"UZeB$e!RU&N}.DʄI *g2!pHVjJ7QT9k gfAY;El(z*>5 *= fVT 7%$$$$$$$$$$$$$$(!!!!!!GAHHHHHHx!!!!!!' ;AHHHHHH BBBBBB 6BBBBBBBBBBBBn#$${!!!!!!!!!!!!!!a6BBBBBrr*'HV8q=T9k ׅHV81^"UZeBĸiT9k zr*')DʄIJ0-*g2!pRd$RU&NR*uT9k `DʄIJKYLTr*')T9k 1&*g2!p:%RU&N\@F"UZeBu KYLr*'c HV8qr*'c`DʄqXHV81Nr*' #*g2!pb%RU&NfT9k KYL'yT9k E"UZeB`BBBBBKӄL4!!!!!!ӄ| OO^&$$$$$$ӄm!$$$$$$ !!!!!!BBBBBB‡32!$$$$$$!$$$$$$|*CHHHHHH !!!!!!Og o!$$$$$$~!$$$$$$BBBBBB넄NH#;cضC g㍀α'Tbo:W"}3lul Gt?;^'taQ6<8>soBs(>#x(sB;h < ?8| k~d=w:ǰmQ6<{ͧ @`ȏ7KFo~=K@ٱ`?ͷo4Ͼ7v>7ta+> `5y2d%7O=6t}A !!~GgȄ?)H7!:eCf?P<6Qw@!O9 oÇ:,D0'78|{o5yhA[vmQ=ˡ߀9!\'JGJ3RcyFkSf3 cnoBA9|x߬|4~L(YÑҌk~cQ72>7p(eÏ7qԮoG5y w|<|x߬O[ѣ!F0e G o`?pv [(7ʆwr6gOoyee[`\S~6!/j0pחup4#pslSo|d\I|ـ55۴jᮏU9`w=&r\%crscU5 ;ydT~S2RԚL|Sw8b5咑뒑ךRT5*?@BACDFEGHIJKLMNORPQSߘ&r\%I9]\pu5ئvpsxog8{@0=ϔ!+9|ۂ G<w-߶`ܣǣ%Gp٣?߶`qoK,c67'cF?a dzG:5y:x?DxC|9]??{#<?ʆ5y#gk5yئvdv10=^p.&5Άc xes;z>'RGx;؋Q|Lva3=ʆ5yxC?)候eÏ7  po `xmCPǕ?;o! CpCǰ7O<:(~! 8|mjWܠCcBh\g9l7 Os8 Уq<ʆ?{ 3<}n ?!cx5q"{5X"Lk5qk(Rʴ^Sr7AjEJkqqnJԌ"T.)DkJvI咑︈.)1 8(;.ZcM.iE\w\D3 8j^Srjžd tM.:kjM ~#(.kjMdt^jKFᵦ*X"5֨%X^SrJ]K WzME/.nCw\ѫ dt5%c.̆x\]225%W;. fw|UcM Wj콵p [3֔JʹV(֌5%g\j͂;HXSWjlZw\5^kJ6Rcj"2הq2j"2ՌvkJ6pީ|ELS3 \YSWj,|EL5kJmrFk5qSc55%۬lݚml5%j)W͈]kJfĮ5XS2aSo¦jd¦*j •5\jJޏ:b/wJ]ot꿿sM)̆뒑ZS\}56E֔ RchWAϚR\qT)kmQnMRWDMF+kJqEDdx`Mq:הǻ8הj|Mq}M麰{xM^&ההje}Mt(˧;.j\)Eሹ֔K;^jK;^kJsQ5r.Z5%ʹj>\ ֎D9ݔD9-r7%f)QRwSE5%/E|/"D/|/"{5%;եۑ5%;RoGJ)zMɎF|;z|MɎb4HKHizMTOIxMX)e|Jr^SwZ͇wkJZ͇wĬ^STNͯܚReJV+𮔘5 ?Ͽsz9eo   ?~x~8 h|}!mo>C߀p!' =%ʆ`;o[xg0(??!VLioH;aG}~ ߏ8| ϔҟ7: ϱM<-l!܃B ܣf2'aΆ;o[xgߊ)=ad}o?h|=6t}ϱM <=z O 5yBƷz87t9};9eF% #x?A o!NI'f칽%?ч|<GB? (?xs?d}~ 9|ۂ<Ào>>d͓u8>Y<ʆ'K1<[9!wQ6xCk~plSϿsn'2~xc؂ y7YgoGB`?!á|ۂ so|9]]'ܓ[>l(>?YBy$j_c)]&VJwj52ҝzM KtM j>&/kXS.(wS5T xnJf)kWTvU|_"֎į]P*wSP%_"ݔ5cM?&㝺7# u5.dp\SkJR5StU{nM﫱d|M^juu)Wך j, kJ+ؚrMc551^SդҚj,XSn5Wս72˺;1ԚrɸƺdZS+SU"z)q/q5K+xhToG/ծݚO9xMS> S΅ )aZڭ)aKįK<^SWEj>/5w#ZS.4Rc]2h쵦KEהv5}}Nw5v]T%kWU%bkJvAMɨJDĕ)5cMinWTߝkJ~}t)t}_Sה|{ה2p7dND!9 ͑:7+!// :5+E+ͬ#+s#rBK :7+!6+!6+6*A+"E+"?+:ҟ?:Ҿ Wf *A+DMdf *E+DM :7+29+2H+:!6+:9+H!7+6P!8+6*H+& ~24+:3+ >!4+ҿ 2I+!8+6:4+O! ^#V:I+O! ~24+ÿ *I+&  ~24+ÿ :H+Y2:+*I+&  ~24+¶ !8+62J+2<+2K+:<+ʣ !4+6ö :<+O!  ~24+ÿ 4 J Z >N!4+ !4+6*4+& ~20+25+:0+2;+: *E+EZ.]C̭)\NT?u.u'z5Rwj.*\NskJK|~@Z%LJ[S2کc)XS2/<"ƚZS=%qɿsM)Rc]NkM%jEKה.+dtE:'%+tVr;Q5Ή*\NtMmuNWm)]%̆QD^KFfcM2ad0_9pΚerɸӥ_9qqkM2Ac5,\2htUq]jESpɸ5=.=.הv+5vKY)ǥH5RcԵǥkMi7a5vKnj25TcW=.U]S{\5=.I5vKrMiKu];kjM ~L)f;1Ԛ&Q-R25%Lj>&E XS$Vc1ה0w5x_S$Wc1ה0w5|_S#R|8R*kJp4UH)(kJpj,)\]K)pkJpw5.7OLr56&̷VH낮)TT͇#)pkJpw5.GRc]2kM)KU󣸔Q5(.]T(.]kXSRP*wSʴ*Eq{ "M)Ӛdǥ)oǥ)蚒\T|;.)q)f)1P%;.Ŭ ⁻)1Ռ5=e*WANT OUTPUT PUNCHED? END BCDEHLMASPPSWEQU READ ERROR CHECKSUM ERROR ORG 0H WANT TABS? WANT Z80 INSTRUCTIONS? WANT ASCII COMMENTS? NOP LXI ,STAXINX INR DCR MVI RLC DB DAD LDAXDCX RRC RAL RAR SHLD+DAA LHLD+CMA DM?!1+6!++6:5+!++W *++M*++&H+ w:P  > *++&H+ N͵:1+21+!++4 > !;+ :0+™ *I+&"C+>!C+(҉ C++s#r*C+*E+##"C+ÿ :5+=O!H+ N*5+&H+ N "C+:/ *C+DM͓ : *1+M?: !5+:7+=27+O>, !++6:7+!++, :5+!++O!H+ :++=O!H+ w!++4 Px!4Dv!P+q:>+S *P+MZ *P+M͛ >  > !S+s+p+q!T+6:S+=!T+ږ *T+&*Q+~O> !T+4s !W+s+p+q!Y+6:W+=!Y+ *Y+&*U+~2X+@ ::+2X+:X+ :2+/H *X+M> !Y+4¤ !\+s+p+q!]+6:\+=!]+ *]+&*Z+N͛!]+4 !`+s+p+q*^+DM*`+ ͕2a+Y:a+NHR ͛- *a+M͛ ͛ ͛:a+Y!f+s+q+q+p+q>!e+Ҋ !e+6!i+6!g+6:e+!g+ *b+*d+&0!h+s>9 :h+2h+:g+!f+>b+H !i+4!g+>O!j+ :h+w*b+*d+&"b+!g+4” :e+r+*i+& "b+!i+:e+w*b+DM*i+f !v+p+q*u+!!r+s>u+͹!t+s*r+& ~2s+:t+t !t+6À *t+M>2t+:s+!t+ >>!x+p+q*w+!"y+*y+DM6  *y+) w+ *y+#"y+ !"y+:t+!s++N! w*y+) *w+s#rSTA +STC LDA +CMC MOV HLT ADD ADC SUB SBB ANA XRA ORA CMP RNZ POP JNZ +JMP +CNZ +PUSHADI RST RZ RET JZ +CZ +CALL+ACI RNC JNC +OUT CNC +SUI RC JC +IN CC +SBI RPO JPO +XTHLCPO +ANI RPE PCHLJPE +XCHGCPE +XRI RP JP +DI CP +ORI RM SPHLJM +EI CM +CPI EXX EXAFDJNZJMPRJRNZJRZ JRNCJRC RLCRRRCRRALRRARRSLARSRARSRLRBIT RES SET INP OUTPDSBBSBCD;NEG RETNIM0 STAIDADCLBCD;RETISTARSDED;IM1 LDAILDED;IM2 LDARRRD RLD SSPD;LSPD;LDI CCI INI OUTILDD CCD IND OUTDLDIRCCIRINIROTIRLDDRCCDRINDROTDRDAD@LXI ?@ABC(D"EFG&H(IJKLMN(WXYZ[\]^^^^^^^^______$æ !~+p+q*}+!"{+L+}+N++H6>*{+DM6 /F>*{+) }+[>*{+#"{+r!"{+6*r+& :t+w*{+) ^#V!6+~/t 23+ 2=+!2+6 2>+P i 22+!"}2-+>!-+*-+& 6*-+& 6!-+4!5+6!7+6!.+6#6!"E+!"?+:>+/!22+:+A/>F!+/HV:+ 2+x:+0>9!+Hx7 !+6:+,,H2-+:-+!/+w:-+:ʨÛ~2.+:.+2/+!+q*+&l !+q0> *+M͵H> !+p+q*+l !+p+qL++/N++/H(L> *+DM>0> *+DMH> !1+5!+q:2+n!-+6:+=!-+k > !-+4OÉ!-+6:+!-+ډ > !-+4s!+q:=+/җ!G+6;!+6+6:+!+*+&G+ >2+ />|!+/H!+6*+&G+ 6 !+4¤:+*1+M?:+<_G+f [ !"+!++ڨ*+DM6 *+) L+/HN++/Hқ*r+& :t+›L> *+) N#F?4f ?0> *+) N#FH> [ *+"+[ :ҷ?f ͝!+q:4+*+&' N> c:4+ :+*:+M> *+&' HDND DQT PDND DQC =vDND BASHDNDMAIN BQSOyDNDSTARTBAS )vWDND.DAT3  !o"#$%&'()*+,-./0125j^›!mV^-%, IvE~z L@҆{mORtRh<UpMԴGOҲ(eBCVnXe]<][@Ձe<|{}{>NyRI97)Z;k۠ҥVOڡq%ba&[DO1-oRmPMT}q%rXm,c>d96xV=dOI|a*yW&^KTjs-=RMp}'lԬӛ&Hңa HBId"n R9c'NLw2',-UEnIKVvsb{N<$KZ&'nsѕسJy&N\v,eⶫEvb{Nܬ{IHLHijժgQi.5_Kfĉ⎥DʭD u8gdgBIQ-j N> c:+!*+&' N> c[> *:+M> :J+2+O>J-> :+/<2+O+> *+M]> :1+21+!1+6 *8+&H+ ~2,+*;+M! ^#V*H+M!1+6 !1+6*8+&H+ >O!1+6 *,+M,> *8+&H+ >O:,+1f !1+6 *,+M:,+2,+/f !1+6 !*,+M:,+0O> *,+M!1+6 :,+0O> ,> *8+&H+ >O!1+6 *5+&H+ N!1+6*,+M,> *5+&H+ N!1+6 *C+DM!1+6:,+/f !1+6*,+M,> *C+DM$0:`u!+q!7+:+*+&H+ ~:+<27+*?+#"?+:6+!*>:.+²͛:.+E!6>~o&~O ~"A+:/ҜL+A+|*A+"L+:.+A+ͬ+N+ Ҝ:.+A+ͬ+"N+*?++A+ ʲ!6+6>~2+:.+=2.+~2-+:/+E :+?*4+& DM͗ ?d:5+!+ګ:++ͬ++DM*r+& :t+HҤ:^?L> vDM:+{:> á?4f ?$> -> !+>2O> [ !+4_og_ogDM!>))덑o|g =DM!>)) =ɇ {mRL%dg- KId(Ӂ#R"&l/%%؆-TT.9Vg A<[zb:`TZIXųiaxhXJJK,:=T}ķRGdh2-F#^&k7lJZ=Ox)aJ҄xc"+ b\@gb<O x1. b\@7bb|kLOR| 2DWĸ x1@ b\@ĸo THEN PRINT FNP$(7,37);"[]" 4230 IF FNS(P(2,2))=0 THEN 4270 4240 IF FNUP(P(2,2))<2 vDND.DOCu  !"o#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__`abcdefghij klmnopqrstu^V-, cin]_lN= 88~u{x66Ox}v${^`/]\ܻzbZ& TG1C˘KQlp^H ζ秧8}T=;.cZ!4N!@ ~2!6@=>Û!4GN! qyC>2!G6! !6@! ù ~# p#  NO MORE DISK SPACE$ NO INPUT FILE SPECIFIED$ INPUT FILE NOT ON DISK$HEXxl >2WANT OUTPUT PRINTED? !\ASM%Ǜ{!#58۞vsxS=;.cZ]Gnޮmn Gnޮm1--Gf敳 *85nUGgeL11x!dՁpcxY =O^Z5°^0@o=;۞g$BY)or_GHc05Fo>{\*߻SL꨸Ykpubgc &x x# a5L`Z!!bBਸU`,vU zMLx5&bWh 5K v0&=xd)n"v5+% ='L0c"(&zӓZBɗeM&K]w [j`dZLh]mQ'ȵS3j.ƊZLdf *j.hpv8 k=%К .qwКLLvК  ` ,$LG(DL. b QMx|/d5k8!A] ^Y֐&1{jB IL CÒ6W1m2!ɣ悉0$&bɄ! 1XcůÚ 3 ɠp/#$a`c5 98\=КxYB°5Ԅ5U1ńʊ,j.1 rqBs0++Ê<5P Ck2sӉOapeXb` SX-`EzzM5_bX!5d1zPs$ d!0Bs01Ǩ` J9uML^;E"s8YkCp:Yͨx<{< kN,j.1)뚠 gaʂ#!Slo-mZ!$mTd+Ê|Σ;haE(ÊTwЪÊP,5FVbBwu?`{^!j.Ⱥ&H&p/xz.6)&EiXS {jf ymVbd``dA]6V[dB!,cPW' ԪC I0Pc{ kKc1)&tWL_Z ,k|6 *P5B7ge AGs0&A15FN0i*tD ;9.SFţZ1^ۓ1(.Ep'dbBwɄ xdBSD0c"\\rޗ~fYg Z``Eš$SL-T;C2Hp<$ZVvP?UL︠awG 5 +$Ӫj.ʰ"o+dj+ M1 ZcE#6`7{ Zñ`EL*`1hVO5d]$B}ǒs0Y\Ls& yH&b &''HD٣aL'!bjH [g2bCzru ^{q+Xq^Vdcy}|Y(=V4=Ϋ;hxv'9Sa)  n6כ% Ţxu P ` z-SpLh 98(FahMƂG\< *]l29 u Ck9!+Ê FD +5` 5(=s&O=Ck2;BV3B T1ńA&H`aH&u Zu(gc#<ٶaL7#j.Ⱥ&CÓ Ck2`G Mq,؊'7IM„cd $=sbZ,]k54=A'0vV*%@5xĵZ[u79Xd2dB-'=aSW1Ŵ\NŅ&`Ab©` Sb׉bi`m xĉ_WMB&_X fɑp*Pc9U`gj\\Xk1R&F6& V#vVۘn$r2yH&2C2Y}CÔe!b~׎Ax=ߢKG%^u.4>\EG|Ƴ1讞.1=y ;tWO.q Cӓ%{ }|)&]!VA}ĉѥ%M}[v1=ya'3[-y.wKyyЪ:א6˘b _h0d e1 kBB-; ɘeLn\ZhyXd2.hM{l{2~טb:/qKV61\.5D},q^<"LYpkl}%.”~f-L '+POQ#!I[--)kHK3c vNא6 GC [מZ C205@' ԁ ?۞b:~)iUuӓ%.hD.Ƣ48+XQp 셚,q.”VUӓKP+xm--j.hHˆBzx{jb:xyV?To1=yVLYȁ;+ -; p1<]Epy#RU lO=c?tSL/!C={xf 5CP^Psa(іbzręW] Pc0{ A]CbQs=)cVclL=&)Y\ F]Lxc^%X\ +$9K\`SuεXY!a cq0;+c@ս<g #xrdܜ 1?Qu/_Y¶l xn,r0123456789:;<=>?@ABCDEt0v FGHIJKLMNOPQRSTUVWXYZ[\]^_`ab  cdefghijklmnopqrstuvwxyz{|}~|w}1/iqz]5o3 jge2cQ Uf?yu;smWEkYI7_C9-[OK=aAG<+N%{SMB@)pdZx^\V#~lbJFD:6h`PLH84'!XTR&>($."* ÿyE; 655״=-YMo vM螁Щ=B~O5^nOzW=Wozeh|d>=qw;cm!ܜ 1Pu/|pxHjptDYv ]|{ ]k ='i mOƠ 6 OgF3{CL 'cP\[bӗ#1ukO5n+5ˊ6t6dg/䫘N.~tbh¾)qhzm<` Z[6^N^ [+6UL9H Mqz<;ʳ60 1ɄYPOgp=0𚹁)15dpsV5yHȺ&dĊ0ɨT1nv{[(]>;D~O5gag`ll=|,~C gN6oc18?5H֭fݚ7V>a`V݅CSZIb&rXkϫ?EqmxCc](!qѢQ$V8ݽ/GK=QYkl|609݌b5 g#H^04mAqь4idlaN}`E`1k/3wƙ69;`zg_jɧU=ՆGXM>+#,&.ԍOQ~ | PkOXVj#la^Rmx#,^{OJMGX|W;|GXՃOH%^ /`x]}eʰRmxO~]zѓPI | ݡGVeIYHgqGVGyIX<ϣN\u%(:,QyufY<ϣ^3eqG-e+ţlx4D,>-q:b>>;>pT]pt;n+߻K&<>'P^/&'P#!tKi7t~Lq\4#f:q\4d*"{"2ƣ(vFV#ʬ(R:fb?y:fdui'톮؏xLSuc ]3<E3ΣNtujLQg<괙Σ,a : Menu program for DNDMAIN.BAS AND DNDSTART.BAS'b: Converted for XEROX 820-II by Bob ThomasGbC$()()"5"()")"\bC$()()"("nb ()"=55"b ():: P: "Please input the number of your choice:"b(b2 " 1)Start new Character": " 2)Run old Character": " 3)Goto CP/M"c<ScF "Your choice";X: X "DNDSTART" : X "DNDMAIN" : X icP ()" ";C$()cZ "jppI";C$();" ";C$();"jI";C$();" ";C$();"U";C$();" ";C$();"jppI"Mdd "j";C$();" ";C$();"j";C$();" ";C$();"j";C$();" ";C$();"I";C$();" ";C$();"U";C$();" ";C$();"j";C$();" ";C$();"j"dn "j00f";C$();"UNGEONS A";C$();"j";C$();" ";C$();"IU";C$();"D ";C$();"j00f";C$();"RAGONS"dx ()():"dn "j00f";C$();"UNGEONS A";C$();"j";C$();" ";C$();"IU";C$();"D ";C$();"j00f";C$();"RAGONS"dx vCDNDMAIN.BAS  !"#$%&'()*+,-./&9Tkyי5ѢhFy0N:fGA; fshF~Y?;FoES} gTV +Hn蚋 H HAJ;Ksۙ `*V +HT Ak.äTJAJ;߿3 \T\+V ~MrWKՙ YE٬fo9SA0>["ׂE}[Ψ?g*ڣ*!_qFul|PE6eqwQ߻-g*ڣ*!rFWaNl2Kf@8:E(-x 67f hx\OP yU|3V[3&<>RS;®ބ{|+iA%dݜ>'z#[|f hx- *!VdtF}o?3[ZiV3L$ZaW_/@ ]W gӟ;S>=2Q|Ol\)L:k&#'tYuv=ѲYjk&<ͥFTBknښIYMjTAVBTմZ^B3w*M\TSœA}Ho_{l{]䣽<:T!_u@=Z^a(|X2509:nzm=Gl)'#.zZoK"`X%Swg|ݤrGWkǷWP;KtBt} zS%*䷶Nh ԚS /mԍM$Ɣ8T}߼\U>rq9&.L L*Jc.!=W`uEzEQEۨ7< Ѭ/ *!=wraʖx;ԇZsab7[ܩH)#GpG@8S*!ޫid7V)z UЛ jffbA8ԁ &Eu@} w1OCB^}@u@׊[*ЙΧMT!uSW@@9Do!^tN:ӹR귟br&KIg:tuSS(!&!ݮ6p]+6p`]#0'>w~9CSTA^2ֻ{cE1f|IQ=@7 }6>+eA%aWl?=Pa|䢊L+6ɩ?xM(ч|@$9"

ETd"UP$23r>EGCu@ Uʶi!/C{.fۯID =@]䣽_U Gp\`|Q꣏@"LROrGKR]䣽JBvR#/;PBs)h XZIn}9;FC\]7`lwLTQ:G..p3h$8.fuKcͺUm̆]oֲPK@ 9*Rmx[U}'Ut HݞTBߥ>ӿw27נۂJTBs[sQ'+"`S7Z04eA%]1/~V1}ݳ-^s]t2iYmz*!ϙTAV6Q\Ӑ+CZ0},cd709R7Zv 9 ? :zEtr"&!@\\.fۯIΣI}ȱ׮ 鑋* ':$e o® jZ-Tw=ͥK%9raʖx;B]nQ)(nqgx3/rC7d{EzXoڨX25flt69(!ԇbS{/ݞS˝zꈎpD͎ zL8~ꈦeïC8pS ySԱnMQ%n4H w2Ɍ"kY*/nWolI90eq7r#RG@6eJHU/n 6!Om"9EMNm!:DTA^2ֻ;"`ԘeE>B.l}`fe333WlX 4*:#UkZW}M]+LY6[ww:3XE1LY6s݁LιlmptGf9a@>fj:UЫ\T!T}Gq P"`ݱd YTe뚉hQ u>=rQNihEZ*V B^y:s)kн a[Q` d~oM{$<|=pVV݂p5)[a++\ n>X!ffftn3Jî7KHϥE(S)(63'C%cxq9Do`{Q /3g[Js&.]UyÛ4sf O3Q|hS|>=rQO΃N#[a++\ 7n /]33,9a*!4Cd~oM{5ᬬ8d+leS _zUCpRK!욁nt ښQ׭ڌ򰫾NuJs&! jN4*b&UJGrj7PkN /@vhZfXPRu2nؗᇆ&-nqumLTQa]>rq9G{o&!~a -᨟'KȱTANGXQEOx~݀n C_Pz]'s?4<趠 lEjCo9YBz.YͰla,H׊c eu]}'s߀t:;"u϶4{ CP yΤ ڴ*Ƽ.~蚓%璮 36L>vcɵ݁Xw'+b&}ϣB,=0^62mXfffK}H:yOg遁f ? FfX˂&m"TB3.f^yT1//+dTBv \^9vR׊r߀ehB8iEEMu??C\]7`lFHJȱTAj#,B׮s!HTAB@!/?ҼP>=2q D.k<{!-4Q-[O |[8kί˂J.ZCc\o]!~V1f9a*!մS yT] MBJiHB7Zh,Hg:tI\!tF M|[8^tN:ӹvH}unRfr w1*Σs9vR}uޅE(^ w*M\TSœA}{ל\Q)[EƵlZ֦Y-]7L!XKq*!|}*tM__>/Gf=-n y>|dǨBS 7+b&{˃C2ݧCV,X]>(z݋._7}ftwLg]*tmxww:r yf|ÂptG u϶4{ B]rnf5-TB36m *፛4<) w1PܱO}fg\ʵ$!~okz =Ü_ͥTBvi|I}ȗnWofOo8/mYh"1dyY1 3c. )DƸn ;.K}ȗnWv7nfҞ5e-nq*!=Wlzq!t ˰3wIJ`MRM̾ G{oypuB>~ٗC6e[h $Y^_WA^20tX2QE|n1WK}ȗnWo~/h HЯF,ߟڗkE[Y-%{zz.y޻UN"LyWA6;C٬_n|!lW}ޕ*b&ס Цyv@PoNFӮ:zX^TBvo>}V,nN,^#U;N"`X/E1f|I1_|>is 3x~W)u,^&mQG9gH^f`0B v@PoNsͶPg}%dݤs>U+mYfݞkL;ث:ϩ\>/h 5:~g[1#|K}T7}fRr^rf@8aaF3 {˂Jîz{gn蚉|d y>K};`z y>={r@9eMf`lm4eA}gw>u&?uCUTqH;J}ȧ.*f5U\] p9tmUZK/TpH[Dg_]sQn>H޷'/{"=|%K"|$=~ 9vCLGmq㔁4QQдĸD[K/vh#kZ5F~25c|0=&UPBTBګTBs)i2KSh;7PkN!C7a^ + P?}BjSfr KoqT!N, +E>{⻗TBz.!ܹ'1<ۨ *!Hj&!lW;'Tj&8-R;V̲""`:UȇcLC/7=%ar@$нeAR ~Joj>_],lfr*'r@{7hxQP]'Tv:t.fJ󨢄|t:>sOMږmuaל3LBo*!0/U:QBz.!K'rϷk7Z3 Ϛp/U7!욁`Y2<ݨ{s$Wm淝Q)[I^ƲYjxK}{%1raʖx;b*S)h X&ƍ?f#gz T!e}6욁^}oFP 9CU[NT88: yςX%1rޚ5mLe.[Y:؏l:e2]B ةv<%1rf`HlXs7a offF(̫OT0L>GU5'*b&ޫ;ϰkB u38QBz.Md5E&'`xSF⇆ߘTBvo<9Do`iuՍ]TBz.1~wJqԿ< 'J.VlMu!NDrB$ͅH]PNhl |,c{R]S5 t95LI,'JHϥBo0&$4h`eWg!h ԚS nN=u5' Iˌe),^>0ylAGB5 t ՍVV~g˂toqMgԇ{5ɕB޳N| {r9`כVmyYP yإ c,K,u9Gr5哗ZX6)Zש̚vQЬ (4*.nKJc.mķ GwI֌I}HoAKraʖx;" [J]i.s_N/)!=zVleԇgҾZd"&*ȦX25(6} =!Z[kkں *!ϙ]% w1Ogw`qT!]SZűlv,MLN9Dond>e@8#`F%jhVcSfiVJs&\Cz }I y̥E(xp0emZs@ox nP?L+6) ӽ gnuhF%lEDb4mԅ.!e}u[ c;,ՆGXQuXKJc.!YPuI y̥ Gz67D򕗨==sIF5öKV5rucw^CjF3=մ6Щ6"iP{%%9JHϥ>+/`|7PK{Bo{˂tXk,C2;"u϶z/jZV[90eKQ<@POs<=7/o ¡rl{= d&RMPMo^؍lfb?-`ͦQ-2B_N7=CM/ ]3gNCz ޛ/܄l-DمHt!XH݊V$oފ乭Hq+؊}[鱅 #U/NduQ|jA %۸E%U*-:vMPֲI}=Uȳ XG./YFE#d!F&.O-BE#d!F&ZU [Tj.۷ԣG^CX~î Zԇܳ].T`uBtI%*S mG/TP$lZU [Tj.۷r9òeZ6nRrvuWPa| yjtǏB>_Ņ BfF]ε.(!?\T!owꩅhZl\&!lW~uVaͶp0eKQ<@\Cٮ~W*("`ݱdjc:8G9]3~~hx ?L:~W'rf :F{ZTBvwPsZ[4鑉*-uOlP8jId*G/NCٮ:7߷UAMLT!o{nl+9O8j>걛k[9 "x>Ȍ^^qs}k7t~LR~ь,v[E3J'cjN-tq'k;٬c5r2/U|xk7t~_4#tN;i7t~[_4#v*o톮؏xf1;ԘΝ8ӹi3;Ysک5ѢekLNtN;)hF`Vohwھ3;s譔CX_7Ad&1x| yUѭn&L|[8FJ%~I%dݤ>䷶|K9D2`eu?IwP7a@g[8l|DٸV,nqWgm-ke|P,ٺtg=[8=m[\UsS)ۈrG:ߴ{zv>8=Xa33fffu{oOΗ\Q)[IVN,6#;(!~aCƜzòv{ƌPW\ӳaN=uD(?uD 8dAsSGXSG6΋!zꈺpF3]3Poa}¡rl tz$B*"K w1OCBpBG_<_p3hRkFͺ9n ~`S yΤs-a, K tBsKK w1OCBpBG_6_p3h-nG~}.fۯI^*{;s&`&` /C%R]{oypK%K}HoAg e"|{5𬙙P]'M'q7Ǻ&STBԇ>t,@ϊ9DhJHUolt.f'|D[5tM!l3 .LP 3TBګ-ٚ"`I}=p+h wZsʀB}閇Js&K}HoA-r{+D&{**6Q|[޶UlTBMjZVk%S|P;Lq j!jZ-Tݭ71kmuA}ȇԭ{Vuo]7 зuTy>m -nUa&vQa&\s_ز:a&"`qSauÛk$V5Fk~;)usMg<_7ԇ|hKs;dԇܪt4J.m@7z#\*+:,#UYRO9#sS);MrG4=߮u*HQE6,Qߑ9DOm4)óu.ԣwE(#t۰`  ZJ9G$ .8D"WޙqkٱY>cAclv0s;wNɚƮ_gs>6w*(,VUTQjPnYfƵOQEMfZp -ɣ⏯MwQQ.ZZm`R EN=u78掟Rs.8?#CKK &|\n蚉8H90eQ͝K NYtUU dhi6*!S6>ܩN?~`nEG?9y6K6*!S6>ܙJ:6A}5sy:ExG49o[p' 4ҷ-Ez#k$][QQ)F;#jpYV Zȝ/q?90e(~'w8,?8aWE('P?x1E('P?ҋ0g"KGիhGi.UZ8SiNi.iEa!s#s*!jZqE#d!3#*uЯ]'۴89h,dndrN%䕒"鰐9wJ_cqM9H:,dnJ;_.h,dfdr>2q Ea!s.#UN׮mZ|iE#d!s.TB^)֋;qEa!3.#P4B23r>2Qշ_6-~ iEa!sTB)ٸ"鰐Q*#z݋mٻМV4B23rN%䕒mُ9H:,dfJ;zm6iN+! Y7rN%RŏLBtXȺQ*ӱmhN+! Y+rN%R_y:H:,df|dFB֍LT!_c_9'۴MӊB֍ZS yT⸂u#*b'۴mҜV$nJ;W^'۴GsZYZ9WJJigd"鰐u#s*!!h,d|dB֍LG&/}EqM;}4S yT_WP$23298u#*;b7'۴ؤ9H:,dJ;O#H:,dfdr>2QܷC=pZmYlҜV4BnrN%R}/6 iEa!3#s*!4̌\ΩR޷#٦34ǏLΩSҜV4B2329JWdv34ǏS ydvO6iN+! Y729J.Q)ۈy)%۴ɩZ|ZsQQeU쨠X\sQ2QBЎ ̍LΧG..GY|*raʺQ<_j ̍k.P|ŻvTP4BXQE ԇg]I7G`厀2pwMusiقvC5q6:C;e)E،-d^ۭ ٴ6<Β[|`rdKB꪿y 2EU~e7h w +4vicHޛeA%RV2 UmnQkN0<1QI֌>U-uןVh$ o DlN¡rlU8N!K5!P~wvK] Kŭ#I*TonY7 TQBs\W⯿YZfgTB3{]_fb?Zy3!Rl<[9opG2}cٺyw9T}n Bkch{ cFP 9JUG_; tZ*p Y:~v{5W[)mXNǨ[Qmٖ z*U-}ՇoS}}mzFb˂JHϥ>{_C5,sM64 +4dYUs@3Qbt[PZ*KNCz ]*!=:~[9D ff@3͠h3W߽Ӻ a+O"yo+/jEHE? [9JHϥ ER7~tkXlp3lfd_W)uSڮ2>d+.s@sQl?@"hx ލ60eA}+6G>HqV,^|d"kKna%g!Tݭ®N/ut VbM!ºaYnؗ' Jȱj7nUӣoqTQB.!g(GZ w1~Mr%mxq+m+ᲠK}+6Օqo+2329rI̍OwQaz+QAY̨)ǏLT!oۡv(”uxwħ~Y u9Ea!3.]TS۸#>B+QAau.皋*];u9rǏOwQ|[vTP4Bndr>2q Ea!F]G&wPWQ)xwħ~Y| Y729E#d!F&]TS/D$wħ~Yˎ k.oߡwTP4Bnr>( OwQ_u#S( Y729B}bG"LY-qG|ꗅ}GBfF.#H:,dfdr>E90eKwħ~Ym/G՟`lGjB |noLٯ Umٯ@Gէ^`Yz],Uږz κdHTqTzܝߦcn41I90e;зE.w[SvBF90eE( "LROr:~ӊmp:xn yإKGg߸9ֽ6B}\?-!=rhh"1dY8LiCZ0f."`9WGnVӲBQ7Ǻ&Sξqs{m2n{)7$Sd541H[Bz.mA8QmٖIG$Sa4UU'}[1>ξqs{-KM*޳wKHϥ70#<4SF,JdjݤCZ0f."`9WyY7iYmBn?Q\!~o9䈚n#u϶fLu/q+j##zٗ%aR~mLٗtT}qH3gǷN:Z_hEIN9Dojt:F]8#B_l'']+KXw,C:`Ͱm.(iYmg~U ڨBu7*!ϙԇ/jY"ZI%ء~7^*!Jũl> lj޲:a6k$LC^Rx;Z9Mr*!=*4UVK*UALT!-^K®N/ut g5MkM k&F3ԇNjb]{o&m̲Y~MrX2kz Kx\!RG -,v h֭A}ȫZO{6d}SXdkԇ|YK}'MЇb$oXmT-FH^~'\alS TABZs?yb w1_cqk`e3®N/u?0eA}ȫZɡ®N/ut sښ, !e}I2#*!vXANGXQErw-V0L>{5ɕB޷f^xb y̥BVW tꆱ,\C^ްhidkEC>sX)[TBz.Uh.z䅏.ZxZԇ.U/T-ZZl6QEa :u-BoC^Rͷ,v̀pz#[jzfW 2>V$c;kՋ}H{Qk--^ [3k"!_RO, }ȷ/Frl1d$NF[gR}7߾JYũ \!f/׼t_.// \T![-5XBvI׊K ymW]VbI׊-%S|Plq,C:`Ͱm>#(iYm`[|6"iPMed yΤ>UY!֒fh5t:RW߹TBz.U0L>lc{o& U ݂5ֿ^:,K w1,ۯInC%[o)mkyYPVj!LC^RkrFw9לmZ^ԇ\jqJY̩\ \T![->>㚉hh&craʖx;ÝL=qm鲈i'8w6JHϥ ɧ>QoSU90ev̀pz#h2aʖx;⢠>U-ul#Xp*!=*4Uǯ(!&:sWoW_z`./_vA%Prv7?a,ȩ\!~HfضQ_մZH%9S}>U-a,N9K9DVMغ7^#d~׍s$A3 fݚ'7*4UVKRMׇvfb?6h7B~,#sa wp.䔣Sœܙ Sg.L0UQ)ۈ%̅)ZMQ)[ܙ Sډ}/}z#Gl#'3atJHU}鑍E( "LFOrG@8=/uS)[I\G90ev̀pz#[=C8Y:E؍\ ofrC^R{7zn蚉穂N\sQ^ ɧ+PEtԇjoaVlM8>6"H~}#Pmtƙε8`awƙ9!olf::m,kwLrU=[_2k-dk-jhTBԇ|YK= [;H -^>ZVbS TABZrl"`=>*fUv̀pz#Ox~ݰ3JHϥ>j4C5饎nf$a_NJ$$*!vw4 KG#,⨢ \CP?&+b&JT!T_dX+:uXTBvyŦLRJHϥ ER͓^,|LqT!Oo®N/u߰mnL˂WlO5#э)Zi6̥!T3=6y,!?_<F򲃪'sX)JHϥ Dr's@ JȱG=;fb?6N&ƛw"#kY*K&]}tr'߽t2pIs/@- ]^:YM yUK Y{drӵ..G{:p9q Lq9:*7&?9%mXkFݘԇ~gߘQOO tpn>"H!9-N9\ͿU[^TABZm?;5C5饎naQtobF .fxa,1K}kjgR/r*!=*4UVK]򒅃VWdv{VIN%R j_y V0L>{˃QEa :hm3Wl/y`{, Xvn33m[^rAK-QC>Z/`+es)t#Bo`ޜjjd+7PX^TABZ^R;XALT!no~~꩏=|&XY,]2sCUz!XM8>_ڈU6:LZg|P׻ԇK6ӹi3zrUo[2kYA_RR*z\,sE^OΩhz5Sc:N\sѥ-VPE=O3܋NE%aJHϥzFꈶ@9e7v@;kPڹ_w`  o=AV[3է~ի w1~M:\djB9D/}sW>;^;C?^+O;p>w;#q DTW59_#5_w` !7at fִuߛ'K%aJ.!أo_!,M\OP yإFZQ]=׬CX~ގ` $~=߁]3 (ބ{-Y}oF'VK.]*!ԇbzo}5cdefghijklmnopqrstuvwxC`$`$x0'"+M{V N%Rf 9R}슃90egu4mu^fԅw|s}Ztk.]io8z0ۗMˎ~ese Jȴjo7eC\atk. 9C%d%oVH׆_f݁׾;`$;0z VɁ*rik}Űw3m4'7#\C^qP 9k'euMެͮ{?ƒx#kOG..מÛUsCs{+aپgu#BYjF3tHtzbC^Rs?wovD9%m5CS $A'֌>U-v0׼qښצlVf)G=uC)*!lW~wZZJA -A}ȗsX)ɩ\ \T![-uッ9D1kƲK w1O