mirror of
https://github.com/irmen/prog8.git
synced 2025-01-11 13:29:45 +00:00
e7698686fa
When the program starts, before the screen is modified, save_rec is called to capture the cx16 logo. The fix was to not do the second call to save_rec until after vtui is used to draw the boxes on the screen. Before the this fix, the initial replacement issue was of the logo and not the portion of the screen originally modified by vtui.
162 lines
5.3 KiB
Lua
162 lines
5.3 KiB
Lua
%import textio
|
|
%option no_sysinit
|
|
%zeropage basicsafe
|
|
|
|
; simple test program for the "VTUI" text user interface library
|
|
; see: https://github.com/JimmyDansbo/VTUIlib
|
|
|
|
main {
|
|
sub start() {
|
|
vtui.initialize()
|
|
store_logo() ; capture logo before boxes are drawn
|
|
|
|
txt.lowercase()
|
|
vtui.screen_set(0)
|
|
vtui.clr_scr('%', $50)
|
|
vtui.gotoxy(5,5)
|
|
vtui.fill_box(':', 70, 50, $c6)
|
|
|
|
store_where_logo_was() ; after vtui draws boxes, initialize replacement screen values as logo moves
|
|
|
|
vtui.gotoxy(10,10)
|
|
vtui.border(1, 40, 6, $47)
|
|
vtui.gotoxy(12,12)
|
|
vtui.print_str2(sc:"Hello, world! vtui from Prog8!", $f2, false)
|
|
vtui.gotoxy(12,13)
|
|
vtui.print_str2("Hello, world! vtui from Prog8!", $f2, true)
|
|
|
|
str inputbuffer = "?" * 20
|
|
|
|
; txt.print_uwhex(inputbuffer, 1)
|
|
; txt.chrout(':')
|
|
; txt.print(inputbuffer)
|
|
; txt.chrout('\n')
|
|
|
|
vtui.gotoxy(5,20)
|
|
vtui.print_str2(sc:"Enter your name: ", $e3, false)
|
|
ubyte length = vtui.input_str(inputbuffer, len(inputbuffer), $21)
|
|
|
|
vtui.gotoxy(8,22)
|
|
vtui.print_str2(sc:"Your name is: ", $e3, false)
|
|
;vtui.print_str2(inputbuffer, $67, $00)
|
|
vtui.print_str(inputbuffer, length, $67, $00)
|
|
|
|
; txt.uppercase() ; kills vtui?
|
|
logo_mover()
|
|
}
|
|
|
|
sub store_logo() {
|
|
vtui.gotoxy(0, 0)
|
|
vtui.save_rect($80, 1, $0000, 7, 7)
|
|
}
|
|
|
|
sub store_where_logo_was() {
|
|
vtui.gotoxy(0, 0)
|
|
vtui.save_rect($80, 1, $0100, 7, 7)
|
|
}
|
|
|
|
sub logo_mover() {
|
|
ubyte xcoord = 0
|
|
ubyte ycoord = 0
|
|
ubyte newx = 0
|
|
ubyte newy = 0
|
|
|
|
;vtui.screen_set(2)
|
|
vtui.gotoxy(30, 32)
|
|
vtui.print_str2("arrow keys to move!", $61, true)
|
|
|
|
char_loop:
|
|
ubyte char = cbm.GETIN()
|
|
if not char
|
|
goto char_loop
|
|
|
|
when char {
|
|
$91 -> {
|
|
if newy {
|
|
newy--
|
|
move_logo()
|
|
}
|
|
}
|
|
$11 -> {
|
|
if newy<53 {
|
|
newy++
|
|
move_logo()
|
|
}
|
|
}
|
|
$9d -> {
|
|
if newx {
|
|
newx--
|
|
move_logo()
|
|
}
|
|
}
|
|
$1d -> {
|
|
if newx<70 {
|
|
newx++
|
|
move_logo()
|
|
}
|
|
}
|
|
}
|
|
|
|
goto char_loop
|
|
|
|
sub move_logo() {
|
|
vtui.gotoxy(xcoord, ycoord)
|
|
vtui.rest_rect($80, 1, $0100, 7, 7)
|
|
vtui.gotoxy(newx, newy)
|
|
vtui.save_rect($80, 1, $0100, 7, 7)
|
|
vtui.gotoxy(newx, newy)
|
|
vtui.rest_rect($80, 1, $0000, 7, 7)
|
|
xcoord = newx
|
|
ycoord = newy
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
vtui $1000 {
|
|
|
|
%option no_symbol_prefixing
|
|
%asmbinary "VTUI1.0.BIN", 2 ; skip the 2 dummy load address bytes
|
|
|
|
; NOTE: base address $1000 here must be the same as the block's memory address, for obvious reasons!
|
|
; The routines below are for VTUI 1.0
|
|
romsub $1000 = initialize() clobbers(A, X, Y)
|
|
romsub $1002 = screen_set(ubyte mode @A) clobbers(A, X, Y)
|
|
romsub $1005 = set_bank(bool bank1 @Pc) clobbers(A)
|
|
romsub $1008 = set_stride(ubyte stride @A) clobbers(A)
|
|
romsub $100b = set_decr(bool incrdecr @Pc) clobbers(A)
|
|
romsub $100e = clr_scr(ubyte char @A, ubyte colors @X) clobbers(Y)
|
|
romsub $1011 = gotoxy(ubyte column @A, ubyte row @Y)
|
|
romsub $1014 = plot_char(ubyte char @A, ubyte colors @X)
|
|
romsub $1017 = scan_char() -> ubyte @A, ubyte @X
|
|
romsub $101a = hline(ubyte char @A, ubyte length @Y, ubyte colors @X) clobbers(A)
|
|
romsub $101d = vline(ubyte char @A, ubyte height @Y, ubyte colors @X) clobbers(A)
|
|
romsub $1020 = print_str(str txtstring @R0, ubyte length @Y, ubyte colors @X, ubyte convertchars @A) clobbers(A, Y)
|
|
romsub $1023 = fill_box(ubyte char @A, ubyte width @R1, ubyte height @R2, ubyte colors @X) clobbers(A, Y)
|
|
romsub $1026 = pet2scr(ubyte char @A) -> ubyte @A
|
|
romsub $1029 = scr2pet(ubyte char @A) -> ubyte @A
|
|
romsub $102c = border(ubyte mode @A, ubyte width @R1, ubyte height @R2, ubyte colors @X) clobbers(Y) ; NOTE: mode 6 means 'custom' characters taken from r3 - r6
|
|
romsub $102f = save_rect(ubyte ramtype @A, bool vbank1 @Pc, uword address @R0, ubyte width @R1, ubyte height @R2) clobbers(A, X, Y)
|
|
romsub $1032 = rest_rect(ubyte ramtype @A, bool vbank1 @Pc, uword address @R0, ubyte width @R1, ubyte height @R2) clobbers(A, X, Y)
|
|
romsub $1035 = input_str(uword buffer @R0, ubyte buflen @Y, ubyte colors @X) clobbers (A) -> ubyte @Y
|
|
romsub $1038 = get_bank() clobbers (A) -> bool @Pc
|
|
romsub $103b = get_stride() -> ubyte @A
|
|
romsub $103e = get_decr() clobbers (A) -> bool @Pc
|
|
|
|
; -- helper function to do string length counting for you internally, and turn the convertchars flag into a boolean again
|
|
asmsub print_str2(str txtstring @R0, ubyte colors @X, bool convertchars @Pc) clobbers(A, Y) {
|
|
%asm {{
|
|
lda #0
|
|
bcs +
|
|
lda #$80
|
|
+ pha
|
|
lda cx16.r0
|
|
ldy cx16.r0+1
|
|
jsr prog8_lib.strlen
|
|
pla
|
|
jmp print_str
|
|
}}
|
|
}
|
|
}
|