[stella] Color Tweaker, v1.0

Subject: [stella] Color Tweaker, v1.0
From: "B. Watson" <atari@xxxxxxxxxxxxxx>
Date: Tue, 11 Sep 2001 02:10:55 -0400 (EDT)
This is the final version of the color tweaker. The other version I posted
here wouldn't work on a real VCS, so this is the bug-fixed version that does
work (now that I have an EPROM cart).

This does exactly what I want it to, except one thing: the fire button still
acts wonky on the Atari. What's the normal way to debounce the fire button? I
had been trying to use latched input mode, but I found this was worse, not
better (apparently, when I clear the latch, then set latch mode, it latches the
bounce!). This version just checks the raw input line every 16 frames, no
latching going on at all.

Still, unless anybody has any ideas for features that would be amazingly cool,
I don't think I'll be changing this any more. I've already spent too much time
on what was meant to be a quick & dirty development tool, and my poor game is
calling me, saying `Why haven't you finished me yet?'

Brian

---

If a trainstation is the place where trains stop, what is a workstation?

---cut-here---

; colortwk.asm

; v1.0

; color tweaker - use to test various color combos

; fire button to move cursor, up & down to change chroma,
; left & right to change luma. game reset to reset.

; by B. Watson <atari@xxxxxxxxxxxxxx>

; Tested on a real Atari 2600, finally!
; Tested on z26 v1.46 on a windows machine
; Tested on xstella 1.1 on a linux machine

; build with: dasm colortwk.asm -ocolortwk.bin -f3 -v3
;   (you need vcs.h in the current dir)

; if you get `undefined symbol' errors when assembling, your vcs.h
; is incomplete. Mine was missing SWACNT and SWBCNT for some reason.

 processor 6502
 include "vcs.h"

 seg.u vars
 org $80
framectr ds 1 ; increments once per frame, used for coloring title screen
              ; and generally keeping track of time
titleflag ds 1 ; 0 if we're showing the title, 1 otherwise

; color registers. These keep track of current color displayed, for each
; section of screen. due to the way check_stick works, bg0-4 must be located
; immediately after color0-4 (don't put any variables in between)
color0 ds 1
color1 ds 1
color2 ds 1
color3 ds 1
num_colors = [*-color0]-1
bg0 ds 1
bg1 ds 1
bg2 ds 1
bg3 ds 1
current_color ds 1 ; which of the 4 color regs the player is modifying
color_or_bg ds 1 ; (0=color, 1=bg) whether the color reg being modified is color or bg (color+4)
hexpointer ds 4 ; vectors for digit font data
ctemp ds 1 ; temp used in font calculations (could be used by other routines)
p0shape ds 6 ; final result of font calculations, 2 hex digits in one player
p1shape ds 6 ; same, for the other 2 digits
ptrcolor ds 1 ; the pointer color gets incremented once every 4 frames

 echo *-$80,"bytes of zero page RAM used"
 
 if *>$ff
 echo "***ERROR: You're all out of zero page RAM!"
	; error: we're all out of powdered toast
 endif

 seg code
 org $F000

; generic 2600 init routine
 sei
 cld
 ldx #$ff ; setup stack
 txs
 lda #0
iloop ; clear out TIA regs
 sta 0,x
 bne iloop

; tell joy & console switches to be inputs
 sta SWACNT
 sta SWBCNT

 jsr game_reset
 jmp main_loop ; skip over game_reset code. I suppose I should move it to the
               ; end of the ROM, but what the hell, I like spaghetti anyway :)

