140 lines
3.5 KiB
Zig
140 lines
3.5 KiB
Zig
|
const std = @import("std");
|
||
|
|
||
|
pub fn main() !void {
|
||
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||
|
defer _ = gpa.deinit();
|
||
|
const allocator = gpa.allocator();
|
||
|
|
||
|
var uxn = Uxn{
|
||
|
.mem = try allocator.alloc(u8, 0xFFFF),
|
||
|
.ws = try allocator.alloc(u8, 0xFF),
|
||
|
.rs = try allocator.alloc(u8, 0xFF),
|
||
|
.wsp = 0,
|
||
|
.rsp = 0,
|
||
|
.pc = 0x0100,
|
||
|
};
|
||
|
defer allocator.free(uxn.mem);
|
||
|
defer allocator.free(uxn.ws);
|
||
|
defer allocator.free(uxn.rs);
|
||
|
|
||
|
while (true) uxn.loop();
|
||
|
}
|
||
|
|
||
|
pub const Uxn = struct {
|
||
|
mem: [0xFFFF]u8,
|
||
|
// ws: [0xFF]u8,
|
||
|
// rs: [0xFF]u8,
|
||
|
// wsp: u8,
|
||
|
// rsp: u8,
|
||
|
ws: Stack,
|
||
|
rs: Stack,
|
||
|
pc: u16,
|
||
|
|
||
|
const Stack = struct {
|
||
|
s: *[0xFF]u8,
|
||
|
sp: *u8,
|
||
|
};
|
||
|
|
||
|
pub fn loop(self: *Uxn) void {
|
||
|
switch (self.mem[self.pc]) {
|
||
|
0x00 => {}, // BRK
|
||
|
0x01 => inc(&self.ws, false, false), // INC
|
||
|
0x02 => pop(&self.ws, false, false), // POP
|
||
|
0x03 => nip(&self.ws, false, false), // NIP
|
||
|
0x04 => swp(&self.ws, false, false), // SWP
|
||
|
0x05 => {}, // ROT
|
||
|
0x06 => {}, // DUP
|
||
|
0x07 => {}, // OVR
|
||
|
0x08 => {}, // EQU
|
||
|
0x09 => {}, // NEQ
|
||
|
0x0A => {}, // GTH
|
||
|
0x0B => {}, // LTH
|
||
|
0x0C => {}, // JMP
|
||
|
0x0D => {}, // JCN
|
||
|
0x0E => {}, // JSR
|
||
|
0x0F => {}, // STH
|
||
|
0x10 => {}, // LDZ
|
||
|
0x11 => {}, // STZ
|
||
|
0x12 => {}, // LDR
|
||
|
0x13 => {}, // STR
|
||
|
0x14 => {}, // LDA
|
||
|
0x15 => {}, // STA
|
||
|
0x16 => {}, // DEI
|
||
|
0x17 => {}, // DEO
|
||
|
0x18 => {}, // ADD
|
||
|
0x19 => {}, // SUB
|
||
|
0x1A => {}, // MUL
|
||
|
0x1B => {}, // DIV
|
||
|
0x1C => {}, // AND
|
||
|
0x1D => {}, // ORA
|
||
|
0x1E => {}, // EOR
|
||
|
0x1F => {}, // SFT
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn brk() void {}
|
||
|
|
||
|
fn inc(stack: *Stack, comptime short: bool, comptime keep: bool) void {
|
||
|
_ = short;
|
||
|
if (keep) {
|
||
|
stack.s[stack.sp +% 1] = stack.s[stack.sp] +% 1;
|
||
|
stack.sp +%= 1;
|
||
|
} else {
|
||
|
stack.s[stack.sp] +%= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn pop(stack: *Stack, comptime short: bool, comptime keep: bool) void {
|
||
|
if (!keep) {
|
||
|
if (short) stack.sp -%= 2 else stack.sp -%= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn nip(stack: *Stack, comptime short: bool, comptime keep: bool) void {
|
||
|
_ = short;
|
||
|
if (!keep) {
|
||
|
stack.sp -%= 1;
|
||
|
stack.s[stack.sp] = stack.s[stack.sp +% 1];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn swp(stack: *Stack, comptime short: bool, comptime keep: bool) void {
|
||
|
_ = short;
|
||
|
if (keep) {
|
||
|
stack.s[stack.sp +% 1] = stack.s[stack.sp];
|
||
|
stack.s[stack.sp +% 2] = stack.s[stack.sp -% 1];
|
||
|
} else {
|
||
|
const a = stack.s[stack.sp -% 1];
|
||
|
stack.s[stack.sp -% 1] = stack.s[stack.sp];
|
||
|
stack.sp = a;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn dup() void {}
|
||
|
fn ovr() void {}
|
||
|
fn equ() void {}
|
||
|
fn neq() void {}
|
||
|
fn gth() void {}
|
||
|
fn lth() void {}
|
||
|
fn jmp() void {}
|
||
|
fn jcn() void {}
|
||
|
fn jsr() void {}
|
||
|
fn sth() void {}
|
||
|
fn ldz() void {}
|
||
|
fn stz() void {}
|
||
|
fn ldr() void {}
|
||
|
fn str() void {}
|
||
|
fn lda() void {}
|
||
|
fn sta() void {}
|
||
|
fn dei() void {}
|
||
|
fn deo() void {}
|
||
|
fn add() void {}
|
||
|
fn sub() void {}
|
||
|
fn mul() void {}
|
||
|
fn div() void {}
|
||
|
fn @"and"() void {}
|
||
|
fn ora() void {}
|
||
|
fn eor() void {}
|
||
|
fn sft() void {}
|
||
|
};
|