From fae1aedeb577d7f7d21b73633ea02f645efc83aa Mon Sep 17 00:00:00 2001 From: xolatile Date: Wed, 24 Jul 2024 07:47:32 -0400 Subject: [PATCH] Added 49 new instructions... --- source/assembler.c | 10 ++++++---- source/assembler.h | 49 ++++++++++++++++++++++++++++++++++++++++++++++ tool/xfat.c | 2 -- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/source/assembler.c b/source/assembler.c index 571bde5..f4429f4 100644 --- a/source/assembler.c +++ b/source/assembler.c @@ -7,9 +7,9 @@ #define IRREGULAR_BEGIN (INC) #define IRREGULAR_END (IDIV) #define SPECIAL_1_BEGIN (NOP) -#define SPECIAL_1_END (WAIT) +#define SPECIAL_1_END (STOSD) #define SPECIAL_2_BEGIN (SYSENTER) -#define SPECIAL_2_END (FCOS) +#define SPECIAL_2_END (XLATB) #define JUMP_IF_BEGIN (JO) #define JUMP_IF_END (JG) #define MOVE_IF_BEGIN (CMOVO) @@ -160,7 +160,8 @@ static void build_irregular (unsigned int operation, unsigned int size, unsigned static void build_special_1 (unsigned int operation) { const unsigned char data [] = { - 0x90, 0xc3, 0xcb, 0xc9, 0xf0, 0xf4, 0x9d, 0x9c, 0x9b + 0x90, 0xc3, 0xcb, 0xc9, 0xf0, 0xf4, 0x9d, 0x9c, 0x9b, 0xf8, 0xfc, 0xfa, 0xf9, 0xfd, 0xfb, 0xf5, 0x6c, 0x6d, 0x6e, 0x6f, 0x99, 0x98, 0xec, 0xed, 0xcc, 0xcf, 0xac, + 0xad, 0xee, 0xef, 0xae, 0xaf, 0xaa, 0xab }; input (1, data [operation - SPECIAL_1_BEGIN]); @@ -169,7 +170,8 @@ static void build_special_1 (unsigned int operation) { static void build_special_2 (unsigned int operation) { const unsigned short data [] = { 0x340f, 0x350f, 0x050f, 0x070f, 0x90f3, 0xa20f, 0x770f, 0xaa0f, 0xd0d9, 0xe0d9, 0xe1d9, 0xe4d9, 0xe5d9, 0xe8d9, 0xe9d9, 0xead9, 0xebd9, 0xecd9, 0xedd9, 0xeed9, - 0xf0d9, 0xf1d9, 0xf2d9, 0xf3d9, 0xf4d9, 0xf5d9, 0xf6d9, 0xf7d9, 0xf8d9, 0xf9d9, 0xfad9, 0xfbd9, 0xfcd9, 0xfdd9, 0xfed9, 0xffd9 + 0xf0d9, 0xf1d9, 0xf2d9, 0xf3d9, 0xf4d9, 0xf5d9, 0xf6d9, 0xf7d9, 0xf8d9, 0xf9d9, 0xfad9, 0xfbd9, 0xfcd9, 0xfdd9, 0xfed9, 0xffd9, 0x6d66, 0x6f66, 0x9966, 0x9948, + 0x9866, 0x9848, 0x080f, 0x090f, 0x0b0f, 0x060f, 0xed66, 0xcf48, 0xad66, 0xad48, 0xef66, 0x330f, 0x320f, 0x310f, 0xaf66, 0xaf48, 0xab66, 0xab48, 0x300f, 0xd748 }; input_by (1, D16, data [operation - SPECIAL_2_BEGIN]); diff --git a/source/assembler.h b/source/assembler.h index 0f6221d..3a4c82a 100644 --- a/source/assembler.h +++ b/source/assembler.h @@ -45,6 +45,31 @@ enum { POPF, // Pop stack into flags register (16/64 bit). PUSHF, // Push flags register onto stack (16/64 bit). WAIT, // Check for and handle pending float exceptions. + CLC, // Clear carry flag. + CLD, // Clear direction flag. + CLI, // Clear interrupt flag. + STC, // Set carry flag. + STD, // Set direction flag. + STI, // Set interrupt flag. + CMC, // Complement carry flag. + INSB, // Input 1 byte from IO port at DX to ES:(E)DI or RDI. + INSD, // Input 4 bytes from IO port at DX to ES:(E)DI or RDI. + OUTSB, // Output 1 byte from DS:(E)SI or RSI to IO port at DX. + OUTSD, // Output 4 bytes from DS:(E)SI or RSI to IO port at DX. + CDQ, // Sign-extend EAX into EDX:EAX. + CWDE, // Sign-extend AX into EAX. + INAL, + INEAX, + INT3, + IRETD, + LODSB, + LODSD, + OUTAL, + OUTEAX, + SCASB, + SCASD, + STOSB, + STOSD, SYSENTER, // Execute fast call to ring 0 system procedure. SYSEXIT, // Execute fast return to ring 3 userland procedure. SYSCALL, // Execute OS system call handler at kernel. @@ -81,6 +106,30 @@ enum { FSCALE, // Scale st0 by st1. FSIN, // Compute sin (st0). FCOS, // Compure cos (st0). + INSW, + OUTSW, + CWD, + CQO, + CBW, + CDQE, + INVD, + WBINVD, + UD2, + CLTS, + INAX, + IRETQ, + LODSW, + LODSQ, + OUTAX, + RDPMC, + RDMSR, + RDTSC, + SCASW, + SCASQ, + STOSW, + STOSQ, + WRMSR, + XLATB, ENTER, // Create a stack frame for procedure call. CALL, // Call near, relative or absolute procedure. IN, // Input byte from 8-bit IO port to r0. diff --git a/tool/xfat.c b/tool/xfat.c index 8f4377e..66de188 100644 --- a/tool/xfat.c +++ b/tool/xfat.c @@ -13,11 +13,9 @@ "};\n" \ "int main (void) {\n" \ " unsigned int index;\n" \ -" text_sector_byte = malloc (144UL * sizeof (* text_sector_byte));\n" \ " assemble ((unsigned int) (sizeof (array) / sizeof (array [0])), array);\n" \ " for (index = 0; index < text_sector_size; ++index)\n" \ " printf (\"%02X \", text_sector_byte [index]);\n" \ -" free (text_sector_byte);\n" \ " return (0);\n" \ "}\n"