mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-09 03:38:06 +11:00
019d05f64c
That's my mega-commit you've all been waiting for. The code for the shell share more routines with userspace apps than with kernel units, because, well, its behavior is that of a userspace app, not a device driver. This created a weird situation with libraries and jump tables. Some routine belonging to the `kernel/` directory felt weird there. And then comes `apps/basic`, which will likely share even more code with the shell. I was seeing myself creating huge jump tables to reuse code from the shell. It didn't feel right. Moreover, we'll probably want basic-like apps to optionnally replace the shell. So here I am with this huge change in the project structure. I didn't test all recipes on hardware yet, I will do later. I might have broken some... But now, the structure feels better and the line between what belongs to `kernel` and what belongs to `apps` feels clearer.
71 lines
1.6 KiB
NASM
71 lines
1.6 KiB
NASM
; *** Requirements ***
|
|
; printnstr
|
|
;
|
|
; *** Variables ***
|
|
; Used to store formatted hex values just before printing it.
|
|
.equ STDIO_HEX_FMT STDIO_RAMSTART
|
|
.equ STDIO_RAMEND @+2
|
|
|
|
; *** Code ***
|
|
; Format the lower nibble of A into a hex char and stores the result in A.
|
|
fmtHex:
|
|
; The idea here is that there's 7 characters between '9' and 'A'
|
|
; in the ASCII table, and so we add 7 if the digit is >9.
|
|
; daa is designed for using Binary Coded Decimal format, where each
|
|
; nibble represents a single base 10 digit. If a nibble has a value >9,
|
|
; it adds 6 to that nibble, carrying to the next nibble and bringing the
|
|
; value back between 0-9. This gives us 6 of that 7 we needed to add, so
|
|
; then we just condtionally set the carry and add that carry, along with
|
|
; a number that maps 0 to '0'. We also need the upper nibble to be a
|
|
; set value, and have the N, C and H flags clear.
|
|
or 0xf0
|
|
daa ; now a =0x50 + the original value + 0x06 if >= 0xfa
|
|
add a, 0xa0 ; cause a carry for the values that were >=0x0a
|
|
adc a, 0x40
|
|
ret
|
|
|
|
; Formats value in A into a string hex pair. Stores it in the memory location
|
|
; that HL points to. Does *not* add a null char at the end.
|
|
fmtHexPair:
|
|
push af
|
|
|
|
; let's start with the rightmost char
|
|
inc hl
|
|
call fmtHex
|
|
ld (hl), a
|
|
|
|
; and now with the leftmost
|
|
dec hl
|
|
pop af
|
|
push af
|
|
rra \ rra \ rra \ rra
|
|
call fmtHex
|
|
ld (hl), a
|
|
|
|
pop af
|
|
ret
|
|
|
|
; Print the hex char in A
|
|
printHex:
|
|
push bc
|
|
push hl
|
|
ld hl, STDIO_HEX_FMT
|
|
call fmtHexPair
|
|
ld b, 2
|
|
call printnstr
|
|
pop hl
|
|
pop bc
|
|
ret
|
|
|
|
; Print the hex pair in HL
|
|
printHexPair:
|
|
push af
|
|
ld a, h
|
|
call printHex
|
|
ld a, l
|
|
call printHex
|
|
pop af
|
|
ret
|
|
|
|
|