1351.asm

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Ergebnis
;###############################################################################
;# 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