emul/8086: implement AT-XY
This commit is contained in:
parent
d11ac3f006
commit
de9103942d
@ -55,6 +55,9 @@
|
|||||||
#define signext32(value) (int32_t)(int16_t)(value)
|
#define signext32(value) (int32_t)(int16_t)(value)
|
||||||
#define getsegreg(regid) segregs[regid]
|
#define getsegreg(regid) segregs[regid]
|
||||||
#define putsegreg(regid, writeval) segregs[regid] = writeval
|
#define putsegreg(regid, writeval) segregs[regid] = writeval
|
||||||
|
// Warning: those macros below *can't* be called with reg*l and reg*h
|
||||||
|
#define getreg8(regid) regs.byteregs[byteregtable[regid]]
|
||||||
|
#define putreg8(regid, writeval) regs.byteregs[byteregtable[regid]] = writeval
|
||||||
|
|
||||||
#define makeflagsword() \
|
#define makeflagsword() \
|
||||||
( \
|
( \
|
||||||
|
@ -38,9 +38,7 @@
|
|||||||
#define putmem8(x, y, z) write86(segbase(x) + y, z)
|
#define putmem8(x, y, z) write86(segbase(x) + y, z)
|
||||||
#define putmem16(x, y, z) writew86(segbase(x) + y, z)
|
#define putmem16(x, y, z) writew86(segbase(x) + y, z)
|
||||||
#define getreg16(regid) regs.wordregs[regid]
|
#define getreg16(regid) regs.wordregs[regid]
|
||||||
#define getreg8(regid) regs.byteregs[byteregtable[regid]]
|
|
||||||
#define putreg16(regid, writeval) regs.wordregs[regid] = writeval
|
#define putreg16(regid, writeval) regs.wordregs[regid] = writeval
|
||||||
#define putreg8(regid, writeval) regs.byteregs[byteregtable[regid]] = writeval
|
|
||||||
|
|
||||||
typedef void (*INTHOOK) ();
|
typedef void (*INTHOOK) ();
|
||||||
union _bytewordregs_ {
|
union _bytewordregs_ {
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <curses.h>
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
|
||||||
|
#define WCOLS 80
|
||||||
|
#define WLINES 25
|
||||||
|
|
||||||
#ifndef FBIN_PATH
|
#ifndef FBIN_PATH
|
||||||
#error FBIN_PATH needed
|
#error FBIN_PATH needed
|
||||||
#endif
|
#endif
|
||||||
@ -10,23 +14,43 @@ extern uint8_t byteregtable[8];
|
|||||||
extern union _bytewordregs_ regs;
|
extern union _bytewordregs_ regs;
|
||||||
extern INTHOOK INTHOOKS[0x100];
|
extern INTHOOK INTHOOKS[0x100];
|
||||||
|
|
||||||
|
static FILE *fp;
|
||||||
|
static int retcode = 0;
|
||||||
|
WINDOW *bw, *dw, *w;
|
||||||
|
|
||||||
/* we have a fake INT API:
|
/* we have a fake INT API:
|
||||||
INT 1: EMIT. AL = char to spit
|
INT 1: EMIT. AL = char to spit
|
||||||
INT 2: KEY. AL = char read
|
INT 2: KEY. AL = char read
|
||||||
|
INT 3: AT-XY. AL = x, BL = y
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void int1() {
|
void int1() {
|
||||||
putchar(getreg8(regal));
|
uint8_t val = regs.byteregs[regal];
|
||||||
|
if (fp != NULL) {
|
||||||
|
putchar(val);
|
||||||
|
} else {
|
||||||
|
if (val >= 0x20 || val == '\n') {
|
||||||
|
wechochar(w, val);
|
||||||
|
} else if (val == 0x08) {
|
||||||
|
int y, x; getyx(w, y, x);
|
||||||
|
wmove(w, y, x-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void int2() {
|
void int2() {
|
||||||
putreg8(regal, getchar());
|
regs.byteregs[regal] = getchar();
|
||||||
|
}
|
||||||
|
|
||||||
|
void int3() {
|
||||||
|
wmove(w, regs.byteregs[regbl], regs.byteregs[regal]);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
INTHOOKS[1] = int1;
|
INTHOOKS[1] = int1;
|
||||||
INTHOOKS[2] = int2;
|
INTHOOKS[2] = int2;
|
||||||
|
INTHOOKS[3] = int3;
|
||||||
reset86();
|
reset86();
|
||||||
// initialize memory
|
// initialize memory
|
||||||
FILE *bfp = fopen(FBIN_PATH, "r");
|
FILE *bfp = fopen(FBIN_PATH, "r");
|
||||||
@ -41,6 +65,32 @@ int main(int argc, char *argv[])
|
|||||||
c = getc(bfp);
|
c = getc(bfp);
|
||||||
}
|
}
|
||||||
fclose(bfp);
|
fclose(bfp);
|
||||||
while (exec86(100));
|
w = NULL;
|
||||||
|
if (argc == 2) {
|
||||||
|
fp = fopen(argv[1], "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
fprintf(stderr, "Can't open %s\n", argv[1]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
while (exec86(100));
|
||||||
|
fclose(fp);
|
||||||
|
} else if (argc == 1) {
|
||||||
|
initscr(); cbreak(); noecho(); nl(); clear();
|
||||||
|
// border window
|
||||||
|
bw = newwin(WLINES+2, WCOLS+2, 0, 0);
|
||||||
|
wborder(bw, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
wrefresh(bw);
|
||||||
|
// debug panel
|
||||||
|
dw = newwin(1, 30, LINES-1, COLS-30);
|
||||||
|
w = newwin(WLINES, WCOLS, 1, 1);
|
||||||
|
scrollok(w, 1);
|
||||||
|
while (exec86(100)) {
|
||||||
|
//debug_panel();
|
||||||
|
}
|
||||||
|
nocbreak(); echo(); delwin(w); delwin(bw); delwin(dw); endwin();
|
||||||
|
printf("\nDone!\n");
|
||||||
|
//emul_printdebug();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ RS_ADDR 0x80 - CONSTANT SYSVARS
|
|||||||
353 LOAD ( xcomp core low )
|
353 LOAD ( xcomp core low )
|
||||||
CODE (emit) AX POPx, 1 INT, ;CODE
|
CODE (emit) AX POPx, 1 INT, ;CODE
|
||||||
CODE (key) 2 INT, AH 0 MOVri, AX PUSHx, ;CODE
|
CODE (key) 2 INT, AH 0 MOVri, AX PUSHx, ;CODE
|
||||||
|
: COLS 80 ; : LINES 25 ;
|
||||||
|
CODE AT-XY ( x y ) BX POPx, AX POPx, 3 INT, ;CODE
|
||||||
380 LOAD ( xcomp core high )
|
380 LOAD ( xcomp core high )
|
||||||
(entry) _ ( Update LATEST ) PC ORG @ 8 + !
|
(entry) _ ( Update LATEST ) PC ORG @ 8 + !
|
||||||
EOT,
|
EOT,
|
||||||
|
Loading…
Reference in New Issue
Block a user