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

Slowly getting bugs out of display

This commit is contained in:
Ross Wilson 2018-07-29 20:11:33 +07:00
parent 6917b1df72
commit c8f8c295a4
10 changed files with 945 additions and 21 deletions

797
vimlac/chars.asm Executable file
View File

@ -0,0 +1,797 @@
;-------------------------------
; Test of display processor instructions
; Display characters on screen.
;-------------------------------
org 0100 ;
dof ;
loop dsn ; wait until display is off
jmp .-1 ;
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 ...
; nop ; execute
law dsub ; start display
dla ;
don ;
; hlt ; DEBUG
jmp loop ; keep going
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 ;
; dsts 1 ;
; dlxa 020 ;
; dlya 0240 ;
; dsts 1 ;
; djms dlist0 ;
; dlxa 020 ;
; dlya 0220 ;
; djms dlist1 ;
; dlxa 020 ;
; dlya 0200 ;
; djms dlist2 ;
; dlxa 020 ;
; dlya 0160 ;
; djms dlist3 ;
; dlxa 020 ;
; dlya 0140 ;
; djms dlist4 ;
;
; dsts 1 ;
; dlxa 020 ;
; dlya 0240 ;
; dsts 2 ;
; djms dlist0 ;
; dlxa 020 ;
; dlya 0220 ;
; djms dlist1 ;
; dlxa 020 ;
; dlya 0200 ;
; djms dlist2 ;
; dlxa 020 ;
; dlya 0160 ;
; djms dlist3 ;
; dlxa 020 ;
; dlya 0140 ;
; djms dlist4 ;
; dsts 1 ;
; dlxa 020 ;
; dlya 0300 ;
; dsts 3 ;
; djms dlist0 ;
; dlxa 020 ;
; dlya 0260 ;
; djms dlist1 ;
; dlxa 020 ;
; dlya 0240 ;
; djms dlist2 ;
; dlxa 020 ;
; dlya 0220 ;
; djms dlist3 ;
; dlxa 020 ;
; dlya 0200 ;
; djms dlist4 ;
dhlt ;
;-------------------------------
; Display list subroutine - show all ASCII chars
;-------------------------------
dlist0 djms space ; space
djms exclam ; !
djms dquote ; "
djms hash ; #
djms dollar ; $
djms percent ; %
djms amp ; &
djms quote ; '
djms lparen ; (
djms rparen ; )
djms star ; *
djms plus ; +
djms comma ; ,
djms minus ; -
djms dot ; .
djms slash ; /
drjm ;
dlist1 djms zero ; 0
djms one ; 1
djms two ; 2
djms three ; 3
djms four ; 4
djms five ; 5
djms six ; 6
djms seven ; 7
djms eight ; 8
djms nine ; 9
djms colon ; :
djms semcol ; ;
djms lt ; <
djms equal ; =
djms gt ; >
djms query ; ?
djms at ; @
drjm ;
dlist2 djms uppera ; A
djms upperb ; B
djms upperc ; C
djms upperd ; D
djms uppere ; E
djms upperf ; F
djms upperg ; G
djms upperh ; H
djms upperi ; I
djms upperj ; J
djms upperk ; K
djms upperl ; L
djms upperm ; M
djms uppern ; N
djms uppero ; O
djms upperp ; P
djms upperq ; Q
djms upperr ; R
djms uppers ; S
djms uppert ; T
djms upperu ; U
djms upperv ; V
djms upperw ; W
djms upperx ; X
djms uppery ; Y
djms upperz ; Z
djms lsquare ; [
djms slosh ; \
djms rsquare ; ]
djms hat ; ^
djms unders ; _
djms bquote ; `
drjm ;
dlist3 djms lowera ; a
djms lowerb ; b
djms lowerc ; c
djms lowerd ; d
djms lowere ; e
djms lowerf ; f
djms lowerg ; g
djms lowerh ; h
djms loweri ; i
djms lowerj ; j
djms lowerk ; k
djms lowerl ; l
djms lowerm ; m
djms lowern ; n
djms lowero ; o
djms lowerp ; p
djms lowerq ; q
djms lowerr ; r
djms lowers ; s
djms lowert ; t
djms loweru ; u
djms lowerv ; v
djms lowerw ; w
djms lowerx ; x
djms lowery ; y
djms lowerz ; z
djms lcurl ; {
djms pipe ; |
djms rcurl ; }
djms tilde ; ~
djms del ; DEL
djms cursn ;
djms curso ;
djms nl ;
drjm ;
dlist4 djms uppert ;
djms lowerh ;
djms lowere ;
djms space ;
djms lowerq ;
djms loweru ;
djms loweri ;
djms lowerc ;
djms lowerk ;
djms space ;
djms lowerb ;
djms lowerr ;
djms lowero ;
djms lowerw ;
djms lowern ;
djms space ;
djms lowerf ;
djms lowero ;
djms lowerx ;
djms space ;
djms lowerj ;
djms loweru ;
djms lowerm ;
djms lowerp ;
djms lowers ;
djms space ;
djms lowero ;
djms lowerv ;
djms lowere ;
djms lowerr ;
djms space ;
djms lowert ;
djms lowerh ;
djms lowere ;
djms space ;
djms lowerl ;
djms lowera ;
djms lowerz ;
djms lowery ;
djms space ;
djms lowerd ;
djms lowero ;
djms lowerg ;
djms dot ;
drjm ;
;-------------------------------
; Short vector characters
;-------------------------------
space inc e,f ; space
exclam inc e,d30 ; !
inc b00,d02 ;
inc b03,02 ;
inc b02,f ;
dquote inc e,d23 ; "
inc 03,b0-1 ;
inc -10,01 ;
inc 13,d30 ;
inc b-1-3,0-1 ;
inc 10,01 ;
inc f,f ;
hash inc e,b13 ; #
inc 13,13 ;
inc d30,b-1-3 ;
inc -1-3,-1-3 ;
inc d23,b-30 ;
inc -30,d13 ;
inc b30,30 ;
inc f,f ;
dollar inc e,d3-2 ; $
inc b03,03 ;
inc 03,03 ;
inc d3-2,b-30 ;
inc -3-2,3-2 ;
inc 3-2,-3-2 ;
inc -30,f ;
percent inc e,d20 ; %
inc b13,21 ;
inc 1-2,-2-1 ;
inc -12,02 ;
inc -12,-2-1 ;
inc 1-2,21 ;
inc 12,12 ;
inc f,f ;
amp inc e,d30 ; &
inc 30,b-33 ;
inc -23,12 ;
inc 10,1-2 ;
inc -2-2,-2-1 ;
inc 0-2,2-1 ;
inc 20,23 ;
inc f,f ;
quote inc e,d23 ; '
inc 03,b0-1 ;
inc 10,01 ;
inc -13,f ;
lparen inc e,d30 ; (
inc b-11,-12 ;
inc 02,12 ;
inc 11,f ;
rparen inc e,d20 ; )
inc b11,12 ;
inc 02,-12 ;
inc -11,f ;
star inc e,d03 ; *
inc b32,32 ;
inc d-31,b0-3 ;
inc 0-3,d31 ;
inc b-32,-32 ;
inc f,f ;
plus inc e,d31 ; +
inc b03,03 ;
inc d-3-3,b30 ;
inc 30,f ;
comma inc e,d2-2 ; ,
inc b13,01 ;
inc -10,0-1 ;
inc f,f ;
minus inc e,d13 ; -
inc b30,30 ;
inc f,f ;
dot inc e,d30 ; .
inc b00,f ;
slash inc e,d20 ; /
inc b13,13 ;
inc 13,f ;
zero inc e,d12 ; 0
inc b02,02 ;
inc 22,2-2 ;
inc 0-2,0-2 ;
inc -2-2,-22 ;
inc f,f ;
one inc e,d10 ; 1
inc b20,20 ;
inc d-20,b03 ;
inc 03,02 ;
inc -2-2,f ;
two inc e,d03 ; 2
inc 03,b22 ;
inc 20,2-2 ;
inc -1-2,-2-1 ;
inc -3-3,30 ;
inc 30,f ;
three inc e,b30 ; 3
inc 32,-22 ;
inc -30,d30 ;
inc b22,-22 ;
inc -30,f ;
four inc e,d30 ; 4
inc 10,b03 ;
inc 03,02 ;
inc -3-3,-1-2 ;
inc 30,30 ;
inc f,f ;
five inc e,b30 ; 5
inc 31,02 ;
inc -32,-30 ;
inc 03,30 ;
inc 30,f ;
six inc e,d03 ; 6
inc b21,20 ;
inc 2-2,-2-2 ;
inc -20,-22 ;
inc 03,23 ;
inc 20,2-2 ;
inc f,f ;
seven inc e,b23 ; 7
inc 33,12 ;
inc -30,-30 ;
inc f,f ;
eight inc e,d20 ; 8
inc b20,21 ;
inc 02,-31 ;
inc -32,22 ;
inc 20,2-2 ;
inc -3-2,-3-1 ;
inc 0-2,2-1 ;
inc f,f ;
nine inc e,d2-1 ; 9
inc b23,13 ;
inc 03,-30 ;
inc -2-2,2-2 ;
inc 20,f ;
colon inc e,d32 ; :
inc b00,d03 ;
inc 01,b00 ;
inc f,f ;
semcol inc e,d2-2 ; ;
inc b13,01 ;
inc -10,10 ;
inc d03,01 ;
inc b-10,f ;
lt inc e,d31 ; <
inc 30,b-21 ;
inc -21,-21 ;
inc 21,21 ;
inc 21,f ;
equal inc e,d13 ; =
inc b30,30 ;
inc d02,b-30 ;
inc -30,f ;
gt inc e,d01 ; >
inc b21,21 ;
inc 21,-21 ;
inc -21,-21 ;
inc f,f ;
query inc e,d30 ; ?
inc b00,d02 ;
inc b02,22 ;
inc -12,-20 ;
inc -1-2,f ;
at inc e,d30 ; @
inc b-31,02 ;
inc 02,22 ;
inc 30,1-3 ;
inc -1-2,-30 ;
inc 02,20 ;
inc 0-2,f ;
uppera inc e,b13 ; A
inc 13,12 ;
inc 1-3,1-3 ;
inc 1-2,d-23 ;
inc b-30,f ;
upperb inc e,b03 ; b
inc 03,02 ;
inc 30,2-1 ;
inc 0-2,-2-1 ;
inc -30,d30 ;
inc b3-1,0-2 ;
inc -3-1,-30 ;
inc f,f ;
upperc inc e,d32 ; C
inc 30,b-2-2 ;
inc -20,-22 ;
inc 03,23 ;
inc 20,2-2 ;
inc f,f ;
upperd inc e,b03 ; d
inc 03,02 ;
inc 30,2-1 ;
inc 1-2,0-2 ;
inc -1-2,-2-1 ;
inc -30,f ;
uppere inc e,b03 ; E
inc 03,02 ;
inc 30,30 ;
inc d-1-2,-1-2 ;
inc b-20,-20 ;
inc d0-2,0-2 ;
inc b30,30 ;
inc f,f ;
upperf inc e,b03 ; F
inc 02,30 ;
inc d-30,b03 ;
inc 30,30 ;
inc f,f ;
upperg inc e,d33 ; G
inc b30,-1-3 ;
inc -30,-23 ;
inc 03,32 ;
inc 3-1,f ;
upperh inc e,b03 ; H
inc 03,02 ;
inc d0-3,0-1 ;
inc b30,30 ;
inc y,b03 ;
inc 03,02 ;
inc y,f ;
upperi inc e,b30 ; I
inc 30,d-31 ;
inc b03,03 ;
inc d-31,b30 ;
inc 30,f ;
upperj inc e,d02 ; J
inc b2-2,20 ;
inc 22,03 ;
inc 03,f ;
upperk inc e,b03 ; K
inc 03,02 ;
inc d0-3,0-1 ;
inc b32,32 ;
inc y,b-13 ;
inc -23,f ;
upperl inc e,b03 ; L
inc 03,02 ;
inc y,b30 ;
inc 30,f ;
upperm inc e,b03 ; M
inc 03,02 ;
inc 3-3,33 ;
inc 0-3,0-3 ;
inc 0-2,f ;
uppern inc e,b03 ; N
inc 03,02 ;
inc 2-3,2-3 ;
inc 2-2,03 ;
inc 03,02 ;
inc f,f ;
uppero inc e,d10 ; O
inc b20,20 ;
inc 13,02 ;
inc -13,-20 ;
inc -20,-1-3 ;
inc 0-2,1-3 ;
inc f,f ;
upperp inc e,b03 ; P
inc 03,02 ;
inc 30,3-1 ;
inc 0-2,-3-1 ;
inc -30,f ;
upperq inc e,d10 ; Q
inc b30,23 ;
inc 03,-12 ;
inc -30,-2-3 ;
inc 0-3,1-2 ;
inc d33,b3-3 ;
inc f,f ;
upperr inc e,b03 ; R
inc 03,02 ;
inc 30,3-1 ;
inc 0-2,-3-1 ;
inc -30,d30 ;
inc b2-2,1-2 ;
inc f,f ;
uppers inc e,d01 ; S
inc b2-1,30 ;
inc 13,-31 ;
inc -31,13 ;
inc 30,2-1 ;
inc f,f ;
uppert inc e,d30 ; T
inc b03,03 ;
inc 02,x ;
inc b30,30 ;
inc f,f ;
upperu inc e,d03 ; U
inc 03,02 ;
inc b0-3,0-3 ;
inc 2-2,20 ;
inc 22,03 ;
inc 03,f ;
upperv inc e,d03 ; V
inc 03,02 ;
inc b1-2,1-3 ;
inc 1-3,12 ;
inc 13,13 ;
inc f,f ;
upperw inc e,b03 ; W
inc 03,02 ;
inc y,b33 ;
inc 3-3,03 ;
inc 03,02 ;
inc f,f ;
upperx inc e,b23 ; X
inc 22,23 ;
inc y,b-23 ;
inc -22,-23 ;
inc f,f ;
uppery inc e,d30 ; Y
inc b02,03 ;
inc 33,x ;
inc b3-3,f ;
upperz inc e,d30 ; Z
inc 30,b-30 ;
inc -30,23 ;
inc 22,23 ;
inc -30,-30 ;
inc f,f ;
lsquare inc e,d30 ; [
inc 10,b-20 ;
inc 03,03 ;
inc 02,20 ;
inc f,f ;
slosh inc e,d30 ; \
inc 10,b-13 ;
inc -13,-12 ;
inc f,f ;
rsquare inc e,d20 ; ]
inc b20,03 ;
inc 03,02 ;
inc -20,f ;
hat inc e,d30 ; ^
inc b03,03 ;
inc 02,-1-2 ;
inc -2-2,31 ;
inc 3-1,-22 ;
inc -12,f ;
unders inc e,d-2-2 ; _
inc b30,30 ;
inc 20,20 ;
inc d-23,f ;
bquote inc e,d13 ; `
inc 03,b-22 ;
inc f,f ;
lowera inc e,d03 ; a
inc 03,b30 ;
inc 2-2,-1-3 ;
inc 2-1,d-21 ;
inc b-3-1,-12 ;
inc 21,20 ;
inc f,f ;
lowerb inc e,b03 ; b
inc 03,03 ;
inc y,d02 ;
inc b3-2,21 ;
inc 03,-22 ;
inc -3-2,f ;
lowerc inc e,d32 ; c
inc 20,b-2-2 ;
inc -20,-12 ;
inc 02,22 ;
inc 3-1,f ;
lowerd inc e,d33 ; d
inc 21,b-32 ;
inc -2-2,0-3 ;
inc 2-1,32 ;
inc d0-2,b03 ;
inc 03,03 ;
inc f,f ;
lowere inc e,d13 ; e
inc b20,20 ;
inc -23,-20 ;
inc -1-2,0-3 ;
inc 2-1,30 ;
inc f,f ;
lowerf inc e,d20 ; f
inc b03,03 ;
inc 22,2-1 ;
inc d-1-2,b-30 ;
inc -20,f ;
lowerg inc e,d0-2 ; g
inc b3-1,22 ;
inc 02,03 ;
inc -32,-2-2 ;
inc 0-3,2-1 ;
inc 32,f ;
lowerh inc e,b03 ; h
inc 03,03 ;
inc d1-3,b20 ;
inc 1-3,0-3 ;
inc f,f ;
loweri inc e,d30 ; i
inc b03,03 ;
inc d02,b00 ;
inc f,f ;
lowerj inc e,b1-2 ; j
inc 20,12 ;
inc 03,03 ;
inc d02,b00 ;
inc f,f ;
lowerk inc e,b03 ; k
inc 03,03 ;
inc d3-2,b-3-3 ;
inc 3-1,2-3 ;
inc f,f ;
lowerl inc e,d30 ; l
inc b-11,03 ;
inc 02,02 ;
inc f,f ;
lowerm inc e,b03 ; m
inc 03,d0-2 ;
inc b22,1-2 ;
inc 22,1-2 ;
inc 0-2,0-2 ;
inc d-30,b03 ;
inc f,f ;
lowern inc e,b03 ; n
inc 03,d0-2 ;
inc b32,2-3 ;
inc 0-3,f ;
lowero inc e,d10 ; o
inc b20,22 ;
inc 02,-12 ;
inc -20,-2-2 ;
inc 0-2,1-2 ;
inc f,f ;
lowerp inc e,d0-2 ; p
inc b03,03 ;
inc 03,d0-1 ;
inc b30,1-2 ;
inc -1-2,-30 ;
inc f,f ;
lowerq inc e,d32 ; q
inc 20,b-3-2 ;
inc -21,03 ;
inc 22,3-2 ;
inc 0-3,0-2 ;
inc 0-2,a0173 ;
lowerr inc e,b03 ; r
inc 03,d0-3 ;
inc b22,31 ;
inc f,f ;
lowers inc e,d01 ; s
inc b3-1,22 ;
inc -21,-31 ;
inc 22,3-1 ;
inc f,f ;
lowert inc e,d30 ; t
inc b-11,03 ;
inc 02,02 ;
inc d-2-2,b20 ;
inc 20,f ;
loweru inc e,d03 ; u
inc 03,b0-2 ;
inc 0-2,1-2 ;
inc 20,22 ;
inc 02,02 ;
inc y,d02 ;
inc b1-2,f ;
lowerv inc e,d03 ; v
inc 03,b2-3 ;
inc 1-3,13 ;
inc 13,f ;
lowerw inc e,d03 ; w
inc 03,b1-3 ;
inc 1-3,13 ;
inc 1-3,1+3 ;
inc 13,f ;
lowerx inc e,b23 ; x
inc 33,d-20 ;
inc -30,b3-3 ;
inc 2-3,f ;
lowery inc e,d1-3 ; y
inc b23,23 ;
inc 03,x ;
inc b1-3,2-3 ;
inc f,f ;
lowerz inc e,b30 ; z
inc 20,a011 ;
inc b23,33 ;
inc -30,-20 ;
inc f,f ;
lcurl inc e,d33 ; {
inc 03,b-20 ;
inc 1-3,-10 ;
inc d10,b-1-3 ;
inc 20,f ;
pipe inc e,d33 ; |
inc 03,01 ;
inc b0-3,d0-2 ;
inc b0-3,a0173 ;
rcurl inc e,d13 ; }
inc 03,b20 ;
inc -1-3,10 ;
inc d-10,b1-3 ;
inc -20,f ;
tilde inc e,d03 ; ~
inc b12,1-2 ;
inc 1-2,12 ;
inc f,f ;
del inc e,b+0+3 ; DEL (filled box)
inc b+0+3,b+1+0 ;
inc b+0-3,b+0-3 ;
inc b+1+0,b+0+3 ;
inc b+0+3,b+1+0 ;
inc b+0-3,b+0-3 ;
inc b+1+0,b+0+3 ;
inc b+0+3,f ;
cursn inc e,b03 ; cursor on
inc 03,30 ;
inc 30,0-3 ;
inc 0-3,-30 ;
inc -30,d11 ;
inc b02,02 ;
inc 20,20 ;
inc 0-2,0-2 ;
inc -30,03 ;
inc 20,0-2 ;
inc -10,01 ;
inc f,f ;
curso inc e,b03 ; cursor off
inc 03,30 ;
inc 30,0-3 ;
inc 0-3,-30 ;
inc -30,f ;
nlx inc e,d12 ; newline
inc b03,3-3 ;
inc 03,d2-2 ;
inc b0-3,30 ;
inc f,f ;
nl inc e,d12 ; newline
inc b03,2-3 ;
inc 03,d0-3 ;
inc b0-1,20 ;
inc d1-1,b03 ;
inc 03,-30 ;
inc -30,0-3 ;
inc 0-3,30 ;
inc 30,f ;
nl2 inc e,d33 ; newline
inc b0-2,-1-2 ;
inc -2-2,02 ;
inc d0-2,b20 ;
inc f,f ;
;-------------------------------
end

