ProDOS_Snippits/bitsy.bye.s

482 lines
10 KiB
ArmAsm

; da65 V2.18 - Git ece63f0
; Created: 2023-10-03 10:18:14
; Input file: bitsy.bye
; Page: 1
OPEN_BUFFER := $0280
L2000 := $2000
L1400 := $1400
PRODOS_MLI := $BF00
DEVNUM := $BF30
BITMAP := $BF58
DRVSM2 := $C082
INIT := $FB2F
BASCALC := $FBC1
BELL1 := $FBDD
VTAB := $FC22
HOME := $FC58
RDKEY := $FD0C
SETKBD := $FE89
SETVID := $FE93
CLR80VID := $C00C
CLR80COL := $C000
NEWVIDEO := $C029
.macpack apple2
.setcpu "6502"
.org $1000
cld
lda DRVSM2 ; turn all drive phases off
cli
sta CLR80VID
sta CLR80COL
jsr SETVID
jsr SETKBD
sta $04FB
jsr INIT
jsr HOME
ldx #$DF
lda #$CF
L101E: sta BITMAP-$df,x ; $BF58, aka BITMAP
lda L135F -$df,x ; $134F
sta $7A,x ; $0159
lda #$00
txs
inx
bne L101E
.setcpu "65816" ; this is a NOP on 65x02
rep #$02 ; reset processor status bits
.setcpu "6502"
beq L1034 ; branch-always on 6502
inx ; only //gs
stx NEWVIDEO ; only //gs
L1034: inc BITMAP+$17 ; bitmap of low 48k of memory
ldx #(L1356-L12FE-1) ; $57
L1039: lda L12FE+1,x ; $1356
bmi L1045
jsr BASCALC ; row in a -> screen address in ($28)
ldy L1300,x
.byte $2C ; mask next ...
L1045: sta ($28),y ; store directly to $(SCREEN) from BASCALC
dey
dex
bne L1039
L104B: sta $0480,y
sta ($28),y
dey
bpl L104B
; done drawing screen
lda DEVNUM ; get current active slot (DSSS/0000)
lsr a ; for 7, that's 0111/0000
lsr a
lsr a ; now 0000/1110
tax
inx
cmp #$10 ; legit slot?
bcc L1060
L105F: dex
L1060: jsr OPEN_PREFIX
beq L105F
L1065: lda #>L1400
sta $7A+1
sta $58+1
ldy #<L1400
sty $7A
sty $58
jsr OPEN_FILE
cpy #$4C
beq L107B
jsr BELL1
L107B: lda #$00
tay
sta ($7A),y
tax
L1081: stx $5E
L1083: ldx #$22
ldy $57
cpy #$22
bcs L108D
ldy #$22
L108D: dey
lda #$A0
cpy $57
bcs L1098
lda ($70),y
ora #$80
L1098: sta $0405,x
sta $0381,y
dex
L109F: bne L108D
ldx #$02
stx $25
L10A5: lda $57,x
sta $59,x
dex
bne L10A5
L10AC: jsr VTAB
inc $25
ldy #$14
lda #$A1
sta ($28),y
lda $61,x
L10B9: sta $0380,x
lda #$FF
cpx $5E
bne L10CC
lda $5A
sta $5C
lda $5B
sta $5D
lda #$3F
L10CC: sta $5F
ldy #$00
lda ($5A),y
bmi L10EF
bne L10DD
ldy #$10
sta ($5A),y
tay
beq L10E4
L10DD: lsr a
lsr a
lsr a
lsr a
and #$07
tay
L10E4: lda L1375,y
ldy #$00
sta ($28),y
inc $28
bne L10FD
L10EF: lda #$A0
sta ($28),y
inc $28
inc $28
lda #$AF
and $5F
sta ($28),y
L10FD: lda ($5A),y
and #$0F
sta $60
L1103: lda #$A0
cpy $60
iny
bcs L1110
lda ($5A),y
ora #$80
and $5F
L1110: sta ($28),y
cpy #$11
bne L1103
lda #$0F
adc $5A
sta $5A
bcc L1120
inc $5B
L1120: inx
cpx #$14
bcc L10AC
stx $29
jsr RDKEY ; get keypress
cmp #$8D ; CR?
bne L11A8
; try to load and execute the selected file
jsr PRODOS_MLI ; SET_PREFIX
.byte $c6
.word L12FD
bcs L1191
tay
lda ($5C),y
beq L11A2
sty $7A
ldx #$20
L113F: stx $7B
cmp #$60
and #$0F
bcs L1174
sta ($5C),y
inc $74
dey
jsr OPEN_FILE
dey
bmi L1164
ldx L10B9+1
lda #$C3
sta $0305,x
ldy #$FF
L115C: jsr OPEN_FILE
dec $74
dey
bpl L11A2
L1164: ldy #$0F
L1166: lda ($5C),y
sta $2006,y
dey
bpl L1166
EXEC_FILE: jsr HOME
jmp L2000
L1174: tay
adc $57
sta $57
tax
L117A: lda ($5C),y
sta OPEN_BUFFER,x
dex
dey
bpl L117A
asl a
lda #$AF
sta $0281,x
bcs L11A5
jsr OPEN_FILE
tya
beq EXEC_FILE
L1191: jsr BELL1
BROWSER_BACK: ldy $57
L1196: lda ($73),y
dey
beq L11A2
tax
bpl L1196
sty $57
bmi L11A5
L11A2: jsr BELL1
L11A5: jmp L1065
L11A8: ldx $5E
cmp #$95 ; right-arrow?
bne L11E5
L11AE: inx
ldy #$10
lda ($5C),y
beq L11D1
cpx #$0A
bcc L120E
inc $59
ldy #$40
lda ($58),y
dec $59
tay
beq L120E
lda $58
ldy $59
adc #$0F
bcc L11CD
iny
L11CD: sta $58
sty $59
L11D1: jmp L1083
L11D4: eor #$F8
rol a
tax
eor $56
lsr a
bne L11E0
bcs L11E0
dex
L11E0: jsr OPEN_PREFIX
bpl L11A5
L11E5: cmp #$9B ; ESC?
beq BROWSER_BACK
cmp #$C1 ; A?
bcs L1221 ; branch if less than or equal to ...
adc #$48 ; carry clear, so assume this is minimum $FA
cmp #$F9
bcs L11D4 ; if we are <= $F9, go to L11D4
sbc #$CF ; now minimum $2c - "+"
beq L1201
tay
dey
beq L121C
dey
beq L11AE
dey
bne L11D1
L1201: ldy $59
lda $58
bne L1211
cpy #$14
bne L1211
L120B: dex
L120C: bmi L11D1
L120E: jmp L1081
L1211: cpx #$0A
bcs L120B
sbc #$0F
bcs L11CD
dey
bcc L11CD
L121C: ldx $56
jmp L105F
L1221: and #$5F
sta $60
ldx #$00
ldy $5C
stx $5C
inx
L122C: tya
clc
adc #$10
tay
bcc L1235
inc $5D
L1235: lda ($5C),y
beq L124A
iny
lda ($5C),y
dey
cmp $60
bne L122C
sty $58
lda $5D
sta $59
jmp L107B
L124A: dex
bmi L120C
tay
lda #$14
sta $5D
bne L1235
OPEN_PREFIX: txa
and #$0F
sta $56
lsr a
beq L127C
php
ora #$b0
sta $0401
asl a
asl a
asl a
asl a
plp
ldy #$B1
bcs L126E
ora #$80
iny
L126E: sta $6F
L1270: sty $0404
jsr PRODOS_MLI ; online
.byte $c5
.word $006e
lda $0281
L127C: ldy #$AF
sty $0281
and #$0F
tay
clc
adc #$0E
sta $0380
adc #$74
sta L10B9+1
iny
sty $57
dey
rts
OPEN_FILE: lda $57
sta OPEN_BUFFER
jsr PRODOS_MLI ; open
.byte $c8
.word $0072
bcs BB_EXIT
lda $77
sta $79
sty $7D
lda #$2B
ldx #$0D
.byte $2C ; mask next
L12AC: lda #$27
dex
bne L12B5
lda #$2C
ldx #$0D
L12B5: sta $7C
jsr PRODOS_MLI ; read bytes from open file
.byte $ca
.word $0078
iny
beq BB_EXIT
lsr $7E
beq BB_EXIT
tay
lda ($7A),y
and #$8F
sta ($7A),y
asl a
beq L12AC
ldy #$10
lda ($7A),y
ldy #$07
L12D4: dey
beq L12DC
cmp L136E,y
bne L12D4
L12DC: tya
asl a
asl a
asl a
asl a
ldy #$00
ora ($7A),y
sta ($7A),y
lda $7A
adc #$10
sta $7A
bcc L12AC
inc $7B
bne L12AC
BB_EXIT: tay
jsr PRODOS_MLI ; close all open files
.byte $cc
.word CLOSE_ALL
rts
; ProDOS MLI call parameters here
CLOSE_ALL: .byte 1, 0 ; one parameter, no reference, so close all
L12FD: .byte 1
L12FE: .word OPEN_BUFFER
L1300: .byte $ad, $16, $29
scrcode "BITSY BYE"
.byte $05, $24
scrcode "BY"
.byte $0a, $20
scrcode "J.BROOKS"
.byte $0f, $23
scrcode "P.FERRIE"
.byte $12, $23
scrcode "RETURN:SELECT"
.byte $17, $0d
scrcode "ESC:BACK"
.byte $17
L134F: .byte $18 ; $18 is L134F
scrcode "TAB,#:NEW VOL"
.byte $17, $28
L135F: scrcode "S6,D1:"
.byte $00
L1356: .byte $06
L135q: scrcode "/BASIS.SYSTEM"
.byte $02, $00, $81, $02, $03, $80, $02, $00, $0b, $00
L136E: .byte $04, $FA, $06, $fc, $04
.byte $B3
.byte $FF
L1375: .byte $a0, $c9, $c2, $c1, $d4, $ad, $ad