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
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;
}