From 7068eca126450cfa461d25638fbe902a807a231f Mon Sep 17 00:00:00 2001 From: Ross Wilson Date: Mon, 30 Jul 2018 18:50:24 +0700 Subject: [PATCH] Display working for some DSTS values --- vimlac/Makefile | 8 ++++--- vimlac/chars.asm | 54 ++++++++++++++++++++++++-------------------- vimlac/cpu.c | 2 -- vimlac/dcpu.c | 37 +++++++++++++++--------------- vimlac/display_pbm.c | 35 ++++++++++++++-------------- vimlac/vimlac.c | 8 +++++-- 6 files changed, 76 insertions(+), 68 deletions(-) diff --git a/vimlac/Makefile b/vimlac/Makefile index 2c3e428..f2b05ea 100755 --- a/vimlac/Makefile +++ b/vimlac/Makefile @@ -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 diff --git a/vimlac/chars.asm b/vimlac/chars.asm index c42ca20..c6b55e6 100755 --- a/vimlac/chars.asm +++ b/vimlac/chars.asm @@ -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 diff --git a/vimlac/cpu.c b/vimlac/cpu.c index dea144a..542329d 100755 --- a/vimlac/cpu.c +++ b/vimlac/cpu.c @@ -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) { diff --git a/vimlac/dcpu.c b/vimlac/dcpu.c index fedace7..db3439f 100755 --- a/vimlac/dcpu.c +++ b/vimlac/dcpu.c @@ -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; } diff --git a/vimlac/display_pbm.c b/vimlac/display_pbm.c index 886406d..6c0f759 100755 --- a/vimlac/display_pbm.c +++ b/vimlac/display_pbm.c @@ -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; diff --git a/vimlac/vimlac.c b/vimlac/vimlac.c index 23ab9a2..fee1b02 100755 --- a/vimlac/vimlac.c +++ b/vimlac/vimlac.c @@ -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);