@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`  `8  ɐ     `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.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8: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- 144ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u8<<  B JKIHiDiELV`L8 8 BLV`LxT}8t8l Lu8hihiHHȱȱL8c !#3`Lu8JJJJ`H 8h`HU}ȩh Q8L8 Z8L8 8L8 8L8 8L8S:@9E:E9H '9 H9I9 8 '9h)0ICV}9D9L8 L :::: :Lr:::IEL[::i:iIIL[:`:i::iX}::L:`L{:w:w: C`L:L: D8:MEM.SAV: 8| 9 '9`L:L: D:DUP.SYS:̩ 8Y} x:ɀL: '9`88 |9Y:X: '9L); D8:DUP.SYS; 8::88 9 '98? :`;WL`; 9Z}Ln; ` :Y;Y;L;L;)} Setting Up ATARI 130XE Ram Disk; 9L; ; -9  [} L;D8:; :9 :Y;L &&8  > > ƀ` !  ` =   =  `   o}   ` ]   ]  ` I  I `    U  M  E  `  2  (  ׽p} ͽ     `   } }  `  ` > } } q}ȱ ` > } } Ƚ `} } ` 腋`8HH``膇`r}H8     h}  }  `8           Ā фIJ)ees}慠ф$%Ɓ   ``` #Ji  ` #J #i  ` # #JJ t}#JJ8   i L6#8    8  8 ȱ 8 ȱ   u} }  }  %`   ȱ 8  8 ȱ L6# }  } 8ȱ僰 6#8v}  ȱ   } Ƚ }  }  }  %`8  8 ȱ  6# ȱ  Ƚ w} 8倥偐 &&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  P#@#@##`ccO#N#JJJJH) J}L#h)M#M#N#: #HJ#L# D#L#hHK#M# D#M#h #L#J#M#K#8nN# @#O#В`l `` %39}<?FKNSVcfkn{~ D:MM.COM !11 !00 !}00 !0000 ! ! R" !LY1 !00 !00 ! '(11 ! ! R" !L1 !00 !11 ! '( !L1}1 ! ! '(`0123456789ABCDEF$xx !11)111JJJJ111 !11 !`L2Please type in two hex}1 ! !0 !00 ! 1LH2characters. There is no12 ! !0 !00 ! 1L2need to press Return: j2 ! !}0 !00 ! 1L21122 ! 4' !11 !A ! f" !L2 !1 &!0 ! 5! !1L3 !1 &!A} ! 5! !11 ! ! f" !11 !1 !1 # !1 ! R'1182121L2 ! ! R' !1 " !} ]! !1 " !`L3Please type a filename̠3 ! !0 !00 ! 1L4a}nd press Return: 4 ! !0 !00 ! 1 !3 ! ! e( !3333 ! ! R" !L43 !: ! 7"3 !: }! 7" ! !L4L4D:4 ! !3 ! %3 !3 !33 !3 ! $3 !33 !`L4333 !33 !`} !55 ! !44 !4L*5**5555&5'5Hȱh !44 &! ! ! &! ! !4} &! !558&55'55L@5` !55 !55 !55 !5550 !55 !55 !55 !} 50 !0 &! &! !+ !55 !55 ! '(0 ! K!55 !55 !55 ! 55` !^6Lw6Creating drive}rh6 ! !L6, please wait...6 ! ! 1 ! w' ! ! !ɠ0 !00 ! 'Ǡ( ! !\, !v ! 5^6 !} ! &L7H- ! !- ! ! 5L7 ! &LH7. ! !Ӡ. ! ! 5L7 ! &Ls7/ !J !ՠ/ ! ! 5}L7 ! &L7 / !b !o/ ! ! 5L7 ! &L7/ ! !0 ! ! 5L7 ! w'`x:+7+ ! ! }%" !L8L8(None)7 ! !0 ! %L28}Multi-Mouse v2.1c by S.8 ! !LL8 Trew 1991.A8 ! ! 1 ! ! R'L}8For help see section 5 ofk8 ! !L8 the manual.8 ! ! 10 !00 !0 !00 ! 1L8A. Start Page......}.. Ԡ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#`PA to Restart.Mm ;6LM Hit Ԡ to Quit to DOS.M ;6L=MULTI-MOUSE VERSION 2.1cBy Simon Trew, 1991.1.0 About This Manual.This manual documents the Multi-Mouse software} version 2.1c. Version 2.1c is a full release version and this is the comlete documentation.This release supersedes release}s 1.0, 1.1, 1.2 an 2.1b, which are now no longer supported. 2.1b was a beta-test version. No comments were received as resul}t of sending beta-test copies, and so the softwae (but not the documentaton) is identical to release 2.1b. However some files} have been added to the disk.1.1 Contents.This manual is split into several files so that it can be easily fitted into} most word-processors or text editors. It was written using TextPro, a very good public-domain word-processor, but it should }be possible to use it on most other editors with the minimum of effort.The document files are called MMMANx.DOC where x is }the section which is in that file. For example section 5 is in the file MMMAN5.DOC.You should at least read up to section 5} before using the program. The manual is written in a fairly sequential way so that the easy stuff is dealt with first and th}en the harder stuff, and sections 2 to 5 just detail the program operation and how to get started with it.A full contents l}ist follows: 1.0 About this manual 1.1 Contents 1.2 Files on the disk 2.0 General features 2.1 Basic }operation 3.0 New features 3.1 New CIO commands 3.2 PUT commands 3.2.1 NOTE actions 3.2.2 POINT }actions 3.2.3 Notes on NOTE and POINT 3.3 The RENAME XIO 3.3.1 Notes on the RENAME XIO 3.3.2 A samp}le shape 3.4 Old bugs 4.0 Configuration 4.1 Start page 4.2 Device name 4.3 Driver filename 4.4 F}oreground colour 4.5 Background colour 4.6 Dos 2.x file 4.7 Reserved pages 4.8 Creating the files 5.}0 Multi-Mouse and Turbo-BASIC XL 5.1 Notes on Turbo-BASIC XL 6.0 Machine code access 6.1 Vectors 7.0 How M}ulti-Mouse is configured 7.1 Generating data tables 7.2 Advantages & disadvantages 7.3 Other configuration } 8.0 Device drivers 8.1 Mouse 8.2 Trakball 8.3 Touch tablet 8.4 Joystick 9.0 Endnotes 9.1 New ta}blet driver 9.2 Other device drivers 9.3 Distribution 9.4 Over to You1.2 Files on the disk.The disk con}tains files in an archived form. Of course, a de-archive program is included in the root directory. The READ.ME file not only} tells you to read this and how to de-archive the files, but may also give update information which has been written since t}his manual was last updated.The only files you need to generate the Multi-Mouse drivers are in the PROGRAMS archive. The ma}in program you wil want is MMCONFIG.COM which is a binary file which configures the drivers (see section 4). If you want to u}se the drivers with Turbo-BASIC XL, you will also need TURBOMOD.TUR, which is detailed in section 5. It also contains FILEDUM}P.COM which may be useful you if you want to write your own drivers.The other files in the PROGRAMS archive are BASIC demon}stration programs. TESTPTR.BAS is just a basic test that allows you to draw lines on a screen. It is well commented and is wo}rth looking at to show how easy it is to use the drivers in programs.The SOURCE archive contains all the source code for th}e drivers, for the MMCONFIG program and the FILEDUMP program, as well as the source code for the Turbo-BASIC XL patch in TURB}OMOD.TUR.The DOCS archive contains these documents, of course.4q8e%@r8e&@im"@m#@&@%@ <>$@$@2.0 General Features.Multi-Mouse is a set of machine code programs for operating a pointing device within your programs. }It is intended for use in mouse-oriented programs (I do the P, you do the WIM). Because few people have mice for their Atari }8-bit, Multi-Mouse has been developed to allow a joystick, mouse, touch-tablet or trakball to be used. Your program need not }know which is being used.The word "mover" in this manual is taken to mean "mouse, trakball, joystick or tablet".The mover} should be plugged into the port 2 on your machine, leaving port 1 free for those of you who always have a joystick connected}. To create the screen pointer Multi-Mouse uses two players from the player/missile system. This method allows the pointer }to overlay anything on the screen. Two players are used so that the pointer can be made in two colours, which makes it visibl}e at all times, regardless of what colour screen you are using.2.1 Basic Operation.Multi-Mouse is installed as a CIO d}evice having the title M:. It is loaded in during the boot process (see Configuration, section 4). It protects itself from Re}set and so will be avaiable until the computer is switched off or rebooted.To display the pointer, use OPEN #n, 12, 0, }"M:"Where n is the channel number with which to access the pointer. Issuing the OPEN statement makes a pointer visible in t}he middle of the screen. To allow the pointer to be moved around, issue the following statement: NOTE #n, X, YThis will} allow the pointer to be moved using the mover, until the button is pressed. It then returns the position of the pointer into} the X and Y variables. The position is returned as co-ordinates in the current screen mode. For example, if you are in Graph}ics 8 then X will be in the range 0..319 and Y in the range 0..191.You can force the pointer to a certain position using th}e POINT statement: POINT #n, X, Ywill position the pointer at the pixel given in X, Y. Of course in some modes the pixe}ls are quite big. With POINT, the pointer is always positioned at the top left of the pixel. NOTE will return the screen co-o}rdinates of a pixel whenever any part of the pixel is being pointed at. So the pointer may move slightly if you do a set of s}tatements such as: NOTE #n, X, Y POINT #n, X, YTo get rid of the pointer from the screen, use CLOSE #nPerformi}ng a NEW or END in BASIC automatically CLOSEs all channels except 0.You can change the colours of the pointer by POKEing lo}cations 704 (foreground) and 705 (background). The value to poke into the bytes is given as: luminance + (16 * colour)f|3.0 New Features.Many new features have been added to the Multi-Mouse driver. These do not increase the amount of user me! }mory required, because they sit in the unused portion of player/missile memory. In fact you can configure the program to give! } yourself more user memory than the last version. However, the extra features do mean that you cannot use any of the missiles! } from the player/missile system, because some of the code lies in that area.New features include: o Compatibility with ! }Turbo-BASIC XL. o Relocation and configuration. o Easy user-defined pointers. o New CIO commands. o More flex!}ible NOTEing. o Pointer window definition. o A better tablet handler. o An easier interface for machine-code rout!}ines.3.1 New CIO commands.You can return the status of the button using a STATUS command. If any button on the pointin!}g device is pressed, it will return 0, otherwise it will return 1. For example: STATUS #n, X IF X=0 THEN PRINT "You're!} Dead!" IF X=1 THEN PRINT "Aargh! You Got Me!"You can also find out where the program is loaded, using a GET command. It!} returns a byte which is the page number of the start of the Multi-Mouse program. This is used mainly to POKE into the Multi-!}Mouse data table (see section 6). For example: GET #n, PAGE:BASE=PAGE*256 PRINT "Multi-Mouse loaded from address ";BAS!}E3.2 PUT command.There is also a PUT or PRINT command. This command is used to configure how Multi-Mouse responds to !}NOTE and POINT.In the default mode, the NOTE command waits until a button is pressed, returning the position of the pointer!}; the POINT command sets the pointer position. However you can change these actions using a PUT command. There are seven uppe!}rcase letters that you can PUT, each having a different action. If you use any letter other than the seven allowed, it is ign!}ored. This lets you PRINT mnemonics which make the statement's purpose more obvious. For example: PRINT #n, "Click" PR!}INT #n, "isWhere"Only the uppercase letters C and W have any effect in these statements. The key letters are: C, U, W, T, P!}, L, and M. The last three are used to adjust how the POINT action works. The first four are used to adjust how the NOTE acti!}on works.You are not advised to PUT any other uppercase letters as part of your commenting text, because future versions ma!}y use them. Lower-case letters are guaranteed to be unused, and are safe for commenting.3.2.1 NOTE actions.PRINT #n, !}"Click"Putting a "C" to the channel makes all future NOTE commands wait until the button is being pressed, then returns th!}e co-ordinates. If the button is being pressed when the NOTE is issued, it returns straight away.PRINT #n, "Unclick"Put!}ting a "U" to the channel makes all future NOTE commands wait until the button is NOT being pressed, then returns the co-ordi! }nates. If the button is not being pressed when the NOTE is issued, it returns straight away.PRINT #n, "Toggle"Putting a!!} "T" to the channel makes all future NOTE commands examine the state of the button when the NOTE is issued. NOTE then waits u!"}ntil the button changes state, then returns the co-ordinates. So if the button is pressed when the NOTE is issued, it will a!#}llow the pointer to be moved until the button is released. Otherwise it will allow the pointer to be moved until the button i!$}s pressed.PRINT #n, "Whereis"Putting a "W" to the channel makes all future NOTE commands return immediately with the co!%}-ordinates of the pointer. The NOTE will not allow any pointer movement.An OPEN of the M: device sets the NOTE mode back to!&} "Click".3.2.2 POINT actions.It is now possible to set the window inside which the pointer may be moved. The default i!'}s to set the window edges the same as the margins at the edges of the standard screen. You may want to alter this so that you!(} restrict the pointer to a smaller window.PRINT #n, "Most"Putting an "M" to the channel makes the next POINT command se!)}t the bottom right corner of the window. For example, the following statements restrict the pointer to the graphics window of!*} a split graphics 7 screen: GRAPHICS 7 OPEN #1, 12, 0, "M:" PRINT #1, "Most" X=159:Y=79:POINT #1,X,YPRINT #n,!+} "Least"Putting an "L" to the channel makes te next POINT command set the top left corner of the window. For example, the !,}following statements restrict the pointer to the text window of a split graphics 8 screen: GRAPHICS 8 OPEN #1, 12, 0, !-}"M:" PRINT #1, "Least" X=0:Y=192:POINT #1,X,YPRINT #n, "Position"Putting a "P" to the channel makes all future PO!.}INT commands work as normal, setting the pointer position. The "Least" and "Most" commands only have currency for one POINT a!/}fter which Multi-Mouse returns to the "Position" state anyway. However this command may be useful for cancelling a previously!0} given "Least" or "Most" which has not been followed by a POINT command. An OPEN of the M: device sets the point mode back !1}to "Position".3.2.3 Notes on NOTE and points about POINT. Whenever you define a window, the current position of the po!2}inter is checked. If the pointer is outside the new window then it is moved to the nearest edge or corner.POINT and NOTE co!3}mmands always restrict the pointer to the window. The co-ordinates returned by a NOTE are always relative to the top left cor!4}ner of a standard graphics screen, not relative to the top of the window. If you would rather it was the other way about then!5} tell me. I couldn't make up my mind.You may set the window to include parts outside the standard screen. Multi-Mouse will !6}still produce co-ordinates. If the pointer is above or to the left of the standard screen origin then it will return a large !7}positive value. (Actually it's a two's complement number, so you can work out the "real" co-ordinate value by adding it to -2!8}56.) If the pointer is below or to the right of the bottom right of the standard screen then the values just keep going in a !9}positive direction.The use of a window outside the normal screen area is not encouraged. It will not hurt Multi-Mouse but f!:}uture versions may not support this feature in the same way, if at all.You are not encouraged to define a window and then s!;}witch graphics modes. If the new graphics mode is a lower resolution than the old, the active area may be half-way across a p!<}ixel, because the physical screen dimensions and position of the active area will stay the same. This could be quite frustrat!=}ing for a user.3.3 The RENAME XIO.XIO 32 (RENAME from some languages) has now been defined so that you can change the !>}way your pointer looks. The pointer is stored as a series of consecutive bytes and it is intended that you store your own poi!?}nter in a string in BASIC, or as a char array in C. The format of the XIO is: XIO 32, #n, 12, 0, MYPOINT$Your pointer c!@}an be any length up to 255 bytes. However, the longer the pointer is, the longer it takes to erase and draw, and the slower t!A}he response to a device will be. A length of 16 or so is enough for most purposes. (The standard pointer is 14 bytes long.) M!B}YPOINT$ (or whatever you happen to call it) should be composed as follows:MYPOINT$(1,1) should contain CHR$(h) where h is t!C}he height of the pointer in pixels.MYPOINT$(2,2) should contain CHR$(x) where x is the x offset. A pointer has an associate!D}d x and y offset which indicate the position of the datum point relative to the top left of the pointer. The datum point is t!E}he point from which the co-ordinates are calculated, and it is this point which is limited to the window. The x offset is the!F} number of player/missile pixels from the left edge of the stripe to the datum, and can be any number in the range 0..255. If!G} you need an x offset to the left of the left edge of the stripe then use CHR$(256-n) where n is the offset, for example CHR$!H}(256-3) would give you an offset 3 pixels to the left of the left edge.MYPOINT$(3,3) should contain CHR$(y) where y is the !I}y offset. The y offset is the number of player/missile pixels from the top of the stripe to the datum, and can be any number !J}in the range 0..255. If you need a y offset above the top of the pointer then use CHR$(256-n) where n is the offset, for exam!K}ple CHR$(256-10) would give you an offset 10 pixels above the top edge.MYPOINT$(4,3+h) contains the foreground shape data (!L}h being the height of the shape). These are defined in the normal way for characters and player/missile graphics (see section!M} 3.3.2 for an example).MYPOINT$(4+h,3+h+h) contains the background shape data. Shapes have two colours so that they are alw!N}ays distinguishable. However there's not much point, although it's possible, to have both background and foreground at the sa!O}me pixel.3.3.1 Notes on the RENAME XIO.When you issue an XIO 32 the pointer is immediately updated on screen. However,!P} you have not actually made a copy of the pointer into any Multi-Mouse data area (just the player/missie stripes). The pointe!Q}r data only exists in your string. The pointer on screen is updated with this information whenever you perform any of the fol!R}lowing: o Issue an XIO 32 command. o Move the pointer vertically with a NOTE. o Issue a POINT command. o OPEN!S} the M: device.Multi-Mouse keeps track of what is currently being displayed and so it can work out what to erase and from w!T}here, even though the current pointer is different from the one on screen (it ain't so dumb as to erase the whole stripe eac!U}h time). Because the pointer data is only held in your string, any changes in the string will be taken into account the nex!V}t time the screen pointer is updated. When switching between pointers, the new pointer is drawn so that the datum point is ke!W}pt in the same place as before. Changing the contents of your string is not encouraged; a much cleaner way is to keep a diffe!X}rent string for each pointer and just XIO 32 with the one you want, for example: XIO 32, #n, 12, 0, XHAIR$ NOTE #n, X,!Y} Y XIO 32, #n, 12, 0, BUSYBEE$ NOTE #n, X, YWhen you OPEN the M: device, the standard pointer is always restored. You!Z} can also restore it at any time in your own program. To do this define a pointer of zero height. For example: XIO 32, #n,![} 12, 0, CHR$(0)You should use a 12 as the second parameter to any XIO. (That is, use XIO cmd, #n, 12, .....) This is becau!\}se a bug in the operating system means that this number is treated as the number you used in your OPEN statement, and so usin!]}g 12 means you OPENed for read and write. If you use another number, the CIO may report that you have read-only or write-only!^} access if you try to PRINT or GET from the device. Some languages do not suffer this problem (Atari BASIC works OK with any !_}number), but others do (Turbo-BASIC XL requires a 12). 3.3.2 A sample shape.This!`} section shows how to define a crosshair pointer. It really is quite simple.First, mark out your shape on a grid eight dots!a} wide and however deep you want, like this: ..bbb... 0 56 ..bFb... 16 40 ..bFb... 16 40 ..!b}bFb... 16 40 bbbFbbb. 16 238 bFF.FFb. 108 130 bbbFbbb. 16 238 ..bFb... 16 40 ..bFb..!c}. 16 40 ..bFb... 16 40 ..bbb... 0 40For each row, you have to add together a number for each of th!d}e 'b's (background) and each of the 'F's (foreground) to get the numbers in the columns to the right of the grid. Each column!e} in the grid has an associated number. The leftmost column is worth 128, then 64, 32, 16, 8, 4, 2, and the rightmost is worth!f} 1. Add together the numbers for all the columns with an 'F' in them. For example row 6 has 'F's in columns worth 64, 32, 8, !g}and 4, so the total foreground for that row is 108. Similarly, row 6 has 'b's in columns worth 128 and 2 so the total backgro!q} b%DOS SYSb*)DUP SYSb SRAMDISK COMB\TESTPTR BASB%mFILEDUMPCOMBEMMCONFIGCOMBMMMAN1 DOCBMMMAN2 DOCBm MMMAN3 DOCB"MMMAN4 DOCBMMMAN5 DOCB,MMMAN6 DOCB"MMMAN7 DOCBMMMAN8 DOCBMMMAN9 DOCB0TURBOMODTURBEINTRO BASBJPIG COMB_PIG DOCBdREAD ME BOlAUTORUN SYSB MM COMund for that row is 130.The height of the shape is 11 rows. The datum is 3 columns from the leftmost column and so the x of!r}fset is 3 (note that the leftmost column has an x offset of 0). The datum is 5 rows from the top row and so the y offset is 5!s} (again, the topmost row has a y offset of 0). So the total data for the shape is: DATA 11,3,5 DATA 0,16,16,16,16,108,!t}16,16,16,16,0 DATA 56,40,40,40,238,130,40,40,40,56You can then read this into your pointer string with statements such a!u}s: READ HEIGHT DIM XHAIR$(HEIGHT+HEIGHT+3) XHAIR$(1)=CHR$(HEIGHT) FOR LOOP=2 TO HEIGHT+HEIGHT+3 READ IN:XHAI!v}R$(LOOP)=CHR$(IN) NEXT LOOPWhen defining your shape, remember that a player/missie pixel is twice as wide as it is high.!w} If you forget this, you may find that your shapes look rather squashed.3.4 Old Bugs.All reported bugs from previous v!x}ersions have now been corrected. Details of these corrections follow.On version 1.0 there was a bug that a NOTE in Graphics!y} 8 would return 255 into the Y co-ordinate when the cursor was at the top of the screen.On version 1.0 theRe was a bug that!z} an OPEN would not always display the pointer. This has now been cured.There still remains the "bug" that changing graphics!{} mode will upset the player/missile system. This is because of bad programming in the OS and cannot be avoided except by int!|}ercepting the GRAPHICS call. You should CLOSE the channel and re-OPEN it whenever you change graphics mode. If you do not, yo!}}u will get an ugly stripe. You will not harm the Multi-Mouse software. The Break key is still not checked, so that Break ha!~}s no effect until the handler returns control to your application. Ims'9TqI@ faZ#t"j$0̛ _1˿Υ B4.0 Configuration.Before you use the Multi-Mouse software you must configure it for your application. Configuring allows %}you to set your own preferences and to change the defaults. Configuring makes the program operate with a greater variety of o%}ther software, because you can change it to fit in with that software.Configuring is done by the program MMCONFIG.COM. This%} is the only program yo need to create device drivers. All of the code for the four device drivers is included in the MMCONFI%}G.COM binary file.To run MMCONFIG, use your DOS's binary file load option. You cannot BRUN it from Turbo-BASIC XL.The con%}figuration options are selected by pressing the appropriate letter key, and sometimes also typing in a value. The options are%} described below:4.1 Start Page.Option A allows you to change the start page. This is a hex number which indicates whe%}re the Multi-Mouse should sit in memory. Normally you will not have to worry about this because it defaults to the lowest pos%}sible value for the current configuration of your system. You can change it if you know that you want Multi-Mouse elsewhere t%}o work with another program.The best advice is to load in all the utilities you would normally use when using Multi-Mouse, %}then run this program and leave this option at the default. Valid values are hex value in the range 00-F8, but the start page%} must lie on a 2K boundary because of the player/missile graphics.4.2 Device Name.If you already have a driver which h%}as the M: handle, you will want to call Multi-Mouse another name. You can do this by selecting the device name using option B%}. For example, if you chose H then you would use the following command to open the device: OPEN #n, 12, 0, "H:"4.3 %}Driver filename.Option C allows you to change the name of the file that is written out by the program. You are asked to ty%}pe a filename. If you omit to include a device specifier, D: is assumed.4.4 Foreground Colour.This option specifies th%}e default foreground colour of the pointer. The colour is that of the background of the screen, and pressing D cycles it.%}4.5 Background Colour.This option specifies the default background colour of the pointer. The colour is that of the border%} of the screen, and pressing E cycles it.4.6 DOS 2.x file.If you are using Multi-Mouse under any Atari DOS 2 derivativ%}e then you can get it to load another file after it has loaded. You can use this to load a chain of files in an AUTORUN seque%}nce. My other device drivers also allow you to do this so you are not restricted to one AUTORUN per disk. Note that the filen%}ame is that of a binary file (not a BASIC file) and must include the D: part. See section 5 on using Multi-Mouse with Turbo-B%}ASIC XL if you wish to use Turbo-BASIC XL with Multi-Mouse.If you press Return in response to the prompt without entering a%} filename, then (None) will appear as the filename. This means that Multi-Mouse wil not load another binary file once it is l%}oaded.4.7 Reserved pages.Option G allows you to rseserve pages of memory for your own use, for example to use players %}2 & 3 of the player/missile system, or to reserver memory for a user-defined character set. Multi-Mouse by default reserves s%}ix pages, and sets MEMLO to the start page + $06. If you reserve more pages, then those pages between (start page + $06) and %}(start page + reserved pages -1) inclusive are free for your own use.4.8 Creating the files.Options H-L allow you to c%}reate a binary file for any of the four drivers included. Alternatively option 10 allows you just to create code for the CORE%} section. This allows you to append your own machine code device driver to it. Do not try to run the CORE program on its own;%} you must append a binary file which takes care of the vectors detailed in section 6. You will only want to use this option i%}f you want to write your own device driver.If you are using DOS 2.x, you will want to name your file AUTORUN.SYS so that it%} will load automatically when you boot the disk. Or you may want to have all four drivers on the disk and select from a menu %}which one to load.@#~tp=E s%1d_2lxen?%a3Aoإf VeT6NfQmRc,6SU/W[$5.0 Multi-Mouse and Turbo-BASIC XL.Multi-Mouse can be configured for use with Turbo-BASIC XL, but the following notes mus)}t be observed.Turbo-BASIC XL sits in low memory, whereas Atari BASIC sits in high memory. Unfortunately this means tat you )}must have a different Multi-Mouse binary file for the different BASICs. (The only thing you need to change is where the progr)}am sits in memory. Everything else can stay the same.) The starting page (option A from the menu) should be at least $38 for )}use with Turbo-BASIC XL.Before you use your drivers, you must also modify your copy of Turbo-BASIC XL. The standard copy ha)}s a rather nasty approach to MEMLO. It sets MEMLO regardless of any other program that is in low memory. The program TURBOMOD)}.TUR allows you to create a new copy of Turbo-BASIC XL which only adjusts MEMLO if it is too low for Turbo-BASIC XL to operat)}e. This is good programming practice, and all my device drivers use this method so they can all be used together.TURBOMOD.T)}UR is better than a previous version of this utility, 80TBMODI.TUR, which I produced for my 80-column device. The new version)} allows you to use the same copy of Turbo-BASIC XL whether or not you are not using another application that sits in low memo)}ry. You can use this copy with the 80-column device, of course. TURBOMOD.TUR is a Turbo-BASIC XL program and you will need to)} run it under the Turbo-BASIC XL environment.Once you have modified Turbo-BASIC XL, your altered copy can be used whether o)}r not you are using the Multi-Mouse utility (or any other low-memory utility).5.1 Notes on Turbo-BASIC XL.You cannot B)}LOAD the Multi-Mouse driver (or any other application that sits in low memory) from Turbo-BASIC XL: it must be the other way )}around. This is because your BASIC program sits in low memory it would be erased by the newly-loaded driver. So if you want T)}urbo-BASIC XL to autoboot, rename the binary file to TURBO.COM and use option G on the MMCONFIG menu to load from it. Of cour)}se you can only do this under DOS 2.x. If you have another DOS (for example SpartaDOS X) then create a batch file which loads)} in the Multi-Mouse driver and then loads in Turbo-BASIC XL.I have not tried Multi-Mouse with compiled Turbo-BASIC XL progr)}ams.Bb$@qPS5Sd'cSLөɺS~C֓eMSDv(FS %S1&;atސ/oCچ\F W 3iUKL)" HdЂ gR G´(6.0 Machine Code Access.This section is intended for those who wish to add their own device drivers for such things as th-}e keyboard or a light pen. It does not discuss in general the way the program works. I hope that the code is commented enough-} to make it understandble. Multi-Mouse is written in two parts. The first, CORE, contains the Multi-Mouse primitives such a-}s move the pointer to a given position, convert player/missile co-ordinates to OS ones, all the CIO handling, and so on. The -}other part is the device-dependent part which handles movement and click operations for a particular device. The two parts co-}mmunicate through three procedures whose addresses are defined in a table along with many other things.The address of this -}table can be accessed by performing a GET and multiplying the result by 256. (The table always starts on a page boundary.) I -}guarantee that this table and the following calling mechanisms will stay the same for future issues. I do not guaruntee anyth-}ing else. Do not call particular addresses or assume that certain locations hold certain values.You must decide for yourse-}lf where to place your driver. You are not encouraged to use the player/missile area, because future versions of Multi-Mouse -}may use it. You can update the table at any time, even from BASIC, and your changes remain until reboot, except for those t-}hings that are always updated on an OPEN (detailed in sections 2 and 3).The table contains:Address Mnemonic Content-}s------- -------- --------+0 and +1 calcxy Address of pointer move routine.+2 and +3 movep Address of -}device move routine.+4 and +5 clickp Address of device click routine.+6 and +7 saddr Address of shape (i.e. ad-}dress of string passed to XIO 32, or the default).+8 xcoord Pointer x position (P/M coord).+9 ycoord -} Pointer y position (P/M coord).+10 forecol Foreground colour on OPEN.+11 backcol Background colou-}r on OPEN.+12 minx Left edge of active area (P/M coord).+13 miny Top edge of active area (P/M c-}oord).+14 maxx Right edge of active area (P/M coord).+15 maxy Bottom edge of active area (P/M c-}oord).6.1 Vectors.The calcxy vector is supplied by the CORE system. By doing an indirect JSR through this vector you c-}an get and set the co-ordinates of the pointer. You are encouraged to use this vector to get the co-ordinates rather than loo-}k up xcoord and ycoord in the table. (All of the supplied device drivers use the vector.) The calcxy routine should be called-} with a value in the A register. The lowest three bits when set cause the calcxy routine to:Bit Function--- ---------} 0 Set the x position to the value in the X register. 1 Set the y position to the value in the Y register. 2 -}Force a redraw of the pointer.The A register is unchanged by the routine. X and Y are loaded with the actual co-ordinates o-}f the cursor: these may be different from your requested co-ordinates if the pointer was limited to the active area. Make s-}ure all "unused" bits of A are reset, because future versions may use them for other purposes. You are not required to make s-}ure that X and Y are in range: that is done automatically. Even with bit 1 set, the pointer is only updated if the actual y c-}o-ordinate has changed since the last screen update. If you must have the screen updated then set bit 2. The only reason you -}should want to set bit 2 is if you change the pointer address (saddr) to a new pointer. For example with a light pen you may -}want a completely blank pointer when the light pen is lifted. But try to leave things as you find them, or your user may get -}annoyed. Example call to calcxy: LDA #%000 ; Get the status JSR indirect ; of the pointer. : :-} indirect: JMP (calcxy)The actual values loaded into X and Y are player/missile co-ordinates of the position of the datu-}m point. The click vector should be provided by your driver. It is used to determine the state of the button. Your routine -}should set A to 0 if the button is pressed, and to 1 if it is not pressed. You are not required to save any registers or flag-}s. End your routine with a RTS. Example (from JOYSTICK): click: LDA stick1 ; Get stick value RTS ; Sim-}ple eh!The movep vector should be provided by your driver. It is called by NOTE to allow the pointer to be moved around. On-} entry, the A register will be set to indicate the exit condition. If the click function returns the value in this register y-}our routine should return. NOTE decides the value depending on whether it is in Click, Unclick or Toggle mode.Your movep fu-}nction should move the pointer around using the calcxy vector. It should return with a RTS. You are not required to save any -}registers or flags. Good practice dictates that you should call your click function to determine the exit condition, although-} only a purist would do this by going through the clickp vector. For example: movep: STA exit ; Save exit condition -} loop: LDA #0 ; Main loop. : : LDA #%011 ; Set X and Y. JMP indirect ; update screen-}. JSR clickp ; Done yet? CMP exit ; Check exit condition. BNE loop ; No, loop back. -} RTS ; Yes, done. indirect: JMP (calcxy)ӤeQ3 ;(Rfj65+B!ϵ>5++VB8 $h,<7.0 How MMCONFIG.COM was generated.MMCONFIG.COM was generated largely automatically, and it may be useful to discuss the 1}way I did it.The 6502 processor does not make it easy to generate relocatable code of any size, because there are no relati1}ve jump instructions and so on. It is therefore difficult to write code that will relocate itself when it loads. This is furt1}her hindered because the standard DOS loader must load programs into absolute addresses.My solution is to produce a configu1}ration program which allows the programs to be configured to work at a particular place in memory. Of course, this does mean 1}that any particular configuration is then fixed once the file is written out. The first time I used this method was wih my 1}80-column driver. In that instance the configuration program was written in BASIC, which made it rather slow, so this time I 1}chose to write it in PL65 (which I used to write Multi-Mouse itself, except that I only used assembly language and no high-le1}vel statements). 7.1 Generating data tables.The method I use is to compile all of the programs twice, at different pl1}aces in memory. The first time they are compiled at $2000, the second at $3000, although in fact the second can be compiled o1}n any page boundary. The first object file is given the extension .20 and the second .30. The FILEDUMP program is then run wh1}ich, when given the filename, takes the two versions and produces a .REC file from them. For example given the filename CORE 1}it takes CORE.20 and CORE.30 and generates CORE.REC. This .REC file contains PL65 statements and can be directly included int1}o the MMCONFIG program with no further processing.The .REC file contains two data tables: The first is just a hex dump of t1}he .20 file. The second gives offsets into this table where the data bytes are different between the .30 and .20 files.Effe1}ctively the only differences will be page addresses of data items and procedures within the program. By adding on a delta val1}ue to each of these values, the program can effectively be relocated by whole pages.7.2 Advantages & disadvantages.Thi1}s method has the flaw that the code can only be relocated by whole pages, although in this case there is no disadvantage beca1}use it must start on a 2K boundary for the player/missile graphics to work. Also, it cannot cope with any arithmetic on addre1}sses other than additions and subtractions. That is, if an address was say multiplied by three then the relocator could not d1}etect it. However, it is very unusual (and thoroughly bad practice) to do anything to addresses other than add or subtract of1}fsets from them.The beauty of it is that the relocation is entirely automatic, and that all that is needed to generate a bi1}nary file is to dump the first buffer straight to disk. It also makes the configuration program stand-alone with no need to h1}ave any other files to run the configuration.The write_code procedure in the MMCONFIG program actually performs the relocat1}ion. It calls add_delta to relocate the code, writes the buffer, and then calls add_delta again to relocate the code back to 1}its original position, so that it can be relocated to a different place in the same run. 7.3 Other configuration.The 1}other part of the configuration is to configure items such as colours, the DOS file to load, and so on. For these there are a1} set of offsets into the CORE data table, which is then updated whenever the options are selected. The offsets have to be wor1}ked out manually, since there is no easy way to have them automatically computed. But the job can be completed fairly easily 1}armed with a cross-reference and a listing of the program from which the dump was created. (That is, the CORE source code.)1}In fact it is these miscellaneous configurable items which are the real problems to program for; the relocation is very simpl1}e once the procedures have been written. I try to offer a fairly reasonable set of items but it could be taken further, the i2}dea is to know when to stop. If you think that a particular variable needs to be configurable, for example the position of th2}e pointer on an OPEN command, then tell me about it.# 00%0(0*PYHP@@1)N0@# # 0d048.0 Device Drivers.This section describes data formats of the four supported input devices.8.1 Mouse.An ST mouse r6}eturns a four-bit value into the joystick pins. The value can be read using STICK(1). My device reads the hardware register d6}irectly, because the shadow register is updated too slowly to keep up with fast mouse movement.The four-bit value is split 6}into two two-bit pairs. Bits 1 and 0 handle the horizontal axis, bits 3 and 2 handle the vertical axis.The two bit-pairs c6}hange in a Gray code as the mouse moves. The Gray code order is thus: 00 01 11 10 00 again, and so on.If th6}e mouse in one direction, this sequence is returned continuously as the mouse moves. If it is moving in the opposite directio6}n, the sequence is returned in the opposite order.All that is necessary to determine movement is to compare the two-bit cod6 }e against the last read code. If the two are the same, no movement has occured. If they are different, the code is checked ag6 }ainst a table containing the Gray code sequence. If it matches the value in this table, it is moved in the appropriate direct6 }ion, else it is moved in the opposite direction.The left button on the mouse is returned like the joystick button, in STRIG6 }(1). The right button comes out onto the second paddle. When the right button is pressed the paddle value falls from 228 to a6 }bout 100. However I do not use this value because I found it to be unreliable.Did you know you can play Missile Command wit6}h a mouse when in Trakball mode?8.2 Trakball.The trakball, like the mouse, returns a four-bit coded value where two bi6}ts are for the vertical axis and two for the horizontal. As with the mouse, I read the hardware register directly, because th6}e shadow is updated too slowly for fast trakball movement.Bit 3 of the trakball output changes when there is vertical movem6}ent. If the value of bit 3 has changed since last read, bit 2 indicates the direction of movement, 1=down, 0=up.Similarly, 6}bit 1 changes when there is horizontal movement. If the value of bit 1 has changed since last read, bit 1 indicate the direct6}ion of movement, 1=right, 0=left.All trakball trigger values return in the same way as the joystick, via STRIG(1).8.3 T6}ouch Tablet.The Touch Tablet returns two paddle vales. The horizontal axis is returned in PADDLE(2), and the vertical in P6}ADDLE(3).The axes both run from 0 to 228. In the horizontal axis, 0 is the left of the tablet, and 228 is the right of the 6}tablet. In the vertical axis, 0 is the bottom of the tablet and 228 is the tp of the tablet.I "trim" the values so that the6}re is no need to have the pointer right against the edge of the tablet. Notice that the vertical axis is inverted compared to6} that of the screen.The touch tablet has three buttons, and each of these resets one bit in STICK(1). Since I don't discrim6}inate between buttons I just check whether any bit is reset by comparing thevalue of STICK(1) with %1111.8.4. Joystick.6}The joystick returns a four-bit value in STICK(1). Each bit corresponds to one of the directions. Bit 0 is set to 0 when the6}re is up movement. Bit 1 is set to zero when there is down movement, bit 2 when there is left movement and bit 3 when there i6}s right movement.Diagonal movements set two of the bits to zero, for example up and left sets bits 0 and 2 to zero. It is p6}ossible to set both 'up' and 'down' bits, but it should never happen (Multi-Mouse will just cancel noth bits out so no moveme6}nt will occur.)The trigger button is, of course, returned in STRIG(1).e)? ;LD@ ;LE@ț|L0; ɰ4H9.0 Endnotes.This section includes miscellaneous information concerning your beta-test release and also requesting your h: }elp.9.1 New Tablet Driver.I have redesigned the tablet handler since version 1.0 of Multi-Mouse. The averaging is now :!}much better (it had a bug in it before). It also prevents the shape from zooming to the top right corner when the pointer is :"}removed from the tablet. Instead it just stays where it was.9.2 Other Device Drivers.I have written Multi-Mouse with t:#}he idea of allowing people to add their own device drivers. I hope that I have provided a good enough interface and documenta:$}tion to allow this.However, if you have a device that you would like to use with Multi-Mouse, but don't feel up to writing :%}for it yourself, I can help. Contact me and I will try to arrange something.I have only programmed for those devices which :&}I own. I should be especially interested if anyone has written a device driver for one the following devices, or wants one wr:'}itten: o Koala Pad (should be just a new Tablet driver.) o Light Pen o Keyboard9.3 Distribution.You may d:(}istribute Multi-Mouse at no charge. The only condition is that you must not modify the programs before destributing them. Thi:)}s is simply because otherwise I end up getting technical questions from people who have a modified copy that I don't know abo:*}ut. If you have any modifications, include the details as a text file on the disk, and please send me a copy.9.4 Over to :+}You.If you have written a device yourself, I would be very pleased to receive a copy of the source code. With your permiss:,}ion, I will then include it in the configuration program and document it as part of Multi-Mouse. Of course, you will be credi:-}ted as the author.If you spot any errors in the documentation, of either a technical or a typographical nature, please anno:.}tate the documentation and return it. I need your support. As a user of my utilites, tell me what you think of them and how I:/} can improve them.Phone me on (0438) 354652, or write to:Simon Trew322 York RoadSTEVENAGEHerts.SG1 4HW. 0-@8o10 REM !------------------------------!11 REM ! TURBOMOD.TUR BY SIZ 1991 !12 REM !------------------------------!13 RE>1}M ! This program reads in your !14 REM ! Turbo-BASIC XL binary file !15 REM ! and creates a new one that !16 REM ! i>2}s compatible with some !17 REM ! other MEMLO-changing devices !18 REM ! including my 80:, M: and N: !19 REM ! device>3} handlers. This !20 REM ! program supersedes 80TBMODI !21 REM ! because the new binary file !22 REM ! will now lo>4}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>5}eparate copy !26 REM ! of Turbo-BASIC XL. !27 REM !------------------------------!28 REM 29 REM !-------------->6}----------------!30 REM ! Read in the names of the !31 REM ! input and output files. !32 REM !------------------->7}-----------!33 TRAP #ERROR34 DIM IN$(20),OUT$(20),BUFFER$(4000)35 INPUT "Input file: ";IN$36 INPUT "Output file: ";OUT$>8}37 CLOSE #1:OPEN #1,4,0,IN$38 CLOSE #2:OPEN #2,8,0,OUT$39 REM 40 REM !------------------------------!41 REM ! Modify the >9}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>A}OR73 LAST=PB<400074 IF PB>075 BPUT #2,ADR(BUFFER$),PB76 ENDIF 77 UNTIL LAST78 REM 79 REM !------------------>B}------------!80 REM ! Error routine: If EOF then !81 REM ! the copy completed or the !82 REM ! user ended his input. >C} !83 REM ! Otherwise display the error. !84 REM !------------------------------!85 # ERROR:CLOSE 86 IF ERR=13687 >D} PRINT "Program finished OK."88 ELSE 89 PRINT "Error ";ERR;" at line ";ERL90 ENDIF 91 END -----------------!57 REM ! <a 3 U +@@1AR@C@@dUB7t@d ( BF}( ()#( MULTI-MOUSE 2.1c&()((..(&You will need to unarc Multi-mouse2..(&before you can use it. ReBG}boot without<..(&basic and look at READ.ME for moreF..(&information. The Pig Demo is includedP..(&as a bonus BH}and can be run from DOSU(using option L.Zb( ( (5($ ĠΠΠĠӠ٠U@@BI}K:b)@d$A@$6-?:B4, D:INTRO.BAS` !  ` =   =  `   @M$%  UW7WW? 5557]WWWw::{{{z^޷FK}ջ~W^þꪮ찰\W 7777555 wwwwWWW]WUUUUUUWWUUUUU]UUUUUUUUzz_UUUUUUUUWUWWW\\\\wWFL} spppU5uuuUUUUUUUU UUUUU\\puu FM} ()<7 UUW WWWp 5557FN}]WWWw::{{{z^޷W^ꪫ7777555 wwwwWWW]WUUUUUUWWUUUUU]UUUUUUUU^zzz_UUUUFO}UUUW\\\wW 55spU5uuUUUUpp\UUUU 5UUUUU\\ppFP}]]\\55uupp,-7 UUWWWW@BDFHIKMOQRTVWYZ\^_abcefhijkmnopqrstuvwwxyzz{||}}~~~Y"Y TYPE A KEY TYPE A KEYRn} $Y+YpVY0-Y3Y0VYA$Y6Y6Y 7YY^ŗ4Ŗ,*Oȥȥ eem6YRo}eƒЫe揦`YYe`YY`YYȩ-ȩY`YY*Y+Y`YY"/Rp}`ZZZZZ.ZHZЭYL+ZYЭYЭZh@1Z1Z2Z2Z3ZZMNX)NXi iNX1Z"&YZZԩRq}/Y2Z2Z61Z/Z&YZԬZ/YZ/Y1Zl/Z`ZZPXIZPX JXKXZ JXKX`Z[OX Rr}POXTOXQXSXZZ8QXZSXZ8ZZJZ*ZPX FXGXZ Y YZ 7Y YZ FXGXZ 7YRs}ZmZ Y Y YQXJJJJZZJJJJZH)8ZZh) ZYH)8ZZh) ZY`[[Z8RXQX ZQX8RXRt} QX`ZPX ZZQX Z`[\ZPX ZRXQX ZQXZ mRXQX`"\B\$/Z%0Z@ԩ \!\ \䦆`C\e\3 \Z!\Ru} "\Z`m\\!/ 6Y Z Z0f\1g\$0Y1`\\ m\\\!X\iRXX\ [LRv}\ [L\\i2`\]h\#Y8 Y C\`]P]/Z \0Z!\ "\ Yf\0g\1Rw}Ԡh\`Q]\] \ \ ]`@ORx}Ry}Rz}R{}R|}??B?BB?B?B?B?BBBBBB~~~~~~BR}}BBBBB??B?BB?B?B?B?R~}R}R}B?B?B?B?B??B?BBBBBBBB~~~~~~R}~BBBBBBBB?B?B?B?B??B?BR}R}R}??B?BBB?B?B?BBBBBB~~~R}~~~BBBBBB??B?BBB?B?B?R}R}R}B?B?B?B?B??B?BBBBBBBB~R}~~~~~~BBBBBBBB?B?B?B?B??B?BR}R}R}???BB?B?B?B?BBBBR}B~~~~~BBBBB???BB?B?B?B?R}R}R}B?B?B?B?B?B?B?BBBBR}BBBBB~~~~~~~~BBBBBBBBB?B?B?B?B?B?B?BR}R}R}?B?B?B?B?B?B?B?R}BBBBBBB~~~~~~~BBBBBBB?B?B?B?B?B?B?B?R}R}R}0?R}<<333g111c1R}11c111c111g11 1R}X1_1g111c111c111cR}331c1cR}?01c1g3c1c1c1c1c1?c@1c1?R}cb1cw1Ǐcv0`  @9Dc 0``3 `B @9Dc 0``3R} ` @8p@a0d`a1@8|p9@@R}@@@@R}@@@@R}@@=@C c@R}a@?xx`w@1pcs`@9ppca`f"@R}9<ca`f"@9ca`T@9ca`T@9ca`T@R}9ca`@g1pca` a@?p~x~@R}@@@@R}@@@R}@? ?>#!?xxx`@ !!!1 !!( @ !!!) #!!@< !!% )!|! H@ !!% 1!! @ !!# !!! @??? !!?>xR}xx@P]Q]R}EiͩkΩ͙kCopj`j {j`Hi͝Νh`L"SAB.R}ORTNI:D"NURrogram. The manual is written in a fairly sequential way so that the easy stuff is dealt with first and thP&   &#@`px|xx\ @R H  h`H  $% 1 h  m > $>  V}%> `    1 8 Ѝ`    1 8  ? ` JH hJH hJ ?  V} `W^M~L LLi0HW!NNi h` 80LMWL>M ^MV}~L 8 NW!^N` !`l `! !)I! !! U!`l `!. ! 8LMN !ʎ  V} 8 ! !` $$%8    `ЍР` `CUTWLMpA"0H")!0!` V}"0 ύ ߍ  ! Ȍ! ԩ>/Э   oo`B&L!%L! L "`<"l"0";"N"V}!" ## MM"&`l"`&i&؛ " " " " &7& B V0V}BD&EJ V0 e& B V`HL`  N#@#@##`M#L#JJJJH)J#h) JJK#L#: #HH#J# D#J#V}hHI#K# D#K#h #J#H#K#I#8nL# @#M#Д`l ``M#L#JJJJH)J#h) JJK#L#: #HH#J# D#J#TEblet driver 9.2 Other device drivers 9.3 Distribution 9.4 Over to You1.2 Files on the disk.The disk con.}tains files in an archived form. Of course, a de-archive program is included in the root directory. The READ.ME file not only.} tells you to read this and how to de-archive the files, but may also give update information which has been written since t.}his manual was last updated.The only files you need to generate the Multi-Mouse drivers are in the PROGRAMS archive. The ma.}in program you wil want is MMCONFIG.COM which is a binary file which configures the drivers (see section 4). If you want to u.}se the drivers with Turbo-BASIC XL, you will also need TURBOMOD.TUR, which is detailed in section 5. It also contains FILEDUM.}P.COM which may be useful you if you want to write your own drivers.The other files in the PROGRAMS archive are BASIC demon.}stration programs. TESTPTR.BAS is just a basic test that allows you to draw lines on a screen. It is well commented and is wo.}rth looking at to show how easy it is to use the drivers in programs.The SOURCE archive contains all the source code for th.}e drivers, for the MMCONFIG program and the FILEDUMP program, as well as the source code for the Turbo-BASIC XL patch in TURB.}OMOD.TUR.The DOCS archive contains these documents, of course.,@2.0 General Features.Multi-Mouse is a set of machine code programs for operating a pointing device within your programs. 0}