ref: e86160e1c5cae5d7ac79851a7167a1a0a3a6eddb
parent: 6ca6987e90f6757a354c0be220a4bd6c9e47d64a
author: Alex Musolino <alex@musolino.id.au>
date: Thu May 11 12:34:30 EDT 2023
rudimentary display support, drop debugging output
--- a/8080.c
+++ b/8080.c
@@ -2,6 +2,8 @@
#include <libc.h>
#include <bio.h>
#include <ctype.h>
+#include <draw.h>
+#include <thread.h>
#include "dat.h"
#include "fns.h"
@@ -12,10 +14,15 @@
CPU ocpu, cpu;
Insn insn;
+enum{
+ Width = 256,
+ Height = 224,
+};
+
uchar mem[MEMSZ];
uchar *rom = &mem[0];
uchar *ram = &mem[ROMSZ];
-uchar *vid = &mem[ROMSZ+RAMSZ];
+uchar *vmem = &mem[ROMSZ+RAMSZ];
int interactive;
int debug;
@@ -29,7 +36,7 @@
usage(void)
{
fprint(2, "usage: %s [-b addr] [-i script] [-t addr] [-T addr]\n", argv0);
- exits("usage");
+ threadexitsall("usage");
}
int
@@ -284,7 +291,7 @@
}
break;
case Cexit:
- exits(0);
+ threadexitsall(0);
break;
case Creset:
cpureset();
@@ -352,8 +359,52 @@
return strcmp(buf, "/dev/cons") == 0;
}
+static void
+resize(int w, int h)
+{
+ int fd;
+
+ if((fd = open("/dev/wctl", OWRITE)) < 0)
+ return;
+ fprint(fd, "resize -dx %d -dy %d", w, h);
+ close(fd);
+}
+
+static void
+scanout(void*)
+{
+ int i;
+ uchar *p;
+ Image *line;
+ Rectangle r;
+
+ line = allocimage(display, Rect(0,0,Width,1), GREY1, 0, DNofill);
+
+ for(;;){
+ p = vmem;
+ r.min = Pt(screen->r.min.x, screen->r.max.y-1);
+ r.max = Pt(screen->r.max.x, screen->r.max.y);
+ for(i = 0; i < Height/2; i++){
+ loadimage(line, Rect(0,0,Width,1), p, Width/8);
+ draw(screen, r, line, nil, ZP);
+ r = rectaddpt(r, Pt(0, -1));
+ p += Width/8;
+ }
+ flushimage(display, 1);
+ sleep(1000/30);
+ for(; i < Height; i++){
+ loadimage(line, Rect(0,0,Width,1), p, Width/8);
+ draw(screen, r, line, nil, ZP);
+ r = rectaddpt(r, Pt(0, -1));
+ p += Width/8;
+ }
+ flushimage(display, 1);
+ sleep(1000/30);
+ }
+}
+
void
-main(int argc, char **argv)
+threadmain(int argc, char **argv)
{
stdin = Bfdopen(0, OREAD);
stdout = Bfdopen(1, OWRITE);
@@ -386,6 +437,12 @@
}ARGEND;
if(argc != 0)
usage();
+ if(newwindow(nil) < 0)
+ sysfatal("newwindow: %r");
+ resize(Width, Height);
+ if(initdraw(nil, nil, nil) < 0)
+ sysfatal("initdraw: %r");
+ proccreate(scanout, nil, 1024);
interactive = isatty();
fmtinstall('I', insnfmt);
cpureset();
@@ -398,7 +455,7 @@
case -1:
sysfatal("error reading stdin: %r");
case 0:
- exits(0);
+ threadexitsall(0);
}
}
}
--- a/das.c
+++ b/das.c
@@ -290,7 +290,7 @@
{
insn->r1 = (mem[0]>>3)&0x7;
insn->r2 = mem[0]&0x7;
- if(insn->r1 == M && insn->r2 == M)
+ if(insn->r1 == RM && insn->r2 == RM)
insn->op = Onop;
return 1;
}
@@ -573,18 +573,10 @@
static u16int
rpair(CPU *cpu, u8int rp)
{
- u16int x;
-
switch(rp){
- case BC: return cpu->r[B]<<8 | cpu->r[C];
- case DE: return cpu->r[D]<<8 | cpu->r[E];
- case HL:
- x = cpu->r[H]<<8 | cpu->r[L];
- if(rp == HL && x == 0){
- Bprint(stderr, "HL = 0 @ pc=%#.4uhx\n", cpu->PC);
- Bflush(stderr);
- }
- return x;
+ case RBC: return cpu->r[RB]<<8 | cpu->r[RC];
+ case RDE: return cpu->r[RD]<<8 | cpu->r[RE];
+ case RHL: return cpu->r[RH]<<8 | cpu->r[RL];
}
fatal("unknown register pair %d", rp);
return 0;
@@ -593,12 +585,8 @@
static void
wpair(CPU *cpu, u8int rp, u16int x)
{
- if(rp == HL && x == 0){
- Bprint(stderr, "HL ← 0 @ pc=%#.4uhx\n", cpu->PC);
- Bflush(stderr);
- }
- cpu->r[(rp<<1)+B] = x>>8;
- cpu->r[(rp<<1)+B+1] = x;
+ cpu->r[(rp<<1)] = x>>8;
+ cpu->r[(rp<<1)+1] = x;
}
static void
@@ -633,8 +621,8 @@
{
u16int addr;
- if(insn->r1 == M){
- addr = rpair(cpu, HL);
+ if(insn->r1 == RM){
+ addr = rpair(cpu, RHL);
memwrite(addr, insn->imm);
}else{
cpu->r[insn->r1] = insn->imm;
@@ -644,8 +632,6 @@
static void
Xcall(CPU *cpu, Insn *insn)
{
- //Bprint(stderr, "CALL %#.4uhx @ pc=%#.4uhx\n", insn->addr, insn->pc);
- //Bflush(stderr);
push16(cpu, cpu->PC);
cpu->PC = insn->addr;
}
@@ -653,18 +639,18 @@
static void
Xldax(CPU *cpu, Insn *insn)
{
- cpu->r[A] = memread(rpair(cpu, insn->rp));
+ cpu->r[RA] = memread(rpair(cpu, insn->rp));
}
static void
Xmov(CPU *cpu, Insn *insn)
{
- if(insn->r2 == M && insn->r1 == M)
+ if(insn->r2 == RM && insn->r1 == RM)
return;
- if(insn->r2 == M)
- cpu->r[insn->r1] = memread(rpair(cpu, HL));
- else if(insn->r1 == M)
- memwrite(rpair(cpu, HL), cpu->r[insn->r2]);
+ if(insn->r2 == RM)
+ cpu->r[insn->r1] = memread(rpair(cpu, RHL));
+ else if(insn->r1 == RM)
+ memwrite(rpair(cpu, RHL), cpu->r[insn->r2]);
else
cpu->r[insn->r1] = cpu->r[insn->r2];
}
@@ -680,8 +666,8 @@
{
u16int a, x;
- if(insn->r1 == M){
- a = rpair(cpu, HL);
+ if(insn->r1 == RM){
+ a = rpair(cpu, RHL);
x = memread(a);
}else{
a = 0;
@@ -698,7 +684,7 @@
else
cpu->flg &= ~Fsign;
- if(insn->r1 == M)
+ if(insn->r1 == RM)
memwrite(a, x);
else
cpu->r[insn->r1] = x;
@@ -720,18 +706,18 @@
}else{
x = rpair(cpu, insn->rp);
}
- x += rpair(cpu, HL);
+ x += rpair(cpu, RHL);
if(x>>16 > 0)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
- wpair(cpu, HL, x);
+ wpair(cpu, RHL, x);
}
static void
Xsta(CPU *cpu, Insn *insn)
{
- memwrite(insn->addr, cpu->r[A]);
+ memwrite(insn->addr, cpu->r[RA]);
}
static void
@@ -739,19 +725,19 @@
{
u8int x;
- if(insn->r1 == M)
- x = memread(rpair(cpu, HL));
+ if(insn->r1 == RM)
+ x = memread(rpair(cpu, RHL));
else
x = cpu->r[insn->r1];
- cpu->r[A] ^= x;
+ cpu->r[RA] ^= x;
- if(cpu->r[A] == 0)
+ if(cpu->r[RA] == 0)
cpu->flg |= Fzero;
else
cpu->flg &= ~Fzero;
- if((cpu->r[A] & 0x80) != 0)
+ if((cpu->r[RA] & 0x80) != 0)
cpu->flg |= Fsign;
else
cpu->flg &= ~Fsign;
@@ -762,7 +748,7 @@
static void
Xout(CPU *cpu, Insn *insn)
{
- iow(insn->imm<<8|insn->imm, cpu->r[A]);
+ iow(insn->imm<<8|insn->imm, cpu->r[RA]);
}
static void
@@ -770,19 +756,19 @@
{
u8int x;
- if(insn->r1 == M)
- x = memread(rpair(cpu, HL));
+ if(insn->r1 == RM)
+ x = memread(rpair(cpu, RHL));
else
x = cpu->r[insn->r1];
- cpu->r[A] |= x;
+ cpu->r[RA] |= x;
- if(cpu->r[A] == 0)
+ if(cpu->r[RA] == 0)
cpu->flg |= Fzero;
else
cpu->flg &= ~Fzero;
- if((cpu->r[A] & 0x80) != 0)
+ if((cpu->r[RA] & 0x80) != 0)
cpu->flg |= Fsign;
else
cpu->flg &= ~Fsign;
@@ -793,7 +779,7 @@
static void
Xlda(CPU *cpu, Insn *insn)
{
- cpu->r[A] = memread(insn->addr);
+ cpu->r[RA] = memread(insn->addr);
}
static void
@@ -801,19 +787,19 @@
{
u8int x;
- if(insn->r1 == M)
- x = memread(rpair(cpu, HL));
+ if(insn->r1 == RM)
+ x = memread(rpair(cpu, RHL));
else
x = cpu->r[insn->r1];
- cpu->r[A] &= x;
+ cpu->r[RA] &= x;
- if(cpu->r[A] == 0)
+ if(cpu->r[RA] == 0)
cpu->flg |= Fzero;
else
cpu->flg &= ~Fzero;
- if((cpu->r[A] & 0x80) != 0)
+ if((cpu->r[RA] & 0x80) != 0)
cpu->flg |= Fsign;
else
cpu->flg &= ~Fsign;
@@ -824,18 +810,11 @@
static void
Xpush(CPU *cpu, Insn *insn)
{
- u16int x;
-
- if(insn->rp == MM){
- push8(cpu, cpu->r[A]);
+ if(insn->rp == RMM){
+ push8(cpu, cpu->r[RA]);
push8(cpu, cpu->flg);
}else{
- x = rpair(cpu, insn->rp);
- if(insn->rp == HL && x == 0){
- Bprint(stderr, "pushed %uhd from %s @ %#.4uhx\n", x, rpnam(insn->rp), insn->pc);
- Bflush(stderr);
- }
- push16(cpu, x);
+ push16(cpu, rpair(cpu, insn->rp));
}
}
@@ -842,18 +821,11 @@
static void
Xpop(CPU *cpu, Insn *insn)
{
- u16int x;
-
- if(insn->rp == MM){
+ if(insn->rp == RMM){
cpu->flg = pop8(cpu);
- cpu->r[A] = pop8(cpu);
+ cpu->r[RA] = pop8(cpu);
}else{
- x = pop16(cpu);
- if(insn->rp == HL && x == 0){
- Bprint(stderr, "popped %uhd into %s @ %#.4uhx\n", x, rpnam(insn->rp), insn->pc);
- Bflush(stderr);
- }
- wpair(cpu, insn->rp, x);
+ wpair(cpu, insn->rp, pop16(cpu));
}
}
@@ -862,9 +834,9 @@
{
u16int x;
- x = rpair(cpu, HL);
- wpair(cpu, HL, rpair(cpu, DE));
- wpair(cpu, DE, x);
+ x = rpair(cpu, RHL);
+ wpair(cpu, RHL, rpair(cpu, RDE));
+ wpair(cpu, RDE, x);
}
static void
@@ -873,8 +845,8 @@
u8int x;
u16int a;
- if(insn->r1 == M){
- a = memread(rpair(cpu, HL));
+ if(insn->r1 == RM){
+ a = memread(rpair(cpu, RHL));
x = memread(a) + 1;
memwrite(a, x);
}else{
@@ -911,19 +883,19 @@
static void
Xani(CPU *cpu, Insn *insn)
{
- cpu->r[A] &= insn->imm;
+ cpu->r[RA] &= insn->imm;
- if(cpu->r[A] == 0)
+ if(cpu->r[RA] == 0)
cpu->flg |= Fzero;
else
cpu->flg &= ~Fzero;
- if((cpu->r[A] & 0x80) != 0)
+ if((cpu->r[RA] & 0x80) != 0)
cpu->flg |= Fsign;
else
cpu->flg &= ~Fsign;
- if(evenpar(cpu->r[A]))
+ if(evenpar(cpu->r[RA]))
cpu->flg |= Fparity;
else
cpu->flg &= ~Fparity;
@@ -937,24 +909,24 @@
u8int ocarry;
ocarry = (cpu->flg&Fcarry) != 0;
- if((cpu->r[A]&1) != 0)
+ if((cpu->r[RA]&1) != 0)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
- cpu->r[A] = ocarry<<7|((cpu->r[A]>>1)&0x7f);
+ cpu->r[RA] = ocarry<<7|((cpu->r[RA]>>1)&0x7f);
}
static void
Xori(CPU *cpu, Insn *insn)
{
- cpu->r[A] |= insn->imm;
+ cpu->r[RA] |= insn->imm;
- if(cpu->r[A] == 0)
+ if(cpu->r[RA] == 0)
cpu->flg |= Fzero;
else
cpu->flg &= ~Fzero;
- if((cpu->r[A] & 0x80) != 0)
+ if((cpu->r[RA] & 0x80) != 0)
cpu->flg |= Fsign;
else
cpu->flg &= ~Fsign;
@@ -965,11 +937,11 @@
static void
Xcmp(CPU *cpu, Insn *insn)
{
- if(cpu->r[A] == insn->r1)
+ if(cpu->r[RA] == insn->r1)
cpu->flg |= Fzero;
else{
cpu->flg &= ~Fzero;
- if(cpu->r[A] < insn->r1)
+ if(cpu->r[RA] < insn->r1)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
@@ -981,12 +953,12 @@
{
u8int ncarry;
- ncarry = (cpu->r[A]&0x80) != 0;
+ ncarry = (cpu->r[RA]&0x80) != 0;
if(ncarry != 0)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
- cpu->r[A] = ((cpu->r[A]<<1)&0xfe)|ncarry;
+ cpu->r[RA] = ((cpu->r[RA]<<1)&0xfe)|ncarry;
}
static void
@@ -994,12 +966,12 @@
{
u8int ncarry;
- ncarry = cpu->r[A]&1;
+ ncarry = cpu->r[RA]&1;
if(ncarry != 0)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
- cpu->r[A] = ncarry<<7|((cpu->r[A]>>1)&0x7f);
+ cpu->r[RA] = ncarry<<7|((cpu->r[RA]>>1)&0x7f);
}
static void
@@ -1014,17 +986,17 @@
static void
Xstax(CPU *cpu, Insn *insn)
{
- memwrite(rpair(cpu, insn->rp), cpu->r[A]);
+ memwrite(rpair(cpu, insn->rp), cpu->r[RA]);
}
static void
Xcpi(CPU *cpu, Insn *insn)
{
- if(cpu->r[A] == insn->imm)
+ if(cpu->r[RA] == insn->imm)
cpu->flg |= Fzero;
else{
cpu->flg &= ~Fzero;
- if(cpu->r[A] < insn->imm)
+ if(cpu->r[RA] < insn->imm)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
@@ -1036,17 +1008,17 @@
{
u8int x, p;
- if(cpu->r[A] == 0){
+ if(cpu->r[RA] == 0){
if(f & Fzero) cpu->flg |= Fzero;
if(f & Fsign) cpu->flg &= ~Fsign;
}else{
if(f & Fzero) cpu->flg &= ~Fzero;
- if((cpu->r[A] & 0x80) != 0)
+ if((cpu->r[RA] & 0x80) != 0)
if(f & Fsign) cpu->flg |= Fsign;
}
if(f & Fparity){
- x = cpu->r[A];
+ x = cpu->r[RA];
p = 0;
p += (x&1); x >>= 1;
p += (x&1); x >>= 1;
@@ -1068,12 +1040,12 @@
{
u16int x;
- x = cpu->r[A] + insn->imm;
+ x = cpu->r[RA] + insn->imm;
if((x>>8) > 0)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
- cpu->r[A] = x;
+ cpu->r[RA] = x;
psz(cpu, Fparity|Fsign|Fzero);
}
@@ -1092,7 +1064,7 @@
static void
Xin(CPU *cpu, Insn *insn)
{
- cpu->r[A] = ior(insn->addr);
+ cpu->r[RA] = ior(insn->addr);
}
static void
@@ -1157,7 +1129,7 @@
u8int a, b;
u16int x;
- a = cpu->r[A];
+ a = cpu->r[RA];
b = -insn->imm;
if((((a&0xf)+(b&0xf))&0x10) != 0)
cpu->flg |= Fhcarry;
@@ -1168,7 +1140,7 @@
cpu->flg &= ~Fcarry;
else
cpu->flg |= Fcarry;
- cpu->r[A] = x;
+ cpu->r[RA] = x;
psz(cpu, Fparity|Fsign|Fzero);
}
@@ -1178,17 +1150,17 @@
u8int x;
x = memread(cpu->SP+0);
- memwrite(cpu->SP+0, cpu->r[L]);
- cpu->r[L] = x;
+ memwrite(cpu->SP+0, cpu->r[RL]);
+ cpu->r[RL] = x;
x = memread(cpu->SP+1);
- memwrite(cpu->SP+1, cpu->r[H]);
- cpu->r[H] = x;
+ memwrite(cpu->SP+1, cpu->r[RH]);
+ cpu->r[RH] = x;
}
static void
Xpchl(CPU *cpu, Insn*)
{
- cpu->PC = rpair(cpu, HL);
+ cpu->PC = rpair(cpu, RHL);
}
static void
@@ -1205,22 +1177,22 @@
{
u16int x;
- if((cpu->flg&Fhcarry) != 0 || cpu->r[A] > 9){
- x = (cpu->r[A]&0xf)+6;
+ if((cpu->flg&Fhcarry) != 0 || cpu->r[RA] > 9){
+ x = (cpu->r[RA]&0xf)+6;
if(x>>4 > 0)
cpu->flg |= Fhcarry;
else
cpu->flg &= ~Fhcarry;
- cpu->r[A] = (cpu->r[A]&0xf0)|(x&0x0f);
+ cpu->r[RA] = (cpu->r[RA]&0xf0)|(x&0x0f);
}
- if((cpu->flg&Fcarry) != 0 || (cpu->r[A]>>4) > 9){
- x = (cpu->r[A]>>4)+6;
+ if((cpu->flg&Fcarry) != 0 || (cpu->r[RA]>>4) > 9){
+ x = (cpu->r[RA]>>4)+6;
if(x>>4 > 0)
cpu->flg |= Fcarry;
else
cpu->flg &= ~Fcarry;
- cpu->r[A] = (x<<4)|(cpu->r[A]&0xf);
+ cpu->r[RA] = (x<<4)|(cpu->r[RA]&0xf);
}
}
@@ -1241,6 +1213,6 @@
static void
Xshld(CPU *cpu, Insn *insn)
{
- memwrite(insn->addr+0, cpu->r[L]);
- memwrite(insn->addr+1, cpu->r[H]);
+ memwrite(insn->addr+0, cpu->r[RL]);
+ memwrite(insn->addr+1, cpu->r[RH]);
}
--- a/dat.h
+++ b/dat.h
@@ -16,21 +16,21 @@
};
enum{
- B,
- C,
- D,
- E,
- H,
- L,
- M, /* dummy */
- A,
+ RB,
+ RC,
+ RD,
+ RE,
+ RH,
+ RL,
+ RM, /* dummy */
+ RA,
};
enum{
- BC,
- DE,
- HL,
- MM,
+ RBC,
+ RDE,
+ RHL,
+ RMM,
};
enum{
--- a/debug.c
+++ b/debug.c
@@ -1,6 +1,7 @@
#include <u.h>
#include <libc.h>
#include <bio.h>
+#include <thread.h>
#include "dat.h"
#include "fns.h"
@@ -36,14 +37,14 @@
rnam(u8int r)
{
switch(r){
- case B: return "B";
- case C: return "C";
- case D: return "D";
- case E: return "E";
- case H: return "H";
- case L: return "L";
- case M: return "M";
- case A: return "A";
+ case RB: return "B";
+ case RC: return "C";
+ case RD: return "D";
+ case RE: return "E";
+ case RH: return "H";
+ case RL: return "L";
+ case RM: return "M";
+ case RA: return "A";
}
return "X";
}
@@ -52,9 +53,9 @@
rpnam(u8int r)
{
switch(r){
- case BC: return "BC";
- case DE: return "DE";
- case HL: return "HL";
+ case RBC: return "BC";
+ case RDE: return "DE";
+ case RHL: return "HL";
}
return "XX";
}
@@ -91,13 +92,13 @@
{
int i;
- Bprint(stderr, "A=%#.2x\n", cpu.r[A]);
- Bprint(stderr, "B=%#.2x\n", cpu.r[B]);
- Bprint(stderr, "C=%#.2x\n", cpu.r[C]);
- Bprint(stderr, "D=%#.2x\n", cpu.r[D]);
- Bprint(stderr, "E=%#.2x\n", cpu.r[E]);
- Bprint(stderr, "H=%#.2x\n", cpu.r[H]);
- Bprint(stderr, "L=%#.2x\n", cpu.r[L]);
+ Bprint(stderr, "A=%#.2x\n", cpu.r[RA]);
+ Bprint(stderr, "B=%#.2x\n", cpu.r[RB]);
+ Bprint(stderr, "C=%#.2x\n", cpu.r[RC]);
+ Bprint(stderr, "D=%#.2x\n", cpu.r[RD]);
+ Bprint(stderr, "E=%#.2x\n", cpu.r[RE]);
+ Bprint(stderr, "H=%#.2x\n", cpu.r[RH]);
+ Bprint(stderr, "L=%#.2x\n", cpu.r[RL]);
Bprint(stderr, "F=%#.2x", cpu.flg);
if(cpu.flg != 0){
Bprint(stderr, " (");
@@ -153,5 +154,5 @@
dumpinst0();
dumpregs0();
Bflush(stderr);
- exits("fatal");
+ threadexitsall("fatal");
}
--- a/screen.c
+++ b/screen.c
@@ -14,7 +14,7 @@
usage(void)
{
fprint(2, "usage: %s\n", argv0);
- exits("usage");
+ threadexitsall("usage");
}
static void
--- a/test.rc
+++ b/test.rc
@@ -1,7 +1,6 @@
#!/bin/rc
mk && 6.out -i <{cat <<EOF
load invaders.rom
-bpset 0x18dc
-bpset 0x18df
+run
EOF
}