From 941ad8e28efb685e910b38b06f98bc79fb29677f Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 27 Aug 2023 21:55:15 +0200 Subject: Add the `add2, sub2, litr, lit2r` ops --- src/main.c | 49 ++++++++----- src/uxn-core.s | 212 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 136 insertions(+), 125 deletions(-) diff --git a/src/main.c b/src/main.c index 21c8e0e..e10c8f0 100644 --- a/src/main.c +++ b/src/main.c @@ -517,12 +517,38 @@ init_uxn() { // uxn_boot(u, uxn_ram, uxn_dei, uxn_deo); // Copy rom to VM. - u8 uxn_rom[] = { + u8 uxn_rom[32] = { // Hello world (h) // 0x80, 0x68, 0x80, 0x18, 0x17, // // ADD test - 0x80, 0x04, 0x80, 0x03, 0x80, 0x02, 0x80, 0x01, 0x18 + // 0x80, 0x04, 0x80, 0x03, 0x80, 0x02, 0x80, 0x01, 0x18, 0x18 + // SUB test + // 0x80, 0x04, 0x80, 0x03, 0x80, 0x02, 0x80, 0x01, 0x19, 0x19, 0x19 + // LIT2 04 03 LIT2 02 01 ADD ADD ADD BRK + // 0xa0, 0x04, 0x03, + // 0xa0, 0x04, 0x03, 0xa0, 0x02, 0x01, + // 0xa0, 0x04, 0x03, 0xa0, 0x02, 0x01, 0x18, 0x18, 0x00 + // #0004 #0008 ADD + // 0xa0, 0x00, 0x04, 0xa0, 0x00, 0x08, 0x18, + // #0004 #0008 ADD2 + 0x80, 0xFF, 0xff, + 0xa0, 0x00, 0x08, 0xa0, 0x00, 0x04, 0x38, + // 0xa0, 0x00, 0x08, 0xa0, 0x00, 0x03, 0x39, + // 0xa0, 0x00, 0x01, 0x38, + // + // 0x80, 0xFF, 0xff, + // 0xa0, 0xba, 0xdd, + // 0xa0, 0x10, 0xde, + // 0xa0, 0xfe, 0xed, + // 0xa0, 0xde, 0xaf, + // 0xa0, 0xba, 0xdd, + // 0xa0, 0x10, 0xde, + // 0xa0, 0xfe, 0xed, + // 0xa0, 0xde, 0xaf, + // + // #0008 #0003 SUB2 + // 0xa0, 0x00, 0x08, 0xa0, 0x00, 0x03, }; memcpy(uxn_ram + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom)); } @@ -715,7 +741,6 @@ handle_input(Uxn *u) { #define STACK_SIZE 16 u8 stack[STACK_SIZE] = {0}; -extern void uxn_init_asm(void); extern void uxn_eval_asm(u16 pc); // TODO: This should be on the IWRAM for maximum speed, as these are operations @@ -766,29 +791,21 @@ main(void) { rst[i] = 0; io_ports[i] = 0; } - uxn_init_asm(); txt_printf("ROM\n\n"); - for (size_t i = 0; i < 8; i++) { - txt_printf("%02x ", uxn_ram[i + PAGE_PROGRAM]); - } - txt_printf("\n\n"); - - txt_printf("STACK (BEFORE)\n"); - txt_printf("PTR: %d\n", wst_ptr - (uintptr_t)wst); - for (size_t i = 0; i < STACK_SIZE; i++) { - if (i % 4 == 0) { + for (size_t i = 0; i < 32; i++) { + if (i % 8 == 0) { txt_printf("\n"); } - txt_printf("%02x ", wst[i]); + txt_printf("%02x ", uxn_ram[i + PAGE_PROGRAM]); } txt_printf("\n\n"); uxn_eval_asm(PAGE_PROGRAM); - txt_printf("STACK (AFTER)\n"); + txt_printf("STACK\n"); txt_printf("PTR: %d\n", wst_ptr - (uintptr_t)wst); for (size_t i = 0; i < STACK_SIZE; i++) { - if (i % 4 == 0) { + if (i % 8 == 0) { txt_printf("\n"); } txt_printf("%02x ", wst[i]); diff --git a/src/uxn-core.s b/src/uxn-core.s index 2e7a165..a9fc3f9 100644 --- a/src/uxn-core.s +++ b/src/uxn-core.s @@ -20,47 +20,13 @@ rst_ptr: .word rst .global io_ports io_ports: .space 256 -@ -@ r0 is our custom stack pointer -@ r1 is the value we want to insert/extract -@ -@ When the stack grows downwards: -@ push {r1} == str r1, [sp, #-4]! -@ pop {r1} == ldr r1, [sp], #4 -@ -@ In our case the stack grow upwards: -@ -@ 8bit: -@ push {r1} == strb r1, [sp], #1 -@ pop {r1} == ldrb r1, [sp, #-1]! -@ -@ 32bit: -@ push {r1} == str r1, [sp], #4 -@ pop {r1} == ldr r1, [sp, #-4]! -@ - -.global uxn_init_asm -uxn_init_asm: - @ DEBUG: Initialize the stack for testing purposes. - ldr r0, wst_ptr - mov r1, #4 - strb r1, [r0], #1 - sub r1, r1, #1 - strb r1, [r0], #1 - sub r1, r1, #1 - strb r1, [r0], #1 - sub r1, r1, #1 - strb r1, [r0], #1 - adr r1, wst_ptr - str r0, [r1] - bx lr - @ UXN evaluation function. @ @ r0: PC pointer (argument is offset from RAM). @ r1: Stack pointer (wst/rst). @ r2: Ram ptr. @ r3-r7: Scratch registers. +@ .global uxn_eval_asm uxn_eval_asm: @ Initialization. @@ -95,13 +61,13 @@ brk: b uxn_ret jci: - b uxn_ret + b uxn_decode jmi: - b uxn_ret + b uxn_decode jsi: - b uxn_ret + b uxn_decode litr: ldrb r3, [r0], #1 @@ -109,201 +75,229 @@ litr: b uxn_decode lit2r: - b uxn_ret + ldrb r3, [r0], #1 + ldrb r4, [r0], #1 + strb r3, [r1], #1 + strb r4, [r1], #1 + b uxn_decode inc: - b uxn_ret + b uxn_decode inc2: - b uxn_ret + b uxn_decode pop: - b uxn_ret + b uxn_decode pop2: - b uxn_ret + b uxn_decode nip: - b uxn_ret + b uxn_decode nip2: - b uxn_ret + b uxn_decode swp: - b uxn_ret + b uxn_decode swp2: - b uxn_ret + b uxn_decode rot: - b uxn_ret + b uxn_decode rot2: - b uxn_ret + b uxn_decode dup: - b uxn_ret + b uxn_decode dup2: - b uxn_ret + b uxn_decode ovr: - b uxn_ret + b uxn_decode ovr2: - b uxn_ret + b uxn_decode equ: - b uxn_ret + b uxn_decode equ2: - b uxn_ret + b uxn_decode neq: - b uxn_ret + b uxn_decode neq2: - b uxn_ret + b uxn_decode gth: - b uxn_ret + b uxn_decode gth2: - b uxn_ret + b uxn_decode lth: - b uxn_ret + b uxn_decode lth2: - b uxn_ret + b uxn_decode jmp: - b uxn_ret + b uxn_decode jmp2: - b uxn_ret + b uxn_decode jcn: - b uxn_ret + b uxn_decode jcn2: - b uxn_ret + b uxn_decode jsr: - b uxn_ret + b uxn_decode jsr2: - b uxn_ret + b uxn_decode sth: - b uxn_ret + b uxn_decode sth2: - b uxn_ret + b uxn_decode ldz: - b uxn_ret + b uxn_decode ldz2: - b uxn_ret + b uxn_decode stz: - b uxn_ret + b uxn_decode stz2: - b uxn_ret + b uxn_decode ldr: - b uxn_ret + b uxn_decode ldr2: - b uxn_ret + b uxn_decode str: - b uxn_ret + b uxn_decode str2: - b uxn_ret + b uxn_decode lda: - b uxn_ret + b uxn_decode lda2: - b uxn_ret + b uxn_decode sta: - b uxn_ret + b uxn_decode sta2: - b uxn_ret + b uxn_decode dei: - b uxn_ret + b uxn_decode dei2: - b uxn_ret + b uxn_decode deo: - b uxn_ret + b uxn_decode deo2: - b uxn_ret + b uxn_decode add: - ldr r3, [r1, #-1]! - ldr r4, [r1, #-1]! - add r3, r3, r4 + ldr r3, [r1, #-1]! + ldr r4, [r1, #-1]! + add r3, r3, r4 strb r3, [r1], #1 - b uxn_ret @ NOTE: This should return to the next loop iteration. + b uxn_decode add2: - b uxn_ret + ldrb r3, [r1, #-1]! + lsl r3, #8 + ldrb r5, [r1, #-1]! + add r3, r5 + ldrb r4, [r1, #-1]! + ldrb r5, [r1, #-1]! + lsl r4, #8 + add r4, r5 + add r3, r3, r4 + strb r3, [r1], #1 + lsr r3, #8 + strb r3, [r1], #1 + b uxn_decode sub: - @ ldr r2, [r0, #-1]! - @ ldr r1, [r0, #-1]! - @ sub r1, r1, r2 - @ strb r1, [r0], #1 - b uxn_ret @ NOTE: This should return to the next loop iteration. + ldr r3, [r1, #-1]! + ldr r4, [r1, #-1]! + sub r4, r4, r3 + strb r4, [r1], #1 + b uxn_decode sub2: - b uxn_ret + ldrb r3, [r1, #-1]! + ldrb r5, [r1, #-1]! + lsl r3, #8 + add r3, r5 + ldrb r4, [r1, #-1]! + ldrb r5, [r1, #-1]! + lsl r4, #8 + add r4, r5 + sub r3, r4, r3 + strb r3, [r1], #1 + lsr r3, #8 + strb r3, [r1], #1 + b uxn_decode mul: - b uxn_ret + b uxn_decode mul2: - b uxn_ret + b uxn_decode div: - b uxn_ret + b uxn_decode div2: - b uxn_ret + b uxn_decode and: - b uxn_ret + b uxn_decode and2: - b uxn_ret + b uxn_decode ora: - b uxn_ret + b uxn_decode ora2: - b uxn_ret + b uxn_decode eor: - b uxn_ret + b uxn_decode eor2: - b uxn_ret + b uxn_decode sft: - b uxn_ret + b uxn_decode sft2: - b uxn_ret + b uxn_decode @ OP table op_table: @@ -468,7 +462,7 @@ op_table: .word brk @ 0x9d .word brk @ 0x9e .word brk @ 0x9f - .word brk @ 0xa0 + .word lit2r @ 0xa0 .word brk @ 0xa1 .word brk @ 0xa2 .word brk @ 0xa3 -- cgit v1.2.1