X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libsrc%2Fc64%2Fmouse.s;h=23c228a7bc85b242e0385db1bae41c2cdae982e7;hb=1075d1e193448b3234ffd07361fa23b6039451cb;hp=497ff7557ddb20cffd6acc5c6651e8acbb6ca725;hpb=8b73812212c889fbcb073026f42fc18930a4c464;p=cc65 diff --git a/libsrc/c64/mouse.s b/libsrc/c64/mouse.s index 497ff7557..23c228a7b 100644 --- a/libsrc/c64/mouse.s +++ b/libsrc/c64/mouse.s @@ -12,55 +12,65 @@ .export _mouse_buttons, _mouse_info .import _readjoy - .import popa, popsreg, addysp1 - .importzp ptr1, sp, sreg + .import popax, addysp1 + .importzp ptr1, sp .include "c64.inc" .macpack generic + .code ; -------------------------------------------------------------------------- ; -; unsigned char __fastcall__ mouse_init (unsigned char port, -; unsigned char sprite, -; unsigned char type); +; Constants ; -_mouse_init: - jsr popa ; Ignore the type, get sprite param - tax ; Save sprite number - jsr popa ; Get the port number +SPRITE_HEIGHT = 21 +SPRITE_WIDTH = 24 +SCREEN_HEIGHT = 200 +SCREEN_WIDTH = 320 +XCORR = SPRITE_WIDTH - ldy OldIRQ+1 ; Already initialized? - bne AlreadyInitialized ; Jump if yes +; -------------------------------------------------------------------------- +; +; unsigned char __fastcall__ mouse_init (unsigned char type); +; - stx MouseSprite ; Remember the sprite number - sta MousePort ; Remember the port number +_mouse_init: + lda OldIRQ+1 ; Already initialized? + bne AlreadyInitialized ; Jump if yes ; Initialize variables ldx #0 - stx XPos + lda #XCORR + sta XPos stx XPos+1 stx YPos stx YPos+1 stx OldPotX stx OldPotY stx XMin - stx XMin+1 ; XMin = 0 - lda #29 + stx XMin+1 ; XMin = 0 + lda #50 ; ## FIXME: This is the PAL value + sta YCorr + sta YPos + stx YPos+1 + sec + sbc #SPRITE_HEIGHT ; Sprite height in pixels sta YMin - stx YMin+1 ; YMin = 29 - lda #250 + stx YMin+1 ; YMin = 29 + lda #SCREEN_HEIGHT ; Vertical screen res + add YCorr ; Add correction factor sta YMax - stx YMax+1 ; YMax = 250 - inx ; X = 1 - stx Visible ; Mouse *not* visible - lda #<344 + stx YMax+1 + inx ; X = 1 + stx Invisible ; Mouse *not* visible + lda #<(SCREEN_WIDTH + SPRITE_WIDTH) sta XMax - stx XMax+1 ; XMax = 344 + stx XMax+1 ; XMax = 320 + sprite width ; Remember the old IRQ vector @@ -69,14 +79,13 @@ _mouse_init: lda IRQVec+1 sta OldIRQ+1 -; Set our own IRQ vector. We cheat here to save a few bytes of code: -; The function is expected to return a value not equal to zero on success, -; and since we know that the high byte of the IRQ handler address is never -; zweo, we will return just this byte. +; Set our own IRQ vector. - ldx #MouseIRQ - bne SetIRQ ; Branch always + ldx #MouseIRQ + jsr SetIRQ ; Set our IRQ vector, disable sprite 0 + lda #1 ; Mouse successfully initialized + rts AlreadyInitialized: lda #0 ; Error @@ -88,36 +97,37 @@ AlreadyInitialized: ; _mouse_done: - ldx OldIRQ ; Initialized? - lda OldIRQ+1 + ldx OldIRQ + ldy OldIRQ+1 ; Initialized? beq Done ; Jump if no - ldy #0 - sty OldIRQ+1 ; Reset the initialized flag -SetIRQ: sei ; Disable interrupts + lda #0 + sta OldIRQ+1 ; Reset the initialized flag +SetIRQ: sei ; Disable interrupts stx IRQVec ; Set the new/old vector - sta IRQVec+1 - cli ; Enable interrupts + sty IRQVec+1 + lda VIC_SPR_ENA ; Get sprite enable register + and #$FE ; Disable sprite #0 + sta VIC_SPR_ENA ; Write back + cli ; Enable interrupts Done: rts + ; -------------------------------------------------------------------------- ; ; void mouse_hide (void); ; _mouse_hide: - lda Visible ; Get the flag + lda Invisible ; Get the flag bne @L1 ; Jump if already invisible - ldx MouseSprite ; Sprite defined? - beq @L1 ; Jump if no - - lda NotMask-1,x ; Get clean mask + lda #$FE ; Clear bit for sprite #0 sei ; Disable interrupts and VIC_SPR_ENA sta VIC_SPR_ENA ; Disable sprite - cli ; Enable interrupts + cli ; Enable interrupts -@L1: inc Visible ; Set the flag to invisible +@L1: inc Invisible ; Set the flag to invisible rts ; -------------------------------------------------------------------------- @@ -126,21 +136,16 @@ _mouse_hide: ; _mouse_show: - lda Visible ; Mouse already visible? - beq @L1 ; Jump if yes - dec Visible ; Get the flag - bne @L1 ; Jump if still invisible - ldx MouseSprite ; Sprite defined? + lda Invisible ; Mouse invisible? beq @L1 ; Jump if no + dec Invisible ; Set the flag + bne @L1 ; Jump if still invisible sei ; Disable interrupts jsr MoveSprite1 ; Move the sprite to it's position - - ldx MouseSprite ; Get sprite number (again) - lda BitMask-1,x ; Get bit mask - ora VIC_SPR_ENA - sta VIC_SPR_ENA ; Enable sprite - + lda VIC_SPR_ENA ; Get sprite enable register + ora #$01 ; Enable sprite #0 + sta VIC_SPR_ENA ; Write back cli ; Enable interrupts @L1: rts @@ -153,33 +158,42 @@ _mouse_show: _mouse_box: ldy #0 ; Stack offset - php - sei ; Disable interrupts + add YCorr ; Adjust the Y value + bcc @L1 + inx + clc +@L1: sei ; Disable interrupts sta YMax - stx YMax+1 ; maxy + stx YMax+1 ; maxy - lda (sp),y + lda (sp),y + adc #XCORR sta XMax iny lda (sp),y - sta XMax+1 ; maxx + adc #$00 + sta XMax+1 ; maxx iny lda (sp),y - sta YMin + add YCorr + sta YMin iny lda (sp),y - sta YMin+1 ; miny + adc #$00 + sta YMin+1 ; miny iny lda (sp),y - sta XMin + add #XCORR + sta XMin iny lda (sp),y - sta XMin+1 ; minx + adc #$00 + sta XMin+1 ; minx - plp ; Enable interrupts + cli ; Enable interrupts jmp addysp1 ; Drop params, return @@ -193,26 +207,31 @@ _mouse_pos: sta ptr1 stx ptr1+1 ; Remember the argument pointer - ldy #0 ; Structure offset - - php - sei ; Disable interrupts + ldy #0 ; Structure offset + sec ; Needed for the SBC later + sei ; Disable interrupts lda XPos ; Transfer the position + sbc #XCORR sta (ptr1),y lda XPos+1 + sbc #$00 iny sta (ptr1),y - lda YPos - iny - sta (ptr1),y - lda YPos - iny - sta (ptr1),y + lda YPos + ldx YPos+1 + cli ; Restore initial interrupt state - plp ; Restore initial interrupt state + sub YCorr ; Apply the Y correction value + bcs @L1 + dex +@L1: iny + sta (ptr1),y ; Store YPos + txa + iny + sta (ptr1),y - rts ; Done + rts ; Done ; -------------------------------------------------------------------------- ; @@ -231,9 +250,9 @@ _mouse_info: ; Fill in the button state - jsr _mouse_buttons ; Will not touch ptr1 - ldy #4 - sta (ptr1),y + jsr _mouse_buttons ; Will not touch ptr1 + ldy #4 + sta (ptr1),y rts @@ -243,29 +262,34 @@ _mouse_info: ; _mouse_move: - jsr popsreg ; Get X - sei ; Disable interrupts + add YCorr ; Add Y coordinate correction + bcc @L1 + inx + clc +@L1: sei + sta YPos + stx YPos+1 + cli + + jsr popax ; Get X + adc #XCORR ; Adjust X coordinate + bcc @L2 + inx +@L2: sei + sta XPos + stx XPos+1 ; Set new position + jsr MoveSprite ; Move the sprite to the mouse pos + cli ; Enable interrupts - sta YPos - stx YPos+1 - lda sreg - ldx sreg+1 - sta XPos - stx XPos+1 ; Set new position - - jsr MoveSprite ; Move the sprite to the mouse pos - -@L9: cli ; Enable interrupts rts - ; -------------------------------------------------------------------------- ; ; unsigned char mouse_buttons (void); ; _mouse_buttons: - lda MousePort ; Get the port + lda #$00 ; Use port #0 jmp _readjoy ; Same as joystick ; -------------------------------------------------------------------------- @@ -388,41 +412,35 @@ MoveCheck: ; -------------------------------------------------------------------------- ; ; Move the mouse sprite to the current mouse position. Must be called -; with interrupts off. MoveSprite1 is an entry without checking and -; loading X +; with interrupts off. MoveSprite1 is an entry without checking. ; MoveSprite: - lda Visible ; Mouse visible? + lda Invisible ; Mouse visible? bne MoveSpriteDone ; Jump if no - ldx MouseSprite ; Sprite defined? - beq MoveSpriteDone ; Jump if no ; Set the high X bit MoveSprite1: lda VIC_SPR_HI_X ; Get high X bits of all sprites - and NotMask-1,x ; Mask out sprite bit - ldy XPos+1 ; Test Y position + and #$FE ; Clear bit for sprite #0 + ldy XPos+1 ; Test Y position beq @L1 - ora BitMask-1,x ; Set high X bit + ora #$01 ; Set high X bit @L1: sta VIC_SPR_HI_X ; Set hi X sprite values ; Set the low X byte - txa - asl a ; Index*2 - tax lda XPos - sta VIC_SPR0_X-2,x ; Set low byte + sta VIC_SPR0_X ; Set low byte ; Set the Y position - ldy YPos+1 ; Negative or too large? + ldy YPos+1 ; Negative or too large? bne MoveSpriteDone ; Jump if yes lda YPos - sta VIC_SPR0_Y-2,x ; Set Y position + sta VIC_SPR0_Y ; Set Y position ; Done @@ -434,13 +452,12 @@ MoveSpriteDone: .bss -OldIRQ: .res 2 ; Old IRQ vector -MousePort: .res 1 ; Port used for the mouse -MouseSprite: .res 1 ; Number of sprite to control +OldIRQ: .res 2 ; Old IRQ vector OldValue: .res 1 ; Temp for MoveCheck routine NewValue: .res 1 ; Temp for MoveCheck routine +YCorr: .res 1 ; Correction for Y coordinate -Visible: .res 1 ; Is the mouse visible? +Invisible: .res 1 ; Is the mouse invisible? OldPotX: .res 1 ; Old hw counter values OldPotY: .res 1 @@ -452,12 +469,4 @@ YMin: .res 2 ; Y1 value of bounding box XMax: .res 2 ; X2 value of bounding box YMax: .res 2 ; Y2 value of bounding box -.data - -BitMask: .byte $01, $02, $04, $08, $10, $20, $40, $80 -NotMask: .byte $FE, $FD, $FB, $F7, $EF, $DF, $BF, $7F - - - -