From 95ad808ef8ea804ed778719606781ba35bfe7a6f Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 28 Aug 2023 12:15:25 +0200 Subject: Add multiply instructions --- src/main.c | 60 ++++++++++++++++++---------------------------------------- src/uxn-core.s | 17 +++++++++++++++++ 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/main.c b/src/main.c index 4a4b58c..315292e 100644 --- a/src/main.c +++ b/src/main.c @@ -26,8 +26,6 @@ #include "profiling.c" #include "devices.c" -#define STACK_SIZE 16 -u8 stack[STACK_SIZE] = {0}; extern void uxn_eval_asm(u16 pc); // TODO: This should be on the IWRAM for maximum speed, as these are operations @@ -39,7 +37,7 @@ extern uintptr_t wst_ptr; extern uintptr_t rst_ptr; EWRAM_BSS -u8 uxn_ram[KB(64) * 2]; +u8 uxn_ram[KB(64)]; void init_uxn() { @@ -49,39 +47,18 @@ init_uxn() { // uxn_boot(u, uxn_ram, uxn_dei, uxn_deo); // Copy rom to VM. - u8 uxn_rom[32] = { - // Hello world (h) - // 0x80, 0x68, 0x80, 0x18, 0x17, + u8 uxn_rom[] = { // - // ADD test - // 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, 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, + // ADD test. + 0x80, 0x04, 0x80, 0x08, 0x18, // #04 #08 ADD -> 0c + 0xa0, 0x00, 0x04, 0xa0, 0x00, 0x08, 0x38, // #0004 #0008 ADD2 -> 000c + // SUB test. + 0x80, 0x08, 0x80, 0x03, 0x19, // #08 #03 ADD -> 05 + 0xa0, 0x00, 0x08, 0xa0, 0x00, 0x03, 0x39, // #0008 #0003 ADD2 -> 0005 + // MUL test. + 0x80, 0x03, 0x80, 0x04, 0x1a, // #03 #04 MUL -> 0c + 0xa0, 0x00, 0x03, 0xa0, 0x00, 0x04, 0x3a, // #0003 #0004 MUL2 -> 000c + 0xa0, 0x00, 0xff, 0xa0, 0x00, 0x02, 0x3a, // #00ff #0002 MUL2 -> 01fe }; memcpy(uxn_ram + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom)); } @@ -127,8 +104,8 @@ main(void) { io_ports[i] = 0; } - txt_printf("ROM\n\n"); - for (size_t i = 0; i < 32; i++) { + txt_printf("ROM"); + for (size_t i = 0; i < 64; i++) { if (i % 8 == 0) { txt_printf("\n"); } @@ -137,17 +114,16 @@ main(void) { txt_printf("\n\n"); uxn_eval_asm(PAGE_PROGRAM); - txt_printf("STACK\n"); - txt_printf("PTR: %d\n", wst_ptr - (uintptr_t)wst); - for (size_t i = 0; i < STACK_SIZE; i++) { + txt_printf("STACK ("); + txt_printf("PTR: %d)", wst_ptr - (uintptr_t)wst); + for (size_t i = 0; i < 64; i++) { if (i % 8 == 0) { txt_printf("\n"); } txt_printf("%02x ", wst[i]); } - uintptr_t stack_base = wst; - uintptr_t stack_size = wst_ptr - stack_base; + uintptr_t stack_size = wst_ptr - (uintptr_t)wst; while(true) { txt_position(0,0); // bios_vblank_wait(); diff --git a/src/uxn-core.s b/src/uxn-core.s index 32ec26b..e35707f 100644 --- a/src/uxn-core.s +++ b/src/uxn-core.s @@ -257,15 +257,32 @@ sub2: b uxn_decode mul: + ldr r3, [r1, #-1]! + ldr r4, [r1, #-1]! + mul r4, r3, r4 + strb r4, [r1], #1 b uxn_decode mul2: + ldrb r3, [r1, #-1]! + ldrb r5, [r1, #-1]! + orr r3, r5, r3, lsl #8 + ldrb r4, [r1, #-1]! + ldrb r5, [r1, #-1]! + orr r4, r5, r4, lsl #8 + mul r5, r3, r4 + lsr r3, r5, #24 + strb r3, [r1], #1 + lsr r5, #16 + strb r5, [r1], #1 b uxn_decode div: +@ TODO: Implement using ____aeabi_uidiv_from_thumb b uxn_decode div2: +@ TODO: Implement using ____aeabi_uidiv_from_thumb b uxn_decode and: -- cgit v1.2.1