diff --git a/kernel/ti/lcd.asm b/kernel/ti/lcd.asm index 353a31b..c2a33eb 100644 --- a/kernel/ti/lcd.asm +++ b/kernel/ti/lcd.asm @@ -10,6 +10,22 @@ ; Note that "X-increment" and "Y-increment" work in the opposite way than what ; most people expect. Y moves left and right, X moves up and down. ; +; *** Z-Offset *** +; +; This LCD has a "Z-Offset" parameter, allowing to offset rows on the +; screen however we wish. This is handy because it allows us to scroll more +; efficiently. Instead of having to copy the LCD ram around at each linefeed +; (or instead of having to maintain an in-memory buffer), we can use this +; feature. +; +; The Z-Offet goes upwards, with wrapping. For example, if we have an 8 pixels +; high line at row 0 and if our offset is 8, 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. +; ; *** Requirements *** ; fnt/mgm ; @@ -46,6 +62,10 @@ lcdInit: ; Clear screen call lcdClrScr + ; We begin with a Z offset of FNT_HEIGHT+1 + ld a, LCD_CMD_ZOFFSET+FNT_HEIGHT+1 + call lcdCmd + ; Enable the LCD ld a, LCD_CMD_ENABLE call lcdCmd @@ -156,18 +176,24 @@ lcdSendGlyph: lcdLinefeed: push af ld a, (LCD_CURROW) - add a, FNT_HEIGHT+1 - cp 64 - jr c, .nowrap ; A < 96? no wrap - ; we have to wrap around to the top row - xor a -.nowrap: + call .addFntH ld (LCD_CURROW), a call lcdClrLn + ; Now, lets set Z offset which is CURROW+FNT_HEIGHT+1 + call .addFntH + add a, LCD_CMD_ZOFFSET + call lcdCmd xor a ld (LCD_CURCOL), a pop af ret +.addFntH: + add a, FNT_HEIGHT+1 + cp 64 + ret c ; A < 64? no wrap + ; we have to wrap around + xor a + ret ; Clears B rows starting at row A ; B is not preserved by this routine