30 lines
1.9 KiB
Fortran
30 lines
1.9 KiB
Fortran
PROGRAM SUBLEQ0 !Simulates a One-Instruction computer, with Subtract and Branch if <= 0.
|
|
INTEGER LOTS,LOAD !Document some bounds.
|
|
PARAMETER (LOTS = 36, LOAD = 31) !Sufficient for the example.
|
|
INTEGER IAR, MEM(0:LOTS) !The basic storage of a computer. IAR could be in memory too.
|
|
INTEGER ABC(3),A,B,C !A hardware register. Could use INTEGER*1 for everything...
|
|
EQUIVALENCE (ABC(1),A),(ABC(2),B),(ABC(3),C) !It has components.
|
|
INTEGER INITIAL(0:LOAD) !There is no sign of a bootstrap loader sequence!
|
|
DATA INITIAL/15,17,-1,17,-1,-1,16,1,-1,16,3,-1,15,15,0,0,-1, !These are operations, it so happens.
|
|
1 72,101,108,108,111,44,32,119,111,114,108,100,33,10,0/ !And these happen to be ASCII character code numbers.
|
|
Core memory initialisation.
|
|
MEM = -66 !Accessing uninitialised memory is improper. This might cause hiccoughs..
|
|
MEM(0:LOAD) = INITIAL !No bootstrap!
|
|
IAR = 0 !The Instruction Address Register starts at the start.
|
|
Commence execution of the current instruction.
|
|
100 ABC = MEM(IAR:IAR + 2) !Load the three-word instruction.
|
|
IAR = IAR + 3 !Advance IAR accordingly.
|
|
IF (A .EQ. -1) THEN !Decode the instruction as per the design.
|
|
WRITE (6,102) !Supply a prompt, otherwise, obscurity results.
|
|
102 FORMAT (" A number:",$) !But, that will make a mess of the layout.
|
|
READ (5,*) MEM(B) !The specified action is to read as a number.
|
|
ELSE IF (B .EQ. -1) THEN !This is for output.
|
|
WRITE (6,103) CHAR(MEM(A)) !As specified, interpret a number as a character.
|
|
103 FORMAT (A1,$) !The $, obviously, states: do not end the line and start the next.
|
|
ELSE !And this is a two-part action.
|
|
MEM(B) = MEM(B) - MEM(A) !Perform arithmetic.
|
|
IF (MEM(B).LE.0) IAR = C !And based on the result, maybe a GO TO.
|
|
END IF !So much for decoding.
|
|
IF (IAR.GE.0) GO TO 100 !Keep at it.
|
|
END !That was simple.
|