Merged the latest ibm1130 simulator from Brian Knittel's ibm1130.org
This commit is contained in:
parent
ba87329baa
commit
e65ef135d2
21 changed files with 724 additions and 790 deletions
BIN
Ibm1130/ibm1130.ico
Normal file
BIN
Ibm1130/ibm1130.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
|
@ -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
|
|
||||||
################################################################################
|
|
|
@ -1,4 +1,4 @@
|
||||||
//Microsoft Visual C++ generated resource script.
|
// Microsoft Visual C++ generated resource script.
|
||||||
//
|
//
|
||||||
#include "ibm1130res.h"
|
#include "ibm1130res.h"
|
||||||
|
|
||||||
|
@ -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
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -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) },
|
||||||
|
@ -300,14 +314,18 @@ REG cpu_reg[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
MTAB cpu_mod[] = {
|
MTAB cpu_mod[] = {
|
||||||
{ UNIT_MSIZE, 4096, NULL, "4KW", &cpu_set_size},
|
{ UNIT_MSIZE, 4096, NULL, "4KW", &cpu_set_size},
|
||||||
{ UNIT_MSIZE, 8192, NULL, "8KW", &cpu_set_size},
|
{ UNIT_MSIZE, 8192, NULL, "8KW", &cpu_set_size},
|
||||||
{ UNIT_MSIZE, 16384, NULL, "16KW", &cpu_set_size},
|
{ UNIT_MSIZE, 16384, NULL, "16KW", &cpu_set_size},
|
||||||
{ UNIT_MSIZE, 32768, NULL, "32KW", &cpu_set_size},
|
{ UNIT_MSIZE, 32768, NULL, "32KW", &cpu_set_size},
|
||||||
#ifdef ENABLE_1800_SUPPORT
|
#ifdef ENABLE_1800_SUPPORT
|
||||||
{ 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
@ -60,25 +71,29 @@
|
||||||
|
|
||||||
The ATTACH CR command accepts several command-line switches
|
The ATTACH CR command accepts several command-line switches
|
||||||
|
|
||||||
-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
|
||||||
converts lower case input to the uppercase Hollerith character codes.
|
converts lower case input to the uppercase Hollerith character codes.
|
||||||
(Lowercase codes are used in APL\1130 save decks).
|
(Lowercase codes are used in APL\1130 save decks).
|
||||||
|
|
||||||
-d prints a lot of simulator debugging information
|
-d prints a lot of simulator debugging information
|
||||||
|
|
||||||
-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
|
||||||
(See below for a discussion of tab formatting)
|
-# converts tabs in an ascii file to spaces, with tab settings every # columns
|
||||||
|
(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.
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
memset(ascii_to_card, 0, sizeof(ascii_to_card));
|
if (code != NULL) { /* if an ASCII mode was selected */
|
||||||
|
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,8 +1629,14 @@ 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 {
|
||||||
return rval;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_decklist) { /* if we skipped the '@', store the actually-specified name */
|
if (use_decklist) { /* if we skipped the '@', store the actually-specified name */
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
@ -250,15 +254,13 @@ static void start_regeneration (void)
|
||||||
|
|
||||||
static void halt_regeneration (void)
|
static void halt_regeneration (void)
|
||||||
{
|
{
|
||||||
// halt_regeneration gets called at end of every refresh interation, so it should NOT black out the
|
// halt_regeneration gets called at end of every refresh interation, so it should NOT black out the
|
||||||
// screen -- this is why it was flickering so badly. The lower level code (called on a timer)
|
// screen -- this is why it was flickering so badly. The lower level code (called on a timer)
|
||||||
// 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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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,8 +191,8 @@ 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
|
||||||
#define BLUE 0,0,255
|
#define BLUE 0,0,255
|
||||||
|
@ -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) },
|
||||||
|
@ -167,10 +218,10 @@ UNIT plot_unit[] = {
|
||||||
|
|
||||||
REG plot_reg[] = {
|
REG plot_reg[] = {
|
||||||
{ HRDATA (DSW, plot_dsw, 16) }, /* device status word */
|
{ HRDATA (DSW, plot_dsw, 16) }, /* device status word */
|
||||||
{ 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;
|
||||||
|
|
||||||
CLRBIT(uptr->flags, UNIT_DEBUG);
|
SETBIT(plot_dsw, PLOT1627_DSW_NOT_READY); /* assume failure */
|
||||||
|
|
||||||
|
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,19 +440,22 @@ 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;
|
||||||
|
|
||||||
if (!IS_ONLINE(plot_unit)) return; /* only do this if attached */
|
if (! IS_ONLINE(plot_unit)) return; /* only do this if attached */
|
||||||
|
|
||||||
/* pick up latest color as active pen */
|
/* pick up latest color as active pen */
|
||||||
color = GET_COLOR;
|
color = GET_COLOR;
|
||||||
|
@ -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 */
|
||||||
if (IS_DEBUG) printf("failure creating GIF in-memory\n");
|
saveit = (plot_used || ! delete_if_unused) && (image != NULL);
|
||||||
return SCPE_MEM;
|
|
||||||
|
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");
|
||||||
|
return SCPE_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = uptr->fileref; /* get file attached to unit */
|
||||||
|
|
||||||
|
if (fseek(fp,0,SEEK_SET) == 0) { /* first we reset to begin of file */
|
||||||
|
if (IS_DEBUG) printf("wrote out GIF to file\n");
|
||||||
|
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 */
|
||||||
|
}
|
||||||
|
else { /* make a copy of the filename so we can delete it after detach */
|
||||||
|
if ((fname = malloc(strlen(uptr->filename)+1)) != NULL)
|
||||||
|
strcpy(fname, uptr->filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fp = uptr->fileref; /* get file attached to unit */
|
return rval;
|
||||||
|
|
||||||
if (! fseek(fp,0,SEEK_SET)) { /* first we reset to begin of file */
|
|
||||||
if (IS_DEBUG) printf("wrote out GIF to file\n");
|
|
||||||
result = fwrite(buf,1,size,fp); /* write out our image to the file */
|
|
||||||
}
|
|
||||||
|
|
||||||
gdFree(buf); /* free up the memory of GIF format */
|
|
||||||
gdImageDestroy(image); /* free up the canvas memory */
|
|
||||||
|
|
||||||
if (result != size) { /* some problem writing it */
|
|
||||||
if (IS_DEBUG) printf("error in write of image file\n");
|
|
||||||
return SCPE_IOERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return detach_unit(uptr); /* have simh close the file */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 */
|
||||||
|
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
||||||
|
@ -149,8 +152,10 @@ REG prt_reg[] = {
|
||||||
{ NULL } };
|
{ NULL } };
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,12 +291,10 @@ 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;
|
||||||
|
@ -459,7 +465,7 @@ int strnicmp (const char *a, const char *b, size_t n)
|
||||||
{
|
{
|
||||||
int ca, cb;
|
int ca, cb;
|
||||||
|
|
||||||
if (n == 0) return 0; /* zero length compare is equal */
|
if (n == 0) return 0; /* zero length compare is equal */
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if ((ca = *a) == 0) /* get character, stop on null terminator */
|
if ((ca = *a) == 0) /* get character, stop on null terminator */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 $@
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPreBuildEventTool"
|
Name="VCPreBuildEventTool"
|
||||||
Description="Check for required build dependencies & git commit id"
|
Description="Check for required build dependencies & git commit id"
|
||||||
CommandLine="if not exist ../../windows-build/winpcap/Wpdpack/Include/pcap.h goto _notice
if not exist ../../windows-build/pthreads/pthread.h goto _notice
goto _good

:_notice
echo ****************************************************
echo ****************************************************
echo ** The required build support is not available. **
echo ****************************************************
echo ****************************************************
type 0ReadMe_Projects.txt
exit 1

:_good
if not exist ..\.git goto _SetId
if exist ..\.git\hooks\post-commit goto _SetId
echo *****************************************************
echo *****************************************************
echo ** Installing git hooks in newly cloned repository **
echo *****************************************************
echo *****************************************************
copy git-hooks\post* ..\.git\hooks\
:_SetId
SET GIT_COMMIT_ID=
if not exist ..\.git-commit-id goto _NoId
for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i
:_NoId
SET OLD_GIT_COMMIT_ID=
if not exist .git-commit-id.h echo.>.git-commit-id.h
for /F "tokens=3" %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i
if "%GIT_COMMIT_ID%" equ "%OLD_GIT_COMMIT_ID%" goto _IdGood
echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% >.git-commit-id.h
:_IdGood
"
|
CommandLine="goto _good

:_notice
echo ****************************************************
echo ****************************************************
echo ** The required build support is not available. **
echo ****************************************************
echo ****************************************************
type 0ReadMe_Projects.txt
exit 1

:_good
if not exist ..\.git goto _SetId
if exist ..\.git\hooks\post-commit goto _SetId
echo *****************************************************
echo *****************************************************
echo ** Installing git hooks in newly cloned repository **
echo *****************************************************
echo *****************************************************
copy git-hooks\post* ..\.git\hooks\
:_SetId
SET GIT_COMMIT_ID=
if not exist ..\.git-commit-id goto _NoId
for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i
:_NoId
SET OLD_GIT_COMMIT_ID=
if not exist .git-commit-id.h echo.>.git-commit-id.h
for /F "tokens=3" %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i
if "%GIT_COMMIT_ID%" equ "%OLD_GIT_COMMIT_ID%" goto _IdGood
echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% >.git-commit-id.h
:_IdGood
"
|
||||||
/>
|
/>
|
||||||
<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 & git commit id"
|
Description="Check for required build dependencies & git commit id"
|
||||||
CommandLine="if not exist ../../windows-build/winpcap/Wpdpack/Include/pcap.h goto _notice
if not exist ../../windows-build/pthreads/pthread.h goto _notice
goto _good

:_notice
echo ****************************************************
echo ****************************************************
echo ** The required build support is not available. **
echo ****************************************************
echo ****************************************************
type 0ReadMe_Projects.txt
exit 1

:_good
if not exist ..\.git goto _SetId
if exist ..\.git\hooks\post-commit goto _SetId
echo *****************************************************
echo *****************************************************
echo ** Installing git hooks in newly cloned repository **
echo *****************************************************
echo *****************************************************
copy git-hooks\post* ..\.git\hooks\
:_SetId
SET GIT_COMMIT_ID=
if not exist ..\.git-commit-id goto _NoId
for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i
:_NoId
SET OLD_GIT_COMMIT_ID=
if not exist .git-commit-id.h echo.>.git-commit-id.h
for /F "tokens=3" %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i
if "%GIT_COMMIT_ID%" equ "%OLD_GIT_COMMIT_ID%" goto _IdGood
echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% >.git-commit-id.h
:_IdGood
"
|
CommandLine="goto _good

:_notice
echo ****************************************************
echo ****************************************************
echo ** The required build support is not available. **
echo ****************************************************
echo ****************************************************
type 0ReadMe_Projects.txt
exit 1

:_good
if not exist ..\.git goto _SetId
if exist ..\.git\hooks\post-commit goto _SetId
echo *****************************************************
echo *****************************************************
echo ** Installing git hooks in newly cloned repository **
echo *****************************************************
echo *****************************************************
copy git-hooks\post* ..\.git\hooks\
:_SetId
SET GIT_COMMIT_ID=
if not exist ..\.git-commit-id goto _NoId
for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i
:_NoId
SET OLD_GIT_COMMIT_ID=
if not exist .git-commit-id.h echo.>.git-commit-id.h
for /F "tokens=3" %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i
if "%GIT_COMMIT_ID%" equ "%OLD_GIT_COMMIT_ID%" goto _IdGood
echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% >.git-commit-id.h
:_IdGood
"
|
||||||
/>
|
/>
|
||||||
<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>
|
||||||
|
|
9
makefile
9
makefile
|
@ -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
2
scp.h
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue