Compare commits
16 commits
Author | SHA1 | Date | |
---|---|---|---|
118de2a37e | |||
f556bb56ac | |||
1ded3630f4 | |||
68cb60e342 | |||
3393d19cac | |||
23729438a2 | |||
b745c4621c | |||
81c505cd75 | |||
aa45a8eba4 | |||
f64528736b | |||
5dec93f774 | |||
3aef796bd5 | |||
c57f615e01 | |||
94c5192c92 | |||
a9c0cbeb8f | |||
642ba58eeb |
19
.github/workflows/c-cpp.yml
vendored
Normal file
19
.github/workflows/c-cpp.yml
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
name: Cee-lang CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: make
|
||||
run: make
|
||||
- name: example
|
||||
run: make example
|
7
Makefile
7
Makefile
|
@ -7,6 +7,7 @@ CLANG_FORMAT_STYLE = '{ BasedOnStyle: Google, IndentWidth: 4 }'
|
|||
|
||||
hbas: build/hbas
|
||||
example: build/example.hbf
|
||||
hello: build/hello.hbf
|
||||
|
||||
format:
|
||||
clang-format --style=${CLANG_FORMAT_STYLE} -i src/*
|
||||
|
@ -24,8 +25,12 @@ build/example.hbf: build build/hbas examples/example.S
|
|||
./build/hbas < examples/example.S > build/example.hbf
|
||||
xxd build/example.hbf
|
||||
|
||||
build/hello.hbf: build build/hbas examples/hello.S
|
||||
./build/hbas < examples/hello.S > build/hello.hbf
|
||||
xxd build/hello.hbf
|
||||
|
||||
clean:
|
||||
rm -rf build
|
||||
|
||||
all:
|
||||
hbas
|
||||
hbas
|
||||
|
|
103
examples/hello-name.S
Normal file
103
examples/hello-name.S
Normal file
|
@ -0,0 +1,103 @@
|
|||
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, 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, r0, 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:
|
||||
.db "Enter your name: "
|
||||
your_name_is:
|
||||
.db "\nYour name is: "
|
8
examples/hello.S
Normal file
8
examples/hello.S
Normal file
|
@ -0,0 +1,8 @@
|
|||
li8 r1, 1 ; 1->sys::write
|
||||
li8 r2, 1 ; fildes=stdout
|
||||
lra16 r3, r0, hello_string ; buf=hello_string
|
||||
li8 r4, 0x11 ; nbyte=0x11
|
||||
eca ; sys::write(stdout, hello_string, 0x11)
|
||||
tx
|
||||
hello_string:
|
||||
.db "Hello, AbleCorp!\n"
|
|
@ -8,7 +8,6 @@ AsmError push_string(char *buf, char *input, size_t len) {
|
|||
}
|
||||
pos += 1;
|
||||
chr = input[pos];
|
||||
size_t offset = 1;
|
||||
switch (chr) {
|
||||
case '\\':
|
||||
chr = '\\';
|
||||
|
@ -34,16 +33,15 @@ AsmError push_string(char *buf, char *input, size_t len) {
|
|||
}
|
||||
char high = get_hex(input[pos + 1]);
|
||||
char low = get_hex(input[pos + 2]);
|
||||
offset = 2;
|
||||
if (high > 15 || low > 15) {
|
||||
return ErrStringBadHex;
|
||||
}
|
||||
pos += 2;
|
||||
chr = high << 4 | low;
|
||||
break;
|
||||
default:
|
||||
return ErrBadStringEscape;
|
||||
}
|
||||
pos += offset;
|
||||
}
|
||||
buf[ndata] = chr;
|
||||
ndata += 1;
|
||||
|
|
|
@ -207,7 +207,7 @@ static AsmError assemble_instr(InstHt ht, char *input, size_t len, Token *tok,
|
|||
return ErrBadNumOverflow;
|
||||
}
|
||||
num_to_write = (uint64_t)tmp;
|
||||
} else if (meta.sign == 2 && (int)num_to_write < 0) {
|
||||
} else if (meta.sign == 2 && (int64_t)num_to_write < 0) {
|
||||
return ErrBadNumOverflow;
|
||||
}
|
||||
AsmError err = push_int_le(&rv->buf[rv->len], num_to_write,
|
||||
|
|
Loading…
Reference in a new issue