mirror of
https://codeberg.org/cryu/ProDOS_Snippits
synced 2025-01-25 11:30:06 +00:00
482 lines
10 KiB
ArmAsm
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
|