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