Add raw mode for charwin

This commit is contained in:
drmortalwombat 2022-01-04 15:38:06 +01:00
parent 639a33f9eb
commit a86a19fc8c
4 changed files with 176 additions and 0 deletions

View File

@ -120,6 +120,9 @@ rem @echo off
@call :test scrolltest.c
@if %errorlevel% neq 0 goto :error
@call :test charwintest.c
@if %errorlevel% neq 0 goto :error
@exit /b 0
:error

64
autotest/charwintest.c Normal file
View File

@ -0,0 +1,64 @@
#include <c64/charwin.h>
#include <assert.h>
#include <stdio.h>
int main(void)
{
CharWin cw;
cwin_init(&cw, (char *)0x0400, 2, 2, 32, 20);
cwin_clear(&cw);
for(int y=0; y<20; y++)
{
for(int x=0; x<32; x++)
{
assert(cwin_getat_char_raw(&cw, x, y) == ' ');
}
}
for(int y=0; y<20; y++)
{
for(int x=0; x<32; x++)
{
cwin_putat_char(&cw, x, y, p'a' - 1 + x, 7);
}
}
for(int y=0; y<20; y++)
{
for(int x=0; x<32; x++)
{
assert(cwin_getat_char(&cw, x, y) == p'a' -1 + x);
}
}
for(int y=0; y<20; y++)
{
for(int x=0; x<32; x++)
{
cwin_putat_char(&cw, x, y, p'A' - 1 + x, 8);
}
}
for(int y=0; y<20; y++)
{
for(int x=0; x<32; x++)
{
cwin_putat_char_raw(&cw, x, y, x + 32 * y, 8);
}
}
for(int y=0; y<8; y++)
{
for(int x=0; x<32; x++)
{
assert(cwin_getat_char_raw(&cw, x, y) == x + 32 * y);
}
}
return 0;
}

View File

@ -254,6 +254,32 @@ char cwin_put_string(CharWin * win, const char * str, char color)
return n;
}
void cwin_put_char_raw(CharWin * win, char ch, char color)
{
cwin_putat_char_raw(win, win->cx, win->cy, ch, color);
win->cx++;
if (win->cx == win->wx)
{
win->cx = 0;
win->cy++;
}
}
void cwin_put_chars_raw(CharWin * win, const char * chars, char num, char color)
{
cwin_putat_chars_raw(win, win->cx, win->cy, chars, color);
win->cx += num;
if (win->cx >= win->wx)
{
win->cx = 0;
win->cy++;
}
}
void cwin_putat_char(CharWin * win, char x, char y, char ch, char color)
{
int offset = mul40[y] + x;
@ -303,6 +329,35 @@ char cwin_putat_string(CharWin * win, char x, char y, const char * str, char col
#pragma native(cwin_putat_string)
void cwin_putat_char_raw(CharWin * win, char x, char y, char ch, char color)
{
int offset = mul40[y] + x;
win->sp[offset] = ch;
win->cp[offset] = color;
}
#pragma native(cwin_putat_char_raw)
void cwin_putat_chars_raw(CharWin * win, char x, char y, const char * chars, char num, char color)
{
int offset = mul40[y] + x;
char * sp = win->sp + offset;
char * cp = win->cp + offset;
for(char i=0; i<num; i++)
{
char ch = chars[i];
sp[i] = ch;
cp[i] = color;
}
}
#pragma native(cwin_putat_chars_raw)
char cwin_getat_char(CharWin * win, char x, char y)
{
char * sp = win->sp + mul40[y] + x;
@ -310,6 +365,8 @@ char cwin_getat_char(CharWin * win, char x, char y)
return s2p(*sp);
}
#pragma native(cwin_getat_char)
void cwin_getat_chars(CharWin * win, char x, char y, char * chars, char num)
{
char * sp = win->sp + mul40[y] + x;
@ -320,6 +377,28 @@ void cwin_getat_chars(CharWin * win, char x, char y, char * chars, char num)
}
}
#pragma native(cwin_getat_chars)
char cwin_getat_char_raw(CharWin * win, char x, char y)
{
char * sp = win->sp + mul40[y] + x;
return *sp;
}
#pragma native(cwin_getat_char_raw)
void cwin_getat_chars_raw(CharWin * win, char x, char y, char * chars, char num)
{
char * sp = win->sp + mul40[y] + x;
for(char i=0; i<num; i++)
{
chars[i] = sp[i];
}
}
#pragma native(cwin_getat_chars_raw)
void cwin_insert_char(CharWin * win)
{

View File

@ -62,6 +62,17 @@ void cwin_put_chars(CharWin * win, const char * chars, char num, char color);
//
char cwin_put_string(CharWin * win, const char * str, char color);
// Put a single raw char at the cursor location and advance the cursor
//
void cwin_put_char_raw(CharWin * win, char ch, char color);
// Put an array of raw chars at the cursor location and advance the cursor
//
void cwin_put_chars_raw(CharWin * win, const char * chars, char num, char color);
// Put a single char at the given window location
//
void cwin_putat_char(CharWin * win, char x, char y, char ch, char color);
@ -75,6 +86,15 @@ void cwin_putat_chars(CharWin * win, char x, char y, const char * chars, char nu
char cwin_putat_string(CharWin * win, char x, char y, const char * str, char color);
// Put a single raw char at the given window location
//
void cwin_putat_char_raw(CharWin * win, char x, char y, char ch, char color);
// Put an array of raw chars at the given window location
//
void cwin_putat_chars_raw(CharWin * win, char x, char y, const char * chars, char num, char color);
// Get a single char at the given window location
//
char cwin_getat_char(CharWin * win, char x, char y);
@ -85,6 +105,16 @@ void cwin_getat_chars(CharWin * win, char x, char y, char * chars, char num);
// Get a single char at the given window location
//
char cwin_getat_char_raw(CharWin * win, char x, char y);
// Get an array of chars at the given window location
//
void cwin_getat_chars_raw(CharWin * win, char x, char y, char * chars, char num);
// Insert one space character at the cursor position
//
void cwin_insert_char(CharWin * win);