diff --git a/ansiterm.c b/ansiterm.c index 07e0b6f..52bd580 100644 --- a/ansiterm.c +++ b/ansiterm.c @@ -9,6 +9,9 @@ segment "ansiterm"; #include "ansiterm.h" +// http://ansi-bbs.org/ansi-bbs-core-server.html + + typedef struct { int x; int y; @@ -24,6 +27,7 @@ static bool _inEscape = false; static bool _bold = false; static bool _blink = false; static bool _reverse = false; +static bool _destructiveBS = false; static int _foreground = 7; static int _background = 0; static int _fColor = 7; @@ -31,15 +35,15 @@ static int _bColor = 0; static int _number = 0; static int _parameters[5]; static int _parameterCount = 0; +static jlStaT *_ansiFont = NULL; static Vector2T _cursorSave; static Vector2T _cursor; -static jlStaT *_ansiFont = NULL; -static int *_screenBuffer = NULL; +static Vector2T *_screenBuffer = NULL; void termDebug(const char *what, ...); bool termParseANSI(char c); -void termRenderCharacterAtCursor(char c); +void termRenderCharacterAtCursor(byte c); void termRepaint(void); void termResetSequence(void); void termScrollUp(void); @@ -47,7 +51,15 @@ void termUpdateColors(void); void termClearScreen(void) { - memset(_screenBuffer, 0, (size_t)(2 * _columns * _rows)); + int i = 0; + int x; + int y; + for (y=0; y<_rows; y++) { + for (x=0; x<_columns; x++) { + _screenBuffer[i].x = 0; + _screenBuffer[i].y = 0; + } + } } @@ -64,6 +76,11 @@ void termDebug(const char *what, ...) { } +void termDestruciveBackspace(bool dbs) { + _destructiveBS = dbs; +} + + void termGetCursor(int *x, int *y) { *x = _cursor.x; *y = _cursor.y; @@ -387,8 +404,21 @@ bool termParseANSI(char c) { break; case (char)8: case (char)127: - //***TODO*** Backspace - termDebug("Unimplemented backspace"); + // Backspace + if (cursor.x > 1) { + cursor.x--; + } else { + if (cursor.y > 1) { + termDebug("Cursor wrapped off left"); + cursor.y--; + cursor.x = _columns; + } + } + termMoveCursor(cursor.x, cursor.y); + if (_destructiveBS) { + termRenderCharacterAtCursor(' '); + updateDisplay = true; + } break; case (char)9: //***TODO*** TAB @@ -418,15 +448,17 @@ bool termParseANSI(char c) { break; default: updateDisplay = true; - termRenderCharacterAtCursor(c); + termRenderCharacterAtCursor((byte)c); if (_blink) { //***TODO*** Not handled } cursor.x++; if (cursor.x > _columns) { + termDebug("Cursor wrapped off right"); cursor.x = 1; cursor.y++; if (cursor.y > _rows) { + termDebug("Cursor went off bottom"); cursor.y--; termScrollUp(); } @@ -456,11 +488,13 @@ void termPrintChar(char c) { } -void termRenderCharacterAtCursor(char c) { +void termRenderCharacterAtCursor(byte c) { int r = (_reverse ? 7 : 0); int cx = c % 40; int cy = (c / 40) + r; - _screenBuffer[(_cursor.y * _columns) + _cursor.x] = (cy * 40) + cx; + int i = ((_cursor.y - 1) * _columns) + (_cursor.x - 1); + _screenBuffer[i].x = cx; + _screenBuffer[i].y = cy; jlDrawBlit8x8(_ansiFont, cx, cy, _cursor.x - 1 + _xoff, _cursor.y - 1 + _yoff); } @@ -471,7 +505,7 @@ void termRepaint(void) { int y; for (y=0; y<_rows; y++) { for (x=0; x<_columns; x++) { - jlDrawBlit8x8(_ansiFont, _screenBuffer[i] % 40, _screenBuffer[i] / 40, x, y); + jlDrawBlit8x8(_ansiFont, _screenBuffer[i].x, _screenBuffer[i].y, x, y); i++; } } @@ -498,11 +532,16 @@ void termSaveCursor(void) { void termScrollUp(void) { int x; + int c = _columns * (_rows - 1); int i = 0; int j = _columns; - for (x=0; x < (_rows - 1) * _columns; x++) { + for (x=0; x < c; x++) { _screenBuffer[i++] = _screenBuffer[j++]; } + for (x=0; x<_columns; x++) { + _screenBuffer[i].x = 32; + _screenBuffer[i++].y = 0; + } termRepaint(); } @@ -517,7 +556,8 @@ void termStart(jlStaT *font, int xoff, int yoff, int cols, int rows) { _cursorSave.y = 1; _cursor.x = 1; _cursor.y = 1; - _screenBuffer = (int *)jlMalloc((size_t)(2 * _columns * _rows)); + _screenBuffer = (Vector2T *)jlMalloc(sizeof(Vector2T) * (size_t)(_columns * _rows)); + termClearScreen(); } diff --git a/ansiterm.h b/ansiterm.h index e7a4dde..4519159 100644 --- a/ansiterm.h +++ b/ansiterm.h @@ -4,6 +4,7 @@ #include "joey.h" void termClearScreen(void); +void termDestruciveBackspace(bool dbs); void termGetCursor(int *x, int *y); void termMoveCursor(int x, int y); void termPrint(char *string); diff --git a/build-IIgs.sh b/build-IIgs.sh index be90dc8..f0962b2 100755 --- a/build-IIgs.sh +++ b/build-IIgs.sh @@ -1,15 +1,23 @@ -#!/bin/bash -ex +#!/bin/bash -e PROJECT=ifengine +DATA=(8x8thin.sta gamedata.z5) + +# --- HERE BE DRAGONS --- TARGET=${JOEY}/sdks/iix/IIgs/out/${PROJECT} GSTARGET=31:/out/${PROJECT} +AC=${JOEY}/sdks/iix/ac/ +IMPORT=/tmp/import.po if [ -d ${TARGET} ]; then rm -rf ${TARGET} fi mkdir -p ${TARGET} +rm JLSTATS || true +rm /tmp/import.po || true + cp -f ${JOEY}/dist/joey.h . CFILES=($(ls -1 *.c)) OFILES="" @@ -24,3 +32,17 @@ rm joey.h cp -f ${JOEY}/dist/IIgs/joeylib#b20000 ${JOEY}/sdks/iix/IIgs/Libraries/joeylib iix chtyp -t lib ${JOEY}/sdks/iix/IIgs/Libraries/joeylib iix -DKeepType=S16 link ${OFILES} 13:joeylib keep=${GSTARGET}/${PROJECT} + +${AC}/import.sh ${TARGET}/${PROJECT} S16 +for F in "${DATA[@]}"; do + ${AC}/import.sh ${F} BIN +done + +if [ -z $1 ]; then + pushd ${JOEY}/sdks/iix/gsplus + ./gsplus -config IIgsTest.cfg || true + popd + echo "" + ${AC}/export.sh JLSTATS + cat JLSTATS +fi diff --git a/joeyio.c b/joeyio.c index 40219ce..74b5b22 100644 --- a/joeyio.c +++ b/joeyio.c @@ -3,7 +3,10 @@ #include "ztypes.h" -static int head_col; +static int _cursorIndex = 0; +static int _cursorSize = 9; +static unsigned int _cursorTime = 0; +static byte _cursor[] = { 32, 176, 177, 178, 219, 178, 177, 176, 32 }; void clear_line(void) { @@ -72,95 +75,68 @@ void initialize_screen(void) { int input_character(int timeout) { char k = 0; (void)timeout; // In 1/10ths of a second - while (!jlKeyPressed() && !jlUtilMustExit()) { - //***TODO*** Animate cursor here? - } - if (jlKeyPressed()) { - while (jlKeyPressed()) { - // Wait for key to be released + if (!jlKeyPressed()) { + while (!jlKeyPressed() && !jlUtilMustExit()) { + // Animate cursor + if (_cursorTime != jlUtilTimer()) { + display_char(_cursor[_cursorIndex++]); + display_char(8); + if (_cursorIndex >= _cursorSize) { + _cursorIndex = 0; + } + _cursorTime = jlUtilTimer(); + } } - k = jlKeyRead(); - } else { + display_char(32); + display_char(8); + } + + while (jlKeyPressed() && !jlUtilMustExit()) { + // Wait for key to be released + } + k = jlKeyRead(); + + if (jlUtilMustExit() && (interpreter_state == RUN)) { interpreter_state = STOP; } + return (int)k; } int input_line(int buflen, char *buffer, int timeout, int *read_size) { - int c = -1; - int col; - int row; - int init_char_pos; - int curr_char_pos; - int loop; - int tail_col; - - (void)timeout; // In 1/10ths of a second - - get_cursor_position(&row, &col); - head_col = tail_col = col; - init_char_pos = curr_char_pos = *read_size; + int c = 0; + int curr_char_pos = 0; + (void)timeout; while (!jlUtilMustExit()) { c = input_character(0); - - if (c == 8) { - // Backspace - get_cursor_position(&row, &col); - if (col > head_col) { - move_cursor(row, --col); - for (loop = curr_char_pos; loop < *read_size; loop++) { - buffer[loop - 1] = buffer[loop]; - display_char(buffer[loop - 1]); - } - display_char(' '); - curr_char_pos--; - tail_col--; - (*read_size)--; - move_cursor(row, col); - } - } else { - // Normal key - if (*read_size == ( buflen - 1 )) { - //***TODO*** Buffer full - Flash border? - } else { - if (c == 13) { - // CR - scroll_line(); - return c; + if (c > 0) { + if (c == 8) { + // Backspace + if (*read_size == 0) { + //***TODO*** Flash border or ding or something } else { - // Used if the cursor is not at the end of the line - if (col < tail_col) { - // Moves the input line one character to the right - for (loop = *read_size; loop >= curr_char_pos; loop--) { - buffer[loop + 1] = buffer[loop]; - } - - // Puts the character into the space created by the "for" loop above - buffer[curr_char_pos] = (char)c; - - // Increment the end of the line values - (*read_size)++; - tail_col++; - - // Move the cursor back to its original position - move_cursor(row, col); - - // Redisplays the input line from the point of insertion - for (loop = curr_char_pos; loop < *read_size; loop++) { - display_char(buffer[loop]); - } - - // Moves the cursor to the next position - move_cursor(row, ++col); - curr_char_pos++; + --*read_size; + --curr_char_pos; + display_char(8); + display_char(32); + display_char(8); + } + } else { + // Normal Key + if (*read_size == (buflen - 1)) { + //***TODO*** Flash border or ding or something + } else { + if (c == 13) { + scroll_line(); + return c; } else { - // Used if the cursor is at the end of the line buffer[curr_char_pos++] = (char)c; + if (*read_size < curr_char_pos) { + *read_size = curr_char_pos; + } display_char(c); - (*read_size)++; - tail_col++; } } } diff --git a/main.c b/main.c index a78b30f..3ca3d3b 100644 --- a/main.c +++ b/main.c @@ -100,6 +100,7 @@ int main(void) { jlStaLoad(font, "8x8thin.sta"); termStart(font, 0, 0, 40, 25); + termDestruciveBackspace(false); process_arguments("gamedata.z5"); configure(V1, V8); @@ -114,8 +115,6 @@ int main(void) { termStop(); - jlDisplayPresent(); - jlKeyWaitForAny(); jlStaFree(font); jlUtilShutdown();