Ziel dieses Threads ist es, das Thema Maustreiber aus Bitte melde dich an, um diesen Link zu sehen. outzusourcen, weil es dort schließlich um das Solitaire von wizball6502 gehen soll und nicht um meine Anfängerfragen zu Assembler. Ich habe nämlich die folgenden Fragen zu dem (funktionierenden) Code unten:
- Wie stellt der Code sicher, dass der Mouse-IRQ vor der Tastaturabfrage ausgeführt wird?
- Wozu speichert man den Standard-IRQ nochmal extra in IIRQ2? Steht da nicht immer $ea31 drin?
- Gibt es einen großen Unterschied zwischen der Verwendung von SEI..CLI und PHP SEI.. PLP (welches hier verwendet wird)?
- Sind die ersten drei Zeilen in INSTALL nicht überflüssig?
- Kann man meine langwierigen Fallabfragen vor MOVCHK irgendwie kürzer gestalten? Sie dienen dem Zweck, den Mauszeiger im C64-Rahmen zu halten.
Der Code in Kleinbuchstaben ist von mir eingefügt. Der Rest ist der Treiber aus dem 1351-Manual.
Code
IIRQ = $0314
VIC = $D000 ; VIC REGISTERS
SID = $D400 ; SID REGISTERS
POTX = SID+$19
POTY = SID+$1A
XPOS = VIC+$00 ; LOW ORDER X POSITION
XPOS2 = VIC+$02
YPOS = VIC+$01 ; Y POSITION
YPOS2 = VIC+$03
XPOSMSB = VIC+$10 ; BIT 0 IS HIGH ORDER X POSITION
!to "mouseman.d64",d64
*=$0801
;** BASIC-Zeile: 10 SYS2064
!word main-2, 10
!byte $9e
!text "2064"
!byte $00,$00,$00
!zone main
*=$0810
main
jsr SetupSprite
jsr INSTALL
rts
!zone Sprite
SetupSprite
ldx #63
lda #0
clearloop
sta $0340,x
sta $0380,x
dex
bpl clearloop
ldy #4
ldx #12
sprite0loop
lda CursorSprite,y
sta $0340,x
lda CursorSprite2,y
sta $0383,x
dex
dex
dex
dey
bpl sprite0loop
lda #13
sta $07f8
lda #14
sta $07f9
lda #100
sta $d000
sta $d002
lda #100
sta $d001
sta $d003
lda #0
sta $d028
lda #3
sta $d015
rts
CursorSprite !byte 224,192,160,16,8
CursorSprite2 !byte 32,80,40,20,8
!zone irq
*=$0900
IIRQ2 !byte 0,0
OPOTX !byte 0
OPOTY !byte 0
NEWVALUE !byte 0
OLDVALUE !byte 0
INSTALL LDA IIRQ+1
CMP #>MIRQ
BEQ L90
PHP
SEI
LDA IIRQ
STA IIRQ2
LDA IIRQ+1
STA IIRQ2+1
lda POTX
sta OPOTX
lda POTY
sta OPOTY
LDA #<MIRQ
STA IIRQ
LDA #>MIRQ
STA IIRQ+1
;
PLP
L90 RTS
;
; Updates positions of sprites 0 and 1 according to mouse movement
MIRQ CLD ; JUST IN CASE.....
LDA POTX ; GET DELTA VALUES FOR X
LDY OPOTX
JSR MOVCHK
STY OPOTX
;
tay
CLC ; MODIFY X POSITION
ADC XPOS
STA XPOS
STA XPOS2
TXA
ADC #$00
AND #%00000001
sta $fe
asl
ora $fe
EOR XPOSMSB
STA XPOSMSB
;Make sure 24 <= XPOS <= 256 + 87
and #%00000001 ; check msb again
beq easy
tya ; y is steering direction
bmi left_steered
lda XPOS
cmp #88
bcc update_Y
lda #87
sta XPOS
sta XPOS2
jmp update_Y
left_steered
lda XPOS
bpl update_Y
lda #24
sta XPOS
sta XPOS2
lda XPOSMSB
and #%11111100
sta XPOSMSB
jmp update_Y
easy
lda XPOS
cmp #24
bcs update_Y
lda #24
sta XPOS
sta XPOS2
update_Y
LDA POTY ; GET DELTA VALUE FOR Y
LDY OPOTY
JSR MOVCHK
STY OPOTY
;
; MODIFY Y POSITION (DECREASE Y FOR INCREASE IN POT)
EOR #$FF
tay
iny
tya
clc
ADC YPOS
STA YPOS
STA YPOS2
;
;Make sure 50 <= YPOS <= 249
tya ; y is steering direction
bpl down
lda YPOS
cmp #50
bcs raus
lda #50
sta YPOS
sta YPOS2
JMP (IIRQ2)
down
bcs overflow
lda YPOS
cmp #250
bcc raus
overflow
lda #249
sta YPOS
sta YPOS2
raus
JMP (IIRQ2) ; CONTINUE W/ IRQ OPERATION
;
; MOVCHK
; ENTRY Y = OLD VALUE OF POT REGISTER
; A = CURRENT VALUE OF POT REGISTER
; EXIT Y = VALUE TO USE FOR OLD VALUE
; X,A = DELTA VALUE FOR POSITION
; A is in range 0-31 (right move) or 224-254 (left move)
;
MOVCHK STY OLDVALUE ; SAVE OLD & NEW VALUES
STA NEWVALUE
LDX #0 ; PRELOAD X W/ 0
;
SEC ; A <= MOD64( NEW-OLD )
SBC OLDVALUE
AND #%01111111
CMP #%01000000
BCS L50 ; IF <
LSR A ; A -> A/2
BEQ L80 ; IF <> 0
LDY NEWVALUE ; Y <= NEWVALUE
RTS ; RETURN
;
L50 ORA #%11000000 ; ELSE OR IN HIGH ORDER BITS
CMP #$FF ; IF <> -1
BEQ L80
SEC ; A -> A/2
ROR A
LDX #$FF ; X <= -1
LDY NEWVALUE ; Y <= NEWVALUE
RTS ; RETURN
;
L80 LDA #0 ; A <= 0
RTS ; RETURN W/ Y = OLD VALUE
Alles anzeigen