mrbuffer/src/main.S

248 lines
5.4 KiB
ArmAsm

rel
typ $B3
dsk main.l
SPEAKER equ $00C030
PRODOS16 equ $E100A8
; ensure 16-bit mode (unnecessary?)
clc
xce
rep #$30
phk
plb
; half bank for accumulator, you don't want to toggle them on then back off, right?
sep #$30
; toggle the softswitches; they don't take any values. some are only triggered
; by writes, $C054 can be triggered by a read
stal $00C000 ; disable 80 column store?
stal $00C00C ; disable 80 column hardware?!
stal $00C050 ; set standard apple ii gfx mode
stal $00C051 ; select text mode only. "only"?
ldal $00C054 ; select text page 1 (there are 2)
ldal $00C056 ; select "low res" graphics
rep #$30
sep #$20
; show the current char on screen
; read keyboard then hit strobe to reset
ldx #0
ldy #0
ldal $00C010
; core key event loop
:kloop clc
ldal $00C000
bit #%1 ; check strobe bit to make sure a key was pressed
bmi :kjump
jmp :kloop
:kjump jsr keydown
jsr drawpos
jmp :kloop
keydown cmp #$8B ; up
beq up
cmp #$8A ; down
beq down
cmp #$88 ; left
beq left
cmp #$95 ; right
beq right
cmp #$FF ; backspace
beq backspace
cmp #$8D ; return
beq return
jsr drawchar
jmp colinc
finkey ldal $00C010 ; clear strobe bit
lda #0
rts
up cpy #0
beq ping
dey
jmp finkey
down cpy #22
beq ping
iny
jmp finkey
left cpx #0
beq ping
dex
jmp finkey
right cpx #39
beq ping
jmp *+2
colinc cpx #39
beq :rolcol
inx
jmp finkey
:rolcol ldx #0
jmp down
return ldx #0
jmp down
backspace lda #$A0
cpx #0
beq :contbs
dex
:contbs jsr drawchar
jmp finkey
ping pha
ldal SPEAKER
pla
jmp finkey
drawpos pha
phx
; draw the parens and comma
lda #"("
stal $0007F1
lda #$AC
stal $0007F4
lda #")"
stal $0007F7
txa
jsr tencount
adc #$B0
stal $0007F3
txa
adc #$B0
stal $0007F2
tya
jsr tencount
adc #$B0
stal $0007F6
txa
adc #$B0
stal $0007F5
; restore x and original keydown char
plx
pla
rts
drawchar cpy #0
beq :row0
cpy #1
beq :row1
cpy #2
beq :row2
cpy #3
beq :row3
cpy #4
beq :row4
cpy #5
beq :row5
cpy #6
beq :row6
cpy #7
beq :row7
cpy #8
beq :row8
cpy #9
beq :row9
cpy #10
beq :row10
cpy #11
beq :row11
cpy #12
beq :row12
cpy #13
beq :row13
cpy #14
beq :row14
cpy #15
beq :row15
cpy #16
beq :row16
cpy #17
beq :row17
cpy #18
beq :row18
cpy #19
beq :row19
cpy #20
beq :row20
cpy #21
beq :row21
cpy #22
beq :row22
rts
:row0 stal $000400,X
rts
:row1 stal $000480,X
rts
:row2 stal $000500,X
rts
:row3 stal $000580,X
rts
:row4 stal $000600,X
rts
:row5 stal $000680,X
rts
:row6 stal $000700,X
rts
:row7 stal $000780,X
rts
:row8 stal $000428,X
rts
:row9 stal $0004A8,X
rts
:row10 stal $000528,X
rts
:row11 stal $0005A8,X
rts
:row12 stal $000628,X
rts
:row13 stal $0006A8,X
rts
:row14 stal $000728,X
rts
:row15 stal $0007A8,X
rts
:row16 stal $000450,X
rts
:row17 stal $0004D0,X
rts
:row18 stal $000550,X
rts
:row19 stal $0005D0,X
rts
:row20 stal $000650,X
rts
:row21 stal $0006D0,X
rts
:row22 stal $000750,X
rts
tencount ldx #0
:substart clc
cmp #10
bcc :subout
sbc #10
inx
jmp :substart
:subout rts
jsl PRODOS16