c64 autoload viewer
This commit is contained in:
parent
a8e0beba6d
commit
796db2003d
13
misc/c64viewer/Makefile
Normal file
13
misc/c64viewer/Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
AS=ophis
|
||||||
|
ASFLAGS=-l $*.lst -m $*.map
|
||||||
|
|
||||||
|
all: picview.prg final.prg c64picview_inc.h
|
||||||
|
|
||||||
|
%.prg: %.asm
|
||||||
|
$(AS) $(ASFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
final.prg: picview.prg 30.bin 20.bin screen.bin 10.bin bitmap.bin 30.bin color.bin 42.bin 10.bin 00.bin
|
||||||
|
cat $+ > $@
|
||||||
|
|
||||||
|
c64picview_inc.h: picview.prg
|
||||||
|
xxd -i $< | sed 's/^unsigned char/static unsigned char/'| sed '$$ d' > $@
|
||||||
31
misc/c64viewer/README
Normal file
31
misc/c64viewer/README
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
XX format => text/bitmap color/multicolor / extended background mode
|
||||||
|
|
||||||
|
$D020, 15 octets :
|
||||||
|
BO BORDER
|
||||||
|
BA BACKGROUND
|
||||||
|
E1 Extra background color #1
|
||||||
|
E2 Extra background color #2
|
||||||
|
E3 Extra background color #3
|
||||||
|
SE1 sprite extra color #1
|
||||||
|
SE2 sprite extra color #2
|
||||||
|
S0 sprite #0
|
||||||
|
S1 sprite #1
|
||||||
|
S2 sprite #2
|
||||||
|
S3 sprite #3
|
||||||
|
S4 sprite #4
|
||||||
|
S5 sprite #5
|
||||||
|
S6 sprite #6
|
||||||
|
S7 sprite #7
|
||||||
|
|
||||||
|
TP
|
||||||
|
T = type
|
||||||
|
0 - end of file
|
||||||
|
1 - bitmap
|
||||||
|
2 - screen ram
|
||||||
|
3 - color ram
|
||||||
|
4 - border/background etc.
|
||||||
|
P = packing
|
||||||
|
0 - no packing
|
||||||
|
1 - RLE packing
|
||||||
|
2 - color ram RLE packing
|
||||||
|
|
||||||
235
misc/c64viewer/picview.asm
Normal file
235
misc/c64viewer/picview.asm
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
; vim:ts=8 sw=8:
|
||||||
|
.word $0801
|
||||||
|
.org $0801
|
||||||
|
.word next, 1911 ; next basic line and line number
|
||||||
|
.byte $9e,"2061",0 ; SYS2061
|
||||||
|
next: .word 0 ; end of basic program
|
||||||
|
|
||||||
|
; $fb $fc $fd $fe => unused
|
||||||
|
start:
|
||||||
|
lda #<data
|
||||||
|
sta $fb
|
||||||
|
lda #>data
|
||||||
|
sta $fc
|
||||||
|
|
||||||
|
; backup border/background/extra/sprite colors
|
||||||
|
ldx #$10
|
||||||
|
colorbak2:
|
||||||
|
lda $D01F,x
|
||||||
|
sta $C3EF,x
|
||||||
|
dex
|
||||||
|
bne colorbak2
|
||||||
|
; backup COLOR RAM in high RAM
|
||||||
|
colorbak:
|
||||||
|
lda $D800,x
|
||||||
|
sta $C400,x
|
||||||
|
lda $D900,x
|
||||||
|
sta $C500,x
|
||||||
|
lda $DA00,x
|
||||||
|
sta $C600,x
|
||||||
|
lda $DB00,x
|
||||||
|
sta $C700,x
|
||||||
|
inx
|
||||||
|
bne colorbak
|
||||||
|
|
||||||
|
;lda $01 ; processor port
|
||||||
|
;pha ; backup
|
||||||
|
;and #$F8
|
||||||
|
;ora #$06 ; xxxxx110 : RAM $A000-$BFFF, IO $D000-$DFFF, ROM $E000-$FFFF
|
||||||
|
;sta $01
|
||||||
|
|
||||||
|
jsr readbyte ; read mode byte
|
||||||
|
pha ; push it
|
||||||
|
mainloop:
|
||||||
|
jsr readbyte
|
||||||
|
pha
|
||||||
|
and #$0F
|
||||||
|
tax
|
||||||
|
lda algoslo,x
|
||||||
|
sta callalgo+1
|
||||||
|
;lda algoshi,x ; assume all algos are in the same page
|
||||||
|
;sta callalgo+2
|
||||||
|
pla
|
||||||
|
and #$F0
|
||||||
|
beq display ; 0 => end of file
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
tax
|
||||||
|
lda addr_sizes-4,x ; destination
|
||||||
|
sta $fd
|
||||||
|
lda addr_sizes-3,x
|
||||||
|
sta $fe
|
||||||
|
lda addr_sizes-2,x ; size
|
||||||
|
sta $02
|
||||||
|
lda addr_sizes-1,x
|
||||||
|
tax
|
||||||
|
callalgo:
|
||||||
|
jsr longmemcpy ; modified
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
display:
|
||||||
|
pla
|
||||||
|
; mode byte 0EBM0000 E=Extended Background mode. B=Bitmap Mode. M=Multicolor
|
||||||
|
; $30 => Multicolor Bitmap
|
||||||
|
tax
|
||||||
|
ora #$1B
|
||||||
|
sta $d011 ; screen control register #1
|
||||||
|
txa
|
||||||
|
and #$10
|
||||||
|
ora #$C8 ; multicolor, 40 columns
|
||||||
|
sta $d016 ; screen control register #2
|
||||||
|
|
||||||
|
lda $dd00
|
||||||
|
pha ; backup
|
||||||
|
and #$fc ; 0 => bank #3 $C000-$FFFF
|
||||||
|
;ora #$01 ; 1 => bank #2 $8000-$BFFF char ROM at $9000-$9FFF
|
||||||
|
;ora #$02 ; 2 => bank #1 $4000-$7FFF
|
||||||
|
;ora #$03 ; 3 => bank #0 $0000-$3FFF char ROM at $1000-$1FFF
|
||||||
|
sta $dd00 ; set VIC BANK
|
||||||
|
lda $d018
|
||||||
|
pha ; backup
|
||||||
|
lda #$08 ; bitmap +$2000 / screen +$0000
|
||||||
|
sta $d018 ; bitmap: $E000 / screen: $C000
|
||||||
|
|
||||||
|
wait:
|
||||||
|
jsr $ffe4 ; GETIN
|
||||||
|
beq wait
|
||||||
|
|
||||||
|
lda #$1B
|
||||||
|
sta $d011
|
||||||
|
lda #$C8
|
||||||
|
sta $d016
|
||||||
|
pla
|
||||||
|
sta $d018
|
||||||
|
pla
|
||||||
|
sta $dd00 ; restore VIC BANK
|
||||||
|
;pla
|
||||||
|
;sta $01 ; restore Processor port
|
||||||
|
; Restore border/background/extra/sprite colors
|
||||||
|
ldx #$10
|
||||||
|
colorrestore2:
|
||||||
|
lda $C3EF,x
|
||||||
|
sta $D01F,x
|
||||||
|
dex
|
||||||
|
bne colorrestore2
|
||||||
|
; restore COLOR RAM
|
||||||
|
colorrestore:
|
||||||
|
lda $C400,x
|
||||||
|
sta $D800,x
|
||||||
|
lda $C500,x
|
||||||
|
sta $D900,x
|
||||||
|
lda $C600,x
|
||||||
|
sta $DA00,x
|
||||||
|
lda $C700,x
|
||||||
|
sta $DB00,x
|
||||||
|
inx
|
||||||
|
bne colorrestore
|
||||||
|
|
||||||
|
rts ; return to basic
|
||||||
|
; ====================================================================
|
||||||
|
|
||||||
|
; special color RAM compression (only low nibble matters)
|
||||||
|
; high nibble is count
|
||||||
|
colordepack:
|
||||||
|
dex
|
||||||
|
colordepacklp:
|
||||||
|
jsr readbyte
|
||||||
|
colordepacklp2:
|
||||||
|
jsr storebyte
|
||||||
|
dec $02
|
||||||
|
bne +
|
||||||
|
dex
|
||||||
|
bpl +
|
||||||
|
rts
|
||||||
|
* cld
|
||||||
|
adc #$10
|
||||||
|
bcs colordepacklp
|
||||||
|
bcc colordepacklp2
|
||||||
|
|
||||||
|
; depack packbits RLE stream
|
||||||
|
rledepack:
|
||||||
|
jsr readbyte
|
||||||
|
tax
|
||||||
|
bmi repeat
|
||||||
|
; temp_byte <= 127 => copy (temp_byte + 1) bytes
|
||||||
|
copy: inx
|
||||||
|
jsr shrtlp
|
||||||
|
beq rledepack
|
||||||
|
|
||||||
|
repeat: ; temp_byte > 127 => repeat (257-temp_byte) the next byte
|
||||||
|
dex
|
||||||
|
;bmi + ; 128 => out
|
||||||
|
;rts
|
||||||
|
bpl return
|
||||||
|
* jsr readbyte2
|
||||||
|
repeatlp:
|
||||||
|
jsr storebyte
|
||||||
|
inx
|
||||||
|
bne repeatlp
|
||||||
|
beq rledepack
|
||||||
|
|
||||||
|
|
||||||
|
; src=$fb/$fc dst=$fd/$fe
|
||||||
|
; count= x(high) $02(low)
|
||||||
|
longmemcpy:
|
||||||
|
* lda ($fb),y ; copy 256 bytes
|
||||||
|
sta ($fd),y
|
||||||
|
iny
|
||||||
|
bne -
|
||||||
|
inc $fc
|
||||||
|
inc $fe
|
||||||
|
dex
|
||||||
|
bne -
|
||||||
|
|
||||||
|
ldx $02
|
||||||
|
beq return
|
||||||
|
shrtlp: lda ($fb),y
|
||||||
|
sta ($fd),y
|
||||||
|
inc $fb
|
||||||
|
bne +
|
||||||
|
inc $fc
|
||||||
|
* inc $fd
|
||||||
|
bne +
|
||||||
|
inc $fe
|
||||||
|
* dex
|
||||||
|
bne shrtlp
|
||||||
|
return:
|
||||||
|
rts
|
||||||
|
|
||||||
|
; src=$fb/$fc advance pointer
|
||||||
|
; set y=0
|
||||||
|
readbyte:
|
||||||
|
ldy #0
|
||||||
|
readbyte2:
|
||||||
|
lda ($fb),y
|
||||||
|
inc $fb
|
||||||
|
bne +
|
||||||
|
inc $fc
|
||||||
|
* rts
|
||||||
|
|
||||||
|
; dst=$fd/$fe advance pointer
|
||||||
|
; assumes y=0
|
||||||
|
storebyte:
|
||||||
|
sta ($fd),y
|
||||||
|
inc $fd
|
||||||
|
bne +
|
||||||
|
inc $fe
|
||||||
|
* rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; 0, bitmap, screen, color, color regs, xxx, xxx, xxx
|
||||||
|
addr_sizes:
|
||||||
|
.word $E000, 8000 ; 1 : bitmap behind KERNAL ROM
|
||||||
|
.word $C000, 1000 ; 2 : screen ram in upper RAM area
|
||||||
|
.word $D800, 1000 ; 3 : color ram
|
||||||
|
.word $D020, 15 ; 4 : border/background/extra/sprite colors
|
||||||
|
algoslo:
|
||||||
|
.byte <longmemcpy
|
||||||
|
.byte <rledepack
|
||||||
|
.byte <colordepack
|
||||||
|
;algoshi:
|
||||||
|
; .byte >longmemcpy
|
||||||
|
; .byte >rledepack
|
||||||
|
; .byte >colordepack
|
||||||
|
data:
|
||||||
29
misc/c64viewer/test.asm
Normal file
29
misc/c64viewer/test.asm
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
; vim:ts=8 sw=8:
|
||||||
|
.word $0801
|
||||||
|
.org $0801
|
||||||
|
.word next, 1911 ; next basic line and line number
|
||||||
|
.byte $9e,"2061",0 ; SYS2061
|
||||||
|
next: .word 0 ; end of basic program
|
||||||
|
start:
|
||||||
|
jsr $e544
|
||||||
|
lda #$00
|
||||||
|
sta $d020 ; border
|
||||||
|
sta $d021 ; background
|
||||||
|
ldx #$00
|
||||||
|
loop:
|
||||||
|
lda text,x
|
||||||
|
sec
|
||||||
|
sbc #$40
|
||||||
|
sta $0400+40*12,x
|
||||||
|
inx
|
||||||
|
cpx #40
|
||||||
|
bne loop
|
||||||
|
wait:
|
||||||
|
;jmp wait
|
||||||
|
;jsr $ffcf
|
||||||
|
jsr $ffe4 ; GETIN
|
||||||
|
beq wait
|
||||||
|
rts
|
||||||
|
|
||||||
|
text:
|
||||||
|
.byte " HELLO WORLD "
|
||||||
Loading…
x
Reference in New Issue
Block a user