8080 Emulator can now do most opcodes

Still very buggy
This commit is contained in:
Nero 2019-11-15 14:42:07 +00:00
parent 215fcaf67b
commit 6b1c53dad5
2 changed files with 95 additions and 6 deletions

2
.gitignore vendored
View File

@ -7,4 +7,4 @@
*.exe *.exe
*.log *.log
*.sys *.sys
utils/emul utils

View File

@ -96,6 +96,14 @@ uint16_t pop() {
return v; return v;
} }
void in(uint8_t port) {
}
void out(uint8_t port) {
}
int has_even_parity(uint8_t x){ int has_even_parity(uint8_t x){
unsigned int count = 0, i, b = 1; unsigned int count = 0, i, b = 1;
@ -115,19 +123,35 @@ void cpm_syscall(int number) {
case 2: case 2:
printf("%c", E); printf("%c", E);
break; break;
case 0x0C:
H=0x02;
L=0x00;
break;;
default: default:
fprintf(stderr, "Fatal: Unhandled CP/M syscall %Xh\n", number); fprintf(stderr, "Fatal: Unhandled CP/M syscall C=%02Xh\n", number);
exit(1); exit(1);
} }
} }
void handle_intr(int number) {
switch(number) { void call(uint16_t v) {
switch(v) {
case 0:
exit(0);
break;;
case 5:
cpm_syscall(C);
break;;
default: default:
fprintf(stderr, "Fatal: Unhandled interrupt %Xh\n", number); push(IP);
exit(1); IP=v;
break;
} }
} }
void interrupt(int number) {
call(number << 3);
}
#define add16c(a, b) \ #define add16c(a, b) \
tmp = a + b; \ tmp = a + b; \
flags.c = (tmp >> 16) & 1 flags.c = (tmp >> 16) & 1
@ -361,6 +385,71 @@ void step() {
case 0xBE: aritht(A, -, M); break;; case 0xBE: aritht(A, -, M); break;;
case 0xBF: aritht(A, -, A); break;; case 0xBF: aritht(A, -, A); break;;
case 0xC0: if (!flags.z) IP=pop(); break;;
case 0xC1: BC=pop(); break;;
case 0xC2: if (!flags.z) IP=imm16(); break;;
case 0xC3: IP=imm16(); break;;
case 0xC4: if (!flags.z) call(imm16()); break;;
case 0xC5: push(BC); break;;
case 0xC6: arith(A, +, imm8()); break;;
case 0xC7: interrupt(0); break;;
case 0xC8: if (flags.z) IP=pop(); break;;
case 0xC9: IP=pop(); break;;
case 0xCA: if (flags.z) IP=imm16(); break;;
case 0xCC: if (flags.z) call(imm16()); break;;
case 0xCD: call(imm16()); break;;
case 0xCE: arith(A, +flags.c+, imm8()); break;;
case 0xCF: interrupt(1); break;;
case 0xD0: if (!flags.c) IP=pop(); break;;
case 0xD1: DE=pop(); break;;
case 0xD2: if (!flags.c) IP=imm16(); break;;
case 0xD3: out(imm8()); break;;
case 0xD4: if (!flags.c) call(imm16()); break;;
case 0xD5: push(DE); break;;
case 0xD6: arith(A, -, imm8()); break;;
case 0xD7: interrupt(2); break;;
case 0xD8: if (flags.c) IP=pop(); break;;
case 0xDA: if (flags.c) IP=imm16(); break;;
case 0xDB: in(imm8()); break;;
case 0xDC: if (flags.c) call(imm16()); break;;
case 0xDE: arith(A, -flags.c-, imm8()); break;;
case 0xDF: interrupt(3); break;;
case 0xE0: if (!flags.p) IP=pop(); break;;
case 0xE1: HL=pop(); break;;
case 0xE2: if (!flags.p) IP=imm16(); break;;
case 0xE3: tmp=HL; HL=pop(); push(tmp); break;;
case 0xE4: if (!flags.p) call(imm16()); break;;
case 0xE5: push(HL); break;;
case 0xE6: arith(A, &, imm8()); break;;
case 0xE7: interrupt(4); break;;
case 0xE8: if (flags.p) IP=pop(); break;;
case 0xE9: IP=HL; break;;
case 0xEA: if (flags.p) IP=imm16(); break;;
case 0xEB: tmp=HL; HL=DE; DE=tmp;; break;;
case 0xEC: if (flags.p) call(imm16()); break;;
case 0xEE: arith(A, ^, imm8()); break;;
case 0xEF: interrupt(5); break;;
case 0xF0: if (!flags.s) IP=pop(); break;;
case 0xF1: regset.regp.psw=pop(); break;;
case 0xF2: if (!flags.s) IP=imm16(); break;;
case 0xF4: if (!flags.s) call(imm16()); break;;
case 0xF5: push(regset.regp.psw); break;;
case 0xF6: arith(A, |, imm8()); break;;
case 0xF7: interrupt(6); break;;
case 0xF8: if (flags.s) IP=pop(); break;;
case 0xF9: SP=HL; break;;
case 0xFA: if (flags.s) IP=imm16(); break;;
case 0xFC: if (flags.s) call(imm16()); break;;
case 0xFE: aritht(A, -, imm8()); break;;
case 0xFF: interrupt(7); break;;
default: default:
IP--; IP--;
dump(); dump();