~vdupras/duskos

66f0ce613a90556b4f87e203cb2c301159859553 — Virgil Dupras a month ago c3e4eea
lib/endian: new unit

See doc/lib/endian.
4 files changed, 77 insertions(+), 0 deletions(-)

A fs/doc/lib/endian.txt
A fs/lib/endian.fs
M fs/tests/lib/all.fs
A fs/tests/lib/endian.fs
A fs/doc/lib/endian.txt => fs/doc/lib/endian.txt +26 -0
@@ 0,0 1,26 @@
# Endian-ness management

This unit provides words to read and write numbers in an endian-ness that isn't
the native one (or simply alias to the native ones if it is).

At the moment, two endian-ness are supported, little-endian (LE) and big endian
(BE). Let's consider this memory arrangement:

A+0  A+1  A+2  A+3
$12  $34  $56  $78

When this memory is read as little endian, that is, the least significant byte
first, it reads as $78563412. When it's read as big endian, that is, the most
significant byte first, it reads as $12345678.

Words provided:

le@  a -- n   Little-endian fetch
le!  n a --   Little-endian store
be@  a -- n   Big-endian fetch
be!  n a --   Big-endian store

Each of these words have a 16-bit variant, so they can be called with a "16b"
modulator. They don't have a "8b" one because it makes no sense.

These words are implemented in HAL, so they're fast.

A fs/lib/endian.fs => fs/lib/endian.fs +32 -0
@@ 0,0 1,32 @@
\ Endian-ness convenience words
?f<< /asm/hal.fs

$1234 here ! here c@ $34 = const LITTLE_ENDIAN?

alias @ le@ :16b 16b @ ;
alias ! le! :16b 16b ! ;
LITTLE_ENDIAN? not [if] abort" TODO" [then]

alias @ be@ :16b 16b @ ;
alias ! be! :16b 16b ! ;
LITTLE_ENDIAN? [if]
  code be@ ( a -- n )
    W>A, A) 8b) @, 8 i) <<,
    A) 1 +) 8b) |, 8 i) <<,
    A) 2 +) 8b) |, 8 i) <<,
    A) 3 +) 8b) |, exit,

  code16b
    W>A, A) 8b) @, 8 i) <<,
    A) 1 +) 8b) |, exit,

  code be! ( n a -- )
    W>A, drop, A) 3 +) 8b) !, 8 i) >>,
    A) 2 +) 8b) !, 8 i) >>,
    A) 1 +) 8b) !, 8 i) >>,
    A) 8b) !, drop, exit,

  code16b
    W>A, drop, A) 1 +) 8b) !, 8 i) >>,
    A) 8b) !, drop, exit,
[then]
\ No newline at end of file

M fs/tests/lib/all.fs => fs/tests/lib/all.fs +1 -0
@@ 15,3 15,4 @@ f<< /tests/lib/stack.fs
f<< /tests/lib/tree.fs
f<< /tests/lib/fmt.fs
f<< /tests/lib/crc.fs
f<< /tests/lib/endian.fs

A fs/tests/lib/endian.fs => fs/tests/lib/endian.fs +18 -0
@@ 0,0 1,18 @@
?f<< /tests/harness.fs
?f<< /lib/endian.fs
testbegin
\ Endian-ness tests
create mynum 4 nc, $12 $34 $56 $78
mynum le@ $78563412 #eq
mynum 16b le@ $3412 #eq
mynum be@ $12345678 #eq
mynum 16b be@ $1234 #eq
$23456789 mynum le!
mynum be@ $89674523 #eq
0 mynum ! $2345 mynum 16b le!
mynum be@ $45230000 #eq
$23456789 mynum be!
mynum le@ $89674523 #eq
0 mynum ! $2345 mynum 16b be!
mynum le@ $4523 #eq
testend
\ No newline at end of file