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:
parent
2d54c3243d
commit
c7d8de25b2
@ -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
|
||||||
|
@ -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 ;
|
||||||
|
@ -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!
|
||||||
;
|
;
|
||||||
|
@ -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! ;
|
|
||||||
|
@ -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 ;
|
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
: (emit)
|
|
||||||
DUP 0xd = IF DROP _lf EXIT THEN
|
|
||||||
DUP 0x20 0x7e =><= NOT IF DROP EXIT THEN
|
|
||||||
0x20 - FNTH * ~FNT + _glyph> ;
|
|
@ -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) _
|
||||||
|
3
blk/263
3
blk/263
@ -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 ;
|
||||||
|
1
blk/270
1
blk/270
@ -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
|
||||||
|
8
blk/402
8
blk/402
@ -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 ! ;
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user