jmp entry

puts:
-- Write string to console
--  r2: [IN] *const u8  String pointer
--  r3: [IN] usize      String length

    li8     r1, 0x1         -- Write syscall
    brc     r2, r3, 2       -- Copy parameters
    li8     r2, 0x1         -- STDOUT
    eca

    jal     r0, r31, 0

gets:
-- Read string until end of buffer or LF
--  r2: [IN] *mut u8    Buffer
--  r3: [IN] usize      Buffer length

    -- Register allocations:
    --  r33: *mut u8    Buffer end
    --  r34: u8         Immediate char
    --  r35: u8         Const [0x0A = LF]

    li8     r35, 0x0A
    add64   r33, r2, r3

    -- Setup syscall
    li8     r2, 0x1         -- Stdin
    cp      r3, r2
    li8     r4, 0x1         -- Read one char

    jeq     r3, r33, end
    loop:
        li8     r1, 0x1     -- Read syscall
        eca
        addi64  r3, r3, 1
        ld      r34, r3, 0, 1
        jeq     r34, r35, end
        jne     r3, r33, loop
    
    end:
        -- Set copied amount
        sub64   r1, r33, r3
        addi64  r1, -1
        jal     r0, r31, 0

alloc-pages:
-- Allocate pages
--  r1: [OUT] *mut u8   Pointer to page
--  r2: [IN]  u16       Page count

    muli16  r3, r2, 4096    -- page count
    li8     r1, 0x9         -- mmap syscall
    li8     r2, 0x0         -- no address set, kernel chosen
    li8     r4, 0x2         -- PROT_WRITE
    li8     r5, 0x20        -- MAP_ANONYMOUS
    li64    r6, -1          -- Doesn't map file
    li8     r7, 0x0         -- Doesn't map file
    eca

    jal     r0, r31, 0

entry:
-- Program entrypoint

    -- Register allocations:
    -- r32: *mut u8     Buffer
    -- r36: usize       Read buffer length

    -- Allocate one page (4096 KiB)
    li8     r2, 1
    jal     r31, 0, alloc-pages
    cp      r32, r1

    -- Print message
    lra16   r2, r0, #enter-your-name
    li8     r3, 17
    jal     r31, r0, puts

    -- Read name
    cp      r2, r32
    li16    r3, 4096
    jal     r31, r0, gets
    cp      r36, r1

    -- Print your name is
    lra16   r2, r0, #your-name-is
    li8     r3, 15
    jal     r31, r0, puts

    -- And now print the name
    cp      r2, r32
    cp      r3, r36
    jal     r31, r0, puts

    tx

#enter-your-name: "Enter your name: "
#your-name-is   : "\nYour name is: "