View File

@ -961,7 +961,7 @@ i_SSF(void)
if (cpu_sync_on)
r_PC = (r_PC + 1) & WORD_MASK;
trace_cpu("SSF\t");
trace_cpu("SSF");
return 1;
}
@ -979,7 +979,7 @@ i_SSN(void)
if (!cpu_sync_on)
r_PC = (r_PC + 1) & WORD_MASK;
trace_cpu("SSN\t");
trace_cpu("SSN");
return 1;
}

View File

@ -10,6 +10,7 @@
#include "dcpu.h"
#include "memory.h"
#include "display_pbm.h"
#include "log.h"
#include "trace.h"
@ -58,7 +59,7 @@ int DIB = 0; // ????
static BYTE Mode = MODE_NORMAL; // DEIM mode
static bool Running = false; // true if display processor is running
static char DEIM_result[10]; // holds DEIM_decode() result
static char DEIM_result[100]; // holds DEIM_decode() result
/******************************************************************************
@ -201,6 +202,7 @@ Description : Execute a DEIM instruction byte.
static
char *doDEIMByte(BYTE byte, bool last)
{
vlog("doDEIMByte: entered, last=%s", last ? "true" : "false");
char *trace = DEIMdecode(byte);
@ -214,6 +216,7 @@ char *doDEIMByte(BYTE byte, bool last)
if (byte & 0x20) // get dx sign and move X
{
vlog("doDEIMByte: -x move");
DX -= dx * DScale;
}
else
@ -223,6 +226,7 @@ char *doDEIMByte(BYTE byte, bool last)
if (byte & 0x04) // get dy sign and move Y
{
vlog("doDEIMByte: -y move");
DY -= dy * DScale;
}
else
@ -273,6 +277,8 @@ char *doDEIMByte(BYTE byte, bool last)
}
}
vlog("doDEIMByte: finished, trace='%s'", trace);
return trace;
}
@ -303,8 +309,12 @@ int i_DDYM(void)
static
int i_DEIM(WORD address)
{
vlog("i_DEIM: entered");
Mode = MODE_DEIM;
vlog("i_DEIM: just before doDEIMByte+trace_dcpu");
trace_dcpu("DEIM %s", doDEIMByte(address & 0377, true));
vlog("i_DEIM: returning 1");
return 1;
}
@ -365,14 +375,16 @@ int i_DJMS(WORD address)
static
int i_DLXA(WORD address)
{
DX = (address & BITS10) << 1;
//DX = (address & BITS10) << 1;
DX = address & BITS10;
trace_dcpu("DLXA %04o", address);
return 1;
}
static
int i_DLYA(WORD address)
{
DY = (address & BITS10) << 1;
//DY = (address & BITS10) << 1;
DY = address & BITS10;
trace_dcpu("DLYA %04o", address);
return 1;
}
@ -520,6 +532,8 @@ Description : Function to execute one display processor instruction.
int
dcpu_execute_one(void)
{
vlog("dcpu_execute_one: entered");
if (!Running)
{
return 0;
@ -532,14 +546,20 @@ dcpu_execute_one(void)
if (Mode == MODE_DEIM)
{
char *tracestr = doDEIMByte(instruction >> 8, false);
static char tmp_buff[100];
strcpy(tmp_buff, doDEIMByte(instruction >> 8, false));
vlog("dcpu_execute_one: after first doDEIMByte()");
if (Mode == MODE_DEIM)
{
strcat(tracestr, ",");
strcat(tracestr, doDEIMByte(instruction & 0xff, true));
strcat(tmp_buff, ",");
strcat(tmp_buff, doDEIMByte(instruction & 0xff, true));
vlog("dcpu_execute_one: after second doDEIMByte()");
}
trace_dcpu("INC %s", tracestr);
trace_dcpu("INC %s", tmp_buff);
return 1;
}
@ -560,7 +580,10 @@ dcpu_execute_one(void)
}
else if (opcode == 003)
{
return i_DEIM(address);
vlog("dcpu_execute_one: calling i_DEIM()");
int result = i_DEIM(address);
vlog("dcpu_execute_one: returning %d", result);
return result;
}
else if (opcode == 004)
{

View File

@ -24,18 +24,27 @@
* State variables for the display
******/
static char *pbm_display; // pointer to display array of chars
static BYTE *pbm_display; // pointer to display array of chars
static bool pbm_running = false; // true if display is ON
static int pbm_cyclecount = 0; // number of cycles for one instruction execution
static int pbm_sync40 = 0; // counter for 40Hz flag
static int pbm_file_num = 0; // number of next PBM file to write
static bool pbm_dirty = false; // 'true' if buffer unsaved
bool
display_dirty(void)
{
return pbm_dirty;
}
void
display_reset(void)
{
for (int i = 0; i < SCALE_MAX_X * SCALE_MAX_Y; ++i)
pbm_display[i] = 0;
vlog("Max display cell is at %d", SCALE_MAX_X * SCALE_MAX_Y -1);
// set internal state
pbm_running = 0;
@ -49,13 +58,17 @@ display_reset(void)
void
display_init(void)
{
pbm_display = (char *) malloc(sizeof(bool) * SCALE_MAX_X * SCALE_MAX_Y);
pbm_display = malloc(sizeof(BYTE) * SCALE_MAX_X * SCALE_MAX_Y);
display_reset();
vlog("display_init: done");
}
void
display_write(void)
{
vlog("display_write:");
char fname[1024];
pbm_file_num += 1;
@ -70,6 +83,8 @@ display_write(void)
fclose(fd);
pbm_dirty = false;
vlog("display_write: done");
}
@ -88,13 +103,15 @@ void
//draw(int x1, int y1, int x2, int y2, dotted=False)
display_draw(int x1, int y1, int x2, int y2)
{
// convert virtual coords to physical
x1 /= 2;
y1 /= 2;
x2 /= 2;
y2 /= 2;
vlog("display_draw: x1=%d, y1=%d, x2=%d, y2=%d", x1, y1, x2, y2);
// invert the Y axis
// // 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;
@ -113,7 +130,8 @@ display_draw(int x1, int y1, int x2, int y2)
else
s2 = -1;
bool swap = false;
pbm_display[(y-1)*SCALE_MAX_X + x - 1] = 1;
// 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;
@ -125,6 +143,7 @@ display_draw(int x1, int y1, int x2, int y2)
int p = 2*dy - dx;
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 ;
while (p >= 0)
{
@ -141,7 +160,13 @@ display_draw(int x1, int y1, int x2, int y2)
x += s1;
}
// draw the final point
vlog("display_draw: setting pixel (%d,%d)", x, y);
pbm_display[(y-1)*SCALE_MAX_X + x - 1] = 1 ;
pbm_dirty = true;
vlog("display_draw: finished");
}

View File

@ -12,6 +12,7 @@ void display_write(void);
void display_draw(int x1, int y1, int x2, int y2);
void display_clear(void);
void display_close(void);
bool display_dirty(void);
#endif

View File

@ -86,9 +86,20 @@ ptr_mount(char *fname)
device_cycle_count = PTR_NOT_PTR_READY_CYCLES;
device_use = InUsePTR;
vlog("ptr_mount: PTR_CHARS_PER_SECOND=%d", PTR_CHARS_PER_SECOND);
vlog("ptr_mount: PTR_CYCLES_PER_CHAR=(CPU_HERZ / PTR_CHARS_PER_SECOND)=%d/%d=%d",
CPU_HERZ, PTR_CHARS_PER_SECOND, PTR_CYCLES_PER_CHAR);
vlog("ptr_mount: PTR_READY_CYCLES=%d", PTR_READY_CYCLES);
vlog("ptr_mount: PTR_NOT_PTR_READY_CYCLES=%d", PTR_NOT_PTR_READY_CYCLES);
return 0;
}
// #define PTR_CHARS_PER_SECOND 300
// #define PTR_CYCLES_PER_CHAR (CPU_HERZ / PTR_CHARS_PER_SECOND)
// #define PTR_READY_CYCLES (int)((3 * PTR_CYCLES_PER_CHAR) / 10)
// #define PTR_NOT_PTR_READY_CYCLES (int)((7 * PTR_CYCLES_PER_CHAR) / 10)
void
ptr_dismount(void)

