1351.asm
Aus C64-Wiki
Zur Navigation springenZur Suche springen;############################################################################### ;# 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