[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
I'm an idiot - this code is prolly broken in 6502 different ways
- Subject: I'm an idiot - this code is prolly broken in 6502 different ways
- From: Steve Nickolas <usotsuki@buric.co>
- Date: Mon, 10 Dec 2012 06:47:31 -0500
- Cancel-lock: sha1:pW/M8nWE4rbQPvXwNRhCAcS7i+8=
- Injection-info: mx04.eternal-september.org; posting-host="b1331f5cb4326106a7720f5a86b16b36"; logging-data="885"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+6mx6kZm9pyZBhDXOugsxCOcuSz4KJzh8="
- Newsgroups: comp.sys.apple2
- Organization: A noiseless patient Spider
- User-agent: Alpine 2.02 (DEB 1266 2009-07-14)
Trying to figure out how to use the mouse driver, I wrote this code, but I
screwed up, prolly in several places.
I attempted to map the firmware to & commands - something with which I am
not exactly familiar - and could have probably screwed up there as well.
I had in mind to implement USR() to get the X and Y values and couldn't
figure that out either.
-uso.
intwrd = $06
postab = $FA
chrget = $B1
.org $9000
entry: jmp entry2
amp: bne proc
rts
getwrd: jsr $DD67 ; create integer word at $50
jsr $E752
lda $51
cmp #$04
bcs funerr
rts
proc: cmp #$87 ; &READ
beq b_read
cmp #$97 ; &HOME
beq v_home
cmp #$AA ; &LET mode
beq b_set
cmp #$AB ; &GOTO
beq b_pos
cmp #$AC ; &RUN
beq b_serve
cmp #$B3 ; &STOP {X | Y}=start,end
beq v_clamp
cmp #$B8 ; &DEF
beq v_init
cmp #$BD ; &CLEAR
beq b_clear
synerr: jmp $DEC9 ; ?SYNTAX ERROR
funerr: jmp $E199 ; ?ILLEGAL QUANTITY ERROR
v_home: jmp b_home
v_clamp: beq b_clamp
v_init: jmp b_init
b_set: jsr chrget
jsr $DD67
jsr $E752
lda $50
and #$F0
bne funerr
lda $51
bne funerr
lda $50
and #$0F
pha
jsr setmos
pla
jsr dojmp
bcs funerr
rts
b_serve: jsr srvmos
jsr dojmp
bcc @1
lda #$FF
.byte $2C
@1: lda #$00
sta intwrd+2
rts
b_read: jsr rdmos
jmp b_cmn
b_clear: jsr clrmos
b_cmn: jsr dojmp
jmp getvars
b_pos: jsr chrget
jsr getwrd
sta postab+1
lda $50
sta postab
jsr chrget
cmp #','
bne synerr
jsr chrget
jsr getwrd
sta postab+3
lda $50
sta postab+2
jsr putvars
jsr posmos
jmp dojmp
synerr2: jmp synerr
b_clamp: jsr chrget
cmp #'X'
beq @1
cmp #'Y'
bne synerr2
lda #$01
.byte $2C
@1: lda #$00
sta postab
jsr chrget
cmp #$D0 ; = token
bne synerr2
jsr chrget
jsr getwrd
sta $04F8
lda $50
sta $0478
jsr chrget
cmp #','
bne synerr2
jsr chrget
jsr getwrd
sta $05F8
lda $50
sta $0578
jsr clmpmos
jmp dojmp
b_home: jsr chrget
bne synerr2
jsr homemos
jsr dojmp
jmp getvars
b_init: jsr chrget
bne synerr2
jsr mosinit
jsr dojmp
jmp getvars
entry2: lda #<$C700
sta intwrd
lda #>$C700
sta intwrd+1
@1: ldy #$05
lda ($06), y
cmp #$38
bne @2
ldy #$07
lda ($06), y
cmp #$18
bne @2
ldy #$0B
lda ($06), y
cmp #$01
bne @2
iny
lda ($06), y
cmp #$20
bne @2
ldy #$FB
lda ($06), y
cmp #$D6
beq entry3
@2: dec intwrd+1
lda intwrd+1
cmp #$C1
bcs @1
ldy #$00
jsr prtmsg
jmp $03D0
errmos: .byte 13, 7, "NO MOUSE FOUND", 13, 0
mosok: .byte 13, "&MOUSE V0.0", 13, 0
entry3: lda #$4C
sta $03F5
lda #<amp
sta $03F6
lda #>amp
sta $03F7
ldy #mosok-errmos
prtmsg: lda errmos, y
beq @1
eor #$80
jsr $FDED
iny
bne prtmsg
@1: rts
dojmp: .byte $4C
.word $FF59
setmos: lda #$12
.byte $2C
srvmos: lda #$13
.byte $2C
rdmos: lda #$14
.byte $2C
clrmos: lda #$15
.byte $2C
posmos: lda #$16
.byte $2C
clmpmos: lda #$17
.byte $2C
homemos: lda #$18
.byte $2C
mosinit: lda #$19
.byte $2C
moscmn: sta intwrd
ldy #$00
lda (intwrd), y
sta dojmp+1
lda intwrd+1
sta dojmp+2
rts
getvars: lda intwrd+1
and #$07
tay
lda $0478, y
sta postab
lda $0578, y
sta postab+1
lda $04F8, y
sta postab+2
lda $05F8, y
sta postab+3
lda $0778, y
sta postab+4
lda $07F8, y
sta postab+5
rts
putvars: lda intwrd+1
and #$07
tay
lda postab
sta $0478, y
lda postab+1
sta $0578, y
lda postab+2
sta $04F8, y
lda postab+3
sta $05F8, y
lda postab+4
sta $0778, y
lda postab+5
sta $07F8, y
rts