From 2326ca627461a78beb80b50027767b6924ec2879 Mon Sep 17 00:00:00 2001 From: cpg Date: Fri, 17 Nov 2000 01:23:44 +0000 Subject: [PATCH] Atari mouse routines -- original version from F.Offenga git-svn-id: svn://svn.cc65.org/cc65/trunk@441 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/atari/mouse.s | 547 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 547 insertions(+) create mode 100644 libsrc/atari/mouse.s diff --git a/libsrc/atari/mouse.s b/libsrc/atari/mouse.s new file mode 100644 index 000000000..498ed38f8 --- /dev/null +++ b/libsrc/atari/mouse.s @@ -0,0 +1,547 @@ +;-------------------------------------------------------------------- +; Atari 8-bit mouse routines -- 05/07/2000 Freddy Offenga +; +; The following devices are supported: +; - Atari trak-ball +; - ST mouse +; - Amiga mouse +; +; Mouse checks are done in the timer 1 IRQ and the mouse arrow is +; drawn in player 0 during the vertical blank +;-------------------------------------------------------------------- + + .export _mouse_init, _mouse_done, _mouse_box + .export _mouse_show, _mouse_hide, _mouse_move + .export _mouse_down + + .import popa + + .include "atari.inc" + +TRAK_BALL = 0 ; device Atari trak-ball +ST_MOUSE = 1 ; device ST mouse +AMIGA_MOUSE = 2 ; device Amiga mouse +MAX_TYPE = 3 ; first illegal device type + +defxmin = 48 ; default x minimum +defymin = 32 ; default y minimum + +defxmax = 204 ; default x maximum +defymax = 211 ; default y maximum + +pmsize = 16 ; size pm shape + +xinit = 100 ; init. x pos. +yinit = 100 ; init. y pos. + +pmb = $2800 ; pm base memory +pm0 = pmb+$400 ; pm 0 memory + +;-------------------------------------------------------------------- +; Initialize mouse routines +; int mouse_init(unsigned char type, unsigned char port) + +_mouse_init: + ldy #0 + sta (SAVMSC),y + sta port_nr + jsr popa + ldy #1 + sta (SAVMSC),y + sta mouse_type + + ldx mouse_type + cpx #MAX_TYPE + bcc setup + +ifail: + lda #0 ; init. failed + tax + rts + +setup: + lda lvectab,x + sta mouse_vec+1 + lda hvectab,x + sta mouse_vec+2 + + lda #defxmin + sta xmin + lda #defymin + sta ymin + + lda #defxmax + sta xmax + lda #defymax + sta ymax + + lda #xinit + sta mousex + lda #yinit + sta mousey + + jsr pminit + + lda VTIMR1 + sta old_t1 + lda VTIMR1+1 + sta old_t1+1 + + lda #t1_vec + sta VTIMR1+1 + + lda #%00000001 + sta AUDCTL + + lda #0 + sta AUDC1 + + lda #15 + sta AUDF1 + sta STIMER + + sei + lda POKMSK + ora #%00000001 ; timer 1 enable + sta POKMSK + sta IRQEN + cli + + lda VVBLKI + sta vbi_jmp+1 + lda VVBLKI+1 + sta vbi_jmp+2 + + lda #6 + ldy #vbi + jsr SETVBV + + lda #$C0 + sta NMIEN + + ldx #0 + lda #1 + sta mouse_on + rts + +;-------------------------------------------------------------------- +; Finish mouse routines +; void mouse_done(void) + +_mouse_done: + sei + lda POKMSK + and #%11111110 ; timer 1 disable + sta IRQEN + sta POKMSK + cli + + lda old_t1 + sta VTIMR1 + lda old_t1+1 + sta VTIMR1+1 + + lda #$40 + sta NMIEN + + lda #6 + ldy vbi_jmp+1 + ldx vbi_jmp+2 + jsr SETVBV + + lda #0 + sta GRACTL + sta HPOSP0 + sta mouse_on + rts + +;-------------------------------------------------------------------- +; Set mouse limits +; void mouse_box(char xmin, char ymin, char xmax, char ymax) + +_mouse_box: + sta ymax + jsr popa + sta xmax + jsr popa + sta ymin + jsr popa + sta xmin + rts + +;-------------------------------------------------------------------- +; Set mouse position +; void mouse_move(char xpos, char ypos) + +_mouse_move: + sta mousey + jsr popa + sta mousex + rts + +;-------------------------------------------------------------------- +; Show mouse arrow +; void mouse_show(void) + +_mouse_show: + lda #1 + sta mouse_on + rts + +;-------------------------------------------------------------------- +; Hide mouse arrow +; void mouse_hide(void) + +_mouse_hide: + lda #0 + sta mouse_on + rts + +;-------------------------------------------------------------------- +; Ask mouse button +; int mouse_down(void) + +_mouse_down: + ldx port_nr + lda STRIG0,x + bne nobut + lda #14 + sta COLOR1 + ldx #0 + lda #1 + rts +nobut: ldx #0 + txa + rts + +;-------------------------------------------------------------------- +; Atari trak-ball check, A,Y = 4-bit port value + +trak_check: + eor oldval + and #%00001000 + beq horiz + + tya + and #%00000100 + beq mmup + + inc mousey + bne horiz + +mmup: dec mousey + +horiz: tya + eor oldval + and #%00000010 + beq mmexit + + tya + and #%00000001 + beq mmleft + + inc mousex + bne mmexit + +mmleft: dec mousex + +mmexit: sty oldval + rts + +;-------------------------------------------------------------------- +; ST mouse check, A,Y = 4-bit port value + +st_check: + and #%00000011 + ora dumx + tax + lda sttab,x + bmi nxst + + beq xist + dec mousex ; 1 = left + bne nxst +xist: inc mousex ; 0 = right + +nxst: tya + and #%00001100 + ora dumy + tax + lda sttab,x + bmi nyst + + bne yst + dec mousey ; 0 = up + bne nyst +yst: inc mousey ; 1 = down + +; store old readings + +nyst: tya + and #%00000011 + asl + asl + sta dumx + tya + and #%00001100 + lsr + lsr + sta dumy + rts + +;-------------------------------------------------------------------- +; Amiga mouse check, A,Y = 4-bit port value + +amiga_check: + + lsr + and #%00000101 + ora dumx + tax + lda amitab,x + bmi nxami + + bne xiami + dec mousex ; 0 = left + bne nxami +xiami: inc mousex ; 1 = right + +nxami: tya + + and #%00000101 + ora dumy + tax + lda amitab,x + bmi nyami + + bne yiami + dec mousey ; 0 = up + bne nyami +yiami: inc mousey ; 1 = down + +; store old readings + +nyami: tya + and #%00001010 + sta dumx + tya + and #%00000101 + asl + sta dumy + rts + +;-------------------------------------------------------------------- +; timer 1 IRQ routine - check mouse + +t1_vec: tya + pha + txa + pha + + lda RANDOM + sta COLBK ; debug + + lda port_nr + lsr ; even number 0/2 + tay + lda PORTA,y + ldy port_nr + cpy #1 + beq oddp + cpy #3 + beq oddp + + lsr + lsr + lsr + lsr +oddp: tay + +mouse_vec: + jsr st_check ; will be modified + + pla + tax + pla + tay + pla + rti + +;-------------------------------------------------------------------- +; VBI - check mouse limits and display mouse arrow + +vbi: lda mousex + cmp xmin + bcs ok1 ; xmin <= mousex + lda xmin + sta mousex + +ok1: lda mousey + cmp ymin + bcs ok2 ; ymin <= mousey + lda ymin + sta mousey + +ok2: lda xmax + cmp mousex + bcs ok3 ; xmax >= mousex + lda xmax + sta mousex + +ok3: lda ymax + cmp mousey + bcs ok4 ; ymax >= mousey + lda ymax + sta mousey + +ok4: jsr clrpm + + lda mouse_on + bne mon + lda #0 + sta HPOSP0 + beq moff + +mon: jsr drwpm + lda mousey + sta omy + + lda #3 +moff: sta GRACTL + +vbi_jmp: + jmp SYSVBV ; will be modified + +;-------------------------------------------------------------------- +; initialize mouse pm + +pminit: ldx #0 + txa +clpm: sta pm0,x + inx + bne clpm + + lda #>pmb + sta PMBASE + + lda #62 + sta SDMCTL + + lda #1 + sta GPRIOR + + lda #0 + sta PCOLR0 + sta SIZEP0 + rts + +;-------------------------------------------------------------------- +; draw new mouse pm + +drwpm: lda mousex + sta HPOSP0 + + lda mousey + tax + + ldy #0 +fmp2: lda mskpm,y + sta pm0,x + inx + iny + cpy #pmsize + bne fmp2 + rts + +;-------------------------------------------------------------------- +; clear old mouse pm + +clrpm: lda omy + tax + + ldy #0 + tya +fmp1: sta pm0,x + inx + iny + cpy #pmsize + bne fmp1 + rts + +;-------------------------------------------------------------------- + + .data + +; mouse arrow - pm shape + +mskpm: .byte %00000000 + .byte %10000000 + .byte %11000000 + .byte %11000000 + + .byte %11100000 + .byte %11100000 + .byte %11110000 + .byte %11100000 + + .byte %11100000 + .byte %00100000 + .byte %00100000 + .byte %00110000 + + .byte %00110000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + +; ST mouse lookup table + +sttab: .byte $FF,$01,$00,$01 + .byte $00,$FF,$00,$01 + .byte $01,$00,$FF,$00 + .byte $01,$00,$01,$FF + +; Amiga mouse lookup table + +amitab: .byte $FF,$01,$00,$FF + .byte $00,$FF,$FF,$01 + .byte $01,$FF,$FF,$00 + .byte $FF,$00,$01,$FF + +; Device vectors + +lvectab: + .byte trak_check, >st_check, >amiga_check + +; Misc. vars + +old_t1: .res 2 + +dumx: .res 1 +dumy: .res 1 +oldval: .res 1 + +omy: .res 1 + +mousex: .res 1 +mousey: .res 1 + +xmin: .res 1 +ymin: .res 1 + +xmax: .res 1 +ymax: .res 1 + +mouse_on: + .res 1 + +mouse_type: + .res 1 + +port_nr: + .res 1