Mouse 64
Das Programm Mouse 64 stellt eine Interrupt-Erweiterung des C64 dar und verträgt sich somit nicht ohne eine Anpassung mit anderen Interrupt-Erweiterungen. Das Programm erzeugt nach Aufruf eine »Maus« auf dem Bildschirm, die sich mit einem Joystick (Port II) steuern läßt. Die Abfrage erfolgt durch eine in den Interrupt eingebundene Routine, so daß die Tastatur weiterhin benutzbar bleibt.
Mouse 64 ist vollständig in 6502/10-Assembler geschrieben und benötigt keinen Basic-Speicher, da Mouse 64 im freien RAM-Bereich von 49152 ($c000) bis 53272 ($cfff) liegt. Die Sprite-Daten liegen in Block 11 (dez. 704-767). Um die Maus darzustellen, wird Sprite 7 verwendet. Das Programm liefert folgende Daten:
a) Den Bildschirmcode des Zeichens unter der Maus
b) Die Bildschirm-X-Koordinate
c) Die Bildschirm-Y-Koordinate
d) Joystick#2-Zustand
e) Feuerknopf # 2-Zustand
Das Programm Mouse 64 ist als Eingabe- und Steuerhilfe für Anwendungsprogramme gedacht (siehe Apple-Macintosh-Software und andere), kann aber auch durch zum Beispiel Änderung des Sprites in Spiele eingebunden werden, da bis auf die Vergrößerung alle Spriteparameter veränderlich bleiben.
Zu Listing 1
Das Listing 1 zeigt den Basic-Lader, der in zwei Schleifen die Daten für den Sprite und das Assemblerprogramm aus den DATA-Zeilen liest und in die entsprechenden Speicherstellen schreibt.
Bei einem Fehler der Daten bricht der Computer das Programm mit einer entsprechenden Meldung ab.
Nach Ablauf der beiden Schleifen wird das Assemblerprogramm direkt mit »SYS 49152« gestartet.
Zu Listing 2
Das zweite Listing zeigt die in Assembler geschriebene Initialisierungs-Routine. Diese Routine verändert die Interrupt-Zeiger so, daß sie auf die Maus-Routine zeigen. Ferner verändert sie die zu Sprite 7 gehörenden Parameter entsprechend.
Die Initialisierungsroutine gibt den Text:
PUT JOYSTICK IN PORT 2
AND PRESS ANY KEY
aus. Wenn man diesem Folge geleistet hat erscheint eine »Maus« in der linken oberen Ecke und der Computer arbeitet normal im Programm beziehungsweise im Direktmodus weiter. Die Maus läßt sich — wie gesagt — mit dem Joystick#2 steuern.
Zu Listing 3
Listing 3 zeigt die eigentliche Interrupt-Erweiterung. Diese beginnt mit dem Auslesen des Joystickzustandes. Dazu muß bekanntlich die Tastatur abgeschaltet werden. Das Programm schaltet also die Tastatur ab, liest das Register für den 2. JoyStick aus und schaltet die Tastatur wieder ein. So bleibt die Tastatur weiterhin benutzbar.
Daraufhin wird anhand der Joystickstellung der Sprite 7, also die Maus, bewegt. Ist dies erfolgt, werden aus den Spritekoordinaten die Bildschirmkoordinaten errechnet. Sind diese bekannt, so wird daraus das entsprechende Byte unter der Maus errechnet und ausgelesen.
Diese Werte sind folgenden Registern zu entnehmen:
- Der Zeichencode des unter der Maus befindlichen Zeichens: 49659 ($c1fb)
- Die Bildschirm-X-Koordinate : 49660 ($c1fc)
- Die Bildschirm-Y-Koordinate : 49661 ($c1fd)
- Der Feuerknopf #2 : 49662 ($c1fe) ( = 1: gedrückt / = 0 nicht gedrückt)
- Der Zustand des Joysticks : 49663 ($c1ff)
Zu Listing 4
Listing 4 zeigt den Hex-Dump des Assembler-Programms. Abschließend wäre noch zu sagen, daß es keinen Sinn hat, zu versuchen, das Programm anderer Computer, die nicht wie der C 64 in der Lage sind, frei bewegliche Sprites zu erzeugen, da ein solcher Sprite nötig ist.
(Peter Dreuw / rg)0 rem ********************** 1 rem * mouse 64 * 2 rem * * 3 rem * 1984 by * 4 rem * * 5 rem * peter dreuw * 6 rem * mennrathschmidt 27 * 7 rem * * 8 rem * moenchengladbach 5 * 9 rem * * 10 rem ********************** 20 data0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 30 data48,0,0,120,0,0,252,0,0,252,0,1,254,0,1,254 40 data0,0,252,0,0,48,0,0,16,0,0,16,0,0,32,0 50 data0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0 60 fori=704to767:readq:pokei,q:s=s+q:next 70 ifs<>1610thenprint"mouse-data's falsch":end 80 print"mouse-data ok":s=0 85 rem prg-data 90 fori=49152to49555:readq:pokei,q:s=s+q:next 91 data160,231,185,117,191,32,210,255,200,208,247,160,238,185,134,191,32 92 data210,255,200,208,247,165,198,201,0,240,250,169,0,133,198,120,169,137 93 data141,20,3,169,192,141,21,3,169,17,141,14,208,169,45,141,15,208,173 94 data21,208,9,128,141,21,208,173,27,208,41,127,141,27,208,173,28,208,41 95 data127,141,28,208,169,0,141,46,208,169,11,141,255,7,88,96,0,0,255,80 96 data85,84,32,74,79,89,83,84,73,67,75,32,73,78,32,80,79,82,84,32,50,32 97 data33,13,65,78,68,32,80,82,69,83,83,32,65,78,89,32,75,69,89,0,0,0,162 98 data224,142,2,220,173,0,220,162,255,142,2,220,141,255,193,41,1,208,10 99 data173,15,208,201,45,144,3,206,15,208,173,255,193,41,2,208,10,169,236 100 data205,15,208,144,3,238,15,208,173,255,193,41,4,208,41,173,16,208,201 101 data128,144,24,173,14,208,240,5,206,14,208,208,24,173,16,208,41,127,141 102 data16,208,206,14,208,76,232,192,173,14,208,201,18,144,3,206,14,208,173 103 data255,193,41,8,208,33,173,16,208,201,128,144,13,173,14,208,201,72,240 104 data19,238,14,208,76,16,193,238,14,208,208,8,173,16,208,9,128,141,16 105 data208,162,0,173,255,193,41,16,208,1,232,142,254,193,173,23,208,41,127 106 data141,23,208,173,29,208,41,127,141,29,208,173,15,208,160,255,56,200 107 data233,8,176,251,152,233,4,168,140,253,193,173,16,208,201,128,144,20 108 data173,14,208,162,255,232,233,8,176,251,138,105,30,170,142,252,193,76 109 data108,193,56,173,14,208,162,255,232,233,8,176,251,138,233,1,170,142 110 data252,193,169,4,133,252,234,134,251,192,0,240,16,24,169,40,101,251 111 data133,251,165,252,105,0,133,252,136,208,240,177,251,141,251,193,165 112 data252,76,49,234,0,0,0 120 ifs<>52007thenprint"prg-data's falsch":end 130 print"prg-data ok" 140 print"press any key to start 150 poke198,0:wait198,1 160 sys49152
., c000 a0 e7 ldy #$e7 ., c002 b9 75 bf lda $bf75,y ., c005 20 d2 ff jsr $ffd2 ., c008 c8 iny ., c009 d0 f7 bne $c002 ., c00b a0 ee ldy #$ee ., c00d b9 86 bf lda $bf86,y ., c010 20 d2 ff jsr $ffd2 ., c013 c8 iny ., c014 d0 f7 bne $c00d ., c016 a5 c6 lda $c6 ., c018 c9 00 cmp #$00 ., c01a f0 fa beq $c016 ., c01c a9 00 lda #$00 ., c01e 85 c6 sta $c6 ., c020 78 sei ., c021 a9 89 lda #$89 ., c023 8d 14 03 sta $0314 ., c026 a9 c0 lda #$c0 ., c028 8d 15 03 sta $0315 ., c02b a9 11 lda #$11 ., c02d 8d 0e d0 sta $d00e ., c030 a9 2d lda #$2d ., c032 8d 0f d0 sta $d00f ., c035 ad 15 d0 lda $d015 ., c038 09 80 ora #$80 ., c03a 8d 15 d0 sta $d015 ., c03d ad 1b d0 lda $d01b ., c040 29 7f and #$7f ., c042 8d 1b d0 sta $d01b ., c045 ad 1c d0 lda $d01c ., c048 29 7f and #$7f ., c04a 8d 1c d0 sta $d01c ., c04d a9 00 lda #$00 ., c04f 8d 2e d0 sta $d02e ., c052 a9 0b lda #$0b ., c054 8d ff 07 sta $07ff ., c057 58 cli ., c058 60 rts
., c089 a2 e0 ldx #$e0 ., c08b 8e 02 dc stx $dc02 ., c08e ad 00 dc lda $dc00 ., c091 a2 ff ldx #$ff ., c093 8e 02 dc stx $dc02 ., c096 8d ff c1 sta $c1ff ., c099 29 01 and #$01 ., c09b d0 0a bne $c0a7 ., c09d ad 0f d0 lda $d00f ., c0a0 c9 2d cmp #$2d ., c0a2 90 03 bcc $c0a7 ., c0a4 ce 0f d0 dec $d00f ., c0a7 ad ff c1 lda $c1ff ., c0aa 29 02 and #$02 ., c0ac d0 0a bne $c0b8 ., c0ae a9 ec lda #$ec ., c0b0 cd 0f d0 cmp $d00f ., c0b3 90 03 bcc $c0b8 ., c0b5 ee 0f d0 inc $d00f ., c0b8 ad ff c1 lda $c1ff ., c0bb 29 04 and #$04 ., c0bd d0 29 bne $c0e8 ., c0bf ad 10 d0 lda $d010 ., c0c2 c9 80 cmp #$80 ., c0c4 90 18 bcc $c0de ., c0c6 ad 0e d0 lda $d00e ., c0c9 f0 05 beq $c0d0 ., c0cb ce 0e d0 dec $d00e ., c0ce d0 18 bne $c0e8 ., c0d0 ad 10 d0 lda $d010 ., c0d3 29 7f and #$7f ., c0d5 8d 10 d0 sta $d010 ., c0d8 ce 0e d0 dec $d00e ., c0db 4c e8 c0 jmp $c0e8 ., c0de ad 0e d0 lda $d00e ., c0e1 c9 12 cmp #$12 ., c0e3 90 03 bcc $c0e8 ., c0e5 ce 0e d0 dec $d00e ., c0e8 ad ff c1 lda $c1ff ., c0eb 29 08 and #$08 ., c0ed d0 21 bne $c110 ., c0ef ad 10 d0 lda $d010 ., c0f2 c9 80 cmp #$80 ., c0f4 90 0d bcc $c103 ., c0f6 ad 0e d0 lda $d00e ., c0f9 c9 48 cmp #$48 ., c0fb f0 13 beq $c110 ., c0fd ee 0e d0 inc $d00e ., c100 4c 10 c1 jmp $c110 ., c103 ee 0e d0 inc $d00e ., c106 d0 08 bne $c110 ., c108 ad 10 d0 lda $d010 ., c10b 09 80 ora #$80 ., c10d 8d 10 d0 sta $d010 ., c110 a2 00 ldx #$00 ., c112 ad ff c1 lda $c1ff ., c115 29 10 and #$10 ., c117 d0 01 bne $c11a ., c119 e8 inx ., c11a 8e fe c1 stx $c1fe ., c11d ad 17 d0 lda $d017 ., c120 29 7f and #$7f ., c122 8d 17 d0 sta $d017 ., c125 ad 1d d0 lda $d01d ., c128 29 7f and #$7f ., c12a 8d 1d d0 sta $d01d ., c12d ad 0f d0 lda $d00f ., c130 a0 ff ldy #$ff ., c132 38 sec ., c133 c8 iny ., c134 e9 08 sbc #$08 ., c136 b0 fb bcs $c133 ., c138 98 tya ., c139 e9 04 sbc #$04 ., c13b a8 tay ., c13c 8c fd c1 sty $c1fd ., c13f ad 10 d0 lda $d010 ., c142 c9 80 cmp #$80 ., c144 90 14 bcc $c15a ., c146 ad 0e d0 lda $d00e ., c149 a2 ff ldx #$ff ., c14b e8 inx ., c14c e9 08 sbc #$08 ., c14e b0 fb bcs $c14b ., c150 8a txa ., c151 69 1e adc #$1e ., c153 aa tax ., c154 8e fc c1 stx $c1fc ., c157 4c 6c c1 jmp $c16c ., c15a 38 sec ., c15b ad 0e d0 lda $d00e ., c15e a2 ff ldx #$ff ., c160 e8 inx ., c161 e9 08 sbc #$08 ., c163 b0 fb bcs $c160 ., c165 8a txa ., c166 e9 01 sbc #$01 ., c168 aa tax ., c169 8e fc c1 stx $c1fc ., c16c a9 04 lda #$04 ., c16e 85 fc sta $fc ., c170 ea nop ., c171 86 fb stx $fb ., c173 c0 00 cpy #$00 ., c175 f0 10 beq $c187 ., c177 18 clc ., c178 a9 28 lda #$28 ., c17a 65 fb adc $fb ., c17c 85 fb sta $fb ., c17e a5 fc lda $fc ., c180 69 00 adc #$00 ., c182 85 fc sta $fc ., c184 88 dey ., c185 d0 f0 bne $c177 ., c187 b1 fb lda ($fb),y ., c189 8d fb c1 sta $c1fb ., c18c a5 fc lda $fc ., c18e 4c 31 ea jmp $ea31 ., c191 00 brk .
. .: c000 a0 e7 b9 75 bf 20 d2 ff c8 d0 f7 a0 ee b9 86 bf .: c010 20 d2 ff c8 d0 f7 a5 c6 c9 00 f0 fa a9 00 85 c6 .: c020 78 a9 89 8d 14 03 a9 c0 8d 15 03 a9 11 8d 0e d0 .: c030 a9 2d 8d 0f d0 ad 15 d0 09 80 8d 15 d0 ad 1b d0 .: c040 29 7f 8d 1b d0 ad 1c d0 29 7f 8d 1c d0 a9 00 8d .: c050 2e d0 a9 0b 8d ff 07 58 60 00 00 ff 50 55 54 20 .: c060 4a 4f 59 53 54 49 43 4b 20 49 4e 20 50 4f 52 54 .: c070 20 32 20 21 0d 41 4e 44 20 50 52 45 53 53 20 41 .: c080 4e 59 20 4b 45 59 00 00 00 a2 e0 8e 02 dc ad 00 .: c090 dc a2 ff 8e 02 dc 8d ff c1 29 01 d0 0a ad 0f d0 .: c0a0 c9 2d 90 03 ce 0f d0 ad ff c1 29 02 d0 0a a9 ec .: c0b0 cd 0f d0 90 03 ee 0f d0 ad ff c1 29 04 d0 29 ad .: c0c0 10 d0 c9 80 90 18 ad 0e d0 f0 05 ce 0e d0 d0 18 .: c0d0 ad 10 d0 29 7f 8d 10 d0 ce 0e d0 4c e8 c0 ad 0e .: c0e0 d0 c9 12 90 03 ce 0e d0 ad ff c1 29 08 d0 21 ad .: c0f0 10 d0 c9 80 90 0d ad 0e d0 c9 48 f0 13 ee 0e d0 .: c100 4c 10 c1 ee 0e d0 d0 08 ad 10 d0 09 80 8d 10 d0 .: c110 a2 00 ad ff c1 29 10 d0 01 e8 8e fe c1 ad 17 d0 .: c120 29 7f 8d 17 d0 ad 1d d0 29 7f 8d 1d d0 ad 0f d0 .: c130 a0 ff 38 c8 e9 08 b0 fb 98 e9 04 a8 8c fd c1 ad .: c140 10 d0 c9 80 90 14 ad 0e d0 a2 ff e8 e9 08 b0 fb .: c150 8a 69 1e aa 8e fc c1 4c 6c c1 38 ad 0e d0 a2 ff .: c160 e8 e9 08 b0 fb 8a e9 01 aa 8e fc c1 a9 04 85 fc .: c170 ea 86 fb c0 00 f0 10 18 a9 28 65 fb 85 fb a5 fc .: c180 69 00 85 fc 88 d0 f0 b1 fb 8d fb c1 a5 fc 4c 31 .: c190 ea 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4a .