6502code/mouse.txt
2019-06-13 22:26:24 -07:00

277 lines
14 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 handlers entry address in the
0000- 20 ; interrupt vector table in the ProDOS System
0000- 21 ; Global Page; and then enables the mouses
0000- 22 ; movement interrupts. mouseoff will deallocate
0000- 23 ; the interrupt and disable the mouse. Irqhndl
0000- 24 ; is the interrupt request handler. Its
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