From 52f6be2bb0d1feadaf512a5a967fabef4aaaf8eb Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 26 Jan 2021 18:17:20 +0100 Subject: [PATCH] gfx2: changed screen mode numbering to a more intuitive sequence --- compiler/res/prog8lib/cx16/gfx2.p8 | 96 ++++++++++++++++++------------ examples/cx16/amiga.p8 | 2 +- examples/cx16/highresbitmap.p8 | 4 +- examples/cx16/testgfx2.p8 | 24 ++++---- 4 files changed, 73 insertions(+), 53 deletions(-) diff --git a/compiler/res/prog8lib/cx16/gfx2.p8 b/compiler/res/prog8lib/cx16/gfx2.p8 index 7100d560d..74fa71e6e 100644 --- a/compiler/res/prog8lib/cx16/gfx2.p8 +++ b/compiler/res/prog8lib/cx16/gfx2.p8 @@ -6,28 +6,32 @@ ; Note: for compatible graphics code that words on C64 too, use the "graphics" module instead. ; Note: there is no color palette manipulation here, you have to do that yourself or use the "palette" module. +; SCREEN MODE LIST: +; mode 0 = reset back to default text mode +; mode 1 = bitmap 320 x 240 monochrome +; mode 2 = bitmap 320 x 240 x 4c (unsupported TODO not yet implemented) +; mode 3 = bitmap 320 x 240 x 16c (unsupported TODO not yet implemented) +; mode 4 = bitmap 320 x 240 x 256c +; mode 5 = bitmap 640 x 480 monochrome +; mode 6 = bitmap 640 x 480 x 4c (unsupported TODO not yet implemented) +; mode 7 = bitmap 640 x 480 x 16c (unsupported due to lack of VRAM) +; mode 8 = bitmap 640 x 480 x 256c (unsupported due to lack of VRAM) + ; TODO can we make a FB vector table and emulation routines for the Cx16s' GRAPH_init() call? to replace the builtin 320x200 fb driver? gfx2 { ; read-only control variables: - ubyte active_mode = 255 + ubyte active_mode = 0 uword width = 0 uword height = 0 ubyte bpp = 0 ubyte monochrome_dont_stipple_flag = false ; set to false to enable stippling mode in monochrome displaymodes sub screen_mode(ubyte mode) { - ; mode 0 = bitmap 320 x 240 x 1c monochrome - ; mode 1 = bitmap 320 x 240 x 256c - ; mode 128 = bitmap 640 x 480 x 1c monochrome - ; ...other modes? - - ; copy the lower-case charset to the upper part of the vram, so we can use it later to plot text - when mode { - 0 -> { - ; 320 x 240 x 1c + 1 -> { + ; lores monchrome cx16.VERA_DC_VIDEO = (cx16.VERA_DC_VIDEO & %11001111) | %00100000 ; enable only layer 1 cx16.VERA_DC_HSCALE = 64 cx16.VERA_DC_VSCALE = 64 @@ -38,8 +42,9 @@ gfx2 { height = 240 bpp = 1 } - 1 -> { - ; 320 x 240 x 256c + ; TODO modes 2, 3 not yet implemented + 4 -> { + ; lores 256c cx16.VERA_DC_VIDEO = (cx16.VERA_DC_VIDEO & %11001111) | %00100000 ; enable only layer 1 cx16.VERA_DC_HSCALE = 64 cx16.VERA_DC_VSCALE = 64 @@ -50,8 +55,8 @@ gfx2 { height = 240 bpp = 8 } - 128 -> { - ; 640 x 480 x 1c + 5 -> { + ; highres monochrome cx16.VERA_DC_VIDEO = (cx16.VERA_DC_VIDEO & %11001111) | %00100000 ; enable only layer 1 cx16.VERA_DC_HSCALE = 128 cx16.VERA_DC_VSCALE = 128 @@ -62,13 +67,16 @@ gfx2 { height = 480 bpp = 1 } - 255 -> { + ; TODO mode 6 highres 4c + ; modes 7 and 8 not supported due to lack of VRAM + else -> { ; back to default text mode and colors cx16.VERA_CTRL = %10000000 ; reset VERA and palette c64.CINT() ; back to text mode width = 0 height = 0 bpp = 0 + mode = 0 } } @@ -81,21 +89,24 @@ gfx2 { monochrome_stipple(false) position(0, 0) when active_mode { - 0 -> { - ; 320 x 240 x 1c + 1 -> { + ; lores monochrome repeat 240/2/8 cs_innerloop640() } - 1 -> { - ; 320 x 240 x 256c + ; TODO mode 2, 3 + 4 -> { + ; lores 256c repeat 240/2 cs_innerloop640() } - 128 -> { - ; 640 x 480 x 1c + 5 -> { + ; highres monochrome repeat 480/8 cs_innerloop640() } + ; TODO mode 6 highres 4c + ; modes 7 and 8 not supported due to lack of VRAM } position(0, 0) } @@ -130,8 +141,8 @@ gfx2 { if length==0 return when active_mode { - 1 -> { - ; 8bpp mode + 4 -> { + ; lores 256c position(x, y) %asm {{ lda color @@ -152,8 +163,8 @@ gfx2 { + plx }} } - 0, 128 -> { - ; 1 bpp mode + 1, 5 -> { + ; monochrome modes, either resolution ubyte separate_pixels = (8-lsb(x)) & 7 if separate_pixels as uword > length separate_pixels = lsb(length) @@ -212,7 +223,8 @@ _done sub vertical_line(uword x, uword y, uword height, ubyte color) { position(x,y) - if active_mode==1 { + if active_mode==4 { + ; lores 256c ; set vera auto-increment to 320 pixel increment (=next line) cx16.VERA_ADDR_H = (cx16.VERA_ADDR_H & %00000111) | (14<<4) %asm {{ @@ -230,7 +242,7 @@ _done ; note for the 1 bpp modes we can't use vera's auto increment mode because we have to 'or' the pixel data in place. cx16.VERA_ADDR_H = (cx16.VERA_ADDR_H & %00000111) ; no auto advance cx16.r15 = gfx2.plot.bits[x as ubyte & 7] ; bitmask - if active_mode>=128 + if active_mode>=5 cx16.r14 = 640/8 else cx16.r14 = 320/8 @@ -472,7 +484,8 @@ _done ubyte value when active_mode { - 0 -> { + 1 -> { + ; lores monochrome %asm {{ lda x eor y @@ -490,7 +503,8 @@ _done } } } - 128 -> { + 5 -> { + ; highres monochrome %asm {{ lda x eor y @@ -508,7 +522,8 @@ _done } } } - 1 -> { + 4 -> { + ; lores 256c void addr_mul_320_add_24(y, x) ; 24 bits result is in r0 and r1L value = lsb(cx16.r1) cx16.vpoke(value, cx16.r0, color) @@ -521,15 +536,18 @@ _done sub position(uword @zp x, uword y) { when active_mode { - 0 -> { + 1 -> { + ; lores monochrome cx16.r0 = y*(320/8) + x/8 cx16.vaddr(0, cx16.r0, 0, 1) } - 128 -> { + 5 -> { + ; highres monochrome cx16.r0 = y*(640/8) + x/8 cx16.vaddr(0, cx16.r0, 0, 1) } - 1 -> { + 4 -> { + ; lores 256c void addr_mul_320_add_24(y, x) ; 24 bits result is in r0 and r1L ubyte bank = lsb(cx16.r1) cx16.vaddr(bank, cx16.r0, 0, 1) @@ -614,13 +632,13 @@ _done sub text(uword @zp x, uword y, ubyte color, uword sctextptr) { ; -- Write some text at the given pixel position. The text string must be in screencode encoding (not petscii!). ; You must also have called text_charset() first to select and prepare the character set to use. - ; NOTE: in monochrome (1bpp) screen modes, x position is currently constrained to mulitples of 8 ! + ; NOTE: in monochrome (1bpp) screen modes, x position is currently constrained to mulitples of 8 ! TODO allow per-pixel horizontal positioning uword chardataptr when active_mode { - 0, 128 -> { - ; 1-bitplane modes + 1, 5 -> { + ; monochrome mode, either resolution cx16.r2 = 40 - if active_mode>=128 + if active_mode>=5 cx16.r2 = 80 while @(sctextptr) { chardataptr = charset_addr + (@(sctextptr) as uword)*8 @@ -660,8 +678,8 @@ _done sctextptr++ } } - 1 -> { - ; 320 x 240 x 256c + 4 -> { + ; lores 256c while @(sctextptr) { chardataptr = charset_addr + (@(sctextptr) as uword)*8 cx16.vaddr(charset_bank, chardataptr, 1, 1) diff --git a/examples/cx16/amiga.p8 b/examples/cx16/amiga.p8 index fd5660492..791ade51d 100644 --- a/examples/cx16/amiga.p8 +++ b/examples/cx16/amiga.p8 @@ -11,7 +11,7 @@ main { sub start() { palette.set_monochrome($0aaa, $0000) - gfx2.screen_mode(128) ; select 640*480 mode + gfx2.screen_mode(5) ; select 640*480 mode cx16.VERA_DC_VSCALE = 64 ; have the vertical resolution so it is 640*240 - more or less Amiga's default non interlaced mode cx16.mouse_config(1, 1) ; enable mouse TODO make it an Amiga mouse pointer if possible gfx2.text_charset(3) diff --git a/examples/cx16/highresbitmap.p8 b/examples/cx16/highresbitmap.p8 index 6b84d983a..83b0d969e 100644 --- a/examples/cx16/highresbitmap.p8 +++ b/examples/cx16/highresbitmap.p8 @@ -11,12 +11,12 @@ main { test_monochrome() - gfx2.screen_mode(255) + gfx2.screen_mode(0) txt.print("done!\n") } sub test_monochrome() { - gfx2.screen_mode(128) + gfx2.screen_mode(5) uword yy uword xx word ww diff --git a/examples/cx16/testgfx2.p8 b/examples/cx16/testgfx2.p8 index 6e71ad6a9..e8913e642 100644 --- a/examples/cx16/testgfx2.p8 +++ b/examples/cx16/testgfx2.p8 @@ -7,8 +7,19 @@ main { sub start() { - gfx2.screen_mode(128) + gfx2.screen_mode(5) +; demo1() +; sys.wait(3*60) + demo2() + + gfx2.screen_mode(0) + txt.print("done!\n") + + test_stack.test() + } + + sub demo1() { uword pixels = memory("pixels", 320) uword yy = 10 uword xx @@ -124,21 +135,12 @@ main { } xx+=4 } - - sys.wait(3*60) - - demo2() - - gfx2.screen_mode(255) - txt.print("done!\n") - - test_stack.test() } sub demo2 () { gfx2.text_charset(3) - ubyte[] modes = [1, 0, 128] + ubyte[] modes = [4, 1, 5] ubyte mode for mode in modes { gfx2.screen_mode(mode)