@L|}5CD e l0C)HCCH VhhL,h `CmCDiD`  R@P1E  YE0@R !L!`h w 5h w :  m H  HHYi EFES S0  iFy֠ DDԙ`  /K)&IC &J$c (c)1983 Action Computer Services  B JKIHiDiELV`L=$} =$ BLV`JL$$l L$ &` Fj`8冨凪` $EӅӥ} $`ʆǪƩ Ɛee` $ƦʆǢ &Ɛeǐ % %L$ $'&&&8儨児}祂*L$&&*ń8&&L$ [%`hihiHHȱȱL$c !#3`}L$JJJJ`H $h`Hȩh r$L% {$L% %$L% -$L% 3$H8 }`HhHh _&L% BHI V䅠L% L& =$L%Ԇ ؠPIPP` } &P -$L% &L& &L& 'L&H- &8塪墨hL' 'L& &'L& &ȹP` }텠8堨塪 &芨Oȩ-`PP &P棩 Ѥģ0-ģ6000:,80H }& &ehe&eģ0ʥ 8堅塅`$ &&*i0:0i &Ʀ`¢ 护 }°ڱ%ȱ%E &L`(担CS R&L`(I 'L`(H (L`( &L`( &B V %NLMȑ}` MLN%B VL%S:)E:)[\ZUVT` )))` )L& )L& )L&) } ` )L& &%` 0d $ҥ `2)2ҩ`p`0)9)`@}0)ӈJJJJ)`Ѕ`ȱ`` *ȥ`HhƣĢ`}ƥĤ`Ѣ *`ȱѢĦ`膡``ťƤe8}夰L* Ƥ8`ŦeѠe桊L*,($, j. , 4X$ }840(Vt840@<$ @>$$|$$  0 the title page."){p&PrintE("Press any o00u}?++n to ++L ,++L,+Щ *+ *+ *Щ} * *+L{,++"/Э+L,"/Lp-+IL,>/L,./+++ m,*(m,8}񮅬񮅭8逅+ m+*(m+1+1+++ $ԭ++L5-"/`+ m+*(m}++q+qo) oЭ++`intL}- %w-w-)w-x- y-)w-`PL---)--L-}-L--+ m+*(m++q+q+ m+*(m+- &%ee`t")L0.(.(.)(.(. }-,.+.(.L.+ m+*(m+,.+. *L.8(.(.*.).+ m+*(m+8.ȱ..)}..*.L.rd+.m).,.m*.(.=+).*.L.`HE WEAPONS"m Poke(lm,4)mPosition(4,10)l&PrintE(" The} players are armed with")l*PrintE("three weapons: grenades, lasers,")l"PrintE("and electrified discs...")sl Wai}tKey()cl\lBorder()MlPosition(15,5)8lPrintE("THE DISC")L0 %.+L0`.)....8..+.}... .LX0..Э..+`. -//+ m+*(m+...L0..L0.m...L0}..L0.)+..I.//-....//-......+..Э..}+`range;")>1LG1 %0101)0101Lg181Lx101):1:1+8101 -=1<1718311171L1i71m61 }<1e=1i-8111m7121i71L18414101L14101L:2B1m41C1i:1 $91;1!}-81 91;1;1 Э5101Э5101+6101+` LL[2W2V2V2)V2V2L2V2iV2L28V2V2W2L2W2V2Т $"})`L2W2)W2W2V2Т $)``sL22 , L&L2S:2)I22 &`n3edL333)#}33x) JJ m3*(m3`PR3thLa3Q3Q3)Q3Q3x) mZ3*(m[3` cL33$}3330L3833`33`te: the laser")=L3 %33333333333m33m3m%}3m3i3i383333833i3i33m33m33m3 E)83333&}3m3 E)3m33m3833 E)83333833 E)3m33m33m3 E)8'}33333m3 E)3m33m3833 E)83333833 E)3333333(}3 3iiHH33 3hhŠ0L533338333333330L4`)L5 2 P)R )}* * &LE6$6 ?&55L6L`66^ R&5i% )L}66{ ?&5LQ6L*}6$6 ?&R *`L6 R * )L66 ?&L 7| Press Any Key |+}6 ?&L%77 ?&R * * )IL>7 *`L[7 5R * )L7 THE DUELISTS,}7s ?&  )L7Designed and Programmed by7 ?& &L7 John Thornburgh7 ?&L7 72337,2672 on CompuServe7 ?& -}6 5R * )L58This program was written8 ?&LQ8 in ACTION.8? ?& & &Ly8 ACTION is a trademark8a ?&.}L8 of8 ?&L8Action Computer Services.8 ?& & &L8Portions of this program8 ?&L9 are thus (c) 1984, /}ACS.8 ?& 6 5 )L*9PROGRAM CONTROL9 ?&R * )Le9 To start the game, press any9F ?&L9key at the0} end of these docs.9o ?& &L9 Once the game has begun, press9 ?&L9 'R' to return to the title page.9 ?&L :Press 1}any other key to pause9 ?&L6:play. Press again to restart.: ?& &Ld: The player controlling the red:C ?&L:dueli2}st uses joystick 1, while:n ?&L:the player controlling the gold: ?&L:side uses stick 2.: ?& 6 5 )L:GAM3}E OBJECTIVE: ?&R * )L7; THE DUELISTS is a two-player; ?&L_;contest where only those with;A ?&L;supe4}rior reflexes and tactics;i ?&L;can survive: it's kill or be; ?&L; killed. Each time your opponent; ?&L<dies, y5}ou score one point. The; ?&L.< first to score seven is declared< ?&LD< the victor.<8 ?& 6 5 )Li< THE WEAPON6}S<] ?&R *  )L< The players are armed with< ?&L< three weapons: grenades, lasers,< ?&L<and electrifi7}ed discs...< ?& 6 5 )L=THE DISC= ?&R * )LH= The disc is thrown in a=. ?&Lq=straight line b8}y pressing fire=R ?&L=while pushing the stick in the={ ?&L=desired direction. The disc= ?&L= travels until it co9}llides with a= ?&L>target or reaches its range;= ?&L=>then it teleports back into the> ?&Lg>player's hand for re:}use. Note:>G ?&L>the disc is only used if the>q ?&L>laser is not charged.> ?& 6 5 )L> THE LASER> ?&;}R * )L ? The laser is activated by> ?&L3?pressing fire while pushing the? ?&L]?stick in the desired dir<}ection.?= ?&L?The laser can cut through?g ?&L?anything on its way across the? ?&L?arena, but it can only be fire=}d? ?&L?when charged. (Note: the laser? ?&L)@ automatically recharges in a few@ ?&LQ@seconds after each use. Whe>}n@3 ?&Ly@a player's laser is ready, he@[ ?&L@will appear as a brighter shade@ ?&L@of his color than otherwise.)@?} ?& 6 5 )L@ THE GRENADES@ ?&R * )L(A A grenade is launched byA ?&LOAstanding perfectly stil@}l andA2 ?&LxApressing fire until you hear aAY ?&LA tiny beep. At the beep, releaseA ?&LAthe button and press the A}stickA ?&LAin the desired directionA ?&LB(quickly, or your player willA ?&L@Bblow himself up). The grenadeB!B} ?&LkB will fly a standard distance andBJ ?&LBexplode, killing anyone in itsBu ?&LBdeadly radius. Note: you haveBC} ?&LBonly two grenades per round (aB ?&L Cround ends when a point isB ?&LCscored.)C ?& 6 5 )LFCOTHER D}FEATURESC7 ?&R * )LC AN ENERGY FIELD drifts in aCb ?&LC!random pattern through the arena,C ?&LCkillE}ing whomever it contacts.C ?& &LD THE WALLS, which are differentC ?&L,Devery game, are electrified andD ?&L>DdF}eadly.D6 ?& &LhD GLOWING CRYSTALS appear atDK ?&LDrandom. If captured, they makeDr ?&LDa player advantageously G}smallD ?&LDfor the duration of a round.D ?& 6R * )LEE ?&L>E| H} |E$ ?&LbE| If you want to see |EH ?&LE| these docs again now |El ?&LE| press 'R'. Else, hit |E I}?&LE| any other key to begin|E ?&LE| the duel! |E ?&LF| |E ?&L:FJ}F ?& * )ILJF )Ih )I(LzF X7 *R * *`(BYTE dLF %FK}FiFFiFFiFFiFmFmF )eFF͜FL)GFF ԭFFЭFFF )LFFL}LFmFmFF *`ULGG 2 * )LsG THE DUELISTSGf F&LG by John ThornburghG ?& M}&LG" [space to play, return for docs]G R& ) ȩ ) ɩ ) ʩ ) FILGI L?HN} ) 2 P) P) X7 )`$C8$LOHIHHHKHJHHHzHIH{HzHJH{HKHLH5$JHKHLiH`OLH ,H͈HO}LHH -.HLH 6(+D D1 z- ą+ D1 z- }l+ D1 z-P}+ȩ D1`5)L6I2I1I *LSI Player A: IH R&1I2I &LI Player B: Ir R&1IiQ}2Ii &`$FD0$8AE6$CLI 2 P) P) P) E) 5) 5) 5) 5) s)IR}ILvJ(OO 3 3 3L}KIIL$KIͳIL!S}K< s)I8xI s)eIImII< s)I8xI s)eIImIIII E)II 5)II 5)II T}5)II 5)ILJL}KIͳIL}KP s)(eId s)eI s)IIII 3IL)K s)I sU})iII ͭILKII P)II P) LHI ܩ )I ݩ )ILK' LHII P)II P) LHV}I ܩ )I ݩ )8IIIILK: LH ) H`v_S+LJL %CLDLiELiCL -. CL+CL++W}CL D1 -.  )FLFLLLFL &%8<宅  )8FL  )d LHFLLL )`AELMX}LL LLjMLL z-Lȩ )mL )L [%  ) LHLL M8LLLL z-Y}Lȩ )mL )L [%  ) LHLILjM )`$8486$ALMMMMMMM Z}X2L N -. X2LNM X2L0NMMMLFOM mM*(mMMMM X2L{NMMM [}GLM X2LNMM M X2LNMMM X2LNMMMi X2LNMMi X2LNM\}Mi X2LOMML@OMMi -.MiMiML5NMILgOMILgO s)MLOMILyO]}MLOMILOMMILO -. -.M LM mM*(mMMMMiMi`*(LO s)i(O^} s)iWUUTiTiU &%TeTLtWUm}UTi TiU &%TeUTT E)UT 5)  )2 )UULW2mUn}  ), LHULW )UT E)TT 5)TiTimTi )UmTi8Uo} *`HEN yLOX %GX8GX,GXHXHX8IXIXJXJXGX HX0LXHX GXLXGXHX0LXHXGXIX JX0Lp}XJX IXLXIXJX0LXJXIX )  )KX KXLdYmKXKX )mKXKX )q}JXKXIXHXGX 3KXiKXLYKX KXLYmKXKX )mKXKX )JXKXr}IXHXGX 3KXiKXLiY )`dColor,B ,BombY,KeyValBYTE ARRAY PlrIncLZYYYYLy[Y mY*(mYs}Y &%eYeY mY*(mYȱYYYiYiYiYiYiYit}YiYiYYY+YiYiY+YiYiȑYi YiȑYi Yiu}ȑYiYiȑYiYiYiYiYL Z O LH )IL[ )YYIh v}YI(L[`L[ * )IL[ * Sd s)L[ s)L[ OYYLbY mY*(mYYYw}YiYiLP\YiYiiYiYiHHY 3hhYYYiYiY+qx}Yi YiHHY ^3hhYiYiYi YiY+qYYY QYiYiLDy}]Yi YiLD]d LHLq]YiYiLq]YiYiY )L^YiYiLR^z}Yi YiLR^YiYiL]YiYiѮL]YiYiLO^YiYiILO^Y{}iYi8 )  )d LH )L^YiYiIL{^YYY UL^YiYiL^Y|}YY !PL^YiYiL^YiYiYiYiѮLi`YiYiYi Yi}}Li`YiYiL_Yi YiL_YiYi" &%YYqYYi ~}Yi" &%YiYiqYLE`YiYi% &%YYqYYi }Yi< &%YiYiqYYY LXYiYiYiYiIL`Y}YYiYi LXYiYiYiYiѮLaYYYiYi Yiȱ} &%+eYiYiYiYiYiȱ &%+eYYYi}YiY QYiYi8YiYiLaYi -.YiYiLVbYiYi}iYiYiILVbmYi )YmYiYi *YY MYYLbY mY*(m}YYYYiYiILbYLbYiYiiLbYYi`YLdbYL[L|[`YLb DGb}b Ib 3Ib Y )IL)c * bbI bILbb 3I &bIL}cLsc! Player A wins. Press Any Key.cQ }?&LcLc! Player B wins. Press Any Key.c ?&N LH * F )ILc * b`Lc b``cy+ UZ *  }(*** (*( (*B +< / } `l6`}8 `ڪ8 `|`}|`0``}?```}```}```} `  `}````}@`@`@`} `  `}`>`0``}0p`@0p`@0X`}@0\`0\`2V2}Wx2W@0U`}0U@p@0UP6`@0U`P@}@0UpP0Up@0UX}U\U\0UV0UW}0W0(=U0U}00 06 0}, 01200}0?00}~0?00}0?00}7000}?000}000}0P`<P0UP}UUPUUUPUpUUPU}UUUWUUUUOUUUUWU}pUUUUOUUUUUWUUUUUUOU}UUUUUWUUUUUUOUUUUUUWU}UUUUUOUUUUUUWUUUUUUOU}pppO+O0}O@}AI"#["*#` -JL -JL!H fJ {p h` 5J H fJ}hZJ bJHVJ^JhL& 0DT  @{` $J $ $J & $ ]&Y (}J ) $J $ $LfJ$ $ W (W ' zNLM#$&%:() 7 JKIcS   }### #"(22  ^^abcgkpw }//sll``QF@9/ Ua`UNJNNNNTTNN;??;ҁ; 3;;83  qEE33}H{ $taaOO|  $t__44{{?DNj{{ww?D}Nj"00{{~zQ"  } ׇ,,##66--@@77}JJAA]]KK} ׇ[[YY  ?UNa[[YY   ?UNa}ttsshhgg DSSDf}Cׇ QZ]T}P ׇ))Z^^Z}Yׇ14+(RU^[}Q }ׇ33//ETTEf}Dׇ,52);DG>}: ׇ1551,((,/269962/:}/ ׇ %%  }##  --''$,,$$  00**##  33--  _aa__?}UNa''!!_aa__?UNa7755MSSMM?UNa7755EKKEE?UNa 9>::}W[[WW RVVRR KOOKK DHHDD }>BB>>ppll ?DNjvvx Wt%",58/}+ ׇ JNNJJ?-N}j}}xttx:} !ׇUzrpqs ҁiiccҁ }jjddҁ  ҁqqkk ҁ zztt ҁ}}} ҁ  f}ׇ "11"f}!ׇrrnn怀 w{{w}w swwss?DNj ?DNj }}}?DNjvvpp ""  ?UNa}}} ""  ?UNa}}ww#%%##?UNa44**0880x0 Wtggcc怅 ``\\##f} }ׇ _nn_f}^ׇvv;PTQ;~:Q"xxllQZZQxS p~zz~SVZ]]ZVS:}S ׇ}||T\\TxT Wt||怔<}<怔LLHH怱 }--))X\\XX22..SWWSS9>>92--2W[`dd`[W|W*ׇ*..**xUr}   {  #''##7;;77*LL3#,-67@AJK]Ls#,}-67@AJK]^o#,-67@AJK] ^m #,-67@AJK] ^k #,-67@AJY[tCz}D ^j} #,-67@AJY[tCz}D ^h DY[tCz}D ^g DY[AkBqtCz}D ^f DY[AkBq ^e DY}[AkBq ^e DAkBq^d DY[^c LY[^c LY[^b LY[^bY[?d@j^bY}[?d@j E ^b-"3w;}pi E \Q`#v8u;~Lpi E \Q`#*!0v};}Lpi E \Q`*!0pi E \Q` *!0pL)),L"-&.|ULY-^>)*+L"-&.Y-^>Y-^>#!$'R Y-^>}#!$'R Y-^=LR Y.^;LR Y/^:LR Y1^9LR YR Y}R YR YR YR YR Y(R Y(R Y (}R Y (Y(Y(YYYI YI Y)}I Y)I Y)HY)HY)HY)HY  "ȉ}Y  "ȉY  #K Y  #K Y  $K Y  %nGrK Y}   %nGrY`   &nGrY`   'stnGr`   'st`}  (stcPg` w { (stJ cPg` w { )stJ cPgX̅` w { *st}ghJ cPgX̅` w { *stghJ X  +stghl7pX  ,stghl7pX ,stg}hl7pX -stghl7pXL .stghX L .ghX D /ghX D$ 0ghX D) 0ghX - }0ghX|WXZ|WXZ}|WXZz|WXZx}D̊XuzD̊X}rxD!̊XpuD$̊XmrD!&̊XjpD$)̊XhmD&,̊X3EejD)/̊X3EOabhD,2̊X}3EOa`eD/4X3EOa_bH24X3EOa_`HX3EOaX3EOaX3EOaX3EOa}X3EOaX3EOaX 3EOaX 3EOaXH3EOa3EOaOa{}xuH[L!qH[La$nH[La'kH[La*ga-da0aa2`a2`a}2`a2`a2`a2`}*LL3#,-67@AJK]Ls#,}-67@AJK]^o#,-67@AJK] ^m #,-67@AJK] ^k #,-67@AJY[tCz}D ^j} #,-67@AJY[tCz}D ^h DY[tCz}D ^g DY[AkBqtCz}D ^f DY[AkBq ^e DY}[AkBq ^e DAkBq^d DY[^c LY[^c LY[^b LY[^bY[?d@j^bY[}?d@j E ^b-"3w;}pi E \Q`#v8u;~Lpi E \Q`#*!0v; }}Lpi E \Q`*!0pi E \Q` *!0pL)),L"-&.|ULY-^>)*+L"-&.Y-^>Y-^>#!$'R Y-^>}#!$'R Y-^=LR Y.^;LR Y/^:LR Y1^9LR YR Y}R YR YR YR YR Y(R Y(R Y (}R Y (Y(Y(YYYI YI Y)}I Y)I Y)HY)HY)HY)HY  "ȉY}  "ȉY  #K Y  #K Y  $K Y  %nGrK Y }   %nGrY`   &nGrY`   'stnGr`   'st`!}  (stcPg` w { (stJ cPg` w { )stJ cPgX̅` w { *stg"}hJ cPgX̅` w { *stghJ X  +stghl7pX  ,stghl7pX ,stg#}hl7pX -stghl7pXL .stghX L .ghX D /ghX D$ 0ghX D) 0ghX - 0$}ghX|WXZ|WXZ}|WXZz|WXZx}D̊XuzD̊X%}rxD!̊XpuD$̊XmrD!&̊XjpD$)̊XhmD&,̊X3EejD)/̊X3EOabhD,2̊X3&}EOa`eD/4X3EOa_bH24X3EOa_`HX3EOaX3EOaX3EOaX3EOaX'}3EOaX3EOaX 3EOaX 3EOaXH3EOa3EOaOa{(}xuH[L!qH[La$nH[La'kH[La*ga-da0aa2`a2`a)}2`a2`a2`a2` (( $((($$$,((   $((( $$  $($ ($ *}$,,(($(,,40(   $(,$   8>>>>>D+}TRTTRT|?>@  =,} @```aa?``~`-}`?@87  8` C8<.}x| x pp  |x<0``߁߁o/}o7????8pa n8p?????8TTTTTTTTTTTT88D0}D8?uUpuUpuUp?@@8lnk;x@@ ;knl81} @@xpՀ`ppX\\VWWUUuUU``=`2}`00 `00pXXX XXX5XuXuXXXXUXUXUX3} UXUXUp5W5\5 0`` 0``@0xx004}000 // @@ppppp 8((5}````  x? `0`p``6}p>80 `F80@x p~00~p pبppبppب7}p 0d`0LFNN0` &ff&TTTTTTTTPPPPPPPPPPPPPPPPPPPPPPPP`````````8}``````q?```````?es x} TTTTTTTTU9}@Q@Q@Q@yypp  $(,048<@DHLPTX\`dgkosw{ #'+/37;?CGKNRVZ^bfjnrvz~:} !%),047;?CFJNQUY\`dgkosvz~ "%(*-0369;>ADGJLOR;}UX[]`cfiknqtwz|  "#%&()+,./134679:<=?@BCEFHIKMNPQSTVWYZ\]_` <} !""#$%%&'())*+,,-./001 $0JJJJJљ =}LދL`LҰJJ`LǠ(#eDžȪ} ދȠ``0eDžȪ>} Ƞ8`Ǡ LLx $$  ?}w %/7?IǦ ݅Ǧڅ$0pPȥۥ pꈦPȦ@}ۆ$0누ɠ҅eǪ}ɐW}ĄɐOӠ҅ӽ䄅Խե $03eܐ'ȱeېǥمɽԄ$0pPPZA}ܐHR`8eܐ8eېǥeمɩ 8Ԅ$0pPܐ e  Ԥɹc$0 B}IiLW֩ L/  $(,048"3?O}1=iȱȱȱȱee) Ѱф$L0 "0a 9Li ȩ@  L. P}눩  ӏ$0R0( i 4i ) Li 𩀅8   Lꌠi ȩ@ Q}鑙ȥꑙȥ둙ȥȥȥȥ$Lf` LӹҠҍȱҍ t`йѹ@z >R}VȐА  ] ZȪ`ȱЅȱ)ԥ 8ԅLύЅȱJJJJԥ )`$pS}Lйѹ@zЪȱЅ1"ȱȱЅJJJJ K )`` Ъȱ0ȱ)T} KȱЅȱJJJJȥ  KL`<eji()  8 ύ` 8U} ύ`$P $Pp$P`; 5%1=`1=;L5%ə/ 5%!2>"3?`V}!2>"3?/L5%6HHBpp I nf Б  gL\ <ǩ -' c ␠ W}8 A āݤ I`)`) f`j****`` Ɛ Ȉ Ɛ` X}hhhhL     L鐠 IɈ`i!ZWL5%^Hpp, w  Y} L y8  犈qة8LGѩӠЄҩթԘJfХԑեZ}ީ"H!hiǢ+Ƞ#H#hi(ǩȠǙiǥidK ӗ"[}L搤 ߗđy?z芙ꈹ@zH ( ) 5) \} X ( )8 $5)% (ɱ (6)7)ɈL$5)  vX5)8穔 |`]}q  犈qL $H ( (L$5)6)7)ٓݓL) " " "^} "  x&/0`0'e᪆⼄ؔҎHh_} ҠȄ`T T $0)6惥йѠЈ fd}L얥Ō fЂ) G) L) DăaŀS @ȱA *02Ō& făe}нѽБƃЛ`Ĩ ȱ ة ĨȄKf}KeeĐȱȱ iei` Ĩ;ȱ ä‘Ñg}ăŀ f` Ĩτⱄ±àȱ Иȱј L q}WBDUEL COMBREACTOR1COMCSUPERKEYDOCBJEDITKEY COMBSUPERKEYASMBMON COMBSUPERKEYCOMBESUPERKEYDOCACTBUG1 TXTL¦æ  Љi`KFڌKNzKVևK^f`?0  r}  (8@@0I1ЩЩD`Щ$ѩҩӠґӥ+`Ԇՠԅҍb%ȱԅӍc%ȱԅȱs}ԅȱԅȱԅȱ8`ґЈ0VБ҈0MQБЈ0B$%$%$&&` "/>IIINU $)#eׅй#iѤL$8et}مҥi` $&%m%-%f%ع#8eׅй#iѤ٩QБнQБb%8eٍb%c%ic%и҆Ӡu}҅ȱ҅ȱ֪҅%Iȱeԅȱe۪eՅڽ%`@ #н#ѥؤL"&EILI&%צԽ#н#v} I&ِ`QБڐЩI1БڐБڐQБ`I1Б`Б` % % %Ԑզ &ڦL&` % %ِw}` %åĤՐ֐ ڐ ې`Ԑِ8`-Ijj` $҅Ӆڅ膆L5% ' *' &L&JJJx}i )`  e``8Hh`äĤŅL& & & &0妍`L&Hȱh 9' 'ɐy}ȱ'ȱ'LFiвŋŊ & &L' & & &0 &8`+ѠИЈѥI`HеѹԹz}hҵ` 'եӐҐ ֠ґԈְ`ґԈґL( 'Ӑ Ґ֠Б`Б{}yi`yy`8Ǖ`8``7)6)5)`$ 8i:3)i)4)3) 5|}%ǹ6*8m7)6)7)`ۆܠ0 ()L((*Ypp`````p0`p0pppp0````ppppx}}pppppp`````<ppp~}ppp000000pp x000xx0000`)) &}M-f>f1ffle0f80eȰf8*l*jʰj}܈"* UZ *  }(*   $"$ $ $  $$ $@hK U _ H_ SuperKEY! A Keyboard Macro Processor } ** For XL/XE Machines ONLY. ** Written by Keith Ledbetter Copyright (c}) 1987 by Orion Micro Systems This program is a Share-Ware product, and may not be sold without th}e expressed written consent of the author. What is SuperKEY!? } ------------------ SuperKEY! is a memory-resident program that gives your Atari XL/XE machine17 definable macro keys} (from here on out known as PF Keys or Program FunctionKeys). These PF Keys can be up to 25-characters long (with embedded }returnkeys), and when accessed by pressing the corresponding key, will be acceptedby the Operating System just as if YOU ha}d typed them in at the keyboard! These 17 PF Keys are referred to as PF 4 - PF 20, and are activated by thefollowing key}strokes: Control + [ 4 - 0 ] PF 4 - 10 Shift + Control + [ 1 - 0 ] PF 11 - 20} SuperKEY! can be used with any program that is 'well-behaved' (see below),and can be invaluable for certain functions suc}h as programming. It can beused with BASIC, Action!, MAC/65, etc. to cut down on time spent by keying inwords that are use}d often. Before we get too deeply involved, let me give you some examples of what youcan do with SuperKEY! definitions. } Below are some examples of the types ofthings that you can do with your 17 PF Keys ( = Carriage Return): For you A}ction! programmers: PrintE (" SET $495=14CR Or, how about t}his one. Ever get tired of setting OPTIONS with all of those keys just to turn the screen and bell off? } ONN Now you can do it with just ONE keypress! Or f}or those of you who use SpartaDOS (or any command line DOS): DIR D1:*.* DA}TE TIME CAR Or for those of you who use 850 Express! version 3.0 (or any other terminalprogram for that }matter): ATH ATS11=50 ATZ or you }can just use them as 17 'Generic' macro keys! The limits are really simple; ANY keypress combination that you can dofr}om the keyboard can be simulated with a PF Key definition. What Will It Work With? } --------------------------- As I said above, SuperKEY! will work with any 'well-behaved' program. Whate}xactly is a 'well-behaved' program? Well, for it to work with SuperKEY!, itmust follow these rules: 1. It must p}roperly recognize the setting of MEMLO. 2. It must not steal the keyboard vector. 3. If it steals the def}erred vertical blank vector, it must jump to the OLD VBI address when exiting its routine (instead of } just jumping to the OS). 4. If it steals the 'Reset' vector, then it must jump thru the OLD reset vect}or before doing its own reset processing. Luckily, numbers 2, 3, and 4 will rarely be violated. The big one here isnumb}er 1. For example, 1030 Express! WILL NOT work with SuperKEY! (sorry,it's not my fault!! ) UNLESS YOU ARE USING Spar}taDOS 2.3. This isbecause the Atari T: handler that 1030 Express! uses does not 'relocate' itselfto MEMLO. It just kind o}f loads and says 'to hell with whatever else is here'.That wouldn't be a problem in itself, except that it loads into memory} ataddress $1E00. So, since most DOS 2.0 type DOS's have a MEMLO of around$1DE0 or so, the handler will just totally wipe }SuperKEY! out. But, if you use SpartaDOS 2.3 with its incredibly low MEMLO setting, thenSuperKEY! will work great with 1}030 Express! v2.1. While we are on the subject of SpartaDOS, there is one other thing that youmust do if using SpartaDOS} (well, maybe TWO other things). First, if at allpossible, you should try to make SuperKEY! the LAST external routine that} youload in. This is because SuperKEY! -DOES- do all of the above thingsproperly, so you can be well-assured that things w}ill go OK. Secondly, you MUST NOT do a KEY OFF command once SuperKEY! is loaded intomemory. This is because when you do }a KEY OFF command, SpartaDOS replaces thekeyboard vector with the OS's old location, thus rendering SuperKEY! useless(nothi}ng will crash -- it's just that SuperKEY! is no longer getting firstcrack at the keypresses). So, if you need to do a KEY O}FF because you are,for example, using Action!, then you must do the KEY OFF command PRIOR toloading in SuperKEY!. } Finally - The Good Stuff! --------------------------- To use SuperKEY!,} you need two programs. First, there is the actualSUPERKEY.COM file, which is what you would run at bootup time (as anAUTO}RUN.SYS file if you are using DOS 2.0 / DOS 2.5). The second file is the KEYEDIT.COM program. This is the program that y}ouuse to create your PF Key definition datasets. When SuperKEY! is loaded, it attempts to load a file from the currentd}isk drive called PFKEYS.DAT. If this file is not present, then SuperKEY!-will not- install itself. Using KEYEDIT.COM, y}ou can create many definitions called, for example,PFKEYS.ACT, PFKEYS.BAS, PFKEYS.EXP, etc., and then copy the file that you}want to use to PFKEYS.DAT. The Key Editor is very 'user-friendly', so I'm not going to spend much timeexplaining what t}o do. What we'll do is just cover the different keypressesand what they do: Up/Down Arrows - These keys move you} up/down thru the 17 PF Key definitions. As each key is displayed, you will be } shown two additional pieces of information: the keystroke that invokes this keypress, and whet}her this key is currently active or disabled. The active/disabled flag is} mainly for use with the Express! terminal programs (see below). E - Pressing }E will allow you to Edit the PF Key currently shown on your screen. Use the OPTION key if you need} to backspace, and the START key when you are finished. D - Pressing D will tog}gle the Active/Disabled setting of this PF Key. This is used to 'turn off' a PF Key } so that SuperKEY! will not treat it as a special key. Where this is mostly needed is for t}hose of you who use the Express! terminal programs. Since both SuperKEY! a}nd Express! use the Shift/Control/1-3 keypresses, then you will want to DIS}ABLE those keys in your PF Key definitions to be used with Express!. That way, when you press } Shift/Control/1-3, SuperKEY! will treat them as a 'normal' keypress, allowing y}ou to use your Express! logon macros. P - Pressing P will print a 'PF Key Temp}late' on your printer (it must be capable of printing 80 columns). You can }cut this template out, fold it to 'stand up' behind your keyboard, and then write your PF Key } definitions on it. That's It Folks! -----}------------- I hope this little utility comes in handy for you. If you experience ANYproblems with SuperKEY!, please d}ocument as closely as possible what you weredoing and leave me Easyplex mail on CompuServe. Also, for those of you intere}sted, the source code for SuperKEY! is alsoavailable on CompuServe under the name SUPKEY.ASM. It is well-documented,and s}hould make for interesting reading if you have never messed with thekeyboard vector before. } Enjoy! Keith Ledbetter CIS }# 76703,4061 Keith Ledbetter CIS # 76703,4061 Ps (c)1983 Action Computer Services  B JKIHiDiELV`L9P } 9P BLV`!LPPl LP &` Fj`8冨凪` PEӅӥ } P`ʆǪƩ Ɛee` PƦʆǢ &Ɛeǐ Q QLP P'&&&8儨児 }祂*LP&&*ń8&&LP WQ`hihiHHȱȱLPc !#3` }LPJJJJ`H Ph`Hȩh nPLQ wPLQ !PLQ )PLQ /PH8 }`HhHh [RLQ BHI V䅠LQ LR 9PLQԆ ؠPIPP` } RP )PLQ RLR RLR SLRH- R8塪墨hLS SLR "SLR RȹP` }텠8堨塪 R芨Oȩ-`PP RP棩 Ѥģ0-ģ6000:,80H }& &ehe&eģ0ʥ 8堅塅`$ R&*i0:0i RƦ`¢ 护 }°ڱ%ȱ%E RL\T担CS NRL\TI SL\TH TL\T RL\TS:TE:TH HR TT R HRh })0ITTLR[\ZUVT` TTT`HhƣĢ``' }Pn9m usoU1)9m Middle_Window (1)9ma Ef Ch = 'Q then9mG Done = 19m1 End }if9m! Until Done > 0 End9mReturn9m9m9m;=============================9mProc Get_Filename ()9m } 9m Byte X,Y,Idx,Ch,s"9mL{VwVwVvV`yLVVVILVV)VVaLVzͅVLV8V `V`mLV RV }V VVV)VVIY VINLVV`FLV RVV VVV)VVIR VIALVV`itL6W2W1W2W( "Q }XeYem1Wi8XUYU`14LW|W|W)}W}W LW}Wi@}WLW}W`LW8}W }W|WLW}W }W}W }` LW QWWW 3WWWWXXWLEXmWmWWi ~WWXUYUXUYUWWLW`h }ars(1LOX QFXGXFX 3WHX ~WKXJXIXXXJXLXEXUYUXUYUKXJXLtX`(21,LX QXX X cILX }`bXeXdXiXh Vih`rs(2LX QXX XLY` bXeXdXiXh Vc` LB }Y>Y T R>YILZLY%| Activated by: |Y`  WLY%| Key Is Currently: |Y }  WLY%| |Y̢ WL&`>YILZL5Z%|  |Z }  WLkZ%| Ԡ䠠 |ZE  WLZ%| Π堠 |Z{ WL&`>YI }L`[LZ%| 堠 |Z  WL[%| נ |Z  WLP[%| } |[* WL&`>YIL\L[%| 堠 |[m  WL[%| }婠 |[  WL[%| 堽 |[٢ WL&`>YIL\LB\%| } |\  WLx\%| 󠠠 |\R  WL\%|  } |\ WL&`>YILm]L\%| ҡ堠 |\ˢ  WL']%| |] }  WL]]%| |]7 WL&`>YIL^L]%| |]z }  WL]%| Ơ󮮮 |]  WL ^%| |] WL&`>YI }L^LO^%| |^)  WL^%| Ơ󮮮 |^_  WL^%| } |^ WL&`>YI Lz_L^%| |^آ  WL4_%| }箮 |_  WLj_%| |_D WL&`>YI L&`L_%| ҡ }堠 |_  WL_%| |_  WL`%| } |_ W`L*`LS`%`- WL`%|堠١|`c }WL`%|򠠠|` WL`%|㩠󠠠|`Ϣ WL+a% }a WLaa%| Function Key Definition Editor |a; WLa% }aq WLa%| |a  WLb%| PF 4: |aݢ } WL9b%b  W ?YLtb%| |bN WLb% }b WLb%| | Select A PF Key |b WLc%| E | Edit This PF K }ey |b WLLc%| D | Enable / Disable this PF Key |c& WLc%| P | Print Template for PF Keys | }c\ WLc%| Q | Exit and Save These PF Keys |c WLc%cȢ W` }Ldc LXc moV*(mpV W  LX  TcL_d Rci R  Tc }LdLdControl/d  WccicLdLdShift/Control/d  W$c8cc c TcI Ldcc Rc }ZULeL ee  WL5eL(eActive e  W`====oV============9mProc CrL[e6e6eZU9e:eȌ8e } LX ?Y LXe: WXUYUXUYUILeI ILeILe9eL^fI }L1f8eL.f  R7e LX88e8e8:e:eL^fL^f R7e8eL^f7e8e:e:e8e9eLe ?Y6e } moV*(mpVe: AU`ad_PLfff ?YvV HRLfP:f RvVLf HR ?Y VIAL }ffLjfLg f BRLg g  BRfILjLrgL+-------+------+-------+------+-------+------+-------+------+------- }+------+g% BRf͛fLgLgL! !g BRfL }gL9hL! Fold Here Fold Here !g BRLhL+-------+------+-------+------ }+-------+------+-------+------+-------+------+hE BRLhL! 1 ! 2 ! 3 ! 4 ! 5 ! 6 ! 7 ! 8 ! 9 } ! 10 !h BRf͛fLbiLSiL! ! ! ! ! ! ! ! ! ! !i BR }fLhLiL!-------+------+-------+------+-------+------+-------+------+-------+------!ie BRf͛fL)jLjL! ///// ! /// }/ ! ///// ! ! ! ! ! ! ! !iͩ BRfLiLyjL+-------+------+-------+------+-------+---- }--+-------+------+-------+------+j, BRLjLj j BR͝fLf`o (LjuVj ?YuV c Rjj VjjI-L }jjLjjI=LjjjILk8uVuVuVILkuVLkjIL1kuVuVL.kuVLkjIDLRkuVZUuVZU)uVZULk}jIELekuV XeLkjIPL|k f ?YLkjIQLkj͠jLj`09mboVmLk ?YkkkLk D :PFKEYS. k}Us AUkLkĠkݢ WkILlL lߺl WLkmkILUlL3l ĠӮߩl' Wk} LXLkmkILlLol ĠӮߩlb Wk LXk LXLkmkILmLl ĠӮߩl }Wk LXk LXk LXLkmLmĠӮߩm Wk LXk L}Xk LXk! LX Rkk VkkILm͘kLmkL\nkI~ kILm͘kLm8kkL\n}kILnk1Lm8͙kLmkuUsUk kkkkL\nkALnZ͙kk1L\n8͙kL\nkL\nki ksU}ki sUk kkkkk͚kLk`LnnhngningnhnnninLnoUmmVpUmnVgnminhni}mVnVinLnoUmmVpUmnVmVnVȌjn8inoojnL'ooUmmVpUmnV mVnVjnLn`L2o Q(o}(o "QoUe-opUe.o)o*o-o.oILo)o*oi)o*o)oq*oi-o.o }-o.oLno`oVLonVmVooL.po moV*(mpV knoLoUs }o AUooQpQpoLfpoo oooLFp ?Y TL}p%Sߩo̢pw ?T VIYLLqo ?YvV HR }Us RvVLp HR ?Y VIALpoLBqUZ XooILqnVmVpUoU Xo HRoIL=q ?Y V }IAL:qoLBqooLp`LQq ?Y RMq ?YMqMqLqMqZUMq moV*(mpVLq (unassigned) }q AUMqLjq`Lq k ?YvV HRUs RvVLq HR Nq`UZ XqqqI qIL init sta memlo + 1 sei )} ;turn off interrupts and lda #< mykbd ; re-steal the keyboard sta vkeybd *} ; vector from the OS rel_2 lda #> mykbd sta vkeybd + 1 cli +} ;interrupts back on lda #7 ;turn on our ldy #< defvbi ,} ; deferred rel_3 ldx #> defvbi ; VBI again rts ;all done...back-} to user ; Beginning here is the deferred vertical blank routine which ; does the actual 'stuffing' of the ma.}cro characters into the ; keyboard registers. Note that since we are using the KEYDEF ; area to do translation, th/}is program will only run on XL/XE's. ; ------------------------------------------------------------------ blastit 0} .byte 0 ;are we currently sending a macro? outidx .byte 0 ;the index into macr1}o being processed. temp .byte 0 ;temp storage area. defvbi lda ch 2};is a keypress still waiting to be cmp #$FF ; processed by the OS? bne x3}itvbi ;yes...leave it unharmed and exit. rel_6 lda blastit ;are we processing a macro? 4} beq xitvbi ;nope..get out lda #0 ;yes...force ^1 flag off 5} sta ssflag rel_7 ldx outidx ;get our current index into the macro blastoff ld6}a blastoff,x ;get next character of the macro cmp #$FF ;end-of-macro? 7} beq xblast ;yep...turn off macro flags ldy #0 ;nope...translate key findke8}y cmp (keydef),y ;look for it in the keydef table beq gotakey ;here it is! 9} iny ;missed it... cpy #192 bne findkey ;ke:}ep cooking. gotakey sty ch ;push key into ch register rel_9 inc outidx ;u;}p the index into macro bne xitvbi ;and exit gracefully.. xblast lda #0 <} ;done with this macro, so rel_10 sta blastit ; zero flags out rel_11 sta outidx x=}itvbi jmp xitvbi ; Beginning here is our modified keyboard handler. If a macro ; key is pressed>} (and that key is 'active'), then we simply calc ; the address of the pfkey string, and place that address into ; t?}he VBI's LDA instruction. ; ------------------------------------------------------------------ mykbd txa @} ;better save the X register pha ; on the stack.. rel_12 lda A} blastit ;are we doing a macro key now? bne ignore ;yes..ignore this keypress. B} lda raw_key ;get the raw key bpl oldkbd ;if positive, then just process nC}ormal ldx #0 ; skey? lda pftable,x ;is it a PFkey keypress? D} beq oldkbd ;nope..end of table. cmp raw_key ; beq skmatE}ch ;you bet! go start it off. inx ;up index bne skey? F} ;and keep checking table skmatch lda pfactive,x ;is this pfkey 'active'? beq oG}ldkbd ;nope...process it as normal. rel_13 jsr calcptr ;yes..calc pointer to it H} lda my_ptr rel_14 sta blastoff+1 ;store the address of it into the lda my_ptr+I}1 ; VBI load command. rel_15 sta blastoff+2 lda #1 ;set flag to one toJ} alert rel_16 sta blastit ; the VBI routine to get busy. ignore pla ;igK}nore the key like tax ; it never even happenned. pla rL}ti oldkbd pla ;process as a normal keypress tax ;restoreM} X register lda raw_key ;get it cmp ch1 ;equal to last keypressN}? bne pirq3 ;nope..it's ok. lda $02F1 ;yes..debounce period expO}ired? bne pirq4 ;nope..ignore it. pirq3 lda raw_key ;is it a P} cmp #$9F ; control-1 key? bne pirq1 ;nope pause lda ssflaQ}g ;yes..toggle the start/stop flag eor #$FF sta ssflag ;save it R} bcs pirq4 pirq1 sta ch ;put key into ch and sta ch1 S} ; ch1 registers. lda #3 sta $02F1 lda #0 T} sta $4D ;attract pirq4 lda #$18 sta $022B pirq2 pla U} rti calcptr lda #< pfdata ;calc pointer to needed pfkey data sta my_V}ptr ; by multiplying number in the rel_18 lda #> pfdata ; X register by 26. staW} my_ptr+1 cpx #0 beq xcalc calcloop lda my_ptr clcX} adc #26 sta my_ptr lda my_ptr+1 adc #0 Y} sta my_ptr+1 dex bne calcloop xcalc rts ; Z} pfkey table (of the raw keypresses) ; ------------------------------------- pftable .byte 152,157[},155,179,181,176,178,223,222 .byte 218,216,221,219,243,245,240,242,0 ; various work field\}s ; --------------------- holdptr .byte 0,0 iocbnum .byte 0 ; This initializat]}ion code is executed only at bootup time to set ; everything up. It is not memory-resident, and will be over-written ; ^} since it is not protected by MEMLO. ; -------------------------------------------------------------------- init _} lda dosini ;get old DOS init rel_19 sta reset + 1 ; and save it so we `} lda dosini + 1 ; can jump thru it to rel_20 sta reset+2 ; be safe. lda #a}< reset ;tell OS to execute sta dosini ; our routine when rel_22 lda #> reb}set ; reset key is hit. sta dosini + 1 lda $0224 ;save old rel_23c} sta xitvbi + 1 ; vbi routine lda $0225 rel_24 sta xitvbi + 2 rel_25 d} jsr reset_1 ;go do it to set memlo. rts ; This is the relocation table. It ie}ncludes the addresses of ; all fields that we must modify when we relocate down to MEMLO. ; ----------------------f}------------------------------------------ reltbl .word rel_1 + 1 .word rel_2 + 1 g} .word rel_3 + 1 .word rel_6 + 2 .word rel_7 + 2 .word rel_9h} + 2 .word rel_10 + 2 .word rel_11 + 2 .word rel_12 + 2 i} .word skey? + 2 .word skmatch + 2 .word rel_13 + 2 .word rel_j}14 + 2 .word rel_15 + 2 .word rel_16 + 2 .word rel_18 + 1 k} .word rel_19 + 2 .word rel_20 + 2 .word rel_22 + 1 .word rel}l_23 + 2 .word rel_24 + 2 .word rel_25 + 2 .byte 0,0 diff m} .byte 0 ;work fields while doing target .byte 0 ; the relocation ; n}The relocation routine. Relocates code to next page address. ; ----------------------------------------------------------o}----- reloc ldx memlo+1 ;get memlo, and change inx ; to next p}page boundary stx target lda #> pfactive ;get where relocation starts q} sec sbc target ;subtract where we want to go to sta diff r} ;save amount to subtract ldx #0 re_loop lda reltbl,x ;get an address from the tas}ble sta my_ptr ; and hold it. inx lda reltbl,x t} sta my_ptr+1 ;end of table? ora my_ptr beq move_it ;yes..u} ldy #0 ;nope..get the byte from memory lda (my_ptr),y ; and adv}just it by subtracting sec ; 'diff' from it. sbc diff w} sta (my_ptr),y inx bne re_loop ;keep going. move_it lda x} target ;now move the actual sta my_ptr2 + 1 ; code down to new MEMLO area y} lda #0 sta my_ptr2 lda #< pfactive sta my_ptr z} lda # >pfactive sta my_ptr + 1 ldy #0 mov_1 lda (my_ptr{}),y sta (my_ptr2),y inc my_ptr bne mov_2 inc |} my_ptr + 1 mov_2 inc my_ptr2 bne mov_3 inc my_ptr2 + 1 mov_3 }} lda my_ptr + 1 cmp #> init bne mov_1 lda my_ptr ~} cmp #< init bne mov_1 x_reloc rts ; print message thru IO}CB 0 ; ------------------------- print sta icbll ;length stx icb}al ;buffer lo sty icbah ;buffer hi lda #0 sta } icblh ldx #0 lda #$0B ;put record sta iccom } jmp ciov ; This area attempts to load a file called ; PFKEYS.DAT from the default drive a}rea. ; ------------------------------------------- fmask .byte "D:PFKEYS.DAT",$9B loadfile l}dx #$10 ;find an IOCB that isn't in use lda ichid,x ;get id byte } cmp #$FF ;available? beq got_it ;yes. txa };no, so clc ; add 16 to adc #$10 ; it t}ax ; and bne get_1 ;keep going got_it stx iocbnum ;s}ave it. ; open the IOCB to "D:PFKEYS.DAT" ; ------------------------------- openfile lda #open } sta iccom,x lda #2 sta icbll,x lda #0 } sta icblh lda #< fmask sta icbal,x lda #> fmask } sta icbah,x lda #4 ;input mode sta icax1,x } lda #0 sta icax2,x jsr ciov bmi closiocb } ;oops - error! ; Blockread 459 bytes from the file ; ----------------------------------- get_b}uff ldx iocbnum ;IOCB 0 lda #7 ;get record sta icco}m,x lda #< pfactive sta icbal,x lda #> pfactive } sta icbah,x lda #$CB sta icbll,x lda #1 } sta icblh,x jsr ciov closiocb ldx iocbnum ;close the IOCB } tya ;save previous error status pha lda #close st}a iccom,x jsr ciov ;close it pla tay } ;restore error status rts ; Here is the code we execute at boot-up time... ; -----------}--------------------------------------- start_up jsr loadfile ;go load PFKEYS.DAT file } bmi no_go ;couldn't load file -- abort. jsr reloc ;go relocate code to MEMLO } jsr init ;do initialization lda lootmsg ; ldx } #< bootmsg ;tell user that we ldy #> bootmsg ; installed OK. jsr print } rts ;back to DOS normally no_go lda lotmsg ; }ldx #< notmsg ;tell user that we ldy #> notmsg ; did NOT install. jsr } print ldx #$FF ;since we didn't install, then txs ; r}eset the stack and jmp (dosvec) ; force a cold entry into DOS. ; Error / Info Me}ssages ; ----------------------- bootmsg .byte $9B," SuperKEY! Processor Installed",$9B,$9B } .byte " (c) 1987 Orion Micro Systems",$9B lootmsg .byte * - bootmsg notmsg .byte $9B } .byte " Unable to Load File PFKEYS.DAT!",$9B .byte " SuperKEY! -NOT- Installed...",$9B } lotmsg .byte * - notmsg *= $02E2 .word start_up .end } ;piece of cake!! (whew!) 2ƇL l`I`:L󹅆`]`` 帐` `H }h8`` ` lLƇ `L hhL-6.7l H(`h`6-7.67kHH}R}  & J JLATARI System Monitor v2.2 (c) 1985 TW M/h@JJJJ)` p J j} )J' 0k)) JJJ Ȉ`/ /hhhhL 9H  ąȐhŷ&*i? } x ~ `0 豉 Ș L `8e` T0 "T3  T3  T;} "D3 D"D3 D"D3 "D3 &1!YMJ,),#($YX$$#]#)i#$S#$S[[i$$)|mi)S4}i#bZH&bTDThDt(ntJrtttrDh2"&&rr&HDD hhظB Y`EL\lY@5)I} LhH 0L( hh 9 Lhhh  HHHH J  =}  0 ` 8 8LӸLŸAXYS攥ŏ鹎`` P = ++1 L'0 `}B^DE`HI V䩛L//hhhhhhL J 鹩-L ) O 鹝  } `U ɛɠ `JJJIeH= hHJJJJ h) 0:ijk B}jDEHI V BjDEHI V䤈j`BDEJK Vk` J Vk`PЎ }حk J  , " 0> Lκ &&]^I0 i`HNH}`(c) 1985 Thomas Walters즤4 svx**>2Hj**~@OO`QR QэRx2R XQ \`/Q*Q RyQQQL/RHQ+ *R#} P RˍR̍RQhh@h  ɟ IM+h@˩Pi˥i`}RS Q QӅ Q $0R%1R Q` S0 KS RzT:T S`T{T Sl QQQR RR$R+R.R6RBRORTRYR^RcRR}RRRRRRJSP8JSISSS 8ISJSΩͩ˩P̠ˑΥR`HDEI} BLVD:PFKEYS.DSTAT@iRBHIDSEJK V0!RBDPE˝HI V0RH }B Vh` SuperKEY! Processor Installed (c) 1987 Orion Micro Systems@ Unable to Load File PFKEYS.DAT! SuperKEY! Ԡ }Installed...@RRLR RLR SLRH- R8塪墨hLS SLR "SLR RȹP` ACTION! BUG SHEET #3 - part 1This document supercedes the previoustwo bug sheets published for ACTION!November 6, 19"}84------------------------------------- GENERAL INFORMATIONBefore getting to the bad stuff (thebugs), here are"} some goodies aboutACTION! which we would like to passon to you:ACTION! BULLETIN BOARDIn order to speed the distributio"}n ofACTION!-related information, ClintonParker (author extrordinaire ofACTION!) has set up a bulletin boardsystem. His c"}ompany, Action ComputerServices, is located in Rochester,New York, and you may try calling hisbulletin board at(716) 235-"}3394and hit [RETURN] when asked for apassword.Clinton welcomes comments,suggestions, and praise. Complaintsand their p"}erpetrators will beignored. That is, of course, ourjoke. But please, if you must offercriticism, keep the remarks constr"}uc-tive. And remember that OSS isresponsible for distribution, etc.Clinton is the author and is (wefeel) generous in mak"}ing himself soaccessible.TIPS ON TEMPSThe magazine article titled "Lights,Camera, Action!" (by Dave Plotkin)which appe"}ared in the July issue ofANTIC featured a set of routines tofacilitate writing ACTION!-basedinterrupt handlers.The artic"}le gave the listings for tworoutines (more properly, two DEFINEs)named "SaveTemps" and "GetTemps".These routines are adequ"}ate only ifno math beyond addition andsubtraction is performed in theinterrupt service routine. Thefollowing versions of"} these tworoutines will work properly in themore general case:Make the following DEFINEs in yourprogram before you decla"}re yourinterrupt routine (comments may beomitted-- they exist only for clari-fication):DEFINE SaveTemps= "[ $A2 $"}07 ; LDX #7 $B5 $C0 ; LOOP LDA $C0,X $48 ; PHA $B5 $A0 ; LDA $A0,X "} $48 ; PHA $B5 $80 ; LDA $80,X $48 ; PHA $B5 $A8 ; LDA $A8,X "} $48 ; PHA $CA ; DEX $10 $F1 ; BPL LOOP $A5 $D3 ; LDA $D3 "} $48 ; PHA ]"DEFINE GetTemps= "[ $68 ; PLA $85 $D3 ; STA $D3 $A"}2 $00 ; LDX #0 $68 ; LOOP PLA $95 $A8 ; STA $A8,X $68 ; PLA $9"}5 $80 ; STA $80,X $68 ; PLA $95 $A0 ; STA $A0,X $68 ; PLA "} $95 $C0 ; STA $C0,X $E8 ; INX $E0 $08 ; CPX #8 $D0 $EF ; BNE LOOP"} ]"Use these routines inside yourinterrupt routine as follows:; Your interrupt routine.PROC InterruptRoutine() ; Lo"}cal declarations, if any. BYTE a, b, c, etc. ; First line of code within ; procedure SaveTemps ... ; Your i"}nterrupt ; code goes here. GetTemps ; Last line of code ; within procedure.[$6C OldVBI] "}