Merged the latest ibm1130 simulator from Brian Knittel's ibm1130.org

This commit is contained in:
Mark Pizzolato 2013-04-18 11:08:10 -07:00
parent ba87329baa
commit e65ef135d2
21 changed files with 724 additions and 790 deletions

BIN
Ibm1130/ibm1130.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -1,435 +0,0 @@
# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
!IF "$(CFG)" == ""
CFG=Win32 Debug
!MESSAGE No configuration specified. Defaulting to Win32 Debug.
!ENDIF
!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug"
!MESSAGE Invalid configuration "$(CFG)" specified.
!MESSAGE You can specify a configuration when running NMAKE on this makefile
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "ibm1130.mak" CFG="Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
!ERROR An invalid configuration is specified.
!ENDIF
################################################################################
# Begin Project
# PROP Target_Last_Scanned "Win32 Debug"
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "WinRel"
# PROP BASE Intermediate_Dir "WinRel"
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "WinRel"
# PROP Intermediate_Dir "WinRel"
OUTDIR=.\WinRel
INTDIR=.\WinRel
ALL : $(OUTDIR)/ibm1130.exe $(OUTDIR)/ibm1130.bsc
$(OUTDIR) :
if not exist $(OUTDIR)/nul mkdir $(OUTDIR)
# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FR /c
# ADD CPP /nologo /W3 /GX /YX /O2 /I "c:\pdp11\supnik" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "GUI_SUPPORT" /U "VMS" /FR /c
CPP_PROJ=/nologo /W3 /GX /YX /O2 /I "c:\pdp11\supnik" /D "NDEBUG" /D "WIN32" /D\
"_CONSOLE" /D "GUI_SUPPORT" /U "VMS" /FR$(INTDIR)/ /Fp$(OUTDIR)/"ibm1130.pch"\
/Fo$(INTDIR)/ /c
CPP_OBJS=.\WinRel/
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
RSC_PROJ=/l 0x409 /fo$(INTDIR)/"ibm1130.res" /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
BSC32_FLAGS=/nologo /o$(OUTDIR)/"ibm1130.bsc"
BSC32_SBRS= \
$(INTDIR)/ibm1130_cpu.sbr \
$(INTDIR)/ibm1130_sys.sbr \
$(INTDIR)/ibm1130_cr.sbr \
$(INTDIR)/ibm1130_stddev.sbr \
$(INTDIR)/ibm1130_disk.sbr \
$(INTDIR)/ibm1130_gdu.sbr \
$(INTDIR)/ibm1130_gui.sbr \
$(INTDIR)/ibm1130_prt.sbr \
$(INTDIR)/scp.sbr \
$(INTDIR)/sim_tmxr.sbr \
$(INTDIR)/sim_sock.sbr \
$(INTDIR)/ibm1130_fmt.sbr \
$(INTDIR)/sim_console.sbr \
$(INTDIR)/sim_fio.sbr \
$(INTDIR)/sim_timer.sbr \
$(INTDIR)/ibm1130_ptrp.sbr
$(OUTDIR)/ibm1130.bsc : $(OUTDIR) $(BSC32_SBRS)
$(BSC32) @<<
$(BSC32_FLAGS) $(BSC32_SBRS)
<<
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:console /MACHINE:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib wsock32.lib shell32.lib /NOLOGO /SUBSYSTEM:console /MACHINE:I386
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib\
wsock32.lib shell32.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no\
/PDB:$(OUTDIR)/"ibm1130.pdb" /MACHINE:I386 /OUT:$(OUTDIR)/"ibm1130.exe"
DEF_FILE=
LINK32_OBJS= \
$(INTDIR)/ibm1130_cpu.obj \
$(INTDIR)/ibm1130_sys.obj \
$(INTDIR)/ibm1130_cr.obj \
$(INTDIR)/ibm1130_stddev.obj \
$(INTDIR)/ibm1130.res \
$(INTDIR)/ibm1130_disk.obj \
$(INTDIR)/ibm1130_gdu.obj \
$(INTDIR)/ibm1130_gui.obj \
$(INTDIR)/ibm1130_prt.obj \
$(INTDIR)/scp.obj \
$(INTDIR)/sim_tmxr.obj \
$(INTDIR)/sim_sock.obj \
$(INTDIR)/ibm1130_fmt.obj \
$(INTDIR)/sim_console.obj \
$(INTDIR)/sim_fio.obj \
$(INTDIR)/sim_timer.obj \
$(INTDIR)/ibm1130_ptrp.obj
$(OUTDIR)/ibm1130.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ELSEIF "$(CFG)" == "Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "WinDebug"
# PROP BASE Intermediate_Dir "WinDebug"
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "WinDebug"
# PROP Intermediate_Dir "WinDebug"
OUTDIR=.\WinDebug
INTDIR=.\WinDebug
ALL : $(OUTDIR)/ibm1130.exe $(OUTDIR)/ibm1130.bsc
$(OUTDIR) :
if not exist $(OUTDIR)/nul mkdir $(OUTDIR)
# ADD BASE CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FR /c
# ADD CPP /nologo /W3 /GX /Zi /YX /Od /I "c:\pdp11\supnik" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "GUI_SUPPORT" /U "VMS" /FR /c
CPP_PROJ=/nologo /W3 /GX /Zi /YX /Od /I "c:\pdp11\supnik" /D "_DEBUG" /D\
"WIN32" /D "_CONSOLE" /D "GUI_SUPPORT" /U "VMS" /FR$(INTDIR)/\
/Fp$(OUTDIR)/"ibm1130.pch" /Fo$(INTDIR)/ /Fd$(OUTDIR)/"ibm1130.pdb" /c
CPP_OBJS=.\WinDebug/
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
RSC_PROJ=/l 0x409 /fo$(INTDIR)/"ibm1130.res" /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
BSC32_FLAGS=/nologo /o$(OUTDIR)/"ibm1130.bsc"
BSC32_SBRS= \
$(INTDIR)/ibm1130_cpu.sbr \
$(INTDIR)/ibm1130_sys.sbr \
$(INTDIR)/ibm1130_cr.sbr \
$(INTDIR)/ibm1130_stddev.sbr \
$(INTDIR)/ibm1130_disk.sbr \
$(INTDIR)/ibm1130_gdu.sbr \
$(INTDIR)/ibm1130_gui.sbr \
$(INTDIR)/ibm1130_prt.sbr \
$(INTDIR)/scp.sbr \
$(INTDIR)/sim_tmxr.sbr \
$(INTDIR)/sim_sock.sbr \
$(INTDIR)/ibm1130_fmt.sbr \
$(INTDIR)/sim_console.sbr \
$(INTDIR)/sim_fio.sbr \
$(INTDIR)/sim_timer.sbr \
$(INTDIR)/ibm1130_ptrp.sbr
$(OUTDIR)/ibm1130.bsc : $(OUTDIR) $(BSC32_SBRS)
$(BSC32) @<<
$(BSC32_FLAGS) $(BSC32_SBRS)
<<
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:console /DEBUG /MACHINE:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib wsock32.lib shell32.lib /NOLOGO /SUBSYSTEM:console /DEBUG /MACHINE:I386
# SUBTRACT LINK32 /MAP
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib\
wsock32.lib shell32.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes\
/PDB:$(OUTDIR)/"ibm1130.pdb" /DEBUG /MACHINE:I386 /OUT:$(OUTDIR)/"ibm1130.exe"
DEF_FILE=
LINK32_OBJS= \
$(INTDIR)/ibm1130_cpu.obj \
$(INTDIR)/ibm1130_sys.obj \
$(INTDIR)/ibm1130_cr.obj \
$(INTDIR)/ibm1130_stddev.obj \
$(INTDIR)/ibm1130.res \
$(INTDIR)/ibm1130_disk.obj \
$(INTDIR)/ibm1130_gdu.obj \
$(INTDIR)/ibm1130_gui.obj \
$(INTDIR)/ibm1130_prt.obj \
$(INTDIR)/scp.obj \
$(INTDIR)/sim_tmxr.obj \
$(INTDIR)/sim_sock.obj \
$(INTDIR)/ibm1130_fmt.obj \
$(INTDIR)/sim_console.obj \
$(INTDIR)/sim_fio.obj \
$(INTDIR)/sim_timer.obj \
$(INTDIR)/ibm1130_ptrp.obj
$(OUTDIR)/ibm1130.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ENDIF
.c{$(CPP_OBJS)}.obj:
$(CPP) $(CPP_PROJ) $<
.cpp{$(CPP_OBJS)}.obj:
$(CPP) $(CPP_PROJ) $<
.cxx{$(CPP_OBJS)}.obj:
$(CPP) $(CPP_PROJ) $<
################################################################################
# Begin Group "Source Files"
################################################################################
# Begin Source File
SOURCE=.\ibm1130_cpu.c
DEP_IBM11=\
.\ibm1130_defs.h\
..\sim_defs.h
$(INTDIR)/ibm1130_cpu.obj : $(SOURCE) $(DEP_IBM11) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_sys.c
DEP_IBM113=\
.\ibm1130_defs.h\
..\sim_defs.h
$(INTDIR)/ibm1130_sys.obj : $(SOURCE) $(DEP_IBM113) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_cr.c
DEP_IBM1130=\
.\ibm1130_defs.h\
..\sim_defs.h
$(INTDIR)/ibm1130_cr.obj : $(SOURCE) $(DEP_IBM1130) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_stddev.c
DEP_IBM1130_=\
.\ibm1130_defs.h\
.\ibm1130_conout.h\
.\ibm1130_conin.h\
..\sim_defs.h
$(INTDIR)/ibm1130_stddev.obj : $(SOURCE) $(DEP_IBM1130_) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130.rc
DEP_IBM1130_R=\
.\1130consoleblank.bmp\
.\hand.cur
$(INTDIR)/ibm1130.res : $(SOURCE) $(DEP_IBM1130_R) $(INTDIR)
$(RSC) $(RSC_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_disk.c
DEP_IBM1130_D=\
.\ibm1130_defs.h\
.\dmsr2v12phases.h\
.\dmsr2v12slet.h\
..\sim_defs.h
$(INTDIR)/ibm1130_disk.obj : $(SOURCE) $(DEP_IBM1130_D) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_gdu.c
DEP_IBM1130_G=\
.\ibm1130_defs.h\
..\sim_defs.h
$(INTDIR)/ibm1130_gdu.obj : $(SOURCE) $(DEP_IBM1130_G) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_gui.c
DEP_IBM1130_GU=\
.\ibm1130_defs.h\
..\sim_defs.h
$(INTDIR)/ibm1130_gui.obj : $(SOURCE) $(DEP_IBM1130_GU) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_prt.c
DEP_IBM1130_P=\
.\ibm1130_defs.h\
.\ibm1130_prtwheel.h\
..\sim_defs.h
$(INTDIR)/ibm1130_prt.obj : $(SOURCE) $(DEP_IBM1130_P) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=\pdp11\supnik\scp.c
DEP_SCP_C=\
..\sim_defs.h\
\pdp11\supnik\sim_rev.h\
\pdp11\supnik\sim_sock.h\
\pdp11\supnik\sim_tmxr.h\
\MSVC20\INCLUDE\sys\TYPES.H
$(INTDIR)/scp.obj : $(SOURCE) $(DEP_SCP_C) $(INTDIR)
$(CPP) $(CPP_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=\pdp11\supnik\sim_tmxr.c
DEP_SIM_T=\
..\sim_defs.h\
\pdp11\supnik\sim_sock.h\
\pdp11\supnik\sim_tmxr.h\
\MSVC20\INCLUDE\sys\TYPES.H
$(INTDIR)/sim_tmxr.obj : $(SOURCE) $(DEP_SIM_T) $(INTDIR)
$(CPP) $(CPP_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=\pdp11\supnik\sim_sock.c
DEP_SIM_S=\
..\sim_defs.h\
\pdp11\supnik\sim_sock.h\
\MSVC20\INCLUDE\sys\TYPES.H
$(INTDIR)/sim_sock.obj : $(SOURCE) $(DEP_SIM_S) $(INTDIR)
$(CPP) $(CPP_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_fmt.c
$(INTDIR)/ibm1130_fmt.obj : $(SOURCE) $(INTDIR)
# End Source File
################################################################################
# Begin Source File
SOURCE=\pdp11\supnik\sim_console.c
DEP_SIM_C=\
..\sim_defs.h\
\pdp11\supnik\sim_sock.h\
\pdp11\supnik\sim_tmxr.h\
\pdp11\supnik\scp.h\
\pdp11\supnik\sim_console.h\
\pdp11\supnik\sim_timer.h\
\pdp11\supnik\sim_fio.h\
D:\PROGRA~1\MICROS~1\INCLUDE\WinSock2.h\
\MSVC20\INCLUDE\sys\TYPES.H\
D:\PROGRA~1\MICROS~1\INCLUDE\Qos.h\
D:\WINDDK\2600\inc\wxp\guiddef.h
$(INTDIR)/sim_console.obj : $(SOURCE) $(DEP_SIM_C) $(INTDIR)
$(CPP) $(CPP_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=\pdp11\supnik\sim_fio.c
DEP_SIM_F=\
..\sim_defs.h\
D:\PROGRA~1\MICROS~1\INCLUDE\BaseTsd.h\
\pdp11\supnik\scp.h\
\pdp11\supnik\sim_console.h\
\pdp11\supnik\sim_timer.h\
\pdp11\supnik\sim_fio.h
$(INTDIR)/sim_fio.obj : $(SOURCE) $(DEP_SIM_F) $(INTDIR)
$(CPP) $(CPP_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=\pdp11\supnik\sim_timer.c
DEP_SIM_TI=\
..\sim_defs.h\
D:\PROGRA~1\MICROS~1\INCLUDE\BaseTsd.h\
\pdp11\supnik\scp.h\
\pdp11\supnik\sim_console.h\
\pdp11\supnik\sim_timer.h\
\pdp11\supnik\sim_fio.h
$(INTDIR)/sim_timer.obj : $(SOURCE) $(DEP_SIM_TI) $(INTDIR)
$(CPP) $(CPP_PROJ) $(SOURCE)
# End Source File
################################################################################
# Begin Source File
SOURCE=.\ibm1130_ptrp.c
$(INTDIR)/ibm1130_ptrp.obj : $(SOURCE) $(INTDIR)
# End Source File
# End Group
# End Project
################################################################################

View file

@ -12,6 +12,14 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -19,24 +27,23 @@
// TEXTINCLUDE // TEXTINCLUDE
// //
1 TEXTINCLUDE DISCARDABLE 1 TEXTINCLUDE
BEGIN BEGIN
"ibm1130res.h\0" "ibm1130res.h\0"
END END
2 TEXTINCLUDE DISCARDABLE 2 TEXTINCLUDE
BEGIN BEGIN
"#include <windows.h>\r\n" "#include <windows.h>\r\n"
"\0" "\0"
END END
3 TEXTINCLUDE DISCARDABLE 3 TEXTINCLUDE
BEGIN BEGIN
"\r\n" "\r\n"
"\0" "\0"
END END
/////////////////////////////////////////////////////////////////////////////
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
@ -45,20 +52,72 @@ END
// Bitmap // Bitmap
// //
IDB_CONSOLE BITMAP MOVEABLE PURE "1130consoleblank.bmp" IDB_CONSOLE BITMAP "1130consoleblank.bmp"
FULL_1442 BITMAP MOVEABLE PURE "1442full.bmp" FULL_1442 BITMAP "1442full.bmp"
EOF_1442 BITMAP MOVEABLE PURE "1442eof.bmp" EOF_1442 BITMAP "1442eof.bmp"
EMPTY_1442 BITMAP MOVEABLE PURE "1442empty.bmp" EMPTY_1442 BITMAP "1442empty.bmp"
MIDDLE_1442 BITMAP MOVEABLE PURE "1442middle.bmp" MIDDLE_1442 BITMAP "1442middle.bmp"
FULL_1132 BITMAP MOVEABLE PURE "1132full.bmp" FULL_1132 BITMAP "1132full.bmp"
EMPTY_1132 BITMAP MOVEABLE PURE "1132empty.bmp" EMPTY_1132 BITMAP "1132empty.bmp"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Cursor // Cursor
// //
IDC_MYHAND CURSOR DISCARDABLE "HAND.CUR" IDC_MYHAND CURSOR "HAND.CUR"
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
mainicon ICON "ibm1130.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 3,8,0,0
PRODUCTVERSION 3,8,0,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "IBM 1130 simulator. For more information see http://ibm1130.org. Program based on SIMH by Bob Supnik, http:/.simh.trailing-edge.com"
VALUE "FileDescription", "ibm1130 Application"
VALUE "FileVersion", "3, 8, 0, 0"
VALUE "InternalName", "ibm1130"
VALUE "LegalCopyright", "Copyright (C) 2012, Brian Knittel. Plotter support incorporates LIBGD Copyright © 1997-2008 Thomas Boutell, Pierre A. Joye and contributors, see file COPYING at www.libgd.org"
VALUE "OriginalFilename", "ibm1130.exe"
VALUE "ProductName", "ibm1130 Application"
VALUE "ProductVersion", "3, 8, 0, 0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED #ifndef APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View file

@ -22,6 +22,16 @@
Also commented out my echo command as it's now a standard simh command Also commented out my echo command as it's now a standard simh command
27-Nov-05 BLK Added Arithmetic Factor Register support per Carl Claunch (GUI only) 27-Nov-05 BLK Added Arithmetic Factor Register support per Carl Claunch (GUI only)
06-Dec-06 BLK Moved CGI stuff out of ibm1130_cpu.c 06-Dec-06 BLK Moved CGI stuff out of ibm1130_cpu.c
01-May-07 BLK Changed name of function xio_1142_card to xio_1442_card. Corrected list of
devices in xio_devs[] (used in debugging only).
24-Mar-11 BLK Got the real IBM 1130 diagnostics (yay!). Fixed two errors detected by the CPU diagnostics:
-- was not resetting overflow bit after testing with BSC short form
(why did I think only the long form reset OV after testing?)
-- failed to detect numeric overflow in Divide instructions
Also fixed bug where simulator performed 2nd word fetch on Long mode instructions
on ops that don't have long mode, blowing out the SAR/SBR display that's important in the
IBM diagnostics. The simulator was decrementing the IAR after the incorrect fetch, so the
instructions worked correctly, but, the GUI display was wrong.
>> To do: verify actual operands stored in ARF, need to get this from state diagrams in the schematic set >> To do: verify actual operands stored in ARF, need to get this from state diagrams in the schematic set
Also: determine how many bits are actually stored in the IAR in a real 1130, by forcing wraparound Also: determine how many bits are actually stored in the IAR in a real 1130, by forcing wraparound
@ -91,6 +101,7 @@
opcode in MSBits opcode in MSBits
F = format. 0 = short (1 word), 1 = long (2 word) instruction F = format. 0 = short (1 word), 1 = long (2 word) instruction
(Not all operations have long versions. The bit is ignored for shifts, LDX, WAIT and invalid opcodes)
T = Tag 00 = no index register (e.g. IAR relative) T = Tag 00 = no index register (e.g. IAR relative)
01 = use index register 1 (e.g. core address 1 = M[1]) 01 = use index register 1 (e.g. core address 1 = M[1])
@ -153,9 +164,6 @@ static int simh_status_to_stopcode (int status);
/* hook pointers from scp.c */ /* hook pointers from scp.c */
void (*sim_vm_init) (void) = &sim_init; void (*sim_vm_init) (void) = &sim_init;
extern char* (*sim_vm_read) (char *ptr, int32 size, FILE *stream);
extern void (*sim_vm_post) (t_bool from_scp);
extern CTAB *sim_vm_cmd;
/* space to store extra simulator-specific commands */ /* space to store extra simulator-specific commands */
#define MAX_EXTRA_COMMANDS 10 #define MAX_EXTRA_COMMANDS 10
@ -222,7 +230,7 @@ t_stat cpu_set_type (UNIT *uptr, int32 value, char *cptr, void *desc);
void calc_ints (void); void calc_ints (void);
extern t_stat ts_wr (int32 data, int32 addr, int32 access); extern t_stat ts_wr (int32 data, int32 addr, int32 access);
extern UNIT cr_unit; extern UNIT cr_unit, prt_unit[];
#ifdef ENABLE_BACKTRACE #ifdef ENABLE_BACKTRACE
static void archive_backtrace(char *inst); static void archive_backtrace(char *inst);
@ -261,9 +269,15 @@ static void trace_instruction (void);
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
#define UNIT_MSIZE (1 << (UNIT_V_UF + 7)) /* flag for memory size setting */ #define UNIT_MSIZE (1 << (UNIT_V_UF + 7)) /* flag for memory size setting */
#define UNIT_1800 (1 << (UNIT_V_UF + 0)) /* flag for 1800 mode */ #define UNIT_1800 (1 << (UNIT_V_UF + 8)) /* flag for 1800 mode */
#define UNIT_TRACE (3 << (UNIT_V_UF + 9)) /* debugging tracing mode bits */
UNIT cpu_unit = { UDATA (&cpu_svc, UNIT_FIX | UNIT_BINK | UNIT_ATTABLE | UNIT_SEQ, INIMEMSIZE) }; #define UNIT_TRACE_NONE 0
#define UNIT_TRACE_IO (1 << (UNIT_V_UF+9))
#define UNIT_TRACE_INSTR (2 << (UNIT_V_UF+9))
#define UNIT_TRACE_BOTH (3 << (UNIT_V_UF+9))
UNIT cpu_unit = { UDATA (&cpu_svc, UNIT_FIX | UNIT_BINK | UNIT_ATTABLE | UNIT_SEQ | UNIT_TRACE_BOTH, INIMEMSIZE) };
REG cpu_reg[] = { REG cpu_reg[] = {
{ HRDATA (IAR, IAR, 32) }, { HRDATA (IAR, IAR, 32) },
@ -308,6 +322,10 @@ MTAB cpu_mod[] = {
{ UNIT_1800, 0, "1130", "1130", &cpu_set_type}, { UNIT_1800, 0, "1130", "1130", &cpu_set_type},
{ UNIT_1800, UNIT_1800, "1800", "1800", &cpu_set_type}, { UNIT_1800, UNIT_1800, "1800", "1800", &cpu_set_type},
#endif #endif
{ UNIT_TRACE, UNIT_TRACE_NONE, "notrace", "NOTRACE", NULL},
{ UNIT_TRACE, UNIT_TRACE_IO, "traceIO", "TRACEIO", NULL},
{ UNIT_TRACE, UNIT_TRACE_INSTR, "traceInstr", "TRACEINSTR", NULL},
{ UNIT_TRACE, UNIT_TRACE_BOTH, "traceBoth", "TRACEBOTH", NULL},
{ 0 } }; { 0 } };
DEVICE cpu_dev = { DEVICE cpu_dev = {
@ -433,7 +451,6 @@ void calc_ints (void)
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
#define INCREMENT_IAR IAR = (IAR + 1) & mem_mask #define INCREMENT_IAR IAR = (IAR + 1) & mem_mask
#define DECREMENT_IAR IAR = (IAR - 1) & mem_mask
void bail (char *msg) void bail (char *msg)
{ {
@ -441,36 +458,53 @@ void bail (char *msg)
exit(1); exit(1);
} }
static void weirdop (char *msg, int offset) static void weirdop (char *msg)
{ {
printf("Weird opcode: %s at %04x\n", msg, IAR+offset); printf("Weird opcode: %s at %04x\n", msg, IAR-1);
} }
static char *xio_devs[] = { static char *xio_devs[] = {
"0?", "console", "1142card", "1134papertape", "dev-00?", "console", "1442card", "1134ptape",
"dsk0", "1627plot", "1132print", "switches", "dsk0", "1627plot", "1132print", "switches",
"1231omr", "2501card", "comm", "b?", "1231omr", "2501card", "sca", "dev-0b?",
"sys7", "d?", "e?", "f?", "sys7", "dev-0d?", "dev-0e?", "dev-0f?",
"10?", "dsk1", "dsk2", "dsk3", "dev-10?", "dsk1", "dsk2", "dsk3",
"dsk4", "dsk5", "dsk6", "dsk7+", "dsk4", "1403prt", "dsk5", "2311drv2",
"18?", "2250disp", "2741attachment", "1b", "dev-18?", "2250disp", "2741term", "dev-1b",
"1c?", "1d?", "1e?", "1f?" "dev-1c?", "dev-1d?", "dev-1e?", "dev-1f?"
}; };
static char *xio_funcs[] = { static char *xio_funcs[] = {
"0?", "write", "read", "sense_irq", "func0?", "write", "read", "sense_irq",
"control", "initw", "initr", "sense" "control", "initw", "initr", "sense"
}; };
t_stat sim_instr (void) t_stat sim_instr (void)
{ {
int32 i, eaddr, INDIR, IR, F, DSPLC, word2, oldval, newval, src, src2, dst, abit, xbit; int32 i, eaddr, INDIR, IR, F, DSPLC, word2, oldval, newval, src, src2, dst, abit, xbit;
int32 iocc_addr, iocc_op, iocc_dev, iocc_func, iocc_mod; int32 iocc_addr, iocc_op, iocc_dev, iocc_func, iocc_mod, result;
char msg[50]; char msg[50];
int cwincount = 0, status; int cwincount = 0, status;
static long ninstr = 0; static long ninstr = 0;
static char *intlabel[] = {"INT0","INT1","INT2","INT3","INT4","INT5"}; static char *intlabel[] = {"INT0","INT1","INT2","INT3","INT4","INT5"};
/* the F bit indicates a two-word instruction for most instructions except the ones marked FALSE below */
static t_bool F_bit_used[] = { /* FALSE for those few instructions that don't have a long instr version */
/*undef XIO SLx SRx LDS STS WAIT undef */
FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE,
/*BSI BSC undef undef LDX STX MDX undef */
TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE,
/*A AD S SD M D CPU dependent */
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,
/*LD LDD STO STD AND OR EOR undef */
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE
};
#ifdef ENABLE_1800_SUPPORT
F_bit_used[0x16] = is_1800; /* these two are defined and do have long versions on the 1800 */
F_bit_used[0x17] = is_1800; /* but are undefined on the 1130, so set these accordingly */
#endif
if (cgi) /* give CGI hook function a chance to do something */ if (cgi) /* give CGI hook function a chance to do something */
cgi_start(); cgi_start();
@ -581,7 +615,7 @@ t_stat sim_instr (void)
} }
ninstr++; ninstr++;
if (cpu_unit.flags & UNIT_ATT) if ((cpu_unit.flags & (UNIT_ATT|UNIT_TRACE_INSTR)) == (UNIT_ATT|UNIT_TRACE_INSTR))
trace_instruction(); /* log CPU details if logging is enabled */ trace_instruction(); /* log CPU details if logging is enabled */
prev_IAR = IAR; /* save IAR before incrementing it */ prev_IAR = IAR; /* save IAR before incrementing it */
@ -598,7 +632,7 @@ t_stat sim_instr (void)
/* here I compute the usual effective address on the assumption that the instruction will need it. Some don't. */ /* here I compute the usual effective address on the assumption that the instruction will need it. Some don't. */
if (F) { /* long instruction, ASSUME it's valid (have to decrement IAR if not) */ if (F && F_bit_used[OP]) { /* long instruction, except for a few that don't have a long mode, like WAIT */
INDIR = IR & 0x0080; /* indirect bit */ INDIR = IR & 0x0080; /* indirect bit */
DSPLC = IR & 0x007F; /* displacement or modifier */ DSPLC = IR & 0x007F; /* displacement or modifier */
if (DSPLC & 0x0040) if (DSPLC & 0x0040)
@ -612,6 +646,8 @@ t_stat sim_instr (void)
eaddr += ReadIndex(TAG); /* add index register value */ eaddr += ReadIndex(TAG); /* add index register value */
if (INDIR) /* if indirect addressing */ if (INDIR) /* if indirect addressing */
eaddr = ReadW(eaddr); /* pick up referenced address */ eaddr = ReadW(eaddr); /* pick up referenced address */
/* to do: the previous steps may lead to incorrect GUI SAR/SBR display if the instruction doesn't actually fetch anything. Check this. */
} }
else { /* short instruction, use displacement */ else { /* short instruction, use displacement */
INDIR = 0; /* never indirect */ INDIR = 0; /* never indirect */
@ -623,6 +659,8 @@ t_stat sim_instr (void)
eaddr = ReadIndex(TAG) + DSPLC; /* add index register value */ eaddr = ReadIndex(TAG) + DSPLC; /* add index register value */
else else
eaddr = IAR + DSPLC; /* otherwise relative to IAR after fetch */ eaddr = IAR + DSPLC; /* otherwise relative to IAR after fetch */
/* to do: the previous steps may lead to incorrect GUI SAR/SBR display if the instruction doesn't actually fetch the index value. Check this. */
} }
switch (OP) { /* decode instruction */ switch (OP) { /* decode instruction */
@ -634,16 +672,14 @@ t_stat sim_instr (void)
iocc_func = (iocc_op >> 8) & 0x0007; iocc_func = (iocc_op >> 8) & 0x0007;
iocc_mod = iocc_op & 0x00FF; iocc_mod = iocc_op & 0x00FF;
if (cpu_unit.flags & UNIT_ATT) if ((cpu_unit.flags & (UNIT_ATT|UNIT_TRACE_IO)) == (UNIT_ATT|UNIT_TRACE_IO))
trace_io("* XIO %s %s mod %02x addr %04x", xio_funcs[iocc_func], xio_devs[iocc_dev], iocc_mod, iocc_addr); trace_io("* XIO %s %s mod %02x addr %04x", xio_funcs[iocc_func], (iocc_func == XIO_SENSE_IRQ) ? "-" : xio_devs[iocc_dev], iocc_mod, iocc_addr);
/* fprintf(stderr, "* XIO %s %s mod %02x addr %04x\n", xio_funcs[iocc_func], xio_devs[iocc_dev], iocc_mod, iocc_addr); */
ACC = 0; /* ACC is destroyed, and default XIO_SENSE_DEV result is 0 */ ACC = 0; /* ACC is destroyed, and default XIO_SENSE_DEV result is 0 */
switch (iocc_func) { switch (iocc_func) {
case XIO_UNUSED: case XIO_UNUSED:
sprintf(msg, "Unknown op %x on device %02x", iocc_func, iocc_dev); sprintf(msg, "Unknown XIO op %x on device %02x (%s)", iocc_func, iocc_dev, xio_devs[iocc_dev]);
xio_error(msg); xio_error(msg);
break; break;
@ -656,8 +692,8 @@ t_stat sim_instr (void)
case 0x01: /* console keyboard and printer */ case 0x01: /* console keyboard and printer */
xio_1131_console(iocc_addr, iocc_func, iocc_mod); xio_1131_console(iocc_addr, iocc_func, iocc_mod);
break; break;
case 0x02: /* 1142 card reader/punch */ case 0x02: /* 1442 card reader/punch */
xio_1142_card(iocc_addr, iocc_func, iocc_mod); xio_1442_card(iocc_addr, iocc_func, iocc_mod);
break; break;
case 0x03: /* 1134 paper tape reader/punch */ case 0x03: /* 1134 paper tape reader/punch */
xio_1134_papertape(iocc_addr, iocc_func, iocc_mod); xio_1134_papertape(iocc_addr, iocc_func, iocc_mod);
@ -724,10 +760,8 @@ t_stat sim_instr (void)
break; break;
case 0x02: /* --- SLA,SLT,SLC,SLCA,NOP - Shift Left family --- */ case 0x02: /* --- SLA,SLT,SLC,SLCA,NOP - Shift Left family --- */
if (F) { if (F)
weirdop("Long Left Shift", -2); weirdop("Long Left Shift");
DECREMENT_IAR;
}
CCC = ((TAG == 0) ? DSPLC : ReadIndex(TAG)) & 0x003F; CCC = ((TAG == 0) ? DSPLC : ReadIndex(TAG)) & 0x003F;
ARFSET(CCC); ARFSET(CCC);
@ -764,7 +798,7 @@ t_stat sim_instr (void)
CCC--; CCC--;
} }
C = (CCC != 0); C = (CCC != 0);
WriteIndex(TAG, (ReadIndex(TAG) & 0xFF00) | CCC); /* put 6 bits back into low byte of index register */ WriteIndex(TAG, ReadIndex(TAG) & 0xFF00 | CCC); /* put 6 bits back into low byte of index register */
break; break;
} }
/* if TAG == 0, fall through and treat like normal shift SLT */ /* if TAG == 0, fall through and treat like normal shift SLT */
@ -786,10 +820,8 @@ t_stat sim_instr (void)
break; break;
case 0x03: /* --- SRA, SRT, RTE - Shift Right family --- */ case 0x03: /* --- SRA, SRT, RTE - Shift Right family --- */
if (F) { if (F)
weirdop("Long Right Shift", -2); weirdop("Long Right Shift");
DECREMENT_IAR;
}
CCC = ((TAG == 0) ? DSPLC : ReadIndex(TAG)) & 0x3F; CCC = ((TAG == 0) ? DSPLC : ReadIndex(TAG)) & 0x3F;
ARFSET(CCC); ARFSET(CCC);
@ -810,8 +842,8 @@ t_stat sim_instr (void)
while (CCC > 0) { while (CCC > 0) {
xbit = (ACC & 0x0001) << 15; xbit = (ACC & 0x0001) << 15;
abit = (ACC & 0x8000); abit = (ACC & 0x8000);
ACC = ((ACC >> 1) & 0x7FFF) | abit; ACC = (ACC >> 1) & 0x7FFF | abit;
EXT = ((EXT >> 1) & 0x7FFF) | xbit; EXT = (EXT >> 1) & 0x7FFF | xbit;
CCC--; CCC--;
} }
break; break;
@ -820,8 +852,8 @@ t_stat sim_instr (void)
while (CCC > 0) { while (CCC > 0) {
abit = (EXT & 0x0001) << 15; abit = (EXT & 0x0001) << 15;
xbit = (ACC & 0x0001) << 15; xbit = (ACC & 0x0001) << 15;
ACC = ((ACC >> 1) & 0x7FFF) | abit; ACC = (ACC >> 1) & 0x7FFF | abit;
EXT = ((EXT >> 1) & 0x7FFF) | xbit; EXT = (EXT >> 1) & 0x7FFF | xbit;
CCC--; CCC--;
} }
break; break;
@ -833,10 +865,8 @@ t_stat sim_instr (void)
break; break;
case 0x04: /* --- LDS - Load Status --- */ case 0x04: /* --- LDS - Load Status --- */
if (F) { /* never fetches second word? */ if (F) /* never fetches second word? */
weirdop("Long LDS", -2); weirdop("Long LDS");
DECREMENT_IAR;
}
V = (DSPLC & 1); V = (DSPLC & 1);
C = (DSPLC & 2) >> 1; C = (DSPLC & 2) >> 1;
@ -854,11 +884,15 @@ t_stat sim_instr (void)
break; break;
case 0x06: /* --- WAIT --- */ case 0x06: /* --- WAIT --- */
/* I am no longer doing the fetch if a long wait is encountered
* The 1130 diagnostics use WAIT instructions with the F bit set in some display error codes.
* (The wait instruction's opcode is displayed in the Storage Buffer Register on the console display,
* since the last thing fetched was the instruction)
*/
wait_state = WAIT_OP; wait_state = WAIT_OP;
if (F) { /* what happens if we use long format? */
weirdop("Long WAIT", -2); SAR = prev_IAR; /* this is a hack; ensure that the SAR/SBR display shows the WAIT instruction fetch */
DECREMENT_IAR; /* assume it wouldn't have fetched 2nd word? */ SBR = IR;
}
break; break;
case 0x08: /* --- BSI - Branch and store IAR --- */ case 0x08: /* --- BSI - Branch and store IAR --- */
@ -1023,10 +1057,20 @@ t_stat sim_instr (void)
ARFSET(src2); ARFSET(src2);
if (src2 == 0) /* 24-Mar-11 - Failed IBM diagnostics because I was not checking for overflow here. Fixed.
* Have to check for special case of -maxint / -1 because Windows (at least) generates an exception
*/
if (src2 == 0) {
V = 1; /* divide by zero just sets overflow, ACC & EXT are undefined */ V = 1; /* divide by zero just sets overflow, ACC & EXT are undefined */
}
else if (src2 == -1 && src == 0x80000000) {
V = 1; /* another special case: max negative int / -1 also overflows */
}
else { else {
ACC = (src / src2) & 0xFFFF; result = src / src2; /* compute dividend */
if ((result > 32767) || (result < -32768))
V = 1; /* if result does not fit into 16 bits, we have an overflow */
ACC = result & 0xFFFF;
EXT = (src % src2) & 0xFFFF; EXT = (src % src2) & 0xFFFF;
} }
break; break;
@ -1105,13 +1149,11 @@ t_stat sim_instr (void)
/* case 0x07: */ /* case 0x07: */
/* case 0x0a: */ /* case 0x0a: */
/* case 0x0b: */ /* case 0x0b: */
/* case 0x0e: */
/* case 0x0f: */ /* case 0x0f: */
/* case 0x1f: */ /* case 0x1f: */
wait_state = WAIT_INVALID_OP; wait_state = WAIT_INVALID_OP;
if (F) SAR = prev_IAR; /* this is a hack; ensure that the SAR/SBR display shows the WAIT instruction fetch */
DECREMENT_IAR; /* assume it wouldn't have fetched 2nd word? */ SBR = IR;
break; break;
} /* end instruction decode switch */ } /* end instruction decode switch */
@ -1164,6 +1206,7 @@ static int simh_status_to_stopcode (int status)
* bsctest - perform standard set of condition tests. We return TRUE if any * bsctest - perform standard set of condition tests. We return TRUE if any
* of the condition bits specified in DSPLC test positive, FALSE if none are true. * of the condition bits specified in DSPLC test positive, FALSE if none are true.
* If reset_V is TRUE, we reset the oVerflow flag after testing it. * If reset_V is TRUE, we reset the oVerflow flag after testing it.
* 24-Mar-11: no, we reset the oVerflow flag no matter what reset_V is
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
static t_bool bsctest (int32 DSPLC, t_bool reset_V) static t_bool bsctest (int32 DSPLC, t_bool reset_V)
@ -1171,7 +1214,8 @@ static t_bool bsctest (int32 DSPLC, t_bool reset_V)
if (DSPLC & 0x01) { /* Overflow off (note inverted sense) */ if (DSPLC & 0x01) { /* Overflow off (note inverted sense) */
if (! V) if (! V)
return TRUE; return TRUE;
else if (reset_V) /* reset after testing */ // 24-Mar-11 - V is always reset when tested, in both the long and short forms of the instructions
// else if (reset_V) /* reset after testing */
V = 0; V = 0;
} }
@ -1253,7 +1297,7 @@ t_stat cpu_reset (DEVICE *dptr)
wait_state = 0; /* cancel wait */ wait_state = 0; /* cancel wait */
wait_lamp = TRUE; /* but keep the wait lamp lit on the GUI */ wait_lamp = TRUE; /* but keep the wait lamp lit on the GUI */
if (cpu_unit.flags & UNIT_ATT) { /* record reset in CPU log */ if ((cpu_unit.flags & (UNIT_ATT|UNIT_TRACE_INSTR)) == (UNIT_ATT|UNIT_TRACE_INSTR)) { /* record reset in CPU log */
fseek(cpu_unit.fileref, 0, SEEK_END); fseek(cpu_unit.fileref, 0, SEEK_END);
fprintf(cpu_unit.fileref, "---RESET---" CRLF); fprintf(cpu_unit.fileref, "---RESET---" CRLF);
} }
@ -1451,7 +1495,7 @@ t_stat register_cmd (char *name, t_stat (*action)(int32 flag, char *ptr), int ar
* echo_cmd - just echo the command line * echo_cmd - just echo the command line
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
static t_stat echo_cmd (int flag, char *cptr) static t_stat echo_cmd (int32 flag, char *cptr)
{ {
printf("%s\n", cptr); printf("%s\n", cptr);
return SCPE_OK; return SCPE_OK;
@ -1794,6 +1838,11 @@ static void trace_instruction (void)
fputs(CRLF, cpu_unit.fileref); fputs(CRLF, cpu_unit.fileref);
} }
static void trace_common (FILE *fout)
{
fprintf(fout, "[IAR %04x IPL %c] ", IAR, (ipl < 0) ? ' ' : ('0' + ipl));
}
void trace_io (char *fmt, ...) void trace_io (char *fmt, ...)
{ {
va_list args; va_list args;
@ -1801,6 +1850,7 @@ void trace_io (char *fmt, ...)
if ((cpu_unit.flags & UNIT_ATT) == 0) if ((cpu_unit.flags & UNIT_ATT) == 0)
return; return;
trace_common(cpu_unit.fileref);
va_start(args, fmt); /* get pointer to argument list */ va_start(args, fmt); /* get pointer to argument list */
vfprintf(cpu_unit.fileref, fmt, args); /* write errors to cpu log file */ vfprintf(cpu_unit.fileref, fmt, args); /* write errors to cpu log file */
va_end(args); va_end(args);
@ -1813,12 +1863,14 @@ void trace_both (char *fmt, ...)
va_list args; va_list args;
if (cpu_unit.flags & UNIT_ATT) { if (cpu_unit.flags & UNIT_ATT) {
trace_common(cpu_unit.fileref);
va_start(args, fmt); /* get pointer to argument list */ va_start(args, fmt); /* get pointer to argument list */
vfprintf(cpu_unit.fileref, fmt, args); vfprintf(cpu_unit.fileref, fmt, args);
va_end(args); va_end(args);
fputs(CRLF, cpu_unit.fileref); fputs(CRLF, cpu_unit.fileref);
} }
trace_common(stdout);
va_start(args, fmt); /* get pointer to argument list */ va_start(args, fmt); /* get pointer to argument list */
vfprintf(stdout, fmt, args); vfprintf(stdout, fmt, args);
va_end(args); va_end(args);
@ -1830,17 +1882,32 @@ void trace_both (char *fmt, ...)
void debug_print (char *fmt, ...) void debug_print (char *fmt, ...)
{ {
va_list args; va_list args;
FILE *fout = stdout;
t_bool binarymode = FALSE;
#define DEBUG_TO_PRINTER
#ifdef DEBUG_TO_PRINTER
if (prt_unit[0].fileref != NULL) { /* THIS IS TEMPORARY */
fout = prt_unit[0].fileref;
binarymode = TRUE;
}
#endif
va_start(args, fmt); va_start(args, fmt);
vprintf(fmt, args); vfprintf(fout, fmt, args);
if (cpu_unit.flags & UNIT_ATT) if (cpu_unit.flags & UNIT_ATT)
vfprintf(cpu_unit.fileref, fmt, args); vfprintf(cpu_unit.fileref, fmt, args);
va_end(args); va_end(args);
if (strchr(fmt, '\n') == NULL) { /* be sure to emit a newline */ if (strchr(fmt, '\n') == NULL) { /* be sure to emit a newline */
putchar('\n'); if (binarymode)
fputs(CRLF, fout);
else
putc('\n', fout);
if (cpu_unit.flags & UNIT_ATT) if (cpu_unit.flags & UNIT_ATT)
putc('\n', cpu_unit.fileref); fputs(CRLF, cpu_unit.fileref);
} }
} }

View file

@ -1,5 +1,6 @@
#include "ibm1130_defs.h" #include "ibm1130_defs.h"
#include "ibm1130_fmt.h" #include "ibm1130_fmt.h"
#include <ctype.h>
#ifdef _WIN32 #ifdef _WIN32
# include <io.h> /* Microsoft puts definition of mktemp into io.h rather than stdlib.h */ # include <io.h> /* Microsoft puts definition of mktemp into io.h rather than stdlib.h */
@ -18,6 +19,16 @@
* This is not a supported product, but I welcome bug reports and fixes. * This is not a supported product, but I welcome bug reports and fixes.
* Mail to simh@ibm1130.org * Mail to simh@ibm1130.org
* Update 2012-10-12 Added ability to specify tab expansion width in deck files
* Update 2008-11-24 Made card reader attach always use read-only mode, so if file does not exist
it will not be created as an empty file. Fixed bug in BOOT CR (cold start from card)
that resulted in seeing cold card data again when next card was read. (This caused
the DMS load deck to fail, for instance).
* Update 2007-05-01 Changed name of function xio_1142_card to xio_1442_card.
Took six years to notice the mistake.
* Update 2006-01-23 More fixes, in call to mktemp and in 2501 support, also thanks * Update 2006-01-23 More fixes, in call to mktemp and in 2501 support, also thanks
to Carl Claunch. to Carl Claunch.
@ -63,7 +74,7 @@
-q quiet mode, the simulator will not print the name of each file it opens -q quiet mode, the simulator will not print the name of each file it opens
while processing deck files (which are discussed below). For example, while processing deck files (which are discussed below). For example,
ATTACH -q @deckfile ATTACH CR -q @deckfile
-l makes the simulator convert lower case letters in text decks -l makes the simulator convert lower case letters in text decks
to the IBM lower-case Hollerith character codes. Normally, the simulator to the IBM lower-case Hollerith character codes. Normally, the simulator
@ -75,11 +86,15 @@
-f converts tabs in an ascii file to spaces according to Fortran column conventions -f converts tabs in an ascii file to spaces according to Fortran column conventions
-a converts tabs in an ascii file to spaces according to 1130 Assembler column conventions -a converts tabs in an ascii file to spaces according to 1130 Assembler column conventions
-t converts tabs in an ascii file to spaces, with tab settings every 8 columns -t converts tabs in an ascii file to spaces, with tab settings every 8 columns
-# converts tabs in an ascii file to spaces, with tab settings every # columns
(See below for a discussion of tab formatting) (See below for a discussion of tab formatting)
-p means that filename is a COM port connected to a physical card reader using -p means that filename is a COM port connected to a physical card reader using
the CARDREAD interface (see http://ibm1130.org/sim/downloads) the CARDREAD interface (see http://ibm1130.org/sim/downloads)
NOTE: for the Card Reader (CR), the -r (readonly) switch is implied. If the file does
not exist, it will NOT be created.
The ATTACH CP command accepts the -d switch. The ATTACH CP command accepts the -d switch.
* Deck lists * Deck lists
@ -95,7 +110,7 @@
arguments to ibm1130, or to the "do" command if a "do" script is executing, if the arguments to ibm1130, or to the "do" command if a "do" script is executing, if the
attach command is constructed this way: attach command is constructed this way:
attach @deckfile %1 %2 %3 attach CR @deckfile %1 %2 %3
This will pass the ibm1130 or do script arguments to attach, which will make This will pass the ibm1130 or do script arguments to attach, which will make
them available in the deckfile. Then, for instance the line them available in the deckfile. Then, for instance the line
@ -114,6 +129,7 @@
af forces 029 ascii conversion, and interprets tabs in Fortran mode af forces 029 ascii conversion, and interprets tabs in Fortran mode
aa forces 029 ascii conversion, and interprets tabs in 1130 Assembler mode aa forces 029 ascii conversion, and interprets tabs in 1130 Assembler mode
at forces 029 ascii conversion, and interprets tabs with settings every 8 spaces at forces 029 ascii conversion, and interprets tabs with settings every 8 spaces
a# forces 029 ascii conversion, and interprets tabs with settings every # spaces
If "a" or "b" mode is not specified, the device mode setting is used. In this case, If "a" or "b" mode is not specified, the device mode setting is used. In this case,
if the mode is "auto", the simulator will select binary or 029 by inspecting each if the mode is "auto", the simulator will select binary or 029 by inspecting each
@ -644,10 +660,12 @@ static CPCODE cardcode_026F[] = /* 026 fortran */
0x0220, '\'', 0x0220, '\'',
0x8420, '.', 0x8420, '.',
0x8220, ')', 0x8220, ')',
0x8220, '<', /* if ASCII has <, treat like ) */
0x4420, '$', 0x4420, '$',
0x4220, '*', 0x4220, '*',
0x2420, ',', 0x2420, ',',
0x2220, '(', 0x2220, '(',
0x2220, '%', /* if ASCII has %, treat like ) */
}; };
static CPCODE cardcode_026C[] = /* 026 commercial */ static CPCODE cardcode_026C[] = /* 026 commercial */
@ -695,11 +713,13 @@ static CPCODE cardcode_026C[] = /* 026 commercial */
0x0420, '=', 0x0420, '=',
0x0220, '\'', 0x0220, '\'',
0x8420, '.', 0x8420, '.',
0x8220, ')', 0x8220, '<',
0x8220, ')', /* if ASCII has ), treat like < */
0x4420, '$', 0x4420, '$',
0x4220, '*', 0x4220, '*',
0x2420, ',', 0x2420, ',',
0x2220, '(', 0x2220, '%',
0x2220, '(', /* if ASCII has (, treat like % */
}; };
extern int cgi; extern int cgi;
@ -717,7 +737,8 @@ static int any_punched = 0;
#define MAXARGS 10 /* max number of arguments to save */ #define MAXARGS 10 /* max number of arguments to save */
static char list_save[MAXARGS][MAXARGLEN], *list_arg[MAXARGLEN]; static char list_save[MAXARGS][MAXARGLEN], *list_arg[MAXARGLEN];
static int list_nargs = 0; static int list_nargs = 0;
static char* (*tab_proc)(char*) = NULL; /* tab reformatting routine */ static char* (*tab_proc)(char* str, int width) = NULL; /* tab reformatting routine */
static int tab_width = 8;
static uint16 punchstation[80]; static uint16 punchstation[80];
static uint16 readstation[80]; static uint16 readstation[80];
@ -776,10 +797,12 @@ t_stat set_active_cr_code (int match)
if (! lookup_codetable(match, &code, &ncode)) if (! lookup_codetable(match, &code, &ncode))
return SCPE_ARG; return SCPE_ARG;
if (code != NULL) { /* if an ASCII mode was selected */
memset(ascii_to_card, 0, sizeof(ascii_to_card)); memset(ascii_to_card, 0, sizeof(ascii_to_card));
for (i = 0; i < ncode; i++) /* set ascii to card code table */ for (i = 0; i < ncode; i++) /* set ascii to card code table */
ascii_to_card[code[i].ascii] = code[i].hollerith; ascii_to_card[code[i].ascii] = code[i].hollerith;
}
return SCPE_OK; return SCPE_OK;
} }
@ -938,19 +961,19 @@ t_stat load_cr_boot (int drvno, int switches)
} }
/* quiet switch or CGI mode inhibit the boot remark */ /* quiet switch or CGI mode inhibit the boot remark */
if (((switches & SWMASK('Q')) == 0) && ! cgi) { /* 3.0-3, parenthesized & operation, per lint check */ if (((switches & SWMASK('Q')) == 0) && ! cgi) { /* 3.0-3, parenthesized & operation, per lint check */
sprintf(msg, "Loaded %s cold start card\n", name); sprintf(msg, "Loaded %s cold start card", name);
#ifdef GUI_SUPPORT #ifdef GUI_SUPPORT
remark_cmd(msg); remark_cmd(msg);
#else #else
printf("%s", msg); printf("%s\n", msg);
#endif #endif
} }
return SCPE_OK; return SCPE_OK;
} }
t_stat cr_boot (int32 unitno, DEVICE *dptr) t_stat cr_boot (int unitno, DEVICE *dptr)
{ {
t_stat rval; t_stat rval;
int i; int i;
@ -962,7 +985,7 @@ t_stat cr_boot (int32 unitno, DEVICE *dptr)
return load_cr_boot(-1, 0); return load_cr_boot(-1, 0);
if (GET_ACTCODE(cr_unit) != CODE_BINARY) { if (GET_ACTCODE(cr_unit) != CODE_BINARY) {
printf("Can only boot from card reader when set to BINARY mode"); printf("Can only boot from card reader when set to BINARY mode\n");
return SCPE_IOERR; return SCPE_IOERR;
} }
@ -971,6 +994,11 @@ t_stat cr_boot (int32 unitno, DEVICE *dptr)
feedcycle(TRUE, FALSE); feedcycle(TRUE, FALSE);
if (readstate != STATION_LOADED) {
printf("No cards in reader\n");
return SCPE_IOERR;
}
/* if (fxread(buf, sizeof(buf[0]), 80, cr_unit.fileref) != 80) */ /* if (fxread(buf, sizeof(buf[0]), 80, cr_unit.fileref) != 80) */
/* return SCPE_IOERR; */ /* return SCPE_IOERR; */
@ -979,6 +1007,7 @@ t_stat cr_boot (int32 unitno, DEVICE *dptr)
for (i = 0; i < 80; i++) /* shift 12 bits into 16 */ for (i = 0; i < 80; i++) /* shift 12 bits into 16 */
WriteW(i, (readstation[i] & 0xF800) | ((readstation[i] & 0x0400) ? 0x00C0 : 0x0000) | ((readstation[i] & 0x03F0) >> 4)); WriteW(i, (readstation[i] & 0xF800) | ((readstation[i] & 0x0400) ? 0x00C0 : 0x0000) | ((readstation[i] & 0x03F0) >> 4));
readstate = STATION_READ; /* the current card has been consumed */
return SCPE_OK; return SCPE_OK;
} }
@ -1110,7 +1139,7 @@ again: /* jump here if we've loaded a new deck after emptying the previous one
if (tab_proc != NULL) { /* apply tab editing, if specified */ if (tab_proc != NULL) { /* apply tab editing, if specified */
buf[nread] = '\0'; /* .. be sure string is terminated */ buf[nread] = '\0'; /* .. be sure string is terminated */
result = (*tab_proc)(buf); /* .. convert tabs spaces */ result = (*tab_proc)(buf, tab_width); /* .. convert tabs spaces */
nread = strlen(result); /* .. set new read length */ nread = strlen(result); /* .. set new read length */
} }
else else
@ -1247,7 +1276,7 @@ static void checkdeck (void)
static t_bool nextdeck (void) static t_bool nextdeck (void)
{ {
char buf[200], tmpbuf[200], *fname, *c, quote, *mode; char buf[200], tmpbuf[200], *fname, *c, quote;
int code; int code;
long fpos; long fpos;
@ -1271,6 +1300,7 @@ static t_bool nextdeck (void)
for (;;) { /* get a filename */ for (;;) { /* get a filename */
tab_proc = NULL; /* default: no tab editing */ tab_proc = NULL; /* default: no tab editing */
tab_width = 8;
if (fgets(buf, sizeof(buf), deckfile) == NULL) if (fgets(buf, sizeof(buf), deckfile) == NULL)
break; /* oops, no more names */ break; /* oops, no more names */
@ -1391,7 +1421,7 @@ static t_bool nextdeck (void)
continue; continue;
} }
mode = c = skipbl(c); /* skip to next token, which would be mode, if present */ c = skipbl(c); /* skip to next token, which would be mode, if present */
switch (*c) { switch (*c) {
case 'b': case 'b':
@ -1422,6 +1452,13 @@ static t_bool nextdeck (void)
case 'T': case 'T':
tab_proc = EditToWhitespace; tab_proc = EditToWhitespace;
c++; c++;
tab_width = 0; /* see if there is a digit after the 4 -- if so use it as tab expansion width */
while (isdigit(*c))
tab_width = tab_width*10 + *c++ - '0';
if (tab_width == 0)
tab_width = 8;
break; break;
} }
} }
@ -1430,10 +1467,10 @@ static t_bool nextdeck (void)
code = guess_cr_code(); code = guess_cr_code();
if (cpu_unit.flags & UNIT_ATT) if (cpu_unit.flags & UNIT_ATT)
trace_io("(Opened %s deck %s%s)\n", (code == CODE_BINARY) ? "binary" : "text", fname, tab_proc ? (*tab_proc)(NULL) : ""); trace_io("(Opened %s deck %s%s)\n", (code == CODE_BINARY) ? "binary" : "text", fname, tab_proc ? (*tab_proc)(NULL, tab_width) : "");
if (! (cr_unit.flags & UNIT_QUIET)) if (! (cr_unit.flags & UNIT_QUIET))
printf( "(Opened %s deck %s%s)\n", (code == CODE_BINARY) ? "binary" : "text", fname, tab_proc ? (*tab_proc)(NULL) : ""); printf( "(Opened %s deck %s%s)\n", (code == CODE_BINARY) ? "binary" : "text", fname, tab_proc ? (*tab_proc)(NULL, tab_width) : "");
break; break;
} }
@ -1510,7 +1547,7 @@ t_stat cr_rewind (void)
static t_stat cr_attach (UNIT *uptr, char *cptr) static t_stat cr_attach (UNIT *uptr, char *cptr)
{ {
t_stat rval; t_stat rval;
t_bool use_decklist; t_bool use_decklist, old_quiet;
char *c, *arg, quote; char *c, *arg, quote;
cr_detach(uptr); /* detach file and possibly deck file */ cr_detach(uptr); /* detach file and possibly deck file */
@ -1518,8 +1555,11 @@ static t_stat cr_attach (UNIT *uptr, char *cptr)
CLRBIT(uptr->flags, UNIT_SCRATCH|UNIT_QUIET|UNIT_DEBUG|UNIT_PHYSICAL|UNIT_LOWERCASE); /* set options */ CLRBIT(uptr->flags, UNIT_SCRATCH|UNIT_QUIET|UNIT_DEBUG|UNIT_PHYSICAL|UNIT_LOWERCASE); /* set options */
tab_proc = NULL; tab_proc = NULL;
tab_width = 8;
use_decklist = FALSE; use_decklist = FALSE;
sim_switches |= SWMASK('R'); // the card reader is readonly. Don't create an empty file if file does not exist
if (sim_switches & SWMASK('D')) SETBIT(uptr->flags, UNIT_DEBUG); if (sim_switches & SWMASK('D')) SETBIT(uptr->flags, UNIT_DEBUG);
if (sim_switches & SWMASK('Q')) SETBIT(uptr->flags, UNIT_QUIET); if (sim_switches & SWMASK('Q')) SETBIT(uptr->flags, UNIT_QUIET);
if (sim_switches & SWMASK('L')) SETBIT(uptr->flags, UNIT_LOWERCASE); if (sim_switches & SWMASK('L')) SETBIT(uptr->flags, UNIT_LOWERCASE);
@ -1589,7 +1629,13 @@ static t_stat cr_attach (UNIT *uptr, char *cptr)
SETBIT(uptr->flags, UNIT_ATT); SETBIT(uptr->flags, UNIT_ATT);
uptr->pos = 0; uptr->pos = 0;
} }
else if ((rval = attach_unit(uptr, cptr)) != SCPE_OK) { else {
old_quiet = sim_quiet; /* attach the file, but set sim_quiet so we don't get the "CR is read-only" message */
sim_quiet = TRUE;
rval = attach_unit(uptr, cptr);
sim_quiet = old_quiet;
if (rval != SCPE_OK) /* file did not exist */
return rval; return rval;
} }
@ -1667,10 +1713,10 @@ static t_stat cp_detach (UNIT *uptr)
return detach_unit(uptr); return detach_unit(uptr);
} }
static void op_done (UNIT *u, t_bool issue_intr) static void op_done (UNIT *u, char *opname, t_bool issue_intr)
{ {
if (u->flags & UNIT_DEBUG) if (u->flags & UNIT_DEBUG)
DEBUG_PRINT("!CR Op Complete, card %d", cr_count); DEBUG_PRINT("!CR %s Op Complete, card %d%s", opname, cr_count, issue_intr ? ", interrupt" : "");
SET_OP(OP_IDLE); SET_OP(OP_IDLE);
@ -1704,7 +1750,7 @@ static t_stat cr_svc (UNIT *uptr)
break; break;
case OP_FEEDING: case OP_FEEDING:
op_done(&cr_unit, FALSE); op_done(&cr_unit, "feed", FALSE);
break; break;
case OP_READING: case OP_READING:
@ -1718,10 +1764,7 @@ static t_stat cr_svc (UNIT *uptr)
M[(cr_addr + i) & mem_mask] = readstation[i]; M[(cr_addr + i) & mem_mask] = readstation[i];
readstate = STATION_READ; readstate = STATION_READ;
if (cr_unit.flags & UNIT_DEBUG) op_done(&cr_unit, "read", TRUE);
DEBUG_PRINT("!CR Op Complete, card %d", cr_count);
op_done(&cr_unit, TRUE);
} }
else if (++cr_unit.COLUMN < 80) { /* 1442 interrupts on each column... */ else if (++cr_unit.COLUMN < 80) { /* 1442 interrupts on each column... */
SETBIT(cr_dsw, CR_DSW_1442_READ_RESPONSE); SETBIT(cr_dsw, CR_DSW_1442_READ_RESPONSE);
@ -1733,7 +1776,7 @@ static t_stat cr_svc (UNIT *uptr)
} }
else { /* ... then issues op-complete */ else { /* ... then issues op-complete */
readstate = STATION_READ; readstate = STATION_READ;
op_done(&cr_unit, TRUE); op_done(&cr_unit, "read", TRUE);
} }
break; break;
@ -1745,7 +1788,7 @@ static t_stat cr_svc (UNIT *uptr)
if (cp_unit.flags & UNIT_LASTPUNCH) { if (cp_unit.flags & UNIT_LASTPUNCH) {
punchstate = STATION_PUNCHED; punchstate = STATION_PUNCHED;
op_done(&cp_unit, TRUE); op_done(&cp_unit, "punch", TRUE);
} }
else if (++cp_unit.COLUMN < 80) { else if (++cp_unit.COLUMN < 80) {
SETBIT(cr_dsw, CR_DSW_1442_PUNCH_RESPONSE); SETBIT(cr_dsw, CR_DSW_1442_PUNCH_RESPONSE);
@ -1757,7 +1800,7 @@ static t_stat cr_svc (UNIT *uptr)
} }
else { else {
punchstate = STATION_PUNCHED; punchstate = STATION_PUNCHED;
op_done(&cp_unit, TRUE); op_done(&cp_unit, "punch", TRUE);
} }
break; break;
} }
@ -1853,7 +1896,7 @@ void xio_2501_card (int32 addr, int32 func, int32 modify)
} }
} }
void xio_1142_card (int32 addr, int32 func, int32 modify) void xio_1442_card (int32 addr, int32 func, int32 modify)
{ {
char msg[80]; char msg[80];
int ch; int ch;
@ -2579,8 +2622,7 @@ static t_stat pcr_svc (UNIT *uptr)
break; break;
case OP_READING: case OP_READING:
if (pcr_nready >= 2) { /* if there is a whole column buffered, simulate column interrupt*/ if (pcr_nready >= 2) { /* if there is a whole column buffered, simulate column interrupt/* pcr_trigger_interrupt_0 - simulate a read response interrupt so OS will read queued column data */
/* pcr_trigger_interrupt_0 - simulate a read response interrupt so OS will read queued column data */
pcr_trigger_interrupt_0(); pcr_trigger_interrupt_0();
sim_activate(&cr_unit, cr_wait); /* keep checking frequently */ sim_activate(&cr_unit, cr_wait); /* keep checking frequently */
@ -2588,7 +2630,7 @@ static t_stat pcr_svc (UNIT *uptr)
else if (pcr_done) { else if (pcr_done) {
pcr_done = FALSE; pcr_done = FALSE;
cr_count++; cr_count++;
op_done(&cr_unit, TRUE); op_done(&cr_unit, "pcr read", TRUE);
pcr_set_dsw_from_status(TRUE); pcr_set_dsw_from_status(TRUE);
} }
else else
@ -2598,7 +2640,7 @@ static t_stat pcr_svc (UNIT *uptr)
case OP_FEEDING: case OP_FEEDING:
if (pcr_done) { if (pcr_done) {
cr_count++; cr_count++;
op_done(&cr_unit, FALSE); op_done(&cr_unit, "pcr feed", FALSE);
pcr_set_dsw_from_status(TRUE); pcr_set_dsw_from_status(TRUE);
} }
else else

View file

@ -137,6 +137,7 @@ void WriteW (int32 a, int32 d);
#define STOP_BREAK 11 /* simulator break key pressed */ #define STOP_BREAK 11 /* simulator break key pressed */
#define STOP_STEP 12 /* step count expired */ #define STOP_STEP 12 /* step count expired */
#define STOP_OTHER 13 /* other reason, probably error returned by sim_process_event() */ #define STOP_OTHER 13 /* other reason, probably error returned by sim_process_event() */
#define STOP_PRINT_CHECK 14 /* stop due to printer check (used by CGI version) */
#define IORETURN(f,v) ((f)? (v): SCPE_OK) /* cond error return */ #define IORETURN(f,v) ((f)? (v): SCPE_OK) /* cond error return */
@ -252,7 +253,7 @@ void WriteW (int32 a, int32 d);
/* prototypes: xio handlers */ /* prototypes: xio handlers */
void xio_1131_console (int32 addr, int32 func, int32 modify); /* console keyboard and printer */ void xio_1131_console (int32 addr, int32 func, int32 modify); /* console keyboard and printer */
void xio_1142_card (int32 addr, int32 func, int32 modify); /* standard card reader/punch */ void xio_1442_card (int32 addr, int32 func, int32 modify); /* standard card reader/punch */
void xio_1134_papertape (int32 addr, int32 func, int32 modify); /* paper tape reader/punch */ void xio_1134_papertape (int32 addr, int32 func, int32 modify); /* paper tape reader/punch */
void xio_disk (int32 addr, int32 func, int32 modify, int drv); /* internal CPU disk */ void xio_disk (int32 addr, int32 func, int32 modify, int drv); /* internal CPU disk */
void xio_1627_plotter (int32 addr, int32 func, int32 modify); /* XY plotter */ void xio_1627_plotter (int32 addr, int32 func, int32 modify); /* XY plotter */

View file

@ -34,7 +34,7 @@ commands may NOT be accurate. This should probably be fixed.
*/ */
#include "ibm1130_defs.h" #include "ibm1130_defs.h"
#include "memory.h" #include <memory.h>
#define TRACE_DMS_IO /* define to enable debug of DMS phase IO */ #define TRACE_DMS_IO /* define to enable debug of DMS phase IO */

View file

@ -72,18 +72,19 @@
#define MIN(a,b) ((a < b) ? a : b) #define MIN(a,b) ((a < b) ? a : b)
#define AMSG " with Assembler Reformat" #define AMSG " with Assembler Reformat"
#define FMSG " with FORTRAN Reformat" #define FMSG " with FORTRAN Reformat"
#define WMSG " with tab replacement"
#define AFORMAT "%20.20s%-60.60s"," " #define AFORMAT "%20.20s%-60.60s"," "
#define ACOMMENTFMT "%20.20s%-60.60s"," " #define ACOMMENTFMT "%20.20s%-60.60s"," "
#define ABLANKLINE "%20.20s*"," " #define ABLANKLINE "%20.20s*"," "
#define FFORMAT "%-5.5s %-74.74s" #define FFORMAT "%-5.5s %-74.74s"
#define FCONTFMT "%-5.5s%-75.75s" #define FCONTFMT "%-5.5s%-75.75s"
char gszLabel[6]; /* work area for label */ static char gszLabel[6]; /* work area for label */
char gszArg[MAXLINE]; /* .. argument */ static char gszArg[MAXLINE]; /* .. argument */
char gszOutput[MAXLINE]; /* .. output */ static char gszOutput[MAXLINE]; /* .. output */
short gaiAsmTabs[] = {7,12,15,20,25,30,35,40,45,52,0};/* tab stops for assembler */ static short gaiAsmTabs[] = {7,12,15,20,25,30,35,40,45,52,0};/* tab stops for assembler */
static short gaiPlainTabs[42]; /* tab stops for plain tabs. Settings will be made later. Max # positions when tabs are every 2 positions */
short gaiPlainTabs[] = {9, 17, 25, 33, 41, 49, 57, 65, 73, 0};/* tab stops for just plain tabs */ static int giPlainTabWidth = 0;
/* /*
* helper routines * helper routines
@ -163,7 +164,7 @@ char* pszX; /* work pointer */
* EditToAsm - convert tab-formatted text line to 1130 Assembler format * EditToAsm - convert tab-formatted text line to 1130 Assembler format
*/ */
char *EditToAsm (char* p_pszEdit) /* convert line to 1130 assembler */ char *EditToAsm (char* p_pszEdit, int width) /* convert line to 1130 assembler */
{ {
char pszLine[MAXLINE]; /* source line */ char pszLine[MAXLINE]; /* source line */
char pszWork[WORKSZ]; /* work buffer */ char pszWork[WORKSZ]; /* work buffer */
@ -174,11 +175,11 @@ size_t iI; /* work integer */
return AMSG; /* a. yes .. return display message */ return AMSG; /* a. yes .. return display message */
if (*p_pszEdit == '!') /* leave lines starting with ! alone */ if (*p_pszEdit == '!') /* leave lines starting with ! alone */
return EditToWhitespace(p_pszEdit+1); return EditToWhitespace(p_pszEdit+1, width);
if (*p_pszEdit == '*') /* q. comment line? */ if (*p_pszEdit == '*') /* q. comment line? */
{ /* a. yes.. */ { /* a. yes.. */
strncpy(pszWork, EditToWhitespace(p_pszEdit), MAXLINE); /* .. convert any tabs */ strncpy(pszWork, EditToWhitespace(p_pszEdit, width), MAXLINE); /* .. convert any tabs */
sprintf(gszOutput, ACOMMENTFMT, pszWork); /* .. put the comment out there in the opcode column */ sprintf(gszOutput, ACOMMENTFMT, pszWork); /* .. put the comment out there in the opcode column */
return gszOutput; /* .. and return it */ return gszOutput; /* .. and return it */
} }
@ -229,7 +230,7 @@ size_t iI; /* work integer */
* (a la DEC Fortran) * (a la DEC Fortran)
*/ */
char *EditToFortran(char* p_pszEdit) /* convert line to 1130 assembler */ char *EditToFortran(char* p_pszEdit, int width) /* convert line to 1130 assembler */
{ {
char pszLine[MAXLINE]; /* source line */ char pszLine[MAXLINE]; /* source line */
char* pszWork; /* work pointer */ char* pszWork; /* work pointer */
@ -244,7 +245,7 @@ int bContinue; /* true if continue */
if (*p_pszEdit == 'C' || *p_pszEdit == '*' || *p_pszEdit == '\0') /* q. comment or directive or blank line? */ if (*p_pszEdit == 'C' || *p_pszEdit == '*' || *p_pszEdit == '\0') /* q. comment or directive or blank line? */
{ /* a. yes.. don't restructure */ { /* a. yes.. don't restructure */
return EditToWhitespace(p_pszEdit); return EditToWhitespace(p_pszEdit, width);
} }
strncpy(pszLine, p_pszEdit, MAXLINE-1); /* copy the line local */ strncpy(pszLine, p_pszEdit, MAXLINE-1); /* copy the line local */
@ -283,20 +284,34 @@ int bContinue; /* true if continue */
} }
/************************************************* /*************************************************
* EditToWhitespace - expand tabs at 8 space intervals. * EditToWhitespace - expand tabs at n space intervals.
*/ */
char* EditToWhitespace(char *p_pszEdit) char* EditToWhitespace(char *p_pszEdit, int width)
{ {
int iI; /* work integer */ int iI; /* work integer */
int iPos; /* work integer for settings tab stops */
char pszLine[MAXLINE]; /* source line */ char pszLine[MAXLINE]; /* source line */
char pszWork[WORKSZ]; /* work buffer */ char pszWork[WORKSZ]; /* work buffer */
if (p_pszEdit == NULL) /* q. null request? */ if (p_pszEdit == NULL) /* q. null request? */
return AMSG; /* a. yes .. return display message */ return WMSG; /* a. yes .. return display message */
strncpy(pszLine, p_pszEdit, MAXLINE-1); /* copy the line local */ strncpy(pszLine, p_pszEdit, MAXLINE-1); /* copy the line local */
if (width == 0) width = 8; /* default */
if ((width != giPlainTabWidth) && (width > 1) && (width < 30)) {
giPlainTabWidth = width; /* if width is different, and valid, rebuild tabstop array */
iI = 0; /* output index */
iPos = width + 1; /* first tab position */
while (iPos < 80) { /* fill array up to but not including position 80 */
gaiPlainTabs[iI++] = iPos;
iPos += width;
}
gaiPlainTabs[iI] = 0; /* mark end of array */
}
ExpandTabs(pszLine, pszWork, gaiPlainTabs); /* expand the tabs */ ExpandTabs(pszLine, pszWork, gaiPlainTabs); /* expand the tabs */
strncpy(gszOutput, pszWork, MAXLINE-1); /* copy the line back */ strncpy(gszOutput, pszWork, MAXLINE-1); /* copy the line back */

View file

@ -12,6 +12,6 @@
/* ibm1130_asm.h: definition of routines in ibm1130_asm.c /* ibm1130_asm.h: definition of routines in ibm1130_asm.c
*/ */
char* EditToAsm(char*); /* convert edit format to 1130 assembler format */ char* EditToAsm(char* str, int width); /* convert edit format to 1130 assembler format */
char* EditToFortran(char*); /* convert edit format to Fortran format */ char* EditToFortran(char* str, int width); /* convert edit format to Fortran format */
char* EditToWhitespace(char*); /* clean white space, tabstops every 8 positions */ char* EditToWhitespace(char* str, int width); /* clean white space, tabstops every 8 positions */

View file

@ -151,6 +151,8 @@ static void EraseGDUScreen (void);
void xio_2250_display (int32 addr, int32 func, int32 modify) void xio_2250_display (int32 addr, int32 func, int32 modify)
{ {
if (cgi) return; /* ignore this device in CGI mode */
switch (func) { switch (func) {
case XIO_SENSE_DEV: case XIO_SENSE_DEV:
ACC = (gdu_dsw & GDU_DSW_BUSY) ? GDU_DSW_BUSY : gdu_dsw; ACC = (gdu_dsw & GDU_DSW_BUSY) ? GDU_DSW_BUSY : gdu_dsw;
@ -203,6 +205,8 @@ void xio_2250_display (int32 addr, int32 func, int32 modify)
static t_stat gdu_reset (DEVICE *dptr) static t_stat gdu_reset (DEVICE *dptr)
{ {
if (cgi) return SCPE_OK; /* ignore this device in CGI mode */
halt_regeneration(); halt_regeneration();
clear_interrupts(); clear_interrupts();
set_indicators(0); set_indicators(0);
@ -255,10 +259,8 @@ static void halt_regeneration (void)
// should check to see if GDU_DSW_BUSY is clear, and if it it still zero after several msec, // should check to see if GDU_DSW_BUSY is clear, and if it it still zero after several msec,
// only then should it black out the screen and call StopGDUUpdates. // only then should it black out the screen and call StopGDUUpdates.
if (gdu_dsw & GDU_DSW_BUSY) { if (gdu_dsw & GDU_DSW_BUSY) {
// StopGDUUpdates(); // let lower level code discover this during next refresh
CLRBIT(gdu_dsw, GDU_DSW_BUSY); CLRBIT(gdu_dsw, GDU_DSW_BUSY);
} }
// EraseGDUScreen(); // let cessation of regeneration erase it (eventually)
} }
static void notify_window_closed (void) static void notify_window_closed (void)
@ -677,6 +679,8 @@ static HPEN hRedPen = NULL;
static HBRUSH hGrayBrush, hDarkBrush; static HBRUSH hGrayBrush, hDarkBrush;
static HPEN hBlackPen; static HPEN hBlackPen;
static int halted = 0; // number of time intervals that GDU has been halted w/o a regeneration static int halted = 0; // number of time intervals that GDU has been halted w/o a regeneration
static UINT idTimer = 0;
static t_bool painting = FALSE;
static LRESULT APIENTRY GDUWndProc (HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam); static LRESULT APIENTRY GDUWndProc (HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
static DWORD WINAPI GDUPump (LPVOID arg); static DWORD WINAPI GDUPump (LPVOID arg);
@ -685,6 +689,8 @@ static void destroy_GDU_window (void)
if (hwGDU != NULL) if (hwGDU != NULL)
SendMessage(hwGDU, WM_CLOSE, 0, 0); // cross thread call is OK SendMessage(hwGDU, WM_CLOSE, 0, 0); // cross thread call is OK
#ifdef XXXX
// let window closure do this
if (hGDUPump != INVALID_HANDLE_VALUE) { // this is not the most graceful way to do it if (hGDUPump != INVALID_HANDLE_VALUE) { // this is not the most graceful way to do it
TerminateThread(hGDUPump, 0); TerminateThread(hGDUPump, 0);
hGDUPump = INVALID_HANDLE_VALUE; hGDUPump = INVALID_HANDLE_VALUE;
@ -711,6 +717,7 @@ static void destroy_GDU_window (void)
DeleteObject(hRedBrush); DeleteObject(hRedBrush);
hRedBrush = NULL; hRedBrush = NULL;
} }
#endif
#ifdef DEBUG_LIGHTPEN #ifdef DEBUG_LIGHTPEN
if (hRedPen != NULL) { if (hRedPen != NULL) {
@ -750,6 +757,13 @@ static void gdu_WM_CLOSE (HWND hWnd)
static void gdu_WM_DESTROY (HWND hWnd) static void gdu_WM_DESTROY (HWND hWnd)
{ {
PostMessage(hWnd, WM_QUIT, 0, 0);
if (idTimer != 0) {
KillTimer(hwGDU, 1);
idTimer = 0;
halted = 10000;
painting = FALSE;
}
notify_window_closed(); notify_window_closed();
hwGDU = NULL; hwGDU = NULL;
} }
@ -868,17 +882,29 @@ static void gdu_WM_PAINT (HWND hWnd)
{ {
PAINTSTRUCT ps; PAINTSTRUCT ps;
HDC hDC; HDC hDC;
int msec;
// code for display // code for display
hDC = BeginPaint(hWnd, &ps); hDC = BeginPaint(hWnd, &ps);
PaintImage(hDC, TRUE); PaintImage(hDC, TRUE);
EndPaint(hWnd, &ps); EndPaint(hWnd, &ps);
// set a timer so we keep doing it!
if (idTimer == 0) {
msec = (gdu_rate == 0) ? (1000 / DEFAULT_GDU_RATE) : 1000/gdu_rate;
idTimer = SetTimer(hwGDU, 1, msec, NULL);
}
} }
// the window has been resized // the window has been resized
static void gdu_WM_SIZE (HWND hWnd, UINT state, int cx, int cy) static void gdu_WM_SIZE (HWND hWnd, UINT state, int cx, int cy)
{ {
#ifdef BLIT_MODE
InvalidateRect(hWnd, NULL, FALSE); // in blt mode, we'll paint a full black bitmap over the new screen size
#else
InvalidateRect(hWnd, NULL, TRUE); InvalidateRect(hWnd, NULL, TRUE);
#endif
} }
// tweak the sizing rectangle during a resize to guarantee a square window // tweak the sizing rectangle during a resize to guarantee a square window
@ -911,7 +937,7 @@ static void gdu_WM_TIMER (HWND hWnd, UINT id)
{ {
HDC hDC; HDC hDC;
if (running) { // if CPU is running, update picture if (painting) { // if GDU is running, update picture
if ((gdu_dsw & GDU_DSW_BUSY) == 0) { // regeneration is not to occur if ((gdu_dsw & GDU_DSW_BUSY) == 0) { // regeneration is not to occur
if (++halted >= 4) { // stop the timer if four timer intervals go by with the display halted if (++halted >= 4) { // stop the timer if four timer intervals go by with the display halted
EraseGDUScreen(); // screen goes black due to cessation of refreshing EraseGDUScreen(); // screen goes black due to cessation of refreshing
@ -981,26 +1007,15 @@ static void CheckGDUKeyboard (void)
{ {
} }
static UINT idTimer = 0;
static void StartGDUUpdates (void) static void StartGDUUpdates (void)
{ {
int msec;
if (idTimer == 0) {
msec = (gdu_rate == 0) ? (1000 / DEFAULT_GDU_RATE) : 1000/gdu_rate;
idTimer = SetTimer(hwGDU, 1, msec, NULL);
}
halted = 0; halted = 0;
painting = TRUE;
} }
static void StopGDUUpdates (void) static void StopGDUUpdates (void)
{ {
if (idTimer != 0) { painting = FALSE;
KillTimer(hwGDU, 1);
idTimer = 0;
halted = 10000;
}
} }
static void GetMouseCoordinates() static void GetMouseCoordinates()
@ -1030,7 +1045,7 @@ static void GetMouseCoordinates()
t_bool gdu_active (void) t_bool gdu_active (void)
{ {
return gdu_dsw & GDU_DSW_BUSY; return cgi ? 0 : (gdu_dsw & GDU_DSW_BUSY);
} }
static void EraseGDUScreen (void) static void EraseGDUScreen (void)
@ -1103,6 +1118,8 @@ static DWORD WINAPI GDUPump (LPVOID arg)
DispatchMessage(&msg); DispatchMessage(&msg);
} }
painting = FALSE;
if (hwGDU != NULL) { if (hwGDU != NULL) {
DestroyWindow(hwGDU); /* but if a quit message got posted, clean up */ DestroyWindow(hwGDU); /* but if a quit message got posted, clean up */
hwGDU = NULL; hwGDU = NULL;

View file

@ -28,6 +28,7 @@
* ------------------------------------------------------------------------ */ * ------------------------------------------------------------------------ */
#include <stdarg.h> #include <stdarg.h>
#include <ctype.h>
#include <math.h> #include <math.h>
#include "ibm1130_defs.h" #include "ibm1130_defs.h"
@ -92,10 +93,6 @@ DEVICE console_dev = {
/* reset for the "console" display device */ /* reset for the "console" display device */
extern char *read_line (char *cptr, int size, FILE *stream);
extern DEVICE *find_unit (char *cptr, UNIT **uptr);
extern char *sim_prompt;
extern UNIT cr_unit; /* pointers to 1442 and 1132 (1403) printers */ extern UNIT cr_unit; /* pointers to 1442 and 1132 (1403) printers */
extern UNIT prt_unit; extern UNIT prt_unit;

View file

@ -7,6 +7,7 @@
2004.10.22 - Written. 2004.10.22 - Written.
2006.1.2 - Rewritten as plotter routine by Carl V Claunch 2006.1.2 - Rewritten as plotter routine by Carl V Claunch
2012.11.23 - added -d option in detach, which we'll use in the CGI simulator. BK.
* (C) Copyright 2004, Brian Knittel. * (C) Copyright 2004, Brian Knittel.
* You may freely use this program, but: it offered strictly on an AS-IS, AT YOUR OWN * You may freely use this program, but: it offered strictly on an AS-IS, AT YOUR OWN
@ -35,6 +36,7 @@
#else #else
#define NONDLL // I am linking statically to avoid some issues.
#include "gd.h" #include "gd.h"
/*************************************************************************************** /***************************************************************************************
@ -45,31 +47,78 @@
* - sheet moveable in .01" steps, either direction * - sheet moveable in .01" steps, either direction
* - switchable pen, in various colors and line widths * - switchable pen, in various colors and line widths
* *
* Simulator implementation will create a JPEG image corresponding to a * Notice that the WIDTH is 11" and the LENGTH can be anything up to 120'. And, the WIDTH
* landscape mode sheet of paper, the width of the carriage at 11". * was the plotter's Y direction, and the LENGTH was the plotter's X direction.
* A diagram of more than 8" of paper travel will span printed pages *
* in landscape mode. * The simulator creates a GIF image corresponding to a landscape mode sheet of paper. That is,
* the plotter's Y direction is the image's horizontal dimension, and the plotter's X direction
* is the image's vertical dimension. The WIDTH of the image is always 1100 pixels (11 inches at
* 100 dpi), and the LENGTH (height) of the image can be set. The default is 800 pixels (8
* inches at 100 dpi). A diagram of more than 8" in length (X direction) will span more than
* one printed page in landscape mode.
* *
* When an 'att plot' command is issued a file is created based on the * When an 'att plot' command is issued a file is created based on the
* default or currently set values of paper length, starting * default or currently set values of paper length, pen position, pen color and pen width.
* position of the pen in both X and Y axes, pen color and pen width.
* Based on the number of logical pages of paper, the command will create
* the proper size canvas internally and create the output JPEG file.
* *
* When a 'det plot' command is issued, the plotter image will be converted * When a 'det plot' command is issued, the plotter image will be
* into the file that was specified during the attach process. The * written to the GIF that was created during the attach process. The
* image is not viewable until this point, unless an examine plot is * image is not viewable until this point. (You could implement an EXAMINE PLOT command
* issued which will dump the current state of the paper into the file. * of some sort to write out an intermediate version of the image, but this is not currently
* implemented).
* *
* The 'set plot' command can set pen width, paper length, pen color, * The 'set plot' command can set pen width, paper length, pen color,
* current carriage X and Y coordinates. Paper length can be set * current carriage X and Y coordinates, as discussed below. Paper length can be set
* to alter the default of 800 (8"); changes are ignored until * to alter the default of 800 (8"); changes are ignored until
* the next 'attach' command. The current carriage x and y positions * the next 'attach' command. The current carriage x and y positions
* can be set at any time and will go into effect immediately, just * can be set at any time and will go into effect immediately, just
* as the pen color and pen width can be altered on the fly. * as the pen color and pen width can be altered on the fly.
* *
* NOTE: requires gd library and definition of ENABLE_PLOT_SUPPORT in makefile or Visual C configuration * NOTE: requires the libgd library and definition of ENABLE_PLOT_SUPPORT in makefile or Visual C configuration
* gd is not included in the main simh and ibm1130.org distributions at the present time. * gd source is not included in the main simh and ibm1130.org source distributions at the present time due to
* licensing issues.
*
* NOTE: On Windows, you need to either:
* + compile both LIBGD and SIMH to use the static C runtime libraries, compile
* LIBGD to a static library, and link LIBGD into ibm1130.exe (which is
* what we do at IBM1130.org, so that gd is built into the version of ibm1130.exe
* we distribute), or,
* + Compile both LIBGD and IBM1130 to use the DLL version of the C runtime, and compile
* GD to either a static library or a DLL, but, static is easier since you don't
* need to copy LIBGD.DLL along with ibm1130.exe
*
* SIMH commands:
*
* attach [-w] plot filename.gif
* Creates file filename.gif and attaches the plotter device to it.
* The file is empty at this point. The pen is raised. If the -w option is specified, and the
* simulator does not draw on the plotter between attach and detach, the gif file will be deleted
* on detach. (This is useful for the the cgi version of the simulator).
*
* detach plot filename.gif
* Detach the plot device. The gif data is written at this point, not before.
* If the -w flag was used on attach, and there was no plot activity, the gif file will be deleted.
*
* set plot black | red | blue | green | yellow | purple | lgrey | grey
* Sets the pen to the named color. Default is black.
*
* set plot 1.0 | 2.0 | 3.0 | 4.0
* Sets the pen thickness to the specified number of hundredths of an inch. Default is 1.0
*
* set plot penup | pendown
* Moves the pen up or down (onto the paper).
*
* set plot length NNN
* Sets the plot length (plotter X direction, GIF vertical dimension) to the NNN hundredths of
* an inch. Default is 800. The plot width (plotter Y direction, GIF horizontal dimension) is always
* 1100 (11 inches). NOTE: Changing this setting has no affect on the current plot. It takes affect at
* the next "attach plot" command.
*
* set plot xpos NNN
* set plot ypos NNN
* Sets the pen x or y position to NNN hundredths of an inch.
*
* (You cannot manually create a plot by issuing set plot pendown, xpos and ypos commands. The xpos and ypos
* settings only change the starting point for the simulated program).
***************************************************************************************/ ***************************************************************************************/
#define PLOT1627_DSW_OP_COMPLETE 0x8000 #define PLOT1627_DSW_OP_COMPLETE 0x8000
@ -78,7 +127,7 @@
#define IS_ONLINE(u) (((u)->flags & (UNIT_ATT|UNIT_DIS)) == UNIT_ATT) #define IS_ONLINE(u) (((u)->flags & (UNIT_ATT|UNIT_DIS)) == UNIT_ATT)
#define IS_DEBUG ((plot_unit->flags & UNIT_DEBUG) == UNIT_DEBUG) #define IS_DEBUG ((plot_unit->flags & UNIT_DEBUG) == UNIT_DEBUG)
#define IS_PENDOWN ((plot_unit->flags & UNIT_PEN) == UNIT_PEN) #define IS_PENDOWN ((plot_unit->flags & UNIT_PEN) != 0)
static t_stat plot_svc (UNIT *uptr); /* activity routine */ static t_stat plot_svc (UNIT *uptr); /* activity routine */
static t_stat plot_reset (DEVICE *dptr); /* reset of 1130 */ static t_stat plot_reset (DEVICE *dptr); /* reset of 1130 */
@ -103,7 +152,7 @@ static int32 plot_ymax = 1099; /* right edge of carriage */
#define PEN_DOWN 0x80000000 #define PEN_DOWN 0x80000000
#define PEN_UP 0x00000000 #define PEN_UP 0x00000000
static int32 plot_pen = PEN_UP; /* current pen position */ static int32 plot_pen = PEN_UP; /* current pen position. This duplicates the device flag PLOT_PEN. Makes the show dev plot command nicer. */
static int black_pen; /* holds color black */ static int black_pen; /* holds color black */
static int blue_pen; /* holds color blue */ static int blue_pen; /* holds color blue */
@ -116,8 +165,10 @@ static int grey_pen; /* holds grey */
static int white_background; /* holds white of paper roll */ static int white_background; /* holds white of paper roll */
static int plot_pwidth; /* set and display variable */ static int plot_pwidth; /* set and display variable */
static int plot_pcolor; /* set and display variable */ static int plot_pcolor; /* set and display variable */
static int need_update = 0; /* flag to force and update_pen() */ static int need_update = FALSE; /* flag to force and update_pen() */
static gdImagePtr image; /* pointer to our canvas */ static int plot_used = FALSE; /* flag set to true if anything was actually plotted between attach and detach */
static int delete_if_unused = FALSE; /* if TRUE and no plotter activity was seen, delete file on detach. This flag is set by -w option on attach command. */
static gdImagePtr image = NULL; /* pointer to our canvas */
#define UNIT_V_COLOR (UNIT_V_UF + 0) /* color of selected pen - 3 bits */ #define UNIT_V_COLOR (UNIT_V_UF + 0) /* color of selected pen - 3 bits */
#define UNIT_V_WIDTH (UNIT_V_UF + 3) /* width of pen - two bits */ #define UNIT_V_WIDTH (UNIT_V_UF + 3) /* width of pen - two bits */
@ -140,7 +191,7 @@ static gdImagePtr image; /* pointer to our canvas */
#define PEN_LTGREY (6u << UNIT_V_COLOR) #define PEN_LTGREY (6u << UNIT_V_COLOR)
#define PEN_GREY (7u << UNIT_V_COLOR) #define PEN_GREY (7u << UNIT_V_COLOR)
#define SET_COLOR(op) {plot_unit[0].flags &= ~UNIT_COLOR; plot_unit[0].flags |= (op);} #define SET_COLOR(op) (plot_unit[0].flags = (plot_unit[0].flags & ~UNIT_COLOR) | (op))
#define GET_COLOR (plot_unit[0].flags & UNIT_COLOR) #define GET_COLOR (plot_unit[0].flags & UNIT_COLOR)
#define BLACK 0,0,0 #define BLACK 0,0,0
@ -159,7 +210,7 @@ static gdImagePtr image; /* pointer to our canvas */
#define PEN_QUAD (3u << UNIT_V_WIDTH) #define PEN_QUAD (3u << UNIT_V_WIDTH)
#define GET_WIDTH() (plot_unit[0].flags & UNIT_WIDTH) #define GET_WIDTH() (plot_unit[0].flags & UNIT_WIDTH)
#define SET_WIDTH(cd) {plot_unit[0].flags &= ~UNIT_WIDTH; un.flags |= (cd);} #define SET_WIDTH(cd) (plot_unit[0].flags = (plot_unit[0].flags & ~UNIT_WIDTH) | (cd))
UNIT plot_unit[] = { UNIT plot_unit[] = {
{ UDATA (&plot_svc, UNIT_ATTABLE, 0) }, { UDATA (&plot_svc, UNIT_ATTABLE, 0) },
@ -170,7 +221,7 @@ REG plot_reg[] = {
{ DRDATA (WTIME, plot_wait, 24), PV_LEFT }, /* plotter movement wait */ { DRDATA (WTIME, plot_wait, 24), PV_LEFT }, /* plotter movement wait */
{ DRDATA (Xpos, plot_xpos, 32), PV_LEFT }, /* Current X Position*/ { DRDATA (Xpos, plot_xpos, 32), PV_LEFT }, /* Current X Position*/
{ DRDATA (Ypos, plot_ypos, 32), PV_LEFT }, /* Current Y Position*/ { DRDATA (Ypos, plot_ypos, 32), PV_LEFT }, /* Current Y Position*/
{ FLDATA (PenDown, plot_pen, 0)}, /* Current pen position - 1 = down */ { FLDATA (PenDown, plot_pen, 0)}, /* Current pen position: 1 = down */
{ DRDATA (PaperSize, plot_xmax, 32), PV_LEFT }, /* Length of paper in inches */ { DRDATA (PaperSize, plot_xmax, 32), PV_LEFT }, /* Length of paper in inches */
{ NULL } }; { NULL } };
@ -211,9 +262,10 @@ DEVICE plot_dev = {
/* xio_1627_plotter - XIO command interpreter for the 1627 plotter model 1 */ /* xio_1627_plotter - XIO command interpreter for the 1627 plotter model 1 */
void xio_1627_plotter (iocc_addr, iocc_func, iocc_mod) void xio_1627_plotter (int32 iocc_addr, int32 iocc_func, int32 iocc_mod)
{ {
char msg[80]; char msg[80];
int16 v;
if (! IS_ONLINE(plot_unit) ) { if (! IS_ONLINE(plot_unit) ) {
SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* set not ready */ SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* set not ready */
@ -246,7 +298,44 @@ void xio_1627_plotter (iocc_addr, iocc_func, iocc_mod)
break; break;
case XIO_CONTROL: /* control XIO */ case XIO_CONTROL: /* control XIO */
xio_error("Control XIO not supported by 1627 plotter"); // xio_error("Control XIO not supported by 1627 plotter");
// Well, not on a real 1130. But on our simulator, let's use XIO_CONTROL to
// allow programmatic control of the pen. Nifty, eh?
//
// Functions: XIO_CONTROL 0 clr - sets pen color (0=black, 1=red, 2=blue, 3=green, 4=yellow, 5=purple, 6=ltgrey, 7=grey)
// XIO_CONTRLL 1 wid - sets pen width (1..4)
// XIO_CONTROL 2 xpos - sets pen xpos
// XIO_CONTROL 3 ypos - sets pen ypos
v = (int16) iocc_addr; /* get signed 16 bit value passed in addr arg */
switch (iocc_mod) {
case 0: /* set pen color */
if (BETWEEN(v,0,7)) {
SET_COLOR(v << UNIT_V_COLOR);
update_pen();
}
break;
case 1: /* set pen width 1..4*/
if (BETWEEN(v,1,4)) {
SET_WIDTH((v-1) << UNIT_V_WIDTH);
update_pen();
}
break;
case 2: /* set xpos. (Programmatic xpos and ypos are probably not that valuable) */
plot_xpos = v; /* Note that it's possible to move the pen way off the paper */
break;
case 3: /* set ypos. Clip to valid range! */
if (v <= 0)
plot_ypos = 0;
else if (v > plot_ymax)
plot_ypos = plot_ymax;
else
plot_ypos = v;
break;
}
break; break;
default: default:
@ -274,8 +363,14 @@ static t_stat plot_svc (UNIT *uptr)
static t_stat plot_reset (DEVICE *dptr) static t_stat plot_reset (DEVICE *dptr)
{ {
char * buf; #ifdef NONDLL
int32 size; static int show_notice = FALSE;
if (show_notice && ! cgi) {
printf("Plotter support included. Please see www.libgd.org for libgd copyright information.\n");
show_notice = FALSE;
}
#endif
sim_cancel(plot_unit); sim_cancel(plot_unit);
@ -296,18 +391,13 @@ static t_stat plot_attach (UNIT *uptr, char *cptr)
{ {
t_stat result; t_stat result;
SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* assume failure */
CLRBIT(uptr->flags, UNIT_DEBUG); CLRBIT(uptr->flags, UNIT_DEBUG);
if (sim_switches & SWMASK('D')) SETBIT(uptr->flags, UNIT_DEBUG); if (sim_switches & SWMASK('D')) SETBIT(uptr->flags, UNIT_DEBUG);
/* get the output file by using regular attach routine */ if (cptr == NULL || ! *cptr) /* filename must be passed */
result = attach_unit(uptr, cptr); return SCPE_ARG;
if (result != SCPE_OK) {
if (IS_DEBUG) printf("problem attaching file\n");
return result;
}
SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* assume failure */
/* set up our canvas at the desired size */ /* set up our canvas at the desired size */
image = gdImageCreate(plot_ymax+1,plot_xmax+1); /* create our canvas */ image = gdImageCreate(plot_ymax+1,plot_xmax+1); /* create our canvas */
@ -316,7 +406,21 @@ static t_stat plot_attach (UNIT *uptr, char *cptr)
return SCPE_MEM; return SCPE_MEM;
} }
delete_if_unused = (sim_switches & SWMASK('W')) != 0;
remove(cptr); /* delete file if it already exists. Otherwise, attach_unit() would open r+w */
/* get the output file by using regular attach routine */
result = attach_unit(uptr, cptr);
if (result != SCPE_OK) {
if (IS_DEBUG) printf("problem attaching file\n");
gdImageDestroy(image); /* free up the canvas memory */
image = NULL;
return result;
}
/* set up the basic colors after image created */ /* set up the basic colors after image created */
/* (by the way, these calls don't allocate any memory in or out of the image buffer. They just populate its "colors-used" table */
white_background = gdImageColorAllocate(image,WHITE); /* white is background */ white_background = gdImageColorAllocate(image,WHITE); /* white is background */
black_pen = gdImageColorAllocate(image,BLACK); /* load up black color */ black_pen = gdImageColorAllocate(image,BLACK); /* load up black color */
blue_pen = gdImageColorAllocate(image,BLUE); /* load up blue color */ blue_pen = gdImageColorAllocate(image,BLUE); /* load up blue color */
@ -336,14 +440,17 @@ static t_stat plot_attach (UNIT *uptr, char *cptr)
CLRBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* we're in business */ CLRBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* we're in business */
update_pen(); /* routine to ensure pen is okay */ plot_pen = PEN_UP;
CLRBIT(plot_unit->flags, UNIT_PEN);
update_pen(); /* routine to ensure pen is okay */
plot_used = FALSE; /* plotter page is blank */
return SCPE_OK; return SCPE_OK;
} }
/* pen updating routine, called at attach and whenever we reset the values */ /* pen updating routine, called at attach and whenever we reset the values */
void update_pen (void) static void update_pen (void)
{ {
int color; int color;
int width; int width;
@ -430,39 +537,69 @@ void update_pen (void)
} }
/* plot_detach - detach file from simulated plotter */ /* plot_detach - detach file from simulated plotter */
static t_stat plot_detach (UNIT *uptr) static t_stat plot_detach (UNIT *uptr)
{ {
char * buf; char * buf, * fname;
int32 size; int32 size, result, saveit;
FILE * fp; FILE * fp;
int32 result; t_stat rval = SCPE_OK; /* return value */
SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY); SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY);
/* copy images to files, close files, set device to detached, free gd memory */ if (! (uptr->flags & UNIT_ATT)) /* not currently attached; don't proceed */
return SCPE_OK;
buf = gdImageGifPtr(image,&size); /* if -w flag was passed on attach: save file if there was plotter activity, otherwise delete it */
if (! buf) { /* if -w flag was not passed on attached, always save the file */
saveit = (plot_used || ! delete_if_unused) && (image != NULL);
if (saveit) { /* copy images to files, close files, set device to detached, free gd memory */
if ((buf = gdImageGifPtr(image,&size)) == NULL) {
if (IS_DEBUG) printf("failure creating GIF in-memory\n"); if (IS_DEBUG) printf("failure creating GIF in-memory\n");
return SCPE_MEM; return SCPE_MEM;
} }
fp = uptr->fileref; /* get file attached to unit */ fp = uptr->fileref; /* get file attached to unit */
if (! fseek(fp,0,SEEK_SET)) { /* first we reset to begin of file */ if (fseek(fp,0,SEEK_SET) == 0) { /* first we reset to begin of file */
if (IS_DEBUG) printf("wrote out GIF to file\n"); if (IS_DEBUG) printf("wrote out GIF to file\n");
result = fwrite(buf,1,size,fp); /* write out our image to the file */ result = fwrite(buf,1,size,fp); /* write out our image to the file */
} }
else
result = 0; /* make it look like the write failed so we return error status */
gdFree(buf); /* free up the memory of GIF format */ gdFree(buf); /* free up the memory of GIF format */
gdImageDestroy(image); /* free up the canvas memory */ }
else { /* make a copy of the filename so we can delete it after detach */
if (result != size) { /* some problem writing it */ if ((fname = malloc(strlen(uptr->filename)+1)) != NULL)
if (IS_DEBUG) printf("error in write of image file\n"); strcpy(fname, uptr->filename);
return SCPE_IOERR;
} }
return detach_unit(uptr); /* have simh close the file */ if (image != NULL) {
gdImageDestroy(image); /* free up the canvas memory */
image = NULL;
}
rval = detach_unit(uptr); /* have simh close the file */
if (saveit) { /* if we wrote the file, check that write was OK */
if (result != size) { /* report error writing file */
if (IS_DEBUG) printf("error in write of image file\n");
rval = SCPE_IOERR;
}
}
else { /* if we did not write the file, delete the file */
if (fname == NULL) {
rval = SCPE_MEM; /* we previously failed to allocate a copy of the filename (this will never happen) */
}
else {
remove(fname); /* remove the file and free the copy of the filename */
free(fname);
}
}
return rval;
} }
/* process_cmd - implement the drawing actions of the plotter */ /* process_cmd - implement the drawing actions of the plotter */
@ -474,7 +611,7 @@ static void process_cmd (void)
/* first see if we set any changes to pen or position, do an update */ /* first see if we set any changes to pen or position, do an update */
if (need_update) { if (need_update) {
update_pen(); update_pen();
need_update = 0; need_update = FALSE;
} }
/* will move pen one step or flip pen up or down */ /* will move pen one step or flip pen up or down */
@ -484,49 +621,49 @@ static void process_cmd (void)
switch (plot_cmd) { switch (plot_cmd) {
case 1: /* raise pen command */ case 1: /* raise pen command */
plot_pen = PEN_UP; plot_pen = PEN_UP;
plot_unit->flags = plot_unit->flags & (~UNIT_PEN); CLRBIT(plot_unit->flags, UNIT_PEN);
return; return;
break; break;
case 2: /* +Y command */ case 2: /* +Y command */
plot_ypos = plot_ypos + 1; ++plot_ypos;
break; break;
case 4: /* -Y command */ case 4: /* -Y command */
plot_ypos = plot_ypos - 1; --plot_ypos;
break; break;
case 8: /* -X command */ case 8: /* -X command */
plot_xpos = plot_xpos - 1; --plot_xpos;
break; break;
case 10: /* -X +Y command */ case 10: /* -X +Y command */
plot_xpos = plot_xpos - 1; --plot_xpos;
plot_ypos = plot_ypos + 1; ++plot_ypos;
break; break;
case 12: /* -X -Y command */ case 12: /* -X -Y command */
plot_xpos = plot_xpos - 1; --plot_xpos;
plot_ypos = plot_ypos - 1; --plot_ypos;
break; break;
case 16: /* +X command */ case 16: /* +X command */
plot_xpos = plot_xpos + 1; ++plot_xpos;
break; break;
case 18: /* +X +Y command */ case 18: /* +X +Y command */
plot_xpos = plot_xpos + 1; ++plot_xpos;
plot_ypos = plot_ypos + 1; ++plot_ypos;
break; break;
case 20: /* +X -Y pen command */ case 20: /* +X -Y pen command */
plot_xpos = plot_xpos + 1; ++plot_xpos;
plot_ypos = plot_ypos - 1; --plot_ypos;
break; break;
case 32: /* lower pen command */ case 32: /* lower pen command */
plot_pen = PEN_DOWN; plot_pen = PEN_DOWN;
plot_unit->flags = plot_unit->flags | UNIT_PEN; SETBIT(plot_unit->flags, UNIT_PEN);
return; return;
break; break;
@ -536,19 +673,36 @@ static void process_cmd (void)
break; break;
} }
/* check to see if carriage has moved off any edge */ /* On the real plotter, y motions were physically restricted at the ends of travel.
if ((plot_xpos > (plot_xmax+1)) || (plot_ypos > (plot_ymax+1)) || * We simulate this by clipping the plot_ypos value. Three +y movements at the right
(plot_xpos < 0) || (plot_ypos < 0)) { * end of travel followed by three -y movements will back up 3 positions, just as it would have on
* the physical plotter. Without clipping, the pen would end up where it started, which
* is incorrect. (Hopefully, good 1130 plotting software would never make this happen anyhow!)
*/
if (plot_ypos < 0)
plot_ypos = 0;
else if (plot_ypos > plot_ymax)
plot_ypos = plot_ymax;
/* We do allow X overtravel though, as the drum simply turned past the end of the paper. Three +x
* movements past the end of the paper followed by three -x movements would put the pen back at the
* edge of the paper.
*/
if ((plot_xpos < 0) || (plot_xpos > plot_xmax)) {
/* if so, ignore as 1627 has no way of signalling error */ /* if so, ignore as 1627 has no way of signalling error */
if (IS_DEBUG) printf( if (IS_DEBUG) printf(
"attempted to move carriage off paper edge %d %d for command %d\n", "attempted to move carriage off paper edge %d %d for command %d\n",
plot_xpos,plot_ypos,plot_cmd); plot_xpos,plot_ypos,plot_cmd);
return;
return; // no drawing takes place if the pen is off of the paper!
} }
/* only draw a line if the pen was down during the movement command */ /* only draw a line if the pen was down during the movement command */
if (plot_pen) { if (plot_pen) {
gdImageLine(image, plot_ymax-plot_ypos, plot_xmax-plot_xpos, plot_ymax-oldy, plot_xmax-oldx, gdAntiAliased); gdImageLine(image, plot_ymax-plot_ypos, plot_xmax-plot_xpos, plot_ymax-oldy, plot_xmax-oldx, gdAntiAliased);
plot_used = TRUE; /* remember that we drew something */
/* semantics are 0,0 point is lower right */ /* semantics are 0,0 point is lower right */
} }
@ -564,6 +718,11 @@ static t_stat plot_set_length (UNIT *uptr, int32 set, char *ptr, void *desc)
#define LONGEST_ROLL 1440000 /* longest is 120', 14400", 1,440,000 .01"s */ #define LONGEST_ROLL 1440000 /* longest is 120', 14400", 1,440,000 .01"s */
if (ptr == NULL) { /* check for missing argument */
printf("Command format is: set plot length=nnn\n");
return SCPE_ARG;
}
val = strtotv (ptr, &cptr, (uint32) 10); /* sim routine to get value */ val = strtotv (ptr, &cptr, (uint32) 10); /* sim routine to get value */
if ((val < 1) | (val >= LONGEST_ROLL)) { /* check valid range */ if ((val < 1) | (val >= LONGEST_ROLL)) { /* check valid range */
if (IS_DEBUG) printf("setting paper more than 120' or less than 1 inch\n"); if (IS_DEBUG) printf("setting paper more than 120' or less than 1 inch\n");
@ -626,8 +785,9 @@ static t_stat plot_show_nl(FILE *fp, UNIT *uptr, int32 val, void *descrip)
static t_stat plot_validate_change (UNIT *uptr, int32 set, char *ptr, void *desc) static t_stat plot_validate_change (UNIT *uptr, int32 set, char *ptr, void *desc)
{ {
need_update = 1; need_update = TRUE;
return SCPE_OK; return SCPE_OK;
} }
#endif /* ENABLE_PLOT_SUPPORT */ #endif /* ENABLE_PLOT_SUPPORT */

View file

@ -112,6 +112,7 @@ static t_bool formfed = FALSE; /* last line printed was a formfeed */
#define UNIT_V_RINGCHECK (UNIT_V_UF + 8) #define UNIT_V_RINGCHECK (UNIT_V_UF + 8)
#define UNIT_V_SYNCCHECK (UNIT_V_UF + 9) #define UNIT_V_SYNCCHECK (UNIT_V_UF + 9)
#define UNIT_V_PHYSICAL_PTR (UNIT_V_UF + 10) /* this appears in ibm1130_gui as well */ #define UNIT_V_PHYSICAL_PTR (UNIT_V_UF + 10) /* this appears in ibm1130_gui as well */
#define UNIT_V_TRACE (UNIT_V_UF + 11)
#define UNIT_FORMCHECK (1u << UNIT_V_FORMCHECK) #define UNIT_FORMCHECK (1u << UNIT_V_FORMCHECK)
#define UNIT_DATACHECK (1u << UNIT_V_DATACHECK) #define UNIT_DATACHECK (1u << UNIT_V_DATACHECK)
@ -124,6 +125,7 @@ static t_bool formfed = FALSE; /* last line printed was a formfeed */
#define UNIT_RINGCHECK (1u << UNIT_V_RINGCHECK) #define UNIT_RINGCHECK (1u << UNIT_V_RINGCHECK)
#define UNIT_SYNCCHECK (1u << UNIT_V_SYNCCHECK) #define UNIT_SYNCCHECK (1u << UNIT_V_SYNCCHECK)
#define UNIT_PHYSICAL_PTR (1u << UNIT_V_PHYSICAL_PTR) #define UNIT_PHYSICAL_PTR (1u << UNIT_V_PHYSICAL_PTR)
#define UNIT_TRACE (1u << UNIT_V_TRACE)
UNIT prt_unit[] = { UNIT prt_unit[] = {
{ UDATA (&prt_svc, UNIT_ATTABLE, 0) }, { UDATA (&prt_svc, UNIT_ATTABLE, 0) },
@ -132,6 +134,7 @@ UNIT prt_unit[] = {
#define IS_1403(uptr) (uptr->flags & UNIT_1403) /* model test */ #define IS_1403(uptr) (uptr->flags & UNIT_1403) /* model test */
#define IS_1132(uptr) ((uptr->flags & UNIT_1403) == 0) /* model test */ #define IS_1132(uptr) ((uptr->flags & UNIT_1403) == 0) /* model test */
#define IS_PHYSICAL(uptr) (uptr->flags & UNIT_PHYSICAL_PTR) #define IS_PHYSICAL(uptr) (uptr->flags & UNIT_PHYSICAL_PTR)
#define DO_TRACE(uptr) (uptr->flags & UNIT_TRACE)
/* Parameter in the unit descriptor (1132 printer) */ /* Parameter in the unit descriptor (1132 printer) */
@ -151,6 +154,8 @@ REG prt_reg[] = {
MTAB prt_mod[] = { MTAB prt_mod[] = {
{ UNIT_1403, 0, "1132", "1132", NULL }, /* model option */ { UNIT_1403, 0, "1132", "1132", NULL }, /* model option */
{ UNIT_1403, UNIT_1403, "1403", "1403", NULL }, { UNIT_1403, UNIT_1403, "1403", "1403", NULL },
{ UNIT_TRACE, UNIT_TRACE, "TRACE", "TRACE", NULL },
{ UNIT_TRACE, 0, "NOTRACE", "NOTRACE", NULL },
{ 0 } }; { 0 } };
DEVICE prt_dev = { DEVICE prt_dev = {
@ -348,7 +353,7 @@ static void mytrace (int start, char *what)
char *where; char *where;
if ((where = saywhere(prev_IAR)) == NULL) where = "?"; if ((where = saywhere(prev_IAR)) == NULL) where = "?";
trace_io("%s %s at %04x: %s\n", start ? "start" : "stop", what, prev_IAR, where); trace_io("%s %s at %04x: %s", start ? "start" : "stop", what, prev_IAR, where);
} }
/* xio_1132_printer - XIO command interpreter for the 1132 printer */ /* xio_1132_printer - XIO command interpreter for the 1132 printer */
@ -372,32 +377,33 @@ void xio_1132_printer (int32 iocc_addr, int32 func, int32 modify)
CLRBIT(PRT_DSW, PRT1132_DSW_READ_EMITTER_RESPONSE | PRT1132_DSW_SKIP_RESPONSE | PRT1132_DSW_SPACE_RESPONSE); CLRBIT(PRT_DSW, PRT1132_DSW_READ_EMITTER_RESPONSE | PRT1132_DSW_SKIP_RESPONSE | PRT1132_DSW_SPACE_RESPONSE);
CLRBIT(ILSW[1], ILSW_1_1132_PRINTER); CLRBIT(ILSW[1], ILSW_1_1132_PRINTER);
} }
trace_io("* Printer DSW %04x mod %x", ACC, modify);
break; break;
case XIO_CONTROL: case XIO_CONTROL:
if (modify & PRT_CMD_START_PRINTER) { if (modify & PRT_CMD_START_PRINTER) {
SETBIT(uptr->flags, UNIT_PRINTING); SETBIT(uptr->flags, UNIT_PRINTING);
/* mytrace(1, "printing"); */ if (DO_TRACE(uptr)) mytrace(1, "printing");
} }
if (modify & PRT_CMD_STOP_PRINTER) { if (modify & PRT_CMD_STOP_PRINTER) {
CLRBIT(uptr->flags, UNIT_PRINTING); CLRBIT(uptr->flags, UNIT_PRINTING);
/* mytrace(0, "printing"); */ if (DO_TRACE(uptr)) mytrace(0, "printing");
} }
if (modify & PRT_CMD_START_CARRIAGE) { if (modify & PRT_CMD_START_CARRIAGE) {
SETBIT(uptr->flags, UNIT_SKIPPING); SETBIT(uptr->flags, UNIT_SKIPPING);
/* mytrace(1, "skipping"); */ if (DO_TRACE(uptr)) mytrace(1, "skipping");
} }
if (modify & PRT_CMD_STOP_CARRIAGE) { if (modify & PRT_CMD_STOP_CARRIAGE) {
CLRBIT(uptr->flags, UNIT_SKIPPING); CLRBIT(uptr->flags, UNIT_SKIPPING);
/* mytrace(0, "skipping"); */ if (DO_TRACE(uptr)) mytrace(0, "skipping");
} }
if (modify & PRT_CMD_SPACE) { if (modify & PRT_CMD_SPACE) {
SETBIT(uptr->flags, UNIT_SPACING); SETBIT(uptr->flags, UNIT_SPACING);
/* mytrace(1, "space"); */ if (DO_TRACE(uptr)) mytrace(1, "space");
} }
sim_cancel(uptr); sim_cancel(uptr);
@ -437,6 +443,7 @@ static t_stat prt_svc (UNIT *uptr)
static t_stat prt1132_svc (UNIT *uptr) static t_stat prt1132_svc (UNIT *uptr)
{ {
if (PRT_DSW & PRT1132_DSW_NOT_READY) { /* cancel operation if printer went offline */ if (PRT_DSW & PRT1132_DSW_NOT_READY) { /* cancel operation if printer went offline */
if (DO_TRACE(uptr)) trace_io("1132 form check");
SETBIT(uptr->flags, UNIT_FORMCHECK); SETBIT(uptr->flags, UNIT_FORMCHECK);
SET_ACTION(uptr, 0); SET_ACTION(uptr, 0);
forms_check(TRUE); /* and turn on forms check lamp */ forms_check(TRUE); /* and turn on forms check lamp */
@ -467,9 +474,15 @@ static t_stat prt1132_svc (UNIT *uptr)
if (uptr->flags & UNIT_PRINTING) { if (uptr->flags & UNIT_PRINTING) {
if (! save_1132_prt_line(codewheel1132[prt_nchar].ascii)) { /* save previous printed line */ if (! save_1132_prt_line(codewheel1132[prt_nchar].ascii)) { /* save previous printed line */
trace_io("* Print check -- buffer not set in time");
SETBIT(uptr->flags, UNIT_DATACHECK); /* buffer wasn't set in time */ SETBIT(uptr->flags, UNIT_DATACHECK); /* buffer wasn't set in time */
SET_ACTION(uptr, 0); SET_ACTION(uptr, 0);
print_check(TRUE); /* and turn on forms check lamp */ print_check(TRUE); /* and turn on forms check lamp */
/* if (running)
reason = STOP_IMMEDIATE; // halt on check
*/
return SCPE_OK; return SCPE_OK;
} }
@ -583,6 +596,7 @@ static t_stat prt1403_svc(UNIT *uptr)
{ {
if (PRT_DSW & PRT1403_DSW_NOT_READY) { /* cancel operation if printer went offline */ if (PRT_DSW & PRT1403_DSW_NOT_READY) { /* cancel operation if printer went offline */
SET_ACTION(uptr, 0); SET_ACTION(uptr, 0);
if (DO_TRACE(uptr)) trace_io("1403 form check");
forms_check(TRUE); /* and turn on forms check lamp */ forms_check(TRUE); /* and turn on forms check lamp */
} }
else if (uptr->flags & UNIT_TRANSFERRING) { /* end of transfer */ else if (uptr->flags & UNIT_TRANSFERRING) { /* end of transfer */
@ -635,7 +649,7 @@ static t_stat prt1403_svc(UNIT *uptr)
/* delete_cmd - SCP command to delete a file */ /* delete_cmd - SCP command to delete a file */
static t_stat delete_cmd (int32 flag, char *cptr) static t_stat delete_cmd (int flag, char *cptr)
{ {
char gbuf[CBUFSIZE]; char gbuf[CBUFSIZE];
int status; int status;

View file

@ -363,7 +363,7 @@ static t_stat tti_svc (UNIT *uptr)
if ((tti_unit.flags & CSET_MASK) == CSET_ASCII) if ((tti_unit.flags & CSET_MASK) == CSET_ASCII)
temp = conin_map[temp] & 0xFF; /* perform input translation */ temp = conin_map[temp] & 0xFF; /* perform input translation */
if (temp == IRQ_KEY) { /* INT REQ (interrupt request) key */ if (temp == IRQ_KEY) { /* INT REQ (interrupt request) key -- process this even if no keyboard input request pending */
SETBIT(tti_dsw, TT_DSW_INTERRUPT_REQUEST); /* queue interrupt */ SETBIT(tti_dsw, TT_DSW_INTERRUPT_REQUEST); /* queue interrupt */
SETBIT(ILSW[4], ILSW_4_CONSOLE); SETBIT(ILSW[4], ILSW_4_CONSOLE);
calc_ints(); calc_ints();
@ -388,16 +388,17 @@ static t_stat tti_svc (UNIT *uptr)
return SCPE_OK; return SCPE_OK;
} }
// keyboard is locked or no active input request?
if ((tti_unit.flags & KEYBOARD_LOCKED) || ! (tti_dsw & TT_DSW_KEYBOARD_BUSY)) { if ((tti_unit.flags & KEYBOARD_LOCKED) || ! (tti_dsw & TT_DSW_KEYBOARD_BUSY)) {
SendBeep(); SendBeep();
calc_ints();
return SCPE_OK; return SCPE_OK;
} }
if ((tti_unit.flags & CSET_MASK) == CSET_ASCII) if ((tti_unit.flags & CSET_MASK) == CSET_ASCII)
temp = ascii_to_conin[temp]; temp = ascii_to_conin[temp];
if (temp == 0) { /* ignore invalid characters */ if (temp == 0) { /* ignore invalid characters (no mapping to 1130 input code) */
SendBeep(); SendBeep();
calc_ints(); calc_ints();
return SCPE_OK; return SCPE_OK;

View file

@ -35,6 +35,7 @@ extern DEVICE gdu_dev, console_dev, plot_dev;
extern UNIT cpu_unit; extern UNIT cpu_unit;
extern REG cpu_reg[]; extern REG cpu_reg[];
extern int32 saved_PC; extern int32 saved_PC;
extern t_bool is_1800;
/* SCP data structures and interface routines /* SCP data structures and interface routines
@ -290,11 +291,9 @@ static int ebcdic_to_ascii (int ch)
t_stat fprint_sym (FILE *of, t_addr addr, t_value *val, UNIT *uptr, int32 sw) t_stat fprint_sym (FILE *of, t_addr addr, t_value *val, UNIT *uptr, int32 sw)
{ {
int32 cflag, ch, OP, F, TAG, INDIR, DSPLC, IR, eaddr; int32 ch, OP, F, TAG, INDIR, DSPLC, IR, eaddr;
char *mnem, tst[12]; char *mnem, tst[12];
cflag = (uptr == NULL) || (uptr == &cpu_unit);
/* if (sw & SWMASK ('A')) { // ASCII? not useful /* if (sw & SWMASK ('A')) { // ASCII? not useful
fprintf (of, (c1 < 040)? "<%03o>": "%c", c1); fprintf (of, (c1 < 040)? "<%03o>": "%c", c1);
return SCPE_OK; return SCPE_OK;
@ -348,6 +347,13 @@ t_stat fprint_sym (FILE *of, t_addr addr, t_value *val, UNIT *uptr, int32 sw)
} }
mnem = opcode[OP]; /* get mnemonic */ mnem = opcode[OP]; /* get mnemonic */
if (is_1800) { /* these two are defined on the 1800 but undefined on the 1130 */
if (OP == 0x16)
mnem = "CMP ";
else if (OP == 0x17)
mnem = "DCMP";
}
if (OP == 0x02) { /* left shifts are special */ if (OP == 0x02) { /* left shifts are special */
mnem = lsopcode[(DSPLC >> 6) & 0x0003]; mnem = lsopcode[(DSPLC >> 6) & 0x0003];
DSPLC &= 0x003F; DSPLC &= 0x003F;

View file

@ -4,12 +4,13 @@
// //
#define IDB_CONSOLE 101 #define IDB_CONSOLE 101
#define IDC_MYHAND 102 #define IDC_MYHAND 102
#define IDI_ICON1 103
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101

View file

@ -1,74 +0,0 @@
# (This makefile is for operating systems other than Windows,
# or compilers other than Microsoft's. For MS builds, use the
# .mak files found in this directory and the utils directory).
#
# If you are building the emulator and utilities as part of
# the SIMH package, please:
#
# Be sure that you there are NO copies of scp.c, scp_tty.c,
# sim_sock.c, sim_tmxr.c, sim_rev.h, sim_defs.h, sim_sock.h and
# sim_tmxr.h in the ibm1130 subdirectory. Delete them if there
# are.
#
# Do not use this makefile with "make all" or "make ibm1130".
# Use the SIMH build files instead.
#
# If and when you download updates for this simulator from
# www.ibm1130.org, get ibm1130code.zip and ibm1130software.zip
# separately.
#
# If you have downloaded the emulator independently of SIMH (e.g, from
# www.ibm1130.org), please:
#
# Be sure that you DO have copies of scp.c, scp_tty.c, sim_sock.c,
# sim_tmxr.c, sim_rev.h, sim_defs.h, sim_sock.h and sim_tmxr.h
# in this folder.
#
# Use this file to make the emulator.
#
# If and when you download updates for this simulator from
# www.ibm1130.org, get ibm1130.zip. When you expand it,
# also expand ibm1130sofware.zip, which is inside.
#
# In either case, if you want to build DMS or work with assembly
# language programs outside of DMS, you'll want to make the utilities
# by cd'ing to the utils directory and running make there.
# CC Command
#
# Note: -O2 is sometimes broken in GCC when setjump/longjump is being
# used. Try -O2 only with released simulators.
#
CC = gcc -O0 -lm -I .
#CC = gcc -O2 -g -lm -I .
#
# Common Libraries
#
BIN =
SIM = scp.c sim_console.c sim_fio.c sim_sock.c sim_timer.c sim_tmxr.c scp_tty.c
SIM_INC = scp.h sim_console.h sim_defs.h sim_fio.h sim_rev.h sim_sock.h sim_timer.h sim_tmxr.h
#
# Emulator source files and compile time options
#
ibm1130D = ./
ibm1130 = ${ibm1130D}ibm1130_sys.c ${ibm1130D}ibm1130_cpu.c \
${ibm1130D}ibm1130_cr.c ${ibm1130D}ibm1130_disk.c \
${ibm1130D}ibm1130_stddev.c ${ibm1130D}ibm1130_gdu.c \
${ibm1130D}ibm1130_gui.c ${ibm1130D}ibm1130_prt.c \
${ibm1130D}ibm1130_ptrp.c ${ibm1130D}ibm1130_fmt.c
ibm1130_INC = ibm1130res.h ibm1130_conin.h ibm1130_conout.h \
ibm1130_defs.h ibm1130_prtwheel.h ibm1130_fmt.h \
dmsr2v12phases.h dmsr2v12slet.h
#
# Build the emulator
#
${BIN}ibm1130 : ${ibm1130} ${SIM} ${ibm1130_INC} ${SIM_INC}
${CC} ${ibm1130} ${SIM} -o $@

View file

@ -1,5 +1,13 @@
Here's the 1130 simulator as it stands now. Here's the 1130 simulator as it stands now.
Status: 25Oct2012
* Added plotter and 2250 GDU support (though, we don't
have the 2250 support library)
* Numerous fixes, especially the error in compiling
the FORTRAN sqrt() function under extended precision.
Status: 22Jul2003 Status: 22Jul2003
* Added support for APL\1130 output translations * Added support for APL\1130 output translations

View file

@ -27,7 +27,7 @@
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
Description="Check for required build dependencies &amp; git commit id" Description="Check for required build dependencies &amp; git commit id"
CommandLine="if not exist ../../windows-build/winpcap/Wpdpack/Include/pcap.h goto _notice&#x0D;&#x0A;if not exist ../../windows-build/pthreads/pthread.h goto _notice&#x0D;&#x0A;goto _good&#x0D;&#x0A;&#x0D;&#x0A;:_notice&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ** The required build support is not available. **&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;type 0ReadMe_Projects.txt&#x0D;&#x0A;exit 1&#x0D;&#x0A;&#x0D;&#x0A;:_good&#x0D;&#x0A;if not exist ..\.git goto _SetId&#x0D;&#x0A;if exist ..\.git\hooks\post-commit goto _SetId&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo ** Installing git hooks in newly cloned repository **&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;copy git-hooks\post* ..\.git\hooks\&#x0D;&#x0A;:_SetId&#x0D;&#x0A;SET GIT_COMMIT_ID=&#x0D;&#x0A;if not exist ..\.git-commit-id goto _NoId&#x0D;&#x0A;for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i&#x0D;&#x0A;:_NoId&#x0D;&#x0A;SET OLD_GIT_COMMIT_ID=&#x0D;&#x0A;if not exist .git-commit-id.h echo.&gt;.git-commit-id.h&#x0D;&#x0A;for /F &quot;tokens=3&quot; %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i&#x0D;&#x0A;if &quot;%GIT_COMMIT_ID%&quot; equ &quot;%OLD_GIT_COMMIT_ID%&quot; goto _IdGood&#x0D;&#x0A;echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% &gt;.git-commit-id.h&#x0D;&#x0A;:_IdGood&#x0D;&#x0A;" CommandLine="goto _good&#x0D;&#x0A;&#x0D;&#x0A;:_notice&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ** The required build support is not available. **&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;type 0ReadMe_Projects.txt&#x0D;&#x0A;exit 1&#x0D;&#x0A;&#x0D;&#x0A;:_good&#x0D;&#x0A;if not exist ..\.git goto _SetId&#x0D;&#x0A;if exist ..\.git\hooks\post-commit goto _SetId&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo ** Installing git hooks in newly cloned repository **&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;copy git-hooks\post* ..\.git\hooks\&#x0D;&#x0A;:_SetId&#x0D;&#x0A;SET GIT_COMMIT_ID=&#x0D;&#x0A;if not exist ..\.git-commit-id goto _NoId&#x0D;&#x0A;for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i&#x0D;&#x0A;:_NoId&#x0D;&#x0A;SET OLD_GIT_COMMIT_ID=&#x0D;&#x0A;if not exist .git-commit-id.h echo.&gt;.git-commit-id.h&#x0D;&#x0A;for /F &quot;tokens=3&quot; %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i&#x0D;&#x0A;if &quot;%GIT_COMMIT_ID%&quot; equ &quot;%OLD_GIT_COMMIT_ID%&quot; goto _IdGood&#x0D;&#x0A;echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% &gt;.git-commit-id.h&#x0D;&#x0A;:_IdGood&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
@ -45,7 +45,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="./;../;../ibm1130/" AdditionalIncludeDirectories="./;../;../ibm1130/"
PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SIM_NEED_GIT_COMMIT_ID" PreprocessorDefinitions="GUI_SUPPORT;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SIM_NEED_GIT_COMMIT_ID"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
@ -108,7 +108,7 @@
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
Description="Check for required build dependencies &amp; git commit id" Description="Check for required build dependencies &amp; git commit id"
CommandLine="if not exist ../../windows-build/winpcap/Wpdpack/Include/pcap.h goto _notice&#x0D;&#x0A;if not exist ../../windows-build/pthreads/pthread.h goto _notice&#x0D;&#x0A;goto _good&#x0D;&#x0A;&#x0D;&#x0A;:_notice&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ** The required build support is not available. **&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;type 0ReadMe_Projects.txt&#x0D;&#x0A;exit 1&#x0D;&#x0A;&#x0D;&#x0A;:_good&#x0D;&#x0A;if not exist ..\.git goto _SetId&#x0D;&#x0A;if exist ..\.git\hooks\post-commit goto _SetId&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo ** Installing git hooks in newly cloned repository **&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;copy git-hooks\post* ..\.git\hooks\&#x0D;&#x0A;:_SetId&#x0D;&#x0A;SET GIT_COMMIT_ID=&#x0D;&#x0A;if not exist ..\.git-commit-id goto _NoId&#x0D;&#x0A;for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i&#x0D;&#x0A;:_NoId&#x0D;&#x0A;SET OLD_GIT_COMMIT_ID=&#x0D;&#x0A;if not exist .git-commit-id.h echo.&gt;.git-commit-id.h&#x0D;&#x0A;for /F &quot;tokens=3&quot; %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i&#x0D;&#x0A;if &quot;%GIT_COMMIT_ID%&quot; equ &quot;%OLD_GIT_COMMIT_ID%&quot; goto _IdGood&#x0D;&#x0A;echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% &gt;.git-commit-id.h&#x0D;&#x0A;:_IdGood&#x0D;&#x0A;" CommandLine="goto _good&#x0D;&#x0A;&#x0D;&#x0A;:_notice&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ** The required build support is not available. **&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;echo ****************************************************&#x0D;&#x0A;type 0ReadMe_Projects.txt&#x0D;&#x0A;exit 1&#x0D;&#x0A;&#x0D;&#x0A;:_good&#x0D;&#x0A;if not exist ..\.git goto _SetId&#x0D;&#x0A;if exist ..\.git\hooks\post-commit goto _SetId&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo ** Installing git hooks in newly cloned repository **&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;echo *****************************************************&#x0D;&#x0A;copy git-hooks\post* ..\.git\hooks\&#x0D;&#x0A;:_SetId&#x0D;&#x0A;SET GIT_COMMIT_ID=&#x0D;&#x0A;if not exist ..\.git-commit-id goto _NoId&#x0D;&#x0A;for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i&#x0D;&#x0A;:_NoId&#x0D;&#x0A;SET OLD_GIT_COMMIT_ID=&#x0D;&#x0A;if not exist .git-commit-id.h echo.&gt;.git-commit-id.h&#x0D;&#x0A;for /F &quot;tokens=3&quot; %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i&#x0D;&#x0A;if &quot;%GIT_COMMIT_ID%&quot; equ &quot;%OLD_GIT_COMMIT_ID%&quot; goto _IdGood&#x0D;&#x0A;echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% &gt;.git-commit-id.h&#x0D;&#x0A;:_IdGood&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
@ -128,7 +128,7 @@
InlineFunctionExpansion="1" InlineFunctionExpansion="1"
OmitFramePointers="true" OmitFramePointers="true"
AdditionalIncludeDirectories="./;../;../ibm1130/" AdditionalIncludeDirectories="./;../;../ibm1130/"
PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SIM_NEED_GIT_COMMIT_ID" PreprocessorDefinitions="GUI_SUPPORT;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;SIM_NEED_GIT_COMMIT_ID"
StringPooling="true" StringPooling="true"
RuntimeLibrary="0" RuntimeLibrary="0"
EnableFunctionLevelLinking="true" EnableFunctionLevelLinking="true"
@ -306,6 +306,10 @@
RelativePath="..\ibm1130\ibm1130_defs.h" RelativePath="..\ibm1130\ibm1130_defs.h"
> >
</File> </File>
<File
RelativePath="..\Ibm1130\ibm1130_fmt.h"
>
</File>
<File <File
RelativePath="..\ibm1130\ibm1130_prtwheel.h" RelativePath="..\ibm1130\ibm1130_prtwheel.h"
> >
@ -367,6 +371,46 @@
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
> >
<File
RelativePath="..\Ibm1130\1130consoleblank.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\1132empty.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\1132full.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\1442empty.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\1442eof.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\1442full.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\1442middle.bmp"
>
</File>
<File
RelativePath="..\Ibm1130\hand.cur"
>
</File>
<File
RelativePath="..\Ibm1130\ibm1130.ico"
>
</File>
<File
RelativePath="..\Ibm1130\ibm1130.rc"
>
</File>
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>

View file

@ -754,6 +754,9 @@ IBM1130 = ${IBM1130D}/ibm1130_cpu.c ${IBM1130D}/ibm1130_cr.c \
${IBM1130D}/ibm1130_plot.c ${IBM1130D}/ibm1130_sca.c \ ${IBM1130D}/ibm1130_plot.c ${IBM1130D}/ibm1130_sca.c \
${IBM1130D}/ibm1130_t2741.c ${IBM1130D}/ibm1130_t2741.c
IBM1130_OPT = -I ${IBM1130D} IBM1130_OPT = -I ${IBM1130D}
ifneq ($(WIN32),)
IBM1130_OPT += -DGUI_SUPPORT -lgdi32
endif
ID16D = Interdata ID16D = Interdata
@ -1038,7 +1041,13 @@ ibm1130 : ${BIN}ibm1130${EXE}
${BIN}ibm1130${EXE} : ${IBM1130} ${BIN}ibm1130${EXE} : ${IBM1130}
${MKDIRBIN} ${MKDIRBIN}
ifneq ($(WIN32),)
windres ${IBM1130D}/ibm1130.rc $(BIN)ibm1130.o
${CC} ${IBM1130} ${SIM} ${IBM1130_OPT} $(BIN)ibm1130.o $(CC_OUTSPEC) ${LDFLAGS}
del BIN\ibm1130.o
else
${CC} ${IBM1130} ${SIM} ${IBM1130_OPT} $(CC_OUTSPEC) ${LDFLAGS} ${CC} ${IBM1130} ${SIM} ${IBM1130_OPT} $(CC_OUTSPEC) ${LDFLAGS}
endif
s3 : ${BIN}s3${EXE} s3 : ${BIN}s3${EXE}

2
scp.h
View file

@ -115,6 +115,7 @@ char *get_range (DEVICE *dptr, char *cptr, t_addr *lo, t_addr *hi,
uint32 rdx, t_addr max, char term); uint32 rdx, t_addr max, char term);
t_value strtotv (const char *cptr, char **endptr, uint32 radix); t_value strtotv (const char *cptr, char **endptr, uint32 radix);
t_stat fprint_val (FILE *stream, t_value val, uint32 rdx, uint32 wid, uint32 fmt); t_stat fprint_val (FILE *stream, t_value val, uint32 rdx, uint32 wid, uint32 fmt);
char *read_line (char *cptr, int32 size, FILE *stream);
void fprint_reg_help (FILE *st, DEVICE *dptr); void fprint_reg_help (FILE *st, DEVICE *dptr);
void fprint_set_help (FILE *st, DEVICE *dptr); void fprint_set_help (FILE *st, DEVICE *dptr);
void fprint_show_help (FILE *st, DEVICE *dptr); void fprint_show_help (FILE *st, DEVICE *dptr);
@ -163,6 +164,7 @@ extern FILE *sim_deb; /* debug file */
extern FILEREF *sim_deb_ref; /* debug file file reference */ extern FILEREF *sim_deb_ref; /* debug file file reference */
extern UNIT *sim_clock_queue; extern UNIT *sim_clock_queue;
extern int32 sim_is_running; extern int32 sim_is_running;
extern char *sim_prompt; /* prompt string */
extern volatile int32 stop_cpu; extern volatile int32 stop_cpu;
extern uint32 sim_brk_types; /* breakpoint info */ extern uint32 sim_brk_types; /* breakpoint info */
extern uint32 sim_brk_dflt; extern uint32 sim_brk_dflt;