57
vimlac/simpledisplay.asm Executable file
View File

@ -0,0 +1,57 @@
org 0100
dof ; turn display off
wdoff dsn ;
jmp wdoff ; wait until display off
;w40hz ssf ;
; jmp w40hz ; wait for 40Hz synch
scf ;
law hello ; start display
dla ;
don ;
jmp wdoff ;
hbit data 0100000
hello dlxa 0100
dlya 0100
dsts 2
dhvc
djms upperh
djms uppere
djms upperl
djms upperl
djms uppero
dhlt
upperh inc e,b03 ; H
inc 03,02 ;
inc d0-3,0-1 ;
inc b30,30 ;
inc Y,b03 ;
inc 03,02 ;
inc Y,f ;
uppere inc e,b03 ; E
inc 03,02 ;
inc 30,30 ;
inc d-1-2,-1-2 ;
inc b-20,-20 ;
inc d0-2,0-2 ;
inc b30,30 ;
inc f,f ;
upperl inc e,b03 ; L
inc 03,02 ;
inc Y,b30 ;
inc 30,f ;
uppero inc e,d10 ; O
inc b20,20 ;
inc 13,02 ;
inc -13,-20 ;
inc -20,-1-3 ;
inc 0-2,1-3 ;
inc f,f ;
end

