Title: Overview
 1Overview
-  Projects 
 -  The Assembly Process 
 -  Programmed I/O 
 -  Interrupt Driven I/O 
 -  
 
  2LC-3 Assembly Language
Syntax
LABEL OPCODE OPERANDS COMMENTS
optional
mandatory
Symbol Table
Symbol Address Start x3000 Test 
 x3005 Next x300A 
Number x3010 String x3011 
 3An Assembly Language Program
-  
 -  Program to multiply a number by the constant 6 
 -  
 -  .ORIG x3050 
 -  LD R1, SIX 
 -  LD R2, NUMBER 
 -  AND R3, R3, 0  Clear R3. It will 
 -   contain the product. 
 -  The inner loop 
 -  
 - AGAIN ADD R3, R3, R2 
 -  ADD R1, R1, -1  R1 keeps track of 
 -  BRp AGAIN  the iteration. 
 -  
 -  HALT 
 -  
 - NUMBER .BLKW 1 
 - SIX .FILL x0006 
 -  
 
Symbol Table Symbol Address  
 AGAIN x3053 
NUMBER x3057 
 SIX x3058 
 4Count the occurrences of a character in a file (1 
0f 2).
-  
 -  Program to count occurrences of a character in 
a file.  -  Character to be input from the keyboard. 
 -  Result to be displayed on the monitor. 
 -  Program only works if no more than 9 
occurrences are found.  -  
 -  
 -  Initialization 
 -  
 -  .ORIG x3000 
 -  AND R2, R2, 0  R2 is counter, initially 0 
 -  LD R3, PTR  R3 is pointer to character file 
 -  GETC  R0 gets input character 
 -  LDR R1, R3, 0  R1 gets first character from 
file  -  
 -  Test character for end of file 
 -  
 - TEST ADD R4, R1, -4  Test for EOT (ASCII x04) 
 -  BRz OUTPUT  If done, prepare the output 
 
  5Count the occurrences of a character in a file (2 
of 2).
-  
 -  Output the count. 
 -  
 - OUTPUT LD R0, ASCII  Load the ASCII template 
 -  ADD R0, R0, R2  Covert binary count to ASCII 
 -  OUT  ASCII code in R0 is displayed. 
 -  HALT  Halt machine 
 -  
 -  Storage for pointer and ASCII template 
 -  
 - ASCII .FILL x0030  ASCII offset 
 - PTR .FILL x4000  PTR to character file 
 -  .END 
 
  6One Pass vs Two Pass Assemblers
- Two Pass  Checks for syntax errors and builds 
the Symbol Table during first pass, resolves 
operand addresses during second pass.  - One Pass  Checks for syntax errors, builds the 
Symbol Table, and resolves operand addresses 
during the first pass. So why have a two pass? 
  7More than One Object (Load) File
- Symbol Table 
 - Symbols Externals Exports Addresses 
 -  Start 
 x3000  -  Number 
 x300A  -  Data ? 
 -  Value ? 
 
-  The Linker/Loader would generate another 
global table to resolve  -  Externals  Exports at Load time
 
  8Input / Output
Memory Mapped I/O  A section of the memory 
address space is reserved for I/O Registers 
rather than general memory locations. Think of 
it as pseudo memory. The same instructions are 
used for general programming and I/O 
programming. Non-Memory Mapped I/O  There is a 
separate address space for I/O programming, and 
an entirely separate set of I/O Instructions. 
 9LC-3 has Memory Mapped I/O
LC-3 Memory Layout x0000  x00FF Trap 
vectors x0100  x2FFF System Programs  
Data x3000  xFDFF User Programs 
Area xFE00  xFFFF I/O Programming 
Registers 
 10Synchronous vs Asynchronous I/O
Synchronous  data could be expected to be 
available when the program wanted it  like data 
in memory. This is not realistic for I/O 
 Asynchronous  computer is generally much 
faster than I/O so program must wait until data 
is available or data has been taken. 
Handshaking is used to ensure that data is 
available or I/O device is ready 
 11Polling vs Interrrupt Driven I/O
