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