diff --git a/kernel/ti/lcd.asm b/kernel/ti/lcd.asm index 27eed83..748e281 100644 --- a/kernel/ti/lcd.asm +++ b/kernel/ti/lcd.asm @@ -35,35 +35,32 @@ lcdInit: xor a ld (LCD_CURROW), a + ; Clear screen + call lcdClrScr + ; Enable the LCD ld a, LCD_CMD_ENABLE - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ; Hack to get LCD to work. According to WikiTI, we're to sure why TIOS ; sends these, but it sends it, and it is required to make the LCD ; work. So... ld a, 0x17 - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ld a, 0x0b - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ; Set some usable contrast ld a, LCD_CMD_CONTRAST+0x34 - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ; Enable 6-bit mode. ld a, LCD_CMD_6BIT - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ; Enable X-increment mode ld a, LCD_CMD_XINC - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ret @@ -78,11 +75,23 @@ lcdWait: pop af ret +; Send cmd A to LCD +lcdCmd: + out (LCD_PORT_CMD), a + jr lcdWait + +; Send data A to LCD +lcdData: + out (LCD_PORT_DATA), a + jr lcdWait + ; Turn LCD off lcdOff: + push af ld a, LCD_CMD_DISABLE - call lcdWait + call lcdCmd out (LCD_PORT_CMD), a + pop af ret ; Set LCD's current column to A @@ -90,8 +99,7 @@ lcdSetCol: push af ; The col index specified in A is compounded with LCD_CMD_COL add a, LCD_CMD_COL - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd pop af ret @@ -100,8 +108,7 @@ lcdSetRow: push af ; The col index specified in A is compounded with LCD_CMD_COL add a, LCD_CMD_ROW - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd pop af ret @@ -120,26 +127,22 @@ lcdSendGlyph: .loop: ld a, (hl) inc hl - call lcdWait - out (LCD_PORT_DATA), a + call lcdData djnz .loop ; Now that we've sent our 7 rows of pixels, let's go in "Y-increment" ; mode to let the LCD increase by one column after we've sent our 8th ; line, which is blank (padding). ld a, LCD_CMD_YINC - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd ; send blank line xor a - call lcdWait - out (LCD_PORT_DATA), a + call lcdData ; go back in X-increment mode ld a, LCD_CMD_XINC - call lcdWait - out (LCD_PORT_CMD), a + call lcdCmd pop hl pop bc @@ -157,6 +160,49 @@ lcdLinefeed: pop af ret +; Clears B rows starting at row A +; The LCD will then be set back at row A, column 0 +; B is not preserved by this routine +lcdClrX: + push af + call lcdSetRow + ld a, LCD_CMD_8BIT + call lcdCmd +.outer: + push bc ; --> lvl 1 + ld b, 11 + ld a, LCD_CMD_YINC + call lcdCmd + xor a + call lcdSetCol +.inner: + call lcdData + djnz .inner + ld a, LCD_CMD_XINC + call lcdCmd + xor a + call lcdData + pop bc ; <-- lvl 1 + djnz .outer + ld a, LCD_CMD_6BIT + call lcdCmd + pop af + ret + +lcdClrLn: + push bc + ld b, FNT_HEIGHT+1 + call lcdClrX + pop bc + ret + +lcdClrScr: + push bc + ld b, 64 + call lcdClrX + pop bc + ret + lcdPutC: cp ASCII_LF jp z, lcdLinefeed