polmon: simplified r command

This commit is contained in:
2025-10-01 23:33:47 +02:00
parent b1e7fde1a3
commit 188256b0ac

View File

@@ -224,20 +224,66 @@ void Status(uint8_t status) {
: "ax", "bh", "dx", "cx", "di", "cc"); : "ax", "bh", "dx", "cx", "di", "cc");
} }
char toupper(char c) {
if (c >= 'a' && c <= 'z') {
return c - ('a' - 'A');
}
return c;
}
void tofatname(const char* name, char* fatname) {
for (int i = 0; i < 11; i++) {
if (*name == 0 || *name == '.') {
fatname[i] = ' ';
} else {
fatname[i] = toupper(*name++);
}
if (i == 7 && *name == '.') {
name++;
}
}
}
void LaunchFile(const char* name) { void LaunchFile(const char* name) {
constexpr uint16_t kSegment = 0x200; constexpr uint16_t kSegment = 0x200;
constexpr uint16_t kAddress = 0x100; constexpr uint16_t kAddress = 0x100;
constexpr uint16_t kHeaderAddress = (kSegment << 4);
constexpr uint16_t kFlatAddress = (kSegment << 4) + kAddress; constexpr uint16_t kFlatAddress = (kSegment << 4) + kAddress;
constexpr uint8_t kTrampoline[] = { 0xe8, 0xfd, 0x00, 0xcb };
asm volatile("mov %1, %%ax \n\t" char fatname[11];
"push %%ax \n\t" tofatname(name, fatname);
"mov %0, %%ax \n\t"
"push %%ax \n\t" auto* ptr = reinterpret_cast<uint8_t*>(kHeaderAddress);
"mov $04, %%ah \n\t" memcpy(ptr, kTrampoline, sizeof(kTrampoline));
"int $0x80 \n\t"
"ljmp %2,%3" ::"rmi"(name), asm volatile("mov %1, %%ax \n\t"
"rmi"(kFlatAddress), "i"(kSegment), "i"(kAddress) "push %%ax \n\t"
: "ax", "memory"); "mov %0, %%ax \n\t"
"push %%ax \n\t"
"mov $04, %%ah \n\t"
"int $0x80 \n\t"
"add $4, %%sp \n\t"
"mov %2, %%ax \n\t"
"mov %%ax, %%ds \n\t"
"mov %%ax, %%es \n\t"
"cli \n\t"
"mov %%ax, %%ss \n\t"
"mov %3, %%ax \n\t"
"xchg %%ax, %%sp \n\t"
"sti \n\t"
"push %%ax \n\t"
"lcall %2,$0 \n\t"
"xor %%ax, %%ax \n\t"
"mov %%ax, %%ds \n\t"
"mov %%ax, %%es \n\t"
"cli \n\t"
"pop %%sp \n\t"
"mov %%ax, %%ss \n\t"
"sti"
:: "rmi"(fatname),
"rmi"(kFlatAddress), "i"(kSegment), "i"(kHeaderAddress)
: "ax", "bx", "cx", "dx", "memory");
} }
#if CTRLBREAK #if CTRLBREAK
@@ -320,12 +366,13 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) {
} else if (*ptr == 'r') { } else if (*ptr == 'r') {
dump = false; dump = false;
ptr++; ptr++;
while (*ptr == ' ') {
ptr++;
}
int l = 0; int l = 0;
for (; ptr[l]; l++) { for (; ptr[l]; l++) {
} }
if (l >= 11) { LaunchFile(ptr);
LaunchFile(ptr);
}
ptr += l; ptr += l;
#endif // LAUNCH #endif // LAUNCH
} else if (*ptr == 'w') { } else if (*ptr == 'w') {
@@ -364,7 +411,7 @@ void polmon() {
ClearScreen(); ClearScreen();
#if SHOWTITLE #if SHOWTITLE
puts("PolMon 0.2\r\n"); puts("PolMon for Workgroups 3.1\r\n");
#endif // SHOWTITLE #endif // SHOWTITLE
DisplayPrompt(); DisplayPrompt();