; now, set everything up to display the title screen
; (this routine also gets called whenever player hits `game reset')
game_reset
 lda #0
 sta titleflag ; 0 means `show the title', we check this in main_loop to decide which kernel to run
 sta color_or_bg
 ldy #num_colors*2+1 ; more fencepost error...
init_colors ; set default colors from ROM
 lda default_colors,y
 sta color0,y
 dey
 bpl init_colors

 lda #>hexfont
 sta hexpointer+1 ; set up hi bytes of pointers
 sta hexpointer+3

 lda #num_colors ; player starts in upper left, color 0 is at bottom of screen, so..
 sta current_color

 lda #5
 sta NUSIZ0 ; doublewide p0
 ; (we will modify NUSIZ1 inside main_kernel, since the pointer is single
 ; width, but the 2nd set of digits is double width, and they're both player 1)

 lda #12 ; p0 is always white
 sta COLUP0
 ; (we modify COLUP1 inside main_kernel, see above)
 rts

main_loop ; start of TV frame
 lda #2
 sta VSYNC ; start blanking
 sta WSYNC
 sta WSYNC
 lda #44
 sta TIM64T ; go ahead & set timer
 lda #0
 sta WSYNC
 sta VSYNC ; 3 WSYNC's, then turn off VSYNC

game_calc
 inc framectr
 sta COLUBK ; initially, blank the background (a still 0 from above)
 lda ptrcolor
 sta COLUP1

check_switches
 lda SWCHB ; did player hit game reset?
 and #1
 bne check_stick ; no, so check the joystick
 jsr game_reset ; yes, so reset the game
 
check_stick
 ; we really only want to check the stick every so many frames...
 lda framectr
 and #$03
 bne skip_stick ; skip over input routine unless current frame is multiple of 4
 ldx current_color
 lda color_or_bg ; decide which color reg to modify: color0 + color_or_bg*4
 beq skipbg
 inx
 inx
 inx
 inx

; at this point, X holds the register we need to modify. Let's see what we should
; do with it. No, this isn't the most efficient joystick-checking code ever :)
skipbg
 lda SWCHA
 asl ; did player move right?
 bcs skr ; if not, skip the increments
 inc color0,x ; if so increment twice (since the low bit of the COLU* regs is ignored anyway)
 inc color0,x
skr
 asl
 bcs skl
 dec color0,x
 dec color0,x
skl
 asl
 bcs skd
 tay
 lda color0,x
 sbc #15 ; carry is always clear, this actually subtracts 16
 sta color0,x
 tya
skd
 asl
 bcs sku
 lda color0,x
 adc #16
 sta color0,x
sku
 
check_fire
 lda framectr
 and #$0F ; only check fire button every 16 frames (FIXME: need debounce?)
 bne skip_stick
 inc ptrcolor ; while we're at it, change pointer color, whether fire pressed or not.
 inc ptrcolor
 lda INPT4
 and #$80 ; did player press fire button?
 bne skip_stick ; if not, skip the rest of this routine, otherwise...
 lda titleflag
 bne not_in_title
 inc titleflag ; the first time the player hits fire, just set titleflag to 1...
 bne skip_stick ; ...but don't move the pointer (since it isn't visible yet anyway)
not_in_title
 lda color_or_bg
 eor #$FF
 sta color_or_bg ; toggle color_or_bg
 bne skip_stick ; and if we did set it to zero, that's all we do (effect is move pointer to the right)
 ldx current_color ; otherwise we need to move the pointer down
 dex
 bpl skip_zero
 ldx #num_colors
skip_zero
 stx current_color

skip_stick

;; position player 1 (the pointer)
 sta WSYNC
 lda color_or_bg
 beq reset_p1 ; if color_or_bg == 0, pointer is on the left, so skip positioning
; I was hoping to get by without using HMOVE, but it looks like crap without it.
 lda #$E0
 sta HMP1
 sta WSYNC
 repeat 16
 nop
 repend
reset_p1
 sta RESP1
 sta WSYNC
 sta HMOVE
 repeat 13 ; TIA docs say wait at least 24 cycles after HMOVE before modifying HMP* (or HMCLR)
 nop       ; so we actually wait 26.
 repend
 sta HMCLR

; done with vblank calculations. Wait for the TV to get to first scan line.
wait_timer
 lda INTIM
 bne wait_timer ; busy-wait for timer to expire
 ;lda #0 ; not needed
 sta WSYNC
 sta VBLANK ; let there be graphics!

; decide which kernel to run, based on game mode
; unfortunately this wastes a good chunk of the first scanline...
; ...but we're not displaying anything there anyway.
 lda titleflag
 beq title_kernel
 jmp main_kernel ; Main Kernel Turn On!

title_kernel
 ldy #191-title_bytes ; single (high) resolution, 192 scanlines

t_blank_top
 sta WSYNC
 dey
 bpl t_blank_top

 ldy #title_bytes

; Asymmetrical playfield code. This is the bit I *really* want to
; test on a real Atari (it works ok on z26 and xstella)

; Addendum: I did test it on a real Atari, it almost worked.
; Now it works great

draw_t_pf
 sta WSYNC
 sta COLUPF ; 3
 lda left_title0,y ; 4
 sta PF0 ; 3
 lda left_title1,y ; 4
 sta PF1 ; 3
 lda left_title2,y ; 4
 sta PF2 ; 3 (so far, 24 cycles. the first 22.6 are during horiz. blank)
 lda right_title0,y ; 4 = 28
 ldx right_title1,y ; 4 = 32
 nop ; 2 = 37
 nop ; 2 = 37
 sta PF0 ; 3 = 35
 stx PF1 ; 3 = 41
 lda right_title2,y ; 4 = 45
 sta PF2 ; 3 (we're at 48 cycles past WSYNC, 26 past first visible color clock)
 tya
 adc framectr ; load A with next scanline's color
 dey
 bne draw_t_pf

; PF display goes like this:
;display: PF0.PF1.....PF2.....PF0.PF1.....PF2.....
;pixels:  0   4       12      20  24      32
;cycles: <23 <33     <39     <50 <55     <66

end_kernels ; common code (jmp'ed to by main_kernel)
 sta WSYNC ; finish last scanline

 lda #37 ; set overscan timer
 sta TIM64T

 lda #2
 sta VBLANK

 ldy #0
 sty COLUPF ; blank playfield
 sty PF0
 sty PF1
 sty PF2

; calculate offset to data for hi digit
 ldx current_color
 lda color0,x
 ; in C, a = (a >> 4) * 5;
 and #$F0 ; hi nybble first
 lsr
 lsr ; now we have: 0, 4, 8...,60
 sta ctemp ; in ctemp
 lsr ; finish shifting
 lsr ; now we have 0, 1, 2...,15 in A
 clc
 adc ctemp ; now we have 0, 5, 10...,75 in A
 sta hexpointer ; stash it
 lda color0,x ; now the low digit...
 ; in C, a = (a & 0x0F) * 5;
 and #$0F
 sta ctemp
 asl
 asl ; a = (a * 4) ...
 clc
 adc ctemp ; plus a, gives us a*5
 sta hexpointer+2 ; *whew*

; now we've got hexpointer as a pointer to the 5 bytes worth of
; font data we are wanting to draw for this digit...
 ldy #4
make_shape ; draw into RAM to simplify kernel (needs 5 bytes)
 lda (hexpointer),y
 ; we're doing the high digit, so we need to shift the data up 4 bits
 asl
 asl
 asl
 asl
 sta ctemp
 lda (hexpointer+2),y ; now get the low digit, which doesn't need to be shifted
 ora ctemp
 sta p0shape,y
 dey
 bpl make_shape ; get the next byte, until we're done.

; #define LAME_CUT_AND_PASTE
 ldx current_color
 lda bg0,x
 and #$F0 ; hi nybble first
 lsr
 lsr ; now we have: 0, 4, 8...,60
 sta ctemp ; in ctemp
 lsr ; finish shifting
 lsr ; now we have 0, 1, 2...,15 in A
 clc
 adc ctemp ; now we have 0, 5, 10...,75 in A
 sta hexpointer ; stash it
 lda bg0,x ; now the low digit...
 and #$0F
 sta ctemp
 asl
 asl ; a = (a * 4) ...
 clc
 adc ctemp ; plus a, gives us a*5
 ;ora hexpointer ; grab top 4 bits from hi nybble calc
 sta hexpointer+2 ; *whew*

 ldy #4
make_shape2 ; draw into RAM to simplify kernel (needs 5 bytes)
 lda (hexpointer),y
 asl
 asl
 asl
 asl
 sta ctemp
 lda (hexpointer+2),y
 ora ctemp
 sta p1shape,y
 dey
 bpl make_shape2

;ARGH what a waste. But it works.
; #undef LAME_CUT_AND_PASTE

; we're done with overscan calculations, so wait for the timer to run
; out and tell us it's time to start a new frame.
t_overscan
 lda INTIM
 bne t_overscan

 jmp main_loop ; time's up, start new frame now.

 org [>.+1]*256 ; align to next page, so branches don't cross page boundaries.
main_kernel
 ldy #96-[main_bytes*4]-1 ; single (high) resolution, 192 scanlines
 ldx #num_colors

m_blank_top
 sta WSYNC
 dey
 bne m_blank_top

draw_one_section
 sta WSYNC ; maybe not need this here
 tya ; lda #0
 lda color0,x
 sta COLUPF
 lda bg0,x
 sta COLUBK
 cpx current_color
 bne no_player1
 lda ptrcolor
no_player1
 sta COLUP1
 ldy #main_bytes
draw_m_pf
 lda ptrshape,y
 sta GRP1
 sta WSYNC
 lda left_main0,y ; 3
 sta PF0 ; 5
 lda left_main1,y ; 8
 sta PF1 ; 10
 lda left_main2,y ; 13
 sta PF2 ; 15
 sta WSYNC 
 dey
 bne draw_m_pf
 sty GRP1

 dex
 bpl draw_one_section


 repeat 11
 nop
 repend
 sta RESP1

 lda #0 ; waste one scan line turning bottom background black
 ldy #12 ; ...and player 1 white...
 ldx #5 ; ...and player 1 double-wide
 sty COLUP1
 sta WSYNC
 stx NUSIZ1
 sta PF0
 sta PF1
 sta PF2
 sta COLUBK
 ldy #4 ; draw player for 5 scanlines
draw_digits
 sta WSYNC
 sta RESP0
 lda p0shape,y ; we calculated this last overscan period
 sta GRP0
 lda p1shape,y
 sta GRP1
 sta WSYNC ; display it twice
 sta WSYNC ; display it thrice
 dey 
 bpl draw_digits 

 sta WSYNC
 lda #0
 sta GRP0 ; done drawing player
 sta GRP1 ; done drawing player
 sta NUSIZ1

; uncomment if I need to waste scanlines
; ldy #4
;t_blank_bottom
; sta WSYNC
; dey
; bne t_blank_bottom 

 jmp end_kernels ; our work is done here...

 org $F800


; 4x5 hex font, upside-down, low nybble only
hexfont
hex0
 byte %00000010
 byte %00000101
 byte %00000101
 byte %00000101
 byte %00000010
hex1
 byte %00000111
 byte %00000010
 byte %00000010
 byte %00000110
 byte %00000010
hex2
 byte %00000111
 byte %00000100
 byte %00000010
 byte %00000001
 byte %00000110
hex3
 byte %00000110
 byte %00000001
 byte %00000110
 byte %00000001
 byte %00000110
hex4
 byte %00000001
 byte %00000001
 byte %00000111
 byte %00000101
 byte %00000001
hex5
 byte %00000110
 byte %00000001
 byte %00000111
 byte %00000100
 byte %00000111
hex6
 byte %00000111
 byte %00000101
 byte %00000111
 byte %00000100
 byte %00000011
hex7
 byte %00000010
 byte %00000010
 byte %00000001
 byte %00000001
 byte %00000111
hex8
 byte %00000111
 byte %00000101
 byte %00000010
 byte %00000101
 byte %00000111
hex9
 byte %00000110
 byte %00000001
 byte %00000111
 byte %00000101
 byte %00000111
hexA
 byte %00000101
 byte %00000101
 byte %00000111
 byte %00000101
 byte %00000010
hexB
 byte %00000111
 byte %00000101
 byte %00000110
 byte %00000101
 byte %00000110
hexC
 byte %00000011
 byte %00000100
 byte %00000100
 byte %00000100
 byte %00000011
hexD
 byte %00000110
 byte %00000101
 byte %00000101
 byte %00000101
 byte %00000110
hexE
 byte %00000111
 byte %00000100
 byte %00000111
 byte %00000100
 byte %00000111
hexF
 byte %00000100
 byte %00000100
 byte %00000111
 byte %00000100
hexfont_end
 byte %00000111
hexfont_size = hexfont_end - hexfont
 echo "hexfont_size is",hexfont_size

default_colors byte $0a,$2a,$3a,$4a,$00,$10,$20,$30

ptrshape ; main_bytes bytes, which is 24 now I think
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %10000000
 byte %11000000
 byte %11100000
 byte %11000000
 byte %10000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000


 org $F900

; these tables were in include files generated by a script,
; but I put them in here so the source would be self-contained


left_title0
 byte %00000000
 byte %00000000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01110000
 byte %01110000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %00010000
 byte %01100000
 byte %01100000
 byte %01100000
 byte %01100000
 byte %01100000
 byte %01100000
 byte %00000000
 byte %00000000
title_bytes = [.-left_title0]-1

 org [>.]*256+256

left_title1
 byte %00000000
 byte %00000000
 byte %10101010
 byte %10101010
 byte %10101010
 byte %10101010
 byte %10101010
 byte %10101010
 byte %10101010
 byte %10101010
 byte %11101100
 byte %11101100
 byte %10101010
 byte %10101010
 byte %10101010
 byte %10101010
 byte %01001100
 byte %01001100
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00001111
 byte %00001111
 byte %00010000
 byte %00010000
 byte %00010110
 byte %00010110
 byte %00010100
 byte %00010100
 byte %00010100
 byte %00010100
 byte %00010110
 byte %00010110
 byte %00010000
 byte %00010000
 byte %00001111
 byte %00001111
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %01001110
 byte %01001110
 byte %01001110
 byte %01001110
 byte %01001110
 byte %01001110
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %01001000
 byte %01001000
 byte %01001000
 byte %01001000
 byte %01001000
 byte %01001000
 byte %00000000
 byte %00000000
 org [>.]*256+256

left_title2
 byte %00000000
 byte %00000000
 byte %01100011
 byte %01100011
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %01100011
 byte %01100011
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %10011100
 byte %10011100
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01001001
 byte %01001001
 byte %01010001
 byte %01010001
 byte %01010001
 byte %01010001
 byte %10001100
 byte %10001100
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %00110101
 byte %00110101
 byte %00110101
 byte %00110101
 byte %00110101
 byte %00110101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %00110010
 byte %00110010
 byte %00110010
 byte %00110010
 byte %00110010
 byte %00110010
 byte %00000000
 byte %00000000
 org [>.]*256+256

right_title0
 byte %00000000
 byte %00000000
 byte %00100000
 byte %00100000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %00100000
 byte %00100000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %10000000
 byte %10000000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %01010000
 byte %10000000
 byte %10000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %00100000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %01110000
 byte %00000000
 byte %00000000
 org [>.]*256+256

right_title1
 byte %00000000
 byte %00000000
 byte %11001110
 byte %11001110
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101100
 byte %10101100
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %11001110
 byte %11001110
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00111000
 byte %00111000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10010000
 byte %10110000
 byte %10110000
 byte %00010000
 byte %00010000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %10101110
 byte %10101110
 byte %10101110
 byte %10101110
 byte %10101110
 byte %10101110
 byte %11101000
 byte %11101000
 byte %11101000
 byte %11101000
 byte %11101000
 byte %11101000
 byte %11101100
 byte %11101100
 byte %11101100
 byte %11101100
 byte %11101100
 byte %11101100
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101000
 byte %10101110
 byte %10101110
 byte %10101110
 byte %10101110
 byte %10101110
 byte %10101110
 byte %00000000
 byte %00000000
 org [>.]*256+256

right_title2
 byte %00000000
 byte %00000000
 byte %00110101
 byte %00110101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %01000101
 byte %00100011
 byte %00100011
 byte %00010101
 byte %00010101
 byte %00010101
 byte %00010101
 byte %01100011
 byte %01100011
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %00110111
 byte %00110111
 byte %00110111
 byte %00110111
 byte %00110111
 byte %00110111
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010101
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010010
 byte %01010010
 byte %00000000
 byte %00000000
 org [>.]*256+256


left_main0
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
 byte %11000000
main_bytes = [.-left_main0]-1


left_main1
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100
 byte %11111100

left_main2
 byte %00000000
 byte %00000000
 byte %00000000
 byte %00000000
 byte %11111111
 byte %11111111
 byte %11111111
 byte %11111111
 byte %10000001
 byte %10000001
 byte %10000001
 byte %10000001
 byte %10000001
 byte %10000001
 byte %10000001
 byte %10000001
 byte %11111111
 byte %11111111
 byte %11111111
 byte %11111111

; echo *-$F900,"bytes of included data"

 org $FFFC
 word $F000
 word $F000


Attachment: colortwk.bin
Description: Binary data

Current Thread