mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-27 12:18:07 +11:00
recipes/ti84: first step
This was mostly lifted from my "tihello" example, but it required significant adjustments. This commit also introduces a font management system. A lot of fonts are available online, but sources aren't always clear so to avoid copyright landmines, I re-created my first 5x7 font from scratch. As it is now, this resulting ROM gets "Collapse OS>" to be displayed on the LCD screen. Much work still left to do. ref #41
This commit is contained in:
parent
69daf49920
commit
ca84b5dac8
658
fonts/5x7.txt
Normal file
658
fonts/5x7.txt
Normal file
@ -0,0 +1,658 @@
|
|||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
...
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
|
||||||
|
..
|
||||||
|
. .
|
||||||
|
..
|
||||||
|
.. .
|
||||||
|
. .
|
||||||
|
... .
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
. . .
|
||||||
|
...
|
||||||
|
.....
|
||||||
|
...
|
||||||
|
. . .
|
||||||
|
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.....
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
..
|
||||||
|
..
|
||||||
|
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. ..
|
||||||
|
. . .
|
||||||
|
.. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
..
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
....
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
..
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
..
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
..
|
||||||
|
.
|
||||||
|
..
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
|
||||||
|
.....
|
||||||
|
|
||||||
|
.....
|
||||||
|
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
..
|
||||||
|
.
|
||||||
|
..
|
||||||
|
..
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. ..
|
||||||
|
. ..
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
. ..
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
..
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
..
|
||||||
|
.
|
||||||
|
..
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
.. ..
|
||||||
|
. . .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.. .
|
||||||
|
.. .
|
||||||
|
. . .
|
||||||
|
. ..
|
||||||
|
. ..
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. . .
|
||||||
|
. ..
|
||||||
|
....
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
...
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. . .
|
||||||
|
. . .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
. ..
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
..
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
..
|
||||||
|
.
|
||||||
|
..
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
.. ..
|
||||||
|
. . .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.. .
|
||||||
|
.. .
|
||||||
|
. . .
|
||||||
|
. ..
|
||||||
|
. ..
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. . .
|
||||||
|
. ..
|
||||||
|
....
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
....
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
...
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
.....
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
...
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.. ..
|
||||||
|
. . .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.....
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
.....
|
||||||
|
..
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
..
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
..
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
..
|
||||||
|
|
||||||
|
|
||||||
|
. .
|
||||||
|
. .
|
||||||
|
|
||||||
|
|
||||||
|
|
15
fonts/README.md
Normal file
15
fonts/README.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# fonts
|
||||||
|
|
||||||
|
This folder contains bitmap fonts that are then converted to ASM data tables.
|
||||||
|
|
||||||
|
The format for them is straightforward: dots and spaces. Each line is a line in
|
||||||
|
the letter (for example, in a 6x8 font, each character is 8 lines of 6
|
||||||
|
characters each, excluding newline).
|
||||||
|
|
||||||
|
They cover the 0x21 to 0x7e range and are placed sequentially in the file.
|
||||||
|
|
||||||
|
Dots and spaces allow easy visualisation of the result and is thus rather handy.
|
||||||
|
|
||||||
|
Padding is excluded from fonts. For example, 5x7.txt is actually a 6x8 font, but
|
||||||
|
because characters are always padded, it's useless to keep systematic blank
|
||||||
|
lines or rows around.
|
BIN
kernel/fnt/5x7.bin
Normal file
BIN
kernel/fnt/5x7.bin
Normal file
Binary file not shown.
32
kernel/fnt/mgm.asm
Normal file
32
kernel/fnt/mgm.asm
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
; Font management
|
||||||
|
;
|
||||||
|
; There can only ever be one active font.
|
||||||
|
;
|
||||||
|
; *** Defines ***
|
||||||
|
; FNT_DATA: Pointer to the beginning of the binary font data to work with.
|
||||||
|
; FNT_WIDTH: Width of the font.
|
||||||
|
; FNT_HEIGHT: Height of the font.
|
||||||
|
;
|
||||||
|
; *** Code ***
|
||||||
|
|
||||||
|
; If A is in the range 0x20-0x7e, make HL point to the beginning of the
|
||||||
|
; corresponding glyph and set Z to indicate success.
|
||||||
|
; If A isn't in the range, do nothing and unset Z.
|
||||||
|
fntGet:
|
||||||
|
cp 0x20
|
||||||
|
ret c ; A < 0x20. Z was unset by cp
|
||||||
|
cp 0x7f
|
||||||
|
jr nc, unsetZ ; A >= 0x7f. Z might be set
|
||||||
|
|
||||||
|
push af ; --> lvl 1
|
||||||
|
push bc ; --> lvl 2
|
||||||
|
sub 0x20
|
||||||
|
ld hl, FNT_DATA
|
||||||
|
ld b, FNT_HEIGHT
|
||||||
|
.loop:
|
||||||
|
call addHL
|
||||||
|
djnz .loop
|
||||||
|
pop bc ; <-- lvl 2
|
||||||
|
pop af ; <-- lvl 1
|
||||||
|
cp a ; set Z
|
||||||
|
ret
|
27
kernel/ti/kbd.asm
Normal file
27
kernel/ti/kbd.asm
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
; kbd
|
||||||
|
;
|
||||||
|
; Control TI-84+'s keyboard.
|
||||||
|
;
|
||||||
|
; *** Constants ***
|
||||||
|
.equ KBD_PORT 0x01
|
||||||
|
|
||||||
|
; *** Code ***
|
||||||
|
; Sending 0xff to the port resets the keyboard, and then we have to send groups
|
||||||
|
; we want to "listen" to, with a 0 in the group bit. Thus, to know if *any* key
|
||||||
|
; is pressed, we send 0xff to reset the keypad, then 0x00 to select all groups,
|
||||||
|
; if the result isn't 0xff, at least one key is pressed.
|
||||||
|
waitForKey:
|
||||||
|
push af
|
||||||
|
|
||||||
|
ld a, 0xff
|
||||||
|
out (KBD_PORT), a
|
||||||
|
ld a, 0x00
|
||||||
|
out (KBD_PORT), a
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
in a, (KBD_PORT)
|
||||||
|
inc a ; if a was 0xff, will become 0 (z test)
|
||||||
|
jr z, .loop ; zero? nothing pressed
|
||||||
|
|
||||||
|
pop af
|
||||||
|
ret
|
139
kernel/ti/lcd.asm
Normal file
139
kernel/ti/lcd.asm
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
; lcd
|
||||||
|
;
|
||||||
|
; Implement PutC on TI-84+ (for now)'s LCD screen.
|
||||||
|
;
|
||||||
|
; *** Requirements ***
|
||||||
|
; fnt/mgm
|
||||||
|
;
|
||||||
|
; *** Constants ***
|
||||||
|
.equ LCD_PORT_CMD 0x10
|
||||||
|
.equ LCD_PORT_DATA 0x11
|
||||||
|
|
||||||
|
.equ LCD_CMD_6BIT 0x00
|
||||||
|
.equ LCD_CMD_DISABLE 0x02
|
||||||
|
.equ LCD_CMD_ENABLE 0x03
|
||||||
|
.equ LCD_CMD_XINC 0x05
|
||||||
|
.equ LCD_CMD_YINC 0x07
|
||||||
|
.equ LCD_CMD_COL 0x20
|
||||||
|
.equ LCD_CMD_ROW 0x80
|
||||||
|
.equ LCD_CMD_CONTRAST 0xc0
|
||||||
|
|
||||||
|
; *** Code ***
|
||||||
|
lcdInit:
|
||||||
|
; Enable the LCD
|
||||||
|
ld a, LCD_CMD_ENABLE
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
|
||||||
|
; 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
|
||||||
|
ld a, 0x0b
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
|
||||||
|
; Set some usable contrast
|
||||||
|
ld a, LCD_CMD_CONTRAST+0x34
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
|
||||||
|
; Enable 6-bit mode.
|
||||||
|
ld a, LCD_CMD_6BIT
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
|
||||||
|
; Enable X-increment mode
|
||||||
|
ld a, LCD_CMD_XINC
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Wait until the lcd is ready to receive a command
|
||||||
|
lcdWait:
|
||||||
|
push af
|
||||||
|
.loop:
|
||||||
|
in a, (LCD_PORT_CMD)
|
||||||
|
; When 7th bit is cleared, we can send a new command
|
||||||
|
rla
|
||||||
|
jr c, .loop
|
||||||
|
pop af
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Turn LCD off
|
||||||
|
lcdOff:
|
||||||
|
ld a, LCD_CMD_DISABLE
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Set LCD's current column to A
|
||||||
|
lcdSetCol:
|
||||||
|
; The col index specified in A is compounded with LCD_CMD_COL
|
||||||
|
add a, LCD_CMD_COL
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Set LCD's current row to A
|
||||||
|
lcdSetRow:
|
||||||
|
; The col index specified in A is compounded with LCD_CMD_COL
|
||||||
|
add a, LCD_CMD_ROW
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Send the 5x7 glyph that HL points to to the LCD, at its current position.
|
||||||
|
; After having called this, the LCD's position will have advanced by one
|
||||||
|
; position
|
||||||
|
lcdSendGlyph:
|
||||||
|
push af
|
||||||
|
push bc
|
||||||
|
push hl
|
||||||
|
|
||||||
|
; For the purpose of this program, we only write on the first line.
|
||||||
|
; We can assume that we always start at row 0.
|
||||||
|
xor a
|
||||||
|
call lcdSetRow
|
||||||
|
|
||||||
|
ld b, 7
|
||||||
|
.loop:
|
||||||
|
ld a, (hl)
|
||||||
|
inc hl
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_DATA), a
|
||||||
|
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
|
||||||
|
|
||||||
|
; send blank line
|
||||||
|
xor a
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_DATA), a
|
||||||
|
|
||||||
|
; go back in X-increment mode
|
||||||
|
ld a, LCD_CMD_XINC
|
||||||
|
call lcdWait
|
||||||
|
out (LCD_PORT_CMD), a
|
||||||
|
|
||||||
|
pop hl
|
||||||
|
pop bc
|
||||||
|
pop af
|
||||||
|
ret
|
||||||
|
|
||||||
|
lcdPutC:
|
||||||
|
push hl
|
||||||
|
call fntGet
|
||||||
|
jr nz, .end
|
||||||
|
call lcdSendGlyph
|
||||||
|
.end:
|
||||||
|
pop hl
|
||||||
|
ret
|
2
recipes/.gitignore
vendored
2
recipes/.gitignore
vendored
@ -2,3 +2,5 @@
|
|||||||
*.cfs
|
*.cfs
|
||||||
*.hex
|
*.hex
|
||||||
*.obj
|
*.obj
|
||||||
|
*.rom
|
||||||
|
*.sms
|
||||||
|
10
recipes/ti84/Makefile
Normal file
10
recipes/ti84/Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
TARGET = os.rom
|
||||||
|
ZASM = ../../tools/zasm.sh
|
||||||
|
KERNEL = ../../kernel
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: $(TARGET)
|
||||||
|
$(TARGET): glue.asm
|
||||||
|
$(ZASM) $(KERNEL) < $< > $@
|
||||||
|
truncate -s 1M $@
|
||||||
|
|
32
recipes/ti84/README.md
Normal file
32
recipes/ti84/README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# TI-84+
|
||||||
|
|
||||||
|
**This is a work-in-progress, this is far from complete.**
|
||||||
|
|
||||||
|
## Recipe
|
||||||
|
|
||||||
|
This recipe gets the Collapse OS shell to run on the TI-84+, using its LCD
|
||||||
|
screen as output and its builtin keyboard as input.
|
||||||
|
|
||||||
|
## Build the ROM
|
||||||
|
|
||||||
|
Running `make` will result in `os.rom` being created.
|
||||||
|
|
||||||
|
## Emulate through z80e
|
||||||
|
|
||||||
|
[KnightOS][knightos] has a handy emulator, [z80e][z80e] for TI calculators and
|
||||||
|
it also emulates the screen. It is recommended to use this tool.
|
||||||
|
|
||||||
|
Once z80e is installed (build it with SDL support) and `os.rom` is created,
|
||||||
|
you can run the emulator with:
|
||||||
|
|
||||||
|
z80e-sdl -d TI84p --no-rom-check os.rom
|
||||||
|
|
||||||
|
You will start with a blank screen, it's normal, you haven't pressed the "ON"
|
||||||
|
key yet. This key is mapped to F12 in the emulator. Once you press it, the
|
||||||
|
Collapse OS prompt will appear.
|
||||||
|
|
||||||
|
**WIP: the keyboard does nothing else than halting the CPU for now.**
|
||||||
|
|
||||||
|
## Upload to the calculator
|
||||||
|
|
||||||
|
TODO
|
96
recipes/ti84/glue.asm
Normal file
96
recipes/ti84/glue.asm
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
.equ RAMSTART 0x8000
|
||||||
|
.equ RAMEND 0xbfff
|
||||||
|
.equ PORT_INT_MASK 0x03
|
||||||
|
.equ INT_MASK_ON 0x00
|
||||||
|
.equ PORT_INT_TRIG 0x04
|
||||||
|
.equ INT_TRIG_ON 0x00
|
||||||
|
.equ PORT_BANKB 0x07
|
||||||
|
|
||||||
|
jp boot
|
||||||
|
|
||||||
|
.fill 0x18-$
|
||||||
|
jp boot ; reboot
|
||||||
|
|
||||||
|
.fill 0x38-$
|
||||||
|
jp handleInterrupt
|
||||||
|
|
||||||
|
.fill 0x53-$
|
||||||
|
jp boot
|
||||||
|
; 0x0056
|
||||||
|
.db 0xFF, 0xA5, 0xFF
|
||||||
|
|
||||||
|
.fill 0x64-$
|
||||||
|
|
||||||
|
.inc "err.h"
|
||||||
|
.inc "core.asm"
|
||||||
|
.equ FNT_WIDTH 5
|
||||||
|
.equ FNT_HEIGHT 7
|
||||||
|
.inc "fnt/mgm.asm"
|
||||||
|
.inc "ti/lcd.asm"
|
||||||
|
.inc "ti/kbd.asm"
|
||||||
|
.equ STDIO_RAMSTART RAMSTART
|
||||||
|
.equ STDIO_GETC GetC
|
||||||
|
.equ STDIO_PUTC lcdPutC
|
||||||
|
.inc "stdio.asm"
|
||||||
|
|
||||||
|
.inc "parse.asm"
|
||||||
|
.equ SHELL_RAMSTART STDIO_RAMEND
|
||||||
|
.equ SHELL_EXTRA_CMD_COUNT 0
|
||||||
|
.inc "shell.asm"
|
||||||
|
|
||||||
|
boot:
|
||||||
|
di
|
||||||
|
ld hl, RAMEND
|
||||||
|
ld sp, hl
|
||||||
|
im 1
|
||||||
|
|
||||||
|
; enable ON key interrupt
|
||||||
|
in a, (PORT_INT_MASK)
|
||||||
|
set INT_MASK_ON, a
|
||||||
|
out (PORT_INT_MASK), a
|
||||||
|
ld a, 0x80
|
||||||
|
out (PORT_BANKB), a
|
||||||
|
|
||||||
|
ei
|
||||||
|
|
||||||
|
call lcdOff
|
||||||
|
|
||||||
|
; sleep until we press ON
|
||||||
|
halt
|
||||||
|
|
||||||
|
main:
|
||||||
|
call lcdInit
|
||||||
|
xor a
|
||||||
|
call lcdSetCol
|
||||||
|
call shellInit
|
||||||
|
jp shellLoop
|
||||||
|
|
||||||
|
GetC:
|
||||||
|
call waitForKey
|
||||||
|
jr boot
|
||||||
|
|
||||||
|
handleInterrupt:
|
||||||
|
di
|
||||||
|
push af
|
||||||
|
|
||||||
|
; did we push the ON button?
|
||||||
|
in a, (PORT_INT_TRIG)
|
||||||
|
bit INT_TRIG_ON, a
|
||||||
|
jp z, .done ; no? we're done
|
||||||
|
|
||||||
|
; yes? acknowledge and boot
|
||||||
|
in a, (PORT_INT_MASK)
|
||||||
|
res INT_MASK_ON, a ; acknowledge interrupt
|
||||||
|
out (PORT_INT_MASK), a
|
||||||
|
|
||||||
|
pop af
|
||||||
|
ei
|
||||||
|
jp main
|
||||||
|
|
||||||
|
.done:
|
||||||
|
pop af
|
||||||
|
ei
|
||||||
|
reti
|
||||||
|
|
||||||
|
FNT_DATA:
|
||||||
|
.bin "fnt/5x7.bin"
|
30
tools/font_compile.pl
Executable file
30
tools/font_compile.pl
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
# This script converts "space-dot" fonts to binary "glyph rows". One byte for
|
||||||
|
# each row. In a 5x7 font, each glyph thus use 7 bytes.
|
||||||
|
|
||||||
|
my $fn = @ARGV[0];
|
||||||
|
unless ($fn =~ /.*(\d)x(\d)\.txt/) { die "$fn isn't a font filename" };
|
||||||
|
my ($width, $height) = ($1, $2);
|
||||||
|
|
||||||
|
print STDERR "Reading a $width x $height font.\n";
|
||||||
|
|
||||||
|
my $handle;
|
||||||
|
unless (open($handle, '<', $fn)) { die "Can't open $fn"; }
|
||||||
|
|
||||||
|
# We start the binary data with our first char, space, which is not in our input
|
||||||
|
# but needs to be in our output.
|
||||||
|
print pack('C*', (0) x $height);
|
||||||
|
|
||||||
|
while (<$handle>) {
|
||||||
|
unless (/( |\.){${width}}\n/) { die "Invalid line format '$_'"; }
|
||||||
|
my @line = split //, $_;
|
||||||
|
my $num = 0;
|
||||||
|
for (my $i=$width-1; $i>=0; $i--) {
|
||||||
|
if (@line[$width-$i-1] eq '.') {
|
||||||
|
$num += (1 << $i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf pack('C', $num);
|
||||||
|
}
|
@ -13,6 +13,7 @@ INCCFS=$(mktemp)
|
|||||||
for p in "$@"; do
|
for p in "$@"; do
|
||||||
"${CFSPACK}" "${p}" "*.h" >> "${INCCFS}"
|
"${CFSPACK}" "${p}" "*.h" >> "${INCCFS}"
|
||||||
"${CFSPACK}" "${p}" "*.asm" >> "${INCCFS}"
|
"${CFSPACK}" "${p}" "*.asm" >> "${INCCFS}"
|
||||||
|
"${CFSPACK}" "${p}" "*.bin" >> "${INCCFS}"
|
||||||
done
|
done
|
||||||
|
|
||||||
"${ZASMBIN}" "${INCCFS}"
|
"${ZASMBIN}" "${INCCFS}"
|
||||||
|
Loading…
Reference in New Issue
Block a user