From 2f1e635b9d361507c9c0b31d61d5ca0e64dc3aae Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 9 May 2020 08:50:55 -0400 Subject: [PATCH] ti84: tidy up driver code Pushed all words directly interfacing with ports and memory offsets to low level layers. This saves us the need for keeping those variables in runtime memory. --- blk/551 | 4 ++-- blk/552 | 4 ++-- blk/553 | 10 +++++----- blk/555 | 10 ++++------ blk/556 | 13 +++++++++---- blk/557 | 7 +------ recipes/ti84/xcomp.fs | 6 +++--- 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/blk/551 b/blk/551 index aa9b242..2eab1b7 100644 --- a/blk/551 +++ b/blk/551 @@ -1,7 +1,7 @@ TI-84+ LCD driver -Implement (emit) on TI-84+ (for now)'s LCD screen. Load with -"555 LOAD". +Implement (emit) on TI-84+ (for now)'s LCD screen. The low +level part are blocks 555-557 and high level ones are 558-560. The screen is 96x64 pixels. The 64 rows are addressed directly with CMD_ROW but columns are addressed in chunks of 6 or 8 bits diff --git a/blk/552 b/blk/552 index e26906a..7e46f42 100644 --- a/blk/552 +++ b/blk/552 @@ -12,5 +12,5 @@ that line will go up 8 pixels, wrapping itself to the bottom of the screen. The principle is this: The active line is always the bottom -one. Therefore, when active row is 0, Z is FNT_HEIGHT+1, when -row is 1, Z is (FNT_HEIGHT+1)*2, When row is 8, Z is 0. (cont.) +one. Therefore, when active row is 0, Z is FNTH+1, when row is +1, Z is (FNTH+1)*2, When row is 8, Z is 0. (cont.) diff --git a/blk/553 b/blk/553 index 3e1e8f7..e8e9659 100644 --- a/blk/553 +++ b/blk/553 @@ -8,9 +8,9 @@ only 16 characters per line, which is hardly usable. This is why we have this buffering system. How it works is that we're always in 8-bit mode and we hold the whole area (8 pixels -wide by FNT_HEIGHT high) in memory. When we want to put a glyph -to screen, we first read the contents of that area, then add -our new glyph, offsetted and masked, to that buffer, then push -the buffer back to the LCD. If the glyph is split, move to the -next area and finish the job. +wide by FNTH high) in memory. When we want to put a glyph to +screen, we first read the contents of that area, then add our +new glyph, offsetted and masked, to that buffer, then push the +buffer back to the LCD. If the glyph is split, move to the next +area and finish the job. (cont.) diff --git a/blk/555 b/blk/555 index a19b126..de38d2d 100644 --- a/blk/555 +++ b/blk/555 @@ -1,15 +1,13 @@ -( Required config: TI_MEM ) -: TI_MEM+ [ TI_MEM LITN ] @ + ; -TI_MEM : TI_MEM [ LITN ] ; -: LCD_PORT_CMD 0x10 ; : LCD_PORT_DATA 0x11 ; +( Required config: LCD_MEM ) +: _mem+ [ LCD_MEM LITN ] @ + ; : FNTW 3 ; : FNTH 5 ; ( 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 version is a bit heavy and we don't want to wait longer than we have to. ) -CODE LCDWAIT +CODE _wait BEGIN, - 0x10 INAn, + 0x10 ( CMD ) INAn, RLA, ( When 7th bit is clr, we can send a new cmd ) JRC, AGAIN, ;CODE diff --git a/blk/556 b/blk/556 index ca268ae..8de9f3b 100644 --- a/blk/556 +++ b/blk/556 @@ -1,8 +1,13 @@ ( Current Y position on the LCD, that is, where we're going to spit our next glyph. ) -: LCD_CURY 0 TI_MEM+ ; -: LCD_CURX 1 TI_MEM+ ; -( two pixel buffers that are 8 pixels wide (1b) by FNT_HEIGHT +: LCD_CURY 0 _mem+ ; +: LCD_CURX 1 _mem+ ; +( two pixel buffers that are 8 pixels wide (1b) by FNTH pixels high. This is where we compose our resulting pixels blocks when spitting a glyph. ) -: LCD_BUF 2 TI_MEM+ ; +: LCD_BUF 2 _mem+ ; +: _cmd 0x10 ( CMD ) PC! _wait ; +: _data! 0x11 ( DATA ) PC! _wait ; +: _data@ 0x11 ( DATA ) PC@ _wait ; +: LCDOFF 0x02 ( CMD_DISABLE ) _cmd ; +: LCDON 0x03 ( CMD_ENABLE ) _cmd ; diff --git a/blk/557 b/blk/557 index 046f63c..14cc84c 100644 --- a/blk/557 +++ b/blk/557 @@ -1,14 +1,9 @@ -: _cmd LCD_PORT_CMD PC! LCDWAIT ; -: _data! LCD_PORT_DATA PC! LCDWAIT ; -: _data@ LCD_PORT_DATA PC@ LCDWAIT ; -: LCDOFF 0x02 ( CMD_DISABLE ) _cmd ; -: LCDON 0x03 ( CMD_ENABLE ) _cmd ; : _yinc 0x07 _cmd ; : _xinc 0x05 _cmd ; : _zoff! ( off -- ) 0x40 + _cmd ; : _col! ( col -- ) 0x20 + _cmd ; : _row! ( row -- ) 0x80 + _cmd ; : LCD$ - H@ TI_MEM ! FNTH 2 * 2+ ALLOT + H@ [ LCD_MEM LITN ] ! FNTH 2 * 2+ ALLOT LCDON 0x01 ( 8-bit mode ) _cmd FNTH 1+ _zoff! ; diff --git a/recipes/ti84/xcomp.fs b/recipes/ti84/xcomp.fs index 6025228..a8533c5 100644 --- a/recipes/ti84/xcomp.fs +++ b/recipes/ti84/xcomp.fs @@ -1,6 +1,6 @@ 0x8000 CONSTANT RAMSTART 0xb000 CONSTANT RS_ADDR -RAMSTART 0x70 + CONSTANT TI_MEM +RAMSTART 0x70 + CONSTANT LCD_MEM 212 LOAD ( z80 assembler ) 262 LOAD ( xcomp ) 522 LOAD ( font compiler ) @@ -12,15 +12,15 @@ RAMSTART 0x70 + CONSTANT TI_MEM CURRENT @ XCURRENT ! 282 LOAD ( boot.z80 ) -555 LOAD ( ti.z80 ) 393 LOAD ( icore low ) +555 557 LOADR ( ti low ) 415 LOAD ( icore high ) (entry) ~FNT CPFNT3x5 (entry) _ ( Update LATEST ) PC ORG @ 8 + ! 422 437 XPACKR ( core ) -556 560 XPACKR ( ti ) +558 560 XPACKR ( ti high ) 438 446 XPACKR ( print fmt ) ," : _ LCD$ LIT< Hello (print) LIT< World! (print) BYE ; _ " ORG @ 256 /MOD 2 PC! 2 PC!