mirror of
https://github.com/JohnSnape/6502code.git
synced 2024-12-22 00:29:17 +00:00
277 lines
14 KiB
Plaintext
277 lines
14 KiB
Plaintext
0000- 5 ;
|
||
0000- 6 ; Mouse Handler (Apple //c)
|
||
0000- 7 ;
|
||
0000- 8 ; by Christopher A. Mosher
|
||
0000- 9 ;
|
||
0000- 10 ; May, 1987 (updated for ProDOS)
|
||
0000- 11 ; June, 1986
|
||
0000- 12 ;
|
||
0000- 13 ; This program handles the mouse for use
|
||
0000- 14 ; by other programs. It displays a cursor on
|
||
0000- 15 ; the eighty-column text screen, which the user
|
||
0000- 16 ; controls with the mouse.
|
||
0000- 17 ; The program has three main parts: mouseon,
|
||
0000- 18 ; mouseoff, and Irqhndl. mouseon installs the
|
||
0000- 19 ; interrupt handler’s entry address in the
|
||
0000- 20 ; interrupt vector table in the ProDOS System
|
||
0000- 21 ; Global Page; and then enables the mouse’s
|
||
0000- 22 ; movement interrupts. mouseoff will deallocate
|
||
0000- 23 ; the interrupt and disable the mouse. Irqhndl
|
||
0000- 24 ; is the interrupt request handler. It’s
|
||
0000- 25 ; address is the one installed in the Global
|
||
0000- 26 ; Page, and it gets control at each interrupt.
|
||
0000- 27 ;
|
||
0000- 28
|
||
0000- 29 ; page $00 locations
|
||
00FA- 30 bas .eq $FA ; text screen base address ($FA-$FB)
|
||
0008- 31 oldbas .eq $08 ; old text screen base address ($08-$09)
|
||
00FE- 32 row .eq $FE ; storage for row
|
||
00FF- 33 col .eq $FF ; storage for column
|
||
0000- 34
|
||
0000- 35 ; screen hole locations
|
||
0478- 36 minl .eq $0478 ; Clamping minimum to set (low)
|
||
0578- 37 minh .eq $0578 ; Clamping minimum to set (high)
|
||
04F8- 38 maxl .eq $04F8 ; Clamping maximum to set (low)
|
||
05F8- 39 maxh .eq $05F8 ; Clamping maximum to set (high)
|
||
047C- 40 mouxl .eq $047C ; X coordinate (low)
|
||
057C- 41 mouxh .eq $057C ; X coordinate (high)
|
||
04FC- 42 mouyl .eq $04FC ; Y coordinate (low)
|
||
05FC- 43 mouyh .eq $05FC ; Y coordinate (high)
|
||
077C- 44 moustat .eq $077C ; Mouse status byte:
|
||
0000- 45 ; bit meaning
|
||
0000- 46 ; x....... button down
|
||
0000- 47 ; .x...... button down still
|
||
0000- 48 ; ..x..... movement since last read
|
||
0000- 49 ; ...x.... (reserved)
|
||
0000- 50 ; ....x... VBL interrupt has occurred
|
||
0000- 51 ; .....x.. button interrupt has occurred
|
||
0000- 52 ; ......x. movement interrupt has occurred
|
||
0000- 53 ; .......x (reserved)
|
||
0000- 54
|
||
0000- 55 ; ProDOS global page
|
||
BF00- 56 mli .eq $BF00 ; Machine Language Interface entry
|
||
0040- 57 alloc_int .eq $40
|
||
0041- 58 dealloc_int .eq $41
|
||
0000- 59
|
||
0000- 60 ; I/O ROM locations
|
||
C01C- 61 page2sw .eq $C01C ; page two switch
|
||
C054- 62 page1 .eq $C054 ; off: page1 (or main memory)
|
||
C055- 63 page2 .eq $C055 ; on : page2 (or auxiliary memory)
|
||
0000- 64
|
||
0000- 65 ; slot ROM locations
|
||
C412- 66 mtable .eq $C412 ; Start of mouse ROM table
|
||
0000- 67 setm .eq $00 ; Set up mouse mode
|
||
0001- 68 servem .eq $01 ; Set up carry flag and MOUSTAT
|
||
0004- 69 posm .eq $04 ; Set mouse to X and Y coodinates
|
||
0005- 70 clampm .eq $05 ; Set clamping boundaries:
|
||
0007- 71 initm .eq $07 ; Set default values
|
||
0000- 72
|
||
9700- 73 .or $9700
|
||
9700-4C 14 97 74 jmp mouseon ; turn on the mouse
|
||
9703-4C 84 97 75 jmp mouseoff ; turn off the mouse
|
||
9706- 76
|
||
9706-42 77 cursor .db $42 ; mouse cursor
|
||
9707- 78
|
||
9707- 79 parms ; parameter list for MLI calls
|
||
9707-02 80 .db 2
|
||
9708-00 81 .db $00
|
||
9709-04 98 82 .dw irqhndl
|
||
970B- 83
|
||
970B-00 C4 84 mouse .dw $C400 ; address of mouse routine
|
||
970D-00 85 mouxls .db $00 ; storage for X coordinate (low)
|
||
970E-00 86 mouxhs .db $00 ; storage for X coordinate (high)
|
||
970F-00 87 mouyls .db $00 ; storage for Y coordinate (low)
|
||
9710-00 88 moustats .db $00 ; storage for mouse status
|
||
9711-00 89 oldchr .db $00 ; old character value
|
||
9712-00 90 oldp2s .db $00 ; old page two switch setting
|
||
9713-00 91 oldy .db $00 ; old Y register value
|
||
9714- 92
|
||
9714- 93 mouseon ; turn on the mouse
|
||
9714-A9 02 94 lda #2 ; allocate interrupt
|
||
9716-8D 07 97 95 sta parms
|
||
9719-20 00 BF 96 jsr mli
|
||
971C-40 97 .db alloc_int
|
||
971D-07 97 98 .dw parms
|
||
971F-A2 07 99 ldx #initm ; set default values
|
||
9721-20 D0 97 100 jsr mouser
|
||
9724-A9 3C 101 lda #$3C ; set clamping boundaries for X
|
||
9726-8D F8 04 102 sta maxl
|
||
9729-A9 01 103 lda #$01
|
||
972B-8D F8 05 104 sta maxh
|
||
972E-A9 00 105 lda #$00
|
||
9730-8D 78 04 106 sta minl
|
||
9733-8D 78 05 107 sta minh
|
||
9736-A2 05 108 ldx #clampm
|
||
9738-20 D0 97 109 jsr mouser
|
||
973B-A9 B8 110 lda #$B8 ; set clamping boundaries for Y
|
||
973D-8D F8 04 111 sta maxl
|
||
9740-A9 00 112 lda #$00
|
||
9742-8D F8 05 113 sta maxh
|
||
9745-A9 01 114 lda #$01
|
||
9747-A2 05 115 ldx #clampm
|
||
9749-20 D0 97 116 jsr mouser
|
||
974C-A9 03 117 lda #$03 ; set mouse to movement mode
|
||
974E-A2 00 118 ldx #setm
|
||
9750-20 D0 97 119 jsr mouser
|
||
9753-A5 FE 120 lda row ; set X and Y coordinates
|
||
9755-0A 121 asl
|
||
9756-0A 122 asl
|
||
9757-0A 123 asl
|
||
9758-8D FC 04 124 sta mouyl
|
||
975B-A9 00 125 lda #$00
|
||
975D-8D FC 05 126 sta mouyh
|
||
9760-A5 FF 127 lda col
|
||
9762-0A 128 asl
|
||
9763-0A 129 asl
|
||
9764-8D 7C 04 130 sta mouxl
|
||
9767-A9 00 131 lda #$00
|
||
9769-2A 132 rol
|
||
976A-8D 7C 05 133 sta mouxh
|
||
976D-A2 04 134 ldx #posm
|
||
976F-20 D0 97 135 jsr mouser
|
||
9772-2C 1C C0 136 bit page2sw ; store page2
|
||
9775-08 137 php
|
||
9776-20 55 98 138 jsr newcur ; output new cursor and restore and save values
|
||
9779-8D 54 C0 139 sta page1 ; restore page2
|
||
977C-28 140 plp
|
||
977D-10 03 141 bpl exint
|
||
977F-8D 55 C0 142 sta page2
|
||
9782-58 143 exint cli ; enable interrupts
|
||
9783-60 144 rts
|
||
9784- 145
|
||
9784- 146 mouseoff ; turn off the mouse
|
||
9784-A9 00 147 lda #$00 ; set mouse to off mode
|
||
9786-A2 00 148 ldx #setm
|
||
9788-20 D0 97 149 jsr mouser
|
||
978B-2C 1C C0 150 bit page2sw ; store page2
|
||
978E-08 151 php
|
||
978F-8D 54 C0 152 sta page1 ; remove cursor
|
||
9792-2C 12 97 153 bit oldp2s
|
||
9795-10 03 154 bpl l7
|
||
9797-8D 55 C0 155 sta page2
|
||
979A-AC 13 97 156 l7 ldy oldy
|
||
979D-AD 11 97 157 lda oldchr
|
||
97A0-91 08 158 sta (oldbas),y
|
||
97A2-8D 54 C0 159 sta page1 ; restore page2
|
||
97A5-28 160 plp
|
||
97A6-10 03 161 bpl l9
|
||
97A8-8D 55 C0 162 sta page2
|
||
97AB-AD 0F 97 163 l9 lda mouyls ; calculate ROW
|
||
97AE-4A 164 lsr
|
||
97AF-4A 165 lsr
|
||
97B0-4A 166 lsr
|
||
97B1-85 FE 167 sta row
|
||
97B3-4E 0E 97 168 lsr mouxhs ; calculate COL
|
||
97B6-6E 0D 97 169 ror mouxls
|
||
97B9-4E 0E 97 170 lsr mouxhs
|
||
97BC-6E 0D 97 171 ror mouxls
|
||
97BF-AD 0D 97 172 lda mouxls
|
||
97C2-85 FF 173 sta col
|
||
97C4-A9 01 174 lda #1
|
||
97C6-8D 07 97 175 sta parms
|
||
97C9-20 00 BF 176 jsr mli ; deallocate interrupt
|
||
97CC-41 177 .db dealloc_int
|
||
97CD-07 97 178 .dw parms
|
||
97CF-60 179 rts
|
||
97D0- 180
|
||
97D0-48 181 mouser pha
|
||
97D1-BD 12 C4 182 lda mtable,x
|
||
97D4-8D 0B 97 183 sta mouse
|
||
97D7-68 184 pla
|
||
97D8-08 185 php
|
||
97D9-78 186 sei
|
||
97DA-20 FD 97 187 jsr domsub
|
||
97DD-6E 0B 97 188 ror mouse
|
||
97E0-AD 7C 04 189 lda mouxl
|
||
97E3-8D 0D 97 190 sta mouxls
|
||
97E6-AD 7C 05 191 lda mouxh
|
||
97E9-8D 0E 97 192 sta mouxhs
|
||
97EC-AD FC 04 193 lda mouyl
|
||
97EF-8D 0F 97 194 sta mouyls
|
||
97F2-AD 7C 07 195 lda moustat
|
||
97F5-8D 10 97 196 sta moustats
|
||
97F8-28 197 plp
|
||
97F9-0E 0B 97 198 asl mouse
|
||
97FC-60 199 rts
|
||
97FD-A2 C4 200 domsub ldx #$C4
|
||
97FF-A0 40 201 ldy #$40
|
||
9801-6C 0B 97 202 jmp (mouse)
|
||
9804- 203
|
||
9804- 204 irqhndl ; interrupt handler
|
||
9804-D8 205 cld ;
|
||
9805-A2 01 206 ldx #servem ;
|
||
9807-20 D0 97 207 jsr mouser ; service mouse interrupt
|
||
980A-B0 19 208 bcs erirq ; if not mouse interrupt then exit
|
||
980C-AD 10 97 209 lda moustats ; get mouse status
|
||
980F-4A 210 lsr ; put movement bit
|
||
9810-4A 211 lsr ; in carry
|
||
9811-90 12 212 bcc erirq ; if no movement then exit
|
||
9813-2C 1C C0 213 bit page2sw ; store page2
|
||
9816-08 214 php
|
||
9817-20 27 98 215 jsr mvehndl ; handle movement
|
||
981A-8D 54 C0 216 sta page1 ; restore page2
|
||
981D-28 217 plp
|
||
981E-10 03 218 bpl exirq
|
||
9820-8D 55 C0 219 sta page2
|
||
9823-18 220 exirq clc
|
||
9824-89 221 .db $89 ; bit absorbs sec
|
||
9825-38 222 erirq sec
|
||
9826-60 223 rts
|
||
9827- 224
|
||
9827- 225 mvehndl ; movement handler
|
||
9827-8D 54 C0 226 sta page1 ; remove old cursor
|
||
982A-A9 80 227 lda #$80
|
||
982C-2C 12 97 228 bit oldp2s
|
||
982F-10 03 229 bpl l1
|
||
9831-8D 55 C0 230 sta page2
|
||
9834-AC 13 97 231 l1 ldy oldy
|
||
9837-AD 11 97 232 lda oldchr
|
||
983A-91 08 233 sta (oldbas),y
|
||
983C-AD 0F 97 234 lda mouyls ; calculate ROW
|
||
983F-4A 235 lsr
|
||
9840-4A 236 lsr
|
||
9841-4A 237 lsr
|
||
9842-85 FE 238 sta row
|
||
9844-4E 0E 97 239 lsr mouxhs ; calculate COL
|
||
9847-6E 0D 97 240 ror mouxls
|
||
984A-4E 0E 97 241 lsr mouxhs
|
||
984D-6E 0D 97 242 ror mouxls
|
||
9850-AD 0D 97 243 lda mouxls
|
||
9853-85 FF 244 sta col
|
||
9855-A5 FE 245 newcur lda row ; calculate base address
|
||
9857-20 82 98 246 jsr bascalc
|
||
985A-8D 54 C0 247 sta page1 ; choose main/aux memory
|
||
985D-A5 FF 248 lda col
|
||
985F-4A 249 lsr
|
||
9860-B0 03 250 bcs l3
|
||
9862-8D 55 C0 251 sta page2
|
||
9865-A8 252 l3 tay ; output cursor and save old values
|
||
9866-8C 13 97 253 sty oldy
|
||
9869-B1 FA 254 lda (bas),y
|
||
986B-8D 11 97 255 sta oldchr
|
||
986E-AD 06 97 256 lda cursor
|
||
9871-91 FA 257 sta (bas),y
|
||
9873-AD 1C C0 258 lda page2sw
|
||
9876-8D 12 97 259 sta oldp2s
|
||
9879-A5 FA 260 lda bas
|
||
987B-85 08 261 sta oldbas
|
||
987D-A5 FB 262 lda bas+1
|
||
987F-85 09 263 sta oldbas+1
|
||
9881-60 264 rts
|
||
9882- 265
|
||
9882-48 266 bascalc pha ; text screen base address calculator (ROM)
|
||
9883-4A 267 lsr
|
||
9884-29 03 268 and #3
|
||
9886-09 04 269 ora #4
|
||
9888-85 FB 270 sta bas+1
|
||
988A-68 271 pla
|
||
988B-29 18 272 and #$18
|
||
988D-90 02 273 bcc bcs1
|
||
988F-69 7F 274 adc #$7F
|
||
9891-85 FA 275 bcs1 sta bas
|
||
9893-0A 276 asl
|
||
9894-0A 277 asl
|
||
9895-05 FA 278 ora bas
|
||
9897-85 FA 279 sta bas
|
||
9899-60 280 rts
|