@L `}/j5  $% l0?$)$$Hȱ$ ShL$ `e$$%` h?/ `@  !I PR@1 YL I`! S S) H$ЙH 0}Џ$%`@ $% CC$$%e%dU$% ]0%$% DDmLp   % J)Lz J  (( o L (y/)  [L< ( yL Z 0o Tya y }4IB [y32C/10m?4 V V  wLL a ` V y/})23LzA! ߰")-݈ y" $zzG@LL 08` k")};1k0 -G$Ș݈ SL! 9 y8(()(0˥)Nk`$GȘ݈LS )L ݈ L GzȘ} ݈LL )W>Z   HH)H o h  yhy00hy11/ V  }L> L JJaHJJJh) yLT J u (`  IBLH % 6h HHGH`LdJ })LJJLw!,"!,/@F  L! ! 0E^  }^ E E7EȩEdE/EȩE / ! Vΐ )L   mx n wym }?x7x?4 ( ) w y32 R V LL n w ) V  L y / o   }E` , ny/) / V Ly/) 0BM݌L݋ ML  N݈ L }NLML [ fEqEHȱEqEh 3Gȹ G KLL GzɛL  L}FREE SECTORSy /H) *Gȩ GȽ4G GȌyh%*J >G<-+=!*?%% &%z3%$$HEL{*DIR*LOC.CLR.LOA-VER%INI+UNL.FMS.SAV,MODg%CARR*REN?,FME.H"}EAP)BAC_%BONo1DEL.FMD.SUM(RUNm*BOF|1COP3&FMQ.TYP.)EXE$ 1Y5P" O."8""@R'S15%#}0i5i5501ȊԢx5"JFJPWy"HH *5")IAY54 4> 4,0$}L#N #L|*J #L*J #14"4`J # 1Lk*v} 4 *%H$H`)?4 $ 4 #$0 %} 2 4 $ y$, L$LL-19" !"H "H` $ $Ѻ Ѻ걺 2ȱ 4ɛL"ȱH&}H 2e滠滱 u2`> 8e滐`+"`e` y$ 2" 2Execute: W. /p O. '}/ 1L"*ԆՎ l$ 2 \*L#L)4 % HJJJJ 3. 4h 3 3XFHSEX; 4L4(}"݅pq y$ 2ݹp` %ݱp 3`,5 2`N5 l$ /0 / 1 l$L$$8n" }$ 2pq y$I eppq> )}4pq 3 3p,"0 ' 4 3L& 3`p8pqŠ 2ݑpȥpȄ(` /5D . 5 - #( l*}$ / #(莉5 2Reading: . .ii e֥iש 0( . `1,P3 1S / / 1&+}& 5$?♵5 -8tu E( rȥs(0 O. .Еߥ .8 ' 0( 2Writing: rȱsr* / /,} ,` / 1rs8 E($0 O. . .C .L'5  e . 'Lx&,5PJC`,50 2I-}nsert ( 2sourceL' 2destination 2 & hit key ! #ڭ ҍ5L25`5օtׅu` S2tu /.} 1HrettIseuu(` (x / / O.L1`$0'5 / S2 1XY O./}8` W.r n( (errstuvw 2LEN: vw 3u 3 2 SUM: st 3rL3 W.$0 * n( ( 4LB)0}N` W.ʆ n( ($0,F (!$0բ 2No COM-File !LO. (8ԨՐυلإ5 * 1}2# 2RUN: E* 3 2INIT: E*L^) * 3 2. ԥ 3- 4֥ 3 2 LEN:إ 3 (L)إL^) 2}( ( 3L3 1 y$T 4T l y$l 2l *" 4 3 * $ $ 4 2 *ݥURL4` 3}, /$0"I" 1 n+,"0e+Di5Ei Q2 1 2 V/8," 24}LV+ԩ 3: 4 4I 4L+ 2D5:1 4 2: $;0+ 2SINGLE 2 DENSITY 2 RAMDISKL* 2ENH5}ANCEDp 2DOUBLE 2QUAD }/5,5$ 1 O.$0 `DOS.SYS8f5ȩU5ȩP5婿t"Y56}L, / - l$ / /X,L. /,55 5.5 橛5L/LL$ }/ l$ 2 2刄t( 287}$, 2RUN : y-ft 2INIT: y-ft 1 -$tP`$tPF$6ee8}ȄԄՠ$0֩ /$0 q- /8ਥi S2 L15 4ɛ 2` y$ 2 " 2Load: W.9} /$莞 1 -5 lL"0L2`")i"` 1 . / Q2 1'  Q2 1٠:}0 V/ .L.L2 BLVhihi / -i(i( -8((((.. . `1 1 - .;}`5  e`,,,,"H 0hZ,!,#,$/ /$0 $0ZL/ -/L. / /!L11/2/5<} 5 H.5h5ک5`5c/d/ 5? $08`$0`45 [2519 5=}55 /$05455 /5ED` *50 4`5008f [2R0/@ 2.>}/ȱ 280@0  eiȱ/\FȢɛ  o- *  D.8;+"/+ȱ0"?}LL$V ȱ+F/ڊ u2 80 ? 00 0/+$0Wy`5 ` 2Sure ? 1Q`$O 2es, @}o or bort? 81YN 4(` 'ɛ)YN A 2AL"` * 4 `)  ӆiA}j O.+ /  /$0Ș,J, 1B V0`1 O.:>ݩ,".U * 2 is locked !Unlock file? 1ݐ`B}$ 1УԢ5 )p O. * * 2# 4 3L"IH`:;:` ,ɛ`` u2` *C}hihi 4eiHH` ," 4 2 8`0:` 3` 2iԥiդ o$ԥ(`LL$ 2ԍ2Ս2D}Ԇՠ+22ȱ.6'`0#: AG6  &&`8`芄  (` }$ 2 2 3 E}2=' 38nɛL4ԥ 3 2=.݆ކ&բuݕت 3ߊ, 3HJJJJ 3h) 0:i,  F}4,500 BHI V,L2,"p:ɛUR.* t4 t4^ 81 t4( $x0Nhh`S8R^`倈G}HH`p@BDE-HI V0H-` O. 4L2L"ȱ 4ɛ`D1:*.*pB 5H}0#452"/ $/38%by("arth&"ruchhaeuserc -2eitershan#omputertechnikI"L2L"ȱ 4ɛ`D1:*.*pB 5[!dBʝ  ` ``  } }  `8     `8   `    ^ ~ J} e  e &` > &&8  > > ƀ` !  ` =   =  `   K}   ` ]   ]  ` I  I `    U  M  E  `  2  (  ׽L} ͽ     `   } }  `  ` > } } M}ȱ ` > } } Ƚ `} } ` 腋`8HH``膇`N}H8     h}  }  `8           Ā фIJ)eeO}慠ф$%Ɓ   ``` #Ji  ` #J #i  ` # #JJ P}#JJ8   i L6#8    8  8 ȱ 8 ȱ   Q} }  }  %`   ȱ 8  8 ȱ L6# }  } 8ȱ僰 6#8R}  ȱ   } Ƚ }  }  }  %`8  8 ȱ  6# ȱ  Ƚ S} 8倥偐 $>  %Z}> `    1 8 Ѝ`    1 8  ? ` JH hJH hJ ?  [}`W^M~L LLi0HW!NNi h` 80LMWL>M ^M~L\} 8 NW!^N` !`l `! !)I! !! U!`l `!. ! 8LMN !ʎ  8]} ! !` $$%8    `ЍР` `CUTWLMpA"0H")!0!` "0^} ύ ߍ  ! Ȍ! ԩ>/Э   oo`B&L!%L! L "`<"l"0";"N"!"_} ## MM"&`l"`&i&؛ " " " " &7& B V0B`}D&EJ V0 e& B V`HL` 49CFKNUYbehoty~a},AWq #(-=S]diqv{b}%(*@EJPU\t  N#@#@##`M#L#JJJJH)J#h) JJK#L#: #HH#J# D#J#hHI#K#c} D#K#h #J#H#K#I#8nL# @#M#Д`l `` #08;BGJOR_bgjwz}  Z#@#@##d}y``W#Y#X# @#W#yX#riN#siR#X#Y#Y#ǩM#yN#M#NM#jNM#jN#e}yR#N#NN#jNN#jI #Ђl `` */369>KX`ejquz  G#@#@##`f}E# #8)HMF#      #h)F# @#E#`l `` *KQTW]  E#@#@#{#`Dg}# u#yJJJJ @#D#`l `` 8;E  P#@#@##`ccO#N#JJJJH) Jh}L#h)M#M#N#: #HJ#L# D#L#hHK#M# D#M#h #L#J#M#K#8nN# @#O#В`l `` %39i}<?FKNSVcfkn{~ D:MM.COM !11 !00 !j}00 !0000 ! ! R" !LY1 !00 !00 ! '(11 ! ! R" !L1 !00 !11 ! '( !L1k}1 ! ! '(`0123456789ABCDEF$xx !11)111JJJJ111 !11 !`L2Please type in two hexl}1 ! !0 !00 ! 1LH2characters. There is no12 ! !0 !00 ! 1L2need to press Return: j2 ! !m}0 !00 ! 1L21122 ! 4' !11 !A ! f" !L2 !1 &!0 ! 5! !1L3 !1 &!An} ! 5! !11 ! ! f" !11 !1 !1 # !1 ! R'1182121L2 ! ! R' !1 " !o} ]! !1 " !`L3Please type a filename̠3 ! !0 !00 ! 1L4ap}nd press Return: 4 ! !0 !00 ! 1 !3 ! ! e( !3333 ! ! R" !L43 !: ! 7"3 !: q}! 7" ! !L4L4D:4 ! !3 ! %3 !3 !33 !3 ! $3 !33 !`L4333 !33 !`r} !55 ! !44 !4L*5**5555&5'5Hȱh !44 &! ! ! &! ! !4s} &! !558&55'55L@5` !55 !55 !55 !5550 !55 !55 !55 !t} 50 !0 &! &! !+ !55 !55 ! '(0 ! K!55 !55 !55 ! 55` !^6Lw6Creating driveu}rh6 ! !L6, please wait...6 ! ! 1 ! w' ! ! !ɠ0 !00 ! 'Ǡ( ! !\, !v ! 5^6 !v} ! &L7H- ! !- ! ! 5L7 ! &LH7. ! !Ӡ. ! ! 5L7 ! &Ls7/ !J !ՠ/ ! ! 5w}L7 ! &L7 / !b !o/ ! ! 5L7 ! &L7/ ! !0 ! ! 5L7 ! w'`x:+7+ ! ! x}%" !L8L8(None)7 ! !0 ! %L28}Multi-Mouse v2.1c by S.8 ! !LL8 Trew 1991.A8 ! ! 1 ! ! R'Ly}8For help see section 5 ofk8 ! !L8 the manual.8 ! ! 10 !00 !0 !00 ! 1L8A. Start Page......z}.. Ԡ8 ! !0 ! &! 1 1L"9B. Device name....... 9 ! !ؠ7 !77 ! 1LZ9C. Driver filename... D9 ! {}!ɠ0 !00 ! 1L9D. Foreground|9 ! !0 !00 ! 1L9E. Background9 ! !0 !00 ! 1L9F. Res|}erved pages.... ۠9 ! !0 ! 1 1L":G. Dos 2.x file...... : ! !0 !00 ! 1L[:H. Make ST mouse driverD}}: ! !0 !00 ! 1L:J. Make tablet driver}: ! !0 !00 ! 1L:K. Make joystick driver: ! !0~} !00 ! 1L;L. Make trakball driver: ! !0 !00 ! 1L@;M. Make Amiga mouse driver&; ! !0 !0}0 ! 1Ls;N. Make core onlyb; ! !0 !00 ! 1L;Q. Quit; ! !0 !00 ! 1 ! ! R'`}N+S+N+ ! &! ! ! 4' !;; !A ! &L< 1 !00 ! ! ! ! 7" !LN+N+L?E ! &L>S+S+L?F ! &L> 1 !00 ! ! f" !L>L}[>You must reserve atH> ! !0 !00 ! 1L>least 6 pages for}> ! !0 !00 ! 1L>the driver.> !} !0 !00 ! 1 1 !0L/>L?G ! &Lm? 3Ϡ; ! %Ϡ; !;; !L?? ! ! 3$ !Le?Ϡ; !;; !}0 ! %0 ! !+ ! %+Lj?+L?H ! &L? ! _6L?J ! &L? ! _6L?K ! &L? ! _6L?L ! &}L? ! _6L?M ! &L? ! _6L?N ! &L? ! _6L?; !D ! f"; !E ! R" ! !L;; !`LF@You are ad}vised not to0@ ! !0 !00 ! 1L@use any drivers createdh@ ! !0 !00 ! 1L@on this run after@ }! !0 !00 ! 1L@this error occurred.Ԡ@ ! !0 !00 ! 1`0 ! ! R" !L,A00 !} &! ! 5! ! ! !0` AؠA [# ! w' ! w' ! ! !LAK:~A ! ! ' 7 ;Q ! %" !LAGoodbye.A} ! !0 !00 ! 1 ! w' V#`ؠA [#LAError A ! ! ! 1 15 ! !LB -@5L*BPress any key: B} ! !0 !00 ! 1 ! 4' ! ]! !L\A V#`PAA ! ! ! 1 15 ! !LB -@5L*BPress any key: B=! Aʝ  ` ``  } }  `8     `8   `    ^ ~ } e  e &` > &&8  > > ƀ` !  ` =   =  `   }   ` ]   ]  ` I  I `    U  M  E  `  2  (  ׽ } ͽ     `   } }  `  ` > } } }ȱ ` > } } Ƚ `} } ` 腋`8HH``膇` }H8     h}  }  `8           Ā фIJ)ee }慠ф$%Ɓ   ``` #Ji  ` #J #i  ` # #JJ }#JJ8   i L6#8    8  8 ȱ 8 ȱ   } }  }  %`   ȱ 8  8 ȱ L6# }  } 8ȱ僰 6#8 }  ȱ   } Ƚ }  }  }  %`8  8 ȱ  6# ȱ  Ƚ } 8倥偐 $>  % }> `    1 8 Ѝ`    1 8  ? ` JH hJH hJ ?  }`W^M~L LLi0HW!NNi h` 80LMWL>M ^M~L } 8 NW!^N` !`l `! !)I! !! U!`l `!. ! 8LMN !ʎ  8 } ! !` $$%8    `ЍР` `CUTWLMpA"0H")!0!` "0 } ύ ߍ  ! Ȍ! ԩ>/Э   oo`B&L!%L! L "`<"l"0";"N"!" } ## MM"&`l"`&i&؛ " " " " &7& B V0B }D&EJ V0 e& B V`HL` 49CFKNUYbehoty~ },AWq #(-=S]diqv{ }%(*@EJPU\t  N#@#@##`M#L#JJJJH)J#h) JJK#L#: #HH#J# D#J#hHI#K# } D#K#h #J#H#K#I#8nL# @#M#Д`l `` #08;BGJOR_bgjwz}  Z#@#@## }y``W#Y#X# @#W#yX#riN#siR#X#Y#Y#ǩM#yN#M#NM#jNM#jN# }yR#N#NN#jNN#jI #Ђl `` */369>KX`ejquz  G#@#@##` }E# #8)HMF#      #h)F# @#E#`l `` *KQTW]  E#@#@#{#`D }# u#yJJJJ @#D#`l `` 8;E D:MM.COM } !(0)0 !&0'0 !$0%0 !"0#0$0%0 ! ! R" !L0 !"0#0 !$0%0 ! '((0)0 ! ! R" !L0 } !&0'0 !(0)0 ! '( !L00 ! ! '(`0123456789ABCDEF$xx !00)000JJJJ000 !00 ! }`L71Please type in two hex!1 ! !!0 !0 0 ! *0Lp1characters. There is noY1 ! !!0 !0 0 ! *0L1ne }ed to press Return: 1 ! !!0 !0 0 ! *0L11111 ! 4' !11 !A ! f" !L$2 !1 }&!0 ! 5! !1L?2 !1 &!A ! 5! !11 ! ! f" !11 !1 !1 # !1 ! R'1181111 }L1 ! ! R' !1 " ! ]! !1 " !`L 3Please type a filename }2 ! !!0 !0 0 ! *0L>3and press Return: ,3 ! !!0 !0 0 ! *0 !Ǡ2 ! ! e( !2222 ! ! } R" !L 42 !: ! 7"2 !: ! 7" ! !L4L3D:3 ! !ݠ2 ! %۠2 !Ǡ2 !22 !ݠ2 ! $ݠ2 !22  }!`L422Ǡ2 !22 !` !(4)4 ! !&4'4 !%4LR4RR*4+4(4)4N4O4Hȱh !&4'4 &! ! } ! &! ! !%4 &! !*4+48N4*4O4+4Lh4` !44 !44 !44 !44 }4/ !44 !44 !44 ! ,4/ !/ &! &! !+ !44 !44 ! '(/ ! K!44 !44 !44  }! ,44` !5L5Creating driver5 ! !L5, please wait...5 ! ! *0 ! w' ! ! !/ !// ! ' }( ! !\, !v ! 45 ! ! &LE6H- ! !- ! ! 4L6 ! &Lp6. ! !Ӡ. ! ! 4L6 ! }&L6/ !J !ՠ/ ! ! 4L6 ! &L6 / !b !o/ ! ! 4L6 ! w'`x:+6+ ! ! %" !L }7L6(None)6 ! ! 0 ! %L/7}Multi-Mouse v2.1c by S.7 ! !LI7 Trew 1991.>7 ! ! *0 ! ! R'L7For help } see section 5 ofh7 ! !L7 the manual.7 ! ! *0!0 !0 0 !!0 !0 0 ! *0L7A. Start Page........ Ѡ7  }! !/ ! &! 0 *0L8B. Device name....... 8 ! !ՠ6 !66 ! *0LW8C. Driver filename... A8 ! !/ ! }// ! *0L8D. Foregroundy8 ! !!0 !0 0 ! *0L8E. Background8 ! !!0 !0 0 ! *0L8F. Reserved pag }es.... ؠ8 ! !/ ! 0 *0L9G. Dos 2.x file...... 9 ! ! 0 !00 ! *0LU9H. Make mouse driverA9 ! !! }0 !0 0 ! *0L9J. Make tablet driverw9 ! !!0 !0 0 ! *0L9K. Make joystick driver9 ! !!0 !0 0 ! } *0L9L. Make trakball driver9 ! !!0 !0 0 ! *0L1:M. Make core only : ! !!0 !0 0 ! *0LZ:Q. QuitS: } ! !!0 !0 0 ! *0 ! ! R'`N+S+N+ ! &! ! ! 4' !:: !A ! }&L; 1 !// ! ! ! ! 7" !Ly;L;The start page must ; ! !!0 !0 0 ! *0LN;end in 8 or 0.@; ! }!!0 !0 0 ! *0 1 !/L:/ ! ! 5! !/L>B ! &LJC ! & }L< 2: ! %: !:: !LwD ! &LE ! &L< }S+S+L>F ! &L= 1 !// ! ! f" !L=L=You must reserve at= ! !!0 !0 0 ! *0LL=least 6 pages for };= ! !!0 !0 0 ! *0Ly=the driver.n= ! !!0 !0 0 ! *0 1 !/LG ! &L+> 2: ! %: ! }:: !L=Ԡ= ! ! 3$ !L#>: !:: ! 0 ! % 0 ! !+ ! %+L(>+L>H ! &LC> ! 5L>J }! &L[> ! 5L>K ! &Ls> ! 5L>L ! &L> ! 5L>M ! &L> ! 5L>譇: !D ! f": !E ! R" }! !L:: !`L>You are advised not to֠> ! !!0 !0 0 ! *0L%?use any drivers created? ! !!0 !0 0  }! *0LX?on this run afterG? ! !!0 !0 0 ! *0L?this error occurred.z? ! !!0 !0 0 ! *0`/ }! ! R" !L?// ! &! ! 5! ! ! !/` ?~@ [# ! w' ! w' ! ! !L&@K:$@ ! ! ' 6 }:Q ! %" !LS@Goodbye.K@ ! !!0 !0 0 ! *0 ! w' V#`~@ [#L@Error @ ! ! ! 0 *04 ! !L@ }>4L@Press any key: @ ! !!0 !0 0 ! *0 ! 4' ! ]! !L@ V#`?@ ! ! ! 0 *04 ! !L@ Z10 REM !------------------------------!11 REM ! TESTPTR BY SIZ 1991 !12 REM !------------------------------!13 RE}M ! This program demonstrates !14 REM ! some features of Multi-Mouse !15 REM ! in a BASIC environment. !16 REM !--}----------------------------!17 REM 18 REM !------------------------------!19 REM ! Set up a graphics 15 screen !20 REM }! with a text window. !21 REM !------------------------------!22 GRAPHICS 15:COLOR 123 REM !---------------------}---------!24 REM ! Read in the custom shape, a !25 REM ! crosshair. !26 REM !--------------------------}----!27 READ HEIGHT:DIM XHAIR$(HEIGHT*2+3)28 XHAIR$(1)=CHR$(HEIGHT)29 FOR LOOP=2 TO HEIGHT*2+330 READ IN:XHAIR$(LOOP)=CHR}$(IN):NEXT LOOP31 REM !------------------------------!32 REM ! Open the mouse driver and !33 REM ! set the maximum limi}t to !34 REM ! (159,159) so that the mouse !35 REM ! cannot enter the text window.!36 REM !--------------------------}----!37 OPEN #1,12,0,"M:"38 ? #1;"Most":X=159:POINT #1,X,X39 REM !------------------------------!40 REM ! Display the cro}sshair, wait !41 REM ! for a click and plot the !42 REM ! point at the shape. !43 REM !---------------------}---------!44 ? #1;"Click":XIO 32,#1,12,0,XHAIR$45 NOTE #1,X,Y:PLOT X,Y:PRINT X,Y46 REM !------------------------------!47} REM ! Display the standard pointer,!48 REM ! wait for an unclick and draw !49 REM ! a line to that point. This !50 REM }! enables the line to be !51 REM ! "dragged". !52 REM !------------------------------!53 ? #1;"Unc}lick":XIO 32,#1,12,0,CHR$(0)54 NOTE #1,X,Y:DRAWTO X,Y:PRINT X,Y55 GOTO 4456 REM !------------------------------!57 REM ! }Data for the shape. The data !58 REM ! is made up as follows: !59 REM ! Line 63: height,xoff,yoff !60 REM ! Line }64: "white" data !61 REM ! Line 65: "black" data !62 REM !------------------------------!63 DATA 11,3,564 D}ATA 0,16,16,16,16,108,16,16,16,16,065 DATA 56,40,40,40,238,130,238,40,40,40,56------------------------!63 DATA 11,3,564 DP10 REM !------------------------------!11 REM ! TURBOMOD.TUR BY SIZ 1991 !12 REM !------------------------------!13 RE}M ! This program reads in your !14 REM ! Turbo-BASIC XL binary file !15 REM ! and creates a new one that !16 REM ! i}s compatible with some !17 REM ! other MEMLO-changing devices !18 REM ! including my 80:, M: and N: !19 REM ! device} handlers. This !20 REM ! program supersedes 80TBMODI !21 REM ! because the new binary file !22 REM ! will now lo}ad correctly !23 REM ! whether or not a low-memory !24 REM ! device is used, there is no !25 REM ! need to keep a s}eparate copy !26 REM ! of Turbo-BASIC XL. !27 REM !------------------------------!28 REM 29 REM !--------------}----------------!30 REM ! Read in the names of the !31 REM ! input and output files. !32 REM !-------------------}-----------!33 TRAP #ERROR34 DIM IN$(20),OUT$(20),BUFFER$(4000)35 INPUT "Input file: ";IN$36 INPUT "Output file: ";OUT$}37 CLOSE #1:OPEN #1,4,0,IN$38 CLOSE #2:OPEN #2,8,0,OUT$39 REM 40 REM !------------------------------!41 REM ! Modify the }first segment to !42 REM ! replace the fixed MEMLO with !43 REM ! MEMLO-checking code. !44 REM !-----------------}-------------!45 GET #1,MLL,MHH:REM file header 46 GET #1,MLL,MHH:REM Segment head47 GET #1,MLL,MHH:REM Segment tail48 GE}T #1,MLL,MHH:REM Memlo consts49 PUT #2,$FF,$FF:REM file header50 PUT #2,$02,$21:REM segment head51 PUT #2,$1A,$21:REM segm}ent tail52 PUT #2,$A0,MLL,$A9,MHH53 PUT #2,$CD,$E8,$02,$9054 PUT #2,$0F,$D0,$07,$CC55 PUT #2,$E7,$02,$90,$0856 PUT #2,$F}0,$06,$8D,$E857 PUT #2,$02,$8C,$E7,$02,$6058 PUT #2,$E2,$02:REM init segment59 PUT #2,$E3,$02:REM init segment60 PUT #2,$}02,$21:REM run new code.61 REM 62 REM !------------------------------!63 REM ! Copy the rest of the file !64 REM ! in }the usual way, making !65 REM ! a 4000-byte copy pass until !66 REM ! an EOF or an error occurs. !67 REM !---------}---------------------!68 REPEAT 69 TRAP #EOF70 BGET #1,ADR(BUFFER$),400071 # EOF:PB=DPEEK($0348+$10)72 TRAP #ERR}OR73 LAST=PB<400074 IF PB>075 BPUT #2,ADR(BUFFER$),PB76 ENDIF 77 UNTIL LAST78 REM 79 REM !------------------}------------!80 REM ! Error routine: If EOF then !81 REM ! the copy completed or the !82 REM ! user ended his input. } !83 REM ! Otherwise display the error. !84 REM !------------------------------!85 # ERROR:CLOSE 86 IF ERR=13687 } PRINT "Program finished OK."88 ELSE 89 PRINT "Error ";ERR;" at line ";ERL90 ENDIF 91 END OR:CLOSE 86 IF ERR=13687 a!(ʝ  ` ``  } }  `8     `8   `    ^ ~ } e  e &` > &&8  > > ƀ` !  ` =   =  `   }   ` ]   ]  ` I  I `    U  M  E  `  2  (  ׽} ͽ     `   } }  `  ` > } } }ȱ ` > } } Ƚ `} } ` 腋`8HH``膇`}H8     h}  }  `8           Ā фIJ)ee}慠ф$%Ɓ   ``` #Ji  ` #J #i  ` # #JJ }#JJ8   i L6#8    8  8 ȱ 8 ȱ   } }  }  %`   ȱ 8  8 ȱ L6# }  } 8ȱ僰 6#8}  ȱ   } Ƚ }  }  }  %`8  8 ȱ  6# ȱ  Ƚ } 8倥偐} "M:"Where n is the channel number withwhich to access the pointer.Issuing the OPEN statement makes apointer visible in !?}the middle ofthe screen. To allow the pointer tobe moved around, issue thefollowing statement: NOTE #n, X, YThis wil!@}l allow the pointer to bemoved using the mover, until thebutton is pressed. It then returnsthe position of the pointer int!A}othe X and Y variables. The positionis returned as co-ordinates in thecurrent screen mode. For example,if you are in Grap!B}hics 8 then Xwill be in the range 0..319 and Yin the range 0..191.You can force the pointer to acertain position using t!C}he POINTstatement: POINT #n, X, Ywill position the pointer at thepixel given in X, Y. Of course insome modes the pix!D}els are quitebig. With POINT, the pointer isalways positioned at the top leftof the pixel. NOTE will return thescreen co-!E}ordinates of a pixelwhenever any part of the pixel isbeing pointed at. So the pointermay move slightly if you do a setof !F}statements such as: NOTE #n, X, Y POINT #n, X, YTo get rid of the pointer from thescreen, use CLOSE #nPerform!G}ing a NEW or END in BASICautomatically CLOSEs all channelsexcept 0.You can change the colours of thepointer by POKEing l!H}ocations 704(foreground) and 705 (background).The value to poke into the bytes isgiven as: luminance + (16 * colour!I})tions 704(foreground) and 705 (background).The value to poke into the bytes isgiven as: luminance + (16 * colour 3.0 New Features.Many new features have been addedto the Multi-Mouse driver. These donot increase the amount of userme%K}mory required, because they sitin the unused portion ofplayer/missile memory. In fact youcan configure the program to give%L}yourself more user memory than thelast version. However ,the extrafeatures do mean that you cannotuse any of the missiles%M} from theplayer/missile system, becausesome of the code lies in that area.New features include: * Compatibility with T%N}urbo-BASIC XL. * Relocation and configuration. * Easy user-defined pointers. * New CIO commands. * More flexi%O}ble NOTEing. * Pointer window definition. * A better tablet handler. * An easier interface for machine-code rout%P}ines.3.1 New CIO commands.You can return the status of thebutton using a STATUS command. Ifany button on the pointing %Q}deviceis pressed, it will return 0,otherwise it will return 1. Forexample: STATUS #n, X IF X=0 THEN PRINT "You're D%R}ead!" IF X=1 THEN PRINT "Aargh! You Got Me!"You can also find out where theprogram is loaded, using a GETcommand. %S}It returns a byte which isthe page number of the start of theMulti-Mouse program. This is usedmainly to POKE into the Mult%T}i-Mousedata table (see section 6). Forexample: GET #n, PAGE:BASE=PAGE*256 PRINT "Multi-Mouse loaded from address %U}";BASE3.2 PUT command.There is also a PUT or PRINTcommand. This command is used toconfigure how Multi-Mouse respondst%V}o NOTE and POINT.In the default mode, the NOTEcommand waits until a button ispressed, returning the position ofthe point%W}er; the POINT command setsthe pointer position. However youcan change these actions using aPUT command. There are sevenup%X}percase letters that you can PUT,each having a different action. Ifyou use any letter other than theseven allowed, it is i%Y}gnored. Thislets you PRINT mnemonics which makethe statement's purpose moreobvious. For example: PRINT #n, "Click" %Z}PRINT #n, "isWhere"Only the uppercase letters C and Whave any effect in thesestatements. The key letters are: C,U, W, T,%[} P, L and M. The last threeare used to adjust how the POINTaction works. The first four areused to adjust how the NOTE act%\}ionworks.You are not advised to PUT anyother uppercase letters as part ofyour commenting text, becausefuture versions m%]}ay use them.Lower-case letters are guaranteedto be unused, and are safe forcommenting.3.2.1 NOTE actions.PRINT #n, "C%^}lick"Putting a "C" to the channel makesall future NOTE commands wait untilthe button is being pressed, thenreturns the c%_}o-ordinates. If thebutton is being pressed when theNOTE is issued, it returns straightaway.PRINT #n, "Unclick"Putting %`}a "U" to the channel makesall future NOTE commands wait untilthe button is NOT being pressed,then returns the co-ordinates%a}. Ifthe button is not being pressedwhen the NOTE is issued, it returnsstraight away.PRINT #n, "Toggle"Putting a "T" to%b} the channel makesall future NOTE commands examinethe state of the button when theNOTE is issued. NOTE then waitsuntil th%c}e button changes state,then returns the co-ordinates. Soif the button is pressed when theNOTE is issued, it will allow th%d}epointer to be moved until thebutton is released. Otherwise itwill allow the pointer to be moveduntil the button is press%e}ed.PRINT #n, "Whereis"Putting a "W" to the channel makesall future NOTE commands returnimmediately with the co-ordinate%f}sof the pointer. The NOTE will notallow any pointer movement.An OPEN of the M: device sets theNOTE mode back to "Click".%g}3.2.2 POINT actions.It is now possible to set thewindow inside which the pointer maybe moved.The default is to set the%q}1BDOS SYSB(!DUP SYSBEIMM1CFG COMBBMM2CFG COMBTESTPTR BASBTURBOMODTURB%FILEDUMPCOMbMMMAN1 DOCb4MMMAN2 DOCbmJMMMAN3 DOCb"MMMAN4 DOCbMMMAN5 DOCb,MMMAN6 DOCb"!MMMAN7 DOCbCMMMAN8 DOCb`MMMAN9 DOCB rTABLET COMB {TRAKBALLCOMB STMOUSE COMB AMIGA COMB MM COMwindow edges the same as themargins at the edges of thestandard screen. You may want toalter this so that you restrict th%r}epointer to a smaller window.PRINT #n, "Most"Putting an "M" to the channel makesthe next POINT command set the bottomr%s}ight corner of the window. Forexample, the following statementsrestrict the pointer to the graphicswindow of a split graph%t}ics 7 screen: GRAPHICS 7 OPEN #1, 12, 0, "M:" PRINT #1, "Most" X=159:Y=79:POINT #1,X,YPRINT #n, "Least"Putti%u}ng an "L" to the channel makesthe next POINT command set the topleft corner of the window. Forexample, the following state%v}mentsrestrict the pointer to the textwindow of a split graphics 8 screen: GRAPHICS 8 OPEN #1, 12, 0, "M:" PRINT #%w}1, "Least" X=0:Y=192:POINT #1,X,YPRINT #n, "Position"Putting a "P" to the channel makesall future POINT commands work%x} asnormal, setting the pointer position.The "Least" and "Most" commands onlyhave currency for one POINT afterwhich Multi-%y}Mouse returns to the"Position" state anyway. However thiscommand may be useful for cancellinga previously given "Least" or%z} "Most"which has not been followed by aPOINT command. An OPEN of the M: device sets thepoint mode back to "Position".%{}3.2.3 Notes on NOTE and points aboutPOINT. Whenever you define a window, thecurrent position of the pointer ischecked. I%|}f the pointer is outsidethe new window then it is moved tothe nearest edge or corner.POINT and NOTE commands alwaysrestr%}}ict the pointer to the window.The co-ordinates returned by a NOTEare always relative to the top leftcorner of a standard g%~}raphics screen,not relative to the top of the window.If you would rather it was the otherway about then tell me. I couldn'%}tmake up my mind.You may set the window to includeparts outside the standard screen.Multi-Mouse will still produceco-or%}dinates. If the pointer is aboveor to the left of the standard screenorigin then it will return a largepositive value. (Ac%}tually it's atwo's complement number, so you canwork out the "real" co-ordinate valueby adding it to -256.) If the pointer%}is below or to the right of thebottom right of the standard screenthen the values just keep going in apositive direction.%}The use of a window outside thenormal screen area is not encouraged.It will not hurt Multi-Mouse butfuture versions may %}not support thisfeature in the same way, if at all.You are not encouraged to define awindow and then switch graphics mode%}s. If the new graphics mode is a lowerresolution than the old, the activearea may be half-way across a pixel,because the %}physical screendimensions and position of the activearea will stay the same. This couldbe quite frustrating for a user.%}3.3 The RENAME XIO.XIO 32 (RENAME from some languages)has now been defined so that you canchange the way your pointer loo%}ks.The pointer is stored as a series ofconsecutive bytes and it is intendedthat you store your own pointer in astring in %}BASIC, or as a char arrayin C. The format of the XIO is: XIO 32, #n, 12, 0, MYPOINT$Your pointer can be any length up %}to255 bytes. However, the longer thepointer is, the longer it takes toerase and draw, and the slower theresponse to a dev%}ice will be. Alength of 16 or so is enough for mostpurposes. (The standard pointer is 14bytes long.) MYPOINT$ (or whatever%}you happen to call it) should becomposed as follows:MYPOINT$(1,1) should contain CHR$(h)where h is the height of the poi%}nterin pixels.MYPOINT$(2,2) should contain CHR$(x)where x is the x offset. A pointerhas an associated x and y offsetwhi%}ch indicate the position of thedatum point relative to the top leftof the pointer. The datum point isthe point from which %}the co-ordinatesare calculated, and it is this pointwhich is limited to the window. The xoffset is the number of player/m%}issile pixels from the left edge ofthe stripe to the datum, and can beany number in the range 0..255. Ifyou need an x offs%}et to the left ofthe left edge of the stripe then useCHR$(256-n) where n is the offset,for example CHR$(256-3) would give%}you an offset 3 pixels to the left ofthe left edge.MYPOINT$(3,3) should contain CHR$(y)where y is the y offset. The y off%}setis the number of player/missilepixels from the top of the stripe tothe datum, and can be any number inthe range 0..255%}. If you need a yoffset above the top of the pointerthen use CHR$(256-n) where n is theoffset, for example CHR$(256-10)wo%}uld give you an offset 10 pixelsabove the top edge.MYPOINT$(4,3+h) contains theforeground shape data (h being theheight %}of the shape). These aredefined in the normal way forcharacters and player/missilegraphics (see section 3.3.2 for anexamp%}le).MYPOINT$(4+h,3+h+h) contains thebackground shape data. Shapes havetwo colours so that they are alwaysdistinguishable%}. However there's notmuch point, although it's possible,to have both background andforeground at the same pixel.3.3.1 N%}otes on the RENAME XIO.When you issue an XIO 32 the pointeris immediately updated on screen.However, you have not actuall%}y made acopy of the pointer into anyMulti-Mouse data area (just theplayer/missie stripes). The pointerdata only exists in%} your string. Thepointer on screen is updated withthis information whenever you performany of the following: Issue an%} XIO 32 command. Move the pointer vertically with a NOTE. Issue a POINT command. OPEN the M: device.Multi-Mo%}use keeps track of what iscurrently being displayed and so itcan work out what to erase and fromwhere, even though the cu%}rrentpointer is different from the one onscreen (it ain't so dumb as to erasethe whole stripe each time). Because the po%}inter data is only heldin your string, any changes in thestring will be taken into account thenext time the screen pointer%} isupdated. When switching betweenpointers, the new pointer is drawn sothat the datum point is kept in thesame place as b%}efore. Changing thecontents of your string is notencouraged; a much cleaner way is tokeep a different string for eachpoin%}ter and just XIO 32 with the oneyou want, for example: XIO 32, #n, 12, 0, XHAIR$ NOTE #n, X, Y XIO 32, #n, 12, 0, %}BUSYBEE$ NOTE #n, X, YWhen you OPEN the M: device, thestandard pointer is always restored.You can also restore it at a%}ny timein your own program. To do thisdefine a pointer of zero height. Forexample: XIO 32, #n, 12, 0, CHR$(0)You sho%}uld use a 12 as the secondparameter to any XIO. (That is, useXIO cmd, #n, 12, .....) This isbecause a bug in the operating%} systemmeans that this number is treated asthe number you used in your OPENstatement, and so using 12 means youOPENed for%} read and write. If you useanother number, the CIO may reportthat you have read-only or write-onlyaccess if you try to PRI%}NT or GETfrom the device. Some languages donot suffer this problem (Atari BASICworks OK with any number), but othersdo (T%}urbo-BASIC XL requires a 12). 3.3.2 A sample shape.This section shows how to define a%}crosshair pointer. It really is quitesimple.First, mark out your shape on a grideight dots wide and however deep youwan%}t, like this: ..bbb... 0 56 ..bFb... 16 40 ..bFb... 16 40 ..bFb... 16 40 bbbFbbb.%} 16 238 bFF.FFb. 108 130 bbbFbbb. 16 238 ..bFb... 16 40 ..bFb... 16 40 ..bFb... 1%}6 40 ..bbb... 0 40For each row, you have to addtogether a number for each of the'b's (background) and each o%}f the'F's (foreground) to get the numbersin the columns to the right of thegrid. Each column in the grid has anassociated%} number. The leftmostcolumn is worth 128, then 64, 32, 16,8, 4, 2, and the rightmost is worth 1.Add together the numbers f%}or all thecolumns with an 'F' in them. Forexample row 6 has 'F's in columnsworth 64, 32, 8, and 4, so the totalforeground%} for that row is 108.Similarly, row 6 has 'b's in columnsworth 128 and 2 so the totalbackground for that row is 130.The %}height of the shape is 11 rows.The datum is 3 columns from theleftmost column and so the x offsetis 3 (note that the leftm%}ost columnhas an x offset of 0). The datum is 5rows from the top row and so the yoffset is 5 (again, the topmost rowhas a%} y offset of 0). So the totaldata for the shape is: DATA 11,3,5 DATA 0,16,16,16,16,108,16,16,16,16 ,0 DATA 56,4%}0,40,40,238,130,40,40,40, 56You can then read this into yourpointer string with statements suchas: READ HEIGHT %}DIM XHAIR$(HEIGHT+HEIGHT+3) XHAIR$(1)=CHR$(HEIGHT) FOR LOOP=2 TO HEIGHT+HEIGHT+3 READ IN:XHAIR$(LOOP)=CHR$(IN) N%}EXT LOOPWhen defining your shape, rememberthat a player/missie pixel is twiceas wide as it is high. If you forgetthis, y%}ou may find that your shapeslook rather squashed.3.4 Old Bugs.All reported bugs from previousversions have now been co%}rrected.Details of these corrections follow.On version 1.0 there was a bug that aNOTE in Graphics 8 would return 255into%} the Y co-ordinate when thecursor was at the top of the screen.On version 1.0 theRe was a bug thatan OPEN would not alway%}s display thepointer. This has now been cured.There still remains the "bug" thatchanging graphics mode will upset the pl%}ayer/missile system. This isbecause of bad programming in the OSand cannot be avoided except byintercepting the GRAPHICS c%}all. Youshould CLOSE the channel and re-OPENit whenever you change graphics mode.If you do not, you will get an uglystrip%}e. You will not harm theMulti-Mouse software. The Break key is still not checked,so that Break has no effect until theha%}ndler returns control to yourapplication.e. The Break key is still not checked,so that Break has no effect until theha$,4.0 Configuration.Before you use the Multi-Mousesoftware you must configure it foryour application. Configuring allowsyo)}u to set your own preferences andto change the defaults. Configuringmakes the program operate with agreater variety of oth)}er software,because you can change it to fit inwith that software.Configuring is done by the programMMCONFIG.COM. This i)}s the onlyprogram yo need to create devicedrivers. All of the code for the fourdevice drivers is included in theMMCONFIG.)}COM binary file.To run MMCONFIG, use your DOS'sbinary file load option. You cannotBRUN it from Turbo-BASIC XL.The confi)}guration options areselected by pressing the appropriateletter key, and sometimes also typingin a value. The options are d)}escribedbelow:4.1 Start Page.Option A allows you to change thestart page. This is a hex numberwhich indicates where t)}he Multi-Mouseshould sit in memory. Normally youwill not have to worry about thisbecause it defaults to the lowestpossibl)}e value for the currentconfiguration of your system. You canchange it if you know that you wantMulti-Mouse elsewhere to wo)}rk withanother program.The best advice is to load in all theutilities you would normally use whenusing Multi-Mouse, then)} run thisprogram and leave this option at thedefault. Valid values are hex valuein the range 00-F8, but the startpage mus)}t lie on a 2K boundarybecause of the player/missilegraphics.4.2 Device Name.If you already have a driver whichhas the)} M: handle, you will want tocall Multi-Mouse another name. Youcan do this by selecting the devicename using option B. For )}example, ifyou chose H then you would use thefollowing command to open the device: OPEN #n, 12, 0, "H:"4.3 Driver )}filename.Option C allows you to change thename of the file that is written outby the program. You are asked to typea fil)}ename. If you omit to include adevice specifier, D: is assumed.4.4 Foreground Colour.This option specifies the default)}foreground colour of the pointer. Thecolour is that of the background ofthe screen, and pressing D cycles it.4.5 Backgro)}und Colour.This option specifies the defaultbackground colour of the pointer. Thecolour is that of the border of thescre)}en, and pressing E cycles it.4.6 DOS 2.x file.If you are using Multi-Mouse underany Atari DOS 2 derivative then youcan)} get it to load another file afterit has loaded. You can use this toload a chain of files in an AUTORUNsequence. My other )}device driversalso allow you to do this so you arenot restricted to one AUTORUN perdisk. Note that the filename is thatof)} a binary file (not a BASIC file)and must include the D: part. Seesection 5 on using Multi-Mouse withTurbo-BASIC XL if you)} wish to useTurbo-BASIC XL with Multi-Mouse.If you press Return in response tothe prompt without entering afilename, the)}n (None) will appear asthe filename. This means thatMulti-Mouse wil not load anotherbinary file once it is loaded.4.7 R)}eserved pages.Option G allows you to rseserve pagesof memory for your own use, forexample to use players 2 & 3 of thepla)}yer/missile system, or to reservermemory for a user-defined characterset. Multi-Mouse by default reservessix pages, and se)}ts MEMLO to thestart page + $06. If you reserve morepages, then those pages between(start page + $06) and (start page +re)}served pages -1) inclusive are freefor your own use.4.8 Creating the files.Options H-L allow you to create abinary fil)}e for any of the fourdrivers included. Alternativelyoption 10 allows you just to createcode for the CORE section. Thisall)}ows you to append your own machinecode device driver to it. Do not tryto run the CORE program on its own;you must append a)} binary file whichtakes care of the vectors detailed insection 6. You will only want to usethis option if you want to writ)}e yourown device driver.If you are using DOS 2.x, you willwant to name your file AUTORUN.SYS sothat it will load automat)}ically whenyou boot the disk. Or you may want tohave all four drivers on the disk andselect from a menu which one to load.)}lly whenyou boot the disk. Or you may want tohave all four drivers on the disk andselect from a menu which one to load.(5.0 Multi-Mouse and Turbo-BASIC XL.Multi-Mouse can be configured for usewith Turbo-BASIC XL, but thefollowing notes must -}be observed.Turbo-BASIC XL sits in low memory,whereas Atari BASIC sits in highmemory. Unfortunately this means thatyou m-}ust have a different Multi-Mousebinary file for the different BASICs.(The only thing you need to change iswhere the progra-}m sits in memory.Everything else can stay the same.)The starting page (option A from themenu) should be at least $38 for u-}sewith Turbo-BASIC XL.Before you use your drivers, you mustalso modify your copy of Turbo-BASICXL. The standard copy has-} a rathernasty approach to MEMLO. It setsMEMLO regardless of any other programthat is in low memory. The programTURBOMOD.-}TUR allows you to create anew copy of Turbo-BASIC XL which onlyadjusts MEMLO if it is too low forTurbo-BASIC XL to operate-}. This isgood programming practice, and all mydevice drivers use this method sothey can all be used together.TURBOMOD.TU-}R is better than aprevious version of this utility,80TBMODI.TUR, which I produced for my80-column device. The new version-}allows you to use the same copy ofTurbo-BASIC XL whether or not you arenot using another application thatsits in low memor-}y. You can use thiscopy with the 80-column device, ofcourse. TURBOMOD.TUR is a Turbo-BASICXL program and you will need to -}runit under the Turbo-BASIC XLenvironment.Once you have modified Turbo-BASICXL, your altered copy can be usedwhether or-} not you are using theMulti-Mouse utility (or any otherlow-memory utility).5.1 Notes on Turbo-BASIC XL.You cannot BLOA-}D the Multi-Mousedriver (or any other application thatsits in low memory) from Turbo-BASICXL: it must be the other way aro-}und.This is because your BASIC programsits in low memory it would be erasedby the newly-loaded driver. So if youwant Turb-}o-BASIC XL to autoboot,rename the binary file to TURBO.COMand use option G on the MMCONFIG menuto load from it. Of course -}you canonly do this under DOS 2.x. If youhave another DOS (for exampleSpartaDOS X) then create a batch filewhich loads in-} the Multi-Mouse driverand then loads in Turbo-BASIC XL.I have not tried Multi-Mouse withcompiled Turbo-BASIC XL programs-}. Multi-Mouse driverand then loads in Turbo-BASIC XL.I have not tried Multi-Mouse withcompiled Turbo-BASIC XL programs,6.0 Machine Code Access.This section is intended for thosewho wish to add their own devicedrivers for such things as the1}keyboard or a light pen. It does notdiscuss in general the way theprogram works. I hope that the codeis commented enough t1}o make itunderstandable. Multi-Mouse is written in two parts.The first, CORE, contains theMulti-Mouse primitives such as1} movethe pointer to a given position,convert player/missile co-ordinatesto OS ones, all the CIO handling, andso on. The o1}ther part is thedevice-dependent part which handlesmovement and click operations for aparticular device. The two partscom1}municate through three procedureswhose addresses are defined in atable along with many other things.The address of this t1}able can beaccessed by performing a GET andmultiplying the result by 256. (Thetable always starts on a pageboundary.) I g1}uarantee that thistable and the following callingmechanisms will stay the same forfuture issues. I do not guarunteeanythi1}ng else. Do not call particularaddresses or assume that certainlocations hold certain values.You must decide for yoursel1}f where toplace your driver. You are notencouraged to use the player/missilearea, because future versions ofMulti-Mouse m1}ay use it. You can update the table at any time,even from BASIC, and your changesremain until reboot, except for thoseth2}ings that are always updated on anOPEN (detailed in sections 2 and 3).The table contains:Address Mnemonic Contents2}------- -------- --------+0 and +1 calcxy Address ofpointer move routine.+2 and +3 movep Address ofd2}evice move routine.+4 and +5 clickp Address ofdevice click routine.+6 and +7 saddr Address ofshape (i.e. add2}ress of string passedto XIO 32, or the default).+8 xcoord Pointer xposition (P/M coord).+9 ycoord 2} Pointer yposition (P/M coord).+10 forecol Foregroundcolour on OPEN.+11 backcol Backgroundcolour2} on OPEN.+12 minx Left edge ofactive area (P/M coord).+13 miny Top edge ofactive area (P/M co2}ord).+14 maxx Right edge ofactive area (P/M coord).+15 maxy Bottom edge ofactive area (P/M co2}ord).6.1 Vectors.The calcxy vector is supplied by theCORE system. By doing an indirect JSRthrough this vector you can 2}get andset the co-ordinates of the pointer.You are encouraged to use this vectorto get the co-ordinates rather thanlook u2 }p xcoord and ycoord in thetable. (All of the supplied devicedrivers use the vector.) The calcxyroutine should be called wi2 }th a valuein the A register. The lowest threebits when set cause the calcxyroutine to:Bit Function--- -------- 2 }0 Set the x position to thevalue in the X register. 1 Set the y position to thevalue in the Y register. 2 For2 }ce a redraw of the pointer.The A register is unchanged by theroutine. X and Y are loaded with theactual co-ordinates of t2 }he cursor:these may be different from yourrequested co-ordinates if the pointerwas limited to the active area. Make sure2} all "unused" bits of A arereset, because future versions mayuse them for other purposes. You arenot required to make sure2} that X andY are in range: that is doneautomatically. Even with bit 1 set,the pointer is only updated if theactual y co-o2}rdinate has changedsince the last screen update. If youmust have the screen updated then setbit 2. The only reason you sho2}uldwant to set bit 2 is if you changethe pointer address (saddr) to a newpointer. For example with a light penyou may wan2}t a completely blankpointer when the light pen is lifted.But try to leave things as you findthem, or your user may get ann2}oyed.Example call to calcxy: LDA #%000 ; Get the status JSR indirect ; of the pointer. : 2} : indirect: JMP (calcxy)The actual values loaded into X and Yare player/missile co-ordinates ofthe position of the d2}atum point. The click vector should be providedby your driver. It is used todetermine the state of the button.Your routi2}ne should set A to 0 if thebutton is pressed, and to 1 if it isnot pressed. You are not required tosave any registers or f2}lags. End yourroutine with a RTS. Example (fromJOYSTICK): click: LDA stick1 ; Get stick value RTS 2} ; Simple eh!The movep vector should be providedby your driver. It is called by NOTEto allow the pointer to be movedarou2}nd. On entry, the A register willbe set to indicate the exit condition.If the click function returns thevalue in this regi2}ster your routineshould return. NOTE decides the valuedepending on whether it is in Click,Unclick or Toggle mode.Your mo2}vep function should move thepointer around using the calcxyvector. It should return with a RTS.You are not required to sav2}e anyregisters or flags. Good practicedictates that you should call yourclick function to determine the exitcondition, al2}though only a puristwould do this by going through theclickp vector. For example: movep: STA exit ; Save exitcondi2}tion loop: LDA #0 ; Main loop. : : LDA #%011 ; Set X and Y. JMP indirect ; update2}screen. JSR clickp ; Done yet? CMP exit ; Check exitcondition. BNE loop ; No, loopb2 }ack. RTS ; Yes, done. indirect: JMP (calcxy)heck exitcondition. BNE loop ; No, loopb0E7.0 How MMCONFIG.COM was generated.MMCONFIG.COM was generated largelyautomatically, and it may be usefulto discuss the wa6"}y I did it.The 6502 processor does not make iteasy to generate relocatable code ofany size, because there are norelative6#} jump instructions and so on.It is therefore difficult to writecode that will relocate itself whenit loads. This is furthe6$}r hinderedbecause the standard DOS loader mustload programs into absolute addresses.My solution is to produce aconfigura6%}tion program which allowsthe programs to be configured to workat a particular place in memory. Ofcourse, this does mean th6&}at anyparticular configuration is thenfixed once the file is written out. The first time I used this method waswih my 806'}-column driver. In thatinstance the configuration programwas written in BASIC, which made itrather slow, so this time I ch6(}ose towrite it in PL65 (which I used towrite Multi-Mouse itself, except thatI only used assembly language and nohigh-leve6)}l statements). 7.1 Generating data tables.The method I use is to compile all ofthe programs twice, at differentplaces6*} in memory. The first time theyare compiled at $2000, the second at$3000, although in fact the secondcan be compiled on an6+}y page boundary.The first object file is given theextension .20 and the second .30. TheFILEDUMP program is then run which,6,}when given the filename, takes thetwo versions and produces a .REC filefrom them. For example given thefilename CORE it t6-}akes CORE.20 andCORE.30 and generates CORE.REC. This.REC file contains PL65 statementsand can be directly included into th6.}eMMCONFIG program with no furtherprocessing.The .REC file contains two datatables: The first is just a hex dumpof the .6/}20 file. The second givesoffsets into this table where thedata bytes are different between the.30 and .20 files.Effectiv60}ely the only differences willbe page addresses of data items andprocedures within the program. Byadding on a delta value t61}o each ofthese values, the program caneffectively be relocated by wholepages.7.2 Advantages & disadvantages.This meth62}od has the flaw that thecode can only be relocated by wholepages, although in this case there isno disadvantage because it63} must starton a 2K boundary for the player/missile graphics to work. Also, itcannot cope with any arithmetic onaddresses 64}other than additions andsubtractions. That is, if an addresswas say multiplied by three then therelocator could not detect65} it.However, it is very unusual (andthoroughly bad practice) to doanything to addresses other than addor subtract offsets66} from them.The beauty of it is that therelocation is entirely automatic, andthat all that is needed to generate abinary 67}file is to dump the firstbuffer straight to disk. It alsomakes the configuration programstand-alone with no need to have a68}nyother files to run the configuration.The write_code procedure in theMMCONFIG program actually performsthe relocation. 69}It calls add_delta torelocate the code, writes the buffer,and then calls add_delta again torelocate the code back to itso6:}riginal position, so that it can berelocated to a different place in thesame run. 7.3 Other configuration.The other p6;}art of the configurationis to configure items such ascolours, the DOS file to load, and soon. For these there are a set of6<}offsets into the CORE data table,which is then updated whenever theoptions are selected. The offsetshave to be worked out6=} manually, sincethere is no easy way to have themautomatically computed. But the jobcan be completed fairly easily armedw6>}ith a cross-reference and a listingof the program from which the dumpwas created. (That is, the COREsource code.)In fact6?} it is these miscellaneousconfigurable items which are the realproblems to program for; therelocation is very simple once 6@}theprocedures have been written. I tryto offer a fairly reasonable set ofitems but it could be taken further,the idea is 6A}to know when to stop. Ifyou think that a particular variableneeds to be configurable, for examplethe position of the point6B}er on anOPEN command, then tell me about it.ular variableneeds to be configurable, for examplethe position of the point408.0 Device Drivers.This section describes data formatsof the four supported input devices.8.1 Mouse.An ST mouse retur:D}ns a four-bit valueinto the joystick pins. The value canbe read using STICK(1). My devicereads the hardware register direc:E}tly,because the shadow register isupdated too slowly to keep up withfast mouse movement.The four-bit value is split into:F} twotwo-bit pairs. Bits 1 and 0 handlethe horizontal axis, bits 3 and 2handle the vertical axis.The two bit-pairs change:G} in a Graycode as the mouse moves. The Graycode order is thus: 00 01 11 10 00 again, and so on.If the mou:H}se in one direction, thissequence is returned continuously asthe mouse moves. If it is moving inthe opposite direction, th:I}e sequenceis returned in the opposite order.All that is necessary to determinemovement is to compare the two-bitcode aga:J}inst the last read code. Ifthe two are the same, no movement hasoccured. If they are different, thecode is checked against:K} a tablecontaining the Gray code sequence. Ifit matches the value in this table,it is moved in the appropriatedirection, :L}else it is moved in theopposite direction.The left button on the mouse isreturned like the joystick button, inSTRIG(1). :M}The right button comes outonto the second paddle. When theright button is pressed the paddlevalue falls from 228 to about :N}100.However I do not use this valuebecause I found it to be unreliable.Did you know you can play MissileCommand with a m:O}ouse when in Trakballmode?8.2 Trakball.The trakball, like the mouse, returnsa four-bit coded value where two bitsare :P}for the vertical axis and two forthe horizontal. As with the mouse, Iread the hardware register directly,because the shado:Q}w is updated tooslowly for fast trakball movement.Bit 3 of the trakball output changeswhen there is vertical movement. If:R}the value of bit 3 has changed sincelast read, bit 2 indicates thedirection of movement, 1=down, 0=up.Similarly, bit 1 c:S}hanges when thereis horizontal movement. If the valueof bit 1 has changed since last read,bit 1 indicate the direction of:T}movement, 1=right, 0=left.All trakball trigger values return inthe same way as the joystick, viaSTRIG(1).8.3 Touch Tab:U}let.The Touch Tablet returns two paddlevales. The horizontal axis isreturned in PADDLE(2), and thevertical in PADDLE(3).:V}The axes both run from 0 to 228. Inthe horizontal axis, 0 is the left ofthe tablet, and 228 is the right ofthe tablet. I:W}n the vertical axis, 0is the bottom of the tablet and 228is the tp of the tablet.I "trim" the values so that there isno :X}need to have the pointer rightagainst the edge of the tablet.Notice that the vertical axis isinverted compared to that of :Y}thescreen.The touch tablet has three buttons,and each of these resets one bit inSTICK(1). Since I don't discriminatebet:Z}ween buttons I just check whetherany bit is reset by comparing thevalue of STICK(1) with %1111.8.4. Joystick.The joyst:[}ick returns a four-bit valuein STICK(1). Each bit corresponds toone of the directions. Bit 0 is setto 0 when there is up m:\}ovement. Bit 1is set to zero when there is downmovement, bit 2 when there is leftmovement and bit 3 when there isright mo:]}vement.Diagonal movements set two of thebits to zero, for example up and leftsets bits 0 and 2 to zero. It ispossible to:^} set both 'up' and 'down'bits, but it should never happen(Multi-Mouse will just cancel nothbits out so no movement will oc:_}cur.)The trigger button is, of course,returned in STRIG(1).-Mouse will just cancel nothbits out so no movement will oc8A9.0 Endnotes.This section includes miscellaneousinformation concerning your beta-testrelease and also requesting your hel>a}p.9.1 New Tablet Driver.I have redesigned the tablet handlersince version 1.0 of Multi-Mouse. Theaveraging is now muc>b}h better (it hada bug in it before). It also preventsthe shape from zooming to the topright corner when the pointer isrem>c}oved from the tablet. Instead itjust stays where it was.9.2 Other Device Drivers.I have written Multi-Mouse with theid>d}ea of allowing people to add theirown device drivers. I hope that Ihave provided a good enough interfaceand documentation >e}to allow this.However, if you have a device thatyou would like to use with Multi-Mouse, but don't feel up to writingfor >f}it yourself, I can help. Contactme and I will try to arrangesomething.I have only programmed for thosedevices which I ow>g}n. I should beespecially interested if anyone haswritten a device driver for one thefollowing devices, or wants onewritte>h}n: Koala Pad (should be just a new Tablet driver.) Light Pen Keyboard9.3 Distribution.You>i} may distribute Multi-Mouse at nocharge. The only condition is thatyou must not modify the programsbefore distributing the>j}m. This issimply because otherwise I end upgetting technical questions frompeople who have a modified copy thatI don't kn>k}ow about. If you have anymodifications, include the details asa text file on the disk, and pleasesend me a copy.9.4 Ove>l}r to You.If you have written a device yourself,I would be very pleased to receive acopy of the source code. With yourper>m}mission, I will then include it inthe configuration program anddocument it as part of Multi-Mouse.Of course, you will be c>n}redited asthe author.If you spot any errors in thedocumentation, of either a technicalor a typographical nature, please>o}annotate the documentation and returnit. I need your support. As a user ofmy utilites, tell me what you thinkof them and h>p}ow I can improve them.Phone me on (0438) 354652, or writeto:Simon Trew322 York RoadSTEVENAGEHerts.SG1 4HW.This pr>q}ogram came from L.A.C.E.The London Atari Computer EnthusiastsSimon Trew322 York RoadSTEVENAGEHerts.SG1 4HW.This pr<A60000&3@`px|xx\ @R H00h`H0045 10h00m0>04>00Bs}5>0` 0 000 1080Ѝ` 0 0 00 10 080 ?0`0JH 0hJH0 0hJ0 ?00Bt} 0`W^M~L0LLi0HW1NNi h`080LMWL>M0 ^MBu}~L 08 NW1^N` 1`l0`1 1)I1 11 U1`l0`1. 1 0 08LMN 1ʎ00 Bv}08 1 01` $$%8000 0 0`ЍР`0`CUTWLMpA20H2)101` Bw}20 0 0ύ0ߍ0 0 010Ȍ1 00ԩ>/Э 0 0 oo`B&L1%L1 L 2`<2l202;2N2Bx}12 #3 MM26`l2`6i6؛ 2 2 2 2 676 B V0By}BD6EJ V0 e6 B V`HL`00Z3@3@33y``W3Y3X3 @3W3yX3riN3sBz}iR3X3Y3Y3ǩM3yN3M3NM3jNM3jN3yR3N3NN3jNN3jI 3Ђl0``X3riN3s@f60000&3@`px|xx\ @R H00h`H0045 10h00m0>04>00F|}5>0` 0 000 1080Ѝ` 0 0 00 10 080 ?0`0JH 0hJH0 0hJ0 ?00F}} 0`W^M~L0LLi0HW1NNi h`080LMWL>M0 ^MF~}~L 08 NW1^N` 1`l0`1 1)I1 11 U1`l0`1. 1 0 08LMN 1ʎ00 F}08 1 01` $$%8000 0 0`ЍР`0`CUTWLMpA20H2)101` F}20 0 0ύ0ߍ0 0 010Ȍ1 00ԩ>/Э 0 0 oo`B&L1%L1 L 2`<2l202;2N2F}12 #3 MM26`l2`6i6؛ 2 2 2 2 676 B V0F}BD6EJ V0 e6 B V`HL`00G3@3@33`E3 38)HMF3      3h)F3 F}@3E3`l0``J V0 e6 B V`HL`00G3@3@33`E3 38)HMF3      3h)F3 D60000&3@`px|xx\ @R H00h`H0045 10h00m0>04>00J}5>0` 0 000 1080Ѝ` 0 0 00 10 080 ?0`0JH 0hJH0 0hJ0 ?00J} 0`W^M~L0LLi0HW1NNi h`080LMWL>M0 ^MJ}~L 08 NW1^N` 1`l0`1 1)I1 11 U1`l0`1. 1 0 08LMN 1ʎ00 J}08 1 01` $$%8000 0 0`ЍР`0`CUTWLMpA20H2)101` J}20 0 0ύ0ߍ0 0 010Ȍ1 00ԩ>/Э 0 0 oo`B&L1%L1 L 2`<2l202;2N2J}12 #3 MM26`l2`6i6؛ 2 2 2 2 676 B V0J}BD6EJ V0 e6 B V`HL`00N3@3@33`M3L3JJJJH)J3h) JJK3L3: 3HH3J3 D3J3J}hHI3K3 D3K3h 3J3H3K3I38nL3 @3M3Д`l0``M3L3JJJJH)J3h) JJK3L3: 3HH3J3 D3J3HE60000&3@`px|xx\ @R H00h`H0045 10h00m0>04>00N}5>0` 0 000 1080Ѝ` 0 0 00 10 080 ?0`0JH 0hJH0 0hJ0 ?00N} 0`W^M~L0LLi0HW1NNi h`080LMWL>M0 ^MN}~L 08 NW1^N` 1`l0`1 1)I1 11 U1`l0`1. 1 0 08LMN 1ʎ00 N}08 1 01` $$%8000 0 0`ЍР`0`CUTWLMpA20H2)101` N}20 0 0ύ0ߍ0 0 010Ȍ1 00ԩ>/Э 0 0 oo`B&L1%L1 L 2`<2l202;2N2N}12 #3 MM26`l2`6i6؛ 2 2 2 2 676 B V0N}BD6EJ V0 e6 B V`HL`00P3@3@33`ccO3N3JJJJH) JL3h)M3M3N3: 3HJ3L3 DN}3L3hHK3M3 D3M3h 3L3J3M3K38nN3 @3O3В`l0``O3N3JJJJH) JL3h)M3M3N3: 3HJ3L3 DLI&   &#@`px|xx\ @R H  h`H  $% 1 h  m > $>  R}%> `    1 8 Ѝ`    1 8  ? ` JH hJH hJ ?  R} `W^M~L LLi0HW!NNi h` 80LMWL>M ^MR}~L 8 NW!^N` !`l `! !)I! !! U!`l `!. ! 8LMN !ʎ  R} 8 ! !` $$%8    `ЍР` `CUTWLMpA"0H")!0!` R}"0 ύ ߍ  ! Ȍ! ԩ>/Э   oo`B&L!%L! L "`<"l"0";"N"R}!" ## MM"&`l"`&i&؛ " " " " &7& B V0R}BD&EJ V0 e& B V`HL`  N#@#@##`M#L#JJJJH)J#h) JJK#L#: #HH#J# D#J#R}hHI#K# D#K#h #J#H#K#I#8nL# @#M#Д`l ``M#L#JJJJH)J#h) JJK#L#: #HH#J# D#J#PE