diff --git a/compiler/res/prog8lib/cx16textio.p8 b/compiler/res/prog8lib/cx16textio.p8 index e52f081d5..a8e924460 100644 --- a/compiler/res/prog8lib/cx16textio.p8 +++ b/compiler/res/prog8lib/cx16textio.p8 @@ -18,6 +18,7 @@ sub clear_screen() { asmsub fill_screen (ubyte char @ A, ubyte txtcolor @ Y) clobbers(A) { ; ---- fill the character screen with the given fill character and character color. + ; TODO this can be done more efficiently with the VERA auto increment mode? %asm {{ sta P8ZP_SCRATCH_W1 ; fillchar sty P8ZP_SCRATCH_W1+1 ; textcolor @@ -57,6 +58,7 @@ asmsub fill_screen (ubyte char @ A, ubyte txtcolor @ Y) clobbers(A) { asmsub clear_screenchars (ubyte char @ A) clobbers(Y) { ; ---- clear the character screen with the given fill character (leaves colors) ; (assumes screen matrix is at the default address) + ; TODO this can be done more efficiently with the VERA auto increment mode? %asm {{ pha phx @@ -103,6 +105,8 @@ sub uppercase() { cx16.screen_set_charset(2, 0) ; uppercase charset } +; TODO implement the "missing" txtio scroll subroutines: scroll_left_full, (also right, up, down) + romsub $FFD2 = chrout(ubyte char @ A) ; for consistency. You can also use c64.CHROUT directly ofcourse. asmsub print (str text @ AY) clobbers(A,Y) { @@ -328,7 +332,61 @@ asmsub input_chars (uword buffer @ AY) clobbers(A) -> ubyte @ Y { }} } -; TODO implement the "missing" txtio subroutines: getchr, setclr, getclr, scroll_left_full, (also right, up, down) +asmsub setchr (ubyte col @X, ubyte row @Y, ubyte character @A) clobbers(A) { + ; ---- sets the character in the screen matrix at the given position + %asm {{ + pha + txa + asl a + stz cx16.VERA_ADDR_H + sta cx16.VERA_ADDR_L + sty cx16.VERA_ADDR_M + pla + sta cx16.VERA_DATA0 + rts + }} +} + +asmsub getchr (ubyte col @A, ubyte row @Y) -> ubyte @ A { + ; ---- get the character in the screen matrix at the given location + %asm {{ + asl a + stz cx16.VERA_ADDR_H + sta cx16.VERA_ADDR_L + sty cx16.VERA_ADDR_M + lda cx16.VERA_DATA0 + rts + }} +} + +asmsub setclr (ubyte col @X, ubyte row @Y, ubyte color @A) clobbers(A) { + ; ---- set the color in A on the screen matrix at the given position + %asm {{ + pha + txa + asl a + ina + stz cx16.VERA_ADDR_H + sta cx16.VERA_ADDR_L + sty cx16.VERA_ADDR_M + pla + sta cx16.VERA_DATA0 + rts + }} +} + +asmsub getclr (ubyte col @A, ubyte row @Y) -> ubyte @ A { + ; ---- get the color in the screen color matrix at the given location + %asm {{ + asl a + ina + stz cx16.VERA_ADDR_H + sta cx16.VERA_ADDR_L + sty cx16.VERA_ADDR_M + lda cx16.VERA_DATA0 + rts + }} +} sub setcc (ubyte column, ubyte row, ubyte char, ubyte charcolor) { ; ---- set char+color at the given position on the screen diff --git a/examples/test.p8 b/examples/test.p8 index e4118107a..0d09d9ef6 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,6 +1,6 @@ ;%import c64lib ;%import c64graphics -; %import c64textio +;%import c64textio ;%import c64flt ;%option enable_floats %target cx16 @@ -21,35 +21,35 @@ main { txt.setchr(7, 6, '+') txt.setchr(7, 7, '+') -; txt.setclr(5, 5, 1) -; txt.setclr(6, 5, 2) -; txt.setclr(7, 5, 3) -; txt.setclr(7, 6, 4) -; txt.setclr(7, 7, 5) -; + txt.setclr(5, 5, 1) + txt.setclr(6, 5, 2) + txt.setclr(7, 5, 3) + txt.setclr(7, 6, 4) + txt.setclr(7, 7, 5) + txt.plot(15,10) txt.chrout('!') -; -; txt.print_ub(txt.getchr(4,5)) -; txt.chrout(',') -; txt.print_ub(txt.getchr(5,5)) -; txt.chrout(',') -; txt.print_ub(txt.getchr(6,5)) -; txt.chrout(',') -; txt.print_ub(txt.getchr(7,5)) -; txt.chrout(',') -; txt.print_ub(txt.getchr(8,5)) -; txt.chrout('\n') -; txt.print_ub(txt.getclr(4,5)) -; txt.chrout(',') -; txt.print_ub(txt.getclr(5,5)) -; txt.chrout(',') -; txt.print_ub(txt.getclr(6,5)) -; txt.chrout(',') -; txt.print_ub(txt.getclr(7,5)) -; txt.chrout(',') -; txt.print_ub(txt.getclr(8,5)) -; txt.chrout('\n') + + txt.print_ub(txt.getchr(4,5)) + txt.chrout(',') + txt.print_ub(txt.getchr(5,5)) + txt.chrout(',') + txt.print_ub(txt.getchr(6,5)) + txt.chrout(',') + txt.print_ub(txt.getchr(7,5)) + txt.chrout(',') + txt.print_ub(txt.getchr(8,5)) + txt.chrout('\n') + txt.print_ub(txt.getclr(4,5)) + txt.chrout(',') + txt.print_ub(txt.getclr(5,5)) + txt.chrout(',') + txt.print_ub(txt.getclr(6,5)) + txt.chrout(',') + txt.print_ub(txt.getclr(7,5)) + txt.chrout(',') + txt.print_ub(txt.getclr(8,5)) + txt.chrout('\n') } }