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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user