From 202bae362a204a240b4a346a97f46f9b9da16b3f Mon Sep 17 00:00:00 2001 From: Paul Mathieu Date: Thu, 25 Sep 2025 14:15:27 +0200 Subject: [PATCH] polmon: stop using es and praying --- polmon.cc | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/polmon.cc b/polmon.cc index 3f85903..7be0641 100644 --- a/polmon.cc +++ b/polmon.cc @@ -74,7 +74,7 @@ void puts(const char* s) { // arguments on the stack in reverse order extern "C" uint16_t Jump(uint16_t addr, int nargs); asm ( - ".section .text \n" + ".section .text.Jump \n" "Jump: \n" " push %bx \n" " push %si \n" @@ -152,30 +152,25 @@ void WriteUint16(uint16_t a) { WriteUint8(a & 0xff); } -void __set_es__(uint16_t es) { - asm volatile ( - "mov %0, %%es" - :: "r" (es) - : "es" - ); -} - -uint8_t __get_es_u8__(uint16_t addr) { - register uint16_t ad asm ("di") = addr; - uint8_t ret; - asm volatile ( - "movb %%es:(%1), %0" +uint8_t __get_far_u8__(uint16_t addr, uint16_t seg) { + register uint16_t ad asm ("si") = addr; + register uint16_t sg asm ("ds") = seg; + register uint8_t ret asm ("al"); + asm ( + "lodsb \n\t" : "=r" (ret) - : "r" (ad) + : "r" (ad), "r" (sg) ); return ret; } -void __set_es_u8__(uint16_t addr, uint8_t val) { +void __set_far_u8__(uint16_t addr, uint16_t seg, uint8_t val) { register uint16_t ad asm ("di") = addr; - asm volatile ( - "movb %0, %%es:(%1)" - :: "ri" (val), "rmi" (ad) + register uint16_t sg asm ("es") = seg; + register uint8_t v asm ("al") = val; + asm ( + "stosb \n\t" + :: "r" (sg), "r" (ad), "r" (v) : "memory" ); } @@ -190,17 +185,17 @@ inline static void __basic__() { __builtin_unreachable(); } -void Dump(uint16_t addr, int count) { +void Dump(uint16_t addr, uint16_t seg, int count) { for (int i = 0; i < count; i++) { putc(' '); - uint8_t d = __get_es_u8__(addr + i); + uint8_t d = __get_far_u8__(addr + i, seg); WriteUint8(d); } #if ASCIIDUMP putc(' '); putc(' '); for (int i = 0; i < count; i++) { - uint8_t d = __get_es_u8__(addr + i); + uint8_t d = __get_far_u8__(addr + i, seg); if (d > 31 && d < 127) { putc(d); } else { @@ -216,11 +211,10 @@ void DumpHex(uint16_t addr, uint16_t seg) { putc('['); WriteUint16(seg); putc(':'); - __set_es__(seg); WriteUint16(addr); putc(']'); putc(':'); - Dump(addr, kDumpSize); + Dump(addr, seg, kDumpSize); putc('\r'); putc('\n'); } @@ -276,7 +270,6 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) { nargs++; ptr += 4; } - __set_es__(cur_seg); uint16_t ret = Jump(cur_addr, nargs); asm volatile ( "shl %0 \n\t" @@ -306,8 +299,7 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) { continue; } uint8_t d = ReadUint8(ptr); - __set_es__(cur_seg); - __set_es_u8__(addr, d); + __set_far_u8__(addr, cur_seg, d); addr++; ptr += 2; }