CON x_tiles = 16 y_tiles = 13 x_screen = x_tiles << 4 y_screen = y_tiles << 4 width = 0 '0 = minimum x_scale = 1 '1 = minimum y_scale = 1 '1 = minimum x_spacing = 6 '6 = normal y_spacing = 13 '13 = normal x_chr = x_scale * x_spacing y_chr = y_scale * y_spacing y_offset = y_spacing / 6 + y_chr - 1 x_limit = x_screen / (x_scale * x_spacing) y_limit = y_screen / (y_scale * y_spacing) y_max = y_limit - 1 y_screen_bytes = y_screen << 2 y_scroll = y_chr << 2 y_scroll_longs = y_chr * y_max y_clear = y_scroll_longs << 2 y_clear_longs = y_screen - y_scroll_longs paramcount = 14 VAR long x, y, bitmap_base long tv_status '0/1/2 = off/visible/invisible read-only long tv_enable '0/? = off/on write-only long tv_pins '%ppmmm = pins write-only long tv_mode '%ccinp = chroma,interlace,ntsc/pal,swap write-only long tv_screen 'pointer to screen (words) write-only long tv_colors 'pointer to colors (longs) write-only long tv_hc 'horizontal cells write-only long tv_vc 'vertical cells write-only long tv_hx 'horizontal cell expansion write-only long tv_vx 'vertical cell expansion write-only long tv_ho 'horizontal offset write-only long tv_vo 'vertical offset write-only long tv_broadcast 'broadcast frequency (Hz) write-only long tv_auralcog 'aural fm cog write-only long bitmap[x_tiles * y_tiles << 4 + 16] 'add 16 longs to allow for 64-byte alignment word screen[x_tiles * y_tiles] OBJ tv : "E_TV01" gr : "E_Graphics01" PUB start(basepin) : result '' basepin = first of three pins on a 4-pin boundary (0, 4, 8...) to have '' 1.1k, 560, and 270 ohm resistors connected and summed to form the 1V, '' 75 ohm DAC for baseband video 'init bitmap and tile screen bitmap_base := (@bitmap + $3F) & $7FC0 repeat x from 0 to x_tiles - 1 repeat y from 0 to y_tiles - 1 screen[y * x_tiles + x] := bitmap_base >> 6 + y + x * y_tiles tvparams_pins := (basepin & $38) << 1 | (basepin & 4 == 4) & %0101 longmove(@tv_status, @tvparams, paramcount) tv_screen := @screen tv_colors := @color_schemes result := tv.start(@tv_status) result := result + (gr.start*10) gr.setup(x_tiles, y_tiles, 0, y_screen, bitmap_base) gr.textmode(x_scale, y_scale, x_spacing, 0) gr.width(width) out(0) PUB out(c) case c $00: 'home? gr.clear x := y := 0 $01..$03: 'color? gr.color(c) $04..$07: 'color scheme? tv_colors := @color_schemes[c & 3] $09: 'tab? repeat out($20) while x & 7 $0D: 'return? newline $20..$7E: 'character? gr.text(x * x_chr, -y * y_chr - y_offset, @c) gr.finish if ++x == x_limit newline PUB str(string_ptr) '' Print a zero-terminated string repeat strsize(string_ptr) out(byte[string_ptr++]) PRI newline if ++y == y_limit gr.finish repeat x from 0 to x_tiles - 1 y := bitmap_base + x * y_screen_bytes longmove(y, y + y_scroll, y_scroll_longs) longfill(y + y_clear, 0, y_clear_longs) y := y_max x := 0 DAT tvparams long 0 'status long 1 'enable tvparams_pins long %001_0101 'pins long %0000 'mode long 0 'screen long 0 'colors long x_tiles 'hc long y_tiles 'vc long 10 'hx long 1 'vx long 0 'ho long 0 'vo long 55_250_000 'broadcast long 0 'auralcog color_schemes long $BC_6C_05_02 long $0E_0D_0C_0A long $6E_6D_6C_6A long $BE_BD_BC_BA