8bitlenser/lenser/bbc/viewer/bbc.s
2026-07-03 19:35:35 -07:00

97 lines
2.2 KiB
ArmAsm

; lenser -- BBC Micro viewer (6502), loaded at PAGE (&1900) and *RUN.
;
; Sets the screen MODE, programmes the logical->physical palette, then *LOADs the
; image file "IMG" straight into screen memory, and holds it per the display
; option. Parameters come from a fixed block the packager fills in (so the code
; is constant); see build_viewer() in assemble.py.
;
; #defines from the wrapper -- WAITMODE (0 forever, 1 key, 2 seconds), WAITSECS, RATE.
;
; assembled by bbc/viewer/assemble.py via xa
OSWRCH = $FFEE
OSRDCH = $FFE0
OSBYTE = $FFF4
OSCLI = $FFF7
* = $1900
start:
; ---- VDU 22, mode ----
lda #22
jsr OSWRCH
lda p_mode
jsr OSWRCH
; ---- palette via VDU 19, logical, physical, 0,0,0 for each logical ----
ldx #0
palloop:
cpx p_ncol
beq paldone
lda #19
jsr OSWRCH
txa
jsr OSWRCH ; logical colour = X
lda p_pal,x
jsr OSWRCH ; physical
lda #0
jsr OSWRCH
jsr OSWRCH
jsr OSWRCH
inx
bne palloop
paldone:
; ---- hide the text cursor (VDU 23,1,0;0;0;0;) ----
lda #23
jsr OSWRCH
lda #1
jsr OSWRCH
ldx #8
curz:
lda #0
jsr OSWRCH
dex
bne curz
; ---- *LOAD the image straight into screen memory ----
ldx #<cmd
ldy #>cmd
jsr OSCLI
; ---- hold the picture ----
#if WAITMODE == 0
hang:
jmp hang
#endif
#if WAITMODE == 1
jsr OSRDCH ; block until a key
rts ; back to BASIC
#endif
#if WAITMODE == 2
lda #<(WAITSECS*RATE)
sta cnt
lda #>(WAITSECS*RATE)
sta cnt+1
swait:
lda #19
jsr OSBYTE ; OSBYTE 19 = wait for vertical sync
lda cnt
bne sdec
dec cnt+1
sdec:
dec cnt
lda cnt
ora cnt+1
bne swait
rts ; back to BASIC
#endif
cnt: .byte 0,0
; OSCLI string -- the packager patches in the right screen-base hex
cmd: .byte "LOAD IMG ", "0000", 13
; parameter block -- the packager fills these in
p_mode: .byte 0
p_ncol: .byte 0
p_pal: .byte 0,0,0,0,0,0,0,0