a2fc.system/src/a2fc.system.a
2018-01-08 12:09:43 -08:00

120 lines
3.3 KiB
Plaintext

!cpu 6502
!to "../build/A2FC.SYSTEM#FF2000",plain
*=$2000
;
; A2FC.SYSTEM
; (c) 2018 by 4am
; a very small DHGR graphics viewer
; takes pathname of .a2fc file (in $2006),
; loads it,
; displays it,
; waits for key,
; quits via MLI
;
;
; MLI commands
;
kMLIOpen = $C8
kMLIRead = $CA
kMLIClose = $CC
kMLIQuit = $65
;
; MLI parameter counts
;
kMLIOpenCount = $03
kMLIReadOrQuitCount = $04
kMLICloseCount = $01
;
; other stuff
;
aFileBuffer = $9200
MLI = $BF00
MACHID = $BF98
jmp Start ; magic jump
!byte $EE,$EE ; magic bytes
!byte $40 ; length of inputfile buffer
inputfilebuffer
!fill $40
Start
ldx #(CodeEnd-CodeStart)-1; copy code to lower memory so we can load graphic at $2000
- lda CodeStart,x
sta $00f7,x
dex
bpl -
txs
;CheckFor128K
lda MACHID
and #$30
cmp #$30 ; 128K?
beq + ; yes, continue
stx inputfilebuffer ; no, trash inputfilebuffer so open fails and we quit immediately
+ jmp MLI ; exit via MLI (stack is arranged to execute Open MLI call)
CodeStart
!pseudopc $f7 {
softswitches
!byte $50,$52,$54,$57,$0d,$5e
mliParamForClose
!byte kMLICloseCount
!byte 0 ; close all files, also low part of pointer
!byte $20 ; used by main->aux copy loop
!word Open-1 ; on stack for first MLI call
Open
!byte kMLIOpen ; stack-based params for Open MLI call
!word mliParamForOpen
ldx #kMLIReadOrQuitCount ; they just happen to be the same number
stx mliparam
jsr Read ; read first half of graphic (belongs in auxmem)
; does not return if error
;DHGRCopy
sta $C00A
sta $C000
sta $C005 ; read from mainmem, write to auxmem
- lda ($fe-kMLIReadOrQuitCount,x)
sta ($fe-kMLIReadOrQuitCount,x)
inc $fe
bne -
inc $ff
bit $ff ; copy until $4000
bvc -
sta $C004 ; read/write from mainmem
jsr Read ; read second half of graphic (stays in main memory)
; does not return if error
;DHGRShow
inx
- ldy softswitches,x
sta $c000,y ; enable graphics display
dex
bpl -
;WaitForKey
- lda $C000
bpl -
Close
jsr MLI ; close all files
!byte kMLIClose
!word mliParamForClose
Quit
lsr mlicmd ; MLI_QUIT ($65) is half of MLI_READ ($CA) so that's great
Read
jsr MLI
mlicmd !byte kMLIRead
!word mliparam
bcs Close ; error during open or read? close & quit
rts
mliParamForOpen
!byte kMLIOpenCount
!word inputfilebuffer
!byte <aFileBuffer
mliparam
!byte >aFileBuffer
!byte $00 ; ProDOS file refnum (filled by MLI_OPEN call)
!word $2000 ; data address
!word $2000 ; data length
}
CodeEnd