C 64
Mouse 64

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:

  1. Der Zeichencode des unter der Maus befindlichen Zeichens: 49659 ($c1fb)
  2. Die Bildschirm-X-Koordinate : 49660 ($c1fc)
  3. Die Bildschirm-Y-Koordinate : 49661 ($c1fd)
  4. Der Feuerknopf #2 : 49662 ($c1fe) ( = 1: gedrückt / = 0 nicht gedrückt)
  5. 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
Listing 1. Der Basic-Lader der «Mouse 64«
.,  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
Listing 2. Die in Assembler geschriebene Initialisierungs- routine von »Mouse 64«
.,  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
.
Listing 3. Die eigentliche Interrupt-Erweiterung von »Mouse 64«
.
.:  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
.
Listing 4. Der Hex-Dump des Assemblerlisting von »Mouse 64«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →