Hello, dear friend, you can consult us at any time if you have any questions, add WeChat: THEend8_
ECED 3403 – Computer Architecture
Assignment 2: Designing, implementing, and testing of an
XM3 loader and debugger for XM3’s memory
1 Objective
Before we can design and implement the XM3 ISA emulator, it is necessary to have memory for
the machine, a way of getting programs into the memory, and a way of checking the contents
of memory.
In this assignment, we are to design, implement, and test the loader and debugger on the
emulated memory.
2 Memory
XM3 has 64 KiB of memory. This is to be emulated using an array.
2.1 The Bus
XM3’s 64 KiB of memory will be accessed through a bus() function that implements the memory
address decoder. The entry point has four arguments:
void bus(unsigned short mar, unsigned short *mbr, enum ACTION rw, enum SIZE bw)
The function’s parameters are:
mar: The memory address being accessed. The address refers to a byte location (it can be an
odd or even address). The parameter bw indicates whether the memory location accessed is
either a byte or a word. A word address is mar >> 1.
mbr: The bidirectional memory buffer. The mbr is a pointer and refers to the address of the
data being written to the specified memory location (i.e., the pointer is to be used as an
rvalue) or the address of the variable to be assigned the contents of the specified (i.e., the
pointer is to be used as an lvalue). The parameter rw indicates whether the mbr is to be
used for reading or writing.
rw: The read-write indicator. Action should be either READ or WRITE.
bw: The byte-word indicator. The size should be either BYTE or WORD.
3 The Loader
The loader is to read a file containing S-Records. If the loader detects an invalid record, it is to
issue one of these warnings:
• Missing file
• File does not contain S-records
• Incorrect checksum.
If an error other than the above is detected, the warning should be “Warning, unknown error”.
ECED 3403: Assignment 2 2
The loader is to write to memory using the bus() function.
3.1 The S-Record
The XM3 assembler support three different S-Record types; the format and contents of each
are:
S0: The source file name.
S1: The data values or instructions, or both to be stored in contiguous memory locations.
S9: The initial entry point (i.e., the starting address).
Each record is prefixed with a header (Sx), its length (one-byte), a two-byte address (0000 to
FFFF), the contents of the record (from 0 to 62 hex characters, with two characters
representing one byte), and a one-byte checksum.
A complete description of the S-Record format can be found here.
3.2 Command line
The loader’s command line is to have an optional command-line argument for use when
running in the VM or a command-line interpreter.1 The format is:
myxm3 -d fname.dbg
where:
fname.dbg: If the command line contains ‘-d’, a file containing a list of test commands to be
executed (i.e., a script file) is supplied. For this assignment, the commands are ‘L’, ‘D’, and
‘X’. Invalid commands can be included as well to test your debugger.
When your debugger prompts for input, rather than reading a character from the user’s
keyboard, the program is to read from fname.dbg. The character read by the input function
should be returned and processed like any other command.
4 The Debugger
The debugger is to allow the user to interact with the XM3 emulator; at this point, the emulator
is only memory and the bus() function. In this assignment, it is to be an interactive tool that
supports three commands (the commands can be in upper or lower case):
L : Load the specified file. Only files containing S-Records are accepted. The loader
function to be used is described above.
D : Dump memory from memory address start to address stop. The addresses
refer to a byte location and are hex values (i.e., 0 to FFFF). The format of the output should
be the address (4 hex characters), the contents of 16 memory locations starting at the
specified address (shown as bytes), and the 16 memory locations displayed as ASCII
characters.
1 To run the Windows’ command-line interpreter, type +’R’. At the prompt, type “cmd”.
ECED 3403: Assignment 2 3
X: Exit (terminate) the emulator.
The debugger is to access memory using the bus() function.
An example of the debugger follows.
5 Example
As an example of the debugger, the loader, and memory, consider the following XM3 assembly
file named A2.asm:
;
; Example of S-Record output
; A simple looping program (expensive way to add 8 to a register)
; ECED 3403
; 23 May 2020
;
org #80 ; Data section
Data word #0
;
org #1000 ; Code section
Start movlz Data,R0 ; R0 <- address of Data (#0080)
ld R0,R1 ; R1 <- mem[R0]
;
Loop cmp #8,R1 ; Check R0 = 8
cex ne,#2,#0 ; Do 2 instructions if NE; skip 2 if EQ
;
add #1,R1 ; R1 <- R1 + 1
bra Loop ; Repeat
;
st R1,R0 ; mem[R0] <- R1
Done ; Use as breakpoint
;
end Start ; S9 record get address of Start (#1000)
when run through the assembler, two files are produced, A2.lis and A2.xme.
The listing file, A2.lis, lists each record; for those records that produce data or instructions for
the machine, the address and value of the data or instruction are listed. For example:
ECED 3403: Assignment 2 4
X-Makina Assembler - Version 3.01 (23 May 2020)
Input file name: A2.asm
Time of assembly: Sat 23 May 2020 12:12:23
1 ;
2 ; Example of S-Record output
3 ; A simple looping program (expensive way to add 8 to a register)
4 ; ECED 3403
5 ; 23 May 2020
6 ;
7 org #80 ; Data section
8 0080 0000 Data word #0
9 ;
10 org #1000 ; Code section
11 1000 6C00 Start movlz Data,R0 ; R0 <- address of Data (#0080)
12 1002 5801 ld R0,R1 ; R1 <- mem[R0]
13 ;
14 1004 45A1 Loop cmp #8,R1 ; Check R0 = 8
15 1006 2450 cex ne,#2,#0 ; Do 2 instructions if NE; skip 2 if EQ
16 ;
17 1008 4089 add #1,R1 ; R1 <- R1 + 1
18 100A 23FC bra Loop ; Repeat
19 ;
20 100C 5C08 st R1,R0 ; mem[R0] <- R1
21 Done ; Use as breakpoint
22 ;
23 end Start ; S9 record get address of Start (#1000)
Successful completion of assembly
Symbol table
Name Type Value Decimal
Done LBL 100E 4110
Loop LBL 1004 4100
Start LBL 1000 4096
Data LBL 0080 128
R7 REG 0007 7
R6 REG 0006 6
R5 REG 0005 5
R4 REG 0004 4
R3 REG 0003 3
R2 REG 0002 2
R1 REG 0001 1
R0 REG 0000 0
.XME file: C:\Users\larry\OneDrive\Courses\ECED 3403 - 2020\XM3\XM3 - Test files\Test files 4\A2.xme
The load module or executable file, A2.xme, contains the data, instructions, and directives for
the loader in S-Records:
S009000041322E61736D14
S105008000007A
S1111000006C0158A14550248940FC23085C73
S9031000EC
ECED 3403: Assignment 2 5
The starting address of the second S1 record is 1000; this is followed by the first two content
bytes which contain the values 00 and 6C and are to be stored in locations 1000 (00) and 1001
(6C). However, if we look at the assembler output for location 1000 we see:
11 1000 6C00 Start movlz Data,R0 ; R0 <- address of Data (#0080)
This appears to suggest that 1000 should contain 6C and 1001, 00. This is an example of little-
endian format. The value 6C00 has an MSbyte of 6C and an LSbyte of 00. In little-endian, 00 is
stored in the low-order memory (1000), while 6C is in the high-order memory (1001). This
means that the S1 record reflects the correct byte ordering for a little-endian machine.
The S0 record contains the name of the file (41322E61736D or A2.asm), the two S1 records
contain directives to the loader instructing it where to store the data or instructions; and the S9
record indicating where the program is to start execution (location 1000).
An example of what your emulator (containing the debugger, loader, and memory) should
appear as is:
A prompt (“Option” in this example) indicates that the emulator is ready for input. The user
types ‘l’ and is then asked for the filename; “a2.xme” is entered. The emulator responds with
the name of the file (from the XME file) and the starting address:
Source filename: A2.asm
File read - no errors detected. Starting address: 1000
The user then requests to see the data section (in memory location #80) and the emulator
shows 16-bytes in hex (00) and the ASCII contents (unprintable characters are shown as ‘.’):
Option: m 80 82
Enter lower and upper bound
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
ECED 3403: Assignment 2 6
Then the code section is dumped, starting at #1000 for 32 locations (there is one space
between the last memory location displayed in hex and the first memory location displayed as a
character:
Option: m 1000 1020
Enter lower and upper bound
1000: 00 6c 01 58 a1 45 50 24 89 40 fc 23 08 5c 00 00 .l.X.EP$.@.#.\..
1010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
The output shows the contents of memory after the load; for example, 1000 (00), 1001 (6c),
and 1002 (01). These values are taken from the second S1 record which contained 006C01 in
the first three bytes of content.
The byte values (not the instructions) are listed to the right. If the value happens to have a
printable value, its ASCII equivalent is shown, otherwise it appears as a ‘.’.
The prompt is shown again, allowing the user to enter one of the supported commands; for
example, X:
Option: X
6 Marking
The assignment will be graded out of 20 using the following marking scheme:
Design Document
The design document is to include an introduction as to the purpose of your software (i.e., your
understanding of the problem, essentially an elevator pitch), a description of the algorithms
(using tools such as state diagrams or structured-English), and a description of the major data
structures required to solve the problem (in a data dictionary).