Improve emulator
This commit is contained in:
parent
fcb4db25ad
commit
2935d7ee6c
@ -7,11 +7,11 @@ main:
|
|||||||
test al, al
|
test al, al
|
||||||
jz .ret
|
jz .ret
|
||||||
mov dl, al
|
mov dl, al
|
||||||
mov ah, 0x02
|
mov cl, 0x02
|
||||||
int 0x21
|
call 5
|
||||||
jmp .loop
|
jmp .loop
|
||||||
.ret:
|
.ret:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
hello:
|
hello:
|
||||||
db "Hello!", 0
|
db "Hello!", 0x0A, 0x0D, 0
|
||||||
|
31
utils/emul.c
31
utils/emul.c
@ -27,6 +27,7 @@ void* rmptr;
|
|||||||
#define AL regset.r8[0]
|
#define AL regset.r8[0]
|
||||||
#define CL regset.r8[2]
|
#define CL regset.r8[2]
|
||||||
#define DL regset.r8[4]
|
#define DL regset.r8[4]
|
||||||
|
#define AX regset.r16[0]
|
||||||
#define BX regset.r16[3]
|
#define BX regset.r16[3]
|
||||||
#define SP regset.r16[4]
|
#define SP regset.r16[4]
|
||||||
#define BP regset.r16[5]
|
#define BP regset.r16[5]
|
||||||
@ -169,6 +170,13 @@ void step() {
|
|||||||
modrm(BIT8);
|
modrm(BIT8);
|
||||||
RM8 = R8(reg);
|
RM8 = R8(reg);
|
||||||
break;
|
break;
|
||||||
|
case 0x8B: // MOV reg16,r/m16
|
||||||
|
modrm(BIT16);
|
||||||
|
R16(reg) = RM16;
|
||||||
|
break;
|
||||||
|
case 0xA1: // MOV AX,memoffs16
|
||||||
|
AX = *(uint16_t*)&mem[imm16()];
|
||||||
|
break;
|
||||||
case 0xAC: // LODSB
|
case 0xAC: // LODSB
|
||||||
AL = mem[SI];
|
AL = mem[SI];
|
||||||
SI++;
|
SI++;
|
||||||
@ -196,7 +204,7 @@ void step() {
|
|||||||
handle_syscall(CL);
|
handle_syscall(CL);
|
||||||
} else {
|
} else {
|
||||||
push(ip);
|
push(ip);
|
||||||
ip += reg;
|
ip = reg;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0xEB: // JMP rb
|
case 0xEB: // JMP rb
|
||||||
@ -214,6 +222,21 @@ void step() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void copy_cmdline(char* str) {
|
||||||
|
int i, c;
|
||||||
|
uint8_t *len = &mem[0x80];
|
||||||
|
char* ptr = (char*)&mem[0x81];
|
||||||
|
c = strlen(str);
|
||||||
|
// Clip at max length
|
||||||
|
if (c>0x7E) {
|
||||||
|
fprintf(stderr, "Command line too long, max is 126 bytes\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
memcpy(ptr, str, c);
|
||||||
|
ptr[c]=0x0D;
|
||||||
|
*len=c;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
memset(&mem, sizeof(mem), 0);
|
memset(&mem, sizeof(mem), 0);
|
||||||
memset(®set, sizeof(regset), 0);
|
memset(®set, sizeof(regset), 0);
|
||||||
@ -221,6 +244,12 @@ int main(int argc, char** argv) {
|
|||||||
mem[1]=0x20;
|
mem[1]=0x20;
|
||||||
push(0);
|
push(0);
|
||||||
|
|
||||||
|
if (argc>2) {
|
||||||
|
copy_cmdline(argv[2]);
|
||||||
|
} else {
|
||||||
|
copy_cmdline("");
|
||||||
|
}
|
||||||
|
|
||||||
FILE* fd = fopen(argv[1], "r");
|
FILE* fd = fopen(argv[1], "r");
|
||||||
fread(mem + ip, 1, sizeof(mem) - ip, fd);
|
fread(mem + ip, 1, sizeof(mem) - ip, fd);
|
||||||
while(1) {
|
while(1) {
|
||||||
|
Loading…
Reference in New Issue
Block a user