1; GEOS KERNAL by Berkeley Softworks 2; reverse engineered by Maciej Witkowiak, Michael Steil 3; 4; Mouse: MouseUp, MouseOff, StartMouseMode, ClearMouseMode syscalls 5 6 7.include "const.inc" 8.include "geossym.inc" 9.include "geosmac.inc" 10.include "config.inc" 11.include "gkernal.inc" 12.include "c64.inc" 13.include "inputdrv.inc" 14.include "banks.inc" 15.include "kernal.inc" 16 17.import _DoPreviousMenu 18.import menuOptNumber 19.import ProcessClick 20.import Menu_5 21.import menuRight 22.import menuLeft 23.import menuBottom 24.import menuTop 25.import _DisablSprite 26 27.import CallRoutine 28.import PosSprite 29.import DrawSprite 30.import MouseUp 31.import NormalizeX 32.ifndef bsw128 33.import EnablSprite 34.endif 35 36.import gjsrfar 37 38.global _MouseOff 39.global _StartMouseMode 40.global ProcessMouse 41.global _ClearMouseMode 42.global _MouseUp 43 44.ifdef wheels 45.global ResetMseRegion 46.endif 47 48.segment "mouse2" 49 50_StartMouseMode: 51 bcc @1 52 lda r11L 53 ora r11H 54 beq @1 55.ifdef bsw128 56 ldx #r11 57 jsr NormalizeX 58.endif 59 MoveW r11, mouseXPos 60 sty mouseYPos 61 jsr SlowMouse 62@1: LoadW mouseVector, CheckClickPos 63 LoadW mouseFaultVec, DoMouseFault 64 LoadB faultData, NULL 65 jmp MouseUp 66 67_ClearMouseMode: 68 LoadB mouseOn, NULL 69CMousMd1: 70 LoadB r3L, NULL 71 jmp _DisablSprite 72 73_MouseOff: 74 rmbf MOUSEON_BIT, mouseOn 75 jmp CMousMd1 76 77_MouseUp: 78 smbf MOUSEON_BIT, mouseOn 79.ifdef bsw128 80 smbf_ 0, mobenble 81.endif 82 rts 83 84ProcessMouse: 85 jsr UpdateMouse 86 jsr CheckMsePos 87 LoadB r3L, 0 88 rts 89 90CheckMsePos: 91 ldy mouseLeft 92 ldx mouseLeft+1 93 lda mouseXPos+1 94 bmi @2 95 cpx mouseXPos+1 96 bne @1 97 cpy mouseXPos 98@1: bcc @3 99 beq @3 100@2: smbf OFFLEFT_BIT, faultData 101 sty mouseXPos 102 stx mouseXPos+1 103@3: ldy mouseRight 104 ldx mouseRight+1 105 cpx mouseXPos+1 106 bne @4 107 cpy mouseXPos 108@4: bcs @5 109 smbf OFFRIGHT_BIT, faultData 110 sty mouseXPos 111 stx mouseXPos+1 112@5: ldy mouseTop 113 CmpBI mouseYPos, 228 114 bcs @6 115 cpy mouseYPos 116 bcc @7 117 beq @7 118@6: smbf OFFTOP_BIT, faultData 119 sty mouseYPos 120@7: ldy mouseBottom 121 cpy mouseYPos 122 bcs @8 123 smbf OFFBOTTOM_BIT, faultData 124 sty mouseYPos 125@8: bbrf MENUON_BIT, mouseOn, @B 126 lda mouseYPos 127; x16-emulator: 128; When opening a menu, GEOS repositions the mouse. x16-emulator 129; only knows absolute mouse positions based on the system mouse 130; position, so this has no effect. The next time the mouse is 131; read, it will be a its original location, which is above the 132; menu, so the menu gets closed. As a hack, disable the check. 133; The side effect of this is that the mouse can escape the menu 134; vertically, and weird things can happen. 135; The correct fix is to not reposition the mouse, and dismiss the 136; menu on a *click* outside. 137; cmp menuTop 138; bcc @A 139 cmp menuBottom 140 beq @9 141 bcs @A 142@9: CmpW mouseXPos, menuLeft 143 bcc @A 144 CmpW mouseXPos, menuRight 145 bcc @B 146 beq @B 147@A: smbf OFFMENU_BIT, faultData 148@B: rts 149 150.ifdef wheels ; this got moved :( 151.import ScreenDimensions 152ResetMseRegion: 153 ldy #5 154@1: lda ScreenDimensions,y 155 sta mouseTop,y 156 dey 157 bpl @1 158 rts 159.endif 160 161CheckClickPos: 162 lda mouseData 163 bmi @4 164.ifdef wheels_size_and_speed 165 bit mouseOn 166 bpl @4 167 bvc @3 168.else 169 lda mouseOn 170 and #SET_MSE_ON 171 beq @4 172 lda mouseOn 173 and #SET_MENUON 174 beq @3 175.endif 176 CmpB mouseYPos, menuTop 177 bcc @3 178 cmp menuBottom 179 beq @1 180 bcs @3 181@1: CmpW mouseXPos, menuLeft 182 bcc @3 183 CmpW mouseXPos, menuRight 184 beq @2 185 bcs @3 186@2: jmp Menu_5 187@3: bbrf ICONSON_BIT, mouseOn, @4 188 jmp ProcessClick 189@4: lda otherPressVec 190 ldx otherPressVec+1 191 jmp CallRoutine 192 193.ifndef wheels_size 194 rts ; ??? 195.endif 196 197DoMouseFault: 198.ifdef wheels_size_and_speed 199 bit mouseOn 200 bpl @3 201 bvc @3 202.else 203 lda #$c0 204 bbrf MOUSEON_BIT, mouseOn, @3 205 bvc @3 206.endif 207 lda menuNumber 208 beq @3 209 bbsf OFFMENU_BIT, faultData, @2 210 211.ifdef wheels_size_and_speed 212 lda #SET_OFFTOP 213 bit menuOptNumber 214 bmi @X 215 lda #SET_OFFLEFT 216@X: and faultData 217.else 218 ldx #SET_OFFTOP 219 lda #$C0 220 tay 221 bbsf 7, menuOptNumber, @1 222 ldx #SET_OFFLEFT 223@1: txa 224 and faultData 225.endif 226 bne @2 227.ifndef wheels_size_and_speed ; seems unnecessary? 228 tya 229.endif 230 bbsf 6, menuOptNumber, @3 231@2: jsr _DoPreviousMenu 232@3: rts 233 234 235.export MouseInit 236MouseInit: 237 lda #1 ; default pointer 238 ldx #2 ; scale 239 jsr gjsrfar 240 .word mouse_config 241 .byte BANK_KERNAL 242 rts 243 244SlowMouse: 245SetMouse: 246 rts ;XXX X16 TODO 247 248tmpFire = mouseAccel ; reuse of unused location 249 250UpdateMouse: 251 jsr gjsrfar 252 .word mouse_scan 253 .byte BANK_KERNAL 254 255 ldx #r0 256 jsr gjsrfar 257 .word mouse_get 258 .byte BANK_KERNAL 259 and #1 260 eor #1 261 cmp tmpFire 262 beq :+ 263 sta tmpFire 264 lsr 265 ror 266 sta mouseData 267 smbf MOUSE_BIT, pressFlag 268: lda r0H 269 lsr 270 sta mouseXPos + 1 271 lda r0L 272 ror 273 sta mouseXPos 274 lsr r1H 275 lda r1L 276 ror 277 sta mouseYPos 278 rts 279 280