diff --git a/asminc/c128.inc b/asminc/c128.inc index aac8678bf..6e3078297 100644 --- a/asminc/c128.inc +++ b/asminc/c128.inc @@ -32,6 +32,7 @@ FETCH := $2A2 ; Fetch subroutine in RAM FETVEC := $2AA ; Vector patch location for FETCH STASH := $2AF ; Stash routine in RAM STAVEC := $2B9 ; Vector patch location for STASH +IRQInd := $2FD ; JMP $0000 -- used as indirect IRQ vector PALFLAG := $A03 ; $FF=PAL, $00=NTSC INIT_STATUS := $A04 ; Flags: Reset/Restore initiation status FKEY_LEN := $1000 ; Function key lengths diff --git a/libsrc/c128/irq.s b/libsrc/c128/irq.s index aed1f3a25..79aa8faaa 100644 --- a/libsrc/c128/irq.s +++ b/libsrc/c128/irq.s @@ -7,8 +7,6 @@ .include "c128.inc" -IRQInd = $2FD ; JMP $0000 - used as indirect IRQ vector - ; ------------------------------------------------------------------------ .segment "INIT" diff --git a/libsrc/c128/mou/c128-1351.s b/libsrc/c128/mou/c128-1351.s index f41771d04..8469ba8e3 100644 --- a/libsrc/c128/mou/c128-1351.s +++ b/libsrc/c128/mou/c128-1351.s @@ -3,7 +3,8 @@ ; the Commodore 1351 mouse users guide. ; ; 2009-09-26, Ullrich von Bassewitz -; 2014-03-17, Greg King +; 2014-04-26, Christian Groessler +; 2014-04-30, Greg King ; .include "zeropage.inc" @@ -12,8 +13,6 @@ .macpack generic -IRQInd = $2FD - ; ------------------------------------------------------------------------ ; Header. Includes jump table @@ -28,8 +27,7 @@ HEADER: ; Library reference -libref: - .addr $0000 +libref: .addr $0000 ; Jump table @@ -210,7 +208,7 @@ UNINSTALL: sta IRQInd+1 lda old_irq+1 sta IRQInd+2 - cli + ;cli ; This will be done at end of HIDE jsr HIDE ; Hide cursor on exit lda INIT_save @@ -351,7 +349,7 @@ INFO: jsr POS ; Fill in the button state - jsr BUTTONS ; Will not touch ptr1 + lda Buttons ldy #MOUSE_INFO::BUTTONS sta (ptr1),y @@ -363,7 +361,7 @@ INFO: jsr POS ; Must return an error code in a/x. ; -IOCTL: lda #MOUSE_ERR_INV_IOCTL rts diff --git a/libsrc/c128/mou/c128-inkwell.s b/libsrc/c128/mou/c128-inkwell.s index 27511b5f1..f7b844f4d 100644 --- a/libsrc/c128/mou/c128-inkwell.s +++ b/libsrc/c128/mou/c128-inkwell.s @@ -1,7 +1,8 @@ ; ; Driver for the Inkwell Systems 170-C and 184-C lightpens. ; -; 2013-07-01, Greg King +; 2014-04-26, Christian Groessler +; 2014-05-01, Greg King ; .include "zeropage.inc" @@ -24,7 +25,7 @@ HEADER: ; Library reference -LIBREF: .addr $0000 +libref: .addr $0000 ; Jump table @@ -102,6 +103,14 @@ OldPenY: .res 1 INIT_save: .res 1 +; Keyboard buffer fill level at start of interrupt + +old_key_count: .res 1 + +; Original IRQ vector + +old_irq: .res 2 + .data ; Default Inkwell calibration. @@ -131,7 +140,7 @@ INSTALL: lda #%11000000 sta INIT_STATUS -; Initiate variables. Just copy the default stuff over. +; Initiate some variables. Just copy the default stuff over. ldx #.sizeof (DefVars) - 1 @L0: lda DefVars,x @@ -144,18 +153,57 @@ INSTALL: stx OldPenX sty OldPenY +; Initiate our IRQ magic. + + ; Remember the ROM IRQ continuation address. + ldx IRQInd+2 + lda IRQInd+1 + stx old_irq+1 + sta old_irq + + lda libref + ldx libref+1 + sta ptr3 ; Point to mouse_adjuster + stx ptr3+1 + + ; Set the ROM IRQ continuation address to point to the provided routine. + ldy #2 + lda (ptr3),y + iny + sei + sta IRQInd+1 + lda (ptr3),y + sta IRQInd+2 + + ; Set the address of our IRQ callback routine. + ; Because it's called via "rts", we must use "address-1". + iny + lda #<(callback-1) + sta (ptr3),y + iny + lda #>(callback-1) + sta (ptr3),y + + ; Set the ROM entry-point vector. + ; Because it's called via "rts", we must decrement it by one. + iny + lda old_irq + sub #<1 + sta (ptr3),y + iny + lda old_irq+1 + sbc #>1 + sta (ptr3),y + cli + ; Call a calibration function through the library-reference. - lda LIBREF - ldx LIBREF+1 - sta ptr1 ; Point to mouse_adjuster - stx ptr1+1 ldy #1 - lda (ptr1),y + lda (ptr3),y bze @L1 ; Don't call pointer if it's NULL sta Calibrate+2 ; Point to function dey - lda (ptr1),y + lda (ptr3),y sta Calibrate+1 lda #XOffset @@ -187,6 +235,13 @@ INSTALL: ; No return code required (the driver is removed from memory on return). UNINSTALL: + lda old_irq + ldx old_irq+1 + sei + sta IRQInd+1 + stx IRQInd+2 + ;cli ; This will be done at end of HIDE + jsr HIDE ; Hide cursor on exit lda INIT_save sta INIT_STATUS @@ -346,6 +401,8 @@ IOCTL: lda #MOUSE_ERR_INV_IOCTL rts @@ -387,19 +382,10 @@ IRQ: jsr CPREP lda CIA1_PRB ; Read joystick #0 and #$1F eor #$1F ; Make all bits active high - sta Temp - -; Check for a pressed button and place the result into Buttons - - ldx #$00 ; Assume no button pressed - and #JOY::FIRE ; Check fire button - beq @L0 ; Jump if not pressed - ldx #MOUSE_BTN_LEFT ; Left (only) button is pressed -@L0: stx Buttons + sta Buttons ; Check left/right - lda Temp ; Read joystick #0 and #(JOY::LEFT | JOY::RIGHT) beq @SkipX ; @@ -447,7 +433,7 @@ IRQ: jsr CPREP ; Calculate the Y movement vector -@SkipX: lda Temp ; Read joystick #0 +@SkipX: lda Buttons ; Read joystick #0 and #(JOY::UP | JOY::DOWN) ; Check up/down beq @SkipY ; @@ -499,5 +485,5 @@ IRQ: jsr CPREP clc ; Interrupt not "handled" rts -.define OLD_BUTTONS Temp ; tells callback.inc where the old port status is stored +.define OLD_BUTTONS Buttons ; tells callback.inc where the old port status is stored .include "callback.inc" diff --git a/libsrc/c128/mou/c128-pot.s b/libsrc/c128/mou/c128-pot.s index 50b0a7c9a..3d5dd6fe4 100644 --- a/libsrc/c128/mou/c128-pot.s +++ b/libsrc/c128/mou/c128-pot.s @@ -3,7 +3,8 @@ ; ; 2006-08-20, Stefan Haubenthal ; 2009-09-26, Ullrich von Bassewitz -; 2014-03-17, Greg King +; 2014-04-26, Christian Groessler +; 2014-05-05, Greg King ; .include "zeropage.inc" @@ -26,7 +27,7 @@ HEADER: ; Library reference - .addr $0000 +libref: .addr $0000 ; Jump table @@ -43,6 +44,10 @@ HEADER: .addr IOCTL .addr IRQ +; Mouse driver flags + + .byte MOUSE_FLAG_LATE_IRQ + ; Callback table, set by the kernel before INSTALL is called CHIDE: jmp $0000 ; Hide the cursor @@ -85,9 +90,13 @@ Buttons: .res 1 ; Button mask INIT_save: .res 1 -; Temporary value used in the int handler +; Keyboard buffer fill level at start of interrupt -Temp: .res 1 +old_key_count: .res 1 + +; Original IRQ vector + +old_irq: .res 2 .rodata @@ -141,6 +150,47 @@ INSTALL: lda YPos ldx YPos+1 jsr CMOVEY + +; Initiate our IRQ magic. + + ; Remember the ROM IRQ continuation address. + ldx IRQInd+2 + lda IRQInd+1 + stx old_irq+1 + sta old_irq + + lda libref + ldx libref+1 + sta ptr3 + stx ptr3+1 + + ; Set the ROM IRQ continuation address to point to the provided routine. + ldy #2 + lda (ptr3),y + sta IRQInd+1 + iny + lda (ptr3),y + sta IRQInd+2 + + ; Set the address of our IRQ callback routine. + ; Because it's called via "rts", we must use "address-1". + iny + lda #<(callback-1) + sta (ptr3),y + iny + lda #>(callback-1) + sta (ptr3),y + + ; Set the ROM entry-point vector. + ; Because it's called via "rts", we must decrement it by one. + iny + lda old_irq + sub #<1 + sta (ptr3),y + iny + lda old_irq+1 + sbc #>1 + sta (ptr3),y cli ; Done, return zero (= MOUSE_ERR_OK) @@ -154,6 +204,13 @@ INSTALL: ; No return code required (the driver is removed from memory on return). UNINSTALL: + lda old_irq + ldx old_irq+1 + sei + sta IRQInd+1 + stx IRQInd+2 + ;cli ; This will be done at end of HIDE + jsr HIDE ; Hide cursor on exit lda INIT_save sta INIT_STATUS @@ -255,6 +312,15 @@ MOVE: sei ; No interrupts BUTTONS: lda Buttons ldx #$00 + +; Make the buttons look like a 1351 mouse. + + and #JOY::LEFT | JOY::RIGHT + lsr a + lsr a + ;clc ; ("lsr" shifted zero into carry flag) + adc #%00001110 ; Shift bit 1 over to bit 4 + and #MOUSE_BTN_LEFT | MOUSE_BTN_RIGHT rts ;---------------------------------------------------------------------------- @@ -293,7 +359,7 @@ INFO: jsr POS ; Fill in the button state - lda Buttons + jsr BUTTONS ldy #MOUSE_INFO::BUTTONS sta (ptr1),y @@ -305,7 +371,7 @@ INFO: jsr POS ; Must return an error code in a/x. ; -IOCTL: lda #MOUSE_ERR_INV_IOCTL rts @@ -315,22 +381,17 @@ IOCTL: lda #