Hallo,
ich hab mir mal das Treiberprogramm auf der C64-wiki-Seite angeschaut und hab da ein paar Verständnisprobleme:
Da verstehe ich den Teil ab Zeile 181 nicht. In 179 wird das oberste Bit ausgeblendet, weil das ja nicht gebraucht wird, aber
dann ab "cmp #%01000000". Wird hier entschieden, ob die Bewegung in x- oder y-Richtung stattgefunden hat?
Also konkret kapier ich die Zeilen 181 - 199 nicht. Wenn mir da einer auf die Sprünge helfen könnte?
Code
- ;###############################################################################
- ;# Programm: Maussteuerung im 1351-Proportionalmodus
- ;# Dateiname: 1351.asm
- ;#
- ;# Assembler: ACME
- ;# Assemblierung: acme -f cbm -o 1351.prg 1351.asm
- ;#
- ;# Start mit: RUN
- ;#
- ;# Quelltext: * Kleinschreibung (bis auf Kommentare)
- ;# * nur Leerzeichen, keine Tabulatoren
- ;# * Abstand: jeweils 20 Zeichen (Label --> Befehl --> Kommentar)
- ;# * Zeilenlänge max. 80 Zeichen
- ;#
- ;# Beschreibung: Dieses Programm erzeugt einen Mauszeiger als Sprite,
- ;# der die 1351er Maus im Proportionalmodus ansteuert.
- ;# - Controlport frei wählbar, beide Maustasten auswertbar
- ;# - der gesamter Bereich ist erreichbar (320x200)
- ;# - der Zeiger erscheint wieder auf der anderen Seite,
- ;# wenn dieser den Bildschirm verlässt
- ;#
- ;###############################################################################
- ; ----- @Basic-Start@ -----
- *=$0801 ; Basic-Startzeile "10 SYS2061" erzeugen
- !word + ; Zeiger auf nächste Basic-Zeile
- !word 10 ; Basic Zeilennummer
- !byte $9e ; Basic-Token für SYS-Befehl
- !text "2061" ; Startadresse des Programms: 2061/$080D
- !byte 0 ; Basic-Zeilenende
- + !word 0 ; Basic-Programmende
- ; ----- @Initialisierung@ -----
- start: sei ; Interrupts sperren
- jsr $e544 ; Bildschirm löschen
- lda #<irq ; Zeiger auf eigene IRQ-Routine umbiegen
- sta $0314
- lda #>irq
- sta $0315
- ldy #spritedaten/64
- sty $07f8 ; Sprite0: Zeiger der Spritedaten setzen
- lda #1
- sta $d027 ; Sprite0: Farbe weiß
- sta $d015 ; Sprite0: einschalten
- lda #100
- sta $d000 ; Sprite0: X-Position = 100
- sta $d001 ; Sprite0: Y-Position = 100
- lda #0
- sta $d010 ; höchstw. Bit mit Wertigkeit 256 auf 0
- sta $d020 ; Rahmen schwarz
- sta $d021 ; Hintergrundfarbe schwarz
- cli ; Interrupts freigeben
- jmp * ; Endlosschleife
- ; ----- @Spritedaten@ -----
- !align 63,0 ; fülle bis zum nächsten Spriteblock
- !macro spriteline .v {
- !byte .v>>16, (.v>>8)&255, .v&255
- }
- spritedaten: ;765432107654321076543210
- +spriteline %........................
- +spriteline %.#......................
- +spriteline %.##.....................
- +spriteline %.###....................
- +spriteline %.####...................
- +spriteline %.#####..................
- +spriteline %.######.................
- +spriteline %.#######................
- +spriteline %.########...............
- +spriteline %.#########..............
- +spriteline %.########...............
- +spriteline %.######.................
- +spriteline %.######.................
- +spriteline %.##..##.................
- +spriteline %.#....##................
- +spriteline %......##................
- +spriteline %.......##...............
- +spriteline %.......##...............
- +spriteline %........##..............
- +spriteline %........##..............
- +spriteline %........................
- !byte 0
- offset_potx: !byte 0
- offset_poty: !byte 0
- neuer_wert: !byte 0
- alter_wert: !byte 0
- cia_sicherung: !byte 0
- ; ----- @Interrupt Routine@ -----
- irq: jsr port2 ; Mausport2 verwenden
- ; "jsr Port1" falls Port1 gewünscht
- ; ==============================
- ; = X-Koordinate auswerten =
- ; ==============================
- lda $d419 ; aktuellen Paddle X-Wert holen
- ldy offset_potx ; alter Offset POTX Wert
- jsr bewegung ; Bewegung prüfen
- sty offset_potx ; Offset POTX Wert sichern
- clc
- adc $d000 ; zur Sprite0 X-Position addieren
- sta $d000
- txa
- adc #0 ; addiere X + Carry-Bit
- and #%00000001 ; Bit0 ausmaskieren (Bit1-7 löschen)
- eor $d010 ; Bit0 invertieren (Bit1-7 unverändert)
- sta $d010 ; MSB-Bit der Sprite X-Pos. schreiben
- ; ==============================
- ; = Y-Koordinate auswerten =
- ; ==============================
- lda $d41a ; aktuellen Paddle Y-Wert holen
- ldy offset_poty ; alter Offset POTY Wert
- jsr bewegung ; Bewegung prüfen
- sty offset_poty ; Offset POTY Wert sichern
- ; Zahl negieren
- ; --> Zweierkompliment bilden
- eor #$ff ; A invertieren
- sec ; A + 1
- adc $d001 ; zur Sprite0 Y-Position addieren
- sta $d001
- ; ========================
- ; = Maustasten auswerten =
- ; ========================
- lda cia_sicherung ; CIA-Register wiederherstellen
- sta $dc00
- ;lda $dc01 ; auskommentieren, falls Port 1
- lsr ; "rechtes Maustasten"-Bit in C-Flag
- bcs + ; nicht gedrückt, dann springe
- rechte_maustaste: ldx #2
- stx $d020 ; Rahmenfarbe weiß
- !byte $2c ; "bit $hhll" erzeugen und
- ; "ldx #0" damit neutralisieren
- + ldx #0 ; Rahmenfarbe schwarz
- stx $d020
- lsr
- lsr
- lsr
- lsr ; "linkes Maustasten"-Bit in C-Flag
- bcs + ; nicht gedrückt, dann springe
- linke_maustaste: ldx #2 ; Hintergrundfarbe rot
- stx $d021
- !byte $2c ; "bit $hhll" erzeugen und
- ; "ldx #0" damit neutralisieren
- + ldx #0
- stx $d021 ; Hintergrundfarbe schwarz
- jmp $ea31 ; in alte IRQ-Routine springen
- ; ----- @Unterprogramm: Bewegung@ -----
- bewegung: sty alter_wert ; alter Wert
- sta neuer_wert ; neuer Wert
- ldx #0
- sec ; A = neuer Wert - alter Wert
- sbc alter_wert
- and #%01111111 ; MSB auf 0 setzen
- cmp #%01000000
- bcs verminderung ; --> links oder unten
- erhoehung: lsr ; A = A/2 (Rauschbit eliminieren)
- beq keine_bewegung
- ldy neuer_wert ; X = 0, Y = neuer Wert
- rts
- verminderung: ora #%11000000 ; Bit 6 und 7 = 1
- cmp #$ff ; auf -1 prüfen
- beq keine_bewegung
- sec
- ror ; A = A/2 (Rauschbit eliminieren)
- ; A = A + 128
- ldx #%11111111
- ldy neuer_wert ; X = -1 (255), Y = neuer Wert
- rts
- keine_bewegung: lda #0 ; keine Bewegung --> A=0, X=0
- rts
- ; ----- @Unterprogramm: Paddle-Initialisierung@ -----
- port2: lda #$80 ; für Controlport #2
- !byte $2c ; macht mit den nächsten beiden Bytes
- ; einen "bit $hhll" und neutralisiert
- ; damit den "lda #$40" - Befehl
- port1: lda #$40 ; für Controlport #1
- ldx $dc00 ; aktuellen CIA-Zustand sichern
- stx cia_sicherung
- sta $dc00 ; Analogschalter des 4066 auf
- ; entsprechenden Port umschalten
- ldx #4 ; 4ms warten, um zu stabilisieren
- ldy #199
- - dey
- bne -
- dex
- bne -
- rts