View File

@ -96,7 +96,7 @@ trace_regs(void)
if (TraceFlag != false)
{
sprintf(CPU_reg_trace, "AC=%06.6o L=%1.1o", cpu_get_AC(), cpu_get_L());
vlog(CPU_reg_trace);
// vlog(CPU_reg_trace);
}
}
@ -153,6 +153,8 @@ Description : printf()-style trace routine for the display CPU.
void
trace_dcpu(char *fmt, ...)
{
vlog("trace_dcpu: entered");
TraceFlag = true; // DEBUG
if (TraceFlag != false)
@ -165,5 +167,7 @@ trace_dcpu(char *fmt, ...)
trace_dregs();
}
vlog("trace_dcpu: exit");
}

View File

@ -37,6 +37,7 @@
#include "bootstrap.h"
#include "memory.h"
#include "ptrptp.h"
#include "display_pbm.h"
#include "cpu.h"
#include "dcpu.h"
#include "trace.h"
@ -112,6 +113,7 @@ str2int(char *s)
void
run(WORD pc)
{
display_init();
cpu_set_PC(pc);
cpu_start();
trace_open();
@ -130,6 +132,9 @@ run(WORD pc)
// ttyin_tick(cycles);
trace_end_line();
if (!dcpu_running() && display_dirty())
display_write();
}
trace_close();

View File

@ -22,7 +22,8 @@ typedef unsigned char BYTE;
#define MEMORY_SIZE 04000
#define CPU_HERZ 1800000
// number of machine cycles per second (1000000 / 1.8us)
#define CPU_HERZ 55555
#define MEMMASK 0xffff
#define HIGHBITMASK 0x8000
#define WORD_MASK 0xffff