polmon: stop using es and praying

This commit is contained in:
2025-09-25 14:15:27 +02:00
parent fa1b26ef10
commit 202bae362a

View File

@@ -74,7 +74,7 @@ void puts(const char* s) {
// arguments on the stack in reverse order // arguments on the stack in reverse order
extern "C" uint16_t Jump(uint16_t addr, int nargs); extern "C" uint16_t Jump(uint16_t addr, int nargs);
asm ( asm (
".section .text \n" ".section .text.Jump \n"
"Jump: \n" "Jump: \n"
" push %bx \n" " push %bx \n"
" push %si \n" " push %si \n"
@@ -152,30 +152,25 @@ void WriteUint16(uint16_t a) {
WriteUint8(a & 0xff); WriteUint8(a & 0xff);
} }
void __set_es__(uint16_t es) { uint8_t __get_far_u8__(uint16_t addr, uint16_t seg) {
asm volatile ( register uint16_t ad asm ("si") = addr;
"mov %0, %%es" register uint16_t sg asm ("ds") = seg;
:: "r" (es) register uint8_t ret asm ("al");
: "es" asm (
); "lodsb \n\t"
}
uint8_t __get_es_u8__(uint16_t addr) {
register uint16_t ad asm ("di") = addr;
uint8_t ret;
asm volatile (
"movb %%es:(%1), %0"
: "=r" (ret) : "=r" (ret)
: "r" (ad) : "r" (ad), "r" (sg)
); );
return ret; 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; register uint16_t ad asm ("di") = addr;
asm volatile ( register uint16_t sg asm ("es") = seg;
"movb %0, %%es:(%1)" register uint8_t v asm ("al") = val;
:: "ri" (val), "rmi" (ad) asm (
"stosb \n\t"
:: "r" (sg), "r" (ad), "r" (v)
: "memory" : "memory"
); );
} }
@@ -190,17 +185,17 @@ inline static void __basic__() {
__builtin_unreachable(); __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++) { for (int i = 0; i < count; i++) {
putc(' '); putc(' ');
uint8_t d = __get_es_u8__(addr + i); uint8_t d = __get_far_u8__(addr + i, seg);
WriteUint8(d); WriteUint8(d);
} }
#if ASCIIDUMP #if ASCIIDUMP
putc(' '); putc(' ');
putc(' '); putc(' ');
for (int i = 0; i < count; i++) { 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) { if (d > 31 && d < 127) {
putc(d); putc(d);
} else { } else {
@@ -216,11 +211,10 @@ void DumpHex(uint16_t addr, uint16_t seg) {
putc('['); putc('[');
WriteUint16(seg); WriteUint16(seg);
putc(':'); putc(':');
__set_es__(seg);
WriteUint16(addr); WriteUint16(addr);
putc(']'); putc(']');
putc(':'); putc(':');
Dump(addr, kDumpSize); Dump(addr, seg, kDumpSize);
putc('\r'); putc('\r');
putc('\n'); putc('\n');
} }
@@ -276,7 +270,6 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) {
nargs++; nargs++;
ptr += 4; ptr += 4;
} }
__set_es__(cur_seg);
uint16_t ret = Jump(cur_addr, nargs); uint16_t ret = Jump(cur_addr, nargs);
asm volatile ( asm volatile (
"shl %0 \n\t" "shl %0 \n\t"
@@ -306,8 +299,7 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) {
continue; continue;
} }
uint8_t d = ReadUint8(ptr); uint8_t d = ReadUint8(ptr);
__set_es__(cur_seg); __set_far_u8__(addr, cur_seg, d);
__set_es_u8__(addr, d);
addr++; addr++;
ptr += 2; ptr += 2;
} }