4NNNNN]ap NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN垿O`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[_a c@e`gikmoq s@u`wy{ @` @ ` @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!!#A%a')+-1!3A5a79;=?A!CAEaGIKMOQ!SAUaW[]_a!cAeagikmoq!sAuaw{}AaA!Oa!a!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%_&a"&cB&eb&g&i&&m&o'q"'sB'ub'w'y'{'}'("(B(b(((()")B)O`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[_a c@e`gikmoq s@u`wy{ @` @ ` @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!!#A%a')+-1!3A5a79;=?A!CAEaGIKMOQ!SAUaW[]_a!cAeagikmoq!sAuaw{}AaA!Oa!a!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%_&a"&cB&eb&g&i&&m&o'q"'sB'ub'w'y'{'}'("(B(b(((()")B)A71 XFORMER  `ATARZEE1BAS ؠy"CALENDARBAS ٠.EMULATORDOC Vt  EMULATORTXT qt I LEES DIT t HMAZEWAR OBJ _ATARI FNT _ATARI FP _ATARI OSB _BASICB CTA  _FASTCHPFPX _NEWELL OSX _STXMONOTOS _X6502 C q_XATARI C 8_XFORMERC kb_XFORMERH _XFORMERMAK .  `.. DEMODISKSD HhSTXF21 DOC E]|STXF21 PRG E}pSTXFXP PRG .E/,X4MER000PI1 `Y"}@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED697 FREE SECTORS COPYING---D8:COPY32.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 128ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8TuR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8Tue"#NNNNNNNNNNN1N1N1N1N1N1N1N1N1N1SSBNN1NSTARSCDDCYCTRSCRRCNFFCST}PRRSRSFBDYZD@@@@@@@@ @ @ @ @U} @@@@@@@@@AR@@@@@V} f<<@ !A"#@$ffA%(&'(@)@*@#+W},@-@.@/@012@3@@A4 A5 6dd789&(A:;BrX} VERSION 1.3 ST6-6-@'6-@36-@?6-@K6-@W6-@c6-@o6-Y}@{6-@ 6-@y6-@6-@'6-@36-@?6-@K6-@W6-@c6-@Z}o6-@y A(""*******SOUND ROUTINES*******2,2A- )2,$<4-6@[}$2@42@F6 - 2#2+-/ 3 6$P""******CALCULATE SCORES******ZG\}68<,--"8<,!6968<,-8<,%8<,= G Ad n%8<,@c%68<,-@5x8 6--]}8<,!6*6-%8<,. 8 A@ %68<,-8<,%8<,%"6-%$##********PRINT SCORES ******** ^}"*"$06.7$&<$,-($6-*6-06- "*($7 -2$+2AU&$3-_}7  22# 6-%!6-#6-@6)8<, -(`  ) AP+6.=:8<,,B:`},"+67@,.  - ( ,8<, -@5"(` , A%6.=:8<,,B:,"%67,.  a}B:,"67<,. -@5("3 -(8<, -*(8<, 06-3$,!!*******ROLL DICE***********6b}= -68,-P:H:,$,%(-$%=(78,$&<8,$,@$2A2! $$J ***TOTAL DICE VALUES****c}**T; -68,-  -4688,,-88,,%8 ;$^""*****CHECK FOR ATARZEE******h  $r1 A@-d}8,"$6-''1 A|   $N6-F:A,"-AU.A82J2AU&N #Ae}2#28<,$068<,-8<,%A'-@50(8<,# A - (8<, f}#$!!*****ERASE PROMPT LINE*****.-@ +( .$!!******MAIN GAME LOOP*******# 6-%g}@w!#6-! 6-6-%!!$A1 A`-@!1(ȠˠϠR:,Ah}- AP- A# - A`'-@ '(ˠŠϠ 6--@!(^ 6-R:,i}"AP&T:,"A0*A@: 6-D) "6-%!@')6-@'N "6-&j} 6-X2-@!( !-@!((^2 A@b/6-+&,'8, -%( / A0l -(*vk}68,-68,E2A- )27-@; E A@A AP-@'#-*( .l} :-@!A( -@ 6-%" -8,! " A A  A` "m}6- A  A I-@"%(Ԡ٠16-@y76-=6-C-I(T:,"A  n}6-R:,*A0 6-6-- "6-& *"!6--6-@! *"@!6-6- - "o}6-%!*"!6--6-@! !6-6-  1- (>:&A(,*< 1- (>:%A(,.p}-@2 < A04; -(>:,'6-$+"@!,%'1 AP; A@>D8<,2A,-@q}0 :2D A H! @` AP! A@RwwApApApApApApAr} A A 0AAA`A\""************1 - 6***********f168<,--8,"168<s},-8<,%p  @ A z##*****3 OR FOUR OF A KIND*****968<,-6-'% -568<,-8<,%8t},9 ( -8, @( A & 68<,- @& A ""*********FULL HOUSE********* 6-u}6-" -8," " A  8,"6- 8,"6- . *68<,-@%$ @. Av} "68<,- @" A ""**********STRAIGHTS*********B 6-6-'6-+&,$%-.8, 46-w}8 B A@2 6-%"68%<,-( @2 A  $68%<,- @$ A  **********CHx}ANCE**********$C68<,--+68<,-8<,%8,/ 9 @C A . *********ATARZEE**********8 -y}8,"AB 68<,- AL68<,-@PV @`NE-%@ $+!@,&+"@,$@z}&@$+!@,N(8<,j! -(8<,-!(8<,t -(8<,~"Ap'-@ '({}ӠΠT:,Ap Ap********GAME OVER********$ 6-6-- 68,-$ 8<,|}8,A! 6-%!8<,!8,A@ A N-668%,-8,*68%,-8,N67+%,$&<+%,$,.}}7$&<$, = 6-6.7$&<$,"-/7<,0 3 = A6 6-%"-&(67<,., 6~} A 768,-8@<, 68,-167$&<$,.76-  6-6-%A+@+} D:ATARZEE.DAT:-(8,+(7$&<$,/ 4:6-(/+ -(!-/(}2 -6.7$&<$,<3 -7<,4 %67<,.-) 3 A`F P* -%(-%*(-8<},ZU2$@0/2AU&$@0=-@ A K2U2d  A`n"+ -"( }record scoresx -( 2 --%.(7$&<$,8,2 " -8," " AP}-@@P " -%( @`"  A` A?A!-@@"?(@}--@P !A*T:,"-$+-@P !A+ Ap[[;A},;@`,;,;@@,9,9,9,9<,;,;A,9,9,pp6.f}006.&| | | |(67,.} 67@`,. (67,.[+ARAC6-F:A`,%F:Aa,$AV%K%S%[%0 -}(CLAYTON WALNUM'S$-0(S --$%*(7@<A,A-AU6@K2O S }6 2-AU6A $+P:',"',"# 22AU&# ,# 22#A }6X@-@!F(©RIGHT (C) 1986 BY ANALOG COMPUTINGT-AX @j+AYAR1A}@P?-@"G%K X(>:A%,jAY@4J6 A-0(# OF PLAYERS 6-T} )!A^ -h, A@-%((#'S NAME,r!67$&<$&+&B:,,,.! |$-@"}$( ONE SECOND...& A& D:ATARZEE.DATA -68,-"367$&<$,.7 A B}' --68<,-6# ' T --68<,-)68<,-468<,-8 < B6-H6-N6-T6-}Y++6-F:A`,%AV$F:Aa,%;&@d%C%K%Y%A4KARA'A }9A@"KAA$#-" A6%$ LL72,138,72,169,12,162,0,141,10,212,141,23,208,14}2,24,208,104,170,104,64-AA-BBA4 -4(&  }--( 4 -4(& | |> - (->(& }7 -(Ones----------`#-7(Twos----------`7 -(Threes--------`#-7(Fours---------`7 -}(Fives---------`#-7(Sixes---------`&-@( SUBTOTAL:0E-@!$(3 of a kind----`0-@!}E(4 of a kind----`:E-@!$(Full house-----`0-@!E(Small straight-`De-@!$(Large straight}-`0-@!E(Chance---------`Q-@!e(ATARZEE-------`N7 -(:-&(:,-7(:X}2 --%$$(7$&<$,( 2 A`b(67,. 67A,. (67,.l!! D:ATARZEE.DATv: }-68,-$(8,6(7$&<$,:  AD:ATARZEE1.BAS! D:ATARZEE.DATv: ^ 5(V<( 0XX 0XX ?30< }~ffff~~~`f~~f~`ll~ ~`~f~~`~ff~~ ~f~ff~~f~f~6lI,ҶK,ҶK6lI } +<^[^UU(~( }~~(~~(|6@fu  8n<~<~<<<<~~~<<~ȆX(*4yzyz }ҍ8ԩ>/Ѝҩo @ԩL1@ԩ021$<=>?ҍҍҍ҅ }23 N&ƆƇƈS2),ҍҥ)  -L%֨ I - }y1 ;)3dLy&L%`.T)I33mz3ɥ#P3z3z3UQz3 m3ɥΎ3 N&L%( } \.` N&z3)3)eƉ / /Z3 5慑ꩆ8O8 } Z5 ( r5 (Е /䍐 3ۥ (031ԭ. )L }%91y888"ڐ 8Ƌ0I8i8L0' )ҍҍҍҭ (L0' ) }ҍҍҍҦ1i8慹5 / u 0ʼnᦎ /*4 }$ i < i0ХiƊ٩)Ɗ ƌL }%拢ȥ БȩБii慥Ō`)bL\)&!! *)e! *)e!) }L-*֨ L-* -L-*L,xIL-*w191w1 &0 91w1M &0 .L-* - }L-*)b . &0(ĥ ȩ ̴1iޅ1 /L+Ɇĥ 1L+ąL*0L+ 0 }^ȵ)ys1ĵyi1ą u iޅ1i h.yq1Đ̊ ̙ҩƙL+) / 0$)ȱ }) 6̥ĥL+Ɇ4 1!ą 0 0 0 / 1ئL+ G0)L,)L+ i@i }  90 98 Č뵬)0""Č i i<$Č֨ )  iҵ8j }I'i֬ . ҵ) 0)L,Lf, I iҵ iҩFV $1 ?02ɛɞ*1I5 G08 }m1i1)  i1iƏȵ)F $1ȑƏȵ ҵ)L,) }A ̵̍) I*00>00*<>}*?? ?? <} << <><*?>?}*>*<} } ???*? ??} ??? ???? ???}*?? ?? ?? ?<?< ?<}?< ?<?< ?<?< ?<?}< ?<?< ?<?< ?<?<} <???*???*???*}???*???*<?? }??򪪪????*}?*?*?*}???*????*???}?򪪪ʪ???}?_*??򪪪} ?*??𪪪<}< ?*}??򪪪ʪ?*}3}3} } } }(F<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU }UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU}UUUUU@UUU?UUUUUUUUUUUUUUUUUPUUUUUPUUU?<UUU@UUUUUP}UU?<UUUUUUUU@UUUUUUUUUU@UUUUTUUUUU@UU}UUPUUUU@U??UUPUUUUU??UU@UUUUU}?UU@UUUUU?UUUUUUU?UUUUUU?}UTPUU?UTTU?UTU0<}UPU UP?UP0000?}UP?U@??U@??U@}3U@<<3U@<<?U@}???U@?U@UU@}UU@U0U@U0UPU}0UPU0UP?U??UT?UU}? UT?UU? UU@?UUU?<UU@@??UUUU??}UUP@??UUUU???UUUU@?? UUUU?? UUUU@?<UUUU?<}UUUU@?<UUUU?<<UUUU@?<UUUU?<UUUU@?<UUUU?<}UUUU@?<UUUU?<UUUU@?<UUUU?<UUUU@?<UUUU?<UU}UU@?<UUUU?<UUUUP?UUUU??UUUUP?UUUU??UUUUP}?UUUU??UUUUP?UUUU??UUUUP?UUUU??0UUUUC?}UUUU?0UUUU?UUUU?0UUUU?UUUU?UUUTUUU }?UUUTUUU?UUUSUUU?UUUSUUU!}?UUUS?UUU??UUUP?UUU??UUUT?UUUU?"}UUUU?UUUU?0UUUUUUUU0UUUUCUUUU#}0UUUUP?UUUU??UUUUT??UUUUU??UUUUUUUUUU<$}UUUUUCECUUUUUECUUUUUPUSUUUUUUS?UUUUUT?UOUUUUUU?UOUU%}UUUUT?UUUUUUT?0UUUUUUCUUUUUU0UUUUUUSUUUUUU?0UUUUUUT&}UUUUUUU0UUUUUUU?UUUUUUU?3UUUUUUUOUUUUUUU3UUUUUUUPUU'}UUUUU?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU(}3UUUUUUUUUUUUUUUUU3<UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU)}*}<?*+}?*? *,} <-}??**??**??* ?.}* <?*?*?/}* <?*0< ( 0}>*00>00*<>1}*?? ?? <2} << <><*?>?3}*>*<4} 5} ???*? ??6} ??? ???? ???7}*?? ?? ?? ?<?< ?<8}?< ?<?< ?<?< ?<?9}< ?<?< ?<?< ?<?<:} <???*???*???*;}???*???*<?? <}??򪪪????*=}?*?*?*>}???*????*????}?򪪪ʪ??@}?*????򪪪ECA}EC US?US*?UO?UO𪪪<T?T?B}< ?*C}??򪪪ʪ?*D}3E}3F}G}H}I}(F<$6$扥8L$"/ǩ͍ЍЅ  \ h \ԭi LWi ,)K}` 0ֆ滆  LWi IͭL1!&) !) e #L} 8  ٥ <إLJP i  LL 350M} 0  L L1սL1 Zx 8) L1 ikaֽ֤ZyYxy]N})Өat ֝< l L1 ɩҽ< )< A  <ս0L `ZyYxy])Өa`t ҐO}ZxȑiZxL-  ש֤֥yYy])JTB > P}H6ةdL* <Zxםiȑ0L `hhhhLj 0x`yYy]Q}  hhLj ȑi`آ )U 0 1 5- )? 5R}44)    XM20x/233)ʥߥƾS} u L_ r  M r Lb6DllDHHH?΍ ԎԌЍ ԩ hhh@H ԍЭ/ԩԍ h@H ԍ T}h@11x Fҩ܍` = ҩƣ  E ҩƤ`P_ҌF-s 0U}`h ҩ` (/7?G` ҩƥ`9a0` ҩƦ`źth]QF:.# 0 Lv ` V}ҩޭ )p67`ÿ~{wsokgd`\XTPMIEA=962.*&" x<000000DttttttW}tttttttttttttTİ A6pppppGppF0pGlpFXpGDpppFpFAX}@@@@@@@lvlZfirebug72)44%."9Y}analogcomputing  e6i7i` Z} !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??[} ݦݽ âąЩTũ+ƩυѢ㥻&>/ԩЩ!o Щ(\}Щ̍Щɰ 0 ʆކȥÅą  CiL]}5oo˭p WoqprmsopmtpLS$  *ܪ: Ci s Ci ^}өiȑ}^Lʽ   _}<xZiԩإ8JJJ8窽ԅ罹 }}* i`} i ` ) ΢ )!`iFL e`  '1;EOYca}? ?@ @?!?4@!@4) > A V @@@@.0019E~~b}__(88( &3 (px@@@@@@ // @ffffffdddddd```c}```@@@@@@V VJJLK`V e˅V`Yh nppAnơ8Ld}L桥ơLpLpԭX)m)8m o qqAo栥4ƠLAL;Ơe}LAqLFqԦx b^b`Ǎ  f}ύx э` %(0@P`CScSs#3CScsg}sc  550`\\  `__  550`\\ 33 ##3333 33#q}A??B%DOS SYSB*)DUP SYSBFSATARZEE1BASB-MAZEWAR OBJBMICKEY BASB>MICKEYC PICB> MICKEYO PIC(JFIREBUG OBJBcAPPLKILLBAS#&&0dffd0dffd&&3dffd355  \\`0  __`55  \\`00  2``0  00 r}``  00``9cl  9l`0  @@( (@@ `@ @`(s}@@( @@ ((((22 ƒ@@0t}0 )L~PЦE?8L}槥蕱 ƹ`Lu}ȑ ƧLyy)&"Hh-) % ȑi ֵ0L`v}`کBީۥ 8 ۪}}ۑȑ Zڥ``ܽ^L ^/w}ȑyYy]  <^0ˆ0Lܽ^0DQiҩ^ҩ^݄x} ݤ`*Lr 0 * LrhhL ҭ )yYy] `ȑ iy}Lruة `) JJJJ`P᥽ L0 `$z}UR5U8uUS5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US%U(US$D(USCUR7(DA|}22830CCHsrTTX##eeh448TTXFFHCCHVV(228EE!1(44'##!!(228sx338#!4D8DB4D8US4D8fc4D8f}}c4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc$D(fc3fcrfc#rfc5R(USEd8DBEd838FeH38EVH7cff~}X5c(""hFeHDDhdFXffhffh""("3h(ffh338!( q""" #331$D(UR}$D(fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc$D(fc$D(fc3fc"2(fc778}fcBBHURTTXDAddh31TTXsrCCH##228448!1(VVH7VV(""(EE228445E8##4D84D8sx4D8#!4D8424}D8US4D8fc4D8fc4D8fc$D(fc3fc#fcrfc"qfc$c(fc5d8fc5d8fcFeHfcTFHfcffXUS""hDB}ffh38DDI"#(""(7d8(DeHFeXFfhcFhffh""hffh338(q""" #331#3(}UR$D(fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc4D8fc$D(fc$D(fc3fc"2(fc}778fcBBHURTTXD@ddh32TTXsrCCH##228448!1(VVH7VV(!!(EE228445E8##4D84D8sx4D8#!4D84}24D8US4D8fc4D8fc338fc3fcfcqfc"q(fc$c(fc5d8fc5d8fcVeHfcTFXfcffhfc""hUSff}hDB33938""("#((7d8DeHFeXFfhcFhffh""hffh338(q""" #331}$D(UR$D(US4D8US4D8US4D8US4D8US4D8US4D8US4D8US4D8US4D8US4D8US4D8US$D(US$D(US3}UR2DA77830CCHsrTTX##ddh448ddhVVHCCHVV(228EE!!(44'##"2(4D8sx5U8315U8DB5U8fc5}U8fc5U8fc5U8fc5U8fc5U8fc5U8fc5U8fc5U8fc#3(fc#fc"r(fc$(fcEd(USFd832FeH#(UVX7T}8ffhDdX"3hFeXffhffh338cFh!(ffh ""hffh338(q""" #3}31$D(DB%U(US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US%U(UR}$D(DA3302sr778##CCH448TTXUVHeehVV(ddhEECCH44228##!!(sx"2(314D8DB5U8US5U8U}S5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8US5U8DC%U(32#3('(#1C("rDd8#(FeHEd}8VfXffHcFh""XffhUUh""hffhffh338338!(( q""" }#331$D(DB%U(DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DC5U8DB5U8}DA%U(30$D(sr3##2448778EEHCCHFF(TTXEEeeh44eeh##SSX228sx!!(31DB"2(US4D8US6}f8US6f8US6f8US6f8US6f8US6f8US6f8US6f8US6f8DC6f8326f8'!6f822(6f8ET85U8Ud8#3(VeH#S5}X"rffh#8""hEeHffhffh338""h(UUhffh338!( q""}!!#3DB$D(DB5U8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DB}6f8DA6f831&f(sqD3448'(EEH228FF(SSXEEddh44eeh##eehsrSSX#!BBH42!1(TS1DC'D}C2DC#C(DC%U(DC6f8DC6f8DC6f8DC6f8DC6f8DB6f8CA6f8! 6f8'!(6f87C(6f85T86f8Ed85U8C%H$D}(UfX3""X"Vfh3s(338Ee8(EeHEeHFfHDFXffX""X33hffh""((q}""!!#3""$D(DB5U8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8DC6f8}DB6f8DA6f830&f(sqD3448'(EEH228FF(SSXEEddh44eeh##eehsrSSXBBH42!1(TS1(DC}'DC2DC#C(DC%U(DC6f8DC6f8DC6f8DC6f8DC6f8216f86f8'"(6f87C(6f85T(6f8Ee86f8C%H5U8UV}H$D(""X3UUh"3383s((Ee8EeHEeHFfHDFHffX""X33hffh""((6f8}ET85U8Ud8cf6`&cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5QdfFadfF`SU5PRD%PQ3PQ"PPPPPPPP}PPPPPP"PQ3PRD%PSU5Pcf6`cf6aBU$A1D0 3 3qT#C"DDRB"RHRXRXRHSHQHX8fXU}Xcf6`&cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5QdfFadfF`SU5PRD%PQ3PQ"PP}PPPPPPPPPPPPPPPP"PQ3PRD%Pcf6`cf6`SU5QBD$A130 3 3qT#C"DDBB#2H2H2X}2X2H2H1H8(U838cf6`&cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5QdfFadfF`SU5PRD}%PQ3PQ"PPPPPPPPPPPPPPPPPPPP"PQ3PRU%Pcf6`cf6`SU5QBD$A130 3 3qT#C"DD}BB#2H2H2X2X2H2H288(U838cf6`&cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5Qdf}FadfF`SU5PBD$@A3@A"@@@@@@@@@@@@@@@@"@A3@RD%Pcf6`cf6`SU5QBD$A130 3 3qT$D}A3B!2"!8!8!H!H!8!8!8((D("(cf6`&cf6aSU5QBD$@1D0 D DDD D 1D}0BD$@SU5QdfFadfF`SU5PBD$@1301"00000000000000"0A3@RD%Pcf6`cf6`SU5QBD$A130 3 3q}T$DA""!(!(!8!8!8!(((D("(cf6`&cf6aSU5QBD$@1D0 D DD}D D 1D0BD$@SU5QdfFadfF`SU5PBD$@A3@A"@@@@@@@@@@@@@@@@"@A3@RD%Pcf6`cf6`SU5QBD}$A130 3 3qT#C4DA2"!8!8!H!H!8!8!8((D("(cf6`&cf6aSU5QBD$@1D}0 D DDD D 1D0BD$@SU5QdfFadfF`SU5PBD$@@3@@"@@@@@@@@@@@@@@@@@@@@"@A3}@BD$@SU5Pcf6aSU5QBD$@130 3 3T#T2DDBB#2H2H2X2X2H2H2H28U838cf6`&cf}6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5QdfFadfF`SU5PRD%PQ3PQ"PPPPPPPPPPPPPPPP}PP"PQ3PRD%Pcf6`cf6aSU5QBD$@130 3 3qT#C"DDBB#2H2H2X2X2H2H2H18U838}cf6`&cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5QdfFadfF`SU5PRD%PQ3PQ"PPPPPPPPPP}PPPP"PQ3PRD%PSU5Pcf6`cf6aBU$A1D0 3 3qT#C"DDRB#RHRXRXRHRHRHQ8UXUX}cf6`&cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5QdfFadfF`cU6`bD&`a3`a"````}````````"`a3`bD&`cU6`cf6`Sf5QBf$A1U0 D 3qd#T3DfcAcB"chchcHcHaXUbf}h("(BD$@1D0 D n6`6cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5Q&dfFad}fF`SU5PBD$@A3@A"@@@@@@@@@@@@@@@@@@"@A3@RU%Pcf6`&cf6`SU5QBD$A131 3(3E"}42#DC#2##0####H#(#D3cf6`6cf6aSU5QBD$@1D0 D DDD D 1D0B}D$@SU5Q&dfFadfF`SU5PRD%PQ3PQ"PPPPPPPPPPPPPPPPPPPP"PQ3PRD%Pcf6`&cf6aSU5QBD$A138 }3(3E"42#DD#2$#8####H#(U3cf6`6cf6aSU5QBD$@1D0 D DD}D D 1D0BD$@SU5Q&dfFadfF`SU5PRD%PQ3PQ"PPPPPPPPPPPPPP"PQ3PRD%PSU5P&cf6`cf6`RU%P1D8 }3(3E"4"$DD$"$$1$$$H$(U3cf6`6cf6aSU5QBD$@1D0 }D DDD D 1D0BD$@SU5Q&dfFadfF`cU6`bD&`a3`a"````````````"`a3`bD&`cU6`&cf6`Sf5PB}f$@1U0 D 3F"F"5fD66"$66@6A&(Vf"cf6`6cf6aS}U5QBD$@1D0 D DDD D 1D0BD$@SU5Q&dfFadfF`SU5PRD%PQ3PQ"PPPPPPPPPPPPPP"PQ3PR}D%PSU5P&cf6`cf6aRU%QAD@ 3 3E"42$DD$"$$0$$$H$(U3}cf6`6cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5Q&dfFadfF`SU5PRD%PQ3PQ"PPPPPPPPPPPP}PPPPPP"PQ3PRD%Pcf6`&cf6`SU5QBD$A131 3(3E"42#DD#2$#0####H#(}U3cf6`6cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5Q&dfFadfF`SU5PRD%PQ3PQ"PPPPPP}PPPPPPPPPPPPPP"PQ3PRU%Pcf6`&cf6aSU5QBD$A138 3(3E"42#DD#2$#8###}#8#(U3cf6`6cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5Q&dfFadfF`SU5PBD$@A3@A}"@@@@@@@@@@@@@@@@"@A3@RD%Pcf6`&cf6`SU5PBD$A131 3!3E424C"# }8(D"cf6`6cf6aSU5QBD$@1D0 D DDD D 1D0BD$@SU5Q&dfFadfF`S}U5PBD$@1301"00000000000000"0130BD$@SU5P&cf6`SU5PBD$@131 3!3E 424C"#} 8(D"n6`6cf6aSU5QBD$@1D0 D DDD D 1D0BD$@S}U5Q&dfFadfF`SU5PBD$@1301"0000000000000000"0A3@RU%Pcf6`&cf6`SU5PBD$A131 3 3}E"42#DC#2$#0###H#(D3BD$@1D0 D X'XXY9XXY9YZsY[[[\C\\}]N]@0 0lllyy}ylllyyy `lllyyy }*#*5HUl%2@0 }`U`U&9<r`QD9/(!9<@@}`   #@0} `flr`f`f`f9<@D9QLQLQ@}0@ `Qr 9<U}  lllyyy } lllyyy  ll}lyyy  lllyyy } lllyyy  }lllyyy  lllyyy} HHHXe )I}L3^0а A ԍ ԍн\L^Ċ e3 __/JJİ)) }н\L^8Dž ԍЅM40%^¥_i(_K_F_8(_9Ο_4 )- ) ȭ JȐȅ©}eȅ…å))u)ϝu0vvxy)ϝyp~op~ qhhh@pppp}OXAg_؏}`8pH ЍX0h@ȋxP(؊`8pH ЈX0h@ȆxP(}؅`8pH ЃX0h@ȁxP(؀`8ǩũ a ae $ƽ( a} a/ԍЍo`e`b b$[ ҝ )0 @ \^.Щ.ЩЍЍЍЩЩЩAo}ftB 濦0ww0vvxq qLe ____}ԩЩЍ Ѝ Ѝ Щ Щg0_1Ʌ…éԩ>/`======+='B=" = d=D ======C"==f}c=d=D0=S=32= 2="="4DDQ =#DDE=$DDDQ0=#DDDE==4D4DDQ@="!=4DDDDE&f`=#4DDD4DDQA"!""}0==D"#DDE"42#Q" =!EDDDC33DDDcCC2"!s30=26= DWTB""D@#DP=C&G= UfeT32tC":=T78= ff338CVf= e}Hiwx=wc=35Ff= vY;{=333TFf`= j=CDFc3= {==ۻ= DF2= "̻"=̴UDF6=}۝?c̻T=ݣDFf= ܭϋS{S=ݖFftD= ۭ>",,DgvFf= {Tw[T3+3+3+D""Ff!= {;}u3:3*3*D3DFfB= jٟٟsD!$F33= vY9{fk=c"Fwf`= eHhtDFfdDG=wwwF= T77c3<̔36dDfDFi}˻ 66=C&FUUwDESfK5Xw &f=2DDDDUۼEFt =!$33ew33U#J3U5ReU=""!"""UTxUU"!""=UT}xUU=USxUU=TDDDD=UDDD@== ܀== ݣ== D"=w= ws=TD= D@=2"D= "D ="= }"=====%=e}$rrrUD9*Ur}U`L`U9@L`LUfrrrUD9*UrUL`@L`LUrUD*DUrrrrUD9*UrU`L}`U9@L`LUfL`@L`LUULDL`@L`LUrUD*DUrrrrUD9*UrU!D!D!D}UUUUDDDDUD%*/2DDDDUD%%!!!!!!DDDDUD%*/2%}%!!!!!!%%!!!!!!DDDDUD999****!!%*!}/29@999999!!%*/29@******/29@999999!}*** #< i %< i i #< i `< i iLVie`)`Z0_ViViTim}e left:11 min. RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR}}}}Q+,n00DXASDADTXYMSLINOTBhAA6@@@!}% A" BD B%d @ pAYp!}%%%% THE DEATH OF AN APPLE %% written by: Scott Emond !}%% ver.2 -12/84- %% S.W.A.M.P.S. Ver.2.1S %% (Char Set Included) %%!} B  %%Π͠ +AY1A@RC!}A AUA@gAAFyAR@AVAE_%6-F:A`,%F:Aa,$AV!}9%@@hM-@@([%@_ n-@0@ (0-@)@9(K-@0!}@T( f-@0@n(2?AY@b'B2w@;-@A? Z}%2@P!}@@G2@@Q@@YB7h@kB7aAr}B7cArdw6-@6!}-@P7-@0@s?PCB2HWB2I%@e-@i w6-%?iB7`#B7b!}%@16-%@5 Q2@u2@%@B7h@nj -Ar!}A`6?0,B7a8B7cDB7`XB7b%@f6-%?uj s-@A x6!}-@,-@(@ 6@8-@?( [2@@@w2@@@-@)@!}(6-%@z } -@6@<2@@@@ \-@@?%!}h-@ n(-@ &@( \ $-@6?P@2@@U@D X-@!}A\ 6-@ 6-@7-@@'@C-@L( aab2@2@%@!}@#6-&@@6-%@# A@)-@@- ?AQ-@(@"}X( dt-@@@@2@@@ -@(@(-@)@("} (6-@D-@A@ Z2@@2@'@p'@6-&?P ["}2@C2@'@p@W-@AP[ |6-@#-@3@7/-"}@6( R2@@`6-%@d v-@8@|(  -@6?62@"}D6-%@H \-@AP` |-@?2@@6-&@"} j-@@#-@*( N2@$@@@R d-@@j( -@"}A@1A@bX2@@@$H:,jA@n 2@@"}-@AP w-@@?P1B2H@rCB2I@_2@@ps-@"}@w _B2H@s'B2I@C2@AW-@@[ _ 6-@" }6-@7-@@4@C-@M( aac2@@2@$@@+"" }@)!-@4@+(6-&@6-%@# 5-@5@<( S-6?i2@" }@2@&@@6-%@ U-@ @?P+-@04(H-@0" }&@Q( U y-@@@;2@@]2@a u" }-@Ay B2V@'B2H@e9B2W@U-@A@gA`@0"}2@@@A`@1 72@@3-@@P7 B2H@I"}'B2V@9B2W@E6-@a-@0A@@sA`@02@@2@"}%@@?6-&?5#A`@2' ;-@A? Y%2@AU@@G2"}@AT@@YB7h@z -@I6?P2A`@0>B2HRB2I%@"}2fB7b%AzB7d%A|A`@1 6-@26?EHA`@0TB2I"}hB7b%Ap|B7d%Aq1A`@1 --@A1 c-A @"}+B2H?B2I%@2KB7b_B7d%@c xA@'-@0@0( B-@0"}@K( ]-@0@f( xA'6-@06-@1'6-@06-@+-@"}AU@A2@@_2@&@@}2@&@6-&?Pg-@"} ( m$6-%@0-@7( nE6-%?PQ-@Y( og6-%@-!@7-@ !("} -6-@0-!@7-@!( -6-@0-!@7-@!( -6-@0  R-@ "}( !-@(( 4-@:( N-@AR  B2HA6'B2IAR9B2V@"}KB2W@g-@AP@2@@@  72@@3-@@P"}7 B2V@'B2W@9B2HADKB2IARg-@AP@2@@"}@ 72@@3-@AP7 Y%2@AU@@G2@AT"}@@YB7h@c-AEA ?P+B2H?B2I%@KB7b_B7d%"}@c 7-@327 ,g +@A1A CA"}@TUAAgAVAE12-@@2(@ATARI computers6Y%2@AU@@" }G2@AT@@YB7h@;}-@@+AG-@0@u@"!}SB7bgB7d%@yB7i@} = @{6-A"+-@ @@7B7bKB""}7d&@]B7i@iA w6-&@{ B_%2@G2@"#}[-@AP_ J -@!@ 6?P,-@I(@ k2@"$}@@2@L8-@%@4(@ 8 O-@AP"%} \#6-?P#-@@^-@@ ((@ATARI:-@@M(@ d-@"&}@62@@@`m2@@# 5-@@ H(@Z-@"'}@m(@ATARIb-@ @ ,(@ computers>-@ @U(@ l-@"(}@62@@dy2@@# 5-@ @L(@ computers^-@ ")}@ u(@ y f_%2@G2@[-@AP"*}_ h-@@!@+-@>(@R-@&@e(@ 2@@$"+}H:,@@jP%2@) =-@&@P(@ m-@@!",}@+-@>(@R-@&@e(@ 2@@5$H:,@@"-}oP%2@) =-@&@P(@ r-@A M #AP6".}-@--@@1"=-@M(@ f -@@6@%62@@T2@"/}%@@X f6-%@{ -@"(@ ?-@6?P[2@A@"0}w2@A @{ 96,96,96,96,81,86,96-@AP }!!ŠŠĠà"1}}q +@AA1A @TCA@UAAfgAVAEq B%}'B2H"2}'B2I }-@@2(@THE DEATH OF AND-@@W(@applei-@"3}@(@ Ġ}.-@@.(@ 2}'AAb'AY@bj}/6-"4}Aa6-@/-@@k}!@6-@l}!@6-@`m}'!@6-'6-"5}n}-@@)AAF-@@6@Pb2@ ~2@@@"6} AAo}2@52@AC@Q2@A`@m2@@"7}@-@@  p}%2@G2@YAAh"8}v-@@6@P22@@@q} AAdr}A"9}Ap2-@@6@PN2@@j2@@`n AAfs} t}":}-@@4-@6@FA @Xb2@@~2@";}A @T u}K%2@@G2@K x} $-@6"<}?5@2A!@\2@Aa@x2@AC@2@AD@ }}"=}-@A }a-@@2(@ D-@@a(@THE DEATH OF AN}l">}6-@,-APA06@PB2@@P6-&?1T h-@APl }:-@"?}327 :$~!!үŠӠ~6-A&6-F:A,&@82BByH6-"@}AV$%AZB2V@lB2W@~A@A@I(6-?:C:hsztstt"A}`,,I6-C:hhʕswus`,s76-?:`<|fl0fF"C}68of;,<Bhd<@d,bb6-?:<,<BpV<@d,bb6-?:,<Bq <@d,bb6-?:`<|~fffff<ffff<cckwc,<BrH<@d,b"H}b6-?:6.Hރ\:EA*0P8DA(0@ ?//NjO nRFJnf?< 9>/Hy6NjO ?</9>HyNjO y>A0NLN^NuNV09lf$Jylg4NuK.9(."$&&yh(yd*VVHHVVVW*H***>*"G|8*B*B*NABC5D5I5H*GJ[@*@*@@@WN G09lf6? RGG?_ "GNBG G G Ge 3pgNHNNNBG GHVNBG GHNBG GUHNNR DP*VVHHVVVW*HNHNUHNN TI G Ge 3pgNHVN TI G Ge 3pgNHN TI G Ge 3pgNUHNNJFjHNBG GC G Ge 3pgNHNNNNBG GHNBG GUHNNPN TIC G Ge 3pgNHNNNN TIB G Ge 3pgNHN TIB G Ge 3pgNUHNN D(>("Gh*VVHHVVVW*HVJ*f J*f J*g4`NBG G G Ge 3pgNHNNNNBG GHNBG GUHNN DSNHN UHNN "GN TI G Ge 3pgNHN TI G Ge 3pgNUHNNJ*fHNBG GC G Ge 3pgNHNNNNBG GHNBG GUHNNQJ*g4`N TIC G Ge 3pgNHNNNN TIB G Ge 3pgNHN TIB G Ge 3pgNUHNN D(>(TRG"GNJk2BG G G Ge 3pgNUYHNBG G G Ge 3pgNBUYHNNNNJkBG GUYHNBG GBUYHNBG GUHNNR DHNJkUYHNBUYHNUHNN TI G"GN TI G Ge 3pgNJkUYHNBUYHN TI G Ge 3pgNUHNNJ*gHNBG GC G Ge 3pgNJkUYHNBUYHNNNNBG GJkUYHNBUYHNBG GUHNNPN TIC G Ge 3pgNJkUYHNBUYHNNNN TIB G Ge 3pgNJkUYHNBUYHN TIB G Ge 3pgNUHNNNBG G G4pj?NNNNBG GNBG GNBG GNNSHNNHNN TI G4pg?NN TI G4pj?NN TI G4pj?NNNJfHNBG GC G4pj?NNNNBG GNBG GNBG GNNHN TIC G4pj?NNNNN TIB G4pj?NNNNHNBG G G Ge 3pgNHNHNNBG GHNBG GHNBG GHNNHNHNHNN TI G Ge 3pgNHN TI G Ge 3pgNHN TI G Ge 3pgNHNNJgHNBG GC G Ge 3pgNHNNNBG GHNBG GHNBG GHNNB*N TIC G Ge 3pgNHNHNN TIB G Ge 3pgNHN TIB G Ge 3pgNHN TIC G Ge 3pgNHNN>THNBG G G Ge 3pgN<THNNNBG G>THNBG G<THNBG GSHNNRHN<THNSHNN TI G Ge 3pgN>THN TI G Ge 3pgN<THN TI G Ge 3pgNSH4pj?NNNJgHNBG GC G Ge 3pgN<THNNNNBG G<THNBG GSHNNN TIC G Ge 3pgN<THNNNN TIB G Ge 3pgN<THN TIB G Ge 3pgNSH4pj?NNN>THNBG G G Ge 3pgNJkFTYHNFBTYHNNNBG G>THNBG GJkFTYHNFBTYHNBG GRHNNRHNJkFETYHNFBTYHNNN TI G Ge 3pgN>THN TI G Ge 3pgNJkFTYHNFBTYHN TI G Ge 3pgNRH4pj?NNNJfHNBG GC G Ge 3pgNJkFTYHNFBTYHNNNNBG GJkFTYHNFBTYHNBG GRHNNN TIC G Ge 3pgNJkFTYHNFBTYHNNNN TIB G Ge 3pgNJkFTYHNFBTYHN TIB G Ge 3pgNRH4pj?NNNNN^NuNV 92.¼Ё @H|N^NuNV?.NT/0.R@?NT" AAN^NuNV0. "94.ļ҂ AN^NuNV0.`b` y>(H`x y>(H`h y>(H`X y>(H`H y>0(`: y>0(`,`*|Ag|PgȰ|Xg|Yg|PCg԰|SPgNN^NuNV0.`\`0. y>@0. y>@0. y>@0. y>@0. y>H1@ y>1n `*|Ag|PgȰ|Xg|Yg|PCg԰|SPgNN^NuNV|./.HyNjP?0(N^NuNV n=P?.NT/0.R@?NT" AA n0/.NXN^NuNVH *n(n -M,?/ N\R@Z?NT|?/ N\|FA,0`*ʼ0`J0T@?NT? \/N\0R@?NT? V/N\ `"`| c0< @ |"|N< *XRT0``/ HyNjP*@?NT?/ N\TRT`$?NT?/ N\TRT`$?NT?/ N\T/ Hy"NjP*@RT`Z$?NT?/ N\T/ Hy&NjP*@RT`&/ Hy*NjP*@?NT?/ N\T/ Hy.NjP*@RT`/ Hy2NjP*@?NT?/ N\T/ Hy6NjP*@RT`$0R@?NT?/ N\T?NT?/ N\TTT`d$0R@?NT?/ N\T?NT?/ N\TTT/ Hy:NjP*@`$0R@?NT?/ N\T?NT?/ N\TTT/ Hy>NjP*@`A`$?NT"H0R@A=@0.H?/ N\T0.H?/ N\TRT`r/ HyBNjP*@0R@?NT?/ N\T?NT?/ N\T)TT`"`| c0< @ |F"|N L0N^NuNVN^NuNV#V`X yJf y ?<%NTN^NuNV yB?<%NTN^NuNV8Hy7N!XXN"Hy?<N\N^NuNVN"VN!Hy?<N\N^NuNVH?<"NT*@?<?<?<NM\# 8 C7+I L N^NuNVH?<"NT*@+y8 ?<?<?<NM\L N^NuNVH *yh(yd?< 9h/Nl\?<@ 9d/Nl\?<(/9 Nl\?</9?<NlP?<0 9м//9TNjO ?<@ <Ќ/?<NlPBy3f3f3f><`0| @xdpRG Ge|| |0BnBn 9>6.HЃм-@0.@Ab-p0.@Af-p 9>6.HЃм-@0.@A -p0.@A-p .ꐮ?/./.NjO .搮?/./.NjO nRn nf>A%N  y>!@^?<?.<. A/*H 9 м(@A˄&H|A'*Hچ EHA+(H؆ DH0@H09g`0@@@E@0@A00EH@QQ@@QQ@@@BQDQF@@QQ@@QQ@ @"Q$Q&@@QQ@`@bQdQf`0@A00EEHB@@0389@PB@@039@9@B@@039@@9@B@@039@9@0B@@039@9@B@@039@ 9@pB@@039@9@B@@039@`9@L8N^NuNVNqNTN0 GgH?? j^NXL?NTNTNTNTNTNTNTNTNTNTNTNTNTNTNNuNuNuNuNuNuNuNuH?<?<NMXJ@fLNu?<?<NMX@gA8$0 GLNu>< GNuNuNuNuNuNuNuNuNuH y8 NB@8 ?f y>0Nu` D`NqLNuN^NuNVH?<NT=@AX*H0<An|:Bg <Ѝ/?<GNPABBm0<An|:Bg <Ѝ/?<GNPABBm#$#d 9dмh#h 9h@#PBy3L N^NuNVH *yh(ydBybBynByByByBy(ByBy`ByXBy?< HyNlZ\?< HyNlZ\?<(/9 Nl\?< /Nl\?< /?<NlP?</ BgNlP09g y*f3* y*c 09*|? /BgNlP09g Bn`0<nRn n@mBn`0<2.|A2<n0<02.|A2<n0< 2.|A2<n0<@2.|A2<n0<2.|A2<n0<2.|A2<n0<2.|A2<n0<2.|A2<nRn nm$BnBn nPlX 9>6.HЃм-@0.@AN-p0.@AR-p .萮?/./.NjO 9>6.HЃм-@0.@A-p0.@A-p .䐮?/./.NjO nRn n`f6?<@ 9>\/HyU(NjO ?</9?<NlP?< 9м/BgNlP09g"?< 9м/Hy:NjO 09g?<( 9м/HyqrNjO ?< 9м/HyahNjO ?<?#AL# y>1|NAdD  y>!@L0N^NuNVH0.g09g <` <h` <-@JnfBy0.AXHЈ-@ nBh nB(F <Ю*@-H|:f -H|\g`n/ NXH`2H|*g H|?fNq%H|\fB` ` H|\f`S "<ҮnR MB n|\ nH|A??<NX <Ю/?<;N\J@l`Bg nHh?<=NP=@Jnm 9Ю/0.g <h` </?.?<?NO -@?.?<>NXJnf3 f09g n1|`8 hf n1|`"?<?<?<NZ\ nBhByL N^NuNVH0.g09g <` <h` <-@0.AXHЈ-@ nB(F <Ю*@-H|:f -H|\g`&/ NXH`2H|*g H|?fNq%H|\fB` ` H|\f`S "<ҮnR MB n|\ nH|A??<NX <Ю/?<;N\J@l`Bg nHh?<NXL N^NuNVH>.:<BD2AAd"0 <Ё*@Bn0|1?HyN\0AXЈ @JhfHy.NX``<0AXЈ @ hf=|2AAd"0 <hЁ*@?NET @fHyHNX`"BF`||@f`?< HnHmNjO Bn0<"2¼A?0<!2¼HAA?HyhNP2<-|-|A?HnHypNO 2<-|-|A@RE0.g0| @fRF F@e,?< ?<8Hy~NP?NET?HyN\0.gHyNX?<H?<8HyNPHyNX?<?<NZXL N^NuNVBn0.AXHЈ @Jhf0<`2=|`?.?.0AXHЈ-@0AXHЈ @A-H2AAd"0 <Ё*@Bn`0.H5||J@f` Rn n@m n@fHy?<NT\`X=|`Rn??NX?NET"H .谁oHy ?<NT\`Bg/.?<=NP=@0.HHu/.NK|P .2.H| .2.H|0.2.H|0.H2.H|0.HB`^=n?Bg?.NEn\`Rn??NXHyH?<NT\L N^NuNVBn?< /. ?< NlP`8 nH|f` nRH?N,T2.Rn n  nH|.g ne nH|.g`B=|R`& nRH?N,T2.Rn n  ng n eN^NuNV8HydN!XXNLHy?<N\?<?<NXN^NuNVNMN!Hy?<N\N^NuNVH?<"NT*@?<?<?<NM\# hCf+I ?<?<?<NM\L N^NuNVH?<"NT*@?<?<?<NM\+yh ?<?<?<NM\L N^NuNV=|?<NT=@?<NT=@?<NT=@?<NT=@?<NT=@?<NT=@?< NTS@=@?< NT=@?< NT=@0.`=|`0.`` 92.¼Ё-@=n`Sn0.S@ n0H| fJnn`|=|`l?<NTJ@gR n g nRH??<NX`$R?< ?<NX?< ?<NX=|`=|SnJnn0.SnJ@o ngr`|Sg"|Wg`0.S@AXHЈ @ hW|=@09g0.S@AXHЈ @Jhf =|`~0.S@g09g <` <h` <-@0.`=|`"0.S@AXHЈ @0(g =|`0.g0<`0Bg0.Rn?NXBg0.Rn?NX?<0.Rn?NX?<0.Rn?NX?<0.Rn?NX?<0.Rn?NX?<?.NX`0.Z@?NT @f0.S@AXHЈ @1|`0.S@AXHЈ @1|`0.S@AXHЈ @0(g =|`pJnm nm =|`X0.g6?. 92.HЁ/ 92.¼Ё/NjO `8?. 9Ю2.HЁ/ 92.¼Ё/NjO 09tg`9H=@9H=@PfBn`Rn nmB9B9Bn`Rn n.m0.0.`hJnm nm =|`P0.g:?. 92.¼Ё/ 9Ю2.HЁ/NjO `8?. 92.¼Ё/ 9Ю2.HЁ/NjO 09tg`9H=@9H=@!Bn`Rn npmB9B90.gBn`Rn n:m`Bn`Rn npm0.0.`B`@|!g|"g|Ng|Og:|Pg|Rg|Sg:|Wgn`|1gH|2g@|@gDNM?.?<NXN^NuNVH 9м*@ 9P@(@:< *(QKI:< *(QL8N^NuNV. Ge HNMNL?<>< GHNNTN0J9g GNTNTN0 GgPnN0 GgPnN0 GgPnN0 GgPnN0 GgPnNTNTNTNTN0Jyg.G G9WWgHNTLNqNTNTN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgPnN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G Gg"JyfA,@0031BN0G GgBJyf8(A,@>0031DG@G0031NN0G GgBJyf8(A,@>0031FG@G0031NN0G Gg"JyfA,@0031HN0G Gg"JyfA,@0031@N0G GgN0G GgN0G GgPnN0G GgN0G Gg$` Af @N $@N0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgN0G GgNTG G(N0G GgN0G GgN0G GgN0@*@N0G GgN0G GggV@3PbN0< y BBQQByN0G GgN0G Gg9agaJ9`gPbN0G Gg9`g`gPbN0G GgN0G GgN0G GgN0G GgPnN0G GgN0G G@g9g PbNTN0G GgN0G GgN0G GgN0G Gg@NB*TNTN0 GgPbN0H Gg:Jybf0?</A> @dH@@e@??NO `0j\LN0H Gg:Jybf0?</A @dH@@e@??NO `0j\LN0H Gg:Jybf0?</A @dH@@e@??N~O `0j\LN0H Gg:Jybf0?</A @dH@@e@??N,O `0j\LN0H Gg:Jybf0?</A@ @dH@@e@??NOHG@GF@Nu GJyf09f>OHG@GF@NuG G`NuNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG G9fF@@NuG G09fF@@NuG G9fF@@NuG G09fF@@NuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG G8e9f8 NuG GNuG GNuG GNuG G*FNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG GNuG G808 %|NuG GNuG GNuG GNuG GNuNu4*ga&P><"GNL*gaP><"GNLNW D. GOG*GJ[@*@*@@@WN GjNuAC~<<)pJgHBA Af$@@@H@B`@BpJgHBA Af$@@@H@ B`@ BpJgJBA Af$@@@H@ B`@ BNqFRyX09Xyf2ByXJ9f$ 90< @g y>f0`AP0 @ eDBPJybgJyg2HNxLByb`JyngHNĒLBynNuHB@8Jyff e4 eF@R3f`29fCfByf` ?f y>0Nu` Df$ y>f(f0`` af. y>(gtJ(ff(0``V y>"92< A f`6 Af`( f` Bf` f` Cf`A f` f`A *f`" f` 6f` fAJf``<f@@@:zA0 y> 90< @0< @:Tg` g, y>(gJ(f(0``NqLNuKBDTBL\_uZX]G3[50p2rN4t,l/o.n*j(h-m+k K MH J``bb L?>~:z8x=}9yAE@Bs^fOWVRPU#c%e 7"6&f'g!a<|vvNNFGFO7w4tpprr&fG3s5u0pX][_^Z2r"b LN^NuNVH *n(n f SL0N^NuNVH *n(n >.dGeQ`"LGe%Q(INq L0N^NuNVH *n(n >.GeQB L0N^NuNVH *n(n >.Ge8QNq L0N^NuNVH *n(n >.Ge8QB L0N^NuNVH *n(n >.Ge(QNq L0N^NuNVH *n(n >.Ge(QB L0N^NuNVH>.*n <.FeQNq L N^NuNVH>.*n <.FeQB L N^NuNVH*n>. GeBQNq L N^NuNVH*n>. GeB]QNq L N^NuNVH*n>. GeBQNq L N^NuNVH*n0<BBBBQ L N^NuNVH *n(n 0<((((Q L0N^NuNVH *yh(yd?<@ 9h/Nl\?<@ 9d/Nl\?< <Ќ/?<NlP?< <Ќ/?<NlP><`pRG Ge||BnBn 9>6.HЃм-@0.@Af-p0.@Aj-p 9>6.HЃм-@0.@A-p0.@A-p .ꐮ?/./.NjO .搮?/./.NjO nRn nf>AoV  y>!@^?<?.<. *y Aw(H|Ao HІ @H=@As HІ @H=@0@H0.@A00n|H\P\\\@\\T0L0N^NuNVNqTN0 GgH?? j^NXL?NTNTNTNTNTN G0H?<?<NMXJ@g?<?<NMX><w G>< GRLNTNTNTNTNTNTNTNTNNuNuNuNuNuNuNu GBNuH?<?<NMXJ@fLNu?<?<NMX GB><w G>< GRLNuNuNuNuNuNuNuNuNuN^NuNVN3HyHyHyHyNO3\HyHyHyHy?<BgNOBn`0.Rn@A1 n m323\HyHyHyN @O BBgN\NHyМBgBgN:PHy?<BgN:PHy?<BgN:PHy?<BgN:PHyp?<BgN:PHy?<BgN:PHyɐ?<BgN:PHy?<BgN:PHy?<BgN:PHy:?< BgN:PHyL?< BgN:PHy4?< BgN:PHy@?< BgN:PHyТ?< BgN:PHy?<BgN:PHy ?<BgN:P yh yL h| Z/HyNjP yL h Z/HyNjPBn`(? 9>м#$ 9 o> 9#T 9$м29g"<h`2<HЁ# `< 9$м29g"<h`2<HЁ#T 9Tм# ?<NT @f0<`0<3?<NT#̔ i#L i#LpNN8?NX3609H/ </N  yp 0.3H/ </N  yp ?<NTN"` ygX3609H/ </N  yp 0.3H/ </N  yp `BnA-H09g n|3 =|Bg/.?<NX nR((H|9oF n|0 nR((H|9o( n|0 nR((H|9o n|0`N?<?./9NPN??<?<NZ\?<?<NZX.* E m2 E~l,??<?<NZ\029RyA`F Ef"JyoHy?< N\Sy` EfHy?< N\By yNg E f 09g``RHy?< N\09A 09A B0ByLN^NuNV`Ry09A0@H| f09ym09y]|N^NuNV09RyAp.H|0m.H|9n .H|0`h.H|Am.H|Fn.H|A| `@.H|am.H|fn.H|a| `.H| f0<`0J@m0.Rn @m: GV|L N^NuNVH*nBnBnNf0<`:`0.@=@0nNH>J@m0.Rn @m: GV|L N^NuNVHBn3Hy?< N\Bg?<?<N\NN09RyApA̦*H.H``=|`HnNXXg*3HnNXXgRn` 0.|=@`09|=@?<NHy̦?< Nl.P:̦'?9Hy̧N\Bn`p09Ry?NT@H?0<2<A n\|AA̦HЈ/N\0.A09nf` Rn nm?<JHy̦N\Hy?< N\09nf`HnNXXg3Bn`V?<NHy̦?< Nl.PHyHy̦NP=@?.Hy̦N\Hy?< N\Rn nm`?<NHy̦?< Nl.PHy̦N"X=@?.Hy̦N\Hy?< N\`HnNXg 0.`NHy̦N"X=@?.Hy̦N\Hy?< N\`VByl=|`=|`=|3lHnNXXg3`?<NHy̦?< Nl.P=yHnHy̦NPHyNXA̦ м /N"X=@0< n?Hy̦N\Hy?< N\0.SnJ@fp`~HnNXXfHy?< N\`Z`?.0.Rn?NXHnNXf`0?<?<?<NZ\`"|2<* |N*N0.gByBgBg?<N\L N^NuNV0. HH|A0 nR0. H|A0 nR0. H|A0 nR0. |A0 nRN^NuNV0. H|A0 nR0. |A0 nRN^NuNVBg?<ANXBg?<XNXBg?<YNX?<?<PNX?<?9GA>0p0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁX/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁX/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁX/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. N~O LN^NuNVH>9GA>0p 09g`0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁX/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. N,O LN^NuNVH>9GA>0p 09g`0.29*GAbp0.HAτ0.GS@HAτ Gf$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. N9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ Gf$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ G f$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NhO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ G f$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. N0O LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ Gf$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ Gf$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ Gf$?< 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH>9GA>0p09g`0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. N&O LN^NuNVH>9GA>0p0.29*GAbp0.HAτ0.GS@HAτ G0f$?<( 9d2.HЁT/?<NlP`? 9d2.HЁ/?<NlP? 96.ƼЃ/Bg?. NO LN^NuNVH<>. *n <.(y A˄$H09g`AB@0p@On2AAA@A@B0 909@&@[@HEPPEPPEDP@PBEPPEPPE$P P"EPPEdP`Pb g\RSFfT`AB@0p@On@@B04<6<"" 909@&@E˄j@HBEE:2P8BC89DPBEE:2P8BC9E9DBEE:2P8BC9E@9DBEE:2P8BC9E9D0BEE:2P8BC9E9DBEE:2P8BC9E 9DpBEE:2P8BC9E9DBEE:2P8BC9E`9DTSFfL. *n <.(y A˄$H09g`AB@0p@O2OnA2AAA@A@B0 909@&@[@HEPPEPPEDP@PBEPPEPPE$P P"EPPEdP`PbAPPAPP g\RSFf<`2AB@0p@O2OnA@B04<6<"" 909@&@E˄j@HBEE:2P8BC89DPBEE:2P8BC9E9DBEE:2P8BC9E@9DBEE:2P8BC9E9D0BEE:2P8BC9E9DBEE:2P8BC9E 9DpBEE:2P8BC9E9DBEE:2P8BC9E`9D:8FEFD9E9DP9E9DTSFfL. *n <.(y A˄$H09g`zAB@0p@On2AAA@A@B0 909@&@@HEU0@ED2IDAQEU0@ED2ID@AQEU0@ED2ID@@ABQDEU0@ED2ID@AQEU0@ED2ID@AQEU0@ED2ID@ A"Q$EU0@ED2ID@AQEU0@ED2ID@`AbQd g\RSFfL. *n <.(y A˄$H09g`AB@0p@On2AAA@A@B0 909@&@[@HEU0@ED2IDAQ@AQEU0@ED2ID@@ABQD@AQEU0@ED2ID@AQ@ A"Q$EU0@ED2ID@AQ@`AbQdEU0@ED2ID@AQ@AQEU0@ED2ID@@ABQD@AQEU0@ED2ID@AQ@ A"Q$EU0@ED2ID@AQ@ `A bQ d g\RSFfTL. *n <.(y A˄$H09g`"AB@0p@OnH@B0 909@&@@?Hg( @gn gBEE:2P9EBTBlBEE:2P9EBlBlBEE:2P9EDBl@BlBBEE:2P9EBlBlBEE:2P9EBlBlBEE:2P9E$Bl Bl"BEE:2P9EBlBlBEE:2P9EdBl`Blb`BEE:2P89EBlBEE:2P9E9EBlBEE:2P9E@9EBBlDBEE:2P9E9EBlBEE:2P9E9EBlBEE:2P9E 9E"Bl$BEE:2P9E9EBlBEE:2P9E`9EbBld`bBEE:2PBT9EBlBEE:2PBl9EBlBEE:2PBl@9EBBlDBEE:2PBl9EBlBEE:2PBl9EBlBEE:2PBl 9E"Bl$BEE:2PBl9EBlBEE:2PBl`9EbBld`BEE:2P8BlBlBEE:2P9EBlBlBEE:2P9E@BlBBlDBEE:2P9EBlBlBEE:2P9EBlBlBEE:2P9E Bl"Bl$BEE:2P9EBlBlBEE:2P9E`BlbBldPSFfL. *n <.(y A˄$H09g`AB@0p@OnH@B0 909@&@@?HgH @g. gBEE:2P9EBTBl9EBlBlBEE:2P9EDBl@BlB9EBlBlBEE:2P9EBlBl9E$Bl Bl"BEE:2P9EBlBl9EdBl`BlbBEE:2P9EBlBl9EBlBlBEE:2P9EDBl@BlB9EBlBlBEE:2P9EBlBl9E$Bl Bl"BEE:2P9EBlBl9E dBl `Bl b`4BEE:2P89EBl9E9EBlBEE:2P9E@9EBBlD9E9EBlBEE:2P9E9EBl9E 9E"Bl$BEE:2P9E9EBl9E`9EbBldBEE:2P9E9EBl9E9EBlBEE:2P9E@9EBBlD9E9EBlBEE:2P9E9EBl9E 9E"Bl$BEE:2P9E9EBl9E `9E bBl d`"BEE:2PBT9EBlBl9EBlBEE:2PBl@9EBBlDBl9EBlBEE:2PBl9EBlBl 9E"Bl$BEE:2PBl9EBlBl`9EbBldBEE:2PBl9EBlBl9EBlBEE:2PBl@9EBBlDBl9EBlBEE:2PBl9EBlBl 9E"Bl$BEE:2PBl9EBlBl `9E bBl d`BEE:2P8BlBl9EBlBlBEE:2P9E@BlBBlD9EBlBlBEE:2P9EBlBl9E Bl"Bl$BEE:2P9EBlBl9E`BlbBldBEE:2P9EBlBl9EBlBlBEE:2P9E@BlBBlD9EBlBlBEE:2P9EBlBl9E Bl"Bl$BEE:2P9EBlBl9E `Bl bBl dPSFfL. *n <.(y 09g`AׄB@0p@OnH@B0BEVDDDBDDD"DDbVEE@EEE EE`VDDDCDDD#DDcVEEEAEEE!EEaBlBlBlDBlBlBl$BlBldVD DDJDDD*DDjVEEEHEEE(EEhVD DDKDDD+DDkVE EEIEEE)EEiBl BlBlLBlBlBl,BlBllISFfL8N^NuNVH>. *n <.(y Aτ&H09g`AׄB@0p@OnH@B0BEEE 3PH@89@9@@9@BlBlBlBBlBlBlBlDBlH@9@9@9@H9@Bl BlBlJBlBl BlBlLBlISFfL8N^NuNVH>. *n <.(y A˄&H09g`vAB@0p@OnH@B0BEE:3P2A330@@A89@9@@9@2A0HA9@9@9@B9@BlBlBlDBlPSFfL8N^NuNVH>. *n <.(y A˄&H09g`DAB@0p@OnH@B0BEE03P89@BlBlBlBlPSFfL8N^NuNVH>. *n <.(y A˄&H09g`8AB@0p@OnH@B0BEE03P8BlBlPSFfL8N^NuNVH>. *n <.(y A˄&H09g`jAB@0p@On2AAA@A@B0AU0@A@A0HA@@QQ g\RSFfL8N^NuNVH>. *n <.(y A˄&H09g`^AB@0p@On2AAA@A@B0AU0@AA0HA@Q g\RSFfL8N^NuNVH>. *n <.(y A˄&H09g`HAB@0p@On2AAA@A@B0]PP g\RSFf`DAB@0p@On@@B0G˄4< 6<BEE:3P889DPTSFfL8N^NuNVH09@A&HЈ&@=|<<Nʼ09f yf?<(/9 Nl\09gJyf` 969`ƼЃ*@?</ NJ\H:| Do20|@g> ?NT>?< R/NJ\?< R/NJ\=|0 yf2<`2<A yf2<`2<A??0@AF pNX0nf ygj0@A 02AAtH҈ A2RPHЁ(@=D09@80 yf2<`2<A yf2<`2<A9@0H03l0Hs0@Ap` Df=|?< 9 ̼І/BgNlP|0|O @AgN ?NT>?< R/NJ\?< R/NJ\ 9μЇ*@=|`80<2ARA=@?. 9 ̼І/BgNlP=|n0|O @Ag Fe Fd"0<F? 9 ̼І/BgNlPBn`40.@A 02.AAt20HЁ(@9|Rn nmNĒL8N^NuNVHBmFBmNBmVBm^BmfBmnBmvBm~BmBmBmBmKRn ne?<HCHVVVV VVVV`.H|ff><HCH.2x2< 0|@@ . m m><HCH.2x2|A . U m`:><HCH>3xμ2<0|@@ . U mRn ne`0<2AA=|`l0<E?/ NJ\.H|fj><HCHVVVVVVV VVVVVVVVV.H|f><HCH.2x2< 0|@@ . m m m mHH.2x2|A . U m m m`J><HCH>3xμ2<0|@@ . U m m m@Rn npeRE EeBE`J0<GOTGOSUTSTETHEΣ<<>ުNOOANĨ<<>STRCHRUSASVALEADATCOPEESIRNFREXLOCLOSQSGABINPADDLSTICPTRISTRI8ee L08ueeeee褢 ƚƜ`8IȄ墅8夕奕墅褢`朱`  6ğȱȄ ~La HH`0 Щ LLL]š Š` ܩ ЩLei``` ELq El `=Īٷw|ԶԶѷש巴!e l. gɨ aL6 Eƨ إ󅕥 gL a" a Ư" L8 > c=Š) 죰 L樤ħ`hh` >L ڪ H # q Ԡ Dکթ@  Ԡ hH qhıȑıȑĦʊȑ` ͫՅԅ hhL^ ` 𵤨 >>< H & h  ` 0` q ˽L½    0 `LP  Lն` LP y gLh 0L[  0 ܩ Щ 0L ׫ԅՅ` ૥# ԅ ͫƳ ( >`(Lض Ȅ` z > ąŅ`őŐ  H h` zLzĦ``Ƶ`Ƣ౐``䉐䈐`)iiТLE`湩 0éL y7 oԩ 0 gՈ y [L` إ󅕥Lg AT LINE ૥H ׫ H ׫heԨh` . ૥ Hҩ ׫hHԝ ׫ H ׫hheԝ` ׫ԅUՅV ૥ԅT` ׫ԅ` ȍ JK )L ׫i)I ػLS: ȢL8)@e`H J*K+h LGHFH`L ׺L` ׺`H +h `@H ׺hH    ?}i}(i L fh`LP   ׺ 8倝偝   󥃅  LHΆ󢻆h ػ `C: КH hKJ LQ L H hHH ڪ } hKhJ  QL )L + L1& $LM 3 NL1 ͫ ԝL՝M ͫ ԝN%б ׫ԦL Q   L1   N Fɀ 7LɈ [L4] LS + C` ͫ`IHEDBLVHH hh L  ``r `YDAER ԅՅ֦󅗄`` > ˽ $ "   򤲈ȱ`   L &L8`$)ԩe (ې`)8@0+̪Յ)e)e ݦ `F ݢϠ `ڢ ڰ @ݢ F I`U9>`D'RFuCU?b9dYdg@W2@?tS)%@)@0)%ԅԢ ޢ ڰ9 @ݰ. ڰ" fڥԅԥ ɠ (`8`0?i (۩ ݢ `ڢ ڢ ݢ (ۢ `ڢl ڥ fƢ ݥ#8@ji@)j `Atari OS revB: ۰9 Hڢ D ۰!H hم٦0hL`.Eh+-X ۰7H ۰H ehe ۥ Iihe+- ې08H*hj ۥiD ܰ  ` Qک0()?(E$8? p .L L٩` p 8逮0iE ܄ 8-+ ܢ8 i H h ܭ0 ii ܠ-`ԅՅ D&uԕةBLܩ0fCb8@?i ZڰS ZڰF ZڰAee2 ei$  iiԥ`8`Ԡ``&&`I))8Դ0 >E0uذLܩ :ܩLܢ8LܥI8ՕLܥE> 8@8e08 ܥ)0 LڥJJJJ0 L bץL D`8` 8i@0 LNۢՕ 8ؐ ٠8ؐ е bL ۤȄ` `80 `H ې.+-h8` ې . ېh`ՠ66666&`ڢ.`)q` D`ʈe` ԕ` 8JJJJ ܵ) . ` 0` .0ʽ` ۥ)`8`E)F)`ԅ ( ۥ) 4 D`ߠߠyʈ``` ݦ - ڰ(ii fڰ  0````ԕ` ڰԅ)8@0&j ٥ԅX ݢ `ک M @ ڥ#ji@0 ڥ ݢ (`8`==W3>Tvb>2b'?h`06?2'A?%C4Vu?f'70P@U??CBH@ ݦ fڢ ݢ ݦ `ڢ (`8`ԅ8@ ) (ۢf ޢ ک r @ݢ ڢl f ݩեIi $ԅ fڥ (`@"wf?P?IWQpIG?9 Wa9cU? 0d? 9`?BXGB?7?()q?D>DIh8E?hyx? )D?@ (1V?wD3331??xS442Phfffffff>`<|fl0fF68of;p88pf< 80 0 ~~`0 0```nf>ff~fff~~f<flxxlf`````~cwkccfv~~nf8pp8?ww<~~~<x`x`~<~~<0~0 ~ <~~<<>f>``|ff|<```<>ff>>ff>|``|fff8<<``lxlf8<fkc|ffffff>|f```>`<|~ffff>fff<ck>6f< x~ 0~<~~<~x|nf8x83=3``nf>ff~<ө<ө2A`B`L7 6(ҩmi:; < =:2i4354 ?6L 6 j u? ,p? j ?0070Lt _B0`?>2i435< 0>A!CE000Ɋ?0`0 1;:2 ҅1L: _`H232435; 1 ҩ;  hh@2 e1i1L; :)h@1890 <ӥL9`0`Hҍ 00) 08 109hh@ Ҡ2e1i1232435ޥ<<Щ82m43m 5`.̍ҩ  0 4ӭ j kL 0x 4ӭ j u  0<L `-2 ` Ҡҍ2ҩ% L1-2 2ҍ ҩ% ҩ(ҢAҬ`ҍ`%Ң`jj)?j)` k `    8 8 }imJJJ 8)i 8}}`|08|`i`Lx%) Ԥ   aXL )0 Ԥ  ̭ҭҩҭ2ҩU2ȑ212i23i3X` _<Ӎө0XL &'x \X`CT eu$F`1F!@WS   Y`S mF! mȱȱ򈈌 ```}~S  Y0 ` ` ɛ`  Y` ޠ`@S@ ``W+N(DS  `Nݩ̍`+>*) 9`? X0$4Ӡ@* \*=L` X0̍ҩҩ` h4ө \**=`?03==`R 0= L?`==` =``0<`=  0 L2@iЩР@ i  `%H$H` `#@R>  Y`UW `P0C@ESK }ATARI COMPUTER - MEMO PADBOOT ERRORE:xDxآ D w(r s DR'S% X  <ర  9BDE J VL%  ) D )l )ll 0L*HH`ll`lIIiL?Нԝ`T67  , < L n e k)J` ) ~`S S`    K`@BC  iiA   KЮK l ~ `BiCill DE BH V`KLzR S` ) `J>K } KJ  `l)j@`+)*)*W/Lҩd{j`WiLQjeE( !o)?gjjj)g ! odXeY z udedhei A fW -*)' j ` B  efffQQ W]j8  O Q Y X Q @ p p d0e1p dehdie1 0 LH h`*) R" //L! 2 L4 Gd-FoJ` } L!ɛ 0L! L!TZ****)) GFo L-PI1dPd` ]W I LL` k4TlUm Lɛ cq LP lTmUkk L0 L 0 !LLld  L de !L*JbX|ɀɁ ILɂɃ@ЩɄОɅ L&|@a{ |L ML4`TʆTL\TTͿUU0RSULUUSRL deej cmTVl`cR!UR s UST   L UR 4 c %LcLcL } cH hc }H }hLD λ0TL GdheicH hcTͿ hڠh h L8 {RU Gdhi(feiigT N L QTT8 #ix(  RU G L` ` L0+dL0d8dee dL`THUHVH Tfgf &gQg &g &geQfgmgW0f&gL~U0 FVjnLeffg8nfedd^geee_ohVhUhT`}cUVUWݍ S`VW0cQ }& 0Lw 4Tix %} L} VTW${T& }ɛ8 lΝ8ﭝTL8ptpquq`W 'SSWT*( VVU L` Lhh{ L4]^`H)nhJJJ`...` n` nI=`Tix %n8`W****))`eGd'fPhfPdeidhfi(fg` "iy( 0TTix(LRU G'd` XdYe(djedddeejLcTQQ " ci(cQLceUc` cHlTmUk{T USkL9 kcRT kcR USTkhc ` QlRm`cRT cR GS8RdL`-`T`T` L4 THTh{I{`l$Lw`{WRU`XdYe`"`获T`UaVbyz8`Zv yvIiv8a[wb\xzwIwxIxwxspZTw訥xu wvv~tHuJhjp~LBpevpqqupt TeyT zrewrsexsu'rt$zUUV VUV z / TH hT  L  8~~0LL4 4d //__aaaa ''OOAAAA ((PP@PPP 00``0 @ (ʔFy}~02- m7@ ` @`lj;k+*opui-=vcbxz436521, .nm/reytwq907~8<>fhdgsaLJ:K\^OPUI_|VCBXZ$#&%"![ ]NM?REYTWQ()'@}FHDGSA {   ` }  ɟ IM0+h@%Fastchip FP: ۰k F Dڈ ۰ م٦0.0EA ې+-B ۰; e e ې+ 0`.󩰠+- i08eL8J ۤ iԔILيd19 K Qڥ 8~  ȩE oة+8- odȢ8 i m؊ 0~-`CPYRT.1981,MARSLETT*`eׅץeօ&&Bj &&&Ր }܅Ԙ}ܨPiԘi`զԆՠׄ؄ʈ0Ր)Cj>d8ԕIؠ7`ە1IiE0yʈ0niհdڥEԠ``&`I))8iE040 uʈiԐԕեE*`80 ʈL`<68?e ۵ԕڕڅ cԊEEhh*08``LC ݥ8i@ ۵ԕբ 8Lܥم؅٥ׅإօץՅքզJJJJ fܦ) fȥإЄL; `80 ` ې>.+- .,0"8` ېȄ`Ԡ66666`:`Lٔ0ȵߵ޵ݵܵ۰٘ eeߵe޵eݵeܵiۈٔۨ0Lۨuu٥uإuץu֥uՈ` 'Oc?'N?Jf tصJJJJ mص) m0 tة0̀  . 0.``` x݅` x݅ b` " ڰ b fڐ`i`ԝ````ԕ`ߢ ڰ F ٥8ԅLCieȅ ԩf fڥ)?%ߢl ݥ f `ڠ ڠޢ @ -ݩ ; ` (۠ߢl f fڥ b F ߢ e?` | fڠ - `L%@p8f@i 1&@4@ g@Y!3'@"wf } ۢ?1FffffوԠߢ ڠߢr 8ݢ -ݩ C ( " b fڢ ե8 f fڥ b `?PE@i@g5`@04VD?8@0% ?CBH@>DIh8E?hyx? )D?@ (1V?wD3331??xS4XL Extra code:BB@ԭЍ`,lHHHl"lH) ߍҥl H-Il8%,LIҥm#hlMh@h,l,lhhH)HlHh@@ 6 LMMMNOEO%NТ U O¥B)L­д ԍ5 ԍ41ԭ0ԭ/ԭoЭll8l)ԢXEO%N ԭԢ U R¢ U&)+>)2+2m-+ ɟ ɃɄɔ)? ҍL+JJJJy{)xzЍЍҝpt ҢxJJJ}*|ʈl$l&l(`` - -`hhh@x/j 'D" x=\>ɓ?%ȩxآ qĩRFF# ) s F өD")\=>%?R'S)(0b%Kĝ.ĝ 5X)өLPర  )ĩBHDĝE J VL nƥj 9D )ll l`P0C@ESK BOOT ERRORE:,0­j l ĭ ӥ))ө(I I`}`ӝНԝ<өө8Ӎөөө<Ӎӭӭө"ҩҍҩ(ҩ `67  , < L n e k Pn8ɍ9 )I` )3L;ƩS S0!   Y >ƭ`@BC  iiA  Y >ƭЬ Y )ư ; `BiCill =ĊDE BHLVLzRLS )'Lƭ> } ũ  `lF`1F!@PWS  Y`S :ǠF! :Ǡȱȱ򈈌 ``3 Ǡ9 Ǡ/E &*ȍȍE3 Ǡ 3` Ǡ, Ǡ"Emm`ll3 sJjK J}K}mEHmh8Hh Hh hh`8H3m6m7h6LPm6m76m6676m6`m6m76}6`H3jhm6m76`mmm6ǒȒȒȒmmȵȵǕǩD)LHHѭɀ ɑ H`BHG H hH qhB`jHH ʍH hHhh@LɠLɠLɠLɠ Lɠ L H`G=!H` H HLM`LMBHB HH ɐ LhhLʠHhBLMM`hh̀@ .M  .L .@ L\L)-%-/294%342/-2!-+%9"/!2$4%34[17%2495)/0 ܀!3$&'(*+, :8#6".- 30!#%"!23("3\6/)#%qJiI`fffffff>`<|fl0fF68of;p88pf< 80 0 ~~`0 0```nf>ff~fff~~f<flxxlf`````~cwkccfv~~nff>0fff>6lvv~n ~`|`~<``<06<>f>f f>f>0<>f>f>``|ff|<```<>ff>>ff>|``|fff8<<``lxlf8<fkc|ffffff>|f```>`<|~ffff>fff<ck>6f< x~ 0~ffE0uذLܩ :ܩLܢ8LܥI8ՕLܥE> 8@8e08 ܥ)0 LڥJJJJ0 L bץL D`8` 8i@0 LNۢՕ 8ؐ ٠8ؐ е bL ۤȄ` `80 `H ې.+-h8` ې . ېh`ՠ66666&`ڢ.`)q` D`ʈe` ԕ` 8JJJJ ܵ) . ` 0` .0ʽ` ۥ)`8`E)F)`ԅ ( ۥ) 4 D`ߠߠyʈ``` ݦ - ڰ(ii fڰ  0````ԕ` ڰԅ)8@0&j ٥ԅX ݢ `ک M @ ڥ#ji@0 ڥ ݢ (`8`==W3>Tvb>2b'?h`06?2'A?%C4Vu?f'70P@U??CBH@ ݦ fڢ ݢ ݦ `ڢ (`0L8`@ ) (ۢf ޢ ک r @ݢ ڢl f ݩեIi $ԅ fڥ (`@"wf?P?IWQpIG?9 Wa9cU? 0d? 9`?BXGB?7?()q?D>DIh8E?hyx? )D?@ (1V?wD3331??xS4ԅ8Lfffffff>`<|fl0fF68of;p88pf< 80 0 ~~`0 0```nf>ff~fff~~f<flxxlf`````~cwkccfv~~nf8pp8?ww<~~~<x`x`~<~~<0~0 ~ <~~<<>f>``|ff|<```<>ff>>ff>|``|fff8<<``lxlf8<fkc|ffffff>|f```>`<|~ffff>fff<ck>6f< x~ 0~<~~<~x|nf8x8-I,Ln-Ln,,LnLyLLLLL3LrLLL\LL LL#LLLLL#LPLLLɕɚɟɤɩL `@۝FGiɀ``/.)Lp@ " qLp )0"%*H_vL Lp' "  ,&-'Lr Lp#  'ۅ&Lr  氥 .@ Lr"%*Lp () /Lr /0A$ ") /ɛ L ۥ") /0 /ɛ󩉅# $ Lr"%*Lp ()/($/  (0")/ɛ()ۥ") Lr#.D$E% @ /.#` ",-*稱,ȱ,-,`()(()`$%$`$%`.8H((I))` #`-H,H.`8$10 !!$ ! 8` ` %JKJqJ&JKJ V O- `mm8 N Ln 08 ݐH  h LYO@@ʎjLEǮ}` 38` Q LY&@JKJȱJ`8`JK V8( ]'JȭJJKJJ  (8`( JȑJqJȭqJJ VˠJ`Ji KilLr ];JHKHJKDJqJ VJȱJhKhJJJ`hh8`L3ɩ<ө<ө2A`B`L (ҩmi:; < =:2i4354 ?ΜL"  / ? ,p? ?00ν0L B0`?>2i435< 0>A!CE000Ɋ?0`0 1;:2 ҅1L: `H232435; 1 ҩ;  hh@2 e1i1L; :)h@1890 @<ӥL9`0`Hҍ 00) 08 109hh@ Ҡ2e1i1232435ޥ<<Щ82m43m 5`2̍ҩ b 0 4ӭ Lb 0 4ӭ = 0<L*`-2 ` Ҡҍ2ҩ% LV-2 2ҍ ҩ% ҩ(ҢAҬ`ҍ`%Ң`jj)?j)`,  7` .  . 8 8 b8}mJJJ 8)i 8}}`|08|`b}`Lx%) Ԥ   [XL')0 Ԥ ҭҭҩҭ2ҩU2ȑ212i23i3X` <ө<ө0XL*&'x \X`CT euxd   4dd //__aaaa a ''OOAAAA A  ((PP@PPP(( 00`` 0 @ HH"0"0hh8`hh8`hh`$! ` %&'.M$L`HH)  hh`0.@ 0 )0hh'H&H`Lj@Qyz`a`+)*)*WLT̍k/Lҩ@,n čԩd{j`WMQje( zo)?g jjj)g z odXeY z x]de edheiA pfW  9*)3n  ij p` pB ief-f-W n "QQ pW& ]j8 p pQ @ pQ pY pX pQ @ pp pp pd0e1p pde0hȭ1hL `*) R" //L j L d-FoJ`} L ɛ aL L TZ****))I Fo L-PI1dPd` ]W I LL&LȩL`,n@ԩn΍L b k4TlUm Lɛ bcq VL\  lTmUkk L0 Lb a LLbld b   <  Lb i- de Lb*Joe| бy0LɀɁ Iɂ  Ƀ@ИɄLɅ LLɉI LɎɊ| `L*ɒ Ɏr&|@a{ |L# < ML򩀍`TʆTL TTͿUU0RSULUUSRL dddeej cmTVl`cR!UR # UST  L UR e Xc ]LcL>cLJ L } cH hc }H }hL Wλ0TL L dheicH hcTͿ hڠh  WL8 RU L QTT8 [ix( < U * XL ` @Ln L0+dL0d8dee dL` p p`fʆeT &e &eeTdeWmd&eVJUjfedeeXd^eeYe_%Uefo`}cUVUW} SސVԥW,cQ }" aL eTix ]} L} VTW${T)#}ɛ llΝ8뭝TL8ptpquq`W 'SSWT*( VV}U L` @Lhh{LbL_]^`H)nhJJJ`...` #n` #nI=`Tix #%n8`W ****))M`jʆigh؅fT'hf8hf(higiL Ziy( <0TTix(LfhdgsaLJ:K\^OPUI_|VCBXZ$#&%"![ ]NM?REYTWQ()'@}FHDGSA {   ` }HHӭ ImɃIm )&= Ҫɟ I)?.M+//hhh@!ϭkk п)Lm/͍/HMO-N ԍh@L̍`+>*) >`? 0)4Ӧb* \*=Lw` 0̍ҩҩ` h4Ӧb \**=`?03==`R ?0= Lz?`==` |=``0<`=  |0 |L@b}ЩР@b} 6`%H$H` `#@R>  Y`UW ?`@ `S   Y0 D` `HA! Khɛ`  LY Kܠ`@!S@ ``W+N(DS  `Nܢ ŋ`8` Le查Š饟š`PXBBl,NVN^NuSP1p(T0< cRc]=U*֪BbP?/ ;8 WUQB@x W`| _ xޥUPU Nxw H @~l<! L/fu3nC>1=/F@lF@BhLJ@/U\J[R*t@9U 0xD@v"U,JUE^ 8(@@J `~@<.@GU JHOjAT"u? "P>@RC H{;z#~t .` xD 82c O?.Xc [q 1  I@@|H` υC)(((( *H@_|DW6?x< g+Uj¿ً$G eP YB m] L @vUֺ/r$*kb&W 9k28ގ<@  D@@Ƒ:WVAb{ I@J± |x!8#e஠ H![a*A" J.mQQLYM2 JઠK @BD@ })E  A!' + @./ ꮢ 5C]D}_*? RTGxV"@G T* xE)F`y?|0<~zuO(oD\ p?D8dV QEPWTZmt4:e&~!*@w T>UtC55 ;/o{ﱶ H(*"j M#F֩ImX(@ޞJNFDHJ@U?[HΰQIuC3 JBDȺHJ@;OM03C D*LDJHD .Št7G+*# jr,  'lC Wp (mW X? * + "hߒ;WUUjR@@ (HH1O 8f gǔ@@ HL >DZ5 ;0n|?c?4` @D@Ĥd lDJ@~`ȿ/t:mp}I_,?>A@ cߪO ]BwH@ @z0ހ> LLLjF@NLD`L@b諎⪪~%J@**J$J*@ׁ?j߃J@jjJdH@j@K ?UUOLK AW[DG_+ HL j&b@*bJ(Dj @VrWKꊪ# 8 H_e8@B *D  '?* *?b )o@ .$NA 7݀v00r_gh=~?# V5aW]|[[73@@Ӆ׭V.h*_F u>X",m?=*` 'c0_1g?)`R4qњUE|{:N ^XxC[C!aP^~a ]?޾BB 50JBJEu^ !f@4s@ JD [w `'S:~;`pGAh]_J "@/ҽ]Upz4V%JJJ&Q5Ty>n ! (?w/ vT P{   l€TA0;w@ $JF @j*(m(4 s򪊪6Z H@$ @3?]=WU H@ B L \BUU #V*7A WE/P0 I*L  (-* *@fǭUϟ{|J*}jQWHa6'0+Y T@US}@AH- NADE]V N @|p;w관 v7 i1pH X?/p/ oTDl}j 1lA  7@ * E-(R*O# 0^E+u@d **>+@CTjwJU^Y $*@D̀x/ _;mWtBn] `j@Jaߝ x*j_5̢ގd L2P3|@@@5߽TUU@MQT_Q;aB -t<?+~R' J@D@YlF -48t⶜;J@D@t@|8'\J@LD@ ?:H\  L @J(og`@).{۸ a~=rG~U\ S !s :>n?t@D]#J@dd@L HF@;~*/ TS  ""@?8 Y  <!߃Dj*@JB@=wހ!xopD@$`Ĥd`@ jD@L@EyHB g >+s {%T0d>2PՀ{G]~?1Y(~ ~~ޘbŠF>?> 0?83"zт`ADoN8[ (=;}K +@$@@D`@4>@)a**6(HD>@@3a DFDJLD@0CQEhC#yl]UbC _a UJNFDȪHJ@> R+ JB DHJ@"!ZFQ_ TAJ L1_ dHGʨOa)) @@ g#5Oo+X:?!  }s_%c&oA @L 耤 HH-@ +p  *J  $7}gP֥US}O?g4> [tj T0b<K@H@ @a,B>aj!7mY1cVIqa;?J@jjJdH@j@j`]>0 P`$R3 HL j&b@*bJ(Dj @I KP 5 %@ ʢ `/@puTE JF @ #J :]'Q ?xPX*HUJ(*TP?P@0  ?A @*@~(z0`@ H֫R HBj*Hz~1  t-- @  D@@ < :oUv∪*, @J\Atzq  J*X.@*'x0 J @D̀HcA2@|M Jઠk @BD @̀A*@" + @?BA?݄-@1>My/8><NgP|7Dzu(@0|TP8I!*@G]L .8D@$ )?J嗩:( jeUw@q8@@D@@!> ; `x!HD@@``&d@);e64<>AU JHD JJ^ @ 1 @ @` +|!BE;YN8.7`m ﮢjHJ ?Lס@ a'@@ @HAyU@<[l0A Pb]\3tO.?X8gX 8 j^d--|P_3 a Z~;"61Gf (jdJD$:$`$ 9Co/F"|6ʔ@_/Bz@ ??^EB"sf 2ɮmE GX/`_5*1 ~qRP N?!}J|^@ H6p/d~/ gUUAx9dW{H ^ "K@ *  3W^p(D`D(h஠ H 3;Y*//y\hA>&|a JઠJ` @BD/ <`D@  bV!s .`@1e fT/A6} " > %`P ~| 88 c |H #@n@ ? q H!$@``@@A@~2GHD@@^/[}x DFDJLD@ >? )h1@?8| JDDȾHJ@P>!SV @ JB DHJ@0LBw  ﮢjHaJ(g[SO 7!80 " @ H @@@p_; @@E  *\ `/0@@@  dOTA(    Ls.p8x @@ HLؐ( ~Cq3xH @@ 茤 HN H0&0@8X W@> 0O 8( W 2@?]QN(U $ra,4n@}q@`LFJ@**J$J*@ J L2P J@JH@0$VH J@ꮀJH @@040,@P `.jh @!*$'V` E   PH `kN@LLC*;$  !PP @ .$NpY x jdJ@ g\}{$ ( hJ F?@(V@_dȌ з#{Q < " ? #9R@(@~GU`5fhG^/ 5U_P=iá/g@@  @`!#PvsrB $@ kD HLu]URq J "  o;qAeRHJ "@ _ kCJJUTFھG@JDDLJD(*WZP;tWSEP! @DNNBNr!WX 0E E@ @ JB  1@DqTdN JB @P "X*ꈤ@ND`(߭bH@ B D r*h (L F L ( &B DBD@ (*8 @!"!3C"TDC22!"!2"B!!"CTD2UgC2!e"2"""C2!!CDTDT2_C2!!""2BS0Pp!SST!BC"!eDUD3?T2!2C"!C2SSBTC!U"D3C3"T22TC!""S2CT!DpS!C2!C"Ue!DT22T2!C"Cf!ST20 p!SC2!TfUT!"D2C2!Tf"!!2Uv0S!eU"3T2!3"CD2TU"3T!2U"wS@!SC2C"fT"e32DC2T2C"fT"e!!0S!C2"T"!UCTe3C2DU2T"!UCfSSCT"2U2DTU2CT"D2U223Df~|S!p0SS!S!S!!C"T2UfeDU2CTC"T2C3!"2S(!p0S"CDT2DU3TD2{C2C2T23!T0S!d2TBD3feUCTC222333""2SR!!ST2"2B"UeT2DCT2"CS"D3Bp!S!!e2T2!UfTCCe2T2!3!"SP!ST2CBTUDC!2T2CSBT"!"!0 "pS!T2!32!UDC3DCT2e22!!"BSpS0SS!2T"TUCD!32C2T"!"C!2SB!S2T"e!UDC3CT2T"e!2"S!TC22!UCD3BTC22!CS!"0 pS!B!!Tw3TD2CC2B!!T"dS2S.pS0!TBwS"CDD32CTBTS"C!!DfSFp0!STC2ew2DB"3"!TC2e2BS"21Cp!S2CTewSDT"#2CB2CTe!ST3!S20p!SC"T2eSB"#w3TC2T2SB""3!evN!0pSC"C2ST2"B#DwCTC2ST2"B"e2S#p!0SC2"fwCS#T"2T?C2f#CSTBdS!!p0STB2w"32C!TCTB2"e2Sf!0hpS!0!f2SS2CTTe!Cw2SS2CfTeUp@t!S0SpBUfe"wS"DTTCB2e""S"TfSp`!0!!!Sp2SBf"CS!d"C2SBfCS!dT0pS!2"BCe"TTSC2S"BCe"TTSC"!0dpS!03BS"2f"S"TCCBS"2f"S"3UTp!SCBS2eTC3"D"SCBS2eTC!!"3BfC2ST2BeC3"2fU?C2ST2BeC"Bf2BCT"e3fCfS?2BCT"e"f2D!BS"2Te3"!f2CBS"2"e!3!BB2Ce2"""3Cf2B2Ce2""!3BCDB2CTC2e2"B2""2CTC2e2BBSSC2Ce""2TT"32CB2Ce""2TTDSBB2C2Te2C""!"?B2C2Te2CCBC2"2e2"C"BC2"2e2"TCCBSBKp02CB2Te%2!!3""2CB2Te22!CS@pC2"2C2T#3"SBC2"2C2TTBCpC2B22CT"#D"33C222CT"B3BpBCC2TT"#3"!2BCC2DT"SdTp2CT2CS"3DUf2CB2CS23S"1p2B2CC"T3!U"2B2CC"TS!pp0pC2BfDCU2DU"2C23BfDCU2DBSe2CBTUeUBDfC22CBTUeU!"BC0Rp2C2BCUeB1v1DT2C2fCUeBv2Tp2CU2TCv2BBfe2CU2TCv2BBpp0pCwCTfDU"fUB{2CwCTfDU"1Se@TCTfvwUBUVf"C2CTfvwUB2egT82p0fT2vCe"UBDvCwfT2vCUfUB!2DQT2CfCUfeUB"vwT2CfCUfeBS0$pfTCUvCfS3BD2wfTCUvCfS2B""BpfTCCU2!e"fU2wfTCCU2"eTfBfT"3D2UUfCBCwfT"3D2UUfC23pfC3UCTCf0DU3wfC3UCTCf"e00pwfCUDv"T0@3"2wfCUDv"Tvfp0fC3TDU"0 f"wfC3TDU23e0pweffD"C Tv3wUffD"C"D20pfTCUDD!"fwfTCUC"vTVp 0fCTUDDv3wfCTUDD"3!UfJTUf"fCDTC2?wTUf"fCDDT"p0CfUv"Tf3D?wCfUv"TfTep!fDUCdf"TCwTfDUCf!2p022fTeAC1BD  1w3fTe!C1"Dfvp@CfTfADUe1S !DwCfTf0DU3C"pV0Tw3f"f1De0vC0 Uw3f"f1D "UpCDf"2fUeB01C0wDf"2fS  3Tp0CTfwU3D!e"11 !CTfwU3D2"CfpTCfDU1f0eB 1w?TCfDU f0"3TevCTUff0DwC! 10CTUff2Dw!13TDTUDf0f!21! 0?CTUDfCf 1T33TUC0fDf2!1 !TUC2fDf 1CBwCDTff02 w!0 CDTff2 w0C2CC2f"0 f3eD!UC2f" f"DT CC"UfD0BTv0 C"UfD2C 1"C"Tf!"CUeT C1Tf!"!U# 3CD2 Cfe!!TCD2 Cf!"T0@0CTD!eU2C!CTD !2UUC 3D 0CD3DDCe2!TCD3 DC !00!p0CT"!DUe3!CT!DU2 30#DBp02CCDT!UCC  03TD2Sp0DCTC2!!2C!C2 e"10 p00000003CD2!2CC2!! T0 0"p0"CC!2TgCC"3T20p003C3T2!2C!2T2"!C0@0"3C!TCU2!!C!T " 0@@0"C2"!3TC2 203TpH 00p"DS2Ce!3v!"2C!TD0"0p0DCTe!2!!"!2wCT2!3DS00`&p00CCT!!!"q2CTD0DpQ00pCCTD!u!C"T!CD00P*p00CDT"!C 20p0"ef!!2 NVH@|:9Р*|`.<@,<1 9̔29RAHЁ&@`DJGl`FHJEm<<`RF0Em0R@@`0D@T@:HBF`0RF0EmSG0SGJ@f$yhBD`(KBF`8PRF FmTRD DmL<,`&<|BE`0|g8`B\0@<RE Em0SGJ@fL0N^NuNVA-H n#ÔA@  n Bn`0.@A@ 0=@0.A`HЈ2.AA@!?.?.?.N\?.0.A`?00.A`?0?.NPRn0.nmtN^NuNVA-H n ÔN^NuNV n f n f`0.n =@?.?.?.N\0.A`=p0.A`=p?.?.?.?.NP0.A`=p 0. nnf~N^NuNV0. A`-p .=@0. A`00` g0.A$HЈ2. A`! 0.A$ 0@ADHЈ @ 2.A$!0.A$ 0@ADHЈ @ 2.A$!0.A$ 0@ADHЈ @ 2.A$!`@ g"0.@AD 02. A`! ``|g|g0. n ?0.@A@/0N|\N^NuNVH nPf:<`:< . n2(HЁ n2HHЁ-@ . n2( HЁ n2(HHЁ-@ Ef .gU . gU .gS . gS *n(n n>( nh<<,`:((((((((( Ef((((((((( HІ(@ HІ*@0SGJ@nL0N^NuNV\H >. 09gBy`` Ap*HA\(H?<NTHyBgBgN:P=@?<NT-@*B;|;|(Bm BmBmBm?<NT=@ nf;|;| =|`;|;| =|P y<(v yBh yBh yVh* yVhB yRhz yRh yXhZ yXhb yTh yTh yRh?N T?-?-BgBg?<Bg/9NO/f nHnHnHn?N O0.|g`0.|gZ n@l*2<0.HPH0.Al n` n`(2<0.HPH0.Al n` n0@A00Fm*0@A00f0@ABp?.0@A/0/./.NO0@A p0( 2AA p1@0@A p0(2AA p1@0@ARp0@A00@2AAHа @ PH|!f 0@ABp/ <`H?.?./. ?<BNO -@Jm .`?<?.B?<BNO -@Jl .3> <`?<?.B?<BNO -@ nf .Ю -@ `& nf .Ю -@ `0.g <` . oH?.NnT|J@f .3> <``` Hn . /?.?<@NO Bg?./. ?<BNO J]|=@g3> <`` . NqN^NuNVH .<".ҼS/"</N L"X/./N . /NX*@f <`(M)G P/NNX 9L0N^NuNVH .<".PS/"</N L"Xށ 9(@JfA (@##B*T -e* -f(`  -+G# P`( f/NX*@Jf <`(M*U`L0N^NuNV0./NzXN^NuNVH .f`v .Q*@(y` m n l`(T o l "-Ёf T (ѭ T*`* ",Ёf -Ѭ(`(#L0N^NuNVBn`<0.@A00f&0.@A10.@A1 ` Rn nmN^NuNVBn`*0.@A00nf0.@ABpRn nmN^NuNVH>.=|\A"HPgXHf0(LN^NuNVHHy/.NPfBG`Hy/.NPf><`Hy/.NPf><`0. |gR0. |?/.?<=NP>J@m 0. |g&JGm??<>NXBg/.?<`j0. |gD0. |?/.?<=NP>J@m"??<>NXBg/.?<`0. |?/.?<=NP>JGl 3>0<`?. ?NX0LN^NuNVA X//.HyNO N^NuNV/.?<HN\-@ .f-|3> .N^NuNV0./NXN^NuNV .##3/./. HyNO yB .N^NuNVA X//. /.NbO N^NuNV . @"n rJWfSWfN^NuLB@ggSBAgHJ@gHANu op`R@SJWfFNuNV nam nzn0.|a|A``0.NqN^NuNVH*n (MBn ng?.NnT| fA&H. nU|`H| f S @  . nU| A|l0fD AH-@Hn/.?.?<@NO <Hg 3>0<`dA&H0f~ =@`J/ 0./?.?<@NO -@2.¼g .3>0<` .n0.L8N^NuNV?<N T0<N^NuNVAv#ЄA#ЈA#ЌA#АA̘#ДA#ИAЄ#?< N T3J09JN^NuNV#̘?<N TN^NuNV33 ?<N TN^NuNV3# ̘?<4N TN^NuNV#̘?<6N T n 0 n0 n0 n009N^NuNV33 3 333333 nf 3333?<3N TN^NuNV n0 n 0 n0 n0N^NuNV#̘3 ?<2N TN^NuNV#̘# ̜?<ZN T n009N^NuNV?<MN T n0 n 0 n0 n009N^NuNV3# ̘?<NN TN^NuNV#̘3 ?<N TN^NuNV#̘3 #̜?<"N TN^NuNV#̘3 3?<!N TN^NuNV#̘3 33333?<*N TN^NuNV#̘3 ?<,N T n0 n009N^NuNV33 3~?<pN TBy~ n 09N^NuNV#̘3 ?<rN TN^NuNV33 ?<hN T n 0 n0 n0 n009N^NuNV3?<kN TN^NuNV3v0.| A0HЈ-@=|` nR2.AAvH1Rn nm/9NX09N^NuNV3eByBy3N |N^NuNV3 3  BnNq nR2.RnHA|1f33Sn0.33N |N^NuNV3{ByBy3N |N^NuNV#H#P .мZ#T3dBy3  n 3N |09 n 03A#HAP#PA#TA#LN^NuNV3 3zBy33N |N^NuNV .3 .3N^NuNV .3 .3N^NuNV0969Ƽ n N^NuA8Xy8 !JHy#DHyD" <sNBYy8A8"P$hNuNV3|ByBy3N | n 0P n0 n0N^NuNV3 3By33N |09PN^NuNVH$.f BB`&". Bvd d``bd-@-A LN^NuNVHL&gHC H@J@g@HCBCւ-C LN^.JNuNV?.?<LNXN^NuNVH*n ..(U0.`(<< `><<`6<<BE`,<<:< ` `|Xg|dgΰ|ogа|ug°|xg Jl ndf - D.` 0. fμA м&@B#(/8H/N LX(0 D m2<7E`2<0A /0H/N L X.f/ / NP*L8N^NuNVH>. *n (U=| Gf><#|#HyHy|NP]|=@0R@?HnHnHnNO0.g-.H|0f.f0` nff<.GRF0no<.JFl0<`0?HnHnHnNOA&HA&H`SFSn0gJnl`0SnJnl0g.` 0RnSG0g nm`JFoH`0<0SFSG0J@l`J0g.A R&@`SG0J@lE-L0.H/HnBg?<dN O (n*L8N^NuNVHBG n*P`0 HC|0>HA0H|f n 0L N^NuNVH<*n(n &nBn`P?<%/ N\$@Jg2. g$/ ??</ NO <n0Gg` R(@`*/ NX>/ ??</ NO <n`Bn=|Bn8< H|-f=|RH|0f8<0RH|*f R=ST`-LHnNvX=@(nH|.f>RH|0f8<0RH|*f R=ST`-LHnNvX=@(nH|lf=|Rf`$A $@-@H=@`$SX/ NX:no:.8< `0.g `0H/Hn?.?.N O 0.g0<`0<*. ng=n` nRT:<`#|#/9/9|Hn?.?.N OP*.`f0. nR:<`P`N|Xg<|cg|dg.|eg|fg|gg|og|sg|ug|xgN0.gj/ ??</ NO <n0Eg`>.E`4Sm0-J@m0 URH|` / ?N\ @f` RnSG0J@l`f>.E`4Sm0-J@m0 URH|` / ?N\ @f` RnSG0J@l/ ??</ NO <n0Eg`f0.LNX=@g3>0<``0<NqN^NuNVH*n 0- |g0- |fm 0- |fm@ Bm0- |@g0<` -f / N'&X0- |g UR m `<0- |g2m UR . H| g ml . H|`V/ NXg m@ 0<`>0- |gBm. H|`$`"0-S@;@m . URH|NqL N^NuNVH *n(n`":,A>. Eo>`>. 0g60n ?// N(O 0H0Hє0,g0lGl JEf/ NXg0<`":,A0. Emv=n 0g<. 2. HHAA`<. 0n `G0H0g?/ ?, NZP>J@n Gf&l@ ?<0.FH/?, NP0<` 0. f0<L0N^NuNVH*n>. <.(n0, |g0, |fl 0, |f0<` ,f/ N'&X(9lBE`RE0HSF0J@m/ ?/ NO g0, |ff gX0, |g/ NXgl@ `:&l`R g H| f gH| f/ NXgl@ Bl0L8N^Nu o/ f pJWf`g fS `pNuLrWf SNuA8Xy8 !J"/0<NBYy8A8"P$hNu NV0.f#l|#p`$ nl# |#` n4o#,|#0`A| -@ n]|=@g 0.D@=@0.|=@0.g0 .2.HЁQ @#|#-y|-y0.@=@0.|=@0.gn .2.HЁм0 @#|#-y|-y0.gHnHnN$ P` #|#-y|-y0.@=@0.|=@0.gt .2.HЁмh @#|#-y|-y0.f0.gHnHnN$ P` #|#-y|-y0.gH#l|#p-y|-yHnHnN%dP#|#`#|#N^NuNVH *n(n Bn-L-U-mBEK.g>OG|JGn|m`NB0T@|dm0<d@D@`B0D@S@|dm0<d@?NTOHy|/ N$ PO`&0-H@$-JGg FGQ0<0dR@0.BAQ/,>QQԟ׆G|0QB`Rn0.g(nB`0R 2.HmB`d .6.HЃR(@ nH|0fRZ$` R$H|9n nH|0f(n R*@NqfSE .6.HЃ @B n0L0N^Nu#|Hy|NXONuHy|NpXO 9|Nu#|Hy|NXONuHy|NvXO 9|Nu#8Hy8NXONuHy8NpXO"98Nu#8Hy8NXONuHy8NvXO"98Nu#HyNXONuHyNpXO$9Nu#HyNXONuHyNvXO$9NuNVH n "(fJg"¼м@ LN^NuNVH nB fB`м8 LN^NuNVH n g jDh <r`V$<H@J@fBH@ @bQB @bYB @?bUBJ@kSB&<"F€JHBЂJj LN^NuNVH n "($HBJ&<BnDB Bcp`*` B c <`6<BtjABJjD LN^NuHHyl//NPOL/WXONuHHyl//NPOL/WXONuH o# HylHy NNNvPO o  L/WXONuH o# HylHy NNNvPO o  L/WXONuH////N"LPLNuH////N"PLNuH////N"PLNuH////N%dPLNuH////N$ PLNuH o#HyN//N"PLNuH o#HyN//N"PLNuH o#HyN//N%dPLNuH o#HyN//N$ PLNuH o#HyN//N"PLNuH o#HyN//N"PLNuH o#HyN//N%dPLNuH o#HyN//N$ PLNuH o0H#HyN//N"PLNuH o0H#HyN//N"PLNuH o0H#HyN//N%dPLNuH o0H#HyN//N$ PLNuNV n " n $&JjFFJjFFN^NuNVH~ n $& n "(JfJf`n*(fJf "`ZNVH.<`b fcBCD!E xzH@:HB<M8NF E6cH@`~GG~GGH@HBҁрSEg:jփՂ`2 E c&tE Ec 6HCBBHBE|.F΂Ć꫆Jk*RA҃тgRD Dcpr``xg`fSDJf"Jf`hHAJAf HA rD `0BADH@~GcH@`0z`XEJ@gREGcH@Ejpr` |.F΁†SDLHDЄJj LN^NuNVH n $& n "((fJg*fJg H@:HB<MNE1F,<.*FHÁ…HC΃ƅąxHB<:HC>܇ۄHAHB>܇ۄH@HC>܇ۄ>ڇلHDHEHF8:|HB>ڇن>؇HC>ڇنH@HB>ڇن~>(JkڅلSG <"FHD„v 歊ȀۆنGk Gc xz`xz`SGOHG؇Jj LN^NuNVH n $& n "(*fJgx(fJgt H@8HB:LME,<.*FHÁ…HC΃ƅąb fbRD1DHBHC.h~>ЇHG~` B@H@:|FH@HAHF<0BAHBHC8:ǒxjSG҃тd6BBHBHC,h ,ІHF|` B@H@:ƒ*HEHE8BEjSF҃BdHG>H@HA0,h ,ІHF|` B@H@6HC:2HAH@xDjSF҃dhrHF<x8(z <"FHG‡v 殌΀݅߅Dk Dc ~|`~|`SDLHDބJj LN^NuNVH*n Af0?<N(Tf"m m ;yAh `, Af BgN(Tfm m ;y`X0- |g AA(HЈ*+@`.0-?N2T*+@fm `0- |fm -gL N^NuNV n"n 2.HbL0|f |f`( |g `Q`fA`2Q`XA`"Q`J0|f |f`$ |g ` Q`A`3 Q` A`# QN^NuNVBBg?.Hn?<WNO =@JW|N^NuX4MERII2.RSC+!/? @ <28?|4|* |-!"#|.$%&|=KLMerai3NOPerai?QRSerai@TUVerai?WXYerai<Z[\erai=]^_erai5`aberai=cdeerai;fgherai?ijkerai<lmneraipqrerai3stuerai<vwxeraiyz{erai|}~erai(erai;erai>erai>erai?erai/erai@erai@erai>eraiBeraierai"eraierai;erai-erai4erai>erai=erai7erai?erai6erai0erai=erai>erai=erai8eraierai8erai7eraierai$erai;erai- B o' B oA B oBeraierai=eraiBeraiAerai)eraierai0erai"erai,  erai#   erai% B o3erai# B o> B oB B o8  B o<!"# B o=$%& B o8'() B o=*+, B o<-./ B o9012 B o7456erai9:;erai>?@,ABCDEF GHIJKLMNOPQRSTUVWXYZ[\]^ _`abcdefghijklmnop qrstuv wxyz{|}~                 I        4 6     ') !"$%& '()2*+,/-./.012-3450678.9:;,<=>2?@A1BCD1EFG2HIJ0KLM0XYZ[\]^_`G1D B BBBBB  B  B  <   < =  < C CPPE ' ( ) *1"P  + , - ./012  3456789:;< = > ? @ "!! A#+3 $B%C&D'E(F)G*H+I"!J F A>?>;< 4  <  :  > ; 'o) G A@': =   = ! > " 5 #A $?%=&A'() )!G *A+:,,-3.=/<06 1 > 2 5 3 / 4< 5=6<77'  H 8A97:6;<#=:> , ? & @ @ AA'4  H BAC<DAE@F(GH / I ! J + K " L $ 7  M2 G NAO=PAQ7R;S<T : U < V > W> X>'37 G  YA7-'8G  ZA<'=1@ [;\]! ^0 _ `  !  ab 0  c de f   -g h i j k$ *' 8lm  nopq r !s "t #u, $ % &'$(), )v'w+x0 ,y0-/ .z/{,|1  %0 HH}~ 0  0& !  0#  1- 1!0 0&C C C#1- !"#   9 5 5555 5 5  5 5'9 5 555 5 5'# 9 555555 5  5  5  5  5 555'N I+O;PBQBRAS>T B U @ V B W B  3&  a!b c  d, Yrcfcd&ddeF<J\lx;;;;{{Ç~x<g2g^g`gbgggggghhhhZh\h^hhhhhhiiiiHiJiLivixiziiiiiijjj j*j>jVjjj|jjjjjjjk kk$k6kDkXkbknkkkkkkkkl ll"l4l@lVljlzllllllm6m8m:mzm|m~mmmmmnn6n8n:nxnzn|nnnnnoo<o>o@oXoZo\odooooooooopppp<p>p@p|p~ppppqqqqDqFqHqxqzq|qqqrrrrBrDrFrrrrrrrrrrrrrrrs4s6s8sfshsjsssssst"t$t&t^t`tbttttttuuuuRuTuVuuuuuuvvvv8vLvNvPvvvvvvvvvw w wwJwLwNw|w~wwwwwwwx4x6x8x<xVxXxZxxxxxxy$y&y(yRyTyVytyvyxyyyyyyyzzz&z(z*zPzRzTzXzzzzzzzzz{<{>{@{x{z{|{{{{{{|6|8|:|x|z||||||||}2}4}6}:}V}X}Z}}}}}}}}}~~~~~"~$~&~6~8~:~B~D~F~L~N~P~T~V~X~\~^~`~f~h~j~p~r~t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  <>@RTVhjlz|~"$&<>@VXZlnp @BDZ\^tvx  *,.LNPdfh~.02BDFz|~,.0Z\^prt246dfh,.0bdf8:<lnp PX246Xz;;;;{{Ç~x<;;;;{{Ç~x<;;;;{{Ç~x<;;;;{{Ç~x<;;;;{{Ç~x<?c>08`x?<xspx <x ???>?| ST XFORMER II - 07/29/88 - version . (C) 1988 Darek Mihocka. All rights reserved.This program was developed with the support of the members andstaff of the Atari Forums on Compuserve; the oldest and largestindependent support network for the Atari computer and homeof the most prominent Atari users and developers.Download Atari files from the ATARI8 SIG on Compuserve.Online help and shareware permissions are under the Help menu.Atari OS and BASIC, (C) 1978,1979 Atari CorporationAtari DOS (C) 1980,1984 Atari Corporation All rights reserved. Used with permission.Disk Communicator 3.2 (C) 1988 by Robert PuffFastchip FP (C) 1981 Charles Marslett. Used with permission.  Xformer II ST Xformer 2.10 Help ST Xformer II ----------------- Desk Accessory Desk Accessory Desk Accessory Desk Accessory Desk Accessory Desk Accessory << Mode: >> Generic Apple ][ Atari 800/XE C-64 (N/A)------------------ Reboot Continue------------------ Save pic ...------------------ 6502 Monitor------------------ Quit AC/DC #1 Metal Rules Shareware Getting started Keyboard Monitor Atari 800/XL/XE Apple ][-------------------- Scratch 'n Sniff Commodore 64 This program is being distributed as shareware Copies of this program may be distributed on BBSs, informationservices, user group monthly disks, and magazine monthly disks.The program must remain unmodified and no additional fee aboveand beyond the cost of a floppy disk or download fee may becharged. Sysops must make it available to low access levels.This program is made available as shareware so that: - current and potential ST owners can sample it for free - and, it is available for much less than store pricesUsers who find this program useful are asked to send a nominalregistration fee of $20. This entitles them to the completeST Xformer II package.more... This program is being distributed as shareware To become a registered user, send a money order for $20 to: Darek Mihocka 310-D Bluevale St. N. Waterloo, Ontario, Canada N2J 4G3Registered users will be sent a disk containing the latestversion of this program (I will continue to add features, fixbugs, and implement user suggestions), a laser printed manualwith lots of documentation, utilities for use with Xformer II,and public domain 8 bit programs to play with.It's up to you the user to make shareware work. I've spent overtwo years developing this software and have chosen shareware asbeing the easiest and best way for users to get this program.My motivation to update and improve this program will be based onyour co-operation.I will register!More info: (519)-747-0386 (voice) Getting Started All selections are made under the "Xformer II" menu entry.First, select which machine you want to run: Generic - 6502 only emulation (not too useful) Apple - selects Apple ][ hardware emulation (no cards) Atari - selects Atari 8 bit (400/800/XL/XE) emulation C64 - selects Commodore 64 hardware emulationAfter selecting a machine, use the config box to adjust thingslike memory size, model type (eg. 400 or 800XL), etc.The "Reboot" option then powers up the machine."Continue" resumes a suspended program (see "Help Keyboard")"Save Pic" creates a Degas picture file (.PI1 or .PI3) of thecurrent emulated screen. Great for screen shots of software."6502 Monitor" enters the debugger (see "Help Monitor") Wish I read the User's Manual! Keyboard Layout The following keys are in one or more of the emulators: F5 - suspend emulation and return to menu bar F10 - RESET keys Undo - Break or RUN STOP keyIn addition, the Atari emulator uses F7, F8, and F9 as theDrkSTART, SELECT, and OPTION keys respectively.rmwOther keys should be self-explanatory.mesNote: due to differences in the various keyboards, key locations agmight not always match up. e.g. the number keys on the Atari 800.OKf 6502 Monitor Commands srThe format of all monitor commands is c [aaaa [bbbb [cccc]]]Go where c is a one letter command and aaaa, bbbb, cccc are optional eparameters. They are hex digits and must be in the range 0-FFFF. D [aaaa] - disassemble memory G [aaaa] - executehp M [aaaa [bbbb]]- hex and ASCII memory dump o S [aaaa] - single stepCa T [aaaa] - trace 20 instructions X - exit monitormr2 . - dump registersmrIOKNote: interrupts are cleared during step and tracey Atari 400/800/800XL/130XE Help ekUse the config box to configure the Atari machine. The dialogpebox that pops up allows you select model (400, 800, 800XL, 130XE) and memory size (16K up to 128K, depends on the model).--Selecting 64K emulates an 800XL, and 128K emulates a 130XE.# Next, select whether you want BASIC to be plugged in or not.ioYou can load the 2 virtual disk drives (D1: and D2:) byacby clicking on "Insert..." and selecting a disk file (*.SD).e sDisk I/O is cached (RAMdisk like) and must be "Eject..."ed.nBWP allows you to write protect a drive during emulation. n Fast disk I/O is silent. Density is automatically set.oiiOKa Apple ][ Emulator Help Please refer to your Xformer User's Manual.ah, yes!m Commodore 64 Help p Not yet available.bgrumble, grumblel Atari 400/800/800XL/130XE Configuration hOperating SystemAtari BASIC nFloating Pointonr400/800peXL/XE rINOUT nFAST saNORMbefor otherestRAM:tr 32Ks40Ksr48K i64K(XL)rg128K(XE)lae WPdtDisk namemn D1: Judas Priestnf density: N/A Free: N/A o D2: Iron Maiden!TX density: N/A Free: N/A . Load disk file en Save disk file sae Directories bcDisk I/O Speeddue Insert...oEject... D1: D2: FAST DNORMMhcForces a rebootDBVBI Rate: .12 W3ro OK t Reconfig a XANTH Computers rd 14100 N.E. 20th St.ik Bellevue, WA 98007 (206)-643-9697 rg XANTH BBS (206)-562-0128 et click me!u MVACE srs Miami Valley Atari Computer na Enthusiasts PO Box 24221 tl Huber Heights, OH 45424I, BBS (513)-233-9500 3/12/2400gas What's This, Inc. su 103 Queen St. Southk Kitchener, Ontario, CANADAe (519)-744-6211oig click me!aea Compuserve: 73657,2714 BIX,DELPHI,GENIE: DAREKM Hotline:(519)747-0386t e####spo ST XFORMER II to (C) 1988 by Darek Mihocka or I.B. Computers 1519 SW Marlow Av. Portland, OR 97225oei (503)-297-84258 v IBBS (503)-292-1321 (FNET #4)l UNISPEC ae TRIO ENGINEERING, Inc. "mnP.O. Box 332isSwampscott, MA 01907n o(617)-964-1673UNISPEC is a major enhancement of the paint programSPECTRUM 512 which also provides a flexible link withcrall other ST graphics programs.aiComing this fall from TRIO: ST Control C TRIO - CRICIT for the Atari ST ee Cash Register Inventory Control Programuet103 Queen St. S.ajsKitchener, Ontario N2G 1W1ie CANADAye((519)-744-6211L,e TRIO LASER C otXformer II was written in Laser C (Megamax, Inc.)msThey declined my offer to place an ad, so I'llSvplug it for them. Laser C is the new improvedI)version of their Megamax C compiler. The 32Krsrcode and data size limits are now gone, but not hthe Megamax C bugs. Development of Xformer IIdtground to a halt once as I sorted through ah jumbled mess of code generation bugs that Laser Cwas supposed to have fixed. The inline assemblereub(that Xformer II is mainly written in) is really rcrippled, and the editor crashes once in a while.However, it's still one of the better compilersF around (which doesn't say much about the rest).tv Time to consider MWC 3.0 Professional word processing has come to an Atari near you!WordPerfect is the number one selling word processor in the world, and for a very good reason: the power, versatility, and usabilityare unparalled in the word processing market. With features suchas 115,000 word spelling checker, thesaurus, macros, indexing,ttable of contents, columns, math, foot & endnotes, merge, complete0printer control, and file manipulation, WordPerfect is ready for[your most sophisticated word processing job. Even if it's writingyyour mother a letter to tell her how much you like WordPerfect. WordPerfect Corporation  1555 N Technology Way tm Orem, Utah 84057 The number of features per dollarmakes WordPerfect the best valuepCan you afford to be without it?0in Atari word processing.x66|xx666|!P!P  .0     , @ B F j l n p     * > @   $ L N P R b x z ~ h  . 0 > h j l n  "6(46JH^`f"$&FHJT^hjrt|~ "$,HLNPlnpx4VXd>bdrDtv  6hjx "*XZ\ XZ\^FxzBRKORA?????????ORAASL???PHPORAASL ??????ORAASL???BPL ORA?????????ORAASL???CLCORA ?????????ORAASL???JSRAND??????BITANDROL???PLPANDROL ???BITANDROL???BMI AND?????????ANDROL???SECAND ?????????ANDROL???RTIEORLSR ???JMPEORLSR???PHAEORLSR ???JMPEORLSR???BVC EOR?????????EORLSR???CLIEOR ?????????EORLSR???RTSADC?????????ADCROR???PLAADCROR ???JMP ADCROR???BVS ADC?????????ADCROR???SEIADC ?????????ADCROR??????STA??????STYSTASTX???DEY???TXA???STYSTASTX???BCC STA??????STYSTASTX???TYASTA TXS??????STA??????LDYLDALDX???LDYLDALDX???TAYLDATAX???LDYLDALDX???BCS LDA??????LDYLDALDX???CLVLDA TSX???LDYLDALDX ???CPYCMP??????CPYCMPDEC???INYCMPDEX???CPYCMPDEC???BNE CMP?????????CMPDEC???CLDCMP ?????????CMPDEC???CPXSBC??????CPXSBCINC???INXSBCNOP???CPXSBCINC???BEQ SBC?????????SBCINC???SEDSBC ?????????SBCINC???PC: A: X: Y: SP: P: ffff#$,X,Y($,X)($),Y,X,Y($2f\N7~7777777777777777 #(-27<AFKPUZ_dinsx  #%(*-/2479<77"7&7F7J7N7R7V7Z7^7b7f7j7n7r7v7z``````````````````a aa"a.a:aFaRa^ajavaaaaaaaabbb*b6bBbNbZbfbrb~bbbbbbbbbbbc cc*c6cBcNc^cfcrc~cccccccccddd*d6dBURUVUfUjUnUUUUUUUUUVVVV0VFV\VrVVVVVVW W"W2WBWRWbWrWWWWWWXBXXXYYY(Y8YYYYYYZZZ2ZHZ^ZnZ~ZZZZ[ [[F[l[|[[[[[[\\\$\8\@\D\V\\]:]]^^j^__N__`2`~EDirectory of D%c: Disk drive is empty!! Disk full or not a DOS disk Y%c%c%11.11s %03d Y%c%c%4d free sectors double densityY%c%cPress any key to continue...[0][ Directory full!! ][ OK ][0][ Couldn't open file ][ OK ][0][ File too large!! ][ OK ][0][ Error reading!! ][ OK ][0][ File transferred ][ OK ] $(,hlptx|C64*.STXw"vH`xAP*.STX Generic 6502 Atari 400/800 Atari 800XL/65XE Apple II 48K Commodore 64 -- off -- -- off -- [1][ insufficient memory! ][ bye-bye! ][1][ Please switch to | medium rez. ][ OK ][0][ Use 6502 Monitor | for Generic mode ][ OK ][0][ file not found! ][ See Manual ][0][ error reading file ][ See Manual ]x4mer000.pi1---SNGENHDBL[0][ Load which drive? ][D1:|D2:|Cancel]*.?D*.SD\*.?D\*.SD[0][ Save which drive? ][D1:|D2:|Cancel]*.?D*.SD\*.?D\*.SD -- off -- -- off -- %3.3s Free: %03d%3.3s Free: %03d 0123456789ABCDEFpq l>E 6502 Monitor invalid address.:;BDGHMRSTXbdghmrstx.n~|.r~|.rxxH`4X,@  @@    (((( ((((((( (((    (((( (((0000 00028>@p,ØXɔ0c%U%UfDBFbfFfSTUEFWWfedsc: @f$Jp.Tz8^Bhjl*Pv4Z>d"Hn,Rxz|:`Dj(Nt 246\@f$JpBP & ('  & $$$ $  $  $  $  $ $ $ ('   & ( ' &  ('  P(*, ST-Talk Pro 2.0 Atari ST DeskTop Telecommunications * Full GEM Operation * Easy to learn and easy to use * AutoPilot Script Language * VT-200/VT-102/ANSI/VT-52 * Vidtex and ANSI Graphics * X/Y/F-MODEM batch transfers * Archive and Un-Archive * Disk Utilities built-in * 10-buffer Text Editor * Capture while Editing * Adjustable Word-wrap * Search and Replace * Paragraph Reformating * Time and Cash Clocks * 3-Line Type-ahead window * Activity Logging * AutoDial Database functions * 40 Programable Macro Keys * Unattended AutoAnswer * Built-in Help Menus * 100-page Manual! Only $29.95 or $10 with ST-Talk 1 Quantum Microsystems Inc. PO Box 179, Liverpool, NY 13088 ! DeskCart! Desk Accessory Cartridge with Battery-backed Clock * Adds 14 convenient accessories with over 20 functions! * Calander/Appointment Book * Notebook * Calculator * Card File * Typewriter * Address Book/Dialer * VT-52 Terminal * Keyboard Macros * Ramdisk * Disk Utilities/Formatter * Print Spooler * Control Panel * Screen Dump Driver Plugs into your computers built-in cartridge port & adds 64K of ROM. Battery-operated Clock/Calendar hardware set the system date & time automatically. The perfect companion for your Atari ST! Only $99.95 Quantum Microsystems Inc. PO Box 179, Liverpool, NY 13088 !ProTablet ST Professional Graphics Tablet * Replaces the mouse with a comfortable & accurate digitizing pad and electronic pen. * Works with virtually all CAD and Graphics programs including: DEGAS, EasyDraw, Drafix, CAD3D, DynaCAD and Publishing Partner. * Selectable active area upto 12 by 8 inches. * Includes pen, tablet, cables and Tablet-Driver Desk accessory. * Connects to the serial port. Only $395.00 Quantum Microsystems Inc. PO Box 179, Liverpool, NY 13088 ! QMI Disk Librarian Disk Organizer and Disk Label Maker * Organize your floppy-disk files * Sort and Index upto 9999 disks * Print formatted disk labels * Print File lists with comments * Search Filenames or comments * Printer setup for any printer * Built-in Help Only $29.95! Quantum Microsystems Inc. PO Box 179, Liverpool, NY 13088 ! ST-Talk Professional DeskCart! tr T Protablet ST Ds QMI Disk Librarian n QMI Product Info 315-451-7747 or 315-457-7216 (BBS) (UNDO or F1->F4)  CON:AUX:PRT: (( (( AAAAAABBBBBB @$@Y@@@È@jA.AcAׄCAy7DxCyٝFnH=c)\I1sKP1P=M8O?ZwH02g$uOs<@ Wi??!TD-@ !TD-@$?!TD-?.B9??*   D,"   "  $      (*2 2       ( "           "(      (    @ Fd  j8 (6        "      (Ht*6*@t & ".<&T  ,,H " "  |( 286L&244,  $*X2   ..*N(V$>. :" >  , 6 dJ$  $  :p|  &F*j&&&&&&&&&&&&&6$    *.2  0 6v $d                    $                8*$2 8                "&  f Z     L"  (      (    "           :          "       D >  $  ,         "        &"                                         & ,&  2*  ,d ,      ` T  z H6  , *4 ",4& p0  *""FNd2Fb&&  *    * `< N :,"   , : 2:  0 " 0@D@Td$hžL( *P"  (l@ (X&>&. . 4&f.,*   ."($ &8 (                     &"    ,6$f@D$dHH8PtBF&2l`0b,n,,<\v L< <         v                  hV0&x`|!*RKJ$f(By|O|/9 ?<HNA\OJk.@ `6 - ЭЭй "ҍ¼.A// Bg?<JNA # y/(,HhNP/9/9?9NJNIN@T?<NVNVf#` <й`# <й`#Bg/9?<=NJ|P3/9`/<h?9?<?NJ|O ?9?<>NJ|XBnj` . 2.jHЁ-@f nf(f`| nf(F nf@?< <Юf/HnlNdO @BHnlN XHnl/.0.|A?Hy|Hn|Na&OA|#pBg/9p?<=NJ|P3J@l2/9pHy|HyÊNa&O HyÊ?<Ne\`/9v/<Y8?9?<?NJ|O ?<?9B?<BNJ|O #z 9zм|/ <}/NJ X3Ū?9?<>NJ|X Y7zo2/9pHy|HyÊNa&O HyÊ?<Ne\`?<\/9pN`b\-@ .gR .//9pNanP/9pNXByt`(09tH y0||J@f`Ryt y@tmN yŪd0/9pHy|HyÊNa&O HyÊ?<Ne\`J y@tf2/9pHy}(HyÊNa&O HyÊ?<Ne\`l?9tNTRnj0.jnmVBg/9?<NJ|XNqN^NuNV\#` <й`# <й`#Bnj`| . 2.jHЁ-@f nf(f`V nf(F nf@?< <Юf/HnlNdO @.?< < Юf/HnuNdO @BHnlN XHnl/.0.|A?Hy}^Hn|Na&OA|#pBg/9p?<NJ|XRnj0.jnm|NqN^NuNVBnHy}HyNanP`: nH|f` nRH?NcT2.RnA nH|.g ne nH|.g`D=|R`( nRH?NcT2.RnA ng n eN^NuNV-yv-yz=|`Rn??<./ NX\(@& g l`"?< / N`b\$@& gB/ / NanPL<N^NuNVNe,3 HyHyHyHyNgO3.HyZHyXHyTHyV?<BgNhnOBn`0.Rn@A1 n m33.HyHyHyNiXO BBgNgH\NE/<?<HNJ|\#BJBg BfHy}?<Ne\`~/<?<HNJ|\#FJFg Ff(Hy}?<Ne\/9B?<INJ|\`* 9BмU#h 9FмU#dHyBgBgNhPHy?<BgNhPHyƬ?<BgNhPHy?<BgNhPA  yƬ h yƬ h1| Hy~ HyŚNanPHy~$HyŊNanP?< NJT#?<NJ|T33BgHyd?<GNJ|PHydHyNanPHyŚHyd09|A?Hy~(Hy Na&OHy HyĊNanPA  y h$ AĊ  y h yh yh y0( yh yh3 y3\?</9Ngl\?</9N \NBg/9Ngl\NFP/9B?<INJ|\/9F?<INJ|\?9Ni.TNeBgNVTN^NuNuNVBnHnNeX=n nf`` n gHy~2?< NJ|\`0.`xHy~J?< NJ|\`t?</9N \`^0.=@`$`8N`.NCJ`$=|``|g|gְ|gNl``|g|gN4?<?./9NgP0.gN^NuNVBn`?<?<NJX?<?<NJXJ@f0<3}3}09}g"?</9BHy N1,O 3n`H/9BHyŚN1P3nHyŚHyd09|A?Hy~fHy Na&O09}g"?<=/9FHyĊN1,O 3l`H/9FHyŊN1P3lHyŊHy09|A?Hy~pHyĊNa&OBy,By*?<N*T?<N*THnHnHnHn/9NeO0.2.HA=@0.2.HA=@?9Z?9X?9T?9VBgBgBgBgBgNf.O?.?.?.?.BgBg?.?.?<Nf.O?.?.?.?.?< Bg/9NgO`6Bg/9Nf\=@ ng0 ng( ng ng ng nm6 nl.09}g$?9?<NJ|XHyd?<;NJ|\`d n8g0 n9g( nNJ|X?<\HnN`b\-@?9?<NJ|X .g nB.H|fHy?<;NJ|\`Hn?<;NJ|\/9FHyŊN1P3l?<N*T?<?<BgBg?<?<)/9NgO`Hy?<Ne\`09}gHy?<Ne\`09}fHyX?<Ne\`t09yf,HyHydNaJPfHy?<Ne\`:HyHyd09|A?HyHnNa&OBgHn?<NJ|X?<\HnN`b\-@ .g nB?9?<NJ|X.H|fHy?<;NJ|\`Hn?<;NJ|\/9BHyŚN1P3n?<N*T?<?<BgBg?<?</9NgO`Hy?<Ne\` y0(j|g`l y0(|gZ0.g,Bn` .2<HЁ-@ n(g?< <Ю/HnNaO ?< <Ю/HnNaO B.B.09}gNA м|/NVNXH/ <}/NJ X/HnHnHyHyÊNa&O`B#h` <й`#N ?HnHnHyHHyÊNa&OHyÊ?<Ne\Rn0.nm`(Bn` .2<HЁ-@ n(g?< <Ю/HnNaO ?< <Ю/HnNaO B.B.09}gNA м|/NVNXH/ <}/NJ X/HnHnHy|HyÊNa&O`B#d` <й`#N ?HnHnHyHyÊNa&OHyÊ?<Ne\Rn0.nmN^NuNV?9?<NJ|XHyd?<;NJ|\BgHy?<=NJ|P3 Jy m/9h/<h?9 ?<?NJ|O ?9 ?<>NJ|X#h` <й`# <й`#/9B/9N4P36By,?<N*THyHyHy Na&O ?<?<BgBgBg?</9NgO?<?<BgBg?<?</9NgON^NuNV?9?<NJ|XHy?<;NJ|\BgHy?<=NJ|P3Jy m/9d/<h?9?<?NJ|O ?9?<>NJ|X#d` <й`# <й`#/9F/9N4P34By*?<N*THyHyHyĊNa&O ?<?<BgBgBg?<(/9NgO?<?<BgBg?<?<)/9NgON^NuNVBx@N^NuNV1@N^NuNVHHy?<Ne\ @g`?<BgBg?<?<BHy?<NJ>O:J@gHy0?<Ne\ @g`BgHyp?<O:0gH?<BgBg?<?<B/ ?<NJ>O:?<?<???<B/ ?<NJ>O:/ NEpX???HyN]O HyNWzX?<?<NJXJ@gHy?<Ne\ @g`THyN]XRF FoHy/<?.?<@NJ|O ?<?<?<NJ\RG G'oHyN]XHyNWzX?.?<>NJ|XL N^NuNVH*nBG` RG GmL N^NuNV=|A-HA  n Bn`0.@A 0=@0.A,HЈ2.AA!?.?.?.NG\?.0.A,?00.A,?0?.NFhPRn0.nmtN^NuNVA-H nBN^NuNV n f n f`0.n =@?.?.?.NG\0.A,=p0.A,=p?.?.?.?.NFhP0.A,=p 0. nnf~N^NuNV0. A,-p .=@0. A,00`J g0.A@HЈ2. A,! 0.A@ 0@AHЈ @ 2.A@!0.A@ 0@AHЈ @ 2.A@!0.A@ 0@AHЈ @ 2.A@!` g"0.@A 02. A,! `l g0."AHЈ2. A,! 0."A 0AHЈ @ (2."A!0."A 0AHЈ @ (2."A!0."A 0@AHЈ @ 2."A!` g\0.AtHЈ2. A,! 0.At 0AHЈ @ (2.At!`*`&`"|| c0< @ |"|GN0. n ?0.@A/0NhJ\N^NuNu?BB6BKCq0gd2`4TBAf6C`2A0NuAXy !J!_ NMYyA"P$h/( J@NuAXy !J!_ NNYyA"P$h/( J@NuAXy !J!_ NAYyA"P$h/( J@NuNVN^NuNVN^NuNVH$.f BB`J". BnJlVnDJlRnDvd`Bbd nmDdD-@-A LN^NuNVHBG".l~D$. l GD&gHC H@J@g@HCBCւJGgD-C LN^.JNu#8Hy8NMXONuHy8NMXO 98Nu#8Hy8NLXONuHy8NLXO 98Nu#@Hy@NMXONuHy@NMXO"9@Nu#@Hy@NLXONuHy@NLXO"9@Nu#LHyLNMXONuHyLNMXO$9LNu#LHyLNLXONuHyLNLXO$9LNuNVH n "(fJg"¼м@ LN^NuNVH nB fB`м8 LN^NuNVH n g jDh <r`V$<H@J@fBH@ @bQB @bYB @?bUBJ@kSB&<"F€JHBЂJj LN^NuNVH n "($HBJ&<BnDB Bcp`*` B c <`6<BtjABJjD LN^NuHHyt//NNPOL/WXONuHHyt//NOPOL/WXONuH o#HytHyNLNNNLPO o L/WXONuH o#HytHyNLNONLPO o L/WXONuH////NQtPLNuH////NQPLNuH////NQPLNuH////NTPLNuH////NSHPLNuH o#|Hy|NL//NQPLNuH o#|Hy|NL//NQPLNuH o#|Hy|NL//NTPLNuH o#|Hy|NL//NSHPLNuH o#HyNM//NQPLNuH o#HyNM//NQPLNuH o#HyNM//NTPLNuH o#HyNM//NSHPLNuH o0H#HyNM//NQPLNuH o0H#HyNM//NQPLNuH o0H#HyNM//NTPLNuH o0H#HyNM//NSHPLNuNV n " n $&JjFFJjFFN^NuNVH~ n $& n "(JfJf`n*(fJf "`ZNVH.<`b fcBCD!E xzH@:HB<M8NF E6cH@`~GG~GGH@HBҁрSEg:jփՂ`2 E c&tE Ec 6HCBBHBE|.F΂Ć꫆Jk*RA҃тgRD Dcpr``xg`fSDJf"Jf`hHAJAf HA rD `0BADH@~GcH@`0z`XEJ@gREGcH@Ejpr` |.F΁†SDLHDЄJj LN^NuNVH n $& n "((fJg*fJg H@:HB<MNE1F,<.*FHÁ…HC΃ƅąxHB<:HC>܇ۄHAHB>܇ۄH@HC>܇ۄ>ڇلHDHEHF8:|HB>ڇن>؇HC>ڇنH@HB>ڇن~>(JkڅلSG <"FHD„v 歊ȀۆنGk Gc xz`xz`SGOHG؇Jj LN^NuNVH n $& n "(*fJgx(fJgt H@8HB:LME,<.*FHÁ…HC΃ƅąb fbRD1DHBHC.h~>ЇHG~` B@H@:|FH@HAHF<0BAHBHC8:ǒxjSG҃тd6BBHBHC,h ,ІHF|` B@H@:ƒ*HEHE8BEjSF҃BdHG>H@HA0,h ,ІHF|` B@H@6HC:2HAH@xDjSF҃dhrHF<x8(z <"FHG‡v 殌΀݅߅Dk Dc ~|`~|`SDLHDބJj LN^NuNV?< B/.NbO N^NuNV 9|A䀰|l y|X| 0<`0<N^NuNVH`Y| y| PN 9|AfA*H`0- |g / NWX A"Ҽ@m?.Nk>TL N^NuNVH*n0- |g/ NWzXg0<`20- |g /-NZXBm ?- NqTg0<`0<L N^NuNVH*n0- |f0<`r.0- |gV0- |f0<`R0- |g?<B?- NX8P?/-?- NcP @f m@ 0<`m *Bm0<L N^Nu o/ f pJWf`g fS `pNuNVJnl3 <`H?.?./. ?<BNJ|O -@Jm .`?<?.B?<BNJ|O -@Jl .3 <`?<?.B?<BNJ|O -@ nf .Ю -@ `& nf .Ю -@ `0.g <` . oH?.N\T|J@f .3 <``` Hn . /?.?<@NJ|O Bg?./. ?<BNJ|O J]|=@g3 <`` . NqN^NuNVH .<".ҼS/"</Nj"X/./Nj. /N`X*@f <`(M)G P/NZX 9L0N^NuNVH .<".PS/"</Nj"Xށ 9(@JfA (@##B*T -e* -f(`  -+G# P`( f/NYX*@Jf <`(M*U`L0N^NuNV0./NZXN^NuNVH .f`v .Q*@(y` m n l`(T o l "-Ёf T (ѭ T*`* ",Ёf -Ѭ(`(#L0N^NuNVBn`<0.@A,00f&0.@A,10.@A,1 ` Rn nmN^NuNVBn`*0.@A,00nf0.@A,BpRn nmN^NuNVH>.=|\A,"HPgXHf0(LN^NuNVHHy/.NaJPfBG`Hy/.NaJPf><`Hy/.NaJPf><`0. |gR0. |?/.?<=NJ|P>J@m 0. |g&JGm??<>NJ|XBg/.?<`j0. |gD0. |?/.?<=NJ|P>J@m"??<>NJ|XBg/.?<`0. |?/.?<=NJ|P>JGl 30<`?. ?N[~X0LN^NuNVA X//.HyNn"O N^NuNV n"n 09S@QN^NuNV n"n 09S@202QN^NuNV n"n 09S@" "QN^NuNVH<>9&y$y . ll*n .HЇ(@`*L0H l / / NPJ@o f`4*n .HЇ(@`*L0H l / / NPJ@l f(*n(n `/ / NP0H0H m`-n*n . HЇ(@0H n/./ NPJ@m0H/./ NPJ@n l / / NP``` g / /.NP". HЇ HǐAo*/. HЇ/N^P Hǐ//.N^P`( Hǐ//.N^P/. HЇ/N^PL.#30|`XA]#09@3`LA]#09@3`.A]#3``|g|gN` .2. SAHЁ//.N^PLN^Nu o/ fpJWf ` <gf `SNuNV/.?<HNJ|\-@ .f-|3 .N^NuNV0./N`XN^NuNV .##3/./. HyNn"O yB .N^NuNVA X//. /.N`O N^NuLB@ggSBAgHJ@gHANuL rWfNuL2/ f0NuSAB@gVSBAgHJ@gHANuNVH*n(n >.&MNqSG0J@mf`BSG0J@l L8N^NuNV n R @H=@` n R @H=@ n g n g n g0.N^NuNV=| nxg nXf n f0<`h n0m n9n0.|0=@`2 nam0.|a| =@` nAm0.|A| =@0.n o0<``0.NqN^NuNVBnBHnNaX=@ n-f=| nRH=@`2 ./0.H/NK< 6.HЃ-@ nRH=@?.?.Nb:X=@ @fSJ g n 0.g .D` .NqN^NuNV nam nzn0.|a|A``0.NqN^NuNVH*n (MBn ng?.N\T| fA&H. nU|`H| f S @  . nU| A|l0fD AH-@Hn/.?.?<@NJ|O <Hg 30<`dA&H0f~ =@`J/ 0./?.?<@NJ|O -@2.¼g .30<` .n0.L8N^NuNVH *n(n >.Nq0SGJ@gf Gf ` SNqL0N^NuNV?<NhT0<N^NuNVA8#NA#RA#VAư#ZA~#^A #bAN#H?< NhT3ư09N^NuNV#~?<NhTN^NuNV3# ~?<4NhTN^NuNV#~?<6NhT n 0Ʋ n0ƴ n0ƶ n0Ƹ09ưN^NuNV33 3 333 3"3$3& nf 3333?<3NhTN^NuNV n0 n 0 n0 n0N^NuNV#~3 ?<2NhTN^NuNV?<MNhT n0Ʋ n 0ƴ n0ƶ n0Ƹ09ưN^NuNV3# ~?<NNhTN^NuNV#~3 ?<NhTN^NuNV#~3 3?<!NhTN^NuNV#~3 33333 ?<*NhTN^NuNV33 3@?<pNhTBy@ n 09ưN^NuNV#~3 ?<rNhTN^NuNV33 ?<hNhT n 0Ʋ n0ƴ n0ƶ n0Ƹ09ưN^NuNV380.| AuHЈ-@=|` nR2.AA8H1Rn nm/9HNuFX09ưN^NuNV3eByBy3 Nj`N^NuNV## .мZ#3dBy3  n 3 Nj`09 n 03A8#A#A#AŬ#N^NuNV .3" .3$N^NuNV .3& .3(N^NuNV09&69(Ƽ n N^NuAXy !JHy#Hy" <sNBYyA"P$hNuNVH$.f BB`&". Bvd d``bd-@-A LN^NuNVHL&gHC H@J@g@HCBCւ-C LN^.JNuNV?.?<LNJ|XN^NuNVH*n ..(U0.`(<< `><<`6<<BE`,<<:< ` `|Xg|dgΰ|ogа|ug°|xg Jl ndf - D.` 0. fμA м&@B#(/8H/NjX(0 D m2<7E`2<0A /0H/Nj X.f/ / Nu0P*L8N^NuNVH>. *n (U=| Gf><#8#HA0H|f n 0L N^NuNVH<*n(n &nBn`P?<%/ NX\$@Jg2. g$/ ??</ NtO <n0Gg` R(@`*/ NuX>/ ??</ NtO <n`Bn=|Bn8< H|-f=|RH|0f8<0RH|*f R=ST`-LHnNmX=@(nH|.f>RH|0f8<0RH|*f R=ST`-LHnNmX=@(nH|lf=|Rf`$A $@-@H=@`$SX/ NuX:no:.8< `0.g `0H/Hn?.?.NkVO 0.g0<`0<*. ng=n` nRT:<`#8#.E`4Sm0-J@m0 URH|` / ?Nq\ @f` RnSG0J@l`f>.E`4Sm0-J@m0 URH|` / ?Nq\ @f` RnSG0J@l/ ??</ NtO <n0Eg`f0.LNJ|X=@g30<``0<NqN^NuNVH*n 0- |g0- |fm 0- |fm@ Bm0- |@g0<` -f / NzX0- |g UR m `<0- |g2m UR . H| g ml . H|`V/ NWzXg m@ 0<`>0- |gBm. H|`$`"0-S@;@m . URH|NqL N^NuNVH *n(n`":,A>. Eo>`>. 0g60n ?// N{O 0H0Hє0,g0lGl JEf/ NWzXg0<`":,A0. Emv=n 0g<. 2. HHAA`<. 0n `G0H0g?/ ?, NcP>J@n Gf&l@ ?<0.FH/?, NX8P0<` 0. f0<L0N^NuNVH*n>. <.(n0, |g0, |fl 0, |f0<` ,f/ NzX(9lBE`RE0HSF0J@m/ ?/ NrO g0, |ff gX0, |g/ NWzXgl@ `:&l`R g H| f gH| f/ NWzXgl@ Bl0L8N^Nu op`R@SJWfFNuLrWf SNuAXy !J"/0<NBYyA"P$hNu NV0.f#t8#x<`$ nl#8# <` n4o#48#8<`Ax -@ n]|=@g 0.D@=@0.|=@0.g0 .2.HЁQ @#8#<-y8-y<0.@=@0.|=@0.gn .2.HЁм0 @#8#<-y8-y<0.gHnHnNSHP` #8#<-y8-y<0.@=@0.|=@0.gt .2.HЁмh @#8#<-y8-y<0.f0.gHnHnNSHP` #8#<-y8-y<0.gH#t8#x<-y8-yOG|JGn|m`NB0T@|dm0<d@D@`B0D@S@|dm0<d@?NvTOHy8/ NSHPO`&0-H@$-JGg FGQ0<0dR@0.BAQ/,>QQԟ׆G|0QB`Rn0.g(nB`0R 2.HmB`d .6.HЃR(@ nH|0fRZ$` R$H|9n nH|0f(n R*@NqfSE .6.HЃ @B n0L0N^NuNVH*n Af0?<N|LTf"m m ;yAh `, Af BgN|LTfm m ;y`X0- |g AAHЈ*+@`.0-?NZT*+@fm `0- |fm -gL N^NuNV n"n 2.HbL0|f |f`( |g `Q`fA`2Q`XA`"Q`J0|f |f`$ |g ` Q`A`3 Q` A`# QN^NuNVBBg?.Hn?<WNJ|O =@JW|N^Nu%c:%s\%s[1][ %s | Invalid source filename! ][ Understood][1][ %s | Source file too large! ][ Understood][1][ %s | Not enough space on disk ][ Understood ][1][ %s | No free directory entries ][ Understood ]%c:%s\%s[1][ Error writing GEMDOS file ... | %s ][ Understood] }[1][ Not Enough Memory! ][ I'll make Room! ][1][ Not Enough Memory!!!!!!!! ][ I will Make Room! ]*.**.*%c:%s\%sxmain.c: unknown eventunknown menu entry!!!!!!!!!%c:%s\%s%c:%s\%s\%c:%s\%s\%c:%s\%s%c:%s\%s%c:%s\%s.SD.DD..%c:%s\%s..%c:%s\%s%c:%s\%s%c:%s\%s'(89;<=|*D ` n` n(?@*????Drives ...%c %c: *.*... %s .%s %s %s .%s %s %5ld %s .%s %s %5ld %c:%s\%s[1][ Open An Atari 8 Bit Disk! ][ Understood ][1][ Doesn't move files yet!! ][ Understood ]%c:%s\%s[1][ Open An Atari 8 Bit Disk! ][ Understood ][1][ NOT YET!! ][ Understood ][1][ You must open an | 8 bit disk first! ][ Understood ][1][ You can't copy 8 bit | disk into an 8 bit | disk yet!! ][ Understood ][1][ Cannot diskcopy to | the same directory! ][ Understood ]%c:%s\%s\[1][ Error in copy! ][ Understood ][1][ You must open an | 8 bit disk first! ][ Understood ][1][ You can't copy 8 bit | disk into an 8 bit | disk yet!! ][ Understood ][1][ Cannot diskcopy to | the same directory! ][ Understood ]%c:%s\%s\[1][ Error in copy! ][ Understood ][0][ Name: %s | Bytes: %s | Sec: %ld ][ Understood ][0][ Name: %s | Sec: %s | Free: %d ][ Understood ][0][ Name: %s | Bytes: %s | Sec: %ld ][ Understood ][0][ Name: %s | Sec: %s | Free: %d ][ Understood ]8 Bit: %s8 Bit: %s[1][ Insert 8 bit disk | in drive B: ][ OK | Cancel ][1][ An error occured | reading sector 1 ][ Continue | Cancel ]DISK.DD[1][ Couldn't open | DISK.DD ][ Continue | Cancel ]Y 9track:%02d sector:%02d err:%02d [1][ Abort? ][ NO | YES ] Y 9 FTP.RSC%/!0 !"-#$%# &'(-)*+9:;<=>?@ABCDEFGHIJKLMNOPRQRS"TUVWXYZ[\]^_ `ab cde fgh ijk lmn opq rst uvwxyzR{|}C33 ZZ   P            8 4 4 44 4 4 4    4)CN  E,E-E.E/E0 E1 E2 E3 E4 E5 E6 E7 E8              '&   ( !("( #($  %(&   ( 3) 2*72 +E~,E-E.E/E0E1E2E3E4E 5E 6E 7E )8=! 9":#;$<% =& 7%' "/  (*)* $+(, \\fr "$<>@^`b "024bdftvx  246LNPRTVXZ\fhjtvx&.6>FNV^tvxz|~  Option Xformer FXP 1.00 --------------------123456 Quit ------------------ File copy Sector Copy ST Xformer II File Xfer Program 1.00(C) 1988 Darek MihockaProgram by: Ignac A. KolenkoThis program is for use with the ST Xformer IIand ST Xformer Junior emulators.Please refer to the documentation supplied withST Xformer II version 2.10 for instructions,Done Lookingor call the Xformer Hotline: (519)-747-0386.D:\FOLDER\*.*STRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRING12345678901234567890GO ST Xformer FXP Direction Of Transfer COPY MOVE DELETE RENAME FORMAT DISKCOPYMAKE DIR INFO Disk Operation EXITD:\FOLDER\*.*STRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRINGSTRING12345678901234567890File Window MaskOKCancelEnter New Search Mask: *.*____________xxxxxxxxxxxxx66|xx666| @ Wi??!TD-@ !TD-@$?!TD-?.B9?? CON:AUX:PRT: (( (( AAAAAABBBBBB @$@Y@@@È@jA.AcAׄCAy7DxCyٝFnH=c)\I1sKP1P=M8O?ZwH02g$uOs<*     X               V$     N, 6 &*J" $"&,*6"&((2,\  D,"   "  $ >      v                "  (lh (X&>&. . 4&f.,*   ."($""8  J &:,8 d                &   ,6$f@D$dHH8PtBF&2l`0b,n,,:&A(,*< 1- (>:%A(,.-@2 < A04; -(>:,'6-$+"@!,%'1 AP; A@>D8<,2A,-@0 :2D A H! @` AP! A@RwwApApApApApApA A A 0AAA`A\""************1 - 6***********f168<,--8,"168<,-8<,%p  @ A z##*****3 OR FOUR OF A KIND*****968<,-6-'% -568<,-8<,%8,9 ( -8, @( A & 68<,- @& A ""*********FULL HOUSE********* 6-6-" -8," " A  8,"6- 8,"6- . *68<,-@%$ @. A "68<,- @" A ""**********STRAIGHTS*********B 6-6-'6-+&,$%-.8, 46-8 B A@2 6-%"68%<,-( @2 A  $68%<,- @$ A  **********CHANCE**********$C68<,--+68<,-8<,%8,/ 9 @C A . *********ATARZEE**********8 -8,"AB 68<,- AL68<,-@PV @`NE-%@ $+!@,&+"@,$@&@$+!@,N(8<,j! -(8<,-!(8<,t -(8<,~"Ap'-@ '(ӠΠT:,Ap Ap********GAME OVER********$ 6-6-- 68,-$ 8<,8,A! 6-%!8<,!8,A@ A N-668%,-8,*68%,-8,N67+%,$&<+%,$,.7$&<$, = 6-6.7$&<$,"-/7<,0 3 = A6 6-%"-&(67<,., 6 A 768,-8@<, 68,-167$&<$,.76-  6-6-%A+@+ D:ATARZEE.DAT:-(8,+(7$&<$,/ 4:6-(/+ -(!-/(2 -6.7$&<$,<3 -7<,4 %67<,.-) 3 A`F P* -%(-%*(-8<,ZU2$@0/2AU&$@0=-@ A K2U2d  A`n"+ -"( record scoresx -( 2 --%.(7$&<$,8,2 " -8," " AP-@@P " -%( @`"  A` A?A!-@@"?(@--@P !A*T:,"-$+-@P !A+ Ap[[;A,;@`,;,;@@,9,9,9,9<,;,;A,9,9,pp6.f006.&| | | |(67,. 67@`,. (67,.[+ARAC6-F:A`,%F:Aa,$AV%K%S%[%0 -(CLAYTON WALNUM'S$-0(S --$%*(7@<A,A-AU6@K2O S 6 2-AU6A $+P:',"',"# 22AU&# ,# 22#A 6X@-@!F(©RIGHT (C) 1986 BY ANALOG COMPUTINGT-AX @j+AYAR1A@P?-@"G%K X(>:A%,jAY@4J6 A-0(# OF PLAYERS 6-T )!A^ -h, A@-%((#'S NAME,r!67$&<$&+&B:,,,.! |$-@"$( ONE SECOND...& A& D:ATARZEE.DATA -68,-"367$&<$,.7 A B' --68<,-6# ' T --68<,-)68<,-468<,-8 < B6-H6-N6-T6-Y++6-F:A`,%AV$F:Aa,%;&@d%C%K%Y%A4KARA'A 9A@"KAA$#-" A6%$ LL72,138,72,169,12,162,0,141,10,212,141,23,208,142,24,208,104,170,104,64-AA-BBA4 -4(&  --( 4 -4(& | |> - (->(& 7 -(Ones----------`#-7(Twos----------`7 -(Threes--------`#-7(Fours---------`7 -(Fives---------`#-7(Sixes---------`&-@( SUBTOTAL:0E-@!$(3 of a kind----`0-@!E(4 of a kind----`:E-@!$(Full house-----`0-@!E(Small straight-`De-@!$(Large straight-`0-@!E(Chance---------`Q-@!e(ATARZEE-------`N7 -(:-&(:,-7(:X2 --%$$(7$&<$,( 2 A`b(67,. 67A,. (67,.l!! D:ATARZEE.DATv: -68,-$(8,6(7$&<$,:  AD:ATARZEE1.BASV/h/FASTAMONTHDFBLKYDDAYCLNULLMMSTERROMOVBOPC25C6C25CONSOKENUDAYEAMDPSCHOICDCOROFYASCSAVAD  !"#$%&'()*+,-./;@9,;@v,;@,;@,;@,;@ ,;@,;@,;AE,;A,;@,;@1,5 #A0!-@@9%"167,.>:,5 %6.%6-A@N&;@9,;Ab,;A,:-@@9>"J67,.>:,N 絷?6-AU6-@d'6-AV36-B2y?6-Ad= 6._67Ab,._+67@,.16.76.=6.[+AY%AA7AAIA @[AR@c-@@'@@9@@9c(% --(%̠ǠҠ --(% --(%Ǡ砠 0-(%0( $$( $$( | A JANUARY G JULY |$$( | B FEBRUARY H AUGUST |$$( | C MARCH I SEPTEMBER |$$( | D APRIL J OCTOBER |$$( | E MAY K NOVEMBER |$$( | F JUNE L DECEMBER |$$( A($( ŠԠȠ6AY@4A@5@@K:*)@5@/6-&@d/ @)!@@"#A%"6-$7 6--@@(+6-A76-@%#( ENTER YEAR BELOW (#(&q%(USE Π TO INCREASE YEAR((J(USE Ԡ TO DECREASE YEARM(n(PRESS Ԡ TO SELECT YEARq('(( (( |Һ1985|)@( (AY@4<-@@"@ * 6-F:, "@@B+"@6-%@,"@6-&@-"@6- @P. A6-A/!A6-A05-@('-@@2+ 5 @B2-@@((3+(( YOU ENTERED THE FOLLOWING MONTH:+(4(, ((5 (IF THIS IS CORRECT, THEN6(PRESS THE START KEY.(7&&(IF IT IS INCORRECT, THEN PRESS8(THE OPTION KEY.9 6-F:, "@@W:#"@ A # @`;.@@$@. @< (}AY'AA9A @KAAN(`@@r@@9AR@ @b=/,($| | | | | | | |/$>/(/($?,,($| |@,,($A,,($|SUN |MON |TUE |WED |THR |FRI |SAT |BX-@@@($J @aT @aX F,,($G#( | | |#( | | |H( I6-+@@&B:,,'@J-@(K/-@@(+-@3@/(L AMAY@4PF:,@@Z A6 A^A6-@%@$%6-@A-@@!@h-@@7@m"@6-o!@ 6-&@r - (s$7<,4-%@$(*v!@ 6-%@w " $x6-%@  $ A@@"%-@"%(( OPTION WINDOW /(/(  AP6-@6-@ 6-F:, "@A "@AO"@6-%@+6-%@7!@C6-@O6-@O"@6-&@+6-&@7 @C6-@O6-@-@#@(2-@#2(7+@$,&@<@$, A 6-6"@#-@@(, 6 @"@A"@A #"@ A# @}@@'-@@B(V-@@ b-@}( 4 -@@!4(*-@@ *(Please enter the*-@@*(date you wish to.-@@"(examine..ARm A1-@@-( ~~~:@LAR@U6-A:,m @)!A1t-@@ t(Z   B-@@*( Ӡ66-@B6-@6.7A$&A,-@@g-@%@ 8(7@ $&@<@ $,< N@@`@@2g(o@(@@K:46-@@6-@F6.\-%@%@ hARo($)@$"AUAU"@'A"A&A`!!!AU* A`A@!!!@'* @2A@!!!A$* A(A@!ASA@)6-%@"@2)6-@!@ 6-@   6-U-%@%@ %"AU1(>:,=6-@K67<,.>:,U A@167<,.>:,"AS167<,.>:@, (>:, A@έנ&&67@ $&@<@ $,.)6-%@!@)6-@&&6.7@ $&@<@ $,%6-@6-AU% APŠ6-&@% @6-@% A@3 (_)67%@<%@,._3 A@ A @&&67@ $&@<@ $,. 467<,.  A767<,.367A$&A<A$,.7 %@%@@(@##67@<@,.>:@,<$6-?:C:,<@:AS,9 A%v67B:,%@,..w6-&Ax67B:,%@,.=:,y<-@@<("DELETING MONTH... z<-@@ <(" {5 A@&@3@2"@5%| A @E( /(ӠE( E(GO TO NEW MONTH/( E(DELETE A MONTH E( /(DISK DIRECTORY E( E(EXIT WINDOW /( E(UU6.KӠϠϠנŠȠˠ٠Ԡנjj6.`APPOINTMENTS GO TO NEW MONTHDELETE A MONTH GG67B:,%@,./DISK DIRECTORY EXIT WINDOW $ŠȠ@ 6.D: 67B:,%@,.QB:, @(67B:,%@,..G67B:,%@,.=:&A,Q A >67@<@,..>67@<@,.=:&A,$ A $@@@##67@<@,.>:@,$$6-?:C:,<@:@,2 6. 67,. %67@,.2(@F 6._67Ab,._+67@,.8(@C@F$RAR@'@@99-@@"R( SELECT=PRINT OUT2-@@#2(OPTION=SAVE START=EXIT 6-F:, "@A B"@$&@' A& @ԠԠ2@ A 2@@P:5-@B:,(7<,4>:@,567<,.  ''(@**********************''(@* APPOINTMENTS *''(@**********************2(@'(@ ,2(@=-@A@ 9(@7<%@,= 2(@2(@**********************@1-@@"1( 2-@@#2(OPERATION COMPLETE. !-@A !' A @ŠӠƠȠ6-&A#A%-@" T #AP-@"# F"@*'@"P:'@,T6-%@$3,6,6,2,4,7,2,5,1,3,6,14,7,7,3,5,1,3,6,2,4,7,25,1,1,4,6,2,4,7,3,5,1,36,3,3,6,1,4,6,2,5,7,3,51,4,4,7,2,5,7,3,6,1,4,62,5,5,1,3,6,1,4,7,2,5,73,6,6,2,4,7,2,5,1,3,6,14,1,1,4,6,2,4,7,3,5,1,36,2,2,5,7,3,5,1,4,6,2,47,3,3,6,1,4,6,2,5,7,3,51,4,4,7,2,5,7,3,6,1,4,62,6,6,2,4,7,2,5,1,3,6,14,7,7,3,5,1,3,6,2,4,7,25,1,1,4,6,2,4,7,3,5,1,36,2,2,5,7,3,5,1,4,6,2,4))31,28,31,30,31,30,31,31,30,31,30,31%%6-F:@,%F:@,$AV6-&A$6-?:C:,<<<A ,$6-?:C:,<<<A ,$ˠ٠+@+@@D:*.*--@@-(--@@-( DISK DIRECTORY --@@-(8-@@! A0.@8 A@9-@%@5(7@<@, 9 @/-@%@/($-@%@$( /-@%@/(&-@@#&( PRESS STARTF:,@A5 A  @//7@<@,4 FREE SECTORSA00 AB-A:7@<@,,!@0$'6-&@ $ (}7"(THERE IS NOT A FILE FOR 7(ON THIS DISK!!!(= RE-ENTER DATA!!(Ԡ= CREATE NEW FILE 6-F:,"@$="@'@(@3@= @ A  EE104,104,104,10,10,10,10,170,169,7,157,66,3,104,157,69,3,104,157 GG68,3,104,157,73,3,104,157,72,3,32,86,228,132,212,160,0,132,213,96 SS104,104,133,215,104,133,214,104,133,217,104,133,216,104,133,218,104,170,160,0& MM177,214,145,216,200,208,4,230,215,230,217,202,208,242,198,218,16,238,96ҠŠR+A@p+A @=@@O@@9R(&6-F:A,&"ApA@$(AN ERROR HAS OCCURRED!!($(i"AbO(;THERE IS NOT ENOUGH ROOM ON THE DISK TO CREATE A FILE FOR R(U(X(f( RUNib"AD_(KTHERE IS NO DISK IN DRIVE #1, OR THE DISK HAS A WRITE-PROTECT NOTCH ON IT.b/,(ERROR - >:AU, RUN/YV(4THE FILE FOR THAT MONTH IS NOT ON THIS DISKETTE.>:AU, RUNY'JANUARY,31'FEBRUARY,29'MARCH,31'APRIL,30' MAY,31' JUNE,30' JULY,31'AUGUST,31'SEPTEMBER,30'OCTOBER,31'NOVEMBER,30'DECEMBER,31 D:CALENDARvvvvvvvvvv06101020202800 1 2- #/2 - F0110030 9[...........................................]011 VOORWOORD SteedsmeerATARIST-Computerswordenopbasisscholen geplaatst.Erontstaatdaardooreensteedsgrotere behoefteaaneducatievesoftware.ATARI(Benelux)BVis eenactiefbeleidgaanvoeren,omdeontwikkelingvan commercileeducatievesoftwaretestimuleren. Veeleducatievesoftwareiserindeafgelopentijdvoor ATARI8-bitXL/XE-Computersontwikkeld.Dezevaakzeer bruikbaresoftwarewerktnormaalgesprokenuitsluitend opdeze'kleine'ATARIcomputer. Hetisechtermogelijkomdoormiddelvan'emulatie'op deST-Computersdiverseanderecomputersnatedoen!Zo ishetmogelijkvandeST-ComputereenMacIntoshofeen MS-DOScomputertemaken.Sindskortishetnuk mogelijkomdeATARIXL/XE-ComputersopdeST-Computer natedoen. AlsbijdragevanATARI(Benelux)BVaandeactieve ondersteuningvandeST-Computeralseducatievecomputer voorhetbasisonderwijsbiedenwijhetdooronsaan gepasteprogramma'ST-XFORMER'(V.1.11)aan. Ditprogrammaisoorspronkelijkgepubliceerdinhet AmerikaanseATARItijdschrift'ST-LOG'enmagvrij gekopieerdworden. HANDLEIDING/UITLEGVOORHET'ST-XFORMER'(V.1.11) SAMENSTELLING Voorditprogrammazijndevolgendefile'snodigen behorenopdezediskettetestaan: Folder:n.v.t. File:_ATARI.FNT-Fontfile _ATARI.FP-Extrafile _ATARI.OSB-XLOperatingSystem _BASICB.CTA-XLBasic _FASTCHP.FPX-FastchipOS _NEWELL.OSX-Extrafile _XFORMER.TOS-Emulatorprogramma EMULATOR.DOC-Ditfileals1ST-Worddocument EMULATOR.DOC-DitfilealsASCIItext File:ATARZEE1.BAS-Basicvoorbeeldprogramma CALENDAR.BAS-Basicvoorbeeldprogramma MAZEWARE.OBJ-Machinetaalvoorbeeldprogramma Dezefilesbehoreninndirectoryoffoldertestaan, anderswerktdeemulatorniet.  WERKING MetdezeATARIXL/XEemulatorkunnenzowelbasic programma'salsmachinetaalprogramma'sgebruiktworden. De'ST-XFORMER'heeftzelfseeningebouwde6502 assemblermonitor. LETOP: Deemulatorwerktuitsluitendopeenmonochroomsysteem! DefunctietoetsenvandeXL/XEzijnopdevolgende manierindeemulatoraantespreken:  Alternate=BREAK  F4=Caps  F5=Inversevideo  F7=START  F8=SELECT  F9=OPTION  F10=RESET  Help=HELP NetalsbijdeechteXL/XEcomputerkomtmendoormiddel vanhetintetypencommando"DOS"inhetDOS-menu. Vanuitditmenukande6502monitorwordenaangeroepen, maarookmachinetaalprogramma'swordenopgestart. TIPSENERVARINGEN Afentoelijkthetofdeemulatorblijft"hangen",dit isvrijwelzekerniethetgeval.Sommigehandelingen kostenechterveeltijdomteemuleren.Inde6502 monitorgeldtdatdeemulatornogwerktalsdecursor knippert. Tijdenshetgebruikvande6502monitorkandoormiddel vandeHELP-toetseenlijstjewordenopgevraagdvanalle commando'svandezemonitor.  24november1987,W.F.Kilwinger 9[...........................................]011 W.P.deGraaf VOORWOORD Steeds meer ATARI ST-Computers worden op basisscholen geplaatst. Er ontstaat daardoor een steeds grotere behoefte aan educatieve software. ATARI (Benelux) BV is een actief beleid gaan voeren, om de ontwikkeling van commercile educatieve software te stimuleren. Veel educatieve software is er in de afgelopen tijd voor ATARI 8-bit XL/XE-Computers ontwikkeld. Deze vaak zeer bruikbare software werkt normaal gesproken uitsluitend op deze 'kleine' ATARI computer. Het is echter mogelijk om door middel van 'emulatie' op de ST-Computers diverse andere computers na te doen! Zo is het mogelijk van de ST-Computer een MacIntosh of een MS-DOS computer te maken. Sinds kort is het nu k mogelijk om de ATARI XL/XE-Computers op de ST-Computer na te doen. Als bijdrage van ATARI (Benelux) BV aan de actieve ondersteuning van de ST-Computer als educatieve computer voor het basisonderwijs bieden wij het door ons aan- gepaste programma 'ST-XFORMER' (V.1.11) aan. Dit programma is oorspronkelijk gepubliceerd in het Amerikaanse ATARI tijdschrift 'ST-LOG' en mag vrij gekopieerd worden. HANDLEIDING/UITLEG VOOR HET 'ST-XFORMER' (V.1.11) SAMENSTELLING Voor dit programma zijn de volgende file's nodig en behoren op deze diskette te staan: Folder: n.v.t. File : _ATARI.FNT - Font file _ATARI.FP - Extra file _ATARI.OSB - XL Operating System _BASICB.CTA - XL Basic _FASTCHP.FPX - Fastchip OS _NEWELL.OSX - Extra file _XFORMER.TOS - Emulator programma EMULATOR.DOC - Dit file als 1ST-Word document EMULATOR.DOC - Dit file als ASCII text File : ATARZEE1.BAS - Basic voorbeeld programma CALENDAR.BAS - Basic voorbeeld programma MAZEWARE.OBJ - Machinetaal voorbeeld programma Deze files behoren in n directory of folder te staan, anders werkt de emulator niet. WERKING Met deze ATARI XL/XE emulator kunnen zowel basic programma's als machinetaal programma's gebruikt worden. De 'ST-XFORMER' heeft zelfs een ingebouwde 6502 assembler monitor. LET OP: De emulator werkt uitsluitend op een monochroom systeem! De functietoetsen van de XL/XE zijn op de volgende manier in de emulator aan te spreken: Alternate = BREAK F4 = Caps F5 = Inverse video F7 = START F8 = SELECT F9 = OPTION F10 = RESET Help = HELP Net als bij de echte XL/XE computer komt men door middel van het in te typen commando "DOS" in het DOS-menu. Vanuit dit menu kan de 6502 monitor worden aangeroepen, maar ook machinetaal programma's worden opgestart. TIPS EN ERVARINGEN Af en toe lijkt het of de emulator blijft "hangen", dit is vrijwel zeker niet het geval. Sommige handelingen kosten echter veel tijd om te emuleren. In de 6502 monitor geldt dat de emulator nog werkt als de cursor knippert. Tijdens het gebruik van de 6502 monitor kan door middel van de HELP-toets een lijstje worden opgevraagd van alle commando's van deze monitor. 24 november 1987, W.F. Kilwinger W.P. de Graaf ******************************************************************** Deze diskette is samengesteld door de Stichting ST, Postbus 11129, 2301 RH Leiden. Onze bibliotheek van public domain programma's omvat op dit moment (zomer 1988) al zo'n drie honderd disks. Daarop vindt u programma's op elk gebied, van tekstverwerker en database tot de leukste spelletjes, de fraaiste tekenprogramma's en de handigste utilities. Ook bevat onze bibliotheek een speciale afdeling voor public domain disks met Macintosh software, die te gebruiken zijn onder de ALADIN emulator. Deze MAC-PD serie bevat tot nu toe ongeveer vijfendertig disks. ******************************************************************** U vindt in het twee maandelijks tijdschrift "ST" (Onafhankelijk tijd- schrift van en voor gebruikers van Atari ST computers) een overzicht en een bespreking van de inhoud van de nieuwe public-domain diskettes. Dit tijdschrift bevat tevens een bestelkaart zodat U vlot over de software kunt beschikken. De Stichting ST geeft ook een speciale PD catalogus disk uit. ************** Deze public domain disk is geproduceerd en gedistribueerd door: Stichting ST afd. Software Bakkersteeg 9A 2311 RH LEIDEN ************** Ondanks onze controle komt het af en toe voor dat een diskje niet goed is gecopieerd.Mocht U dit overkomen, aarzel dan niet en stuur de defecte disk aan ons terug. U krijgt dan direct een vervangende disk toegestuurd. ************************************************************************ Teneinde het voor ons mogelijk te maken om productie fouten op te sporen en vervolgens in de toekomst te vermijden, zijn alle disks, geproduceerd door de Stichting ST, voorzien van een groen productie nummer. ************************************************************************ 5(V<( 0XX 0XX ?30<~ffff~~~`f~~f~`ll~ ~`~f~~`~ff~~ ~f~ff~~f~f~6lI,ҶK,ҶK6lI +<^[^UU(~(~~(~~(|6@fu  8n<~<~<<<<~~~<<~ȆX(*4yzyzҍ8ԩ>/Ѝҩo @ԩL1@ԩ021$<=>?ҍҍҍ҅ 􅜩23 N&ƆƇƈS2),ҍҥ)  -L%֨ I -y1 ;)3dLy&L%`.T)I33mz3ɥ#P3z3z3UQz3 m3ɥΎ3 N&L%( \.` N&z3)3)eƉ / /Z3 5慑ꩆ8O8 Z5 ( r5 (Е /䍐 3ۥ (031ԭ. )L%91y888"ڐ 8Ƌ0I8i8L0' )ҍҍҍҭ (L0' )ҍҍҍҦ1i8慹5 / u 0ʼnᦎ /*4$ i < i0ХiƊ٩)Ɗ ƌL%拢ȥ БȩБii慥Ō`)bL\)&!! *)e! *)e!)L-*֨ L-* -L-*L,xIL-*w191w1 &0 91w1M &0 .L-* -L-*)b . &0(ĥ ȩ ̴1iޅ1 /L+Ɇĥ 1L+ąL*0L+ 0^ȵ)ys1ĵyi1ą u iޅ1i h.yq1Đ̊ ̙ҩƙL+) / 0$)ȱ) 6̥ĥL+Ɇ4 1!ą 0 0 0 / 1ئL+ G0)L,)L+ i@i  90 98 Č뵬)0""Č i i<$Č֨ )  iҵ8jI'i֬ . ҵ) 0)L,Lf, I iҵ iҩFV $1 ?02ɛɞ*1I5 G08m1i1)  i1iƏȵ)F $1ȑƏȵ ҵ)L,) A ̵̍) I`<|fl0fF68of;p88pf< 80 0 ~~`0 0```nf>ff~fff~~f<flxxlf`````~cwkccfv~~nf8pp8?ww<~~~<x`x`~<~~<0~0 ~ <~~<<>f>``|ff|<```<>ff>>ff>|``|fff8<<``lxlf8<fkc|ffffff>|f```>`<|~ffff>fff<ck>6f< x~ 0~<~~<~x|nf8x8 ۰9 Hڢ D ۰!H hم٦0hL`.Eh+-X ۰7H ۰H ehe ۥ Iihe+- ې08H*hj ۥiD ܰ  ` Qک0()?(E$8? p .L L٩` p 8逮0iE ܄ 8-+ ܢ8 i H h ܭ0 ii ܠ-`ԅՅ D&uԕةBLܩ0fCb8@?i ZڰS ZڰF ZڰAee2 ei$  iiԥ`8`Ԡ``&&`I))8Դ0 >E0uذLܩ :ܩLܢ8LܥI8ՕLܥE> 8@8e08 ܥ)0 LڥJJJJ0 L bץL D`8` 8i@0 LNۢՕ 8ؐ ٠8ؐ е bL ۤȄ` `80 `H ې.+-h8` ې . ېh`ՠ66666&`ڢ.`)q` D`ʈe` ԕ` 8JJJJ ܵ) . ` 0` .0ʽ` ۥ)`8`E)F)`ԅ ( ۥ) 4 D`ߠߠyʈ``` ݦ - ڰ(ii fڰ  0````ԕ` ڰԅ)8@0&j ٥ԅX ݢ `ک M @ ڥ#ji@0 ڥ ݢ (`8`==W3>Tvb>2b'?h`06?2'A?%C4Vu?f'70P@U??CBH@ ݦ fڢ ݢ ݦ `ڢ (`8`ԅ8@ ) (ۢf ޢ ک r @ݢ ڢl f ݩեIi $ԅ fڥ (`@"wf?P?IWQpIG?9 Wa9cU? 0d? 9`?BXGB?7?()q?D>DIh8E?hyx? )D?@ (1V?wD3331??xS442Ph3=3``nf>ff~<ө<ө2A`B`L7 6(ҩmi:; < =:2i4354 ?6L 6 j u? ,p? j ?0070Lt _B0`?>2i435< 0>A!CE000Ɋ?0`0 1;:2 ҅1L: _`H232435; 1 ҩ;  hh@2 e1i1L; :)h@1890 <ӥL9`0`Hҍ 00) 08 109hh@ Ҡ2e1i1232435ޥ<<Щ82m43m 5`.̍ҩ  0 4ӭ j kL 0x 4ӭ j u  0<L `-2 ` Ҡҍ2ҩ% L1-2 2ҍ ҩ% ҩ(ҢAҬ`ҍ`%Ң`jj)?j)` k `    8 8 }imJJJ 8)i 8}}`|08|`i`Lx%) Ԥ   aXL )0 Ԥ  ̭ҭҩҭ2ҩU2ȑ212i23i3X` _<Ӎө0XL &'x \X`CT eu$F`1F!@WS   Y`S mF! mȱȱ򈈌 ```}~S  Y0 ` ` ɛ`  Y` ޠ`@S@ ``W+N(DS  `Nݩ̍`+>*) 9`? X0$4Ӡ@* \*=L` X0̍ҩҩ` h4ө \**=`?03==`R 0= L?`==` =``0<`=  0 L2@iЩР@ i  `%H$H` `#@R>  Y`UW `P0C@ESK }ATARI COMPUTER - MEMO PADBOOT ERRORE:xDxآ ? w(r s DR'S% X  <ర  9BDE J VL%  ) D )l )ll 0L*HH`lllI Ii`Нԝ`T67  , < L n e k)J` ) ~`S S`    K`@BC  iiA   KЮK l ~ `BiCill DE BH V`KLzR S` ) `J>K } KJ  `l)j@`+)*)*W/Lҩd{j`WiLQjeE( !o)?gjjj)g ! odXeY z udedhei A fW -*)' j ` B  efffQQ W]j8  O Q Y X Q @ p p d0e1p dehdie1 0 LH h`*) R" //L! 2 L4 Gd-FoJ` } L!ɛ 0L! L!TZ****)) GFo L-PI1dPd` ]W I LL` k4TlUm Lɛ cq LP lTmUkk L0 L 0 !LLld  L de !L*JbX| ɀɁ ILɂɃ@ЩɄОɅ L&|@a{ |L ML4`TʆTL\TTͿUU0RSULUUSRL deej cmTVl`cR!UR s UST   L UR 4 c %LcLcL } cH hc }H }hLD λ0TL GdheicH hcTͿ hڠh h L8 {RU Gdhi(feiigT N L QTT8 #ix(  RU G L ` L0+dL0d8dee dL`THUHVH Tfgf &gQg &g &geQfgmgW0f&gL~U0 FVjnLeffg8nfedd^geee_ohVhUhT`}cUVUWݍ S`VW0cQ }& 0Lw 4Tix %} L} VTW${T& }ɛ8 lΝ8ﭝTL8ptpquq`W 'SSWT*( VVU L` Lhh{ L4]^`H)nhJJJ`...` n` nI=`Tix %n8`W****))`eGd'fPhfPdeidhfi(fg` "iy( 0TTix(LRU G'd` XdYe(djedddeejLcTQQ " ci(cQLceUc` cHlTmUk{T USkL9 kcRT kcR USTkhc ` QlRm`cRT cR GS8RdL`-`T`T` L4 THTh{I{`Ў `{WRU`XdYe`"`获T`UaVbyz8`Zv yvIiv8a[wb\xzwIwxIxwxspZTw訥xu wvv~tHuJhjp~LBpevpqqupt TeyT zrewrsexsu'rt$zUUV VUV z / TH hT  L  8~~0LL4 4d //__aaaa ''OOAAAA ((PP@PPP 00``0 @ (ʔFy}~02- m7@ ` @`lj;k+*opui-=vcbxz436521, .nm/reytwq907~8<>fhdgsaLJ:K\^OPUI_|VCBXZ$#&%"![ ]NM?REYTWQ()'@}FHDGSA {   ` }  ɟ IM0+h@%EخȊ z zȩȩ E [ bМ Qک] 򅟅 Ģ ۤ򄨱ɛ$0L Ģ ۩ T Ģ 5ɛȑ @膔7 Ģɛ ĢɛК  ܩ8IȢ z Щ $P) 8孨客 $ L` L`L^ ܩ Щ L` ؐ0 A0Ԅ ĢLĢ 0$ LYU LY8eHeHL H H hhHH`hhLۡLѽʆLۡ 0 ҰşLۡ` `@  LhhHHL `LLL ۥųޢ T#iŰ DD Ģ`8` ۥ 裰% ᢥ0 裐 ې$$ 8`$ (ȩ@҅ҥ򄬥 T M L~8򨢄 zӤ򈦬ʽʈ򈱗  z池$PƬ0 LĢL,A[`8` ۥ ؐ` ĢȢԑ` ۤ"̩ Ģ Ģɛ " ĢL3嫤`毦򤪱%).Q h(ei8`Ū߱08§REŧDATINPUԷCOLO,LISENTEҺLEԎI̦FONEXԷGOTϷGO TϷGOSU·TRAиBYŸCONYCOCLOSŸCLҸDEYDI͸ENĸNEOPELOASAV:STATUCNOTCPOINXI\OVPOKPRINԸRAREARESTORŸRETUR RUθSTOиPOGEԴPUԷGRAPHICVPLOVPOSITIOθDOVDRAWTTSETCOLOܦLOCATRSOUNLPRINԸCSAVŸCLOAĺ*ERROR- STOPPED+,%5&6(xĜ#%&$' !"*) +8,<Dȧ?+:ԧ,+:,+:,Ч#+7,</01 2!3"4E"-".|"-ɻ#ޅEE| +9S,#+;,Û΢|ijڢڢ@ACB=><GOTGOSUTSTETHEΣ<<>ުNOOANĨ<<>STRCHRUSASVALEADATCOPEESIRNFREXLOCLOSQSGABINPADDLSTICPTRISTRI8ee L08ueeeee褢 ƚƜ`8IȄ墅8夕奕墅褢`朱`  6ğȱȄ ~La HH`0 Щ LLL]š Š` ܩ ЩLei``` ELq El `=Īٷw|ԶԶѷש巴!e l. gɨ aL6 Eƨ إ󅕥 gL a" a Ư" L8 > c=Š) 죰 L樤ħ`hh` >L ڪ H # q Ԡ Dکթ@  Ԡ hH qhıȑıȑĦʊȑ` ͫՅԅ hhL^ ` 𵤨 >>< H & h  ` 0` q ˽L½    0 `LP  Lն` LP y gLh 0L[  0 ܩ Щ 0L ׫ԅՅ` ૥# ԅ ͫƳ ( >`(Lض Ȅ` z > ąŅ`őŐ  H h` zLzĦ``Ƶ`Ƣ౐``䉐䈐`)iiТLE`湩 0éL y7 oԩ 0 gՈ y [L` إ󅕥Lg AT LINE ૥H ׫ H ׫heԨh` . ૥ Hҩ ׫hHԝ ׫ H ׫hheԝ` ׫ԅUՅV ૥ԅT` ׫ԅ` ȍ JK )L ׫i)I ػLS: ȢL8)@e`H J*K+h LGHFH`L ׺L` ׺`H +h `@H ׺hH    ?}i}(i L fh`LP   ׺ 8倝偝   󥃅  LHΆ󢻆h ػ `C: КH hKJ LQ L H hHH ڪ } hKhJ  QL )L + L1& $LM 3 NL1 ͫ ԝL՝M ͫ ԝN%б ׫ԦL Q   L1   N Fɀ 7LɈ [L4] LS + C` ͫ`IHEDBLVHH hh L  ``r `YDAER ԅՅ֦󅗄`` > ˽ $ "   򤲈ȱ`   L &L8`$)ԩe (ې`)8@0+̪Յ)e)e ݦ `F ݢϠ `ڢ ڰ @ݢ F I`U9>`D'RFuCU?b9dYdg@W2@?tS)%@)@0)%ԅԢ ޢ ڰ9 @ݰ. ڰ" fڥԅԥ ɠ (`8`0?i (۩ ݢ `ڢ ڢ ݢ (ۢ `ڢl ڥ fƢ ݥ#8@ji@)j ` ۰k F Dڈ ۰ م٦0.0EA ې+-B ۰; e e ې+ 0`.󩰠+- i08eL8J ۤ iԔILيd19 K Qڥ 8~  ȩE oة+8- odȢ8 i m؊ 0~-`CPYRT.1981,MARSLETT*`eׅץeօ&&Bj &&&Ր }܅Ԙ}ܨPiԘi`զԆՠׄ؄ʈ0Ր)Cj>d8ԕIؠ7`ە1IiE0yʈ0niհdڥEԠ``&`I))8iE040 uʈiԐԕեE*`80 ʈL`<68?e ۵ԕڕڅ cԊEEhh*08``LC ݥ8i@ ۵ԕբ 8Lܥم؅٥ׅإօץՅքզJJJJ fܦ) fȥإЄL; `80 ` ې>.+- .,0"8` ېȄ`Ԡ66666`:`Lٔ0ȵߵ޵ݵܵ۰٘ eeߵe޵eݵeܵiۈٔۨ0Lۨuu٥uإuץu֥uՈ` 'Oc?'N?Jf tصJJJJ mص) m0 tة0̀  . 0.``` x݅` x݅ b` " ڰ b fڐ`i`ԝ````ԕ`ߢ ڰ F ٥8ԅLCieȅ ԩf fڥ)?%ߢl ݥ f `ڠ ڠޢ @ -ݩ ; ` (۠ߢl f fڥ b F ߢ e?` | fڠ - `L%@p8f@i 1&@4@ g@Y!3'@"wf } ۢ?1FffffوԠߢ ڠߢr 8ݢ -ݩ C ( " b fڢ ե8 f fڥ b `?PE@i@g5`@04VD?8@0% ?CBH@>DIh8E?hyx? )D?@ (1V?wD3331??xS43=32i435< 0>A!CE000Ɋ?0`0 1;:2 ҅1L: _`H232435; 1 ҩ;  hh@2 e1i1L; :)h@1890 <ӥL9`0`Hҍ 00) 08 109hh@ Ҡ2e1i1232435ޥ<<Щ82m43m 5`. L  0 4ӭ j kL 0x 4ӭ j u  0<L `-2 ` Ҡҍ2ҩ% L1-2 2ҍ ҩ% ҩ(ҢAҬ`ҍ`%Ң`jj)?j)` k `ҭ`,l`H, h)`Lh Dl ,L<,L9hIh8``Lx%) Ԥ   aXL )0 Ԥ ̭ҭҩҭ2ҩU2ȑ212i23i3X` _<Ӎө0XL &'x \X`CT eu$F``1F!@WS   Y`S mF! mȱȱ򈈌 ```}~S  Y0 ` ` ɛ`  Y` ޠ`@S@ ``W+N(DS  `Nݩ̍_+>*) 9`? X0$4Ӡ@* \*=L` X0 Lҩ` h4ө \**=`/?03==`R 0= L?`?==` =`O`0<`=  0 L2@iЩР@ i  `%H$H` `#@R>  Y`UW `P0D@ESK `?Ў `{WRU`BOOT ERRORE:xDxآ ? w(r s DR'S% X  ర  BDE J VL%  D )l )ll >L#-`ll I Ii`Нԝҝ`T67  , < L n e k)J` ) ~`S S`    K`@BC  iiA   KЮK l ~ `BiCill DE BHLV ) `J>K } KJ  `l)j@`dj`+)*)*W {/Lҩ`WULQje%( !o)?g jjj)g ! odXeY z ededhei A fW  -*)' j ` B efff5Q W& ]j8  Q @ Q Y X Q @ pd0e1p dehdie1 0 LH h`*) R" //L! 2 L4 Gd-FoJ` } L!ɛ 0L! L!TZ****)) GFo L-PI1dPd` ]W I LL` k4TlUm Lɛ cq LP lTmUkk L0 L 0 !LLld )  L de !L*JbX| ɀɁ ILɂɃ@ЩɄОɅ L&|@a{ |L ) ML4`TʆTLTTTͿUU0RSULUUSRL deej cmTVl`cR!UR k UST   L UR 4 c %LcLcL } cH hc }H }hLD λ0TL GdheicH hcTͿ hڠh ` L8 {RU Gdhi(feiigT N L QTT8 #ix(  RU G L ` L0+dL0d8dee dL`THUHVH Tfgf &gQg &g &geQfgmgWu0f&gL~U0 FVjnLeffg8nfedd^geee_ohVhUhT`}cUVUW݅ S`VW0cQ }& 0Lw 4Tix %} L} VTW${T& }ɛ8 lΝ8ﭝTL8ptpquq`W 'SSWT*( VVU L` Lhh{ L4]^`H)nhJJJ`...` n` nI=`Tix %n8`W****))`eGd'fPhfPdeidhfi(fg` "iy( 0TTix(LRU G'd` (djedddeejݩcTQQ " ci(cQLceUc` cHlTmUk{T USkL1 kcRT kcR USTkhc ` QlRm`cRT cR GS8RdL`T`T` L4 THTh{I{`KLzRLSXdYe`"`获T`UaVbyz8`Zv yvIiv8a[wb\xzwIwxIxwxspZTw訥xu wvv~tHuJhjp~L"pevpqqupt TeyT zrewrsexsu'rt$zUUV VUV z / TH hT  L 8~~0LpL4 4dd //__aaaa a ''OOAAAA A  ((PP@PPP(( 00`` 0 @ (ʐFy}~02- m7lj;k+*opui-=vcbxz436521, .nm/reytwq907~8<>fhdgsaLJ:K\^OPUI_|VCBXZ$#&%"![ ]NM?REYTWQ()'@}FHDGSA {   ` }  ɟ I M+h@@ ` @`5` bDNN:NSN$TNTNNN&NXNWNLbN&NJN%fN#NT0N$TN$hN^N^N"N^@N\N"N^NZNNZN:N[(N\NHNNN NNNN%NThNNNNNrNhNTNVNO*N&N$TN)N)NjN)NNJN)NNN)NPLN)N4NNN)N)NN"N)N)N)NXNNNN)N)NNtN)N)N2TNN)NN2N)N`N1NN1:N0N0*N)N*N)N)N8NN'NbNNN$N)N&NNTN)NNN)NN(NNNFN)NPNN)NNN(NNN)N)NNNFN)NN N)NZN'NNNN)N2NN)NNtNN)N'NNN)N)N)N)N`bBG`hBG`\> GH<<<<<@ LS zNЂ@< < zN@<< zN*>TJ`*>TJ`f H zTNR zLNBG G(>C`BG`BG` zN*>CTJ`f*>BTJ`V*>BTJ`BU> G: REE?_*:$E zNBG G(>`2BG G`^BG`.BG`R> GH<<<<<L zPN@< < zTJ`*>TJ`*>TJ`g H zNR zNBG G(>C`NBG`RBG` zN*>CTJ` *>BTJ`*>BTJ`> G(:($E(V zdNBG G(>`BG`BG`> GS z2N@< < zN @<< zN*:$E zN*>TJ`*>TJ`\f H zNR zNBG G(>C`RBG`VBG`( zN*>CTJ`$*>BTJ`*>BTJ`> G(:(TRE$E zFNBG G(>` BG`,BG`BG`*BG`LR> G@< < zND@<< zND@<< zND@<< zN*:> G(:$E zN*>TJ`V*>TJ`t*>TJ`g H zPNR zHNBG G(>C` BG G(>C`$BG`BG`BG`> zN*>CTJ`*>CTJ`*>BTJ`*>BTJ`*>BTJ`BG G(>`BG G zNBG G zxNBG G zjNS@< < zVN@< < zBN*>TJ`*>TJ`*>TJ`f H zNR zNBG G(>C`hBG G zNBG G zNBG G zN@< < zN*>CTJ` zN*>BTJ`@< < zjNBG G(>`h@< < zBNBG G@< < z(NBG G@< < zNBG G@< < zN@< < zN@< < zN@< < zN*>TJ`*>TJ`*>TJ`g H z|NR ztNBG G(>C`rBG`BG`lBG` z8N*>CTJ`:@< < zN*>BTJ`^*>BTJ`*>CTJ``BG G(> G`^BG G`BG G`FBG`R@< < zN`$S@< < zxN*>TJ G`F*>TJ G`*>TJ`4f H z4NR z,NBG G(>C G`BG G`BG`C zN*>CTJ G`r*>BTJ G`^*>BTJ``lBG G(>`BG G(>`BG G`8BG`BG`BG`TJ G`*>TJ`*>TJ`>*>TJ`g H zNR zNBG G(>C`BG G(>C`BG`BG`BG`D@C z^N*>CTJ`~*>CTJ`*>BTJ`^*>BTJ`*>BTJ`N^NuNVH>.. ,",μ҇ A|¼Ё",μ҇R A|¼Ё&@LN^NuNVH>.. ,",μ҇ A|¼Ё",μ҇R A|¼ЁR&@LN^NuNVH?<?<@NX?<?0|g|0|g| 0|g|00|g|0|g|0| g| 0|@g|00|g|0A0RF FmBF`80(2At00P2A002AT0RF FmBlĀ`0,ĀRlĀA0 lĀeBlĀ`0,ĀRlĀ lB0,Āf l|/0,g"9|Ā`0,Ā lRlĀ lĀe0,g"9|Ā`0,Ā lRlĀ lĀe9|Ā`0,Ā lRlĀ lĀe9|Ā`0,Ā lRlĀ lĀe9|Ā`0,Ā lRlĀ lĀe l|0 l|19|Ā`0,Ā lRlĀ l Āc l|o l| l| l| l| 9| LN^NuNVA! N "Hz!?<&N6\N!0<9@9@9@N^NuNVN JN"\Hz!?<&N6\N^NuNV@@@AŰ pNHAJ,rgAC" l<B(Mj AM(<ANBOATCĄC E@G6<B@0024Q?g`0.|<",Ҽ A``|Wg` ,м @|``|Dg` LBl<$ GBP:<% GJg2]> GF: E?_ABC><$ G(:$E zNH@ G zNH@ GP|@~H0,g,~,|||Ag9|L zN9lĀ GfH@@gp`H@@g`H0,gP9|`$0,Ā lH|@g 0,Ā lBRlĀ ,6,ĀƼЃ @H|Ag lĀfL zNH@ G?@9@HAɴ)Hɰ0@ fnH?<BgN X9lĀ`$0,Ā lH|@g 0,Ā lBRlĀ ,6,ĀƼЃ @H|Ag lĀfN|BlL`0H0,g lg ?<BgNXNP9|NZL z4NH@ G@9@ z NH@ G@~9GĀH0,Ā```|g|g|g|g`N ,6,ĀƼЃR @P.H|?.H@?,~|?0,Ā|H?NP`p`|g|g|g|g`P ,6,ĀƼЃS @P,~||?,~|@?.H?0,Ā|H?NP```&L z"NH@ GgHNnL zNH@ GgJlgH?N\TL zNJlgH0<l|",Ҽ ALNuJlgLH0,g0<`0<2,g2<`2<A2,g2<`2<A",Ҽ ALNu0,|@9@J@f6H@ @g.H?<?< ?<?<NPBgBgBg?<NPL zNJlg4H?<N-T,||H÷,~|,z|CH",Ҽ ALNuJlg808 @ GNu zNHA~=|?<N-fTJgLBn,~||g,~|??<N-< GC6<(g`B((4< <f<f:< G4<(@(A@jAFDF@((ԱAkFDCk000 @ Ԕ<<j0 B@@ Ԕ<fhDd4hhhh|(<@ԱkFF`FdFDF@((ԱkHFD0 00@ jkx0 B@@ Fe`:<ڵ$E zN:<ٺ$E zN zNN^NuNVH>.<. 2A0@@H ,мTЁ&@` <&&&&&&&&&&(0SFJ@fLN^NuNVH>.<. ,&@:<BF&&&&QLN^NuNVH0&n>. <.:.0,g`NAG>BDDDDC0G$lTYPYYY@YYY0RF|fL N^NuNVH0>. <.:.0,g`v`l nRH|DDD ,2A6HЃHІмT&@AA$HZPZZZ@ZZR0<@@RF0SEJ@fL N^NuNVH&n>. <.:.0,g`???/ N LN^NuNVH0&n>. <.:.0,g`nAG>BDDDDC0G$lTYPQYQ@YQY0QYQ YpQYQ`QRF|fL N^NuNVH0>. <.:.0,g`x`nBD n-H|@DDD ,2A6HЃ2AHЁмT&@0|AA$H J67XP7X7X7X@7X7X7P0RF0SEJ@fL N^NuNVH0>. <.:.0,g``BD n-H|@DDD ,2A6HЃ2AHЁмT&@0|AA$H0|g" J67X7X@7X7X7X 7X7P`` JBSBkBk@BkBkBk BkBk`0| g$ J7XP7X7X7X07X7Xp7X7P`" JBkPBkBkBk0BkBkpBkBkRF0SEJ@fL N^NuNVH0&n>. <.:.0,g`H`:H ,2A6HЃ2AHЁмT$@0|g0<`0<@@@@0|@g0<`0<@@@P@00| g0<`0<@@A@@0|g0<`0<@@@Q@10|g0<`0<@@B@@0|g0<`0<@@@R@20|g0<`0<@@C@@0|g0<`0<@@@S@3RF0SEJ@fL N^NuNVH0&n>. <.:.0,g`` ,2A6HЃ2AHЁмT$@Bg"<gggggggA$%AP%A%A|0SEJ@f`L N^NuNVH0&n>. <.:.0,g`` ,2A6HЃ2AHЁмT$@BABBg2<gBgAgBgAgBgAgB45BP5A5B|0SEJ@flL N^NuNVH&n>. <.:.0,g`$???/ N" ??RG0?/ N LN^NuNVH0&n>. <.:.0,g`F`<H ,2At2HЁ2HЁмT$@0|A4RF0SEJ@fL N^NuNVH0&n>. <.:.0,g`L ,2A6HЃHІмT$@0SEJ@g$AU0@AD0HD@PRQL N^NuNVH&n>. <.:.0,g`???/ N LN^NuNVH0&n>. <.:. ,2A6HЃHІмT$@0SEJ@gQL N^NuNVH0A -H=|BnBE?<BgN^X n0 ,6,ƼЃ&@H| GpgS l@H|O>| DoP0|@gL|" R A|AA=@ R l@ R l@0nf=|0 lɰ?Bg? ,6.ƼЃ/0An PN < lɰ<SF0. lA$Hf|AQ0ng\ ng =D n00A40 n1@0 lɰ0 n1@ nBh n1n n1E2 lɰ2 n0(A1@0 lɰ0n0A4P`R Df?<0RE?NLX`:0@R@??N:X ng ng Bn nBP0@R@@ GAg Em. El0<ȐE??NX n0BlL N^NuNVH>.A &H`n Fgd02+ A:2+AdR8ȼ=D8+n?<0H@?? ,μЇ/0An PN 0< @fLN^NuNVH0A &H`4 Sf `(>+SG0+ lA$H AfB*Q Sf9| L N^NuNVH ,",Ҽ A|¼Ё&@BG`NH0A0F@A0A02A00A0F@2A0RG Gm0,g9|LN^NuNV,||=@0.H=@0<Dn l|2<En l|A=@0<Jn lP|Bn`Rn0. @o`T ,2.Rn¼Ё @H|:fBn ,2.Rn¼Ё @P0.RnAj nl.H| o .H|[mSn0.AjB.H|fFBgHl?<NXBgHl?<=NP=@`6.H|gBgHlj?<=NP=@`BgHlj?< l($R($H|f lR(% l((S((H|f lS()| no .H|f`0.f4|` ,6.ƼЃ/0./0.A??<?N =@ ,6.ƼЃ6.ƼЃS @P nl|`\ nf|`L l((H l($HA@$ l()H l(%HA@% l|( lB()| lnLnzn~N^NuNV,||=@0.H=@0.A??<>N*X0.A0| lnLnzN^NuNVH>.<. :.0HH@>|n |0<GG?0@??<N\0<GG?0@??<N\0<G???<Nn\?<Bg?<N^\H80gX0. | @ f0AbP0A\P`.0AVP0AhP?<0. @??<N\`0AbP0AVP?<??<N\LN^NuNV?<?<?<NM\Gz6?<"NNT @Gd&G!K?<?<?<NM\Nu/ CD"_Nu?<?<?<NM\?<"NNT @!z?<?<?<NM\Nu(zA l"HR(fR(MR(fR(J(Bf:F@@@xJ@zW@@@@@:F@@@y@{3B3BW@@@@@2<0(g@|n@0QACʰ".zNuN^NuNVA |V)P |T=PBlBn`, l f lC =n9|`XRn0.nmN^NuNV lBN^NuNV/ ?<"NT&@G Av C&`nH瀈 zdN(zTA( fBl`@ Af9|`2 fBl`& Bf9|` fBl` Cf9|LNu&_N^NuNV/ ?<"NNT&@G A&&_N^NuNVNbN4?<N&T)@ ,ܐ)@ ,ܐ)@ ,䐼м)@?<NT9@ lgHl4?<Nb\BgNTBgHl^?<=NP=@ @lHlf?<N2\BgNT ,м]//<?.?<?N m ,м] @H|gHl?<N\BgNBT?.?<>NDXBgHl?<=N4P=@ @lHl?<N\BgNT ,м]//<?.?<?N m ,м] @H|gHl?<N@\BgNT?.?<>NXBgHl6?<=NP=@ @lHlNXBgHl?<=NP=@ @mb ,м]//< ?.?<?N m ,м] @H|gHl?<N&\BgNT`9|?.?<>NXBgHl?<=NzP=@ @mb ,м]//< ?.?<?NN m ,м] @H|gHl?<N\BgNT`9|?.?<>NXN9|P?</N >X9@Bg0<`0<N^NuNV?.?<LN XN^NuNV/ A&H`0+ |g/ N*X A"Ҽm?.NT&_N^NuNV/ &n/ NDXJ@g0<`00+ |g /+N XBk ?+ N,TJ@g0<`0<&_N^NuNVH&n0+ |f0<`.0+ |gV0+ |f0<`v0+ |g?<B?+ N @P?/+?+ NP @f0<`@k 0Hѫ`$ k o?<0+D@H/?+ NP'@&Bk0<LN^NuNV/ &n0+ |fk@ 0+ |`g0<`&Bk`R0+ |g AΐA콂A &'@`*0+H/N X&'@ fk `k g-K?<?+ B?<BN  n!@& k f HlN~X0+ |g0<`0+?/?+ NP7@Sk0+ @l kfk `k@ Bk0<` SRH|&_N^NuNV/ &n Bk0+ |fk@ 0+ |@g0<` `R0+ |g AΐA콂A &'@`*0+H/NZX&'@ fk `k g0+ |g SR k `<0+ |g2k SR . H| g kl . H|`T/ N,XJ@g k@ 0<`<0+ |gBk. H|`"` 0+S@7@k . SRH|&_N^NuNV n Sh0( @m. n "R AH|`/. . H?N\N^NuNV fBC`&SCdTC0|g0|gԼdRC`|CHBC0|@HB LN^NuNVNVH n " n $&JjFFJjFFLN^@jNuNVH n"n $0(H@6C|g.0)H@:E|gE|BB0<まef bRAQ$0P`HNVH n$0(H@6C|gd"n .0)H@:E|gD|E(HD*HE20HGHBBB8:BGBBЇӄЂӅJg$0P`B`NVH"n 0<9@hQ`NVH"n Blh n,0(H@8D|fB.0)H@:E|fB2$60Enfl8,:.6$0Jg0Eg|n0@gDԇ0,hQ fBB`HSCdTC0|g0|gԼdRC`|"|CHB|C0|@HB AHABA LN^NuNVH0.|=@n n f n0H-@HnNXA-H`> n(g nf. n-P n(f HnNX` HnN>XA-H/./. 0.AD PNPLN^/W DjNuN^NuNVH nB fB`м8 LN^NuNVH n$fBCB`nD6< f႖|NzN^NuNVH0&n$n Bn-J @)P`)hd-l`-ldBEG>O|g|JGn|m` REHlz/ NRPO`SEHlz/ NPO`&0+H@JGgDG0<0dR@0.BAQ,>QQֆG|0QB`Rn0.g$nB`0R 2.HmB`b .6.HЃR$@ nH|0fRZ"` R"H|9n nH|0f$n R&@fSE .6.HЃ @B n0L N^NuNVH$.f BB`J". BnJlVnDJlRnDvd`Bbd nmDdD-@-A LN^NuNV/BnJlRnDJ lRnD 0. -@0.n0. nngD -n N^.JNuN^NuNV nl <`?.?./. ?<BN -@ m .`?<?.B?<BN -@?<?.B?<BNx -@ nf .Ю -@ `$ nf .Ю -@ `0.g <`b . oHn . /?.?<@N Bg?./. ?<BN ]|9@Bg <` `BlB . N^NuNV/.?<HN\N^NuNV/.?<IN\N^NuNVBn`&0.A0nf0.ABPRn nLmN^NuNV?>.=|0A"HPgXHf0(>N^Nu)I)J )_NM"l$l /,Nu)I)J )_NN"l$l /,Nu)I)J )_NA"l$l /,NuNVH&n Bn0.|dg`>< `.`|ug`>< ``|og`><``|xg`>< l* ndf SR- .D-@`0. f Gf .`& Gf .` ./0H/NlX 2.RnA0 Gf .`( Gf .` ./0H/N X-@ .fp`FSn0.A P m0.A0| |A`0.A0|0 SR0.fLN^NuNVH&n n f=| )n`)ndHl RHl`?<N]|@0. R@?HnHnHnN.g SR-.H|0f.f SR`J nff>.n RG0llo0,l`0> Gl0<`0?HnHnHnNBF`0RFA SRSGSn0g nl` SR0Sn nl0. g SR.` SR0RnSn 0. g nm`" Go0RFAH`0<0 SRSG0. Sn J@f`` SR0. g SR.><`0RGA SR0. Sn J@f SRE?.Hl Z/N: /N^XHѓLN^NuNVBn`"0. n PHC|0=@ nR n PH|0m n PH|9o0.N^NuNVH0&n -n @$PX`R` nRg H|%fH|%f,RBn=|Bn| H|-f=|RH|0f|0R-JHnN$X=@$nH|.fR-JHnNX=@$nH|lf=|RgH-n Gdg Gog Gxg GufB0.g @ ` @0H/Hn?.?NV 0.g0<`0<H` Gcf R @ nRT` Gsf4 @-PX<.` nR nRSF0g nf`J Geg Gfg Ggf, @)P`)hd/,d/,`Hn?.?NP` 0 nR .nl0.g$<.".A` nRSF0f`b .2.SAHЁ-@-@,.` .2SAHЁ @ nSSF0f` nR .o .R-@f nB .L N^NuNV/. HnNhP=@/.HnN8P0.N^NuNVHnHlNPN^NuNVHn /.N&PN^NuNV`/. nRH?N\ nfN^NuNV nf:0,lf0<9@9@`?<NT=@ nf*0,g Sl?<?<NX?<D?<NX` n f00,RlA컶 ?< ?<NX?< ?<NX`v nf ?<NT nf20.2,RlA컶?< ?<NfX?< ?<NXX`*0.2,RlA컶?.?<N4X0<fA컶컲H|f0<`0,RlA컶H`` nf?<NT``0.-K`0SGJ@g f .`L N^NuNVH0&n$K`Rf `L N^NuNV`4 nH| f?< ?<N X nRH??<NX0. Sn J@fN^NuNV` nRH??<NX0. Sn J@fN^NuNV` nRH??<NX0. Sn J@fN^NuNVH0&n $KA ^-H nf?./ N4\=n`L nf?./ N`\=n`. nf?./ Np\=n`-KBn?.NTJ@f`H| f |o@ H-@/./.?.?<@N 9@BHg0<`0,Bn/./<?.?<@N 9@B @g0<`tRnR -@`R ned` 6.ƼЃ$@ H-@/./.?.?<@N( 9@BHg0<`0,BnBlB0.L N^NuC"BRK"ORA"???"???"???"ORA"ASL"???"PHP"ORA"ASL "???"???"ORA"ASL"???"BPL "ORA"???"???"???"ORA"ASL"???"CLC"ORA "???"???"???"ORA"ASL"???"JSR"AND"???"???"BIT"AND"ROL"???"PLP"AND"ROL "???"BIT"AND"ROL"???"BMI "AND"???"???"???"AND"ROL"???"SEC"AND "???"???"???"AND"ROL"???"RTI"EOR"LSR "???"JMP"EOR"LSR"???"PHA"EOR"LSR "???"JMP"EOR"LSR"???"BVC "EOR"???"???"???"EOR"LSR"???"CLI"EOR "???"???"???"EOR"LSR"???"RTS"ADC"???"???"???"ADC"ROR"???"PLA"ADC"ROR "???"JMP "ADC"ROR"???"BVS "ADC"???"???"???"ADC"ROR"???"SEI"ADC "???"???"???"ADC"ROR"???"???"STA"???"???"STY"STA"STX"???"DEY"???"TXA"???"STY"STA"STX"???"BCC "STA"???"???"STY"STA"STX"???"TYA"STA "TXS"???"???"STA"???"???"LDY"LDA"LDX"???"LDY"LDA"LDX"???"TAY"LDA"TAX"???"LDY"LDA"LDX"???"BCS "LDA"???"???"LDY"LDA"LDX"???"CLV"LDA "TSX"???"LDY"LDA"LDX "???"CPY"CMP"???"???"CPY"CMP"DEC"???"INY"CMP"DEX"???"CPY"CMP"DEC"???"BNE "CMP"???"???"???"CMP"DEC"???"CLD"CMP "???"???"???"CMP"DEC"???"CPX"SBC"???"???"CPX"SBC"INC"???"INX"SBC"NOP"???"CPX"SBC"INC"???"BEQ "SBC"???"???"???"SBC"INC"???"SED"SBC "???"???"???"SBC"INC"???CA"A"A"Ah"AJ"A "A"A"A"AN"A""A"A"A"A\"A"A"A"An"AP"A&"A"A"A"AT"A"A"A"A"Ab"A"A"A"At"AV"A,"A"A"A"AZ"A"A"A"A"Ah"A"A"Ar"Az"A\"A2"A"A"A"A`"A$"A"A"A"An"A "A"Ax"A*"Ab"A8"A"A"A"Af"A*"A"A"A"At"A&"A"A~"A0"A"A>"A"A"A"Al"A0"A"A"A"A|"A,"A"A"A6"A"A"A"A"A"Ar"A6"A"A"A"A"A^"A"A"A<"A"A"Ap"A"A"Ax"A<"A"A"A"A"Ad"A@"A"AB"A"A"Av"AL"A"A~"AB"A "A"A"A"Aj"AF"A("AH"A"A"A|"AR"A4"A"AH"A"A"A"A"Ap"AL"A."A "A"A"A"AX"A:"A("A4"A"A"A"Az"A2"A"A"AN"A"A"A"A"A"A"A"A"A"A"A"A8"A"A"AT"A"A"A"A"A"A"A"Ab"A"A"A"A>"A"A"AZ"A "A"A"A"A"A"A"Ah"AD"A"A"AD"A"A"A`"A"A"A"A^"A"A"A"An"AJ"A2"A"AJ"A"A"Af"A"A"A"Ad"A@"A"A"At"AP"A8"A&"AP"A"A"Al"A"A"A"Aj"AF"A."A"Az"AV"A>"A,"A "CA"A"A"Ah"AJ"A "A"A"A"AN"A""A"A"A"A\"A"A"A"An"AP"A&"A"A"A"AT"A"A"A"A"Ab"A"A"A"At"AV"A,"A"A"A"AZ"A"A"A"A"Ah"A"A"Ar"Az"A\"A2"A"A"A"A`"A$"A"A"A"An"A "A"Ax"A*"Ab"A8"A"A"A"Af"A*"A"A"A"At"A&"A"A~"A0"A"A>"A"A"A"Al"A0"A"A"A"A|"A,"A"A"A6"A"A"A"A"A"Ar"A6"A"A"A"A"A"A"A"A<"A"A"Ap"A"A"Ax"A<"A"A"A"A"Ad"A"A"AB"A"A"Av"AL"A"A~"AB"A "A"A"A"Aj"AF"A("AH"A"A"A|"AR"A4"A"AH"A"A"A"A"Ap"AL"A."A "A"A"A"AX"A:"A("A4"A"A"A"Az"A2"A"A"AN"A"A"A"A"A"A"A"A"A"A"A"A8"A"A"AT"A"A"A"A"A"A"A"Ab"A"A"A"A>"A"A"AZ"A "A"A"A"A"A"A"Ah"AD"A"A"AD"A"A"A`"A"A"A"A^"A"A"A"An"AJ"A2"A"A"A"A"Af"A"A"A"Ad"A"A"A"At"A"A8"A&"AP"A"A"Al"A"A"A"Aj"AF"A"A"Az"AV"A"A,"A "9|9|9|9|9|9|9||CT222"232D2U2f2w22 202A2P2S2d2u22 202B2S2T2T2e222202C2T2T2e22222D2U2U2f2222242E2V2f2222&262F2W2g222%2&2F2W2g2g2222&2F2W2g2g222262F2W2g2g22#242E2f2f2w2w2"222C2C2T2e2v2v2 202@2B2S2d2u2v2 202B2R2c2s2t2u2 20222B2S2c2d2u22 222@2C2T2d2uC42222 222222222222Cɴ2222222 2 222 2 2 222222 2 2 2 22222222 2 2 222(2(2(2(222 2 2222(2(2(222(2(2(2(222 2 2222(2(2(CŰAR"AH"A6"AR"A~"AZ"A"AT"A "AR"AR"AR"AR"AR"AB"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"Al"A"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"A"A"A"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"AR"9|ŮCnAv"AX"A:"A"A"A"A"AV"A"A"A""A"A"A "A"A"Ch222Cb222 C\222CV222CR  A )HN|9|9|9|CĄ2222W222222222222W 9|PC"2"2 2"2"2"22"2"2"22"2x9|)l ,z)l 0~)l 4v)l 8n)l XHlN4XHl6N*XHlpN XHlRNXHlN XHlNXHl NXHlDNXHllNXHlNXHlNXHlNXHl4NXHlfNXHlNXHlNXHlNXHl"NXN^NuNV. H??<?<NN\,g$Bg?<NNXJg. H?Bg?<NN\?<?<NNX g$?<?<NNXH| f?<?<NNXN^NuNVH&n` H?NhTfLN^NuNVBl`?<?<NNX-@ .@,H|am,H|zn, ,H| m,,H|_n ,H?NT0,RlA,H|f loHl8NDXSl lf:,H|f. .@,H|GfNt,H|bfN`80,Ұng$,H| g,H| g ,H|f`0<fHlRNXABBlN^NuNV`RlA@H| f 0,аlmN^NuNV`RlA@H|0m$,H|9o ,H|Am ,H|Fo 0,аlmN^NuNVB.B.N`D.|@@,H|0m,H|9n ,H|0` ,H|7.Rl0,аllRA@H|0m ,H|9o,H|Am$,H|Fn.|R.||mb.|N^NuNVBnBnN`@0.@=@,H|0m,H|9n ,H|0` ,H|7nRlA@H|0m ,H|9o,H|Am,H|Fn0.Rn @ex0.N^NuNV`DN" ,6,ĂƼЃ @P.|A-P .=@?,ĂNT?< NT0.|g| g`HlNX``|Rg`fAH|Xf 9|NRl`BlNN0,аlf`?<HlAA/N AA/NX`j`|Hg` 0.@`V`|Vg`JNA HSh0( @mA H R @H|` HlNDXN`?<N6T``0.g?</NX0,Ng@ l( lH(HCg(2< l(| l(|A?NTNH`P..||W||Ag`BEHn/<?,?<?N l`..|A|A..|A|A ,μЇ/02¼R/?,?<?N lHlNX`0,Pg??HlNPHlNX0,NgX l( lH(HCg@2< l(| l(|A?NT< l@ l@N `?,?<>NXNLN^NuNVH0&n$n `f L N^NuNVH. &n <.`0SFJ@f LN^NuNV=| `$0,Ă6.h| lNH?NTYn nlHlNZXN^NuNV0.HH lNH?NT0.H| lNH?NT0.H| lNH?N~T0.| lNH?NdTN^NuNV ,6.ƼЃ @P.|@ lNH?N*T.|| lNH?N TN^NuNV. |@ lNH?NT. || lNH?NTN^NuNV?.SG&&&&&&&&&&&&&&&&&&&&QL N^NuNV?<NT-@Bn`T0<ǐn??<?<N\?<?< 0<Ґn??<NP?< .м//.NT Rn nm?<?< ?<BgNP?<?< ?< ?<NPN^NuNVH0&nfA"&H?</ ?<NNP>?</NT$@`x?<Hn?< NBPA-H nH|.gB nH|/g2 nH|_g"Bn*H|g|*` nR2.RnA nl ng nH|.f=|` n2.RnAR nf *м|/ <}/N X=@0<02.HdA@0<02.H H HAA@0<02.H HAA@0. g"|Hn/<?. ?<@N `B.HnNXHlRNX?<ONT> GlBgHl?<6NP,,/,, /N,/,,/N, м/ </N X=@ nn nl=|0<02.HdA@0<02.H H HAA@0<02.H HAA@HnHl&NP0. g"|Hn/<?. ?<@N `"B.HnNXHlRNXHlRNXL N^Nu_.DIR_.DIR0123456789ABCDEF ST XFORMER v 1.1 DOS MENU A. DIRECTORY B. RUN CART. L. BINARY LOAD M. RUN AT ADDR. P. 6502 MONITOR Q. Quit to Desktop pCommand Summary for the 6502 Monitorq Syntax: ( all numbers are in hex ) ssss - starting address eeee - ending address dddd - destination address nn - an 8 bit value [optional parameters are shown in brackets] : ssss nn [nn [nn [nn ...]]] - change memory starting from ssss B - coldstart the Atari 800 D ssss [eeee] - display memory from ssss [to eeee] G ssss - start emulating at ssss H nn - nn is non-zero for hardcopy I [mask] - dIr of files on the disk L ssss [eeee] - disassemble from ssss [to eeee] M ssss eeee dddd - move memory block from ssss to dddd R[X] file - read binary file [and execute] S [ssss] - single step at [ssss] or pc T [ssss] - trace at [ssss] or pc V - view emulated screen display W ssss eeee file - write binary file from ssss to dddd X - exit to menu  #$ $ $,X $,Y ($,X) ($),Y $ $,X $,Y A $ ($ PC=A= X= Y= S= P= SELECT ITEM OR pRETURNq FOR MENUDIRECTORY MASK: LOAD FILE: RUN AT ADDRESS: 6502 Monitor > () () .binWriting...Write errorWrite error.binFILE NOT FOUNDREAD ERRORNOT BINARY FILEREAD ERRORSEGMENT START: %4x END: %4x READ ERRORREAD ERRORSEGMENT START: %4x END: %4x : *.* FREE SECTORS[0][ Works only | in mono. ][ SORRY! ]_*.OSB[0][ _*.OSB file | missing! ][ Read docs! ][0][ _*.OSB file | invalid! ][ Read docs! ]_*.FNT[0][ _*.FNT file | missing! ][ Read docs! ][0][ _*.OSB file | invalid! ][ Read docs! ]_*.FP[0][ _*.FP file | missing! ][ Read docs! ][0][ _*.OSB file | invalid! ][ Read docs! ]_*.CTA[0][ cart B | invalid! ][ Read docs! ]_*.CTB[0][ cart A | invalid! ][ Read docs! ] ** Documentation in ST LOG magazine, Sep and Oct 87 ** pST XFORMER v1.11M Atari 800 simulator by Darek Mihockaq A somewhat monochrome version. Some modes not supported. ST XFORMER II in early 88 with PM/G support and extra speed! OS and BASIC (c) 1978,1979 by Atari Corp., all rights reserved. Used with permission. Fastchip by Charles Marslett & alternate OS used with permission: (c) Newell Industries, 602 E. HWY 78, Wylie, TX 75098 Designed and programmed by Darek Mihocka. (73657,2714 DAREKM) Additional programming by Ignac A. Kolenko Jr. & Barry Green. Report bugs and improvements to DAREKM on GEnie. Thanks to Carmine Caccioppoli, John Nagy, George and Jim Adamson. Development hardware supplied by: Xanth F/X, 14100 NE 20th #105, Bellevue, WA 98007 pNO CARTRIDGE PRESENT 48K RAMq p8K CARTRIDGE PRESENT 40K RAMq p16K CARTRIDGE PRESENT 32K RAMq Alt=BREAK F4=caps F5=inverse F7..F9=START SELECT OPTION F10=RESET pPress any key to power up the Atari 800 in monochrome...q@$??CON:AUX:PRT:%d  /*************************************************************************** _X6502.C by Darek Mihocka (CIS: 73657,2714 GEnie: DAREKM) 6502 simulation code is in this file June 5, 1987 14:40 ***************************************************************************/ #include #include #include "_xformer.h" /* format of mnemonics: 3 ascii codes of the opcode and the addressing mode: 00 - implied 01 - immediate 02 - zero page 03 - zero page,x 04 - zero page,y 05 - (zero page,x) 06 - (zero page),y 07 - absolute 08 - absolute,x 09 - absolute,y 0A - accumulator 0B - relative 0C - indirect 0D - absolute indirect used by the 6502 monitor for disassembling code I found out too late that Megamax supports long character constants. arghh! */ long mnemonics[256] = { 0x42524B00L, 0x4F524105L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524102L, 0x41534C02L, 0x3F3F3F00L, 0x50485000L, 0x4F524101L, 0x41534C0AL, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524107L, 0x41534C07L, 0x3F3F3F00L, 0x42504C0BL, 0x4F524106L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524103L, 0x41534C03L, 0x3F3F3F00L, 0x434C4300L, 0x4F524109L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524108L, 0x41534C08L, 0x3F3F3F00L, 0x4A535207L, 0x414E4405L, 0x3F3F3F00L, 0x3F3F3F00L, 0x42495402L, 0x414E4402L, 0x524F4C02L, 0x3F3F3F00L, 0x504C5000L, 0x414E4401L, 0x524F4C0AL, 0x3F3F3F00L, 0x42495407L, 0x414E4407L, 0x524F4C07L, 0x3F3F3F00L, 0x424D490BL, 0x414E4406L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4403L, 0x524F4C03L, 0x3F3F3F00L, 0x53454300L, 0x414E4409L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4408L, 0x524F4C08L, 0x3F3F3F00L, 0x52544900L, 0x454F5205L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5202L, 0x4C535202L, 0x3F3F3F00L, 0x50484100L, 0x454F5201L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5207L, 0x4C535207L, 0x3F3F3F00L, 0x4256430BL, 0x454F5206L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5203L, 0x4C535203L, 0x3F3F3F00L, 0x434C4900L, 0x454F5209L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5208L, 0x4C535208L, 0x3F3F3F00L, 0x52545300L, 0x41444305L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444302L, 0x524F5202L, 0x3F3F3F00L, 0x504C4100L, 0x41444301L, 0x524F520AL, 0x3F3F3F00L, 0x4A4D500CL, 0x41444307L, 0x524F5207L, 0x3F3F3F00L, 0x4256530BL, 0x41444306L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444303L, 0x524F5203L, 0x3F3F3F00L, 0x53454900L, 0x41444309L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444308L, 0x524F5208L, 0x3F3F3F00L, 0X3F3F3F00L, 0X53544105L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545902L, 0X53544102L, 0X53545802L, 0X3F3F3F00L, 0X44455900L, 0X3F3F3F00L, 0X54584100L, 0X3F3F3F00L, 0X53545907L, 0X53544107L, 0X53545807L, 0X3F3F3F00L, 0X4243430BL, 0X53544106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545903L, 0X53544103L, 0X53545804L, 0X3F3F3F00L, 0X54594100L, 0X53544109L, 0X54585300L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53544108L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445901L, 0X4C444105L, 0X4C445801L, 0X3F3F3F00L, 0X4C445902L, 0X4C444102L, 0X4C445802L, 0X3F3F3F00L, 0X54415900L, 0X4C444101L, 0X54415800L, 0X3F3F3F00L, 0X4C445907L, 0X4C444107L, 0X4C445807L, 0X3F3F3F00L, 0X4243530BL, 0X4C444106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445903L, 0X4C444103L, 0X4C445804L, 0X3F3F3F00L, 0X434C5600L, 0X4C444109L, 0X54535800L, 0X3F3F3F00L, 0X4C445908L, 0X4C444108L, 0X4C445809L, 0X3F3F3F00L, 0X43505901L, 0X434D5005L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505902L, 0X434d5002L, 0X44454302L, 0X3F3F3F00L, 0X494E5900L, 0X434D5001L, 0X44455800L, 0X3F3F3F00L, 0X43505907L, 0X434D5007L, 0X44454307L, 0X3F3F3F00L, 0X424E450BL, 0X434D5006L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5003L, 0X44454303L, 0X3F3F3F00L, 0X434C4400L, 0X434D5009L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5008L, 0X44454308L, 0X3F3F3F00L, 0X43505801L, 0X53424305L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505802L, 0X53424302L, 0X494E4302L, 0X3F3F3F00L, 0X494E5800L, 0X53424301L, 0X4E4F5000L, 0X3F3F3F00L, 0X43505807L, 0X53424307L, 0X494E4307L, 0X3F3F3F00L, 0X4245510BL, 0X53424306L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424303L, 0X494E4303L, 0X3F3F3F00L, 0X53454400L, 0X53424309L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424308L, 0X494E4308L, 0X3F3F3F00L } ; int (*vec_6502[256])() = { /* create an array of pointers to 256 functions */ op00, op01, op02, op03, op04, op05, op06, op07, op08, op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12, op13, op14, op15, op16, op17, op18, op19, op1A, op1B, op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24, op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D, op2E, op2F, op30, op31, op32, op33, op34, op35, op36, op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F, op40, op41, op42, op43, op44, op45, op46, op47, op48, op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51, op52, op53, op54, op55, op56, op57, op58, op59, op5A, op5B, op5C, op5D, op5E, op5F, op60, op61, op62, op63, op64, op65, op66, op67, op68, op69, op6A, op6B, op6C, op6D, op6E, op6F, op70, op71, op72, op73, op74, op75, op76, op77, op78, op79, op7A, op7B, op7C, op7D, op7E, op7F, op80, op81, op82, op83, op84, op85, op86, op87, op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90, op91, op92, op93, op94, op95, op96, op97, op98, op99, op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF, opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7, opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF, opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7, opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF } ; int (*dec_6502[256])() = { /* an array of pointers assuming D flag is on */ op00, op01, op02, op03, op04, op05, op06, op07, op08, op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12, op13, op14, op15, op16, op17, op18, op19, op1A, op1B, op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24, op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D, op2E, op2F, op30, op31, op32, op33, op34, op35, op36, op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F, op40, op41, op42, op43, op44, op45, op46, op47, op48, op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51, op52, op53, op54, op55, op56, op57, op58, op59, op5A, op5B, op5C, op5D, op5E, op5F, op60, op61dec, op62, op63, op64, op65dec, op66, op67, op68, op69dec, op6A, op6B, op6C, op6Ddec, op6E, op6F, op70, op71dec, op72, op73, op74, op75dec, op76, op77, op78, op79dec, op7A, op7B, op7C, op7Ddec, op7E, op7F, op80, op81, op82, op83, op84, op85, op86, op87, op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90, op91, op92, op93, op94, op95, op96, op97, op98, op99, op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF, opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1dec, opE2, opE3, opE4, opE5dec, opE6, opE7, opE8, opE9dec, opEA, opEB, opEC, opEDdec, opEE, opEF, opF0, opF1dec, opF2, opF3, opF4, opF5dec, opF6, opF7, opF8, opF9dec, opFA, opFB, opFC, opFDdec, opFE, opFF } ; /* No more C code in this file, but we have to declare an entry point */ execute() { asm { movem.l D0-D7/A0-A3,-(SP) ; save enviornment ; clear everything just to be safe clr.l D0 clr.l D1 clr.l D2 clr.l D3 clr.l D4 clr.l D5 clr.l D6 clr.l D7 ; convert P register NV_BDIZC to CCR register BDIXNZVC move.b p(GLOBAL),REGST move.b REGST,DBUS ; BDI move.b REGST,REGA ; N move.b REGST,REGX ; V move.b REGST,REGY ; Z move.b REGST,REGEA ; set X equal to C asl.b #3,DBUS and.b #0xE0,DBUS ; BDI_____ asl.b #4,REGEA and.b #BITX,REGEA ; ___X____ asl.b #1,REGY and.b #BITZ,REGY ; _____Z__ asr.b #4,REGA and.b #BITN,REGA ; ____N___ asr.b #5,REGX and.b #BITV,REGX ; ______V_ move.b REGEA,REGST or.b REGX,REGST or.b REGY,REGST or.b REGA,REGST or.b DBUS,REGST ; that gets BDIXNZVC !!! move.b a(GLOBAL),REGA ; load 6502 registers move.b x(GLOBAL),REGX move.b y(GLOBAL),REGY move.w #0x100,REGSP move.b sp(GLOBAL),REGSP ; stack is on page 1 move.w pc(GLOBAL),REGPC lea emul(PC),REGOPS ; pointer to emulator tst.b fTrace(GLOBAL) beq.s notrace ; if trace bit set... lea exit_emul(PC),REGOPS ; divert to exit routine notrace: lea pemul(PC),REGMEA move.l REGOPS,(REGMEA) lea vec_6502(GLOBAL),REGOPS ; pointer to table btst.b #6,REGST ; check decimal flag beq.s nodec lea dec_6502(GLOBAL),REGOPS ; pointer to table nodec: move.l mem(GLOBAL),REGMEA ; pointer to mem[ea] move.l stat(GLOBAL),REGSTAT move.l REGMEA,REGEA add.l REGMEA,REGPC ; pointer to mem[pc] move.l REGPC,REGMPC ; fall through into dispatch routine emul: clr.w IR ; clear "instruction register" move.b (REGMPC)+,IR ; fetch an opcode add.w IR,IR add.w IR,IR ; multiply by 4 move.l 0(REGOPS,IR.w),REGMEA ; calculate address of opcode handler jmp (REGMEA) ; and jump to it pemul: dc.l 0 ; pointer to emul, exit_emul, or sysvbl exit_emul: move.b REGA,a(GLOBAL) ; save 6502 registers move.b REGX,x(GLOBAL) move.b REGY,y(GLOBAL) move.b REGSP,sp(GLOBAL) move.w REGMPC,pc(GLOBAL) move.w REGMEA,ea(GLOBAL) ; convert CCR register BDIXNZVC to P register NV_BDIZC move.b REGST,DBUS ; BDI move.b REGST,REGA ; N move.b REGST,REGX ; V move.b REGST,REGY ; Z move.b REGST,REGEA ; C asr.b #3,DBUS and.b #0x1C,DBUS ; ___BDI__ asr.b #4,REGEA and.b #CBIT,REGEA ; _______C asr.b #1,REGY and.b #ZBIT,REGY ; ______Z_ asl.b #4,REGA and.b #NBIT,REGA ; N_______ asl.b #5,REGX and.b #VBIT,REGX ; _V______ move.b REGEA,REGST or.b REGX,REGST or.b REGY,REGST or.b REGA,REGST or.b DBUS,REGST ; that gets NV_BDIZC ori.b #0x20,REGST ; and then NV1BDIZC move.b REGST,p(GLOBAL) movem.l (SP)+,D0-D7/A0-A3 ; restore enviornment ; and get outta here! } return ; asm { ; Some common code to save space ; at entry, all common routines MUST have REGEA loaded!! ; this does an ORA with REGA and set the flags in REGST ; first check if the status byte is negative, if so, call emul_serv doORchk: move.b 0(REGSTAT,REGEA.w),IR ; get status byte bpl.s doOR ; if OK to read memory go do so SETREAD ; else set read flag BSR emul_serv ; and call service routine doOR: move.l REGEA,REGMEA ; get the byte or.b (REGMEA),REGA ; ORA with accumualtor move.w SR,DBUS ; get CCR register and.b #(BITN|BITZ),DBUS ; isolate N and Z flags and.b #~(BITN|BITZ),REGST ; clear them out in P register or.b DBUS,REGST ; join them DISPATCH ; and go do another opcode ; similar to doOR except it does an AND doANDchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doAND SETREAD BSR emul_serv doAND: move.l REGEA,REGMEA and.b (REGMEA),REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH doEORchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doEOR SETREAD BSR emul_serv doEOR: move.l REGEA,REGMEA move.b (REGMEA),DBUS ; silly 68000 limitation eor.b DBUS,REGA ; makes you do it in 2 steps move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; increment memory location REGEA doINCchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doINC SETREAD BSR emul_serv doINC: move.l REGEA,REGMEA addq.b #1,(REGMEA) move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; decrement memory location REGEA doDECchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doDEC SETREAD BSR emul_serv doDEC: move.l REGEA,REGMEA subq.b #1,(REGMEA) move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; do a LDA, but first check to see if the status byte is positive doLDAchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doLDA SETREAD bsr emul_serv ; at this point the service routine executed, or the status byte was zero doLDA: move.l REGEA,REGMEA move.b (REGMEA),REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH doLDXchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doLDX SETREAD BSR emul_serv doLDX: move.l REGEA,REGMEA move.b (REGMEA),REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH doLDYchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doLDY SETREAD BSR emul_serv doLDY: move.l REGEA,REGMEA move.b (REGMEA),REGY move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; do a STA, but first check to see if the status byte is non-zero doSTAchk: move.b 0(REGSTAT,REGEA.w),IR beq.s doSTA SETWRITE SWAP DBUS ; save status byte in lo word of D0 move.b REGA,DBUS ; put the byte to store in the hi word SWAP DBUS bra emul_serv ; call emul serv doSTA: move.l REGEA,REGMEA ; most routines will do this themselves move.b REGA,(REGMEA) ; but just in case, do the write to memory DISPATCH ; ditto, but for STX doSTXchk: move.b 0(REGSTAT,REGEA.w),IR beq.s doSTX SETWRITE SWAP DBUS move.b REGX,DBUS SWAP DBUS bra emul_serv doSTX: move.l REGEA,REGMEA move.b REGX,(REGMEA) DISPATCH ; ditto, but for STY doSTYchk: move.b 0(REGSTAT,REGEA.w),IR beq.s doSTY SETWRITE SWAP DBUS move.b REGY,DBUS SWAP DBUS bra emul_serv doSTY: move.l REGEA,REGMEA move.b REGY,(REGMEA) DISPATCH ; do an ADC, similar to above doADCchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doADC SETREAD BSR emul_serv doADC: move.l REGEA,REGMEA move.b (REGMEA),DBUS ori.b #BITZ,REGST ; ADDX doesn't set Z flag move.b REGST,CCR ; also prepare C bit addx.b DBUS,REGA ; binary add move.w SR,DBUS and.b #(BITN|BITZ|BITV|BITX),DBUS and.b #~(BITN|BITZ|BITV|BITX),REGST or.b DBUS,REGST DISPATCH doADCdecchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doADCdec SETREAD BSR emul_serv doADCdec: move.l REGEA,REGMEA move.b (REGMEA),DBUS ori.b #BITZ,REGST move.b REGST,CCR ABCD DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITV|BITX),DBUS and.b #~(BITN|BITZ|BITV|BITX),REGST or.b DBUS,REGST DISPATCH doSBCchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doSBC SETREAD BSR emul_serv doSBC: move.l REGEA,REGMEA move.b (REGMEA),DBUS eori.b #BITX,REGST ; different than 6502 ori.b #BITZ,REGST ; SUBX doesn't set Z flag move.b REGST,CCR subx.b DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX|BITV),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX|BITV),REGST or.b DBUS,REGST DISPATCH doSBCdecchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doSBCdec SETREAD BSR emul_serv doSBCdec: move.l REGEA,REGMEA move.b (REGMEA),DBUS eori.b #BITX,REGST ori.b #BITZ,REGST move.b REGST,CCR SBCD DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX|BITV),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX|BITV),REGST or.b DBUS,REGST DISPATCH ; in CMP, DBUS already has the byte loaded doCMP: SWAP DBUS move.b REGA,DBUS SWAP DBUS SUB.b DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST SWAP DBUS move.b DBUS,REGA SWAP DBUS DISPATCH doCPX: SWAP DBUS move.b REGX,DBUS SWAP DBUS SUB.b DBUS,REGX move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST SWAP DBUS move.b DBUS,REGX SWAP DBUS DISPATCH doCPY: SWAP DBUS move.b REGY,DBUS SWAP DBUS SUB.b DBUS,REGY move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST SWAP DBUS move.b DBUS,REGY SWAP DBUS DISPATCH doROLchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doROL SETREAD BSR emul_serv doROL: move.l REGEA,REGMEA move.b (REGMEA),IR ; get byte move.b REGST,CCR ROXL.b #1,IR ; shift it move.b IR,(REGMEA) ; save in memory move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH doRORchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doROR SETREAD BSR emul_serv doROR: move.l REGEA,REGMEA move.b (REGMEA),IR move.b REGST,CCR ROXR.b #1,IR move.b IR,(REGMEA) move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH doASLchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doASL SETREAD BSR emul_serv doASL: move.l REGEA,REGMEA move.b (REGMEA),IR asl.b #1,IR move.b IR,(REGMEA) move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH doLSRchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doLSR SETREAD BSR emul_serv doLSR: move.l REGEA,REGMEA move.b (REGMEA),IR lsr.b #1,IR move.b IR,(REGMEA) move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH doBITchk: move.b 0(REGSTAT,REGEA.w),IR bpl.s doBIT SETREAD BSR emul_serv doBIT: tst.b (REGMEA) ; V bit not set by a tst move.w SR,DBUS and.b #(BITN),DBUS and.b #~(BITN|BITV|BITZ),REGST or.b DBUS,REGST move.b (REGMEA),DBUS ; read the byte and... lsr.b #5,DBUS ; shift V bit into position and.b #(BITV),DBUS or.b DBUS,REGST move.b (REGMEA),DBUS and.b REGA,DBUS move.w SR,DBUS and.b #(BITZ),DBUS ; Z flag set if M AND A = 0 or.b DBUS,REGST DISPATCH ; 256 emulation routines go here ; BRK is not quite implemented since it should never really occur in real life op00: or.b #BITB,REGST bra exit_emul ; ORA (zp,X) op01: clr.w REGEA ; clear IR move.b (REGMPC)+,REGEA ; get zero page address add.b REGX,REGEA ; add X and wraparound to zero page move.l REGEA,REGMEA ; effective address calculated move.b 1(REGMEA),-(SP) ; get hi byte move.w (SP)+,REGEA ; and shift by 8 (faster than a lsl.w #8) move.b (REGMEA),REGEA ; get lo byte bra doORchk ; go to common ORing routine ; ORA zp op05: clr.w REGEA move.b (REGMPC)+,REGEA bra doOR ; ASL zp op06: clr.w REGEA move.b (REGMPC)+,REGEA bra doASL ; PHP - do a 68000 to 6502 flag conversion, like in the init code op08: move.w REGSP,REGEA move.l REGEA,REGMEA movem.l DBUS/REGST/REGA/REGX/REGY/REGEA,-(SP) move.b REGST,DBUS move.b REGST,REGA move.b REGST,REGX move.b REGST,REGY move.b REGST,REGEA asr.b #3,DBUS and.b #0x1C,DBUS asr.b #4,REGEA and.b #CBIT,REGEA asr.b #1,REGY and.b #ZBIT,REGY asl.b #4,REGA and.b #NBIT,REGA asl.b #5,REGX and.b #VBIT,REGX move.b REGEA,REGST or.b REGX,REGST or.b REGY,REGST or.b REGA,REGST or.b DBUS,REGST ori.b #0x20,REGST move.b REGST,(REGMEA) movem.l (SP)+,DBUS/REGST/REGA/REGX/REGY/REGEA subq.b #1,REGSP DISPATCH ; ORA # op09: or.b (REGMPC)+,REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; ASL A op0A: asl.b #1,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH ; ORA abs op0D: move.b 1(REGMPC),-(SP) ; get hi byte move.w (SP)+,REGEA ; shift it 8 times move.b (REGMPC),REGEA ; get lo byte addq.w #2,REGMPC bra doORchk ; ASL abs op0E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doASLchk ; BPL op10: btst #3,REGST bne.s nobpl ; BITN = 0x08 = bit #3 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobpl: addq.l #1,REGMPC DISPATCH ; ORA (zp),Y op11: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA; move.b (REGMEA),REGEA add.w REGY,REGEA bra doORchk ; ORA zp,X op15: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doOR ; ASL zp,X op16: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doASL ; CLC op18: andi.b #~BITX,REGST DISPATCH ; ORA abs,Y op19: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA; move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doORchk ; ORA abs,X op1D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA; move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doORchk ; ASL abs,X op1E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doASLchk ; JSR abs op20: subq.b #2,REGSP move.w REGSP,REGEA move.l REGEA,REGMEA move.w REGMPC,REGPC addq.w #1,REGPC move.b REGPC,1(REGMEA) ; push PClo move.w REGPC,-(SP) move.b (SP)+,2(REGMEA) ; push PChi move.b 1(REGMPC),-(SP) move.w (SP)+,REGPC move.b (REGMPC),REGPC move.l REGPC,REGMPC DISPATCH ; AND (zp,X) op21: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doANDchk ; BIT zp op24: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA bra doBIT ; AND zp op25: clr.w REGEA move.b (REGMPC)+,REGEA bra doAND ; ROL zp op26: clr.w REGEA move.b (REGMPC)+,REGEA bra doROL ; PLP op28: addq.b #1,REGSP move.w REGSP,REGEA move.l REGEA,REGMEA move.b (REGMEA),REGST movem.l DBUS/REGA/REGX/REGY/REGEA,-(SP) move.b REGST,DBUS move.b REGST,REGA move.b REGST,REGX move.b REGST,REGY move.b REGST,REGEA asl.b #3,DBUS and.b #0xE0,DBUS asl.b #4,REGEA and.b #BITX,REGEA asl.b #1,REGY and.b #BITZ,REGY asr.b #4,REGA and.b #BITN,REGA asr.b #5,REGX and.b #BITV,REGX move.b REGEA,REGST or.b REGX,REGST or.b REGY,REGST or.b REGA,REGST or.b DBUS,REGST; movem.l (SP)+,DBUS/REGA/REGX/REGY/REGEA DISPATCH ; AND # op29: and.b (REGMPC)+,REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; ROL A op2A: move.b REGST,CCR ; prepare X bit ROXL.b #1,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH ; BIT abs op2C: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doBITchk ; AND abs op2D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doANDchk ; ROL abs op2E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doROLchk ; BMI op30: btst #3,REGST beq.s nobmi ; BITN = 0x08 = bit #3 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobmi: addq.l #1,REGMPC DISPATCH ; AND (zp),Y op31: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doANDchk ; AND zp,X op35: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doAND ; ROL zp,X op36: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doROL ; SEC op38: ori.b #BITX,REGST DISPATCH ; AND abs,Y op39: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doANDchk ; AND abs,X op3D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doANDchk ; ROL abs,X op3E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doROLchk ; RTI ; should never execute since the emulator doesn't really support interrupts ; But, deferred VBIs end in an RTI, so it is included here op40: move.w REGSP,REGEA move.l REGEA,REGMEA move.b 2(REGMEA),-(SP) ; pull PChi move.w (SP)+,REGPC move.b 1(REGMEA),REGPC ; pull PClo move.l REGPC,REGMPC ; do NOT increment PC for an RTI move.b 3(REGMEA),REGST ; pull processor, don't bother decoding addq.b #3,REGSP DISPATCH ; EOR (zp,X) op41: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doEORchk ; EOR zp op45: clr.w REGEA move.b (REGMPC)+,REGEA bra doEOR ; LSR zp op46: clr.w REGEA move.b (REGMPC)+,REGEA bra doLSR ; PHA op48: move.w REGSP,REGEA move.l REGEA,REGMEA move.b REGA,(REGMEA) ; push acc subq.b #1,REGSP DISPATCH ; EOR # op49: move.b (REGMPC)+,DBUS eor.b DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LSR A op4A: lsr.b #1,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH ; JMP abs op4C: move.b 1(REGMPC),-(SP) move.w (SP)+,REGPC move.b (REGMPC),REGPC move.l REGPC,REGMPC DISPATCH ; EOR abs op4D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doEORchk ; LSR abs op4E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doLSRchk ; BVC op50: btst #1,REGST bne.s nobvc ; BITV = 0x02 = bit #1 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobvc: addq.l #1,REGMPC DISPATCH ; EOR (zp),Y op51: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doEORchk ; EOR zp,X op55: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doEOR ; LSR zp,X op56: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doLSR ; CLI op58: andi.b #~BITI,REGST DISPATCH ; EOR abs,Y op59: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doEORchk ; EOR abs,X op5D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doEORchk ; LSR abs,X op5E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doLSRchk ; RTS op60: move.w REGSP,REGEA move.l REGEA,REGMEA move.b 2(REGMEA),-(SP) ; pull PChi move.w (SP)+,REGPC move.b 1(REGMEA),REGPC ; pull PClo addq.b #2,REGSP addq.w #1,REGPC move.l REGPC,REGMPC DISPATCH ; ADC (zp,X) op61: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doADCchk ; ADC (zp,X) op61dec: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doADCdecchk ; ADC zp op65: clr.w REGEA move.b (REGMPC)+,REGEA bra doADC ; ADC zp op65dec: clr.w REGEA move.b (REGMPC)+,REGEA bra doADCdec ; ROR zp op66: clr.w REGEA move.b (REGMPC)+,REGEA bra doROR ; PLA op68: addq.b #1,REGSP move.w REGSP,REGEA move.l REGEA,REGMEA move.b (REGMEA),REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; ADC # op69: move.b (REGMPC)+,DBUS ori.b #BITZ,REGST move.b REGST,CCR addX.b DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITV|BITX),DBUS and.b #~(BITN|BITZ|BITV|BITX),REGST or.b DBUS,REGST DISPATCH ; ADC # op69dec: move.b (REGMPC)+,DBUS ori.b #BITZ,REGST move.b REGST,CCR ABCD DBUS,REGA ; decimal add move.w SR,DBUS and.b #(BITN|BITZ|BITV|BITX),DBUS and.b #~(BITN|BITZ|BITV|BITX),REGST or.b DBUS,REGST DISPATCH ; ROR A op6A: move.b REGST,CCR ; prepare carry bit ROXR.b #1,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX),DBUS and.b #~(BITN|BITZ|BITX),REGST or.b DBUS,REGST DISPATCH ; JMP (abs) op6C: move.b 1(REGMPC),-(SP) move.w (SP)+,REGPC move.b (REGMPC),REGPC move.w REGPC,REGEA ; get vector move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGPC move.b (REGMEA),REGPC move.l REGPC,REGMPC DISPATCH ; ADC abs op6D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doADCchk ; ADC abs op6Ddec: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doADCdecchk ; ROR abs op6E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doRORchk ; BVS op70: btst #1,REGST beq.s nobvs ; BITV = 0x02 = bit #1 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobvs: addq.l #1,REGMPC DISPATCH ; ADC (zp),Y op71: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doADCchk ; ADC (zp),Y op71dec: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doADCdecchk ; ADC zp,X op75: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doADC ; ADC zp,X op75dec: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doADCdec ; ROR zp,X op76: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doROR ; SEI op78: ori.b #BITI,REGST DISPATCH ; ADC abs,Y op79: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doADCchk ; ADC abs,Y op79dec: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doADCdecchk ; ADC abs,X op7D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doADCchk ; ADC abs,X op7Ddec: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doADCdecchk ; ROR abs,X op7E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doRORchk ; STA (zp,X) op81: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doSTAchk ; STY zp op84: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b REGY,(REGMEA) DISPATCH ; STA zp op85: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b REGA,(REGMEA) DISPATCH ; STX zp op86: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b REGX,(REGMEA) DISPATCH ; DEY op88: subq.b #1,REGY move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; TXA op8A: move.b REGX,REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; STY abs op8C: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doSTYchk ; STA abs op8D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doSTAchk ; STX abs op8E: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doSTXchk ; BCC op90: btst #4,REGST bne.s nobcc ; BITX = 0x10 = bit #4 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobcc: addq.l #1,REGMPC DISPATCH ; STA (zp),Y op91: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doSTAchk ; STY zp,X op94: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b REGY,(REGMEA) DISPATCH ; STA zp,X op95: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b REGA,(REGMEA) DISPATCH ; STX zp,Y op96: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGY,REGEA move.l REGEA,REGMEA move.b REGX,(REGMEA) DISPATCH ; TYA op98: move.b REGY,REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; STA abs,Y op99: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doSTAchk ; TXS op9A: move.b REGX,REGSP DISPATCH ; STA abs,X op9D: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doSTAchk ; LDY # opA0: move.b (REGMPC)+,REGY move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDA (zp,X) opA1: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doLDAchk ; LDX # opA2: move.b (REGMPC)+,REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDY zp opA4: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b (REGMEA),REGY move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDA zp opA5: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b (REGMEA),REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDX zp opA6: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b (REGMEA),REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; TAY opA8: move.b REGA,REGY move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDA # opA9: move.b (REGMPC)+,REGA move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; TAX opAA: move.b REGA,REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDY abs opAC: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doLDYchk ; LDA abs opAD: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doLDAchk ; LDX abs opAE: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doLDXchk ; BCS opB0: btst #4,REGST beq.s nobcs ; BITX= 0x10 = bit #4 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobcs: addq.l #1,REGMPC DISPATCH ; LDA (zp),Y opB1: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doLDAchk ; LDY zp,X opB4: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doLDY ; LDA zp,X opB5: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doLDA ; LDX zp,Y opB6: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGY,REGEA bra doLDX ; CLV opB8: andi.b #~BITV,REGST DISPATCH ; LDA abs,Y opB9: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doLDAchk ; TAX opBA: move.b REGSP,REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; LDY abs,X opBC: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doLDYchk ; LDA abs,X opBD: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doLDAchk ; LDX abs,Y opBE: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doLDXchk ; CPY # opC0: move.b (REGMPC)+,DBUS bra doCPY ; CMP (zp,X) opC1: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; CPY zp opC4: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCPY ; CMP zp opC5: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; DEC zp opC6: clr.w REGEA move.b (REGMPC)+,REGEA bra doDEC ; INY opC8: addq.b #1,REGY move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; CMP # opC9: move.b (REGMPC)+,DBUS bra doCMP ; DEX opCA: subq.b #1,REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; CPY abs opCC: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCPY ; CMP abs opCD: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; DEC abs opCE: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doDECchk ; BNE opD0: btst #2,REGST bne.s nobne ; BITZ = 0x04 = bit #2 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobne: addq.l #1,REGMPC DISPATCH ; CMP (zp),Y opD1: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; CMP zp,X opD5: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; DEC zp,X opD6: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doDEC ; CLD opD8: andi.b #~BITD,REGST lea vec_6502(GLOBAL),REGOPS ; pointer to opcode table DISPATCH ; CMP abs,Y opD9: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; CMP abs,X opDD: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCMP ; DEC abs,X opDE: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doDECchk ; CPX # opE0: move.b (REGMPC)+,DBUS bra doCPX ; SBC (zp,X) opE1: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doSBCchk ; SBC (zp,X) opE1dec: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA bra doSBCdecchk ; CPX zp opE4: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCPX ; SBC zp opE5: clr.w REGEA move.b (REGMPC)+,REGEA bra doSBC ; SBC zp opE5dec: clr.w REGEA move.b (REGMPC)+,REGEA bra doSBCdec ; INC zp opE6: clr.w REGEA move.b (REGMPC)+,REGEA bra doINC ; INX opE8: addq.b #1,REGX move.w SR,DBUS and.b #(BITN|BITZ),DBUS and.b #~(BITN|BITZ),REGST or.b DBUS,REGST DISPATCH ; SBC # opE9: move.b (REGMPC)+,DBUS eori.b #BITX,REGST ori.b #BITZ,REGST move.b REGST,CCR subx.b DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX|BITV),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX|BITV),REGST or.b DBUS,REGST DISPATCH ; SBC # opE9dec: move.b (REGMPC)+,DBUS eori.b #BITX,REGST ori.b #BITZ,REGST move.b REGST,CCR sbcd DBUS,REGA move.w SR,DBUS and.b #(BITN|BITZ|BITX|BITV),DBUS eori.b #BITX,DBUS and.b #~(BITN|BITZ|BITX|BITV),REGST or.b DBUS,REGST DISPATCH ; CPX abs opEC: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC move.l REGEA,REGMEA move.b (REGMEA),DBUS bra doCPX ; SBC abs opED: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doSBCchk ; SBC abs opEDdec: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doSBCdecchk ; INC abs opEE: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA addq.w #2,REGMPC bra doINCchk ; BEQ opF0: btst #2,REGST beq.s nobeq ; BITZ = 0x04 = bit #2 move.b (REGMPC)+,DBUS ext.w DBUS adda.w DBUS,REGMPC DISPATCH nobeq: addq.l #1,REGMPC DISPATCH ; SBC (zp),Y opF1: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doSBCchk ; SBC (zp),Y opF1dec: clr.w REGEA move.b (REGMPC)+,REGEA move.l REGEA,REGMEA move.b 1(REGMEA),-(SP) move.w (SP)+,REGEA move.b (REGMEA),REGEA add.w REGY,REGEA bra doSBCdecchk ; SBC zp,X opF5: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doSBC ; SBC zp,X opF5dec: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doSBCdec ; INC zp,X opF6: clr.w REGEA move.b (REGMPC)+,REGEA add.b REGX,REGEA bra doINC ; SED opF8: ori.b #BITD,REGST lea dec_6502(GLOBAL),REGOPS ; pointer to table of dec opcodes DISPATCH ; SBC abs,Y opF9: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doSBCchk ; SBC abs,Y opF9dec: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGY,REGEA addq.w #2,REGMPC bra doSBCdecchk ; SBC abs,X opFD: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doSBCchk ; SBC abs,X opFDdec: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doSBCdecchk ; INC abs,X opFE: move.b 1(REGMPC),-(SP) move.w (SP)+,REGEA move.b (REGMPC),REGEA add.w REGX,REGEA addq.w #2,REGMPC bra doINCchk } } /*************************************************************************** XATARI.C by Darek Mihocka (CIS: 73657,2714 GEnie: DAREKM) This file contains the hardware emulation routines of an Atari 800. June 14, 1987 19:50 ***************************************************************************/ #include #include #include "_xformer.h" #define QNIL (DL *)0L typedef struct { int mode; /* antic mode */ int height; /* height in scan lines */ int width; /* width in bytes per line */ int block_size; /* number of consecutive bytes displayed */ int scan; /* starting scan line */ unsigned start; /* location of first byte being displayed */ } DL; #define Rnewfont A1 #define Rhorbyte D2 #define Rscansiz D3 #define SETREAD ADDQ.W #1,isread(A4) #define SETWRITE CLR.W isread(A4) #define TESTWRITE TST.W isread(A4) /* The following are variables required for the service routines */ unsigned int dl=0; /* value of start of display list */ int fRedraw=FALSE; /* flag to redraw the screen during VBI */ gtia=0, /* set if in GTIA display mode */ mdPMG=0, /* 0= off, 1= byte mode, 2=single line, 3=double line */ mdWidth, /* 1 = 32 columns, 2 = 40 columns, 0,3 undefined */ dma=0, /* state of video chip access */ /* bit 1,0 select playfield width, stored in mdWidth */ /* bit 2 unknown, ignored here */ /* bit 3, unknown, ignored here */ /* bit 4, 1= double line PMG, 0= single line PMG */ /* bit 5, PMG DMA enabled */ /* bit 6, unknown, ignored here */ /* bit 7 unknown, ignored here */ fSTART, fSELECT, fOPTION, /* console key flags */ fBREAK, /* BREAK key flag */ IKBD, /* value of keyboard interrupt */ cBeep=0, /* counter for speaker access */ pmg, /* $D01D contains flags for PMG */ pmbase, /* $D407 */ hposP[4], /* $D000 horizontal position of players */ hposM[4], /* $D004 horizontal position of missles */ grafP[4], /* $D00D data for players if DMA is not on */ grafM=0; /* $D011 data for missles */ char *qP[4], *qM; /* pointers to player missle data */ char shadows[16]; /* 8 bit values stored in shadow registers */ char keyboard=255; /* value of keyboard register */ int DOS_hand[8]; /* atari 2.0 DOS file handles for GEMDOS */ int DOS_mode[8]; /* open modes for each file */ char filename[15]; DL dlBlocks[200]; long *IntrptPtr; int IRet; char norm_font[2048] ; int wide_font[2048] ; /* conversion from 8 bit pattern to wide 16 bits */ int wide_byte[256] ; int mul40[200],mul80[200],mul160[200]; extern nul() , /* should never execute */ w_ROM(), /* attempt to write to ROM */ w_0230(), /* DL pointer */ w_022F(), /* DMA control */ w_dl(), /* changing the display list */ w_GTIA(), /* GTIA display mode register */ screen(), /* attempt to plot to ANTIC mode 0-15 */ w_710(), /* shadow color register */ w_D012(), /* hardware color register */ w_02F4(), /* chset base page */ s_brk(), /* break key flag */ s_con(), /* console keys */ s_rnd(), /* random number location */ s_vcount(), /* scan line counter register */ w_D200(), /* sound registers */ w_xP(), /* horizontal player positions write */ w_xM(), /* horizontal missle positions write */ w_gM(), /* graphics data for missle */ w_gP(), /* graphics data for player */ w_sP(), /* size of player */ w_sM(), /* size of missle */ w_P0(), /* writing to player 0 data array */ w_P1(), /* writing to player 1 data array */ w_P2(), /* writing to player 2 data array */ w_P3(), /* writing to player 3 data array */ w_M(), /* writing to missle data array */ w_PMB(), /* writing to PMBASE */ w_PMG() /* writing to DMACTL */ ; /* This array is used to map one of 128 8 bit colours to ST colours */ int rainbow[128] = { 0x000, 0x111, 0x222, 0x333, 0x444, 0x555, 0x666, 0x777, 0x200, 0x320, 0x430, 0x541, 0x650, 0x653, 0x764, 0x775, 0x200, 0x420, 0x530, 0x742, 0x753, 0x754, 0x754, 0x765, 0x200, 0x400, 0x500, 0x630, 0x643, 0x754, 0x754, 0x765, 0x400, 0x500, 0x511, 0x600, 0x744, 0x755, 0x755, 0x766, 0x301, 0x402, 0x513, 0x613, 0x634, 0x645, 0x756, 0x766, 0x202, 0x303, 0x404, 0x526, 0x636, 0x646, 0x757, 0x767, 0x203, 0x204, 0x325, 0x426, 0x446, 0x557, 0x667, 0x667, 0x003, 0x004, 0x115, 0x226, 0x346, 0x457, 0x567, 0x667, 0x003, 0x004, 0x115, 0x236, 0x346, 0x457, 0x567, 0x667, 0x012, 0x023, 0x234, 0x345, 0x366, 0x466, 0x577, 0x677, 0x022, 0x032, 0x043, 0x243, 0x354, 0x465, 0x576, 0x676, 0x020, 0x030, 0x040, 0x242, 0x353, 0x464, 0x575, 0x676, 0x220, 0x230, 0x342, 0x352, 0x463, 0x473, 0x674, 0x775, 0x220, 0x330, 0x332, 0x442, 0x553, 0x663, 0x664, 0x775, 0x210, 0x320, 0x432, 0x540, 0x543, 0x654, 0x764, 0x775 } ; int scan_table[16] = { /* height in pixels of each ANTIC mode */ 0,1,8,10,8,16,8,16,8,4,4,2,1,2,1,1 } ; /* bytes per scan line */ int rghor_bytes[4][16] = { {0,0,20,20,20,20,10,10,05,05,10,10,10,20,20,20}, {0,0,32,32,32,32,16,16,8,8,16,16,16,32,32,32}, {0,0,40,40,40,40,20,20,10,10,20,20,20,40,40,40}, {0,0,40,40,40,40,20,20,10,10,20,20,20,40,40,40} } ; int *phor_bytes; int (*serv_hrdw[256])() = { /* array of pointers to 256 service routines */ nul ,w_022F,w_ROM, nul ,w_0230,w_D200, w_710,w_D012, /* 128 write */ w_GTIA,nul , nul , nul , nul , nul ,w_02F4, nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , w_xP , w_xM , w_gP , w_gM , w_sP , w_sM , w_M , w_PMG, /* player missle */ w_P0 , w_P1 , w_P2 , w_P3 , nul , nul , nul , w_PMB, /* locations */ nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , w_dl , screen,nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , nul , s_con, s_rnd, s_vcount,nul, nul , nul , nul , /* 128 read */ nul , nul , nul , nul , nul , nul , nul , nul , /* and write */ nul /* don't need the rest */ } ; /* given a vector, insert the given opcode at the address pointed to */ patch(vec,opc) register unsigned vec; register char opc; { register char *pch; pch = mem + (unsigned)(*(mem+vec)) + (unsigned)(*(mem+vec+1))*256; *pch = opc; } /* given a handler vector, insert the given opcode at the address pointed to */ patchind(vec,opc) register unsigned vec; register char opc; { register char *pch; pch = mem + (unsigned)(*(mem+vec)) + (unsigned)(*(mem+vec+1))*256 + 1 ; *pch = opc; } /* initialize the stat[] array and set defaults for power on */ InitMachine() { register int old, num8, num16 ; /* Patch the operating system */ { char *qch; unsigned addr; /* replace cassette vectors with DOS vectors */ patchind (0xE440,0x0F); patchind (0xE442,0x1F); patchind (0xE444,0x2F); patchind (0xE446,0x3F); patchind (0xE448,0x4F); patchind (0xE44A,0x5F); /* patch new P: vectors */ patchind (0xE430,0x7F); patchind (0xE432,0x7F); patchind (0xE434,0x7F); patchind (0xE436,0x6F); patchind (0xE438,0x7F); patchind (0xE43A,0x7F); /* E: put */ /* patchind (0xE406,0x0C); */ /* blackboard vector */ patch (0xE472,0x00); /* SIO vectors */ patch (0xE454,0x60); patch (0xE45A,0x60); /* replace C: with D: */ addr = 0xE400; while (addr<0xFFF0) { qch = mem+addr++; if (*qch=='C' && *(qch+3)=='E' && *(qch+6)=='S') *qch = 'D'; } /* create a RTS vector */ qch=mem+(unsigned)0xE44CL; *qch++ = 76; /* JMP */ *qch++ = 0x4F; *qch++ = 0xE4; *qch = 96; /* RTS */ /* take out JSR disk boot - this is a ROM B specific address!!!!*/ qch=mem+55296L+6652L; *qch++ = 234; *qch++ = 234; *qch++ = 234; /* check if we have Fastchip loaded, if so, patch in special opcode */ qch=mem+55296L+507L; /* $D9FB */ if (*qch==(char)0xD8) { *qch = 0x02; /* patch in our special opcode for normalization */ qch=mem+55296L+614L; /* $DA66 */ /* *qch = 0x12; opcode for floating point add, not debugged */ } } /* quick routine to create 16 bit wide bytes */ for (num8=0 ; num8<256; num8++) { num16 = 0 ; old=num8 ; if (old&1) num16 |= 3 ; if (old&2) num16 |= 12 ; if (old&4) num16 |= 48 ; if (old&8) num16 |= 192 ; if (old&16) num16 |= 768 ; if (old&32) num16 |= 3072 ; if (old&64) num16 |= 12288 ; if (old&128) num16 |= 0xC000 ; wide_byte[num8] = num16 ; } for (num8=0; num8<200; num8++) { mul40[num8]=num8*40; mul80[num8]=num8*80; mul160[num8]=num8*160; } for (ea=0; ea<8; DOS_hand[ea++]=-1); /* clear out DOS handles */ for (ea=0; ea; stat[ea++]=0) ; /* clear out stat array */ stat[0x022F] = 1 ; /* DMA control */ if (fCartA) for (ea=40960; ea<49152; ea++) /* BASIC and OS are ROM */ stat[ea]=2 ; if (fCartB) for (ea=32768; ea<40960; ea++) stat[ea]=2 ; for (ea=49152; ea<53248; ea++) stat[ea]=2 ; for (ea=53248; ea<55296; ea++) stat[ea]=2 ; for (ea=55296; ea<65535; ea++) stat[ea]=2 ; /* For some functions, support the shadow, not the hardware location. */ /* This is because it's unlikely anyone will do them on the fly. */ /* Possibly in a DLI routine, but those aren't supported anyway. */ stat[0x0230] = 4 ; /* start of display RAM */ stat[0x0231] = 4 ; /* not supporting hardware location */ for (ea=0xD200; ea<=0xD209; ea++) stat[ea]=5 ; /* sound registers */ for (ea=704; ea<=712; ea++) stat[ea]=6; /* shadow color registers */ for (ea=53270; ea<=53274; ea++) stat[ea]=7 ; /* hardware color registers */ stat[623] = 8 ; /* GTIA mode, not supporing hardware location */ stat[756] = 14 ; /* chset base page, not supporting hardware loc. */ stat[53248] = 32; /* player horizontal */ stat[53252] = 33; /* missle horizontal */ stat[53261] = 34; /* player data */ stat[53265] = 35; /* missle data */ stat[53277] = 39; /* enables DMA PMG */ stat[54279] = 47; /* positions PMG data pages */ /* These are memory locations that return special values on a read. */ /* They also cause writes to be trapped and ignored (usually). */ stat[53279] = 129 ; /* console */ stat[53770] = 130 ; /* random */ stat[54283] = 131 ; /* vcount */ dlBlocks[0].mode=-1; } /* END OF INIT */ IntOn() { asm { ; save A4 where we can find it later */ lea RegA4(PC),A0 move.l A4,(A0) } JoyOn(); /* initialize joystick vector */ Supexec(VBIon); /* init VBI routine */ Install_Key(); fSTART = fSELECT = fOPTION = FALSE; } IntOff() { JoyOff(); /* disconnect joystick handler */ Remove_Key(); /* disconnect keyboard handler patch */ Supexec(VBIoff); } foo() { /* This function is never called. It's purpose is to allow the 68000 routines to pop into C once in a while. Therefore they must be inside a C function. */ /* emul_serv is called whenever a read/write access is attempted to non-RAM memory locations, such as ROM or hardware registers. when status bytes are > $80 (read and write) REGEA points to memory to read with D0 this routine ends with DISPATCH when writing and RTS when reading when status bytes are <>=0 (write-only) REGEA points to memory to write with D0 byte to poke is in high byte of DBUS this routine ends with DISPATCH */ asm { emul_serv: ANDI.W #0x00FF,IR ; clear out bits 8..15 ADD.W IR,IR ADD.W IR,IR ; calculate offset LEA serv_hrdw(GLOBAL),REGMEA ; get start of vector table MOVE.L 0(REGMEA,IR.W),REGMEA ; calculate correct vector JMP (REGMEA) ; jump through it /* The following routine is most of the system vertical blank re-written */ /* in 68000 so that it can be executed much faster. */ sysvbl: SAVEREGS lea emul(PC),A0 tst.b fTrace(GLOBAL) beq.s nt lea exit_emul(PC),A0 nt: lea pemul(PC),A1 move.l A0,(A1) ; change dispatch vector to normal move.l mem(GLOBAL),REGMEA ; get pointer to byte 0 ; the incrementing of the clocks is not done here. see VBI sysvb1: move.b #0xFE,REGA clr.b REGX move.b 77(REGMEA),REGY bpl.s vbatra move.b REGA,77(REGMEA) move.b 19(REGMEA),REGX move.b #0xF6,REGA vbatra: move.b REGA,78(REGMEA) ; drkmsk move.b REGX,79(REGMEA) ; colrsh lea rainbow(GLOBAL),A0 ; pointer to rainbow[128] lea rgPalette(GLOBAL),A1 lea 32(A1),A1 ; pointer to ST colors lea 0x8240,A2 ; pointer to ST colors regs lea shadows(GLOBAL),A3 ; pointer to 8 bit colors move.w #15,REGY sysvb2: clr.l D0 move.b (A3)+,D0 eor.b REGX,D0 and.b REGA,D0 andi.w #~1,D0 move.w 0(A0,D0.L),D0 move.w D0,(A1)+ move.w D0,(A2)+ dbf REGY,sysvb2 } { long scan_code ; int scan, shift ; int fSHIFT,fCTRL; static int fBreakEnable=TRUE; if (Kbshift(-1)&8) /* ALT key is used as the BREAK key */ { if (fBreakEnable) { *(mem+17)=0; fBreakEnable=FALSE; } } else { fBreakEnable=TRUE; *(mem+17)=1; } if (Bconstat(2) != 0) { *(mem+77)=0; /* clear attract mode */ keyboard = scan_code = Bconin(2) ; /* get ASCII */ shift=Kbshift(-1); fSHIFT=(shift&3)?64:0; fCTRL =(shift&4)?128:0; switch(scan_code>>16) { case 1: *(mem+764)=28+fSHIFT+fCTRL ; /* ESCape */ break ; case 3: *(mem+764) =30+(fSHIFT?87:0)+fCTRL ; /* 2 */ break ; case 4: *(mem+764) =26+fSHIFT+fCTRL ; /* 3 */ break ; case 14: *(mem+764)=52+fSHIFT+fCTRL ; /* BS */ break ; case 83: *(mem+764)=180-fSHIFT; /* delete BS */ break ; case 15: *(mem+764) =44+fSHIFT+fCTRL ; /* TAB */ break ; case 114: case 28: *(mem+764) =12+fSHIFT+fCTRL ; /* CR */ break ; case 72: *(mem+764) = 142 ; /* CTRL up arrow */ break ; case 80: *(mem+764) = 143 ; /* CTRL dn arrow */ break ; case 75: *(mem+764) = 134 ; /* CTRL lt arrow */ break ; case 77: *(mem+764) = 135 ; /* CTRL rt arrow */ break ; case 119: case 71: *(mem+764) = 118+(fCTRL?64:0); /* shift CLR */ break ; case 82: *(mem+764) = 55+128-fSHIFT; /* CTRL insert */ break ; case 88: case 63: *(mem+764) = 39 ; /* F5 = /|\ */ break ; case 62: *(mem+764)=fCTRL+60; /* F4 = caps */ break ; case 87: *(mem+764) = 60+64 ; /* F4 = shift caps */ break ; case 68: asm { /* F10 = RESET */ LOADREGS clr.w dma(GLOBAL) ; shut screen off move.b #0x224,REGEA move.l REGEA,REGMEA clr.w (REGMEA) ; clear VVBLKD MOVE.W #0xE474,REGPC ; stuff warmstart vector MOVE.L REGPC,REGMPC ; into PC DISPATCH } break ; case 59: asm { /* F1 = force break */ LOADREGS bra op00 } case 60: /* F2 = redraw */ clear_disp(); do_display(); break; default: if (keyboard) /* if regular character */ for (scan=0 ; scan<192 ; scan ++) /* to internal */ if (*(mem+0xFEFE+scan) == keyboard) *(mem+764)=scan; } /* switch */ *(mem + 0x0000D209L) = mem[764]; if (mem[764]==255) *(mem+0x0D20F) = 255; else *(mem+0x0D20F) = 251; *(mem+0x0D21F) = *(mem+0x0D20F) ; /* this pleases AtariWriter */ } /* while */ if (fRedraw) { clear_disp(); do_display(); } } asm { LOADREGS ; Now we want to call the deferred vertical blank routine at VVBLKD ($224). ; It ends in an RTI so we not only push the PC to the stack, but also the ; status register. Don't bother encoding it to 6502 format. btst #5,REGST ; get out if interrupts disabled bne.s noVVBLKD move.w #0x225,REGEA ; just for grins, make sure it is non-0 move.l REGEA,REGMEA tst.b (REGMEA) beq.s noVVBLKD ; it is, must be in a warmstart ; push the PC and status register, then push A,X and Y to the stack subq.B #6,REGSP move.W REGSP,REGEA move.L REGEA,REGMEA move.B REGST,6(REGMEA) ; push status register move.W REGMPC,REGPC move.B REGPC,4(REGMEA) ; push PClo move.W REGPC,-(SP) move.B (SP)+,5(REGMEA) ; push PChi move.B REGA,3(REGMEA) ; PHA move.B REGX,2(REGMEA) ; PHX move.B REGY,1(REGMEA) ; PHY ; do a JMP ($224) move.w #0x224,REGEA move.L REGEA,REGMEA move.B 1(REGMEA),-(SP) move.W (SP)+,REGPC move.B (REGMEA),REGPC move.L REGPC,REGMPC noVVBLKD: DISPATCH nul: /* should never execute! but just in case... */ SWAP DBUS do_write: MOVE.L REGEA,REGMEA MOVE.B DBUS,(REGMEA) /* do the actual write to memory */ DISPATCH w_dl: SWAP DBUS MOVE.L REGEA,REGMEA move.b (REGMEA),x(GLOBAL) ; get old value MOVE.B DBUS,(REGMEA) ; do the actual write to memory */ move.b DBUS,a(GLOBAL) SAVEREGS } if (dma && a!=x) fRedraw=TRUE; asm { LOADREGS DISPATCH w_0230: move.w dl(GLOBAL),ea(GLOBAL) ; save old display list pointer move.l REGEA,REGMEA btst #0,REGEA ; check address to poke to BNE w_0231 SWAP DBUS MOVE.B DBUS,dl+1(GLOBAL) ; if 230, then low byte of dl move.b (REGMEA),REGEA cmp.b REGEA,DBUS ; are we changing value? beq.s w_0230_exit move.b DBUS,(REGMEA) BRA w_0230_2 w_0231: SWAP DBUS ; if 231, then high byte of dl MOVE.B DBUS,dl(GLOBAL) move.b (REGMEA),REGEA cmp.b REGEA,DBUS ; are we changing value? beq.s w_0230_exit move.b DBUS,(REGMEA) ; write new value w_0230_2: SAVEREGS } if (dma) { fRedraw=TRUE; /* screen must be redrawn, so release display list */ while (*(mem+ea)!=65 && (ea!=0xD000)) { if (stat[ea]&64) stat[ea]=0; ea++; } } asm { LOADREGS w_0230_exit: DISPATCH w_022F: SWAP DBUS move.l REGEA,REGMEA move.b DBUS,(REGMEA) MOVE.W DBUS,-(SP) ; save value andi.w #3,DBUS ; get playfield width move.w DBUS,mdWidth(GLOBAL) ; store it lsl.w #5,DBUS lea rghor_bytes(GLOBAL),REGMEA adda.w DBUS,REGMEA move.l REGMEA,phor_bytes(GLOBAL) ; phor_bytes = rghorbytes[mdWidth] MOVE.W (SP)+,DBUS andi.w #0x20,DBUS BNE DMA_on DMA_off: ; if DMA is off, blank screen SAVEREGS } plot_0 (0,200) ; ea=dl; while (*(mem+ea)!=65 && (ea!=0xD000)) { if (stat[ea]&64) stat[ea]=0; ea++; } clear_disp(); dma=0; asm { LOADREGS BRA w_022Fexit DMA_on: SAVEREGS } if (dma) { if (mdWidth!=2) plot_0 (0,200) ; clear_disp(); } dma=1; do_display() ; asm { LOADREGS w_022Fexit: DISPATCH w_710: /* color register */ SWAP DBUS MOVE.L REGEA,REGMEA MOVE.B DBUS,(REGMEA) /* do the actual write to memory */ MOVE.B DBUS,a(GLOBAL) MOVE.W REGEA,ea(GLOBAL) SAVEREGS } do_colors (ea,a) ; asm { LOADREGS DISPATCH w_D012: /* color register */ SWAP DBUS MOVE.L REGEA,REGMEA MOVE.B DBUS,(REGMEA) /* do the actual write to memory */ MOVE.B DBUS,a(GLOBAL) MOVE.W REGEA,ea(GLOBAL) SAVEREGS } do_color (ea,a) ; asm { LOADREGS DISPATCH w_GTIA: /* GTIA register */ SWAP DBUS MOVE.L REGEA,REGMEA MOVE.B DBUS,(REGMEA) /* do the actual write to memory */ ANDI.w #0xC0,DBUS /* bits 6 and 7 control GTIA mode */ move.w DBUS,gtia(GLOBAL) /* store in gtia */ SAVEREGS } { int i; for (i=704; i<=712; i++) do_colors(i,mem[i]); if (dma) fRedraw=TRUE; } asm { LOADREGS DISPATCH w_D200: /* sound registers */ SWAP DBUS MOVE.L REGEA,REGMEA MOVE.B DBUS,(REGMEA) /* do the actual write to memory */ MOVE.B DBUS,a(GLOBAL) MOVE.W REGEA,ea(GLOBAL) SAVEREGS } { register char tmp; switch (ea) { default: break; case 0xD200: case 0xD202: case 0xD204: case 0xD206: tmp = *(mem+ea+1); Sound ((ea-0xD200)>>1,a,tmp>>4,tmp&15); break; case 0xD201: case 0xD203: case 0xD205: case 0xD207: tmp = *(mem+ea-1); Sound ((ea-0xD200)>>1,tmp,a>>4,a&15); break; } } asm { LOADREGS DISPATCH w_02F4: /* character set */ SWAP DBUS MOVE.L REGEA,REGMEA move.b (REGMEA),REGEA cmp.b DBUS,REGEA beq.s w_02F4_exit MOVE.B DBUS,(REGMEA) SAVEREGS } do_chset() ; asm { LOADREGS w_02F4_exit: DISPATCH screen: ; handler for screen plots swap DBUS ; get byte we want to plot MOVE.L REGEA,REGMEA move.b (REGMEA),REGEA ; get old value cmp.b REGEA,DBUS ; are we writing what's already there? beq.s skipscr ; Sure are, skip the plot, save time MOVE.B DBUS,(REGMEA) ; do the actual write to memory tst.w dma(GLOBAL) beq.s skipscr ; if dma is off, get out SAVEREGS ; save 6502 enviornment move.w REGMEA,-(SP) ; push memory location } do_byte(); /* address already on stack */ asm { addq.l #2,SP LOADREGS ; restore 6502 enviornment skipscr: DISPATCH s_brk: TESTWRITE beq nul SAVEREGS } { *(mem+17)=(char)(1-fBREAK&1); } asm { LOADREGS RTS s_con: TESTWRITE beq.s w_con SAVEREGS } { *(mem+53279)=(fSTART?0:1) | (fSELECT?0:2) | (fOPTION?0:4); } asm { LOADREGS RTS w_con: move.w cBeep(GLOBAL),DBUS ; only click every 128th access to add.w #1,DBUS ; compensate for speed slowdown andi.w #127,DBUS move.w DBUS,cBeep(GLOBAL) tst.w DBUS bne.s w_con_exit swap DBUS cmpi.w #8,DBUS ; also get out if clearing console keys beq.s w_con_exit SAVEREGS } Sound (2,20,10,15); /* click a little */ Sound (2,0,0,0); asm { LOADREGS w_con_exit: DISPATCH s_rnd: TESTWRITE beq nul SAVEREGS } *(mem+53770L)=(char)((Random()>>3)^x^(a&y)); asm { LOADREGS RTS s_vcount: TESTWRITE beq nul move.b 0x8207,-(SP) move.w (SP)+,D0 move.b 0x8209,D0 divu #20,D0 andi.w #254,D0 MOVE.L REGEA,REGMEA MOVE.B DBUS,(REGMEA) RTS w_ROM: DISPATCH ; handler for P: putchar op6F: SAVEREGS MOVE.B REGA,a(GLOBAL) ; character to print */ } { int timeout = 1000; do { if (Cprnos()) { /* if printer is ready */ timeout=0; if (a!=155) Cprnout (a) ; /* then check for CR and print */ else { Cprnout(13) ; /* if CR then send CRLF */ Cprnout(10) ; } y = 1 ; /* set status = good */ } else y = 0x8A ; /* else status = timeout error */ } while (timeout--); } asm { LOADREGS MOVE.b y(GLOBAL),REGY ; return status FLAGS BRA op60 ; handler for all other P: calls op7F: MOVE.w #1,REGY ; return good status FLAGS BRA op60 op0F: /* handler for open D: call */ SAVEREGS MOVE.B REGX,x(GLOBAL) } do_open(); asm { LOADREGS MOVE.B y(GLOBAL),REGY /* return status */ FLAGS BRA op60 op2F: /* handler for get D: call */ SAVEREGS MOVE.B REGX,x(GLOBAL) } do_get(); asm { LOADREGS MOVE.B a(GLOBAL),REGA MOVE.B y(GLOBAL),REGY /* return status */ FLAGS BRA op60 op3F: /* handler for put D: call */ SAVEREGS MOVE.B REGX,x(GLOBAL) MOVE.B REGA,a(GLOBAL) } do_put(); asm { LOADREGS MOVE.B y(GLOBAL),REGY /* return status */ FLAGS BRA op60 op1F: op4F: op5F: /* handler for close D: calls */ SAVEREGS MOVE.B REGX,x(GLOBAL) } do_close(); asm { LOADREGS MOVE.B y(GLOBAL),REGY /* return status */ FLAGS BRA op60 op0C: /* handler for E: */ /* SAVEREGS MOVE.B REGA,a(GLOBAL) MOVE.B REGX,x(GLOBAL) MOVE.B REGY,y(GLOBAL) FLAGS } do_Eput(); asm { LOADREGS MOVE.B a(GLOBAL),REGA MOVE.B x(GLOBAL),REGX MOVE.B y(GLOBAL),REGY FLAGS */ BRA op60 /* Player missle graphics routines. ouch */ w_xP: /* horizontal player positions write */ w_xM: /* horizontal missle positions write */ w_gM: /* graphics data for missle */ w_sP: /* size of player */ w_sM: /* size of missle */ w_P0: /* writing to player 0 data array */ w_P1: /* writing to player 1 data array */ w_P2: /* writing to player 2 data array */ w_P3: /* writing to player 3 data array */ w_M: /* writing to missle data array */ w_PMG: /* writing to DMACTL */ DISPATCH /**** opcode $02 is used to simulate the Fastchip normalize ****/ /* FNORM - $D9FB normalize FR0 and terminate with an RTS */ op02: move.w #0,REGEA move.l REGEA,REGMEA ; REGMEA = mem andi.b #~BITD,REGST lea vec_6502(GLOBAL),REGOPS ; CLD move.w #5,REGY ; LDY #5 fnml: move.b 0xD5(REGMEA),REGA ; LDA FR0+1 beq.s fnm2 ; BEQ FNM2 andi.b #~BITX,REGST ; CLC bra op60 ; RTS fnm2: clr.b 0xDA(REGMEA) ; STA FR0+FPREC (A=0) subi.b #1,0xD4(REGMEA) ; DEC FR0 fnm3: move.w #0x00FB,REGX ; LDX #1-FPREC fnm4: move.b 0xDB(REGMEA,REGX.w),0xDA(REGMEA,REGX.w) ; LDA FRO+FPREC+1,X ; STA FRO+FPREC,X add.b #1,REGX ; INX bne.s fnm4 ; BNE FNM4 sub.b #1,REGY ; DEY bne.s fnml ; BNE FNML move.w #0xDA43,REGPC move.l REGPC,REGMPC DISPATCH ; BEQ RZERO ($DA43) unconditinal /**** opcode $12 is used to simulate the Fastchip add, a bit buggy ****/ /* FAAD - $DA66 - add FR0 and FR1 and exit to FNME ($D9E7) */ op12: clr.w REGA clr.w REGX clr.w REGY move.w #0x100,REGEA move.l REGEA,REGMEA ; REGMEA = mem[100] move.w #5,REGX ; LDX #5 move.b 0xFFE0(REGMEA),DBUS ; LDA FR1 andi.w #0x7F,DBUS move.b 0xFFD4(REGMEA),REGA ; LDA FR0 andi.w #0x7F,REGA sub.w DBUS,REGA bpl frobig addi.w #5,REGA move.b REGA,REGY ori.w #BITX,REGST move.b REGST,CCR ; SEC ori.w #BITD,REGST ; SED move.b 0xFFE0(REGMEA),DBUS move.b 0xFFD4(REGMEA),REGA eor.w DBUS,REGA bmi fdif0 andi.w #~BITX,REGST move.b REGST,CCR ; CLC subi.w #1,REGY ; DEY bmi fadd1 fadd0: move.b 0xD5(REGMEA,REGY.w),REGA ; LDA FR0+1,Y move.b 0xE0(REGMEA,REGX.w),DBUS ; ADC FR1,X abcd DBUS,REGA move.w SR,REGST move.b REGA,0xD4(REGMEA,REGX.w) ; STA FR0,X sub.b #1,REGX ; DEX sub.b #1,REGY ; DEY bpl.s fadd0 fadd1: move.b 0xE0(REGMEA,REGX.w),REGA ; LDA FR1,X clr.w DBUS abcd DBUS,REGA move.w SR,REGST move.b REGA,0xD4(REGMEA,REGX.w) ; STA FR0,X sub.b #1,REGX ; DEX bne.s fadd1 ; BNE FADD1 move.b 0xFFE0(REGMEA),0xFFD4(REGMEA) ; LDA FR1 STA FRO fhtst: move.b REGST,CCR bcc faddx ; BCC FADDX fadd2: move.b 0xFFD8(REGMEA),0xFFD9(REGMEA) move.b 0xFFD7(REGMEA),0xFFD8(REGMEA) move.b 0xFFD6(REGMEA),0xFFD7(REGMEA) move.b 0xFFD5(REGMEA),0xFFD6(REGMEA) move.b #1,0xFFD5(REGMEA) move.b 0xFFD4(REGMEA),REGA move.b REGA,DBUS add.b #1,DBUS move.b DBUS,0xFFD4(REGMEA) eor.b DBUS,REGA bmi faddx ; C is set andi.w #~BITX,REGST ; CLC faddx: andi.w #~BITD,REGST ; CLD bra op60 frobig: not.b REGA ; EOR #$FF addi.b #5,REGA bcc fnml ori.w #BITX,REGST move.b REGST,CCR ; SEC move.b REGA,REGY ; TAY ori.w #BITD,REGST ; SED move.b 0xFFE0(REGMEA),DBUS move.b 0xFFD4(REGMEA),REGA eor.b DBUS,REGA bmi fdif5 andi.w #~BITX,REGST move.b REGST,CCR ; CLC fadd5: move.b 0xD4(REGMEA,REGX.w),REGA ; LDA FRO,X move.b 0xE1(REGMEA,REGY.w),DBUS ; ADC FR1+1,Y abcd DBUS,REGA move.w SR,REGST move.b REGA,0xD4(REGMEA,REGX.w) ; STA FR0,X subi.b #1,REGX ; DEX subi.b #1,REGY ; DEY bpl.s fadd5 fadd6: subi.b #1,REGX ; DEX bmi fhtst move.b 0xD5(REGMEA,REGX.w),REGA ; LDA FRO+1,X clr.w DBUS abcd DBUS,REGA move.w SR,REGST move.b REGA,0xD5(REGMEA,REGX.w) ; STA FR0+1,X move.b REGST,SR bcs fadd6 bra faddx fdif0: move.w #0xDAB5,REGPC move.l REGPC,REGMPC DISPATCH fdif5: move.w #0xD9BA,REGPC move.l REGPC,REGMPC DISPATCH op22: op32: op42: /* unused opcodes which can be put to good use as patches */ op80: op52: op62: op72: op82: op92: opB2: opC2: opD2: opE2: opF2: op03: op13: op23: op33: op43: op53: op63: op73: op83: op93: opA3: opB3: opC3: opD3: opE3: opF3: op04: op14: op34: op44: op54: op64: op74: opD4: opF4: op07: op17: op27: op37: op47: op57: op67: op77: op87: op97: opA7: opB7: opC7: opD7: opE7: opF7: op89: op1A: op3A: op5A: op7A: opDA: opEA: opFA: op0B: op1B: op2B: op3B: op4B: op5B: op6B: op7B: op8B: op9B: opAB: opBB: opCB: opDB: opEB: opFB: op1C: op3C: op5C: op7C: op9C: opDC: opFC: op9E: op8F: op9F: opAF: opBF: opCF: opDF: opEF: opFF: DISPATCH } } plot_0 (scan, height) /* clear scan lines */ register int scan, height ; { /* height black scan lines */ register long *loc; register int clong; loc = (long *)scr_emul + (long)((scan<<5)+(scan<<3)); clong=(height<<3)+height+height; /* height * 10 */ for (;clong--; *loc++ = *loc++ = *loc++ = *loc++ = 0L) ; } plot_1 (scan, height) /* clear bit planes 2 & 3 */ register int scan, height ; /* height black scan lines */ { register long *loc; register int clong; loc = (long *)scr_emul + (long)mul40[scan] ; clong= (height<<4)+(height<<2); /* multiply * 20 bit planes per line */ for (;clong--; loc++, *loc++ = 0L) ; } /* plot a 40 column character using ROM B font */ plot_2 (data,scry, scrx,count) register char *data; register int scry, scrx, count ; { register int text; register char *newscr; char *newfont ; /* unused - use A1 */ if (gtia) return; asm { ; scry=mul160[scry]; /* since we won't change y co-ordinate */ LEA mul160(GLOBAL),A0 ADD.W scry,scry ADDA.W scry,A0 MOVE.W (A0),scry ; while (count--) loop_2: ; text = *data++ *8; MOVE.W #0,text MOVE.B (data)+,text ADD.W text,text ADD.W text,text ADD.W text,text ; newfont = &norm_font[text^0x400] ; EORI.W #0x400,text LEA norm_font(GLOBAL),Rnewfont ADDA.W text,Rnewfont ; newscr = scr_emul + scry + (scrx&1) + ((scrx&~1)<<2) ; MOVE.W scrx,D0 ANDI.W #1,D0 MOVE.W scrx,D1 ANDI.W #~1,D1 ADD.W D1,D1 ADD.W D1,D1 ADD.W D1,D0 ADD.W scry,D0 MOVE.L scr_emul(GLOBAL),newscr ADDA.W D0,newscr MOVE.B #~0,D0 MOVE.B (Rnewfont)+,(newscr) MOVE.B D0,2(newscr) MOVE.B (Rnewfont)+,160(newscr) MOVE.B D0,162(newscr) MOVE.B (Rnewfont)+,320(newscr) MOVE.B D0,322(newscr) MOVE.B (Rnewfont)+,480(newscr) MOVE.B D0,482(newscr) MOVE.B (Rnewfont)+,640(newscr) MOVE.B D0,642(newscr) MOVE.B (Rnewfont)+,800(newscr) MOVE.B D0,802(newscr) MOVE.B (Rnewfont)+,960(newscr) MOVE.B D0,962(newscr) MOVE.B (Rnewfont)+,1120(newscr) MOVE.B D0,1122(newscr) ADDQ.W #1,scrx ; scrx++ ; SUB.W #1,count BNE loop_2 } } /* plot a 40 column character in 10 pixels */ plot_3 (data,scry, scrx,count) char *data; register int scry, scrx, count ; { register int text; register char *newscr; register char *newfont ; if (gtia) return; while (count--) { text = *data++; text &= 0xFF ; /* character was signed, so unsign it */ asm { ADD.W text,text ADD.W text,text ADD.W text,text /* text *= 8 */ } newscr=scr_emul+mul160[scry]+(scrx&1)+((scrx&~1)<<2) ; newfont = &norm_font[text^0x400] ; newscr[1282]=newscr[1442]= newscr[002]= newscr[162]= newscr[322]= newscr[482]= newscr[642]= newscr[802]= newscr[962]= newscr[1122]=~0; newscr[000]=*newfont++; newscr[160]=*newfont++; newscr[320]=*newfont++; newscr[480]=*newfont++; newscr[640]=*newfont++; newscr[800]=*newfont++; newscr[960]=*newfont++; newscr[1120]=*newfont; newscr[1280]=newscr[1440]=~0; scrx++ ; } } /* 4 color text modes */ plot_4(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register int text; register char *newscr; char *newfont ; /* unused - use A1 */ if (gtia) return; while (count--) { text = *data++; text &= 0x7F ; /* ignore hi bit */ asm { ADD.W text,text ADD.W text,text ADD.W text,text /* text *= 8 */ } newscr=scr_emul+mul160[scry]+(scrx&1)+((scrx&~1)<<2) ; newfont = &norm_font[text] ; asm { move.l newfont(LOCAL),Rnewfont move.w #7,D2 ; 8 scan lines loop_4: move.b (Rnewfont)+,text move.b text,D1 andi.w #0x55,D1 move.w D1,D0 add.w D0,D0 or.w D1,D0 move.b D0,(newscr) andi.w #0xAA,text move.w text,D0 lsr.w #1,D0 or.w text,D0 move.b D0,2(newscr) lea 160(newscr),newscr dbf D2,loop_4 } scrx++ ; } } plot_5(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register int text; register char *newscr; char *newfont ; /* unused - use A1 */ if (gtia) return; while (count--) { text = *data++; text &= 0x7F ; /* ignore hi bit */ asm { ADD.W text,text ADD.W text,text ADD.W text,text /* text *= 8 */ } newscr=scr_emul+mul160[scry]+(scrx&1)+((scrx&~1)<<2) ; newfont = &norm_font[text] ; asm { move.l newfont(LOCAL),Rnewfont move.w #7,D2 ; 8 unique scan lines loop_5: move.b (Rnewfont)+,text move.b text,D1 andi.w #0x55,D1 move.w D1,D0 add.w D0,D0 or.w D1,D0 move.b D0,(newscr) move.b D0,160(newscr) andi.w #0xAA,text move.w text,D0 lsr.w #1,D0 or.w text,D0 move.b D0,2(newscr) ; do 2 scan lines at once move.b D0,162(newscr) lea 320(newscr),newscr ; skip 2 lines dbf D2,loop_5 } scrx++ ; } } /* plot a 20 column character */ plot_6(data, scry, scrx, count) char *data; register int scry, scrx, count ; { register int text; register int *newscr ; register int *newfont ; if (gtia) return; while (count--) { asm { ; text = *data++ + 64; /* add 64 to select colours 1-4, not 0-3 */ clr.w text move.l data(LOCAL),A0 move.b (A0)+,text move.l A0,data(LOCAL) add.w #64,text ADD.W text,text ADD.W text,text ADD.W text,text /* text *= 8 */ } newscr = (int *) scr_emul + mul80[scry] + (scrx<<2) ; newfont = &wide_font[(text&0x01F8)]; /* ignore color bits */ if (text&0x200) asm { move.l newfont,A0 move.w (A0)+,(newscr) move.w (A0)+,160(newscr) move.w (A0)+,320(newscr) move.w (A0)+,480(newscr) move.w (A0)+,640(newscr) move.w (A0)+,800(newscr) move.w (A0)+,960(newscr) move.w (A0),1120(newscr) } else asm { clr.w (newscr) clr.w 160(newscr) clr.w 320(newscr) clr.w 480(newscr) clr.w 640(newscr) clr.w 800(newscr) clr.w 960(newscr) clr.w 1120(newscr) } if (text&0x400) asm { move.l newfont,A0 move.w (A0)+,2(newscr) move.w (A0)+,162(newscr) move.w (A0)+,322(newscr) move.w (A0)+,482(newscr) move.w (A0)+,642(newscr) move.w (A0)+,802(newscr) move.w (A0)+,962(newscr) move.w (A0),1122(newscr) } else asm { clr.w 2(newscr) clr.w 162(newscr) clr.w 322(newscr) clr.w 482(newscr) clr.w 642(newscr) clr.w 802(newscr) clr.w 962(newscr) clr.w 1122(newscr) } if (text&0x800) asm { move.l newfont,A0 move.w (A0)+,4(newscr) move.w (A0)+,164(newscr) move.w (A0)+,324(newscr) move.w (A0)+,484(newscr) move.w (A0)+,644(newscr) move.w (A0)+,804(newscr) move.w (A0)+,964(newscr) move.w (A0),1124(newscr) } else asm { clr.w 4(newscr) clr.w 164(newscr) clr.w 324(newscr) clr.w 484(newscr) clr.w 644(newscr) clr.w 804(newscr) clr.w 964(newscr) clr.w 1124(newscr) } /* clear out bit plane 3 */ asm { clr.w 6(newscr) clr.w 166(newscr) clr.w 326(newscr) clr.w 486(newscr) clr.w 646(newscr) clr.w 806(newscr) clr.w 966(newscr) clr.w 1126(newscr) } scrx++ ; } } plot_7(data, scry, scrx, count) char *data; register int scry, scrx, count ; { register int text; register int *newscr ; register int *newfont ; if (gtia) return; while (count--) { asm { ; text = *data++ + 64; /* add 64 to select colours 1-4, not 0-3 */ clr.w text move.l data(LOCAL),A0 move.b (A0)+,text move.l A0,data(LOCAL) add.w #64,text ADD.W text,text ADD.W text,text ADD.W text,text /* text *= 8 */ } newscr = (int *) scr_emul + mul80[scry] + (scrx<<2) ; newfont = &wide_font[(text&0x01F8)]; /* ignore color bits */ if (text&0x200) { newfont = &wide_font[(text&0x01F8)]; /* ignore color bits */ newscr[000]= newscr[80]=*newfont++; newscr[160]= newscr[240]=*newfont++; newscr[320]= newscr[400]=*newfont++; newscr[480]= newscr[560]=*newfont++; newscr[640]= newscr[720]=*newfont++; newscr[800]= newscr[880]=*newfont++; newscr[960]= newscr[1040]=*newfont++; newscr[1120]= newscr[1200]=*newfont; } else asm { clr.w 0(newscr) clr.w 160(newscr) clr.w 320(newscr) clr.w 480(newscr) clr.w 640(newscr) clr.w 800(newscr) clr.w 960(newscr) clr.w 1120(newscr) clr.w 1280(newscr) clr.w 1440(newscr) clr.w 1600(newscr) clr.w 1760(newscr) clr.w 1920(newscr) clr.w 2080(newscr) clr.w 2240(newscr) clr.w 2400(newscr) } if (text&0x400) { newfont = &wide_font[(text&0x01F8)]; /* ignore color bits */ newscr[001]= newscr[81]=*newfont++; newscr[161]= newscr[241]=*newfont++; newscr[321]= newscr[401]=*newfont++; newscr[481]= newscr[561]=*newfont++; newscr[641]= newscr[721]=*newfont++; newscr[801]= newscr[881]=*newfont++; newscr[961]= newscr[1041]=*newfont++; newscr[1121]= newscr[1201]=*newfont; } else asm { clr.w 2(newscr) clr.w 162(newscr) clr.w 322(newscr) clr.w 482(newscr) clr.w 642(newscr) clr.w 802(newscr) clr.w 962(newscr) clr.w 1122(newscr) clr.w 1282(newscr) clr.w 1442(newscr) clr.w 1602(newscr) clr.w 1762(newscr) clr.w 1922(newscr) clr.w 2082(newscr) clr.w 2242(newscr) clr.w 2402(newscr) } if (text&0x800) { newfont = &wide_font[(text&0x01F8)]; /* ignore color bits */ newscr[002]= newscr[82]=*newfont++; newscr[162]= newscr[242]=*newfont++; newscr[322]= newscr[402]=*newfont++; newscr[482]= newscr[562]=*newfont++; newscr[642]= newscr[722]=*newfont++; newscr[802]= newscr[882]=*newfont++; newscr[962]= newscr[1042]=*newfont++; newscr[1122]= newscr[1202]=*newfont; } else asm { clr.w 4(newscr) clr.w 164(newscr) clr.w 324(newscr) clr.w 484(newscr) clr.w 644(newscr) clr.w 804(newscr) clr.w 964(newscr) clr.w 1124(newscr) clr.w 1284(newscr) clr.w 1444(newscr) clr.w 1604(newscr) clr.w 1764(newscr) clr.w 1924(newscr) clr.w 2084(newscr) clr.w 2244(newscr) clr.w 2404(newscr) } /* clear out bit plane 3 */ asm { clr.w 6(newscr) clr.w 166(newscr) clr.w 326(newscr) clr.w 486(newscr) clr.w 646(newscr) clr.w 806(newscr) clr.w 966(newscr) clr.w 1126(newscr) clr.w 1286(newscr) clr.w 1446(newscr) clr.w 1606(newscr) clr.w 1766(newscr) clr.w 1926(newscr) clr.w 2086(newscr) clr.w 2246(newscr) clr.w 2406(newscr) } scrx++ ; } } /* for mode 8 (GR.3), each byte is 4 pixels, which appear as 4 8 pixel boxes */ /* Therefore 2 pixels are stored as 2 long words, with planes 0 and 1 in the */ /* first, and planes 2 and 3 in the seconds. The following lookup table has */ /* the masks for the 16 color combinations of 2 pixels */ long mode8_planes[16] = { 0x00000000L, 0x00FF0000L, 0x000000FFL, 0x00FF00FFL, 0xFF000000L, 0xFFFF0000L, 0xFF0000FFL, 0xFFFF00FFL, 0x0000FF00L, 0x00FFFF00L, 0x0000FFFFL, 0x00FFFFFFL, 0xFF00FF00L, 0xFFFFFF00L, 0xFF00FFFFL, 0xFFFFFFFFL } ; plot_8(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register int text; register long *newscr; if (gtia) return; while (count--) { text = *data++; newscr = (long *)scr_emul + mul40[scry] + (scrx<<2) ; /* do left 2 pixels */ newscr[0] = newscr[40] = newscr[80] = newscr[120] = newscr[160] = newscr[200] = newscr[240] = newscr[280] = mode8_planes[(text>>4)&0x0F] ; /* do right two pixels */ newscr[2] = newscr[42] = newscr[82] = newscr[122] = newscr[162] = newscr[202] = newscr[242] = newscr[282] = mode8_planes[text&0x0F] ; scrx++ ; } } plot_9(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register long *newscr; if (gtia) return; while (count--) { newscr = (long *)scr_emul + mul40[scry] + (scrx<<2) ; asm { ; since GR.4 and GR.5 have the same horizontal resolution as GTIA, use the same ; brute force routine to plot the pixels clr.l 4(newscr) ; clear bit planes 2 & 3 clr.l 12(newscr) clr.l 164(newscr) clr.l 172(newscr) clr.l 324(newscr) clr.l 332(newscr) clr.l 484(newscr) clr.l 492(newscr) move.b (data)+,D0 clr.l D1 btst #0,D0 beq.s p91 move.l #0x000F0000,D1 p91: btst #1,D0 beq.s p92 ori.l #0x00F00000,D1 p92: btst #2,D0 beq.s p94 ori.l #0x0F000000,D1 p94: btst #3,D0 beq.s p98 ori.l #0xF0000000,D1 p98: move.l D1,8(newscr) move.l D1,168(newscr) move.l D1,328(newscr) move.l D1,488(newscr) clr.l D1 btst #4,D0 beq.s p910 move.l #0x000F0000,D1 p910: btst #5,D0 beq.s p920 ori.l #0x00F00000,D1 p920: btst #6,D0 beq.s p940 ori.l #0x0F000000,D1 p940: btst #7,D0 beq.s p9 ori.l #0xF0000000,D1 p9: move.l D1,(newscr) move.l D1,160(newscr) move.l D1,320(newscr) move.l D1,480(newscr) add.w #1,scrx } } } plot_A(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register long *newscr; if (gtia) return; while (count--) { newscr = (long *)scr_emul + mul40[scry] + (scrx<<1) ; asm { clr.l 4(newscr) ; clear bit planes 2 & 3 clr.l 12(newscr) clr.l 164(newscr) clr.l 172(newscr) clr.l 324(newscr) clr.l 332(newscr) clr.l 484(newscr) clr.l 492(newscr) move.b (data)+,D0 clr.l D1 btst #0,D0 beq.s pA1 move.l #0x000F0000,D1 pA1: btst #1,D0 beq.s pA2 ori.l #0x0000000F,D1 pA2: btst #2,D0 beq.s pA4 ori.l #0x00F00000,D1 pA4: btst #3,D0 beq.s pA8 ori.l #0x000000F0,D1 pA8: btst #4,D0 beq.s pA10 ori.l #0x0F000000,D1 pA10: btst #5,D0 beq.s pA20 ori.l #0x00000F00,D1 pA20: btst #6,D0 beq.s pA40 ori.l #0xF0000000,D1 pA40: btst #7,D0 beq.s pA ori.l #0x0000F000,D1 pA: move.l D1,(newscr) move.l D1,160(newscr) move.l D1,320(newscr) move.l D1,480(newscr) add.w #1,scrx } } } /* plot a GR.6 byte - just do two 6+ plots */ plot_B(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { if (gtia) return; plot_C (data,scry,scrx,count) ; plot_C (data,++scry,scrx,count) ; } /* plot a GR.6+ byte */ /* for mode C (GR.6), each byte is 8 pixels, which appear as 8 2 pixel boxes */ /* Therefore 8 pixels are stored as 4 ints, with planes 0 and 1 in the */ /* first 2, and planes 2 and 3 in last 2. Since it is mono, planes 1 & 2 & 3 */ /* are clear and plane 0 gets the value of the byte stretched to a wide_byte */ plot_C(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register int text; register int *newscr; if (gtia) return; while (count--) { text = *data++; newscr = (int *) scr_emul + mul80[scry] + (scrx<<2) ; *newscr++ = wide_byte[text&0xFF] ; *newscr = 0 ; scrx++ ; } } plot_D(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register int text; register char *newscr; if (gtia) return; while (count--) { newscr = scr_emul + mul160[scry] + (scrx&1) + ((scrx&~1)<<2) ; asm { move.b (data)+,text move.b text,D1 andi.w #0x55,D1 move.w D1,D0 add.w D0,D0 or.w D1,D0 move.b D0,(newscr) move.b D0,160(newscr) andi.w #0xAA,text move.w text,D0 lsr.w #1,D0 or.w text,D0 move.b D0,2(newscr) move.b D0,162(newscr) add.w #1,scrx } } } plot_E(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register int text; register char *newscr; if (gtia) return; while (count--) { newscr = scr_emul + mul160[scry] + (scrx&1) + ((scrx&~1)<<2) ; asm { move.b (data)+,text move.b text,D1 andi.w #0x55,D1 move.w D1,D0 add.w D0,D0 or.w D1,D0 move.b D0,(newscr) andi.w #0xAA,text move.w text,D0 lsr.w #1,D0 or.w text,D0 move.b D0,2(newscr) add.w #1,scrx } } } /* plot a GR.8 byte */ plot_F(data, scry, scrx, count) register char *data; register int scry, scrx, count ; { register char *newscr; if (gtia) { while (count--) { newscr = scr_emul + mul160[scry] + (scrx&1) + ((scrx&~1)<<2) ; asm { clr.b (newscr) clr.b 2(newscr) clr.b 4(newscr) clr.b 6(newscr) move.b (data)+,D0 beq.s gtia0 btst #0,D0 beq.s gtia01 move.b #15,(newscr) gtia01: btst #1,D0 beq.s gtia02 move.b #15,2(newscr) gtia02: btst #2,D0 beq.s gtia04 move.b #15,4(newscr) gtia04: btst #3,D0 beq.s gtia08 move.b #15,6(newscr) gtia08: btst #4,D0 beq.s gtia10 ori.b #0xF0,(newscr) gtia10: btst #5,D0 beq.s gtia20 ori.b #0xF0,2(newscr) gtia20: btst #6,D0 beq.s gtia40 ori.b #0xF0,4(newscr) gtia40: btst #7,D0 beq.s gtia0 ori.b #0xF0,6(newscr) gtia0: add.w #1,scrx } } /* while */ } else { while (count--) { newscr = scr_emul + mul160[scry] + (scrx&1) + ((scrx&~1)<<2) ; asm { move.b (data)+,D0 not.w D0 move.b D0,(newscr) move.w #~0,D0 move.b D0,2(newscr) clr.b 4(newscr) clr.b 6(newscr) add.w #1,scrx } } /* while */ } /* if gtia */ } int (*do_plot[16])() = { plot_0, plot_1, plot_2, plot_3, plot_4, plot_5, plot_6, plot_7, plot_8, plot_9, plot_A, plot_B, plot_C, plot_D, plot_E, plot_F } ; do_display() { /* redraw the entire screen - does not clear status bytes - just sets them */ register char *mdlptr ; /* pointer to current byte in dlist */ register char *pstat; DL *qdl=dlBlocks; int old_mode=-1; unsigned d_loc = 0 ; /* address of start of scan line */ register int opc, /* current byte of dl */ h_byt, scan_line = 0, /* current scan line */ antic_mode ; if (!gtia) plot_1 (0,200); /* clear any garbage out of bit planes 2 and 3 */ qdl->mode=-1; mdlptr = mem+dl; do { opc = *mdlptr++ & 0x7F ; /* skip first 24 lines */ } while (opc==112) ; mdlptr-- ; do { stat[(int)(mdlptr-mem)] = 64; /* set status byte of dl byte */ antic_mode = (opc = *mdlptr++ & 0x4F) & 0x0F ; if (antic_mode>1) { if (opc&64) { d_loc=(unsigned)(*mdlptr)+((unsigned)(*(mdlptr+1))<<8) ; stat[(int)(mdlptr++ -mem)] = 64; stat[(int)(mdlptr++ -mem)] = 64; if (antic_mode==old_mode) old_mode=999; /* force a new DL */ } (*do_plot[antic_mode])(mem+d_loc,scan_line,0,phor_bytes[antic_mode]); h_byt=phor_bytes[antic_mode]-1; pstat=&stat[d_loc]; { asm { loop_DD: move.b (pstat)+,D0 bne.s no_stat move.b #65,-1(pstat) no_stat: dbf h_byt,loop_DD } } /* for loop */ if (antic_mode!=old_mode) { if (old_mode!=-1) qdl++; old_mode=antic_mode; qdl->mode = antic_mode; qdl->height = scan_table[antic_mode]; qdl->width = phor_bytes[antic_mode]; qdl->block_size = 0; qdl->start=d_loc; qdl->scan=scan_line; } qdl->block_size += phor_bytes[antic_mode]; d_loc += phor_bytes[antic_mode] ; scan_line += scan_table[antic_mode] ; } else if (antic_mode==1) plot_0 (scan_line++,1) ; else { plot_0(scan_line,(opc>>4)+1) ; if (old_mode!=0) { if (old_mode!=-1) qdl++; old_mode=0; qdl->mode = 0; } scan_line += (opc>>4)+1 ; } } while (opc != 65 && scan_line<196) ; if (scan_line<199) plot_0(scan_line,200-scan_line); (++qdl)->mode=-1; fRedraw=FALSE; } do_byte(loc) /* redraw one byte on the screen */ register unsigned loc ; { register int antic_mode ; register unsigned int offset; register int scan_line; /* current scan line */ register DL *qdl=dlBlocks; while ((antic_mode = qdl->mode) != -1) { if (antic_mode!=0) if (((offset=loc-(unsigned)(qdl->start))block_size)) { scan_line = qdl->scan + ((offset)/qdl->width)*qdl->height; (*do_plot[antic_mode])(mem+loc,scan_line,offset%qdl->width,1); } ++qdl; } } /* Clear out all status bytes that refer to the screen. About to redraw */ /* It works by traversing the DL structures and clearing the status bytes */ /* of all the blocks. A lot faster than the following code: */ /* for (ea=0; ++ea;) if (stat[ea]&64) stat[ea]=0; */ clear_disp() { register int cb; register DL *qdl=dlBlocks; register char *pstat; while (qdl->mode != -1) { if (qdl->mode==0) { qdl++; continue; } cb = qdl->block_size -1; pstat = &stat[qdl->start]; asm { loop_clear: move.b (pstat)+,D0 ; get a status byte cmpi.b #65,D0 ; is it a screen status byte bne.s no_clear ; no clr.b -1(pstat) ; otherwise clear it no_clear: dbf cb,loop_clear ; while cb-- } qdl++; } dlBlocks[0].mode=-1; } do_color (ea, byt) unsigned int ea, byt ; { register int temp=*(rainbow+(byt&~1)); if (ea==53274) *(int *)0xFFFF8240L=temp; else *(int *)(0xFFFF8240L + (long)((ea-53269)<<1))=temp; } do_colors (ea, byt) register unsigned int ea, byt ; { register char *rgch = shadows; register int i; byt &= 254; switch (gtia) { default: /* normal mode */ if (ea==712) *rgch=byt; else if (ea>707) rgch[ea-707]=byt; break; case 0x80: /* GR.10 mode */ rgch[ea-704]= byt; break; case 0x40: /* GR.9 (16 shades) */ if (ea==712) { byt &= 0xF0; for (i=0; i<16; i++) { *rgch++ = byt++; } } break; case 0xC0: /* GR.11 (16 colors) */ if (ea==712) { byt &= 0x0F; for (i=0; i<16; i++) { *rgch++ = byt; byt += 16; } } break; } } do_chset() { register int num8, old ; register char *pchset ; pchset = mem + (unsigned)(*(mem+756))*256 ; for (num8=0 ; num8<1024; num8++) { old = *pchset++ ; norm_font[num8] = old ; norm_font[num8+1024] = ~old ; wide_font[num8] = wide_byte[old] ; wide_font[num8+1024] = ~wide_byte[old] ; } if (dma) fRedraw=TRUE; } /* these two routines nuked when put as inline code. WHY??????? arghhh */ do_open() { char stat; int cch, iocb, iocb16, hand; char ch, aux1, aux2; unsigned int vector; iocb16 = (unsigned) x ; iocb = iocb16/16; vector = (unsigned)mem[0x344+iocb16] + (unsigned)mem[0x345+iocb16]*256; aux1 = mem[0x34A+iocb16]; stat=146 ; cch=0; /* Parse over the "Dn:" which leaves just the filename */ while (*(mem+vector++)!=':') { if (++cch>2) goto Dopen_exit; } cch=0; do { ch = *(mem+vector++); filename[cch++]=ch; } while (cch<15 && ch>32 && ch<91) ; filename[--cch]=0; /* Now check for the special case where the use wants a disk directory. */ /* Open a file _.DIR and stuff a DOS 2.0 type directory listing into it. */ if (aux1==6) { hand = Fcreate("_.DIR",0); Directory(filename,hand); Fclose(hand); hand = Fopen("_.DIR",0); } else if (aux1&4) hand = Fopen(filename,0); else hand = Fcreate(filename,0); if (hand<0) { if (hand==-33) stat = 170 ; else stat=165; } else { stat = 1 ; DOS_hand[iocb]=hand; DOS_mode[iocb]=aux1; } Dopen_exit: mem[0x4c]=stat; y=stat; } do_put() { char stat; int iocb, iocb16, hand; char ch; unsigned cch, vector; ch=a; iocb16 = (unsigned) x ; iocb = iocb16/16; vector = (unsigned)mem[0x24] + (unsigned)mem[0x25]*256; cch = (unsigned)mem[0x28] + (unsigned)mem[0x29]*256; stat=135 ; if (DOS_mode[iocb]&4) goto Dput_exit; /* read only */ hand=Fwrite (DOS_hand[iocb],(long)cch,mem+vector) ; if (hand<0) stat=163; else { mem[0x24]+=mem[0x28]; /* increment buffer pointer */ mem[0x25]+=mem[0x29]; mem[0x28]=1; /* decrement buffer length */ mem[0x29]=0; /* decrement buffer length */ stat = 1 ; } Dput_exit: mem[0x4c]=stat; y=stat; } do_get() { char stat; int iocb, iocb16, hand; char ch; unsigned cch, vector; int fTEXT; iocb16 = (unsigned) x ; iocb = iocb16/16; vector = (unsigned)mem[0x24] + (unsigned)mem[0x25]*256; cch = (unsigned)mem[0x28] + (unsigned)mem[0x29]*256; if (cch==0) cch=1; stat=131 ; if (DOS_mode[iocb]&8) goto Dget_exit; /* write only */ fTEXT = (mem[0x22]&2)?0:1; if (fTEXT) { while (cch) { hand=Fread (DOS_hand[iocb],1L,mem+vector) ; ch = *(mem+vector++); if (hand<0) stat=163; else if (hand==0) /* EOF */ stat=136; else { if (mem[0x24]++ ==0) /* increment buffer pointer */ mem[0x25]++; if (mem[0x28]-- == (char)255) mem[0x29]--; /* decrement buffer length */ stat = 1 ; } if (hand<=0 || (ch == (char)155)) goto Dget_exit; } stat = 137; /* truncated record error */ } else { hand=Fread (DOS_hand[iocb],(long)cch,mem+vector) ; ch = *(mem+vector+cch-1); if (hand<0) stat=163; else if (hand==0) /* EOF */ stat=136; else { mem[0x24]+=mem[0x28]; /* increment buffer pointer */ mem[0x25]+=mem[0x29]; mem[0x28]=1; /* decrement buffer length */ mem[0x29]=0; /* decrement buffer length */ stat = 1 ; } } Dget_exit: mem[0x4c]=stat; y=stat; a=ch; } do_close() { char stat; int iocb16, iocb; iocb16 = (unsigned) x ; iocb = iocb16/16; Fclose(DOS_hand[iocb]); DOS_hand[iocb] = -1 ; stat = 1 ; Dclose_exit: mem[0x4c]=stat; y=stat; } #ifdef NEVER do_Eput() { register char *rmem = mem; register int crs_r=rmem[84]; register int crs_c=rmem[85]; register unsigned addr; register unsigned addr1; rmem[763]=a; /* if ESC flag is off, go handle special keys, else handle as text */ addr = (addr1 = (unsigned)(rmem[88]) + (((unsigned)(rmem[89]))<<8)) + crs_c + (crs_r<<3) + (crs_r<<5); if (a==155) { if (rmem[752]==0) { *(rmem+addr) ^= 128; do_byte(addr); } goto cr; } else /* normal char */ { switch (a&96) { case 0: a |= 64; break; case 32: a &= ~32; break; case 64: a ^= 96; } if ((stat[addr] & 79)==66) { *(rmem+addr) = a; do_byte(addr); } if (++crs_c >mem[83]) { cr: crs_c = mem[82]; if (++crs_r>23) crs_r = 0; } } rmem[84]=crs_r; rmem[85]=crs_c; rmem[86]=0; if (rmem[752]==0) { addr = addr1 + crs_c + (crs_r<<3) + (crs_r<<5); *(rmem+addr) ^= 128; do_byte(addr); } rmem[0x4C] = y = 1; } #endif /******** Sound routines *************************************************/ int NoiseOn[]={0xF7,0xEF,0xDF}; int NoiseOff[]={0x8,0x10,0x20}; int ToneOn[]={0xFE,0xFD,0xFB}; int ToneOff[]={0x01,0x02,0x04}; /* This routine emulates the Atari 800 SOUND 0,0,0,0 command */ Sound(channel,freq,dist,vol) register int channel,freq,vol; int dist; { register int old7; channel %= 3; /* mask all values to make them legal */ freq &= 0xFF; dist &= 0x0E; vol &= 0xF; /* ST uses 12 bits. The 800's 8 bits maps to bits 10..3 xxxx0ffffffff000 */ Giaccess(freq<<2,0x80+channel+channel); /* fine tune */ Giaccess(freq>>6,0x81+channel+channel); /* coarse tune */ /* stuff volume */ Giaccess(vol,0x88+channel); /* do distortion */ old7=Giaccess(0,0x7); if(freq) { if ((dist&10)==10) { /* pure tones */ old7 |= NoiseOff[channel]; old7 &= ToneOn[channel]; } else { /* noise */ old7 |= ToneOff[channel]; old7 &= NoiseOn[channel]; Giaccess(dist<<4,0x86); } } else { /* if freq==0, shut down channel */ old7 |= NoiseOff[channel]; old7 |= ToneOff[channel]; } Giaccess(old7,0x87); } /************ joystick handling routines ************************************/ anotherdummy() /* a dummy routine. Should never be called */ { asm { JoyOn: move.w #0x12,-(A7) move.w #4,-(A7) move.w #3,-(A7) trap #13 addq.l #6,A7 lea Joy0(PC),A3 move.w #0,(A3) ; clear both sticks move.w #34,-(A7) trap #14 ; Kbdvase call addq.l #2,A7 move.l D0,A0 lea SaveStick(PC),A3 move.l 24(A0),(A3) ; joystick is the 7th vector lea Stick(PC),A3 move.l A3,24(A0) ; install our handler move.w #0x14,-(A7) move.w #4,-(A7) move.w #3,-(A7) trap #13 addq.l #6,A7 rts Stick: move.l A1,-(A7) ; skip the formalities, just read both sticks lea Joy0(PC),A1 move.b 1(A0),(A1)+ move.b 2(A0),(A1) move.l (A7)+,A1 rts JoyOff: move.w #0x1a,-(A7) move.w #4,-(A7) move.w #3,-(A7) trap #13 addq.l #6,A7 ; disable Joysticks move.w #34,-(A7) trap #14 addq.l #2,A7 move.l D0,A0 move.l SaveStick(PC),24(A0) ; restore the old vector move.w #0x8,-(A7) move.w #4,-(A7) move.w #3,-(A7) trap #13 addq.l #6,A7 rts SaveStick: dc.l 0 Joy0: dc.b 0 Joy1: dc.b 0 /*********spill over into VBI stuff ******************************/ VBI: move.l RegA4(PC),A4 ; now we can access C globals lea RegA7(PC),A0 ; this saves the stack for sure move.l A7,(A0) move.l mem(GLOBAL),A0 ; get pointer to byte 0 move.l A0,A1 adda.l #65536L,A1 ; A1 points to end of memory addq.b #1,20(A0) bne check_critic addq.b #1,77(A0) ; attract mode addq.b #1,19(A0) bne.s check_critic addq.b #1,18(A0) check_critic: tst.b 66(A0) ; did someone set the critical flag? bne exitVBI do_stick: move.b Joy1(PC),D0 ; joystick-only port is stick 0 move.b D0,D1 not.w D0 andi.w #15,D0 move.b D0,632(A0) ; stick(0) shadow move.b D0,D2 lsl.w #8,D2 move.b D0,634(A0) ; stick(2) shadow btst #7,D1 seq D0 andi.w #1,D0 move.b D0,644(A0) ; strig(0) shadow move.b D0,646(A0) ; strig(2) move.b D0,53264(A1) ; strig(0) hardware move.b D0,53266(A1) move.b Joy0(PC),D0 ; mouse port is really stick 1, not 0 move.b D0,D1 not.w D0 andi.w #15,D0 move.b D0,633(A0) ; stick(1) move.b D0,635(A0) ; stick(3) move.b D0,D2 move.w D2,54016(A1) ; stick(0) and stick(1) hardware move.w D2,54018(A1) ; stick(2) and stick(3) hardware btst #7,D1 seq D0 andi.w #1,D0 move.b D0,645(A0) ; strig(1) move.b D0,647(A0) ; strig(3) move.b D0,53265(A1) ; strig(1) hardware move.b D0,53267(A1) ; decrement system timers and set flags do_timers: move.w #4,D1 ; 5 system timers dt1: move.w 536(A0),D0 beq.s dt3 subi.w #0x0100,D0 ; decrement lo byte cmp.w #255,D0 bgt.s dt2 subi.w #1,D0 ; decrement hi byte dt2: move.w D0,(A0)+ dt3: dbf D1,dt1 exitVBI: lea sysvbl(PC),A0 lea pemul(PC),A1 move.l A0,(A1) ; change dispatch vector to point to VBI move.l RegA7(PC),A7 ; restore the stack pointer before rts ; we leave from the vbi RegA4: dc.l 0 RegA7: dc.l 0 } } VBIon() { int queue,i; asm { lea RegA4(PC),A0 move.l A4,(A0) move.l #0x456,A0 move.l (A0),IntrptPtr(A4) } queue=*(int *)0x454L; IRet=0; for(i=0;i42) && (xcoord<=207) ) { spriteptr=qP[ip]+32; /* start=32, first 31 lines not used */ bits = (xcoord & 7)<<1; /* xbit, only even */ asm { /* lea wide_byte(A4),A1 ; pointer to double-size bytes move.w mdPMG(GLOBAL),D2 ; type of PMG display beq exit_PMG move.w byte(LOCAL),D1 ; graphics data moveq #0,clip ; default: no clipping move.w xcoord,D0 add.w D0,D0 ; double for 2-pixel movement sub.w #96,D0 ; trim off excess bpl.s positive ; if positive, no min x clipping moveq #-1,clip ; mark clipping on x moveq #-8,D0 ; make x coord minimum of zero bra.s out1 ; and skip this other stuff positive: cmpi.w #200,xcoord ; see if off the right edge blt.s fixxcoord ; no, so modify x for lookup moveq #1,clip ; yes, so set clipping flag fixxcoord: lsr.w #1,D0 ; divide by 2 to get byte address andi.w #0xFFF8,D0 ; and make sure it is even words out1: adda.w D0,page ; add x offset to screen move.l page,A0 ; A0 is pointer to 2nd plane adda.w plane0(LOCAL),page adda.w plane1(LOCAL),A0 move.w #199,D3 ; counter: 200 lines loop: moveq #0,D0 move.b D1,D0 btst #2,D2 beq.s loop2 move.b (spriteptr)+,D0 ; get image byte loop2: beq.s noplot ; don't plot empty bytes add.w D0,D0 ; double it to access tables move.w 0(A1,D0),D0 ; D0 now holds proper image byte swap D0 ; move image into high word lsr.l bits,D0 ; now shift image to proper position cmpi.w #1,clip ; clipping right edge? beq.s lowword ; if yes, then branch over this or.w D0,8(page) ; runoff image to 2nd word, plane 0 or.w D0,8(A0) ; and also plane 1 lowword: cmpi #-1,clip ; clipping left edge? beq.s noplot ; if yes, then branch over this swap D0 ; get original image, also shifted or.w D0,(page) ; stuff that in position, plane 0 or.w D0,(A0) ; and plane 1 noplot: lea 160(page),page ; no matter what, point to next line lea 160(A0),A0 dbf D3,loop ; count down all 200 lines exit_PMG: nop */ } } return; asm { w_PMB: ; location 54279 SWAP DBUS MOVE.L REGEA,REGMEA move.b (REGMEA),REGEA cmp.b DBUS,REGEA beq w_PMB_exit move.b DBUS,pmbase(GLOBAL) ; write to high byte SAVEREGS } { int i; pmbase &= ~255; /* clear out low byte */ if (mem[559] & 16) { qM = mem + 768L + (unsigned)pmbase; qP[0] = qM + 256L; qP[1] = qM + 512L; qP[2] = qM + 768L; qP[3] = qM + 1024L; } else { qM = mem + 384L + (unsigned)pmbase; qP[0] = qM + 128L; qP[1] = qM + 256L; qP[2] = qM + 384L; qP[3] = qM + 512L; } for (i=0; i<4; i++) hposM[i] = hposP[i] = grafP[i] = 0; grafM = 0; } asm { LOADREGS w_PMB_exit: DISPATCH w_gP: ; location 53261 SWAP DBUS MOVE.b DBUS,a(GLOBAL) andi.w #3,REGEA MOVE.w REGEA,ea(GLOBAL) SAVEREGS } { int i=ea; if (grafP[i] != a) { grafP[i] = a; if (mdPMG) drawPlayer(i); } } asm { LOADREGS DISPATCH } } /* end of _XATARI.C */ /*************************************************************************** XFORMER.C by Darek Mihocka (CIS: 73657,2714 GEnie: DAREKM) Additional programming by Ignac A. Kolenko Jr. and Barry Green Created: July 15, 1986 Last update: June 18, 1987 13:30 Coding convention used in this code: Code that's all bunched up like this: foo() { if (bar) { goo(); } } should be re-written as: foo() { if (bar) { goo(); } } For improved readability and easier debugging of complex expressions, variable names should start with the following prefixes: f - (flag) integer that can only have 2 values md - (mode) integer that can take on a few values b - byte ch - char w - signed integer u - unsigned integer l - long p - (near pointer) 16 bit pointer (not used, same as a q in this program) q - (far pointer) 32 bit pointer rgn - (range) a fixed array of n, where n is one of the above prefixes mpxy - (map) an array of type y that maps an x to a y st - (string) pointer to a character string, first byte is the length sz - (zero string) pointer to a null terminated string Follow these rules or forever write buggy code! This file contains no tabs cuz the editor I use expands tabs. ***************************************************************************/ #include #include #include "_xformer.h" /* defines and global vars */ #define MAXCOL 78 #define MAXROW 22 #define MAXBYTE 16 char strCR[3] = {'\n','\r',0 }; static char *hex= {"0123456789ABCDEF"} ; char buf[80] , /* monitor line input buffer */ ch , /* character at buf[tp] */ asc[17] , /* buffer for ASCII dump */ hardcopy=FALSE; /* if non-zero dumps to printer */ char *mem, /* 65536 bytes to simulate 6502 memory */ *stat, /* status bits for each byte */ *scr, /* pointer to start of screen */ *scr_emul, /* pointer to start of emulation screen */ *exitptr ; /* pointer to exit_emul */ int len, /* length of inputted line */ tp , /* pointer to current character in buf[] */ hand, /* disk handle */ fRainbow=FALSE, /* 128 colour on flag */ fCartA = FALSE, /* cartridge present flag */ fCartB = FALSE, /* cartridge present flag */ isread, /* read/write flag for opcodes */ mode ; /* screen rez */ int rgPalette[2][16] = {{0x006,0,0,0x557,0,0,0,0,0,0,0,0,0,0,0,0x557}}; unsigned int pc , /* program counter (16 bits) */ ea ; unsigned char a,x,y,sp,ir, p, fTrace ; int colours[16]; int fMON=FALSE; int fExec; /* TRUE to run binary loads */ struct DTA { /* for disk directories */ char reserved[21] ; char attrib ; int time, date ; long size ; char fname[11] ; } ioblock ; struct disk_info { long b_free,b_total,b_sec_siz,b_cl_siz ; } diskblock ; extern long mnemonics[] ; /*********************************************************************/ overlay "extra" draw_menu () { Setscreen(-1L,-1L,DISPMODE0); colors4(); CR; print (" ST XFORMER v 1.1 DOS MENU"); CR; CR; print (" A. DIRECTORY"); CR; print (" B. RUN CART."); CR; print (" L. BINARY LOAD "); CR; print (" M. RUN AT ADDR."); CR; print (" P. 6502 MONITOR");CR; print (" Q. Quit to Desktop"); CR; CR; } help () { print(" \033pCommand Summary for the 6502 Monitor\033q\n\r") ; CR ; print(" Syntax: ( all numbers are in hex )\n\r") ; print(" ssss - starting address eeee - ending address\n\r") ; print(" dddd - destination address nn - an 8 bit value\n\r") ; print(" [optional parameters are shown in brackets]\n\r") ; CR ; print( " : ssss nn [nn [nn [nn ...]]] - change memory starting from ssss\n\r") ; print(" B - coldstart the Atari 800\n\r") ; print(" D ssss [eeee] - display memory from ssss [to eeee]\n\r") ; print(" G ssss - start emulating at ssss \n\r") ; print(" H nn - nn is non-zero for hardcopy \n\r") ; print(" I [mask] - dIr of files on the disk\n\r") ; print(" L ssss [eeee] - disassemble from ssss [to eeee]\n\r") ; print(" M ssss eeee dddd - move memory block from ssss to dddd\n\r") ; print(" R[X] file - read binary file [and execute]\n\r") ; print(" S [ssss] - single step at [ssss] or pc\n\r") ; print(" T [ssss] - trace at [ssss] or pc\n\r") ; print(" V - view emulated screen display\n\r") ; print(" W ssss eeee file - write binary file from ssss to dddd\n\r") ; print(" X - exit to menu") ; } outchar(x) char x ; { Bconout (2,x) ; /* print to screen */ if ((hardcopy)&&(Bconstat(0))) Bconout (0,x) ; /* print to printer */ if ((Bconstat(2)!=0) && ((char)(Bconin(2))==' ')) Bconin(2); } put_line(lin) register char *lin ; /* write string to screen */ { register char c ; while (c=*lin++) put (c) ; } get_line(maxc) int maxc ; /* get line in buf[], set tp and len */ { long key ; /* scan code and character code returned by Bconin */ len = 0 ; /* initialize input line length to 0 */ LOOP { key = Bconin(2) ; /* get a key */ ch = (char) key ; /* isolate character code */ if (ch>='a' && ch<='z') ch -= 32 ; /* lowercase becomes uppercase */ if (ch>=' ' && ch <='_') { /* if it's printable */ put(ch) ; /* then print it and store it */ buf[len++] = ch ; } /* if Backspace, delete last */ if (ch==8 && len>0) { /* character and reduce buffer */ print("\b \b") ; len-- ; } if (len==0 && ch==0) { /* if special key */ ch = (char) (key>>16) ; /* get scan code */ if (ch==0x47) cls() ; /* is it Home? */ if (ch==0x62) help() ; /* is it Help? */ break ; /* break out of loop */ } /* stay in loop until buffer full or Return pressed */ if (len==maxc || ch==13 || ch=='\n' || ch == '\033') break ; } CR ; buf[len] = 0 ; /* terminate input line with a null character */ tp = 0 ; /* text pointer points to first character */ } skip_space () /* advance tp to point to non-space */ { while ((ch=buf[tp])==' ' && tp'9' && ch<'A') || (ch>'F')) && tp='0' && ch<='9') || (ch>='A' && ch<='F') ) && (digit++<2) ) { byte <<= 4 ; byte += (ch>='0' && ch<='9') ? ch-48 : ch-55 ; tp++ ; } return (byte) ; } unsigned int get_addr () { /* return 16 bit value at tp */ unsigned int addr=0, digit=0 ; skip_blank() ; while ( (((ch = buf[tp]) >='0' && ch<='9') || (ch>='A' && ch<='F')) && (digit++<4) ) { addr <<= 4 ; addr += (ch>='0' && ch<='9') ? ch-48 : ch-55 ; tp++ ; } return (addr) ; } /* disassemble #line commands starting at current pc */ disasm(line) int line ; { int bits, modes ; unsigned char opcode ; long crunch ; while (line--) { showpc() ; opcode = *(mem+pc) ; crunch = mnemonics[opcode] ; modes = crunch&0x0FL ; showhex(pc) ; put(' ') ; switch (modes) { case 0x00 : case 0x0A : print (" ") ; break ; case 0x01 : case 0x02 : case 0x03 : case 0x04 : case 0x05 : case 0x06 : case 0x0B : showhex(pc+1) ; print (" ") ; break ; case 0x07 : case 0x08 : case 0x09 : case 0x0C : showhex(pc+1) ; put(' ') ; showhex(pc+2) ; put(' ') ; break ; } for (bits=24 ; bits >0 ; bits -=8 ) { put((char)(crunch>>24)) ; crunch <<= 8 ; } put (' ') ; pc++ ; switch (modes) { case 0x00 : print (" ") ; break ; case 0x01 : print (" #$") ; showhex(pc++) ; print (" ") ; break ; case 0x02 : print(" $") ; showhex(pc++) ; print (" ") ; break ; case 0x03 : print (" $") ; showhex(pc++) ; print (",X") ; print (" ") ; break ; case 0x04 : print (" $") ; showhex (pc++) ; print (",Y") ; print (" ") ; break ; case 0x05 : print (" ($") ; showhex (pc++) ; print (",X)") ; print (" ") ; break ; case 0x06 : print (" ($") ; showhex (pc++) ; print ("),Y") ; print (" ") ; break ; case 0x07 : print (" $") ; showhex (pc+1) ; showhex (pc) ; print (" ") ; pc +=2 ; break ; case 0x08 : print (" $") ; showhex (pc+1) ; showhex (pc) ; pc +=2 ; print (",X") ; print (" ") ; break ; case 0x09 : print (" $") ; showhex (pc+1) ; showhex (pc) ; pc +=2 ; print (",Y") ; print (" ") ; break ; case 0x0A : print (" A") ; print (" ") ; break ; case 0x0B : print (" $") ; showaddr (pc + 1 + (int)((char)(*(mem+pc)))) ; print (" ") ; pc ++ ; break ; case 0x0C : print (" ($") ; showhex(pc+1) ; showhex(pc) ; put (')') ; print (" ") ; pc+=2 ; break ; } if (!fTrace) CR ; } } showreg() { print ("PC=") ; showpc() ; print ("A=") ; showbyte(a) ; print (" X=") ; showbyte(x) ; print (" Y=") ; showbyte(y) ; print (" S=") ; showbyte(sp) ; print (" P=") ; showbyte(p) ; print (" ") ; (p&NBIT) ? put('N') : put ('.') ; (p&VBIT) ? put('V') : put ('.') ; (p&BBIT) ? put('B') : put ('.') ; (p&DBIT) ? put('D') : put ('.') ; (p&IBIT) ? put('I') : put ('.') ; (p&ZBIT) ? put('Z') : put ('.') ; (p&CBIT) ? put('C') : put ('.') ; put (' ') ; } boot() { for (ea=0; ea<32767; mem[ea++]=0); pc = (*(mem+0xFFFD)*256)+(*(mem+0xFFFC)) ; /* RESET vector */ p &= ~BBIT ; emulate(0,0) ; colors4(); } /* routine to perform a JSR and come back on an RTS */ jsr(addr) unsigned int addr; { pc = addr; p &= ~BBIT ; mem[0x100|sp--] = 0xE4; mem[0x100|sp--] = 0x70; /* push blackboard vector on stack */ emulate(0,0) ; colors4(); } /* routine to single step, trace, or execute at current pc */ emulate (count, mode) int count, mode ; { unsigned int pctemp ; unsigned char ptemp ; long usp; Cursconf(0,0); switch (mode) { case 0 : /* regular emulation */ { static long RegA5; show_emul() ; colors16() ; usp = Super(0L) ; /* must go to supervisor mode */ *(char*)0x00000484L &= ~5; /* disable keyclick */ Super(usp) ; asm { move.l A5,RegA5(GLOBAL) /* probably not needed any more */ } IntOn(); /* turn on all interrupts */ usp = Super(0L) ; execute() ; Super(usp) ; IntOff(); /* turn off interrupts */ asm { move.l RegA5(GLOBAL),A5 } usp = Super(0L) ; *(char*)0x00000484L |= 5; /* enable keyclick */ Super(usp) ; show_scr() ; if (fMON) { showreg() ; CR ; } fTrace=0 ; } break ; case 1 : /* single step mode */ pctemp = pc ; /* remember pc */ fTrace=255 ; disasm(1) ; /* dissassemble current opcode */ pc = pctemp ; /* restore pc */ emulate(0,0) ; break ; case 2 : /* trace mode */ p &= ~BBIT ; while (count-- && !(p&BBIT)) emulate(0,1) ; break ; } Cursconf(1,0); } dos() { int key; boot(); draw_menu(); for(;;) { CR; print (" SELECT ITEM OR \033pRETURN\033q FOR MENU"); CR; CR; Cursconf(1,0); key = Bconin(2) & 0x5F; put(key); CR; switch(key) { default: draw_menu(); break; case 'A': print("DIRECTORY MASK: "); get_line(MAXCOL) ; /* get a line of input */ Directory(buf,0); break; case 'B': pc = 0xA000; /* ####### WRONG *******/ p &= ~BBIT ; emulate(0,0) ; break; case 'L': print("LOAD FILE: "); get_line(MAXCOL) ; /* get a line of input */ fExec=TRUE; Bload(buf); break; case 'M': print("RUN AT ADDRESS: "); get_line(MAXCOL) ; pc = get_addr(); p &= ~BBIT ; emulate(0,0) ; break; case 'P': mon(); break; case 'Q': return; } } } mon() /* the 6502 monitor */ { int quit=0 ; /* quit flag */ char com ; /* command character */ int digit, chptr, cntr ; /* temporary variables */ unsigned addr1, addr2, addr3, byt ; unsigned char header[6] ; Setscreen(-1L,-1L,DISPMODE1); fMON=TRUE; show_scr(); CR; Setcolor(0, 0x050); Setcolor(15, 0x777); print("6502 Monitor"); CR; Cursconf(1,0); do { print ("\n>") ; /* print prompt */ get_line(MAXCOL) ; /* get a line of input */ skip_space() ; /* skip any leading spaces */ com = buf[tp++] ; /* get command character */ if (com!='R') addr1 = get_addr() ; /* no numbers for R */ switch(com) { case '\000' : /* empty line redraws menu */ case ';' : /* comment is ignored */ break ; case 'X' : quit++ ; /* X to quit */ break ; case 'M' : pc = addr1 ; /* block memory move */ addr2 = get_addr() ; addr3 = get_addr() ; while (addr1<=addr2) *(mem+addr3++) = *(mem+addr1++) ; break ; case 'C' : pc = addr1 ; /* block memory compare */ addr2 = get_addr() ; addr3 = get_addr() ; while (addr1<=addr2) if (*(mem+addr3++) != *(mem+addr1++)) { print(" ("); showaddr(addr1-1); print(") "); showhex(addr1-1); print(" ("); showaddr(addr3-1); print(") "); showhex(addr3-1); CR; } break ; case ':' : pc = addr1 ; /* modify memory */ skip_blank() ; while (buf[tp] && (tp=32 && ch<=127) ? ch : '.' ; showhex(pc++) ; put (' '); } else { asc[cntr] = ' ' ; print (" ") ; } } for (cntr=0; cntr0x000F) ; break ; case 'L' : if (len>1) pc = addr1 ; /* disassemble memory */ disasm(MAXROW-4) ; break ; case 'T' : if (len>1) pc = addr1 ; /* trace execution */ p &= ~BBIT ; emulate(MAXROW-4,2) ; break ; case 'B' : boot(); break ; case 'G' : pc = addr1 ; /* execute 6502 code */ p &= ~BBIT ; emulate(0,0) ; break ; case 'S' : if (len>1) pc = addr1 ; /* step execution */ emulate(0,1) ; break ; case '.' : showreg() ; /* dump registers */ break ; case 'I' : skip_space(); CR; Directory(&buf[2],0); CR; break ; case 'W' : pc = addr1 ; /* write memory to binary file */ addr2 = get_addr() ; if (addr2 < addr1) break ; skip_space() ; if (tp==len) break ; strncpy (&buf[len],".bin",5) ; /* append to filename */ if ((hand=Fcreate (&buf[tp],0))<0) break ; print ("Writing...") ; CR ; header[0] = header[1] = 255 ; header[2] = addr1 ; /* lo - hi format */ header[3] = addr1>>8 ; header[4] = addr2 ; header[5] = addr2>>8 ; if (Fwrite (hand,6L,header)<0) { print ("Write error") ; CR ; goto err_close ; } if (Fwrite (hand,(long)addr2-(long)addr1+1L, mem+addr1)<0) print ("Write error") ; CR ; err_close: Fclose (hand) ; break ; case 'R' : if (buf[tp]=='X') { fExec=TRUE; tp++; } else fExec=FALSE; skip_space() ; /* read binary file to memory */ if (tp==len) break ; strncpy (&buf[len],".bin",5) ; Bload(&buf[tp]); break; case 'H' : hardcopy = addr1 ; /* set hardcopy on/off flag */ break ; case 'V' : show_emul() ; /* view virtual machine screen */ getchar() ; show_scr() ; break ; default : put(BEL) ; /* otherwise beep */ } } while (!quit) ; Setscreen(-1L,-1L,DISPMODE0); fMON=FALSE; show_scr(); Cursconf(0,0); } /* Binary load a file ***************************************** -szName points to GEMDOS compatible name returns: 1 - OK 0 - error */ Bload(szName) char *szName; { register unsigned addr1, addr2 ; unsigned char header[6] ; register int cntr ; /* temporary variables */ if ((hand = Fopen (szName,0))<0) { print ("FILE NOT FOUND") ; CR ; goto Rclose ; } mem[0x2E0] = mem[0x2E1] = 0; /* clear RUN and INIT vectors */ mem[0x2E2] = mem[0x2E3] = 0; if (Fread (hand,6L,header)<0) { print ("READ ERROR") ; CR ; goto Rclose ; } if (header[1]&header[0] != 255) /* verify it's binary file */ { print ("NOT BINARY FILE") ; goto Rclose ; } addr1 = header[2] + (header[3] << 8) ; addr2 = header[4] + (header[5] << 8) ; if (Fread (hand,(long)addr2-(long)addr1+1L, mem+addr1)<0) { print ("READ ERROR") ; goto Rclose ; } if (fMON) { printf ("SEGMENT START: %4x END: %4x\n",addr1,addr2) ; fflush(stdout); } cntr=0; more_segs: header[0]=header[1]=255; if (Fread (hand,2L,header)<0) { print ("READ ERROR") ; goto Rclose ; } /* check if EOF reached */ if ((cntr++ == 2) || ((header[1]==26) && (header[0]==26)) || ((header[1]==0) && (header[0] == 0))) { Fclose (hand) ; if (fExec && (mem[0x2E0]|mem[0x2E1])) /* run location */ jsr((unsigned)mem[0x2E0] + (unsigned)(256*(unsigned)(mem[0x2E1]))); show_scr(); return; } if (header[1]&header[0] == 255) goto more_segs ; cntr=0; if (Fread (hand,2L,&header[2])<0) goto Rclose; addr1 = header[0] + (header[1] << 8) ; addr2 = header[2] + (header[3] << 8) ; if (Fread(hand,(long)addr2-(long)addr1+1L, mem+addr1)<0) { print ("READ ERROR") ; goto Rclose ; } if (fMON) { printf ("SEGMENT START: %4x END: %4x\n",addr1,addr2) ; fflush(stdout); } if (fExec && (mem[0x2E2]|mem[0x2E3])) /* initialize location */ { jsr((unsigned)mem[0x2E2] + (unsigned)(256*(unsigned)(mem[0x2E3]))); mem[0x2E2] = mem[0x2E3] = 0; show_scr(); } goto more_segs; Rclose: Fclose (hand) ; show_scr(); } StoreCols() { register cw=16; while (cw--) colours[cw] = Setcolor(cw,-1); } /* restore old colours */ RestoreCols() { register cw=16; while (cw--) Setcolor(cw,colours[cw]); } /* copy from pchFrom to pchTo and return pointer to byte after */ char *blit(pchFrom, pchTo) register char *pchFrom, *pchTo; { while (*pchFrom) *pchTo++ = *pchFrom++; return(pchTo); } /* copy ch to pchTo cb times and return pointer to byte after */ char *blitc(ch, pchTo, cb) register char ch; register char *pchTo; register unsigned int cb; { while (cb--) *pchTo++ = ch; return(pchTo); } showpc() { /* print out PC */ int bit ; for (bit = 12; bit>=0; bit-=4) put (hex[(pc>>bit)&0x0F]) ; print(": ") ; } showaddr(addr) unsigned int addr ; /* print 16 bit number */ { put (hex[addr>>12]) ; put (hex[(addr>>8)&0x0f]) ; put (hex[(addr>>4)&0x0f]) ; put (hex[addr&0x0f]) ; } showhex(addr) unsigned int addr ; /* print 8 bit number in memory */ { unsigned char byte ; byte = *(mem+addr) ; put (hex[byte>>4]) ; put (hex[byte&0x0f]) ; } showbyte(byte) unsigned char byte ; /* print 8 bit number */ { put (hex[byte>>4]) ; put (hex[byte&0x0f]) ; } show_emul() { /* display virtual video chip output */ long usp; Setscreen (scr_emul,scr_emul,-1) ; usp = Super(0L) ; *(char *)0xFFFF8260=DISPMODE0; Super(usp); colors16(); } show_scr() { /* display 6502 monitor or DOS output */ long usp; Setscreen (scr,scr,-1) ; usp = Super(0L) ; if (fMON) *(char *)0xFFFF8260=DISPMODE1; else *(char *)0xFFFF8260=DISPMODE0; Super(usp); colors4(); } cls() { put (27) ; put ('E') ; } colors4() { Setpalette(rgPalette[0]); } colors16() { Setpalette(rgPalette[1]); } /*************** Routines to do the rainbow title page *************/ #define HBLANK 0x68L #define VBLANK 0x70L extern hblank(), old_hblank(); extern vblank(), old_vblank(); extern where_col(); ignore() { asm { vcount: nop nop hcount: nop hblank: movem.l D0/A0,-(A7) clr.l D0 move.b 0x8207,-(A7) move.w (A7)+,D0 move.b 0x8209,D0 divu #20,D0 add.w vcount(PC),D0 lsr.w #3,D0 andi.l #254,D0 move.l where_col(PC),A0 move.w 0(A0,D0.L),D0 move.w D0,0x8246 movem.l (A7)+,D0/A0 rte old_hblank: dc.l 0 nop where_col: dc.l 0 vblank: movem.l D0/A0/A1,-(A7) lea hcount,A1 lea vcount,A0 move.w (A0),D0 addq.w #7,D0 move.w D0,(A0) move.w D0,(A1) movem.l (A7)+,D0/A0/A1 old_vblank: jmp 0xfff00666L ; old_vblank } } color_on() { long usp; if (fRainbow) return; usp=Super(0L); asm { lea rainbow(GLOBAL),A0 lea where_col,A1 move.l A0,(A1) lea old_vblank,A0 move.l VBLANK,2(A0) lea vblank,A0 move.l A0,VBLANK lea old_hblank,A0 move.l HBLANK,(A0) lea hblank,A0 move.l A0,HBLANK andi.w #0xF0FF,SR ori.w #0x0100,SR } Super(usp); fRainbow=TRUE; } color_off() { long usp; if (!fRainbow) return; usp=Super(0L); asm { andi.w #0xF0FF,SR ori.w #0x0300,SR lea old_hblank,A0 move.l (A0),HBLANK lea old_vblank,A0 move.l 2(A0),VBLANK } Super(usp); fRainbow=FALSE; } scroll(qscr,qFrom,cScan) register char *qscr; register char *qFrom; register int cScan; { asm { subq.w #1,cScan LOOPscroll: move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ move.l (qFrom)+,(qscr)+ dbf cScan,LOOPscroll } } fade_out() { long qScreen; int count; qScreen = Physbase(); for (count=0; count<199; count++) { Setcolor(3, 199-count); Sound(2,210-count,10,15); scroll(qScreen, qScreen+160, 398); } Sound(0,8,10,15); Sound(2,9,10,15); } /********* good a place as any to put a disk directory routine *******/ Directory(mask,handle) register char *mask; int handle; { register struct DTA *dta ; register char *pch; register int ok ; register long fre_by; int cSecs; char DOSbuf[20]; if (!(*mask)) mask = "*.*"; ok = Fsfirst (mask,17) ; dta = (struct DTA *) Fgetdta(); while (ok >= 0) { blitc(' ',DOSbuf,17); pch = &dta->fname[0]; if (!(*pch=='.' || *pch=='/' || *pch=='_')) { int cb=0; if (dta->attrib & 1) DOSbuf[1] = '*'; while ((cb<8) && (*pch) && (*pch!='.')) { DOSbuf[cb++ +2] = *pch++; } cb=8; while (*++pch) { DOSbuf[cb++ +2] = *pch; } cSecs = (int)((dta->size+124L)/125L); DOSbuf[14] = '0' + (cSecs/100); DOSbuf[15] = '0' + ((cSecs/10)%10); DOSbuf[16] = '0' + (cSecs%10); if (handle) { DOSbuf[17] = 155; Fwrite (handle,18L,DOSbuf); } else { DOSbuf[17]=0; print(DOSbuf) ; CR; } } ok = Fsnext () ; } Dfree (&diskblock,0) ; fre_by = (diskblock.b_sec_siz * diskblock.b_cl_siz * diskblock.b_free) ; cSecs = (int)((fre_by+127L)/128L); if (cSecs>999 || cSecs<0) cSecs=999; DOSbuf[0] = '0' + (cSecs/100); DOSbuf[1] = '0' + ((cSecs/10)%10); DOSbuf[2] = '0' + (cSecs%10); blit(" FREE SECTORS",&DOSbuf[3]); if (handle) { DOSbuf[16] = 155; Fwrite (handle,17L,DOSbuf); } else { DOSbuf[16]=0; print(DOSbuf) ; CR; CR; } } /***************************************************************************/ overlay "main" main() { appl_init(); StoreCols(); cls(); scr = (char *) Physbase() ; /* find screen memory pointer */ scr_emul = scr - 32768L ; mem = scr - 32768L - 65536L; /* must be on a 64K boundary!!!! */ stat = mem - 65536L + 32768L ; /* use relative addressing */ mode = Getrez(); /* get current screen resolution */ if (mode==2) { form_alert(1,"[0][ Works only | in color ][ SORRY! ]") ; exit(0) ; } { /* load the operating system */ int hand ; char *qch; if ((hand=Fopen ("_*.OSB",0))<0) { form_alert(1,"[0][ _*.OSB file | missing! ][ Read docs! ]"); exit(0) ; } if (((Fread (hand,7174L,mem+0xE400L-6L))<0) || (*(mem+0xE400L-6L) != -1)) { form_alert(1,"[0][ _*.OSB file | invalid! ][ Read docs! ]"); exit(0) ; } Fclose (hand) ; if ((hand=Fopen ("_*.FNT",0))<0) { form_alert(1,"[0][ _*.FNT file | missing! ][ Read docs! ]"); exit(0) ; } if (((Fread (hand,1030L,mem+0xE000L-6L))<0) || (*(mem+0xE000L-6L) != -1)) { form_alert(1,"[0][ _*.OSB file | invalid! ][ Read docs! ]"); exit(0) ; } Fclose (hand) ; if ((hand=Fopen ("_*.FP",0))<0) { form_alert(1,"[0][ _*.FP file | missing! ][ Read docs! ]"); exit(0) ; } if (((Fread (hand,2054L,mem+0xD800L-6L))<0) || (*(mem+0xD800L-6L) != -1)) { form_alert(1,"[0][ _*.OSB file | invalid! ][ Read docs! ]"); exit(0) ; } Fclose (hand) ; if ((hand=Fopen ("_*.CTA",0))>=0) { if (((Fread(hand,8198L,mem+0xA000L-6L))<0) || (*(mem+0xA000L-6) != -1)) { form_alert(1,"[0][ cart B | invalid! ][ Read docs! ]"); exit(0) ; } else fCartA = TRUE; } Fclose (hand) ; if ((hand=Fopen ("_*.CTB",0))>=0) { if (((Fread(hand,8198L,mem+0x8000L-6L))<0) || (*(mem+0x8000L-6) != -1)) { form_alert(1,"[0][ cart A | invalid! ][ Read docs! ]"); exit(0) ; } else fCartB = TRUE; } Fclose (hand) ; } InitMachine(); /* set up memory, initialize all arrays, etc */ fMON = TRUE; /* force 80 columns */ Setscreen(-1L,-1L,DISPMODE1); show_scr(); fMON = FALSE; Setcolor(0, 0x000); print(" ST LOG presents:"); CR; CR; print(" ST XFORMER v1.11 Atari 800 simulator by Darek Mihocka"); CR; CR; print (" OS and BASIC (c) 1978,1979 by Atari Corp., all rights reserved."); CR; print (" Used with permission."); CR; CR; print (" Fastchip by Charles Marslett & alternate OS used with permission:"); CR; print (" (c) Newell Industries, 602 E. HWY 78, Wylie, TX 75098"); CR; CR; print (" Designed and programmed by Darek Mihocka."); CR; print (" Additional programming by Ignac A. Kolenko Jr. & Barry Green."); CR; print (" Report bugs and improvements to DAREKM on GEnie."); CR; print (" Testing hardware supplied by Carmine Caccioppoli."); CR; print (" Thanks to John Nagy, George and Jim Adamson for their help."); CR; CR; print (" Development hardware supplied by:"); CR; print (" Xanth F/X, 14100 NE 20th #105, Bellevue, WA 98007"); CR; CR; if (!(fCartA|fCartB)) print (" NO CARTRIDGE PRESENT 48K RAM"); else if (!fCartB) print (" 8K CARTRIDGE PRESENT 40K RAM"); else print (" 16K CARTRIDGE PRESENT 32K RAM"); CR; CR; print (" Alt=BREAK F4=caps F5=inverse"); print (" F7..F9=START SELECT OPTION F10=RESET"); CR; CR; print (" Press any key to power up the Atari 800..."); color_on(); Sound(0,199,10,15); Sound(1,200,10,15); Bconin(2); color_off(); Setcolor(0,0); fade_out(); Sound(0,0,0,0); Sound(1,0,0,0); Sound(2,0,0,0); dos(); Setscreen(-1L,-1L,mode); RestoreCols(); appl_exit(); } /* end of _XFORMER.C */ /**************************************************************************** _XFORMER.H by Darek Mihocka (CIS: 73657,2714 GEnie: DAREKM) include file which declares all global variables used by the _X*.C files Last update: June 14, 1987 19:45 ****************************************************************************/ #define DISPMODE0 0 #define DISPMODE1 1 #define TRUE 1 #define FALSE 0 /* status bits of the P register: (6502) NV_BDIZC */ #define NBIT 0x80 #define VBIT 0x40 #define BBIT 0x10 #define DBIT 0x08 #define IBIT 0x04 #define ZBIT 0x02 #define CBIT 0x01 /* status bits of the CCR register: (68000) BDIXNZVC */ #define BITN 0x08 #define BITV 0x02 #define BITB 0x80 #define BITD 0x40 #define BITI 0x20 #define BITZ 0x04 #define BITC 0x01 #define BITX 0x10 #define DBUS D0 #define IR D0 #define REGA D1 #define REGX D2 #define REGY D3 #define REGSP D4 #define REGPC D5 #define REGST D6 #define REGEA D7 /* pointer to mem[ea] and otherwise all purpose register*/ #define REGMEA A0 /* constant pointer to vector table */ #define REGOPS A1 /* pointer to mem[pc] */ #define REGMPC A2 /* pointer to stat[0] */ #define REGSTAT A3 /* pointer to global C variables */ #define GLOBAL A4 /* A5 no longer used. I found out the hard way (bombs) that Megamax uses it! */ /* pointer to the frame (local variables) */ #define LOCAL A6 /* the stack pointer, for some reason, not defined by Megamax */ #define SP A7 #define SETREAD addq.w #1,isread(A4) #define SETWRITE clr.w isread(A4) #define TESTWRITE tst.W isread(A4) /* quickly save and restore 6502 variables */ #define SAVEREGS movem.l D1-D7/A0-A3,-(SP) #define LOADREGS movem.l (SP)+,D1-D7/A0-A3 /* set the flags right after a register is loaded */ #define FLAGS move.w SR,DBUS \ and.b #(BITN|BITZ),DBUS \ and.b #~(BITN|BITZ),REGST \ or.b DBUS,REGST /* finished executing an opcode, check VBI flag and go to dispatch routine */ #define DISPATCH move.l pemul(PC),REGMEA \ jmp (REGMEA) /* some not too incredibly useful macros */ #define LOOP while(1) #define put(x) outchar(x) #define CR print(strCR) #define BEL '\007' #define print(x) put_line(x) extern int isread, /* read/write flag for special opcodes */ mdRez; /* screen resolution */ extern char *mem, /* 65536 bytes to simulate 6502 memory */ *stat, /* status bits for each byte of 6502 memory */ *scr, /* pointer to start of title/debugger screen */ *scr_emul; /* pointer to start of emulation screen */ extern unsigned int pc, /* 6502 program counter (16 bits) */ ea; /* used for effective address calculations */ extern unsigned char a,x,y,sp,ir,p, /* 6502 registers */ fTrace ; /* trace flag */ extern int fVBI; /* set when a 6502 VBI should occur */ extern int rainbow[128]; /* 8 bit color translation table */ extern int fCartA,fCartB; /* flags set if cartriges loaded */ extern rgPalette[2][16]; extern int (*vec_6502[256])(), /* pointer to 256 opcode routines D flag =0 */ (*dec_6502[256])(); /* pointer to 256 opcode routines D flag =1 */ extern pemul(), /* pointer to emul() */ emul(), /* main dispatch routine */ exit_emul(), /* exit routine to go back to C */ emul_serv(), /* dispatch routine for non-zero status bytes */ sysvbl(); /* 8-bit system VBI emulation routine */ /* Joystick variables and routines */ extern Joy0(),Joy1(),JoyOn(),JoyOff(),oldStick(),Stick(); /* vertical blank interrupt variables and routines */ extern VBIon(),VBIoff(),RegA4(),VBI(); /* pointer to the keyboard routine in TOS */ extern oldKey(); /* tell Megamax that the emulation routines will be found in inline code: */ extern op00(), op01(), op02(), op03(), op04(), op05(), op06(), op07(), op08(), op09(),op0A(),op0B(), op0C(), op0D(), op0E(), op0F(), op10(), op11(), op12(), op13(), op14(), op15(), op16(), op17(), op18(), op19(), op1A(), op1B(), op1C(), op1D(), op1E(), op1F(), op20(), op21(), op22(), op23(), op24(), op25(), op26(), op27(), op28(), op29(), op2A(), op2B(), op2C(), op2D(), op2E(), op2F(), op30(), op31(), op32(), op33(), op34(), op35(), op36(), op37(), op38(), op39(), op3A(), op3B(), op3C(), op3D(), op3E(), op3F(), op40(), op41(), op42(), op43(), op44(), op45(), op46(), op47(), op48(), op49(), op4A(), op4B(), op4C(), op4D(), op4E(), op4F(), op50(), op51(), op52(), op53(), op54(), op55(), op56(), op57(), op58(), op59(), op5A(), op5B(), op5C(), op5D(), op5E(), op5F(), op60(), op61(), op62(), op63(), op64(), op65(), op66(), op67(), op68(), op69(), op6A(), op6B(), op6C(), op6D(), op6E(), op6F(), op70(), op71(), op72(), op73(), op74(), op75(), op76(), op77(), op78(), op79(), op7A(), op7B(), op7C(), op7D(), op7E(), op7F(), op80(), op81(), op82(), op83(), op84(), op85(), op86(), op87(), op88(), op89(), op8A(), op8B(), op8C(), op8D(), op8E(), op8F(), op90(), op91(), op92(), op93(), op94(), op95(), op96(), op97(), op98(), op99(), op9A(), op9B(), op9C(), op9D(), op9E(), op9F(), opA0(), opA1(), opA2(), opA3(), opA4(), opA5(), opA6(), opA7(), opA8(), opA9(), opAA(), opAB(), opAC(), opAD(), opAE(), opAF(), opB0(), opB1(), opB2(), opB3(), opB4(), opB5(), opB6(), opB7(), opB8(), opB9(), opBA(), opBB(), opBC(), opBD(), opBE(), opBF(), opC0(), opC1(), opC2(), opC3(), opC4(), opC5(), opC6(), opC7(), opC8(), opC9(), opCA(), opCB(), opCC(), opCD(), opCE(), opCF(), opD0(), opD1(), opD2(), opD3(), opD4(), opD5(), opD6(), opD7(), opD8(), opD9(), opDA(), opDB(), opDC(), opDD(), opDE(), opDF(), opE0(), opE1(), opE2(), opE3(), opE4(), opE5(), opE6(), opE7(), opE8(), opE9(), opEA(), opEB(), opEC(), opED(), opEE(), opEF(), opF0(), opF1(), opF2(), opF3(), opF4(), opF5(), opF6(), opF7(), opF8(), opF9(), opFA(), opFB(), opFC(), opFD(), opFE(), opFF(), op61dec(), op65dec(), op69dec(), op6Ddec(), op71dec(), op75dec(), op79dec(), op7Ddec(), opE1dec(), opE5dec(), opE9dec(), opEDdec(), opF1dec(), opF5dec(), opF9dec(), opFDdec() ; d:\atari800.em\_xformer.h d:\atari800.em\_xformer.c d:\atari800.em\_x6502.c d:\atari800.em\_xatari.c d:\megamax\mmlink.ttp d:_xformer.o d:_x6502.o d:_xatari.o -o d:_xformer.tos