First hello world

This commit is contained in:
neauoire 2021-02-05 14:01:34 -08:00
parent 1e0d5bbf50
commit 2b1d44e862
4 changed files with 40 additions and 23 deletions

View File

@ -28,22 +28,30 @@ cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn
- `"hello`, push literal bytes for word "hello" - `"hello`, push literal bytes for word "hello"
``` ```
;value ( alloc a zero-page variable ) ( hello world )
@0010 ( start at page 1 ) ;iterator
:dev1r FFF0
:dev1w FFF1
,03 ,02 ADD ,05 EQU |0100 @RESET
,there ROT JMC
:here "hello
( when not equal )
,ee @loop
BRK ,dev1w STR
,iterator LDR
,01 ADD
,iterator STR
,iterator LDR
,05 NEQ ,loop ROT JSC
BRK ( RESET )
|c000 @FRAME BRK
|d000 @ERROR BRK
|FFFA .RESET .FRAME .ERROR
:there
( when is equal )
,ff
BRK
``` ```
## Mission ## Mission

View File

@ -1,6 +1,6 @@
( blank project ) ( hello world )
;variable1 ;iterator
:dev1r FFF0 :dev1r FFF0
:dev1w FFF1 :dev1w FFF1
@ -8,11 +8,13 @@
"hello "hello
,dev1w STR @loop
,dev1w STR ,dev1w STR
,dev1w STR ,iterator LDR
,dev1w STR ,01 ADD
,dev1w STR ,iterator STR
,iterator LDR
,05 NEQ ,loop ROT JSC
BRK ( RESET ) BRK ( RESET )

11
uxn.c
View File

@ -85,15 +85,21 @@ echom(Memory *m, Uint8 len, char *name)
/* clang-format off */ /* clang-format off */
Uint16 bytes2short(Uint8 a, Uint8 b) { return (a << 8) + b; }
Uint8 rampeek8(Uint16 s) { return cpu.ram.dat[s] & 0xff; } Uint8 rampeek8(Uint16 s) { return cpu.ram.dat[s] & 0xff; }
Uint8 mempeek8(Uint16 s) { return cpu.rom.dat[s]; }
Uint16 mempeek16(Uint16 s) { return (cpu.rom.dat[s] << 8) + (cpu.rom.dat[s+1] & 0xff); } Uint16 mempeek16(Uint16 s) { return (cpu.rom.dat[s] << 8) + (cpu.rom.dat[s+1] & 0xff); }
void wspush8(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; } void wspush8(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; }
Uint8 wspop8(void) { return cpu.wst.dat[--cpu.wst.ptr]; } Uint8 wspop8(void) { return cpu.wst.dat[--cpu.wst.ptr]; }
Uint16 wspop16(void) { return wspop8() + (wspop8() << 8); } Uint16 wspop16(void) { return wspop8() + (wspop8() << 8); }
Uint8 wspeek8(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; } Uint8 wspeek8(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; }
Uint16 rspop16(void) { return cpu.rst.dat[--cpu.rst.ptr] + (cpu.rst.dat[--cpu.rst.ptr] << 8); }
void op_brk() { setflag(FLAG_HALT, 1); } void op_brk() { setflag(FLAG_HALT, 1); }
void op_rts() { cpu.rom.ptr = cpu.rst.dat[--cpu.rst.ptr]; } void op_rts() {
cpu.rom.ptr = rspop16();
printf("RTS: %04x\n", cpu.rom.ptr);
}
void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; } void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; }
void op_drp() { wspop8(); } void op_drp() { wspop8(); }
void op_dup() { wspush8(wspeek8()); } void op_dup() { wspush8(wspeek8()); }
@ -101,7 +107,7 @@ void op_swp() { Uint8 b = wspop8(), a = wspop8(); wspush8(b); wspush8(a); }
void op_ovr() { wspush8(cpu.wst.dat[cpu.wst.ptr - 2]); } void op_ovr() { wspush8(cpu.wst.dat[cpu.wst.ptr - 2]); }
void op_rot() { Uint8 c = wspop8(),b = wspop8(),a = wspop8(); wspush8(b); wspush8(c); wspush8(a); } void op_rot() { Uint8 c = wspop8(),b = wspop8(),a = wspop8(); wspush8(b); wspush8(c); wspush8(a); }
void op_jmu() { cpu.rom.ptr = wspop8(); } void op_jmu() { cpu.rom.ptr = wspop8(); }
void op_jsu() { cpu.rst.dat[cpu.rst.ptr++] = cpu.rom.ptr; cpu.rom.ptr = wspop8(); } void op_jsu() { cpu.rst.dat[cpu.rst.ptr++] = (cpu.rom.ptr >> 8) & 0xff; cpu.rst.dat[cpu.rst.ptr++] = cpu.rom.ptr; cpu.rom.ptr = wspop16(); }
void op_jmc() { if(wspop8()) op_jmu(); } void op_jmc() { if(wspop8()) op_jmu(); }
void op_jsc() { if(wspop8()) op_jsu(); } void op_jsc() { if(wspop8()) op_jsu(); }
void op_equ() { wspush8(wspop8() == wspop8()); } void op_equ() { wspush8(wspop8() == wspop8()); }
@ -163,6 +169,7 @@ device1(Uint8 *read, Uint8 *write)
{ {
printf("%c", *write); printf("%c", *write);
*write = 0; *write = 0;
(void)read;
return 0; return 0;
} }

View File

@ -239,7 +239,7 @@ pass1(FILE *f)
else if(w[0] == '.') else if(w[0] == '.')
addr += 2; addr += 2;
else if(w[0] == '"') else if(w[0] == '"')
addr += slen(w + 1); addr += slen(w + 1) + 2;
else if(w[0] == ',') else if(w[0] == ',')
addr += 4; addr += 4;
else if(ismarker(w)) else if(ismarker(w))