ti84: use Grid subsystem

Also, rename CLRLN to NEWLN and make it clear that it's only called
on entering a new line. This way, we can set Z offset in there for
the TI-84+ LCD driver.
This commit is contained in:
Virgil Dupras 2020-11-10 20:30:37 -05:00
parent 2d54c3243d
commit c7d8de25b2
11 changed files with 39 additions and 35 deletions

View File

@ -1,6 +1,7 @@
( Required config: LCD_MEM ) ( Required config: LCD_MEM )
: _mem+ [ LCD_MEM LITN ] @ + ; : _mem+ [ LCD_MEM LITN ] @ + ;
: FNTW 3 ; : FNTH 5 ; : FNTW 3 ; : FNTH 5 ;
: COLS 96 FNTW 1+ / ; : LINES 64 FNTH 1+ / ;
( Wait until the lcd is ready to receive a command. It's a bit ( Wait until the lcd is ready to receive a command. It's a bit
weird to implement a waiting routine in asm, but the forth weird to implement a waiting routine in asm, but the forth
version is a bit heavy and we don't want to wait longer than version is a bit heavy and we don't want to wait longer than

View File

@ -1,11 +1,7 @@
( Current Y position on the LCD, that is, where we're going to
spit our next glyph. )
: LCD_CURY 0 _mem+ ;
: LCD_CURX 1 _mem+ ;
( two pixel buffers that are 8 pixels wide (1b) by FNTH ( two pixel buffers that are 8 pixels wide (1b) by FNTH
pixels high. This is where we compose our resulting pixels pixels high. This is where we compose our resulting pixels
blocks when spitting a glyph. ) blocks when spitting a glyph. )
: LCD_BUF 2 _mem+ ; : LCD_BUF 0 _mem+ ;
: _cmd 0x10 ( CMD ) PC! _wait ; : _cmd 0x10 ( CMD ) PC! _wait ;
: _data! 0x11 ( DATA ) PC! _wait ; : _data! 0x11 ( DATA ) PC! _wait ;
: _data@ 0x11 ( DATA ) PC@ _wait ; : _data@ 0x11 ( DATA ) PC@ _wait ;

View File

@ -3,7 +3,7 @@
: _col! ( col -- ) 0x20 + _cmd ; : _col! ( col -- ) 0x20 + _cmd ;
: _row! ( row -- ) 0x80 + _cmd ; : _row! ( row -- ) 0x80 + _cmd ;
: LCD$ : LCD$
H@ [ LCD_MEM LITN ] ! FNTH 2 * 2+ ALLOT H@ [ LCD_MEM LITN ] ! FNTH 2 * ALLOT
LCDON 0x01 ( 8-bit mode ) _cmd LCDON 0x01 ( 8-bit mode ) _cmd
FNTH 1+ _zoff! FNTH 1+ _zoff!
; ;

View File

@ -5,10 +5,7 @@
11 0 DO 0 _data! LOOP 11 0 DO 0 _data! LOOP
_xinc 0 _data! _xinc 0 _data!
LOOP ; LOOP ;
: _clrln ( n ) FNTH 1+ _clrrows ; : NEWLN ( ln -- )
DUP 1+ FNTH 1+ * _zoff!
FNTH 1+ * FNTH 1+ _clrrows ;
: LCDCLR 0 64 _clrrows ; : LCDCLR 0 64 _clrrows ;
( Changes the current line and go back to leftmost column )
: _lf
LCD_CURY C@ FNTH 1+ + DUP 63 > IF DROP 0 THEN
DUP _clrln DUP FNTH 1+ + _zoff!
LCD_CURY C! 0 LCD_CURX C! ;

View File

@ -1,15 +1,16 @@
: _glyph> ( a -- ) : _atrow! ( pos -- ) COLS / FNTH 1+ * _row! ;
LCD_CURY C@ _row! LCD_CURX C@ 8 /MOD _col! ( a coff ) : _tocol ( pos -- col off ) COLS MOD FNTW 1+ * 8 /MOD ;
_xinc _data@ DROP SWAP : CELL! ( g pos -- )
FNTH 0 DO ( coff a ) DUP _atrow! DUP _tocol _col! ROT ( pos coff g )
FNTH * ~FNT + ( pos coff a )
_xinc _data@ DROP
FNTH 0 DO ( pos coff a )
C@+ 2 PICK 8 -^ LSHIFT C@+ 2 PICK 8 -^ LSHIFT
_data@ 8 LSHIFT OR _data@ 8 LSHIFT OR
LCD_BUF I + 2DUP FNTH + C! LCD_BUF I + 2DUP FNTH + C!
SWAP 8 RSHIFT SWAP C! SWAP 8 RSHIFT SWAP C!
LOOP 2DROP LOOP 2DROP
LCD_CURY C@ _row! DUP _atrow!
FNTH 0 DO LCD_BUF I + C@ _data! LOOP FNTH 0 DO LCD_BUF I + C@ _data! LOOP
LCD_CURY C@ _row! LCD_CURX C@ 8 / 1+ _col! DUP _atrow! _tocol NIP 1+ _col!
FNTH 0 DO LCD_BUF FNTH + I + C@ _data! LOOP FNTH 0 DO LCD_BUF FNTH + I + C@ _data! LOOP ;
LCD_CURX C@ FNTW + 1+ DUP LCD_CURX C! ( x )
96 FNTW - > IF _lf THEN ;

View File

@ -1,4 +0,0 @@
: (emit)
DUP 0xd = IF DROP _lf EXIT THEN
DUP 0x20 0x7e =><= NOT IF DROP EXIT THEN
0x20 - FNTH * ~FNT + _glyph> ;

View File

@ -3,7 +3,8 @@
RS_ADDR 0x80 - CONSTANT SYSVARS RS_ADDR 0x80 - CONSTANT SYSVARS
0x8000 CONSTANT HERESTART 0x8000 CONSTANT HERESTART
SYSVARS 0x70 + CONSTANT LCD_MEM SYSVARS 0x70 + CONSTANT LCD_MEM
SYSVARS 0x72 + CONSTANT KBD_MEM SYSVARS 0x72 + CONSTANT GRID_MEM
SYSVARS 0x74 + CONSTANT KBD_MEM
0x01 CONSTANT KBD_PORT 0x01 CONSTANT KBD_PORT
5 LOAD ( z80 assembler ) 5 LOAD ( z80 assembler )
: ZFILL, ( u ) 0 DO 0 A, LOOP ; : ZFILL, ( u ) 0 DO 0 A, LOOP ;
@ -64,7 +65,8 @@ CURRENT @ XCURRENT !
283 335 LOADR ( boot.z80 ) 283 335 LOADR ( boot.z80 )
353 LOAD ( xcomp core low ) 353 LOAD ( xcomp core low )
CREATE ~FNT CPFNT3x5 CREATE ~FNT CPFNT3x5
605 610 LOADR ( LCD low ) 605 609 LOADR ( LCD low )
402 403 LOADR ( Grid )
616 620 LOADR ( KBD low ) 616 620 LOADR ( KBD low )
390 LOAD ( xcomp core high ) 390 LOAD ( xcomp core high )
(entry) _ (entry) _

View File

@ -7,7 +7,8 @@ CREATE XCURRENT 0 ,
DUP ORG @ > IF ORG @ - BIN( @ + THEN ; DUP ORG @ > IF ORG @ - BIN( @ + THEN ;
: XFIND XCURRENT @ SWAP _find DROP _xapply ; : XFIND XCURRENT @ SWAP _find DROP _xapply ;
: XLITN LIT" (n)" XFIND , , ; : XLITN LIT" (n)" XFIND , , ;
: X' XCON ' XCOFF ; : X['] XCON ' _xapply XLITN XCOFF ; : X' XCON ' XCOFF ; : X'? XCON '? XCOFF ;
: X['] XCON ' _xapply XLITN XCOFF ;
: XCOMPILE XCON ' _xapply XLITN : XCOMPILE XCON ' _xapply XLITN
LIT" ," FIND DROP _xapply , XCOFF ; LIT" ," FIND DROP _xapply , XCOFF ;
: X[COMPILE] XCON ' _xapply , XCOFF ; : X[COMPILE] XCON ' _xapply , XCOFF ;

View File

@ -1,4 +1,5 @@
: CODE XCODE ; : CODE XCODE ;
: '? X'? ;
: ['] X['] ; IMMEDIATE : ['] X['] ; IMMEDIATE
: COMPILE XCOMPILE ; IMMEDIATE : COMPILE XCOMPILE ; IMMEDIATE
: [COMPILE] X[COMPILE] ; IMMEDIATE : [COMPILE] X[COMPILE] ; IMMEDIATE

View File

@ -1,11 +1,11 @@
: XYPOS [ GRID_MEM LITN ] ; : XYPOS [ GRID_MEM LITN ] ;
: _cl* COLS LINES * ; : _cl* COLS LINES * ;
: AT-XY ( x y -- ) LINES * + _cl* MOD XYPOS ! ; : AT-XY ( x y -- ) LINES * + _cl* MOD XYPOS ! ;
'? CLRLN NIP NOT [IF] '? NEWLN NIP NOT [IF]
: CLRLN ( ln -- ) COLS * DUP COLS + SWAP DO 0 I CELL! LOOP ; : NEWLN ( ln -- ) COLS * DUP COLS + SWAP DO 0 I CELL! LOOP ;
[THEN] [THEN]
: _lf : _lf
XYPOS @ COLS / 1+ DUP CLRLN XYPOS @ COLS / 1+ LINES MOD DUP NEWLN
COLS * _cl* MOD XYPOS ! ; COLS * XYPOS ! ;
: _bs 0 ( blank ) XYPOS @ TUCK CELL! ( pos ) 1- : _bs 0 ( blank ) XYPOS @ TUCK CELL! ( pos ) 1-
_cl* MOD XYPOS ! ; _cl* MOD XYPOS ! ;

View File

@ -47,7 +47,7 @@ LINES -- n Number of lines in the device
CELL! g pos -- Set glyph at pos CELL! g pos -- Set glyph at pos
Optional: Optional:
CLRLN ln -- Clear line number ln. NEWLN ln -- "Enter" line ln
"pos" is a simple number (y * cols) + x. For example, if we "pos" is a simple number (y * cols) + x. For example, if we
have 40 columns per line, the position (x, y) (12, 10) is 412. have 40 columns per line, the position (x, y) (12, 10) is 412.
@ -57,6 +57,15 @@ number of glyphs in the font, it's up to CELL! to ignore it.
Glyph 0 is always blank. Glyph 0 is always blank.
If CLRLN is not defined, the grid system uses multiple CELL! NEWLN is called when we "enter" a new line, that is, when we
overflow from previous line or when 0x0d ( ASCII CR ) is emit-
ted.
When this is called, the line being entered should be cleared
of its contents. On some systems, some kinf of screen offset
might be have to be set to give a "scrolling" effect. Now's the
time.
If it's not defined, the grid system uses multiple CELL!
calls to clear it. On some devices, this is highly inefficient. calls to clear it. On some devices, this is highly inefficient.
Drivers for those devices should define CLRLN. Drivers for those devices should define NEWLINE.