annotate docs/lyx/asm.lyx @ 42:792da050d8c4 tip

more dox
author james <jb302@eecs.qmul.ac.uk>
date Tue, 22 Apr 2014 14:25:14 +0100
parents a9bf262f557b
children
rev   line source
jb302@37 1 #LyX 2.0 created this file. For more info see http://www.lyx.org/
jb302@37 2 \lyxformat 413
jb302@37 3 \begin_document
jb302@37 4 \begin_header
jb302@37 5 \textclass article
jb302@37 6 \use_default_options true
jb302@37 7 \maintain_unincluded_children false
jb302@37 8 \language english
jb302@37 9 \language_package default
jb302@37 10 \inputencoding auto
jb302@37 11 \fontencoding global
jb302@37 12 \font_roman default
jb302@37 13 \font_sans default
jb302@37 14 \font_typewriter default
jb302@37 15 \font_default_family default
jb302@37 16 \use_non_tex_fonts false
jb302@37 17 \font_sc false
jb302@37 18 \font_osf false
jb302@37 19 \font_sf_scale 100
jb302@37 20 \font_tt_scale 100
jb302@37 21
jb302@37 22 \graphics default
jb302@37 23 \default_output_format default
jb302@37 24 \output_sync 0
jb302@37 25 \bibtex_command default
jb302@37 26 \index_command default
jb302@37 27 \paperfontsize default
jb302@37 28 \use_hyperref false
jb302@37 29 \papersize default
jb302@37 30 \use_geometry false
jb302@37 31 \use_amsmath 1
jb302@37 32 \use_esint 1
jb302@37 33 \use_mhchem 1
jb302@37 34 \use_mathdots 1
jb302@37 35 \cite_engine basic
jb302@37 36 \use_bibtopic false
jb302@37 37 \use_indices false
jb302@37 38 \paperorientation portrait
jb302@37 39 \suppress_date false
jb302@37 40 \use_refstyle 1
jb302@37 41 \index Index
jb302@37 42 \shortcut idx
jb302@37 43 \color #008000
jb302@37 44 \end_index
jb302@37 45 \secnumdepth 3
jb302@37 46 \tocdepth 3
jb302@37 47 \paragraph_separation indent
jb302@37 48 \paragraph_indentation default
jb302@37 49 \quotes_language english
jb302@37 50 \papercolumns 1
jb302@37 51 \papersides 1
jb302@37 52 \paperpagestyle default
jb302@37 53 \tracking_changes false
jb302@37 54 \output_changes false
jb302@37 55 \html_math_output 0
jb302@37 56 \html_css_as_file 0
jb302@37 57 \html_be_strict false
jb302@37 58 \end_header
jb302@37 59
jb302@37 60 \begin_body
jb302@37 61
jb302@37 62 \begin_layout Part
jb302@37 63 The Assembler
jb302@37 64 \end_layout
jb302@37 65
jb302@37 66 \begin_layout Section
jb302@37 67 Assembler Design
jb302@37 68 \end_layout
jb302@37 69
jb302@39 70 \begin_layout Standard
jb302@39 71 The assembler will take assembly source code as input and produce two output
jb302@42 72 files: a binary executable and a debug file.
jb302@39 73 \end_layout
jb302@39 74
jb302@39 75 \begin_layout Standard
jb302@39 76 \begin_inset ERT
jb302@39 77 status open
jb302@39 78
jb302@39 79 \begin_layout Plain Layout
jb302@39 80
jb302@39 81
jb302@39 82 \backslash
jb302@39 83 bigskip
jb302@39 84 \end_layout
jb302@39 85
jb302@39 86 \end_inset
jb302@39 87
jb302@39 88
jb302@39 89 \end_layout
jb302@39 90
jb302@39 91 \begin_layout Standard
jb302@39 92 \begin_inset Graphics
jb302@39 93 filename /home/jmz/qm/ede/docs/img/asm/assembler.svg
jb302@39 94 display false
jb302@39 95
jb302@39 96 \end_inset
jb302@39 97
jb302@39 98
jb302@39 99 \end_layout
jb302@39 100
jb302@39 101 \begin_layout Standard
jb302@39 102 \begin_inset ERT
jb302@39 103 status open
jb302@39 104
jb302@39 105 \begin_layout Plain Layout
jb302@39 106
jb302@39 107
jb302@39 108 \backslash
jb302@39 109 bigskip
jb302@39 110 \end_layout
jb302@39 111
jb302@39 112 \end_inset
jb302@39 113
jb302@39 114
jb302@39 115 \end_layout
jb302@39 116
jb302@39 117 \begin_layout Standard
jb302@39 118 The binary executable will be a simple raw binary file in big-endian format.
jb302@39 119 The debug file will be a tabulated text file with the following format:
jb302@39 120 \end_layout
jb302@39 121
jb302@39 122 \begin_layout Standard
jb302@39 123 \begin_inset ERT
jb302@39 124 status open
jb302@39 125
jb302@39 126 \begin_layout Plain Layout
jb302@39 127
jb302@39 128
jb302@39 129 \backslash
jb302@39 130 bigskip
jb302@39 131 \end_layout
jb302@39 132
jb302@39 133 \end_inset
jb302@39 134
jb302@39 135
jb302@39 136 \end_layout
jb302@39 137
jb302@39 138 \begin_layout Standard
jb302@39 139 \begin_inset Tabular
jb302@39 140 <lyxtabular version="3" rows="1" columns="5">
jb302@39 141 <features tabularvalignment="middle">
jb302@39 142 <column alignment="center" valignment="top" width="0">
jb302@39 143 <column alignment="center" valignment="top" width="0">
jb302@39 144 <column alignment="center" valignment="top" width="0">
jb302@39 145 <column alignment="center" valignment="top" width="0">
jb302@39 146 <column alignment="center" valignment="top" width="0">
jb302@39 147 <row>
jb302@39 148 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
jb302@39 149 \begin_inset Text
jb302@39 150
jb302@39 151 \begin_layout Plain Layout
jb302@39 152 PC
jb302@39 153 \end_layout
jb302@39 154
jb302@39 155 \end_inset
jb302@39 156 </cell>
jb302@39 157 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
jb302@39 158 \begin_inset Text
jb302@39 159
jb302@39 160 \begin_layout Plain Layout
jb302@39 161 OPCODE
jb302@39 162 \end_layout
jb302@39 163
jb302@39 164 \end_inset
jb302@39 165 </cell>
jb302@39 166 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
jb302@39 167 \begin_inset Text
jb302@39 168
jb302@39 169 \begin_layout Plain Layout
jb302@39 170 DATA
jb302@39 171 \end_layout
jb302@39 172
jb302@39 173 \end_inset
jb302@39 174 </cell>
jb302@39 175 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
jb302@39 176 \begin_inset Text
jb302@39 177
jb302@39 178 \begin_layout Plain Layout
jb302@39 179 MNEMONIC
jb302@39 180 \end_layout
jb302@39 181
jb302@39 182 \end_inset
jb302@39 183 </cell>
jb302@39 184 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
jb302@39 185 \begin_inset Text
jb302@39 186
jb302@39 187 \begin_layout Plain Layout
jb302@39 188 ARGUMENTS
jb302@39 189 \end_layout
jb302@39 190
jb302@39 191 \end_inset
jb302@39 192 </cell>
jb302@39 193 </row>
jb302@39 194 </lyxtabular>
jb302@39 195
jb302@39 196 \end_inset
jb302@39 197
jb302@39 198
jb302@39 199 \end_layout
jb302@39 200
jb302@39 201 \begin_layout Standard
jb302@39 202 \begin_inset ERT
jb302@39 203 status open
jb302@39 204
jb302@39 205 \begin_layout Plain Layout
jb302@39 206
jb302@39 207
jb302@39 208 \backslash
jb302@39 209 bigskip
jb302@39 210 \end_layout
jb302@39 211
jb302@39 212 \end_inset
jb302@39 213
jb302@39 214
jb302@39 215 \end_layout
jb302@39 216
jb302@39 217 \begin_layout Standard
jb302@39 218 This file will essentially be the plain text source side by side with the
jb302@39 219 binary machine code and address for each instruction (represented as hexadecima
jb302@39 220 l for greater readability).
jb302@39 221 This file will provide the information needed for setting break pointers
jb302@39 222 with the debugger later, it will also be generally useful for debugging
jb302@42 223 programs written in the assembler, and the assembler itself.
jb302@39 224 \end_layout
jb302@39 225
jb302@39 226 \begin_layout Standard
jb302@39 227 \begin_inset Newpage pagebreak
jb302@39 228 \end_inset
jb302@39 229
jb302@39 230
jb302@39 231 \end_layout
jb302@39 232
jb302@39 233 \begin_layout Subsection
jb302@39 234 Language design in BNF syntax
jb302@39 235 \end_layout
jb302@39 236
jb302@39 237 \begin_layout Standard
jb302@42 238 The ELB816 specification [1] defines an assembly language in Backus Naur
jb302@42 239 form, however the assembler designed for this project differs slightly
jb302@42 240 (more details in Assembler Implementation below).
jb302@39 241 Here is the language definition for this assembler:
jb302@39 242 \end_layout
jb302@39 243
jb302@39 244 \begin_layout Standard
jb302@39 245 \begin_inset ERT
jb302@39 246 status open
jb302@39 247
jb302@39 248 \begin_layout Plain Layout
jb302@39 249
jb302@39 250
jb302@39 251 \backslash
jb302@39 252 bigskip
jb302@39 253 \end_layout
jb302@39 254
jb302@39 255 \end_inset
jb302@39 256
jb302@39 257
jb302@39 258 \end_layout
jb302@39 259
jb302@39 260 \begin_layout Standard
jb302@39 261 \begin_inset listings
jb302@39 262 lstparams "basicstyle={\ttfamily},captionpos=b,keywordstyle={\color{blue}},tabsize=4"
jb302@39 263 inline false
jb302@39 264 status open
jb302@39 265
jb302@39 266 \begin_layout Plain Layout
jb302@39 267
jb302@39 268 <assembly_code> ::= <line> <assembly_code> | <line> <EOF>
jb302@39 269 \end_layout
jb302@39 270
jb302@39 271 \begin_layout Plain Layout
jb302@39 272
jb302@39 273 \end_layout
jb302@39 274
jb302@39 275 \begin_layout Plain Layout
jb302@39 276
jb302@39 277 <EOF> ::= <end of file>
jb302@39 278 \end_layout
jb302@39 279
jb302@39 280 \begin_layout Plain Layout
jb302@39 281
jb302@39 282 \end_layout
jb302@39 283
jb302@39 284 \begin_layout Plain Layout
jb302@39 285
jb302@39 286 <line> ::= [<statement> [";"<comment>]] <EOL>
jb302@39 287 \end_layout
jb302@39 288
jb302@39 289 \begin_layout Plain Layout
jb302@39 290
jb302@39 291 \end_layout
jb302@39 292
jb302@39 293 \begin_layout Plain Layout
jb302@39 294
jb302@39 295 <EOL> ::= <end of line character>
jb302@39 296 \end_layout
jb302@39 297
jb302@39 298 \begin_layout Plain Layout
jb302@39 299
jb302@39 300  
jb302@39 301 \end_layout
jb302@39 302
jb302@39 303 \begin_layout Plain Layout
jb302@39 304
jb302@39 305 <statement> ::= [<label> ":"] <mnemonic> [<arguments>]
jb302@39 306 \end_layout
jb302@39 307
jb302@39 308 \begin_layout Plain Layout
jb302@39 309
jb302@39 310 | [<label>] <directive> [<arguments>]
jb302@39 311 \end_layout
jb302@39 312
jb302@39 313 \begin_layout Plain Layout
jb302@39 314
jb302@39 315 | <label> ":"
jb302@39 316 \end_layout
jb302@39 317
jb302@39 318 \begin_layout Plain Layout
jb302@39 319
jb302@39 320 \end_layout
jb302@39 321
jb302@39 322 \begin_layout Plain Layout
jb302@39 323
jb302@39 324 <character> ::= <any ASCII character>
jb302@39 325 \end_layout
jb302@39 326
jb302@39 327 \begin_layout Plain Layout
jb302@39 328
jb302@39 329 \end_layout
jb302@39 330
jb302@39 331 \begin_layout Plain Layout
jb302@39 332
jb302@39 333 <mnemonic> ::= "MOV" | "NOP" | "XCSD" | "SFA" | "LAF" | "ANL"
jb302@39 334 \end_layout
jb302@39 335
jb302@39 336 \begin_layout Plain Layout
jb302@39 337
jb302@39 338 | "ORL" | "XRL" | "RL" | "RLC" | "RR" | "RRC"
jb302@39 339
jb302@39 340 \end_layout
jb302@39 341
jb302@39 342 \begin_layout Plain Layout
jb302@39 343
jb302@39 344 | "INC" | "DEC" | "SET" | "CLR" | "CPL" | "ADD"
jb302@39 345 \end_layout
jb302@39 346
jb302@39 347 \begin_layout Plain Layout
jb302@39 348
jb302@39 349 | "ADD" | "ADDC" | "SUB" | "SUBB" | "PJUMP"
jb302@39 350 \end_layout
jb302@39 351
jb302@39 352 \begin_layout Plain Layout
jb302@39 353
jb302@39 354 | "PCALL" | "LJMP" | "LCALL" | "DJNZ" | "CJNE"
jb302@39 355 \end_layout
jb302@39 356
jb302@39 357 \begin_layout Plain Layout
jb302@39 358
jb302@39 359 | "RET" | "RETI" | "SJMP" | "JMP" | "JZ" | "JNZ"
jb302@39 360 \end_layout
jb302@39 361
jb302@39 362 \begin_layout Plain Layout
jb302@39 363
jb302@39 364 | "JC" | "JNC" | "JPO" | "JPE" | "JS" | "JNS"
jb302@39 365 \end_layout
jb302@39 366
jb302@39 367 \begin_layout Plain Layout
jb302@39 368
jb302@39 369 | "PUSH" | "POP" | "IN" | "OUT" | "HLT"
jb302@39 370 \end_layout
jb302@39 371
jb302@39 372 \begin_layout Plain Layout
jb302@39 373
jb302@39 374 \end_layout
jb302@39 375
jb302@39 376 \begin_layout Plain Layout
jb302@39 377
jb302@39 378 <directive> ::= "ORG" | "EQU" | "DB" | "DS" 
jb302@39 379 \end_layout
jb302@39 380
jb302@39 381 \begin_layout Plain Layout
jb302@39 382
jb302@39 383 \end_layout
jb302@39 384
jb302@39 385 \begin_layout Plain Layout
jb302@39 386
jb302@39 387 <arguments> ::= <argument> | <arguments> "," <argument>
jb302@39 388 \end_layout
jb302@39 389
jb302@39 390 \begin_layout Plain Layout
jb302@39 391
jb302@39 392 \end_layout
jb302@39 393
jb302@39 394 \begin_layout Plain Layout
jb302@39 395
jb302@39 396 <argument> ::= <register> | <reg_pair> | ["@"] <address>
jb302@39 397 \end_layout
jb302@39 398
jb302@39 399 \begin_layout Plain Layout
jb302@39 400
jb302@39 401 | <flag> | ["#"] <aggregate>
jb302@39 402 \end_layout
jb302@39 403
jb302@39 404 \begin_layout Plain Layout
jb302@39 405
jb302@39 406 \end_layout
jb302@39 407
jb302@39 408 \begin_layout Plain Layout
jb302@39 409
jb302@39 410 <register> ::=  "A" | "FLAGS" | "R0" | "R1" | "R2" | "R3"
jb302@39 411 \end_layout
jb302@39 412
jb302@39 413 \begin_layout Plain Layout
jb302@39 414
jb302@39 415 | "DPH" | "DPL" | "SPH" | "SPL"
jb302@39 416 \end_layout
jb302@39 417
jb302@39 418 \begin_layout Plain Layout
jb302@39 419
jb302@39 420 \end_layout
jb302@39 421
jb302@39 422 \begin_layout Plain Layout
jb302@39 423
jb302@39 424 <reg_pair> ::= "DPTR" | "SP" | "PC"
jb302@39 425 \end_layout
jb302@39 426
jb302@39 427 \begin_layout Plain Layout
jb302@39 428
jb302@39 429 \end_layout
jb302@39 430
jb302@39 431 \begin_layout Plain Layout
jb302@39 432
jb302@39 433 <flag> ::= "C" | "IE" | "BS"
jb302@39 434 \end_layout
jb302@39 435
jb302@39 436 \begin_layout Plain Layout
jb302@39 437
jb302@39 438 \end_layout
jb302@39 439
jb302@39 440 \begin_layout Plain Layout
jb302@39 441
jb302@39 442 <aggregate> ::= ["("] <python arithmetic> [")"] | <python integer>
jb302@39 443 \end_layout
jb302@39 444
jb302@39 445 \end_inset
jb302@39 446
jb302@39 447
jb302@39 448 \end_layout
jb302@39 449
jb302@37 450 \begin_layout Section
jb302@37 451 Assembler Implementation
jb302@37 452 \end_layout
jb302@37 453
jb302@39 454 \begin_layout Standard
jb302@39 455 The assembler is written in pure Python 2 using only the standard library.
jb302@39 456 It assembles the assembly the language described in the ELB816 specification
jb302@42 457 [1] with a few minor differences.
jb302@39 458 These differences are:
jb302@39 459 \end_layout
jb302@39 460
jb302@39 461 \begin_layout Itemize
jb302@39 462 In-line arithmetic must be wrapped in curved brackets eg.
jb302@39 463 start with '(' and end with ')'.
jb302@39 464 This is a limitation of the design of the program and to change it would
jb302@39 465 require a large amount of code to be re-written.
jb302@39 466 \end_layout
jb302@39 467
jb302@39 468 \begin_layout Itemize
jb302@39 469 The only directives that have been implemented are
jb302@39 470 \begin_inset listings
jb302@39 471 lstparams "basicstyle={\ttfamily}"
jb302@39 472 inline true
jb302@39 473 status open
jb302@39 474
jb302@39 475 \begin_layout Plain Layout
jb302@39 476
jb302@39 477 ORG
jb302@39 478 \end_layout
jb302@39 479
jb302@39 480 \end_inset
jb302@39 481
jb302@39 482 ,
jb302@39 483 \begin_inset listings
jb302@39 484 lstparams "basicstyle={\ttfamily}"
jb302@39 485 inline true
jb302@39 486 status open
jb302@39 487
jb302@39 488 \begin_layout Plain Layout
jb302@39 489
jb302@39 490 EQU
jb302@39 491 \end_layout
jb302@39 492
jb302@39 493 \end_inset
jb302@39 494
jb302@39 495 ,
jb302@39 496 \begin_inset listings
jb302@39 497 lstparams "basicstyle={\ttfamily}"
jb302@39 498 inline true
jb302@39 499 status open
jb302@39 500
jb302@39 501 \begin_layout Plain Layout
jb302@39 502
jb302@39 503 DB
jb302@39 504 \end_layout
jb302@39 505
jb302@39 506 \end_inset
jb302@39 507
jb302@39 508 and
jb302@39 509 \begin_inset listings
jb302@39 510 lstparams "basicstyle={\ttfamily}"
jb302@39 511 inline true
jb302@39 512 status open
jb302@39 513
jb302@39 514 \begin_layout Plain Layout
jb302@39 515
jb302@39 516 DS
jb302@39 517 \end_layout
jb302@39 518
jb302@39 519 \end_inset
jb302@39 520
jb302@39 521 .
jb302@39 522 The other directives listed in the specification have not been implemented,
jb302@39 523 but there omission is only due to time constraints and they could easily
jb302@39 524 be implemented in a later version.
jb302@39 525 \end_layout
jb302@39 526
jb302@39 527 \begin_layout Itemize
jb302@39 528 Macros have not been implemented also due to time constraints.
jb302@39 529 \end_layout
jb302@39 530
jb302@39 531 \begin_layout Standard
jb302@39 532 The assembler consists of two files:
jb302@39 533 \end_layout
jb302@39 534
jb302@39 535 \begin_layout Itemize
jb302@39 536 \begin_inset listings
jb302@39 537 lstparams "basicstyle={\ttfamily}"
jb302@39 538 inline true
jb302@39 539 status open
jb302@39 540
jb302@39 541 \begin_layout Plain Layout
jb302@39 542
jb302@39 543 language.py
jb302@39 544 \end_layout
jb302@39 545
jb302@39 546 \end_inset
jb302@39 547
jb302@39 548 which contains the language definition in an index and some functions to
jb302@39 549 help encode instructions.
jb302@39 550 \end_layout
jb302@39 551
jb302@39 552 \begin_layout Itemize
jb302@39 553 \begin_inset listings
jb302@39 554 lstparams "basicstyle={\ttfamily}"
jb302@39 555 inline true
jb302@39 556 status open
jb302@39 557
jb302@39 558 \begin_layout Plain Layout
jb302@39 559
jb302@39 560 assembler.py
jb302@39 561 \end_layout
jb302@39 562
jb302@39 563 \end_inset
jb302@39 564
jb302@39 565 which contains the first and second pass functions and handles opening
jb302@39 566 source files and writing binary files.
jb302@39 567 \end_layout
jb302@39 568
jb302@39 569 \begin_layout Standard
jb302@39 570 The following sections details the design and behavior of the assembler.
jb302@39 571 However it must be noted that these are abstract and high level descriptions
jb302@39 572 that do not fully explain minor routines, but give an overview of the entire
jb302@39 573 process.
jb302@42 574 The full commented source code is provided with the Supporting Material
jb302@42 575 and should be referenced for a deeper understanding of the program's operation.
jb302@39 576
jb302@39 577 \end_layout
jb302@39 578
jb302@39 579 \begin_layout Standard
jb302@39 580 \begin_inset Newpage pagebreak
jb302@39 581 \end_inset
jb302@39 582
jb302@39 583
jb302@39 584 \end_layout
jb302@39 585
jb302@39 586 \begin_layout Subsection
jb302@39 587 Data Structures
jb302@39 588 \end_layout
jb302@39 589
jb302@39 590 \begin_layout Itemize
jb302@39 591 \begin_inset listings
jb302@39 592 lstparams "basicstyle={\ttfamily}"
jb302@39 593 inline true
jb302@39 594 status open
jb302@39 595
jb302@39 596 \begin_layout Plain Layout
jb302@39 597
jb302@39 598 reserved arguments
jb302@39 599 \end_layout
jb302@39 600
jb302@39 601 \end_inset
jb302@39 602
jb302@39 603
jb302@39 604 \end_layout
jb302@39 605
jb302@39 606 \begin_layout Standard
jb302@39 607 This structure contains a list of string representations of the reserved
jb302@39 608 word arguments for the instruction set.
jb302@39 609 These all equate to registers or register pointers.
jb302@39 610 The full list is as follows:
jb302@39 611 \end_layout
jb302@39 612
jb302@39 613 \begin_layout Standard
jb302@39 614 \begin_inset listings
jb302@39 615 lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},tabsize=4"
jb302@39 616 inline false
jb302@39 617 status open
jb302@39 618
jb302@39 619 \begin_layout Plain Layout
jb302@39 620
jb302@39 621 a, c, bs, ie, flags,
jb302@39 622 \end_layout
jb302@39 623
jb302@39 624 \begin_layout Plain Layout
jb302@39 625
jb302@39 626 r0, r1, r2, r3,
jb302@39 627 \end_layout
jb302@39 628
jb302@39 629 \begin_layout Plain Layout
jb302@39 630
jb302@39 631 dptr, dpl, dph,
jb302@39 632 \end_layout
jb302@39 633
jb302@39 634 \begin_layout Plain Layout
jb302@39 635
jb302@39 636 sp, sph, spl,
jb302@39 637 \end_layout
jb302@39 638
jb302@39 639 \begin_layout Plain Layout
jb302@39 640
jb302@39 641 @a+pc, @a+dptr, @dptr
jb302@39 642 \end_layout
jb302@39 643
jb302@39 644 \end_inset
jb302@39 645
jb302@39 646
jb302@39 647 \end_layout
jb302@39 648
jb302@39 649 \begin_layout Itemize
jb302@39 650 \begin_inset listings
jb302@39 651 lstparams "basicstyle={\ttfamily}"
jb302@39 652 inline true
jb302@39 653 status open
jb302@39 654
jb302@39 655 \begin_layout Plain Layout
jb302@39 656
jb302@39 657 relative instructions
jb302@39 658 \end_layout
jb302@39 659
jb302@39 660 \end_inset
jb302@39 661
jb302@39 662
jb302@39 663 \end_layout
jb302@39 664
jb302@39 665 \begin_layout Standard
jb302@39 666 This structure contains a list of string representations of the mnemonics
jb302@39 667 of instructions that use relative addressing.
jb302@39 668 The full list is as follows:
jb302@39 669 \end_layout
jb302@39 670
jb302@39 671 \begin_layout Standard
jb302@39 672 \begin_inset listings
jb302@39 673 lstparams "basicstyle={\ttfamily},captionpos=b,frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},tabsize=4"
jb302@39 674 inline false
jb302@39 675 status open
jb302@39 676
jb302@39 677 \begin_layout Plain Layout
jb302@39 678
jb302@39 679 djnz, cjne, sjmp, jz,
jb302@39 680 \end_layout
jb302@39 681
jb302@39 682 \begin_layout Plain Layout
jb302@39 683
jb302@39 684 jnz, jc, jnc, jpo,
jb302@39 685 \end_layout
jb302@39 686
jb302@39 687 \begin_layout Plain Layout
jb302@39 688
jb302@39 689 jpe, js, jns
jb302@39 690 \end_layout
jb302@39 691
jb302@39 692 \end_inset
jb302@39 693
jb302@39 694
jb302@39 695 \end_layout
jb302@39 696
jb302@39 697 \begin_layout Itemize
jb302@39 698 \begin_inset listings
jb302@39 699 lstparams "basicstyle={\ttfamily}"
jb302@39 700 inline true
jb302@39 701 status open
jb302@39 702
jb302@39 703 \begin_layout Plain Layout
jb302@39 704
jb302@39 705 instruction index
jb302@39 706 \end_layout
jb302@39 707
jb302@39 708 \end_inset
jb302@39 709
jb302@39 710
jb302@39 711 \end_layout
jb302@39 712
jb302@39 713 \begin_layout Standard
jb302@39 714 This structure contains an index of all possible instructions in the instruction
jb302@39 715 set, along with the the corresponding opcode and instruction width.
jb302@39 716 This is implemented using a combination of Python's dictionary, tuple and
jb302@39 717 list objects.
jb302@39 718 Its structure is demonstrated below:
jb302@39 719 \end_layout
jb302@39 720
jb302@39 721 \begin_layout Standard
jb302@39 722 \begin_inset listings
jb302@39 723 lstparams "basicstyle={\ttfamily},captionpos=b,frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},tabsize=4"
jb302@39 724 inline false
jb302@39 725 status open
jb302@39 726
jb302@39 727 \begin_layout Plain Layout
jb302@39 728
jb302@39 729 mnemonic: (arg type, arg type, ...): [opcode, width]
jb302@39 730 \end_layout
jb302@39 731
jb302@39 732 \end_inset
jb302@39 733
jb302@39 734
jb302@39 735 \end_layout
jb302@39 736
jb302@39 737 \begin_layout Standard
jb302@39 738 Each mnemonic has an entry in the parent index which returns another index
jb302@39 739 of possible argument formats for that mnemonic with their corresponding
jb302@39 740 opcode and length.
jb302@39 741 Argument types can be either be one of the reserved arguments or one of
jb302@39 742 the following values:
jb302@39 743 \begin_inset listings
jb302@39 744 lstparams "basicstyle={\ttfamily}"
jb302@39 745 inline true
jb302@39 746 status open
jb302@39 747
jb302@39 748 \begin_layout Plain Layout
jb302@39 749
jb302@39 750 address
jb302@39 751 \end_layout
jb302@39 752
jb302@39 753 \end_inset
jb302@39 754
jb302@39 755 ,
jb302@39 756 \begin_inset listings
jb302@39 757 lstparams "basicstyle={\ttfamily}"
jb302@39 758 inline true
jb302@39 759 status open
jb302@39 760
jb302@39 761 \begin_layout Plain Layout
jb302@39 762
jb302@39 763 pointer
jb302@39 764 \end_layout
jb302@39 765
jb302@39 766 \end_inset
jb302@39 767
jb302@39 768 ,
jb302@39 769 \begin_inset listings
jb302@39 770 lstparams "basicstyle={\ttfamily}"
jb302@39 771 inline true
jb302@39 772 status open
jb302@39 773
jb302@39 774 \begin_layout Plain Layout
jb302@39 775
jb302@39 776 data
jb302@39 777 \end_layout
jb302@39 778
jb302@39 779 \end_inset
jb302@39 780
jb302@39 781 or
jb302@39 782 \begin_inset listings
jb302@39 783 lstparams "basicstyle={\ttfamily}"
jb302@39 784 inline true
jb302@39 785 status open
jb302@39 786
jb302@39 787 \begin_layout Plain Layout
jb302@39 788
jb302@39 789 label
jb302@39 790 \end_layout
jb302@39 791
jb302@39 792 \end_inset
jb302@39 793
jb302@39 794 .
jb302@39 795 Width is represented in number of bytes, ie.
jb302@39 796
jb302@39 797 \begin_inset listings
jb302@39 798 lstparams "basicstyle={\ttfamily}"
jb302@39 799 inline true
jb302@39 800 status open
jb302@39 801
jb302@39 802 \begin_layout Plain Layout
jb302@39 803
jb302@39 804 width = 3
jb302@39 805 \end_layout
jb302@39 806
jb302@39 807 \end_inset
jb302@39 808
jb302@39 809 means 1 byte of opcode and 2 bytes of arguments.
jb302@39 810 \end_layout
jb302@39 811
jb302@39 812 \begin_layout Itemize
jb302@39 813 \begin_inset listings
jb302@39 814 lstparams "basicstyle={\ttfamily}"
jb302@39 815 inline true
jb302@39 816 status open
jb302@39 817
jb302@39 818 \begin_layout Plain Layout
jb302@39 819
jb302@39 820 label index
jb302@39 821 \end_layout
jb302@39 822
jb302@39 823 \end_inset
jb302@39 824
jb302@39 825
jb302@39 826 \end_layout
jb302@39 827
jb302@39 828 \begin_layout Standard
jb302@39 829 This structure is used to store an index of label definitions.
jb302@39 830 \end_layout
jb302@39 831
jb302@39 832 \begin_layout Itemize
jb302@39 833 \begin_inset listings
jb302@39 834 lstparams "basicstyle={\ttfamily}"
jb302@39 835 inline true
jb302@39 836 status open
jb302@39 837
jb302@39 838 \begin_layout Plain Layout
jb302@39 839
jb302@39 840 equate index
jb302@39 841 \end_layout
jb302@39 842
jb302@39 843 \end_inset
jb302@39 844
jb302@39 845
jb302@39 846 \end_layout
jb302@39 847
jb302@39 848 \begin_layout Standard
jb302@39 849 This structure is used to store an index of equated strings.
jb302@39 850 \end_layout
jb302@39 851
jb302@39 852 \begin_layout Standard
jb302@39 853 \begin_inset Newpage newpage
jb302@39 854 \end_inset
jb302@39 855
jb302@39 856
jb302@39 857 \end_layout
jb302@39 858
jb302@39 859 \begin_layout Subsection
jb302@39 860 Functions
jb302@39 861 \end_layout
jb302@39 862
jb302@39 863 \begin_layout Itemize
jb302@39 864 \begin_inset listings
jb302@39 865 lstparams "basicstyle={\ttfamily}"
jb302@39 866 inline true
jb302@39 867 status open
jb302@39 868
jb302@39 869 \begin_layout Plain Layout
jb302@39 870
jb302@39 871 first_pass(source file)
jb302@39 872 \end_layout
jb302@39 873
jb302@39 874 \end_inset
jb302@39 875
jb302@39 876
jb302@39 877 \end_layout
jb302@39 878
jb302@39 879 \begin_layout Standard
jb302@39 880 This function pre-processes a source file and stores it in a format containing
jb302@39 881 the necessary data for the
jb302@39 882 \begin_inset listings
jb302@39 883 lstparams "basicstyle={\ttfamily}"
jb302@39 884 inline true
jb302@39 885 status open
jb302@39 886
jb302@39 887 \begin_layout Plain Layout
jb302@39 888
jb302@39 889 second_pass()
jb302@39 890 \end_layout
jb302@39 891
jb302@39 892 \end_inset
jb302@39 893
jb302@39 894 function to assemble it.
jb302@39 895 It processes labels and
jb302@39 896 \begin_inset listings
jb302@39 897 lstparams "basicstyle={\ttfamily}"
jb302@39 898 inline true
jb302@39 899 status open
jb302@39 900
jb302@39 901 \begin_layout Plain Layout
jb302@39 902
jb302@39 903 EQU
jb302@39 904 \end_layout
jb302@39 905
jb302@39 906 \end_inset
jb302@39 907
jb302@39 908 directives by storing strings and their corresponding values in indexes
jb302@39 909 and replacing any subsequent appearances of the string with the value.
jb302@39 910 It prepares
jb302@39 911 \begin_inset listings
jb302@39 912 lstparams "basicstyle={\ttfamily}"
jb302@39 913 inline true
jb302@39 914 status open
jb302@39 915
jb302@39 916 \begin_layout Plain Layout
jb302@39 917
jb302@39 918 ORG
jb302@39 919 \end_layout
jb302@39 920
jb302@39 921 \end_inset
jb302@39 922
jb302@39 923 and
jb302@39 924 \begin_inset listings
jb302@39 925 lstparams "basicstyle={\ttfamily}"
jb302@39 926 inline true
jb302@39 927 status open
jb302@39 928
jb302@39 929 \begin_layout Plain Layout
jb302@39 930
jb302@39 931 DB
jb302@39 932 \end_layout
jb302@39 933
jb302@39 934 \end_inset
jb302@39 935
jb302@39 936 statements for the
jb302@39 937 \begin_inset listings
jb302@39 938 lstparams "basicstyle={\ttfamily}"
jb302@39 939 inline true
jb302@39 940 status open
jb302@39 941
jb302@39 942 \begin_layout Plain Layout
jb302@39 943
jb302@39 944 second_pass()
jb302@39 945 \end_layout
jb302@39 946
jb302@39 947 \end_inset
jb302@39 948
jb302@39 949 .
jb302@39 950 It uses the
jb302@39 951 \begin_inset listings
jb302@39 952 lstparams "basicstyle={\ttfamily}"
jb302@39 953 inline true
jb302@39 954 status open
jb302@39 955
jb302@39 956 \begin_layout Plain Layout
jb302@39 957
jb302@39 958 tokenize()
jb302@39 959 \end_layout
jb302@39 960
jb302@39 961 \end_inset
jb302@39 962
jb302@39 963 function to determine the argument symbols and operand bit string.
jb302@39 964 Finally it uses the
jb302@39 965 \begin_inset listings
jb302@39 966 lstparams "basicstyle={\ttfamily}"
jb302@39 967 inline true
jb302@39 968 status open
jb302@39 969
jb302@39 970 \begin_layout Plain Layout
jb302@39 971
jb302@39 972 instruction index
jb302@39 973 \end_layout
jb302@39 974
jb302@39 975 \end_inset
jb302@39 976
jb302@39 977 to determine the instruction width.
jb302@39 978 \end_layout
jb302@39 979
jb302@39 980 \begin_layout Itemize
jb302@39 981 \begin_inset listings
jb302@39 982 lstparams "basicstyle={\ttfamily}"
jb302@39 983 inline true
jb302@39 984 status open
jb302@39 985
jb302@39 986 \begin_layout Plain Layout
jb302@39 987
jb302@39 988 second_pass(asm, label index)
jb302@39 989 \end_layout
jb302@39 990
jb302@39 991 \end_inset
jb302@39 992
jb302@39 993
jb302@39 994 \end_layout
jb302@39 995
jb302@39 996 \begin_layout Standard
jb302@39 997 This function takes the pre-processed assembly code and
jb302@39 998 \begin_inset listings
jb302@39 999 lstparams "basicstyle={\ttfamily}"
jb302@39 1000 inline true
jb302@39 1001 status open
jb302@39 1002
jb302@39 1003 \begin_layout Plain Layout
jb302@39 1004
jb302@39 1005 label index
jb302@39 1006 \end_layout
jb302@39 1007
jb302@39 1008 \end_inset
jb302@39 1009
jb302@39 1010 output by
jb302@39 1011 \begin_inset listings
jb302@39 1012 lstparams "basicstyle={\ttfamily}"
jb302@39 1013 inline true
jb302@39 1014 status open
jb302@39 1015
jb302@39 1016 \begin_layout Plain Layout
jb302@39 1017
jb302@39 1018 first_pass()
jb302@39 1019 \end_layout
jb302@39 1020
jb302@39 1021 \end_inset
jb302@39 1022
jb302@39 1023 as input.
jb302@39 1024 First it checks for
jb302@39 1025 \begin_inset listings
jb302@39 1026 lstparams "basicstyle={\ttfamily}"
jb302@39 1027 inline true
jb302@39 1028 status open
jb302@39 1029
jb302@39 1030 \begin_layout Plain Layout
jb302@39 1031
jb302@39 1032 ORG
jb302@39 1033 \end_layout
jb302@39 1034
jb302@39 1035 \end_inset
jb302@39 1036
jb302@39 1037 and
jb302@39 1038 \begin_inset listings
jb302@39 1039 lstparams "basicstyle={\ttfamily}"
jb302@39 1040 inline true
jb302@39 1041 status open
jb302@39 1042
jb302@39 1043 \begin_layout Plain Layout
jb302@39 1044
jb302@39 1045 DB
jb302@39 1046 \end_layout
jb302@39 1047
jb302@39 1048 \end_inset
jb302@39 1049
jb302@39 1050 statements and handles them if necessary.
jb302@39 1051 Then it replaces any labels that were used before they were defined and
jb302@39 1052 therefore not replaced on by
jb302@39 1053 \begin_inset listings
jb302@39 1054 lstparams "basicstyle={\ttfamily}"
jb302@39 1055 inline true
jb302@39 1056 status open
jb302@39 1057
jb302@39 1058 \begin_layout Plain Layout
jb302@39 1059
jb302@39 1060 first_pass()
jb302@39 1061 \end_layout
jb302@39 1062
jb302@39 1063 \end_inset
jb302@39 1064
jb302@39 1065 .
jb302@39 1066 It uses the
jb302@39 1067 \begin_inset listings
jb302@39 1068 lstparams "basicstyle={\ttfamily}"
jb302@39 1069 inline true
jb302@39 1070 status open
jb302@39 1071
jb302@39 1072 \begin_layout Plain Layout
jb302@39 1073
jb302@39 1074 instruction index
jb302@39 1075 \end_layout
jb302@39 1076
jb302@39 1077 \end_inset
jb302@39 1078
jb302@39 1079 to determine the opcode and the width of the instruction, then it writes
jb302@39 1080 the opcode and operand to the file.
jb302@39 1081 If the combined width of the opcode and operand is greater than the instruction
jb302@39 1082 width the function raises an error.
jb302@39 1083
jb302@39 1084 \end_layout
jb302@39 1085
jb302@39 1086 \begin_layout Itemize
jb302@39 1087 \begin_inset listings
jb302@39 1088 lstparams "basicstyle={\ttfamily}"
jb302@39 1089 inline true
jb302@39 1090 status open
jb302@39 1091
jb302@39 1092 \begin_layout Plain Layout
jb302@39 1093
jb302@39 1094 tokenize(mnemonic, arguments)
jb302@39 1095 \end_layout
jb302@39 1096
jb302@39 1097 \end_inset
jb302@39 1098
jb302@39 1099
jb302@39 1100 \end_layout
jb302@39 1101
jb302@39 1102 \begin_layout Standard
jb302@39 1103 This function processes an instruction in order to produce a hashable symbol
jb302@39 1104 that represents the format of its arguments.
jb302@39 1105 This symbol is used to look up opcodes in the
jb302@39 1106 \begin_inset listings
jb302@39 1107 lstparams "basicstyle={\ttfamily}"
jb302@39 1108 inline true
jb302@39 1109 status open
jb302@39 1110
jb302@39 1111 \begin_layout Plain Layout
jb302@39 1112
jb302@39 1113 instruction index
jb302@39 1114 \end_layout
jb302@39 1115
jb302@39 1116 \end_inset
jb302@39 1117
jb302@39 1118 .
jb302@39 1119 It also detects string representations of numbers in the arguments and
jb302@39 1120 stores a C type struct representation of the operands to be returned along
jb302@39 1121 with the symbol.
jb302@39 1122 It does this with the help of the
jb302@39 1123 \begin_inset listings
jb302@39 1124 lstparams "basicstyle={\ttfamily}"
jb302@39 1125 inline true
jb302@39 1126 status open
jb302@39 1127
jb302@39 1128 \begin_layout Plain Layout
jb302@39 1129
jb302@39 1130 stoi()
jb302@39 1131 \end_layout
jb302@39 1132
jb302@39 1133 \end_inset
jb302@39 1134
jb302@39 1135 function and Python's
jb302@39 1136 \begin_inset listings
jb302@39 1137 lstparams "basicstyle={\ttfamily}"
jb302@39 1138 inline true
jb302@39 1139 status open
jb302@39 1140
jb302@39 1141 \begin_layout Plain Layout
jb302@39 1142
jb302@39 1143 struct
jb302@39 1144 \end_layout
jb302@39 1145
jb302@39 1146 \end_inset
jb302@39 1147
jb302@39 1148 module .
jb302@39 1149 \end_layout
jb302@39 1150
jb302@39 1151 \begin_layout Itemize
jb302@39 1152 \begin_inset listings
jb302@39 1153 lstparams "basicstyle={\ttfamily}"
jb302@39 1154 inline true
jb302@39 1155 status open
jb302@39 1156
jb302@39 1157 \begin_layout Plain Layout
jb302@39 1158
jb302@39 1159 stoi(string)
jb302@39 1160 \end_layout
jb302@39 1161
jb302@39 1162 \end_inset
jb302@39 1163
jb302@39 1164
jb302@39 1165 \end_layout
jb302@39 1166
jb302@39 1167 \begin_layout Standard
jb302@39 1168 This function is a general purpose function that is actually used throughout
jb302@39 1169 the code, although mainly in the
jb302@39 1170 \begin_inset listings
jb302@39 1171 lstparams "basicstyle={\ttfamily}"
jb302@39 1172 inline true
jb302@39 1173 status open
jb302@39 1174
jb302@39 1175 \begin_layout Plain Layout
jb302@39 1176
jb302@39 1177 tokenize()
jb302@39 1178 \end_layout
jb302@39 1179
jb302@39 1180 \end_inset
jb302@39 1181
jb302@39 1182 function.
jb302@39 1183 It takes a string as an input and tries to convert it to an integer using
jb302@39 1184 Pythons integer representation syntax.
jb302@39 1185 It can recognize decimal, octal, hexadecimal and binary numbers which are
jb302@39 1186 denoted with different prefixes.
jb302@39 1187 If it receives a string it can not represent as an integer it returns the
jb302@39 1188 string 'NaN', (Not a Number)
jb302@39 1189 \end_layout
jb302@39 1190
jb302@39 1191 \begin_layout Standard
jb302@39 1192 \begin_inset ERT
jb302@39 1193 status open
jb302@39 1194
jb302@39 1195 \begin_layout Plain Layout
jb302@39 1196
jb302@39 1197
jb302@39 1198 \backslash
jb302@39 1199 bigskip
jb302@39 1200 \end_layout
jb302@39 1201
jb302@39 1202 \end_inset
jb302@39 1203
jb302@39 1204
jb302@39 1205 \end_layout
jb302@39 1206
jb302@39 1207 \begin_layout Standard
jb302@39 1208 Below is an abstract representation major components of the assembler.
jb302@39 1209 The
jb302@39 1210 \begin_inset listings
jb302@39 1211 lstparams "basicstyle={\ttfamily}"
jb302@39 1212 inline true
jb302@39 1213 status open
jb302@39 1214
jb302@39 1215 \begin_layout Plain Layout
jb302@39 1216
jb302@39 1217 first_pass()
jb302@39 1218 \end_layout
jb302@39 1219
jb302@39 1220 \end_inset
jb302@39 1221
jb302@39 1222 and
jb302@39 1223 \begin_inset listings
jb302@39 1224 lstparams "basicstyle={\ttfamily}"
jb302@39 1225 inline true
jb302@39 1226 status open
jb302@39 1227
jb302@39 1228 \begin_layout Plain Layout
jb302@39 1229
jb302@39 1230 second_pass()
jb302@39 1231 \end_layout
jb302@39 1232
jb302@39 1233 \end_inset
jb302@39 1234
jb302@39 1235 are represented in pseudo-code,
jb302@39 1236 \begin_inset listings
jb302@39 1237 lstparams "basicstyle={\ttfamily}"
jb302@39 1238 inline true
jb302@39 1239 status open
jb302@39 1240
jb302@39 1241 \begin_layout Plain Layout
jb302@39 1242
jb302@39 1243 tokenize()
jb302@39 1244 \end_layout
jb302@39 1245
jb302@39 1246 \end_inset
jb302@39 1247
jb302@39 1248 is more easily understood when represented as flowcharts.
jb302@39 1249
jb302@39 1250 \end_layout
jb302@39 1251
jb302@39 1252 \begin_layout Standard
jb302@39 1253 \begin_inset Newpage newpage
jb302@39 1254 \end_inset
jb302@39 1255
jb302@39 1256
jb302@39 1257 \end_layout
jb302@39 1258
jb302@39 1259 \begin_layout Subsubsection
jb302@39 1260 first_pass
jb302@39 1261 \end_layout
jb302@39 1262
jb302@39 1263 \begin_layout Standard
jb302@39 1264 \begin_inset listings
jb302@39 1265 lstparams "basicstyle={\small\ttfamily},captionpos=b,frame=tb,framexbottommargin=3em,framextopmargin=3em,keywordstyle={\color{blue}},showstringspaces=false,tabsize=4"
jb302@39 1266 inline false
jb302@39 1267 status open
jb302@39 1268
jb302@39 1269 \begin_layout Plain Layout
jb302@39 1270
jb302@39 1271 first_pass(source file):
jb302@39 1272 \end_layout
jb302@39 1273
jb302@39 1274 \begin_layout Plain Layout
jb302@39 1275
jb302@39 1276 \end_layout
jb302@39 1277
jb302@39 1278 \begin_layout Plain Layout
jb302@39 1279
jb302@39 1280 address = 0
jb302@39 1281 \end_layout
jb302@39 1282
jb302@39 1283 \begin_layout Plain Layout
jb302@39 1284
jb302@39 1285 \end_layout
jb302@39 1286
jb302@39 1287 \begin_layout Plain Layout
jb302@39 1288
jb302@39 1289 for statement in source file:
jb302@39 1290 \end_layout
jb302@39 1291
jb302@39 1292 \begin_layout Plain Layout
jb302@39 1293
jb302@39 1294 \end_layout
jb302@39 1295
jb302@39 1296 \begin_layout Plain Layout
jb302@39 1297
jb302@39 1298 remove comments
jb302@39 1299 \end_layout
jb302@39 1300
jb302@39 1301 \begin_layout Plain Layout
jb302@39 1302
jb302@39 1303
jb302@39 1304 \end_layout
jb302@39 1305
jb302@39 1306 \begin_layout Plain Layout
jb302@39 1307
jb302@39 1308 for word in statement:
jb302@39 1309 \end_layout
jb302@39 1310
jb302@39 1311 \begin_layout Plain Layout
jb302@39 1312
jb302@39 1313
jb302@39 1314 \end_layout
jb302@39 1315
jb302@39 1316 \begin_layout Plain Layout
jb302@39 1317
jb302@39 1318 if word is in equate index:
jb302@39 1319 \end_layout
jb302@39 1320
jb302@39 1321 \begin_layout Plain Layout
jb302@39 1322
jb302@39 1323 replace word with equated value
jb302@39 1324 \end_layout
jb302@39 1325
jb302@39 1326 \begin_layout Plain Layout
jb302@39 1327
jb302@39 1328 else if word is in label index:
jb302@39 1329 \end_layout
jb302@39 1330
jb302@39 1331 \begin_layout Plain Layout
jb302@39 1332
jb302@39 1333 replace word with address at label
jb302@39 1334 \end_layout
jb302@39 1335
jb302@39 1336 \begin_layout Plain Layout
jb302@39 1337
jb302@39 1338
jb302@39 1339 \end_layout
jb302@39 1340
jb302@39 1341 \begin_layout Plain Layout
jb302@39 1342
jb302@39 1343 if first word == 'org'
jb302@39 1344 \end_layout
jb302@39 1345
jb302@39 1346 \begin_layout Plain Layout
jb302@39 1347
jb302@39 1348 address = second word
jb302@39 1349 \end_layout
jb302@39 1350
jb302@39 1351 \begin_layout Plain Layout
jb302@39 1352
jb302@39 1353 else if last character of first word == ':':
jb302@39 1354 \end_layout
jb302@39 1355
jb302@39 1356 \begin_layout Plain Layout
jb302@39 1357
jb302@39 1358 remove ':'
jb302@39 1359 \end_layout
jb302@39 1360
jb302@39 1361 \begin_layout Plain Layout
jb302@39 1362
jb302@39 1363 add word = address to label index
jb302@39 1364 \end_layout
jb302@39 1365
jb302@39 1366 \begin_layout Plain Layout
jb302@39 1367
jb302@39 1368 next statement
jb302@39 1369 \end_layout
jb302@39 1370
jb302@39 1371 \begin_layout Plain Layout
jb302@39 1372
jb302@39 1373 else if second word == 'equ'
jb302@39 1374 \end_layout
jb302@39 1375
jb302@39 1376 \begin_layout Plain Layout
jb302@39 1377
jb302@39 1378 add first word = third word to equate index
jb302@39 1379 \end_layout
jb302@39 1380
jb302@39 1381 \begin_layout Plain Layout
jb302@39 1382
jb302@39 1383 next statement
jb302@39 1384 \end_layout
jb302@39 1385
jb302@39 1386 \begin_layout Plain Layout
jb302@39 1387
jb302@39 1388
jb302@39 1389 \end_layout
jb302@39 1390
jb302@39 1391 \begin_layout Plain Layout
jb302@39 1392
jb302@39 1393 mnemonic = first word
jb302@39 1394 \end_layout
jb302@39 1395
jb302@39 1396 \begin_layout Plain Layout
jb302@39 1397
jb302@39 1398 arguments = [second word ...
jb302@39 1399 last word]
jb302@39 1400 \end_layout
jb302@39 1401
jb302@39 1402 \begin_layout Plain Layout
jb302@39 1403
jb302@39 1404
jb302@39 1405 \end_layout
jb302@39 1406
jb302@39 1407 \begin_layout Plain Layout
jb302@39 1408
jb302@39 1409 symbol, constant = tokenize(arguments)
jb302@39 1410 \end_layout
jb302@39 1411
jb302@39 1412 \begin_layout Plain Layout
jb302@39 1413
jb302@39 1414 if mnemonic == 'db':
jb302@39 1415 \end_layout
jb302@39 1416
jb302@39 1417 \begin_layout Plain Layout
jb302@39 1418
jb302@39 1419 address = address + width of constant
jb302@39 1420 \end_layout
jb302@39 1421
jb302@39 1422 \begin_layout Plain Layout
jb302@39 1423
jb302@39 1424 next statement
jb302@39 1425 \end_layout
jb302@39 1426
jb302@39 1427 \begin_layout Plain Layout
jb302@39 1428
jb302@39 1429 if mnemonic == 'ds':
jb302@39 1430 \end_layout
jb302@39 1431
jb302@39 1432 \begin_layout Plain Layout
jb302@39 1433
jb302@39 1434 address = address + first argument
jb302@39 1435 \end_layout
jb302@39 1436
jb302@39 1437 \begin_layout Plain Layout
jb302@39 1438
jb302@39 1439 next statement
jb302@39 1440 \end_layout
jb302@39 1441
jb302@39 1442 \begin_layout Plain Layout
jb302@39 1443
jb302@39 1444
jb302@39 1445 \end_layout
jb302@39 1446
jb302@39 1447 \begin_layout Plain Layout
jb302@39 1448
jb302@39 1449 width = instruction index[mnemonic][symbol][width]
jb302@39 1450 \end_layout
jb302@39 1451
jb302@39 1452 \begin_layout Plain Layout
jb302@39 1453
jb302@39 1454 address = address + width
jb302@39 1455 \end_layout
jb302@39 1456
jb302@39 1457 \begin_layout Plain Layout
jb302@39 1458
jb302@39 1459
jb302@39 1460 \end_layout
jb302@39 1461
jb302@39 1462 \begin_layout Plain Layout
jb302@39 1463
jb302@39 1464 append [mnemonic, argument, symbol, constant] to asm
jb302@39 1465 \end_layout
jb302@39 1466
jb302@39 1467 \begin_layout Plain Layout
jb302@39 1468
jb302@39 1469 \end_layout
jb302@39 1470
jb302@39 1471 \begin_layout Plain Layout
jb302@39 1472
jb302@39 1473 return asm, label index
jb302@39 1474 \end_layout
jb302@39 1475
jb302@39 1476 \end_inset
jb302@39 1477
jb302@39 1478
jb302@39 1479 \begin_inset Newpage newpage
jb302@39 1480 \end_inset
jb302@39 1481
jb302@39 1482
jb302@39 1483 \end_layout
jb302@39 1484
jb302@39 1485 \begin_layout Subsubsection
jb302@39 1486 second_pass
jb302@39 1487 \end_layout
jb302@39 1488
jb302@39 1489 \begin_layout Standard
jb302@39 1490 \begin_inset listings
jb302@39 1491 lstparams "basicstyle={\small\ttfamily},breaklines=true,captionpos=b,frame=tb,framexbottommargin=3em,framextopmargin=3em,keywordstyle={\color{blue}},tabsize=4"
jb302@39 1492 inline false
jb302@39 1493 status open
jb302@39 1494
jb302@39 1495 \begin_layout Plain Layout
jb302@39 1496
jb302@39 1497 second_pass(file, asm, label index):
jb302@39 1498 \end_layout
jb302@39 1499
jb302@39 1500 \begin_layout Plain Layout
jb302@39 1501
jb302@39 1502 \end_layout
jb302@39 1503
jb302@39 1504 \begin_layout Plain Layout
jb302@39 1505
jb302@39 1506 address = 0
jb302@39 1507 \end_layout
jb302@39 1508
jb302@39 1509 \begin_layout Plain Layout
jb302@39 1510
jb302@39 1511 \end_layout
jb302@39 1512
jb302@39 1513 \begin_layout Plain Layout
jb302@39 1514
jb302@39 1515 for line in asm:
jb302@39 1516 \end_layout
jb302@39 1517
jb302@39 1518 \begin_layout Plain Layout
jb302@39 1519
jb302@39 1520 \end_layout
jb302@39 1521
jb302@39 1522 \begin_layout Plain Layout
jb302@39 1523
jb302@39 1524 file offset = address
jb302@39 1525 \end_layout
jb302@39 1526
jb302@39 1527 \begin_layout Plain Layout
jb302@39 1528
jb302@39 1529
jb302@39 1530 \end_layout
jb302@39 1531
jb302@39 1532 \begin_layout Plain Layout
jb302@39 1533
jb302@39 1534 mnemonic, arguments, symbol, constant = line
jb302@39 1535 \end_layout
jb302@39 1536
jb302@39 1537 \begin_layout Plain Layout
jb302@39 1538
jb302@39 1539
jb302@39 1540 \end_layout
jb302@39 1541
jb302@39 1542 \begin_layout Plain Layout
jb302@39 1543
jb302@39 1544 if mnemonic == 'org':
jb302@39 1545 \end_layout
jb302@39 1546
jb302@39 1547 \begin_layout Plain Layout
jb302@39 1548
jb302@39 1549 address = first argument
jb302@39 1550 \end_layout
jb302@39 1551
jb302@39 1552 \begin_layout Plain Layout
jb302@39 1553
jb302@39 1554 next line
jb302@39 1555 \end_layout
jb302@39 1556
jb302@39 1557 \begin_layout Plain Layout
jb302@39 1558
jb302@39 1559 else if mnemonic == 'db':
jb302@39 1560 \end_layout
jb302@39 1561
jb302@39 1562 \begin_layout Plain Layout
jb302@39 1563
jb302@39 1564 write constant to file
jb302@39 1565 \end_layout
jb302@39 1566
jb302@39 1567 \begin_layout Plain Layout
jb302@39 1568
jb302@39 1569 address = address + width of constant
jb302@39 1570 \end_layout
jb302@39 1571
jb302@39 1572 \begin_layout Plain Layout
jb302@39 1573
jb302@39 1574 next line
jb302@39 1575 \end_layout
jb302@39 1576
jb302@39 1577 \begin_layout Plain Layout
jb302@39 1578
jb302@39 1579 if mnemonic == 'ds':
jb302@39 1580 \end_layout
jb302@39 1581
jb302@39 1582 \begin_layout Plain Layout
jb302@39 1583
jb302@39 1584 address = address + first argument
jb302@39 1585 \end_layout
jb302@39 1586
jb302@39 1587 \begin_layout Plain Layout
jb302@39 1588
jb302@39 1589 next line
jb302@39 1590 \end_layout
jb302@39 1591
jb302@39 1592 \begin_layout Plain Layout
jb302@39 1593
jb302@39 1594
jb302@39 1595 \end_layout
jb302@39 1596
jb302@39 1597 \begin_layout Plain Layout
jb302@39 1598
jb302@39 1599 for argument in arguments:
jb302@39 1600 \end_layout
jb302@39 1601
jb302@39 1602 \begin_layout Plain Layout
jb302@39 1603
jb302@39 1604 if argument is a label:
jb302@39 1605 \end_layout
jb302@39 1606
jb302@39 1607 \begin_layout Plain Layout
jb302@39 1608
jb302@39 1609 replace argument with address at label
jb302@39 1610 \end_layout
jb302@39 1611
jb302@39 1612 \begin_layout Plain Layout
jb302@39 1613
jb302@39 1614 symbol, data = tokenize(argument)
jb302@39 1615 \end_layout
jb302@39 1616
jb302@39 1617 \begin_layout Plain Layout
jb302@39 1618
jb302@39 1619 append data to constant
jb302@39 1620 \end_layout
jb302@39 1621
jb302@39 1622 \begin_layout Plain Layout
jb302@39 1623
jb302@39 1624
jb302@39 1625 \end_layout
jb302@39 1626
jb302@39 1627 \begin_layout Plain Layout
jb302@39 1628
jb302@39 1629 op, width = instruction index[mnemonic][symbol]
jb302@39 1630 \end_layout
jb302@39 1631
jb302@39 1632 \begin_layout Plain Layout
jb302@39 1633
jb302@39 1634
jb302@39 1635 \end_layout
jb302@39 1636
jb302@39 1637 \begin_layout Plain Layout
jb302@39 1638
jb302@39 1639 write op to file
jb302@39 1640 \end_layout
jb302@39 1641
jb302@39 1642 \begin_layout Plain Layout
jb302@39 1643
jb302@39 1644 \end_layout
jb302@39 1645
jb302@39 1646 \begin_layout Plain Layout
jb302@39 1647
jb302@39 1648 if width of constant - width + 1 > 0:
jb302@39 1649 \end_layout
jb302@39 1650
jb302@39 1651 \begin_layout Plain Layout
jb302@39 1652
jb302@39 1653 raise error
jb302@39 1654 \end_layout
jb302@39 1655
jb302@39 1656 \begin_layout Plain Layout
jb302@39 1657
jb302@39 1658 else if:
jb302@39 1659 \end_layout
jb302@39 1660
jb302@39 1661 \begin_layout Plain Layout
jb302@39 1662
jb302@39 1663 write constant to file
jb302@39 1664 \end_layout
jb302@39 1665
jb302@39 1666 \begin_layout Plain Layout
jb302@39 1667
jb302@39 1668 address = address.+ width
jb302@39 1669 \end_layout
jb302@39 1670
jb302@39 1671 \begin_layout Plain Layout
jb302@39 1672
jb302@39 1673
jb302@39 1674 \end_layout
jb302@39 1675
jb302@39 1676 \begin_layout Plain Layout
jb302@39 1677
jb302@39 1678 return file
jb302@39 1679 \end_layout
jb302@39 1680
jb302@39 1681 \end_inset
jb302@39 1682
jb302@39 1683
jb302@39 1684 \end_layout
jb302@39 1685
jb302@39 1686 \begin_layout Standard
jb302@39 1687 \begin_inset Newpage pagebreak
jb302@39 1688 \end_inset
jb302@39 1689
jb302@39 1690
jb302@39 1691 \end_layout
jb302@39 1692
jb302@39 1693 \begin_layout Subsubsection
jb302@39 1694 tokenize
jb302@39 1695 \end_layout
jb302@39 1696
jb302@39 1697 \begin_layout Standard
jb302@39 1698 \begin_inset Graphics
jb302@39 1699 filename /home/jmz/qm/ede/docs/img/asm/tokenize.svg
jb302@39 1700 display false
jb302@39 1701
jb302@39 1702 \end_inset
jb302@39 1703
jb302@39 1704
jb302@39 1705 \end_layout
jb302@39 1706
jb302@37 1707 \begin_layout Section
jb302@37 1708 Assembler Testing
jb302@37 1709 \end_layout
jb302@37 1710
jb302@41 1711 \begin_layout Standard
jb302@41 1712 The assembler was tested by assembling the entire instruction table, while
jb302@41 1713 at the same time testing labels and directives.
jb302@41 1714 The test file was assembled and then the binary and .dsm files were inspected
jb302@41 1715 manually by checking their size and content.
jb302@42 1716 None of this testing is automated and files are inspected by hand.
jb302@42 1717 The test files and results can be found in the Supporting Material.
jb302@41 1718 \end_layout
jb302@41 1719
jb302@37 1720 \end_body
jb302@37 1721 \end_document