Maustreiber
Maustreiber
Maustreiber

Der TSB-Maustreiber liegt im Kassettenpuffer an Adresse $0334 (820), wird mit der Adresse $033c (828) aktiviert und geht davon aus, dass damit Sprite 0 gesteuert wird:

SYS $033c oder SYS 828

Die Definition von Sprite 0 erfolgt im Beispielprogramm in Zeile 10050 bis 10080. Dort wird auch ein zweites Sprite (Sprite 1, Z. 10085) als optionaler Zeigerschatten eingesetzt. In den Zeilen 10020 und 10025 definieren wir den Kasten (das Mauseloch, s. Bild oben) und als nächstes wird der gut leserliche Zeichensatz von Retrofan geladen (unter dem Namen "tsb2.set", Z. 10040). Damit stehen dann auch deutsche Umlaute zur Verfügung. In Zeile 10090 wird der Mauszeiger aktiviert:

10000 proc init
10005 colour 11,12,0: sh=0
10010 cls
10020 r$=chr$(167)+chr$(168)+chr$(169)+chr$(165)+chr$(32)+chr$(170)+chr$(173)
10025 r$=r$+chr$(164)+chr$(174)
10030 mem:print"Initializing..."
10040 scrlddef $e0,8,0,3: scrld 1,8,3,"tsb2.set": scrld restore: cset 0: cls
10050 design 0,$c000
10051 @bb......................
10052 @bbb.....................
10053 @.bbb....................
10054 @..bbb...................
10055 @...bbb..................
10056 @....bbb.................
10057 @.....bbb................
10058 @......bbb...............
10059 @.......bb...............
10060 @........................
10061 @........................
10062 @........................
10063 @........................
10064 @........................
10065 @........................
10066 @........................
10067 @........................
10068 @........................
10069 @........................
10070 @........................
10071 @........................
10080 mob set 0,0,15,128,0
10085 mob set 1,0,0,128,0
10090 sys $033c: rlocmob 0,160,100,0,1: mob on 0
10093 if sh then rlocmob 1,160,102,0,1: mob on 1
10095 end proc

Die Position des Mauszeigers wird in "mauspos" abgeholt (Z.2033, wird für den Schattenzeiger und für die Positionsanzeige benötigt) und alle Reaktionen auf den Mauszeiger erledigen die von hier aus aufgerufenen Routinen, wobei die Zeile 2025 auf die linke Maustaste reagiert (liefert chr$(160), das entspricht einem invertierten Leerzeichen) und Z.2030 auf die rechte Maustaste (die erzeugt joy(1)=1, das entspricht eigentlich einer Joystick-Bewegung in Port 1 nach oben):

2000 proc main
2010 insert r$,13,19,3,3,0
2015 centre at(0,11)"Hier ist das Mauseloch :"
2020 loop: get x$
2025 if x$=chr$(160) then blink
2030 if joy(1)=1 then point
2033 mauspos: if x$="s" then sh=1-sh: schatten: mob on 1: if sh=0 then moboff1
2035 if sh then schatten
2037 x=int((x0-24)/8+x1*32): y=int((y0-50)/8)
2040 use at(18,17)"x =-##",x: use at(18,18)"y =-##",y:x$=""
2050 exit if x=20 and y=14
2060 end loop
2070 inv y,x,1,1:bflash 5,14,6
2075 pause 1: bflash off: inv y,x,1,1
2080 x$="*"
2090 end proc

2300 proc mauspos
2310 x0=int(peek($d000)):x1=peek($d010)and1:y0=peek($d001):x=x0+256*x1:y1=y0+2
2320 end proc

In den Zeilen 2033, 2037 und 2040 wird die Positionsanzeige durchgeführt (in welcher Bildschirmkachel befindet sich der Mauszeiger gerade). In diesem Falle ist das Programm so eingestellt, dass es endet, wenn einfach auf die Bildschirmposition x=20 und y=14 gezeigt wird (Z.2050): "Mauseloch gefunden!"

Man kann hier schön sehen, wie weit der Sprite-Bereich nach rechts (außerhalb des Bildschirms) reicht: bis Spalte 60!

Dafür, dass man beim Betätigen der Maustasten etwas sieht, sind die beiden Routinen "blink" und "point" da. Bei "blink" erscheint (eben blinkend) im Mauseloch ein Stückchen "Käse" (ein gelbes Quadrat) und auf die rechte Maustaste hin erscheinen (ebenfalls blinkend) links und rechts vom Mauseloch zwei rote Pfeile, die dorthin deuten. Beide Routinen verwenden unterschiedliche Wege, um das Blinken zu realisieren.

2100 proc blink
2110 mob off 1: colour,7: fcol 14,20,1,1,7
2120 flash 7,5: pause 1: flash off
2130 colour,0: fill 14,20,1,1,32,0: if sh then mauspos: schatten: mob on 1
2140 end proc

2150 proc point
2155 mob off 1: x=0: repeat: x=x+1
2160 fill 14,17,1,1,$5e,2: fill 14,23,1,1,$5f,2: break
2170 fill 14,17,1,1,32,0: fill 14,23,1,1,32,0: break
2180 until x>2 or (x$>"")
2185 if sh then mauspos: schatten: mob on 1
2190 end proc

2200 proc break
2210 poke $c516,0: repeat:until peek($c516)>10: get x$
2220 end proc

Als nächstes kommen wir zum Hauptprogramm des Mauszeiger-Demos, Zeilen 90 bis 130. Hier wird der Maustreiber geladen (Z. 90). Er muss sich dazu unter dem Namen "maus.drv" auf der aktuellen Disk befinden. Wenn er bereits in einem vorherigen Programmlauf installiert wurde, entfällt das Laden.

Dann werden "init" durchgeführt (s. oben), die Titelzeile ausgegeben (Z. 100) und das Hauptprogramm "main" aufgerufen (Z. 110), bis das Mauseloch "gefunden" wurde, was mit einem Stern in x$ (Z. 2080) zurückgemeldet wird. In Zeile 120 werden mit SYS $03b7 der Maustreiber deaktiviert (aus dem IRQ genommen), alle Sprites ausgeschaltet und der ROM-Zeichensatz wieder eingesetzt (mit NRM). Es gibt eine Abschlussmeldung auf dem Bildschirm und als Letztes wird der Cursor unten links "geparkt".

90 if peek(828)<>$ad then load"maus.drv",0,0,$0334
100 init:print:centre"TSB und die M]use"
110 repeat: main: until x$
120 sys $03b7: mob off 0: mob off 1: nrm
130 cls: print: centre"Die Maus ist zuhaus!":print at(0,22)"";
995 end

Fehlt noch der Mausschatten. Man aktiviert (und deaktiviert) ihn mit der Taste "s" (für "Schatten", Z.2033). Daraufhin erscheint hinter dem weißen Mauszeiger ein schwarzes Pendant. Der Schatten wird allerdings von Basic aus gesteuert, der Maustreiber weiß eigentlich nichts von einem zweiten Sprite (Z.2230-2250). Daher sieht es bei Bewegungen meistens so aus, als ob der Schatten dem eigentlichen Zeiger "hinterherliefe".

2230 proc schatten
2240 rlocmob 1,x,y1,0,0
2250 end proc

Download Maustreiber (als D64-Datei)