1
0
mirror of https://github.com/rzzzwilson/pymlac.git synced 2025-06-10 09:32:41 +00:00

Display working for some DSTS values

This commit is contained in:
Ross Wilson
2018-07-30 18:50:24 +07:00
parent c8f8c295a4
commit 7068eca126
6 changed files with 76 additions and 68 deletions

View File

@@ -5,9 +5,11 @@ OFILES = vimlac.o $(DEVFILES)
CFLAGS=-O2 -Wall -pedantic -std=c99 -g
test: test_cpu
rm -f vimlac.log trace.out
./test_cpu CPU.test
test: vimlac
rm -f vimlac.log trace.out *.pbm; time ./vimlac -b ptr -ptr chars.ptp -r 040 -r 0100
# rm -f vimlac.log trace.out *.pbm; time ./vimlac -b ptr -ptr simpledisplay.ptp -r 040 -r 0100
# rm -f vimlac.log trace.out
# ./test_cpu CPU.test
test_cpu: test_cpu.c $(DEVFILES) Makefile
gcc -o test_cpu ${CFLAGS} $(DEVFILES) test_cpu.c

View File

@@ -5,10 +5,10 @@
org 0100 ;
dof ;
loop dsn ; wait until display is off
jmp .-1 ;
ssf ; wait until 40 Hz sync is set
jmp .-1 ;
scf ;
jmp loop ;
; ssf ; wait until 40 Hz sync is set
; jmp .-1 ;
; scf ;
; lda ; get data switches
; and hbit ; save only high bit (NOP or HLT)
; dac .+1 ; save and ...
@@ -16,29 +16,31 @@ loop dsn ; wait until display is off
law dsub ; start display
dla ;
don ;
; hlt ; DEBUG
; hlt ; DEBUG
jmp loop ; keep going
hbit data 0100000 ; high bit mask
;hbit data 0100000 ; high bit mask
;-------------------------------
; Display list subroutine - show all ASCII chars
;-------------------------------
dsub dsts 1 ;
dlxa 020 ;
dlya 0200 ;
dsts 0 ;
djms dlist0 ;
; dlxa 020 ;
; dlya 0160 ;
; djms dlist1 ;
; dlxa 020 ;
; dlya 0140 ;
; djms dlist2 ;
; dlxa 020 ;
; dlya 0120 ;
; djms dlist3 ;
; dlxa 020 ;
; dlya 0100 ;
; djms dlist4 ;
dsub
; dsts 1 ;
dsts 2 ;
dhvc ;
dlxa 004 ;
dlya 0400 ;
djms dlist0 ;
dlxa 0004 ;
dlya 0340 ;
djms dlist1 ;
dlxa 0004 ;
dlya 0300 ;
djms dlist2 ;
dlxa 0004 ;
dlya 0240 ;
djms dlist3 ;
; dlxa 0004 ;
; dlya 0200 ;
; djms dlist4 ;
; dsts 1 ;
; dlxa 020 ;
@@ -97,7 +99,8 @@ dsub dsts 1 ;
;-------------------------------
; Display list subroutine - show all ASCII chars
;-------------------------------
dlist0 djms space ; space
dlist0 ;
djms space ; space
djms exclam ; !
djms dquote ; "
djms hash ; #
@@ -114,7 +117,8 @@ dlist0 djms space ; space
djms dot ; .
djms slash ; /
drjm ;
dlist1 djms zero ; 0
dlist1 ;
djms zero ; 0
djms one ; 1
djms two ; 2
djms three ; 3

View File

@@ -198,8 +198,6 @@ Description : Emulate the IMLAC LAW/LWC instructions.
static int
i_LAW_LWC(bool indirect, WORD address)
{
vlog("i_LAW_LWC");
/* here 'indirect' selects between LWC and LAW */
if (indirect)
{

View File

@@ -139,24 +139,25 @@ DEIMdecode(BYTE byte)
{
strcat(bptr, "D");
*++bptr = '\0';
if (byte & 0x20)
{
strcat(bptr, "-");
*++bptr = '\0';
}
sprintf(bptr, "%d", (byte >> 3) & 0x03);
bptr = DEIM_result + strlen(DEIM_result);
if (byte & 0x04)
{
strcat(bptr, "-");
*++bptr = '\0';
}
sprintf(bptr, "%d", byte & 0x03);
bptr = DEIM_result + strlen(DEIM_result);
}
if (byte & 0x20)
{
strcat(bptr, "-");
*++bptr = '\0';
}
sprintf(bptr, "%d", (byte >> 3) & 0x03);
bptr = DEIM_result + strlen(DEIM_result);
if (byte & 0x04)
{
strcat(bptr, "-");
*++bptr = '\0';
}
sprintf(bptr, "%d", byte & 0x03);
bptr = DEIM_result + strlen(DEIM_result);
}
else
{
@@ -558,7 +559,7 @@ dcpu_execute_one(void)
vlog("dcpu_execute_one: after second doDEIMByte()");
}
trace_dcpu("INC %s", tmp_buff);
trace_dcpu("INC %s", tmp_buff);
return 1;
}