Polling  program checks handshaking signals to 
find when data is available of device is done 
(typically a loop in the program) Interrupt  
program initiates I/O and waits until data is 
available (typically goes to sleep until the 
operating system wakes the program up) 
 12Keyboard I/O
KBDR Assigned to xFE02 Data is in 
KBDR70 Read only Register KBSR 
Assigned to xFE00 Status is in 
KBSR15 Set to 1 when new 
data is ready Cleared when 
data is read 
 13Simple Input from Keyboard
START LDI R1, A  Test for 
 BRzp 
START  character input LDI 
 R0, B BRnzp NEXT_TASK  
Go to the next task A .FILL xFE00 
  Address of KBSR B .FILL 
xFE02  Address of KBDR 
 14Monitor I/O
DDR Assigned to xFE06 Data is 
in DDR70 DSR Assigned to xFE04 
 Status is in DSR15 Set 
to 1 when data is picked up 
Cleared when new data is written 
 15Simple Ouput to Monitor
START LDI R1, A  Test to see 
if BRzp START  output 
register is ready STI R0, 
B BRnzp NEXT_TASK A 
.FILL xFE04  Address of DSR B 
 .FILL xFE06  Address of DDR 
 16Echo from Keyboard to Monitor
START LDI R1, KBSR  Test for 
character input BRzp 
START LDI R0, 
KBDR ECHO LDI R1, DSR 
  Test output register ready BRzp 
 ECHO STI R0, 
DDR BRnzp NEXT_TASK 
 KBSR .FILL xFE00  
Address of KBSR KBDR .FILL xFE02 
  Address of KBDR DSR 
.FILL xFE04  Address of DSR 
 DDR .FILL xFE06  Address 
of DDR 
 17The I/O Routine for the LC-3 Keyboard
START ST R1,SaveR1  Save registers 
needed ST R2,SaveR2  by this 
routine ST R3,SaveR3  LD 
 R2,Newline L1 LDI R3,DSR BRzp 
 L1  Loop until Monitor is ready 
 STI R2,DDR  Move cursor to new clean 
line  LEA R1,Prompt  Starting 
address of prompt string Loop LDR R0,R1,0 
  Write the input prompt BRz Input 
  End of prompt string L2 LDI 
R3,DSR BRzp L2  Loop until 
Monitor is ready STI R0,DDR  
Write next prompt character ADD 
R1,R1,1  Increment Prompt pointer 
BRnzp Loop  Get next prompt 
character  Input LDI R3,KBSR BRzp 
 Input  Poll until a character is typed 
 LDI R0,KBDR  Load input character 
into R0 L3 LDI R3,DSR BRzp L3 
  Loop until Monitor is ready 
STI R0,DDR  Echo input character  L4 
 LDI R3,DSR BRzp L4  
Loop until Monitor is ready STI 
R2,DDR  Move cursor to new clean line 
 LD R1,SaveR1  Restore registers 
LD R2,SaveR2  to original values 
LD R3,SaveR3 BRnzp NEXT_TASK  
Do the program's next task  
 18The I/O Routine for the LC-3 Keyboard (2)
SaveR1 .BKLW 1  Memory for 
registers saved SaveR2 .BKLW 1 SaveR3 .BKLW 
1 DSR .FILL xFE04 DDR .FILL 
xFE06 KBSR .FILL xFE00 KBDR .FILL 
xFE02 Newline .FILL x000A  ASCII code 
for newline Prompt .STRINGZ "Input a 
charactergt" 
 19Keyboard I/O
KBDR Assigned to xFE02 Data is in 
KBDR70 Read only Register KBSR 
Assigned to xFE00 Status is in 
KBSR15 Set to 1 when new 
data is ready Cleared when 
data is read Interrupt Request is 
in KBSR14 
 20Monitor I/O
DDR Assigned to xFE06 Data is 
in DDR70 DSR Assigned to xFE04 
 Status is in DSR15 Set 
to 1 when data is picked up 
Cleared when new data is written 
Interrupt Request is in DRS14