#LyX 2.4 created this file. For more info see https://www.lyx.org/
\lyxformat 620
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass book
\begin_preamble
\input defs
\end_preamble
\use_default_options true
\maintain_unincluded_children no
\language english
\language_package default
\inputencoding utf8
\fontencoding auto
\font_roman "default" "default"
\font_sans "default" "default"
\font_typewriter "default" "default"
\font_math "auto" "auto"
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_roman_osf false
\font_sans_osf false
\font_typewriter_osf false
\font_sf_scale 100 100
\font_tt_scale 100 100
\use_microtype false
\use_dash_ligatures true
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\float_placement class
\float_alignment class
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\use_formatted_ref 0
\use_minted 0
\use_lineno 0
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\is_math_indent 0
\math_numbering_side default
\quotes_style english
\dynamic_quotes 0
\papercolumns 1
\papersides 1
\paperpagestyle default
\tablestyle default
\tracking_changes false
\output_changes false
\change_bars false
\postpone_fragile_content false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\docbook_table_output 0
\docbook_mathml_prefix 1
\end_header
\begin_body
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
exerc1[05]
\end_layout
\end_inset
\end_layout
\begin_layout Enumerate
Would sequence (3) still be correct if the
\family typewriter
MOVE
\family default
instructions were placed before the
\family typewriter
JBUS
\family default
instruction instead of after it?
\end_layout
\begin_layout Enumerate
What if the
\family typewriter
MOVE
\family default
instructions were placed after the
\family typewriter
IN
\family default
command?
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
\end_layout
\begin_layout Enumerate
No,
because they would be reading the old data.
\end_layout
\begin_layout Enumerate
No,
because the new data would overwrite the old data while we are reading it.
It would probably turn out okay since the new data is probably being read at a slower pace than the
\family typewriter
MOVE
\family default
instructions,
but it's not wise to bet on it.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
exerc2[10]
\end_layout
\end_inset
The instructions `
\family typewriter
OUT 1000(6)
\family default
;
\family typewriter
JBUS *(6)
\family default
' may be used to output a tape block in an unbuffered fashion,
just as the instructions (1) did this for input.
Give a method analogous to (2) and (3) that buffers this output,
by using
\family typewriter
MOVE
\family default
instructions and an auxiliary buffer in locations 2000–2099.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
Every time a new block of data is ready in locations 1000–1099,
we want to clear it to allow other operations to write on it and write it to tape in the meantime,
making sure that the previous block has finished writing before that.
Therefore we could just run the following after each block is ready:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
ENT1 2000
\end_layout
\begin_layout Plain Layout
JBUS *(6)
\end_layout
\begin_layout Plain Layout
MOVE 1000(50)
\end_layout
\begin_layout Plain Layout
MOVE 1050(50)
\end_layout
\begin_layout Plain Layout
OUT 2000(6)
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
rexerc3[22]
\end_layout
\end_inset
Write a buffer-swapping output subroutine analogous to (4).
The subroutine,
called
\family typewriter
WORDOUT
\family default
,
should store the word in rA as the next word of output,
and if a buffer is full it should write 100 words onto tape unit
\family typewriter
V
\family default
.
Index register 5 should be used to refer to the current buffer position.
Show the layout of buffer areas and explain what instructions (if any) are necessary at the beginning and end of the program to ensure that the first and last blocks are properly written.
The final block should be filled out with zeros if necessary.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
The following code is not tested.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
WORDOUT STJ 1F
\end_layout
\begin_layout Plain Layout
STA 0,5
\end_layout
\begin_layout Plain Layout
INC5 1
\end_layout
\begin_layout Plain Layout
2H LDA 0,5
\end_layout
\begin_layout Plain Layout
DECA SENTINEL
\end_layout
\begin_layout Plain Layout
1H JAZ *
\end_layout
\begin_layout Plain Layout
OUT -100,5(V)
\end_layout
\begin_layout Plain Layout
LD5 1,5
\end_layout
\begin_layout Plain Layout
JMP 2B
\end_layout
\begin_layout Plain Layout
OUTBUF1 ORIG *+100
\end_layout
\begin_layout Plain Layout
CON SENTINEL
\end_layout
\begin_layout Plain Layout
CON OUTBUF2
\end_layout
\begin_layout Plain Layout
OUTBUF2 ORIG *+100
\end_layout
\begin_layout Plain Layout
CON SENTINEL
\end_layout
\begin_layout Plain Layout
CON OUTBUF1
\end_layout
\end_inset
\end_layout
\begin_layout Standard
At the start of the program,
we would need to
\family typewriter
ENT5 OUTBUF1
\family default
.
At the end,
we have to fill the current block with zeroes and write it
\emph on
unless
\emph default
we are at the beginning of the block so we have already written what we had to,
and then we had to wait for the remaining write to complete.
We can do this with the following code:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
DEC5 OUTBUF1
\end_layout
\begin_layout Plain Layout
J5Z 9H
\end_layout
\begin_layout Plain Layout
DEC5 102
\end_layout
\begin_layout Plain Layout
J5Z 9H
\end_layout
\begin_layout Plain Layout
1H STZ 0,5
\end_layout
\begin_layout Plain Layout
INC5 1
\end_layout
\begin_layout Plain Layout
LDA 0,5
\end_layout
\begin_layout Plain Layout
DECA SENTINEL
\end_layout
\begin_layout Plain Layout
JANZ 1B
\end_layout
\begin_layout Plain Layout
OUT -100,5(U)
\end_layout
\begin_layout Plain Layout
9H JBUS *(5)
\end_layout
\end_inset
\end_layout
\begin_layout Standard
Knuth's version is 2 words shorter and very slightly faster by comparing addresses rather than contents in a couple places.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
exerc4[M20]
\end_layout
\end_inset
Show that if a program refers to a single I/O device,
we might be able to cut the running time in half by buffering the I/O,
in favorable circumstances;
but we can never decrease the running time by more than a factor of two,
with respect to the time taken by unbuffered I/O.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
See the next exercise.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
rexerc5[M21]
\end_layout
\end_inset
Generalize the situation of the preceding exercise to the case when the program refers to
\begin_inset Formula $n$
\end_inset
I/O devices instead of just one.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
Let's assume that reads and writes on devices are so slow that the time taken for the CPU to run the I/O operations is negligible.
Let's also assume that the time it takes for the CPU to complete an iteration of the program is the same time that it takes for each device to read or write a block,
that this time is the same for all devices,
and that each iteration reads or writes a block on each device at the beginning which is only needed by the next iteration,
if at all.
Moreover,
we assume that there are enough iterations so that the time needed for initialization and finalization is negligible.
\end_layout
\begin_layout Standard
Then the unbuffered case takes
\begin_inset Formula $MN(n+1)$
\end_inset
cycles,
where
\begin_inset Formula $M$
\end_inset
is the number of iterations and
\begin_inset Formula $N$
\end_inset
is the number of cycles per iteration,
while the buffered case takes
\begin_inset Formula $MN$
\end_inset
,
so in this optimal case,
the time is divided by
\begin_inset Formula $n+1$
\end_inset
.
\end_layout
\begin_layout Standard
On the other hand,
if we have a general program where the CPU takes
\begin_inset Formula $N_{0}$
\end_inset
cycles and the
\begin_inset Formula $k$
\end_inset
th device takes
\begin_inset Formula $N_{k}$
\end_inset
cycles for
\begin_inset Formula $k=1,\dots,n$
\end_inset
,
then the unbuffered version takes
\begin_inset Formula $N_{0}+N_{1}+\dots+N_{n}$
\end_inset
cycles and the buffered version takes at least
\begin_inset Formula $\max\{N_{0},\dots,N_{n}\}\geq\frac{N_{0}+\dots+N_{n}}{n+1}$
\end_inset
cycles,
so we cannot go lower than this limit.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
rexerc9[21]
\end_layout
\end_inset
A program that leads to the buffer contents shown in
\begin_inset CommandInset ref
LatexCommand formatted
reference "fig:1.4.4"
plural "false"
caps "false"
noprefix "false"
nolink "false"
\end_inset
may be characterized by the following list of times:
\end_layout
\begin_layout Quotation
\begin_inset Formula $A$
\end_inset
,
1000,
\begin_inset Formula $R$
\end_inset
,
1000,
\begin_inset Formula $A$
\end_inset
,
1000,
\begin_inset Formula $R$
\end_inset
,
1000,
\begin_inset Formula $A$
\end_inset
,
1000,
\begin_inset Formula $R$
\end_inset
,
1000,
\begin_inset Formula $A$
\end_inset
,
1000,
\begin_inset Formula $R$
\end_inset
,
1000,
\end_layout
\begin_layout Quotation
\begin_inset Formula $A$
\end_inset
,
1000,
\begin_inset Formula $R$
\end_inset
,
5000,
\begin_inset Formula $A$
\end_inset
,
7000,
\begin_inset Formula $R$
\end_inset
,
5000,
\begin_inset Formula $A$
\end_inset
,
7000,
\begin_inset Formula $R$
\end_inset
,
5000,
\begin_inset Formula $A$
\end_inset
,
7000,
\begin_inset Formula $R$
\end_inset
,
5000,
\end_layout
\begin_layout Quotation
\begin_inset Formula $A$
\end_inset
,
1000,
\begin_inset Formula $R$
\end_inset
,
1000,
\begin_inset Formula $A$
\end_inset
,
2000,
\begin_inset Formula $R$
\end_inset
,
1000.
\end_layout
\begin_layout Quotation
\begin_inset Float figure
placement document
alignment document
wide false
sideways false
status open
\begin_layout Plain Layout
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
begin{center}
\end_layout
\begin_layout Plain Layout
\backslash
begin{tikzpicture}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
sp{(
\backslash
linewidth)}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
us{*1.0/850*
\backslash
sp}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
tmw{75
\backslash
us}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
buff{*1.4}
\end_layout
\begin_layout Plain Layout
\backslash
draw[style=dotted]
\end_layout
\begin_layout Plain Layout
(0,3.6
\backslash
buff)
\end_layout
\begin_layout Plain Layout
node[left,text width=1cm,align=center]{Com
\backslash
-puter}
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
sp},0)
\end_layout
\begin_layout Plain Layout
(0,4.2
\backslash
buff)
\end_layout
\begin_layout Plain Layout
node[left,text width=1cm,align=center]{Output unit}
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
sp},0);
\end_layout
\begin_layout Plain Layout
\backslash
fill[fill=green]
\end_layout
\begin_layout Plain Layout
(0,0) -- (0,3
\backslash
buff) -- ({
\backslash
sp},{3
\backslash
buff}) -- ({
\backslash
sp},0);
\end_layout
\begin_layout Plain Layout
%
\backslash
assignment{buffer}{tm_start}{tm_got}{tm_use}{tm_red}
\end_layout
\begin_layout Plain Layout
% Buffer number,
time of ASSIGN,
time when the buffer is
\end_layout
\begin_layout Plain Layout
% ready for use,
time of RELEASE,
time when output starts
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
assignment#1#2#3#4#5{
\end_layout
\begin_layout Plain Layout
\backslash
fill[fill=yellow]
\end_layout
\begin_layout Plain Layout
({#3
\backslash
us},{#1
\backslash
buff}) -- ({#4
\backslash
us},{#1
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++(0,-1
\backslash
buff) -- ({#3
\backslash
us},{(#1-1)
\backslash
buff});
\end_layout
\begin_layout Plain Layout
\backslash
fill[fill=red]
\end_layout
\begin_layout Plain Layout
({#4
\backslash
us},{#1
\backslash
buff}) -- ({#5
\backslash
us},{#1
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
tmw},{-1/6
\backslash
buff}) -- ++({-
\backslash
tmw},{-1/6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
tmw},{-1/6
\backslash
buff}) -- ++({-
\backslash
tmw},{-1/6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
tmw},{-1/6
\backslash
buff}) -- ++({-
\backslash
tmw},{-1/6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ({#4
\backslash
us},{(#1-1)
\backslash
buff});
\end_layout
\begin_layout Plain Layout
\backslash
draw
\end_layout
\begin_layout Plain Layout
({#2
\backslash
us},{3.5
\backslash
buff}) -- ++(0,{0.2
\backslash
buff}) node[above]{A}
\end_layout
\begin_layout Plain Layout
({#3
\backslash
us},{3.6
\backslash
buff}) -- ({#4
\backslash
us},{3.6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
({#4
\backslash
us},{3.7
\backslash
buff}) -- ++(0,{-0.2
\backslash
buff}) node[below]{R}
\end_layout
\begin_layout Plain Layout
({#5
\backslash
us},{4.1
\backslash
buff}) -- ++(0,{0.2
\backslash
buff}) node[above]{O}
\end_layout
\begin_layout Plain Layout
({#5
\backslash
us},{4.2
\backslash
buff}) -- ++({75
\backslash
us},0);
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{0}{0}{10}{10}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{20}{20}{30}{85}
\end_layout
\begin_layout Plain Layout
\backslash
assignment3{40}{40}{50}{160}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{60}{85}{95}{235}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{105}{160}{230}{310}
\end_layout
\begin_layout Plain Layout
\backslash
assignment3{280}{280}{350}{385}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{400}{400}{470}{470}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{520}{520}{590}{590}
\end_layout
\begin_layout Plain Layout
\backslash
assignment3{640}{640}{650}{665}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{660}{660}{680}{740}
\end_layout
\begin_layout Plain Layout
\backslash
draw
\end_layout
\begin_layout Plain Layout
(0,0) -- (0,3
\backslash
buff) -- ({
\backslash
sp},3
\backslash
buff) -- ({
\backslash
sp},0);
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
bufferlbl#1{
\end_layout
\begin_layout Plain Layout
(0,{(#1-0.5)
\backslash
buff})
\end_layout
\begin_layout Plain Layout
node[left,rotate=90,anchor=south]{Buffer #1}
\end_layout
\begin_layout Plain Layout
(0,{(#1-1)
\backslash
buff}) -- ++({
\backslash
sp},0)
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\backslash
draw
\backslash
bufferlbl1
\backslash
bufferlbl2
\backslash
bufferlbl3;
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
axis#1{({(1#1-1000)
\backslash
us},0) -- ++(0,-0.2) node[below,rotate=90,anchor=east]{#100}}
\end_layout
\begin_layout Plain Layout
\backslash
draw
\backslash
axis{000}
\backslash
axis{050}
\backslash
axis{100}
\backslash
axis{150}
\end_layout
\begin_layout Plain Layout
\backslash
axis{200}
\backslash
axis{250}
\backslash
axis{300}
\backslash
axis{350}
\end_layout
\begin_layout Plain Layout
\backslash
axis{400}
\backslash
axis{450}
\backslash
axis{500}
\backslash
axis{550}
\end_layout
\begin_layout Plain Layout
\backslash
axis{600}
\backslash
axis{650}
\backslash
axis{700}
\backslash
axis{750}
\end_layout
\begin_layout Plain Layout
\backslash
axis{800}
\backslash
axis{850};
\end_layout
\begin_layout Plain Layout
\backslash
end{tikzpicture}
\end_layout
\begin_layout Plain Layout
\backslash
end{center}
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
\begin_inset Caption Standard
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "fig:1.4.4"
\end_inset
Output with two buffers (exercise 9).
\end_layout
\end_inset
\end_layout
\end_inset
\end_layout
\begin_layout Standard
This list means
\begin_inset Quotes eld
\end_inset
assign,
compute for
\begin_inset Formula $\unit[1000]{u}$
\end_inset
,
release,
compute for
\begin_inset Formula $\unit[1000]{u}$
\end_inset
,
assign,
...,
compute for
\begin_inset Formula $\unit[2000]{u}$
\end_inset
,
release,
compute for
\begin_inset Formula $\unit[1000]{u}$
\end_inset
.
\begin_inset Quotes erd
\end_inset
The computation times given do not include any intervals during which the computer might have to wait for the output device to catch up (as at the fourth
\begin_inset Quotes eld
\end_inset
assign
\begin_inset Quotes erd
\end_inset
in
\begin_inset CommandInset ref
LatexCommand formatted
reference "fig:1.4.4"
plural "false"
caps "false"
noprefix "false"
nolink "false"
\end_inset
).
The output device operates at a speed of
\begin_inset Formula $\unit[7500]{u}$
\end_inset
per block.
\end_layout
\begin_layout Standard
The following chart specifies he actions shown in
\begin_inset CommandInset ref
LatexCommand formatted
reference "fig:1.4.4"
plural "false"
caps "false"
noprefix "false"
nolink "false"
\end_inset
as the time passes:
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
nopagebreak
\backslash
hfil
\end_layout
\end_inset
\begin_inset Tabular
|
\begin_inset Text
\begin_layout Plain Layout
Time
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Action
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
0
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF1)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
1000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
2000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF2)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
3000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
4000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF3)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
5000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
6000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN
\family default
(wait)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
8500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
BUF1
\family default
assigned,
\family typewriter
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
9500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
10500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN
\family default
(wait)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
16000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
BUF2
\family default
assigned,
\family typewriter
OUT BUF3
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
23000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
23500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
28000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF3)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
31000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
35000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
\end_inset
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
hfil
\end_layout
\end_inset
\begin_inset Tabular
|
\begin_inset Text
\begin_layout Plain Layout
Time
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Action
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
38500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF3
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
40000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF1)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
46000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
47000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
52000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF2)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
54500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
59000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
64000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF3)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
65000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
66000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF1)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
66500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF3
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
68000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
69000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Computation stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
74000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
81500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\end_layout
\end_inset
|
\end_inset
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
hfil
\end_layout
\end_inset
\end_layout
\begin_layout Standard
The total time required was therefore
\begin_inset Formula $\unit[81500]{u}$
\end_inset
;
the computer was idle from 6000–8500,
10500–16000,
and 69000–81500,
or
\begin_inset Formula $\unit[20500]{u}$
\end_inset
altogether;
the output unit was idle from 0–1000,
46000–47000,
and 54500–59000,
or
\begin_inset Formula $\unit[6500]{u}$
\end_inset
.
\end_layout
\begin_layout Standard
Make a time-action chart like the above for the same program,
assuming that there are only
\emph on
two
\emph default
buffers.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset Float figure
placement document
alignment document
wide false
sideways false
status open
\begin_layout Plain Layout
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
begin{center}
\end_layout
\begin_layout Plain Layout
\backslash
begin{tikzpicture}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
sp{(
\backslash
linewidth)}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
us{*1.0/900*
\backslash
sp}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
tmw{75
\backslash
us}
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
buff{*1.4}
\end_layout
\begin_layout Plain Layout
\backslash
draw[style=dotted]
\end_layout
\begin_layout Plain Layout
(0,2.6
\backslash
buff)
\end_layout
\begin_layout Plain Layout
node[left,text width=1cm,align=center]{Com
\backslash
-puter}
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
sp},0)
\end_layout
\begin_layout Plain Layout
(0,3.2
\backslash
buff)
\end_layout
\begin_layout Plain Layout
node[left,text width=1cm,align=center]{Output unit}
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
sp},0);
\end_layout
\begin_layout Plain Layout
\backslash
fill[fill=green]
\end_layout
\begin_layout Plain Layout
(0,0) -- (0,2
\backslash
buff) -- ({
\backslash
sp},{2
\backslash
buff}) -- ({
\backslash
sp},0);
\end_layout
\begin_layout Plain Layout
%
\backslash
assignment{buffer}{tm_start}{tm_got}{tm_use}{tm_red}
\end_layout
\begin_layout Plain Layout
% Buffer number,
time of ASSIGN,
time when the buffer is
\end_layout
\begin_layout Plain Layout
% ready for use,
time of RELEASE,
time when output starts
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
assignment#1#2#3#4#5{
\end_layout
\begin_layout Plain Layout
\backslash
fill[fill=yellow]
\end_layout
\begin_layout Plain Layout
({#3
\backslash
us},{#1
\backslash
buff}) -- ({#4
\backslash
us},{#1
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++(0,-1
\backslash
buff) -- ({#3
\backslash
us},{(#1-1)
\backslash
buff});
\end_layout
\begin_layout Plain Layout
\backslash
fill[fill=red]
\end_layout
\begin_layout Plain Layout
({#4
\backslash
us},{#1
\backslash
buff}) -- ({#5
\backslash
us},{#1
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
tmw},{-1/6
\backslash
buff}) -- ++({-
\backslash
tmw},{-1/6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
tmw},{-1/6
\backslash
buff}) -- ++({-
\backslash
tmw},{-1/6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ++({
\backslash
tmw},{-1/6
\backslash
buff}) -- ++({-
\backslash
tmw},{-1/6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
-- ({#4
\backslash
us},{(#1-1)
\backslash
buff});
\end_layout
\begin_layout Plain Layout
\backslash
draw
\end_layout
\begin_layout Plain Layout
({#2
\backslash
us},{2.5
\backslash
buff}) -- ++(0,{0.2
\backslash
buff}) node[above]{A}
\end_layout
\begin_layout Plain Layout
({#3
\backslash
us},{2.6
\backslash
buff}) -- ({#4
\backslash
us},{2.6
\backslash
buff})
\end_layout
\begin_layout Plain Layout
({#4
\backslash
us},{2.7
\backslash
buff}) -- ++(0,{-0.2
\backslash
buff}) node[below]{R}
\end_layout
\begin_layout Plain Layout
({#5
\backslash
us},{3.1
\backslash
buff}) -- ++(0,{0.2
\backslash
buff}) node[above]{O}
\end_layout
\begin_layout Plain Layout
({#5
\backslash
us},{3.2
\backslash
buff}) -- ++({75
\backslash
us},0);
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{0}{0}{10}{10}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{20}{20}{30}{85}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{40}{85}{95}{160}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{105}{160}{170}{235}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{180}{235}{305}{310}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{355}{355}{425}{425}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{475}{475}{545}{545}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{595}{595}{665}{665}
\end_layout
\begin_layout Plain Layout
\backslash
assignment1{715}{715}{725}{740}
\end_layout
\begin_layout Plain Layout
\backslash
assignment2{735}{740}{760}{815}
\end_layout
\begin_layout Plain Layout
\backslash
draw
\end_layout
\begin_layout Plain Layout
(0,0) -- (0,2
\backslash
buff) -- ({
\backslash
sp},2
\backslash
buff) -- ({
\backslash
sp},0);
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
bufferlbl#1{
\end_layout
\begin_layout Plain Layout
(0,{(#1-0.5)
\backslash
buff})
\end_layout
\begin_layout Plain Layout
node[left,rotate=90,anchor=south]{Buffer #1}
\end_layout
\begin_layout Plain Layout
(0,{(#1-1)
\backslash
buff}) -- ++({
\backslash
sp},0)
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\backslash
draw
\backslash
bufferlbl1
\backslash
bufferlbl2;
\end_layout
\begin_layout Plain Layout
\backslash
def
\backslash
axis#1{({(1#1-1000)
\backslash
us},0) -- ++(0,-0.2) node[below,rotate=90,anchor=east]{#100}}
\end_layout
\begin_layout Plain Layout
\backslash
draw
\backslash
axis{000}
\backslash
axis{050}
\backslash
axis{100}
\backslash
axis{150}
\end_layout
\begin_layout Plain Layout
\backslash
axis{200}
\backslash
axis{250}
\backslash
axis{300}
\backslash
axis{350}
\end_layout
\begin_layout Plain Layout
\backslash
axis{400}
\backslash
axis{450}
\backslash
axis{500}
\backslash
axis{550}
\end_layout
\begin_layout Plain Layout
\backslash
axis{600}
\backslash
axis{650}
\backslash
axis{700}
\backslash
axis{750}
\end_layout
\begin_layout Plain Layout
\backslash
axis{800}
\backslash
axis{850}
\backslash
axis{900};
\end_layout
\begin_layout Plain Layout
\backslash
end{tikzpicture}
\end_layout
\begin_layout Plain Layout
\backslash
end{center}
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
\begin_inset Caption Standard
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "fig:1.4.4-1"
\end_inset
Output with three buffers (see exercise 9).
\end_layout
\end_inset
\end_layout
\end_inset
\end_layout
\begin_layout Standard
We can do this graphically as shown in
\begin_inset CommandInset ref
LatexCommand formatted
reference "fig:1.4.4-1"
plural "false"
caps "false"
noprefix "false"
nolink "false"
\end_inset
,
giving us the following chart:
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
nopagebreak
\backslash
hfil
\end_layout
\end_inset
\begin_inset Tabular
|
\begin_inset Text
\begin_layout Plain Layout
Time
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Action
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
0
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF1)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
1000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
2000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF2)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
3000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
4000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN
\family default
(wait)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
8500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
BUF1
\family default
assigned,
\family typewriter
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
9500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
10500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN
\family default
(wait)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
16000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
BUF2
\family default
assigned,
\family typewriter
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
17000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
18000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN
\family default
(wait)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
23500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
BUF1
\family default
assigned,
\family typewriter
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
30500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
31000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
35500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF2)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
38500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
\end_inset
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
hfil
\end_layout
\end_inset
\begin_inset Tabular
|
\begin_inset Text
\begin_layout Plain Layout
Time
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Action
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
42500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
47500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF1)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
50000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
54500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
59500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF2)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
62000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
65500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE,
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
71500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN(BUF1)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
72500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
73500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
ASSIGN
\family default
(wait)
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
74000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
BUF2
\family default
assigned,
\family typewriter
OUT BUF1
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
76000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
RELEASE
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
77000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Computation stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
81500
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\family typewriter
OUT BUF2
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
89000
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
Output stops.
\end_layout
\end_inset
|
|
\begin_inset Text
\begin_layout Plain Layout
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Plain Layout
\end_layout
\end_inset
|
\end_inset
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
hfil
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
rexerc14[20]
\end_layout
\end_inset
Suppose the computational program does not alternate between
\family typewriter
ASSIGN
\family default
and
\family typewriter
RELEASE
\family default
,
but instead gives the sequence of actions
\family typewriter
...ASSIGN...ASSIGN...RELEASE...RELEASE
\family default
.
What effect does this have on the algorithms described in the text?
Is it possibly useful?
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
It just means we would need at least two buffers or the program would stall.
It might be useful if the algorithm needs more data at a time than what fits in one buffer,
so that it doesn't have to copy the data elsewhere.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
rexerc15[22]
\end_layout
\end_inset
Write a complete
\family typewriter
MIX
\family default
program that copies 100 blocks from tape unit 0 to tape unit 1,
using just three buffers.
The program should be as fast as possible.
\end_layout
\begin_layout Standard
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
answer
\end_layout
\end_inset
The following programs have not been tested.
We need to use the buffers in a circle,
checking input and output in a loop to see if the devices are ready and if we can move to the next buffer.
The following program in pseudo-C might be illustrative:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
void aread(char *buf),
awrite(char *buf);
// IN,
OUT
\end_layout
\begin_layout Plain Layout
bool done_read(),
done_write();
// JBUS/JRED
\end_layout
\begin_layout Plain Layout
char buf[3][100];
\end_layout
\begin_layout Plain Layout
char *cin = buf[0],
*cout = buf[0],
*next(char *buf);
\end_layout
\begin_layout Plain Layout
int n = 100;
// Remaining blocks to input
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
aread(cin);
\end_layout
\begin_layout Plain Layout
while (1) {
\end_layout
\begin_layout Plain Layout
if (done_read() && next(cin) != cout) {
\end_layout
\begin_layout Plain Layout
if (--n == 0)
\end_layout
\begin_layout Plain Layout
break;
\end_layout
\begin_layout Plain Layout
cin = next(cin);
\end_layout
\begin_layout Plain Layout
aread(cin);
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
if (done_write() && next(cout) != cin) {
\end_layout
\begin_layout Plain Layout
cout = next(cout);
\end_layout
\begin_layout Plain Layout
awrite(cout);
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
do // Output remaining blocks
\end_layout
\begin_layout Plain Layout
awrite(cout = next(cout));
\end_layout
\begin_layout Plain Layout
while (cout != cin);
\end_layout
\end_inset
\end_layout
\begin_layout Standard
We may translate this as follows:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
IN BUF1(0)
\end_layout
\begin_layout Plain Layout
ENTA 100
\end_layout
\begin_layout Plain Layout
ENT1 BUF1 ;
cin
\end_layout
\begin_layout Plain Layout
ENT2 BUF1 ;
cout
\end_layout
\begin_layout Plain Layout
READ JBUS WRITE(0)
\end_layout
\begin_layout Plain Layout
CMP2 100,1
\end_layout
\begin_layout Plain Layout
JEQ WRITE
\end_layout
\begin_layout Plain Layout
DECA 1
\end_layout
\begin_layout Plain Layout
JAZ EOUT
\end_layout
\begin_layout Plain Layout
LD1 100,1
\end_layout
\begin_layout Plain Layout
IN 0,1(0)
\end_layout
\begin_layout Plain Layout
WRITE JBUS READ(1)
\end_layout
\begin_layout Plain Layout
CMP1 100,2
\end_layout
\begin_layout Plain Layout
JEQ READ
\end_layout
\begin_layout Plain Layout
LD2 100,2
\end_layout
\begin_layout Plain Layout
OUT 0,2(1)
\end_layout
\begin_layout Plain Layout
JMP READ
\end_layout
\begin_layout Plain Layout
EOUT LD2 100,2
\end_layout
\begin_layout Plain Layout
CMP2 100,1
\end_layout
\begin_layout Plain Layout
JAZ END
\end_layout
\begin_layout Plain Layout
OUT 0,2(1)
\end_layout
\begin_layout Plain Layout
JMP EOUT
\end_layout
\begin_layout Plain Layout
END HLT
\end_layout
\begin_layout Plain Layout
BUF1 ORIG *+100
\end_layout
\begin_layout Plain Layout
CON BUF2
\end_layout
\begin_layout Plain Layout
BUF2 ORIG *+100
\end_layout
\begin_layout Plain Layout
CON BUF3
\end_layout
\begin_layout Plain Layout
BUF3 ORIG *+100
\end_layout
\begin_layout Plain Layout
CON BUF1
\end_layout
\end_inset
\end_layout
\begin_layout Standard
Now,
the behavior of this program is always the same:
first the input advances,
then the output advances,
and so on,
so we might do better (and with a lower chance of bugs) just by coding it manually and using the blocking properties of
\family typewriter
IN
\family default
and
\family typewriter
OUT
\family default
with respect to other operations in the same device:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
IN BUF1(0)
\end_layout
\begin_layout Plain Layout
LOOP ENTA 33
\end_layout
\begin_layout Plain Layout
IN BUF2(0)
\end_layout
\begin_layout Plain Layout
OUT BUF1(1)
\end_layout
\begin_layout Plain Layout
IN BUF3(0)
\end_layout
\begin_layout Plain Layout
OUT BUF2(1)
\end_layout
\begin_layout Plain Layout
IN BUF1(0)
\end_layout
\begin_layout Plain Layout
OUT BUF3(1)
\end_layout
\begin_layout Plain Layout
DECA 1
\end_layout
\begin_layout Plain Layout
JANZ LOOP
\end_layout
\begin_layout Plain Layout
JBUS *(0)
\end_layout
\begin_layout Plain Layout
OUT BUF1(1)
\end_layout
\begin_layout Plain Layout
JBUS *(1)
\end_layout
\begin_layout Plain Layout
HLT
\end_layout
\begin_layout Plain Layout
BUF1 ORIG *+100
\end_layout
\begin_layout Plain Layout
BUF2 ORIG *+100
\end_layout
\begin_layout Plain Layout
BUF3 ORIG *+100
\end_layout
\end_inset
\end_layout
\end_body
\end_document