View File

@@ -43,7 +43,7 @@ void
display_reset(void)
{
for (int i = 0; i < SCALE_MAX_X * SCALE_MAX_Y; ++i)
pbm_display[i] = 0;
pbm_display[i] = 1;
vlog("Max display cell is at %d", SCALE_MAX_X * SCALE_MAX_Y -1);
// set internal state
@@ -67,7 +67,10 @@ display_init(void)
void
display_write(void)
{
vlog("display_write:");
if (!pbm_dirty)
return;
vlog("display_write: writing!");
char fname[1024];
@@ -79,7 +82,9 @@ display_write(void)
fprintf(fd, "# created by pymlac %s\n", VIMLAC_VERSION);
fprintf(fd, "%d %d\n", SCALE_MAX_X, SCALE_MAX_Y);
for (int i = 0; i < SCALE_MAX_X * SCALE_MAX_Y; ++i)
{
fprintf(fd, "%d\n", pbm_display[i]);
}
fclose(fd);
pbm_dirty = false;
@@ -105,33 +110,27 @@ display_draw(int x1, int y1, int x2, int y2)
{
vlog("display_draw: x1=%d, y1=%d, x2=%d, y2=%d", x1, y1, x2, y2);
// // convert virtual coords to physical
// x1 /= 2;
// y1 /= 2;
// x2 /= 2;
// y2 /= 2;
// invert the Y axes
y1 = SCALE_MAX_Y - y1;
y2 = SCALE_MAX_Y - y2;
y1 = SCALE_MAX_Y - 1 - y1;
y2 = SCALE_MAX_Y - 1 - y2;
// draw the line (Bresenham algorithm)
int x = x1;
int y = y1;
int dx = abs(x2 - x1);
int dy = abs(y2 - y1);
int s1, s2;
int s1 = 0;
int s2 = 0;
if (x2 > x1)
s1 = 1;
else
s2 = -1;
if (x2 < x1)
s1 = -1;
if (y2 > y1)
s2 = 1;
else
if (y2 < y1)
s2 = -1;
bool swap = false;
// vlog("display_draw: setting pixel (%d,%d)", x, y);
// pbm_display[(y-1)*SCALE_MAX_X + (x-1)] = 1;
if (dy > dx)
{
int temp = dx;
@@ -144,7 +143,7 @@ display_draw(int x1, int y1, int x2, int y2)
for (int i = 0; i < dx; ++i)
{
vlog("display_draw: setting pixel (%d,%d)", x, y);
pbm_display[(y-1)*SCALE_MAX_X + x - 1] = 1 ;
pbm_display[y*SCALE_MAX_X + x] = 0;
while (p >= 0)
{
p = p - 2*dx;
@@ -162,7 +161,7 @@ display_draw(int x1, int y1, int x2, int y2)
// draw the final point
vlog("display_draw: setting pixel (%d,%d)", x, y);
pbm_display[(y-1)*SCALE_MAX_X + x - 1] = 1 ;
pbm_display[y*SCALE_MAX_X + x] = 0;
pbm_dirty = true;

View File

@@ -121,11 +121,15 @@ run(WORD pc)
//while (cpu_running() && dcpu_running())
while (cpu_running())
{
int cycles;
int dcycles;
vlog("run: loop, PC=%06o", cpu_get_PC());
trace_start_line();
int cycles = cpu_execute_one();
int dcycles = dcpu_execute_one();
cycles = cpu_execute_one();
dcycles = dcpu_execute_one();
ptr_tick(cycles+dcycles);
ptp_tick(cycles+dcycles);