summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmpen472hw12_McDonnell/Full_Chip_Simulation.ini2
-rw-r--r--cmpen472hw12_McDonnell/Sources/main.asm135
-rw-r--r--cmpen472hw12_McDonnell/bin/Project.absbin8626 -> 9702 bytes
-rw-r--r--cmpen472hw12_McDonnell/bin/Project.abs.s19104
-rw-r--r--cmpen472hw12_McDonnell/bin/main.dbg135
-rw-r--r--cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.obin8626 -> 9702 bytes
-rw-r--r--cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.sx104
-rw-r--r--cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdtbin65256 -> 65757 bytes
-rw-r--r--cmpen472hw12_McDonnell/example.txt4
9 files changed, 371 insertions, 113 deletions
diff --git a/cmpen472hw12_McDonnell/Full_Chip_Simulation.ini b/cmpen472hw12_McDonnell/Full_Chip_Simulation.ini
index dc0c4a5..13e0809 100644
--- a/cmpen472hw12_McDonnell/Full_Chip_Simulation.ini
+++ b/cmpen472hw12_McDonnell/Full_Chip_Simulation.ini
@@ -10,7 +10,7 @@ Target=sim
Layout=ASM_layout.hwl
LoadDialogOptions=AUTOERASEANDFLASH NORUNAFTERLOAD
CPU=HC12
-MainFrame=0,1,-1,-1,-1,-1,53,19,1873,1042
+MainFrame=0,1,-1,-1,-1,-1,564,142,2384,1131
Configuration=Full_Chip_Simulation.hwc
Statusbar=1
ShowToolbar=1
diff --git a/cmpen472hw12_McDonnell/Sources/main.asm b/cmpen472hw12_McDonnell/Sources/main.asm
index 18fc72b..a102cf5 100644
--- a/cmpen472hw12_McDonnell/Sources/main.asm
+++ b/cmpen472hw12_McDonnell/Sources/main.asm
@@ -151,9 +151,11 @@ CheckInput
cmpa #'Q' ; Compare A to 'Q'
lbeq cTypeWrite ; If A == 'Q', branch to cTypeWrite
cmpa #'M' ; Compare A to 'M'
- beq cMDCommand ; If A != 'M', Check if MD command
+ beq cMDCommand ; If A != 'M', Check if LD command
+ cmpa #'L' ; Compare A to 'L'
+ lbeq cLDCommand ; If A != 'L', Check if GO command
cmpa #'G' ; Compare A to 'G'
- beq cGoTo ; If A != 'G', Check if GO command
+ beq cGoTo ; If A != 'G', Check if L command
cmpa #'S' ; Compare A to 'S'
lbne cUnknownCMD ; If A != 'S', Command unknown
ldaa 0,x ; Load next character but don't increment
@@ -167,7 +169,7 @@ CheckInput
ldy lenBuf ; Loadd length of the buffer into Y
jsr Zeros ; Fill buffer with Zeros
pulx ; Restore X from the stack
- bra cDone ; branch always to cDone
+ lbra cDone ; branch always to cDone
cGoTo ldaa 1,x+ ; Load next character
cmpa #'O' ; Compare to 'O'
lbne cUnknownCMD ; If A != 'S', Command unknown
@@ -177,9 +179,36 @@ cGoTo ldaa 1,x+ ; Load next character
jsr ReadHex ; ReadHex to Read the memory Address
lbeq cBadAddr ; If Z == 1, branch to cBadAddr
jsr 0,y ; Launch address in Y
- bra cNoPrint ; Done with command
+ lbra cNoPrint ; Done with command
cMDCommand ldaa 1,x+ ; Load next character into A
cmpa #'D' ; Compare do 'D' character
+ lbne cUnknownCMD ; If A != 'D', unknown command
+ ldaa 0,x ; Load next character but don't increment
+ cmpa #'$' ; Compare A to '$'
+ lbne cUnknownCMD ; If A != '$', branch to unknown command
+ jsr ReadHex ; ReadHex to Read the memory Address
+ lbeq cBadAddr ; If Z == 1, branch to cBadAddr
+ exg Y,D ; Exchange Y and D
+ pshd ; Save D to the stack
+mSkipSpaces ldaa 1,x+ ; Load next character into A
+ lbeq cBadData ; If A == 0, branch to bad Data (no data given)
+ cmpa #' ' ; Compare A to space character
+ lbeq mSkipSpaces ; While A == ' ', loop to skip spaces
+ cmpa #'$' ; Compare A to '$'
+ lbne cBadData ; If A != '$', branch to cBadData
+ dex ; Decrement X by 1
+ jsr ReadHex ; Jump to ReadHex to read hex data
+ lbeq cBadData ; If Z == 1, branch to cBadData
+ puld ; Restore D from the stack
+ exg D,X ; Exchange D and X
+ pshd ; Save D to the stack, cBadData usually has 2 D's on the stack
+ cpy #2 ; Compare Y to 2
+ blo cBadData ; No distances below 2 bytes
+ puld ; Restore D from the stack
+ jsr MDCommand ; Jump to MDCommand
+ lbra cNoPrint ; Done with command
+cLDCommand ldaa 1,x+ ; Load next character into A
+ cmpa #'D' ; Compare do 'D' character
bne cUnknownCMD ; If A != 'D', unknown command
ldaa 0,x ; Load next character but don't increment
cmpa #'$' ; Compare A to '$'
@@ -188,10 +217,10 @@ cMDCommand ldaa 1,x+ ; Load next character into A
beq cBadAddr ; If Z == 1, branch to cBadAddr
exg Y,D ; Exchange Y and D
pshd ; Save D to the stack
-mSkipSpaces ldaa 1,x+ ; Load next character into A
+lSkipSpaces ldaa 1,x+ ; Load next character into A
beq cBadData ; If A == 0, branch to bad Data (no data given)
cmpa #' ' ; Compare A to space character
- beq mSkipSpaces ; While A == ' ', loop to skip spaces
+ beq lSkipSpaces ; While A == ' ', loop to skip spaces
cmpa #'$' ; Compare A to '$'
bne cBadData ; If A != '$', branch to cBadData
dex ; Decrement X by 1
@@ -200,10 +229,10 @@ mSkipSpaces ldaa 1,x+ ; Load next character into A
puld ; Restore D from the stack
exg D,X ; Exchange D and X
pshd ; Save D to the stack, cBadData usually has 2 D's on the stack
- cpy #2 ; Compare Y to 2
+ cpy #1 ; Compare Y to 1
blo cBadData ; No distances below 2 bytes
puld ; Restore D from the stack
- jsr MDCommand ; Jump to MDCommand
+ jsr LDCommand ; Jump to MDCommand
bra cNoPrint ; Done with command
cWrite ldaa 0,x ; Load next character but don't increment
cmpa #'$' ; Compare A to '$'
@@ -378,6 +407,79 @@ MDDone ldaa #CR ; Load CR into A
pulx ; Restore X from the stack
rts ; Return
+LDCommand
+ pshx ; Save X to the stack
+ pshy ; Save Y to the stack
+ pshd ; Save D to the stack
+ iny ; Add 1 to y for loop
+LDLoop dbeq y,LDDone ; Decrement y, y == 0, done
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #CR ; Compare to CR
+ bne NotNewline ; If A != CR, not newline
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #LF ; Compare to LF
+ bne NotNewline ; If not LF, skip next read
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+NotNewline jsr putchar ; Echo to serial
+ jsr IsValidHex ; Check if valid hex
+ beq LDInvalid ; If Z == 1, invalid
+ tab ; Transfer A to B
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #CR ; Compare to CR
+ bne NotNewline2 ; If A != CR, not newline
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #LF ; Compare to LF
+ bne NotNewline2 ; If not LF, skip next read
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+NotNewline2 jsr putchar ; Echo to serial
+ jsr IsValidHex ; Check if valid hex
+ beq LDInvalid ; If Z == 1, invalid
+ exg a,b ; Swap A and B
+ jsr ReadHexByte ; Read ASCII Hex into data
+ staa 1,x+ ; Store byte into memory
+ bra LDLoop ; Loop
+LDDone ldaa #CR ; Load CR into A
+ jsr putchar ; Print to serial
+ ldaa #LF ; Load LF into A
+ jsr putchar ; Print to serial
+ puld ; Restore D from the stack
+ puly ; Restore Y from the stack
+ pulx ; Restore X from the stack
+ rts ; Return
+LDInvalid ldaa #CR ; Load CR into A
+ jsr putchar ; Print to serial
+ ldaa #LF ; Load LF into A
+ jsr putchar ; Print to serial
+ ldx #badData ; Load the address of bad data string
+ jsr WriteString ; Write string to serial
+ puld ; Restore D from the stack
+ puly ; Restore Y from the stack
+ pulx ; Restore X from the stack
+ rts ; Return
+
+GetCharLoop
+ jsr getchar ; Read character from serial
+ beq GetCharLoop ; If 0, loop
+ rts ; Return
+
+IsValidHex
+ cmpa #'0' ; Compare A to '0'
+ blo InvalidHex ; A < '0', invalid
+ cmpa #'9' ; Compare A to '9'
+ bls ValidHex ; A <= '9', valid hex
+ cmpa #'A' ; Compare A to 'A'
+ blo InvalidHex ; A < 'A', invalid
+ cmpa #'F' ; Compare A to 'F'
+ bhi InvalidHex ; A > 'F', invalid
+ValidHex andcc #%11111011 ; Clear Zero Bit
+ rts ; Return
+InvalidHex orcc #%00000100 ; Set the Zero Bit
+ rts ; Return
+
;*************************************************************************
; ReadDecimal subroutine
;
@@ -577,6 +679,23 @@ PrintDone jsr putchar ; Print character to serial
puld ; Restore D from the stack
rts ; Return
+ReadHexByte
+ cmpa #'A' ; Compare A to 'A'
+ blo RHBNotHex ; If A < 'A', decimal number
+ suba #7 ; 'A' - '0' = 17, 'A' - '0' - 7 = 10 = $A
+RHBNotHex suba #'0' ; Remove offset
+ pshb ; Save B to the stack
+ ldab #16 ; 16 to shift digit to left
+ mul ; A * 16, left shift digit
+ tba ; Store result in A
+ pulb ; Restore B from stack
+ cmpb #'A' ; Compare B to 'A'
+ blo RHBNotHexB ; If B < 'A', decimal number
+ subb #7 ; 'A' - '0' = 17, 'A' - '0' - 7 = 10 = $A
+RHBNotHexB subb #'0' ; Remove offset
+ aba ; Add A to B
+ rts ; Return
+
;*************************************************************************
; PrintHexWord subroutine
;
diff --git a/cmpen472hw12_McDonnell/bin/Project.abs b/cmpen472hw12_McDonnell/bin/Project.abs
index adf48c0..dedfe7d 100644
--- a/cmpen472hw12_McDonnell/bin/Project.abs
+++ b/cmpen472hw12_McDonnell/bin/Project.abs
Binary files differ
diff --git a/cmpen472hw12_McDonnell/bin/Project.abs.s19 b/cmpen472hw12_McDonnell/bin/Project.abs.s19
index 45ff18d..5f86e88 100644
--- a/cmpen472hw12_McDonnell/bin/Project.abs.s19
+++ b/cmpen472hw12_McDonnell/bin/Project.abs.s19
@@ -1,52 +1,60 @@
S0590000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E343732687731325F4D63446F6E6E656C6C5C62696E5C50726F6A6563742E6162731C
S1233000000500000000000000000000000000000000000010000000000000000000000097
S10B3020000000000000001094
-S1233100CF310086FF5A03860C5ACBCC00015CC8CE35941634C0CE3002FD30131634B186BF
-S12331203E1634EB86201634EBCE3002FD30131634CCCE300216314C20DCCE35431634C008
-S12331401634F227FB1634EB5A0120F4343BA6308157182700828151182700CB814D274377
-S1233160814727248153182600B4A6008124182600AC16324018270092B7E534CE3002FD17
-S123318030131634B130207DA630814F1826008EA6008124182600861632401827006C1557
-S12331A0402065A63081442675A6008124266F1632402757B7E43BA6302759812027F881BD
-S12331C024265109163240274B3AB7C53B8D000225423A16328B2030A60081242640163210
-S12331E0402728B7E43BA630272A812027F881242708091632FB271C20060916324027142A
-S12332003AB7C56D001633283A303DCE34FB1634C03A303DCE35141634C03A3A303DCE35BC
-S12332202A1634C03A303DA630815526F1A630814926EBA630815426E5A63026E106313A37
-S12332403BCD0000E630C124263BE6302732C120272EC1302D2FC139220EC03037CC0010E7
-S123326013B7C63319ED20E2C1412D19C1462215C041CB0A37CC001013B7C63319ED20CA5D
-S123328087B7023A3D8604B7023A3D34353B3435B754CE3002FD30131634B1CD300216331E
-S12332A0ED86201634EB3130CC00008D0000273D0303E6301633B9E6301633B9B760840F44
-S12332C026E9860D1634EB860A1634EB8D0000271C3435B754CE3002FD30131634B1CD30D2
-S12332E0021633ED86201634EB313020BE860D1634EB860A1634EB3A31303D3BCD0000E625
-S123330030271AC1202716C1302D17C1392213C03037CC000A13B7C63319ED20E287B702AE
-S12333203A3D8604B7023A3D353BB7D4CD30021633EDB7C5863D1634EB863E1634EBEC00CF
-S1233340CE3002FD30131634B11633943686201634EB1634EB32CD30021633ED36862016B2
-S123336034EB1634EB32CE3002FD30131634B1CD300216345F860D1634EB860A1634EB3A19
-S1233380313D343536A67F27056A3020F8876A303231303D343B37180E86251634EBCE00AE
-S12333A01055B72084018B301634EB0405088E000826EE3320EB3A303D3B353487CE0010AF
-S12333C01810B750810A24048B3020048B41800A1634EB180F810A24048B3020048B418098
-S12333E00A1634EB86201634EB30313A3D343B358C000027533635348630CE3015CD0005F3
-S12334001634BA3031876A4032CE001018108E00002716C10A2D0ACB41C00A6B60B7D420C1
-S1233420E8CB306B60B7D420E08C000026E586246A60CE30151633821634C0FD3026CE300B
-S1233440151634B1313A303D86241634EB86301634EB1634EB1634EB1634EB313A303D340B
-S12334603B358C000027413635348630CE3015CD00051634BA3031876A4032CE000A1810E2
-S12334808E00002708CB306B60B7D420EE8C000026F3CE30151633821634C0FD3026CE302E
-S12334A0151634B1313A303D86301634EB313A303D36876A300436FB323D6A300436FB3D56
-S12334C036A63027051634EB20F7323D3635341634F227FB810D270A6A301634EB0327023E
-S12334E020ED860A1634EB3031323D4FCC80FC5ACF3D4FCC200396CF3D873D696E76616C6B
-S1233500696420696E7075742C20616464726573730D0A00696E76616C696420696E70757E
-S1233520742C20646174610D0A00696E76616C696420696E7075742C20636F6D6D616E64B4
-S12335400D0A0057656C636F6D6520746F2054797065205772697465722C20796F75206DEC
-S1233560617920747970652062656C6F772E0D0A5265737461727420746F20656E746572E7
-S1233580206D61696E206D656E7520616761696E2E0D0A00533A20202020202053686F773A
-S12335A02074686520636F6E74656E7473206F66206D656D6F7279206C6F636174696F6EF1
-S12335C020696E20776F72640D0A573A202020202020577269746520746865206461746186
-S12335E020776F726420286E6F7420627974652920746F206D656D6F7279206C6F63617466
-S1233600696F6E0D0A4D443A2020202020446973706C61792074686520636F6E74656E748C
-S123362073206F6620636F6E74696E756F7573206D656D6F7279206C6F636174696F6E7302
-S12336400D0A4C443A20202020204C6F6164206120626C6F636B206F662064617461207476
-S12336606F20636F6E74696E756F7573206D656D6F7279206C6F636174696F6E730D0A475D
-S12336804F3A202020202052756E207468652070726F6772616D20617420746865207370F6
-S12336A065636966696564206D656D6F7279206C6F636174696F6E0D0A515549543A202037
-S12336C0205175697420746865206D61696E2070726F6772616D2C2072756E205479706582
-S11636E0207772697465722070726F6772616D2E0D0A00B9
+S1233100CF310086FF5A03860C5ACBCC00015CC8CE368B1635B7CE3002FD30131635A886D7
+S12331203E1635E286201635E2CE3002FD30131635C3CE300216314C20DCCE363A1635B730
+S12331401635E927FB1635E25A0120F4343BA6308157182700D181511827011A814D274DDE
+S1233160814C1827008C814727268153182600FDA6008124182600F516328F182700DBB769
+S1233180E534CE3002FD30131635A830182000C4A630814F182600D5A6008124182600CDA4
+S12331A016328F182700B31540182000AAA6308144182600B8A6008124182600B016328F6A
+S12331C018270096B7E43BA6301827009681201827FFF481241826008A0916328F18270036
+S12331E0823AB7C53B8D000225793A1632DA18200065A63081442675A6008124266F1632D4
+S12332008F2757B7E43BA6302759812027F8812426510916328F274B3AB7C53B8D0001259F
+S1233220423A16334A2030A6008124264016328F2728B7E43BA630272A812027F8812427CB
+S123324008091633D8271C20060916328F27143AB7C56D001634053A303DCE35F21635B7A4
+S12332603A303DCE360B1635B73A3A303DCE36211635B73A303DA630815526F1A630814980
+S123328026EBA630815426E5A63026E106313A3BCD0000E630C124263BE6302732C120273A
+S12332A02EC1302D2FC139220EC03037CC001013B7C63319ED20E2C1412D19C1462215C051
+S12332C041CB0A37CC001013B7C63319ED20CA87B7023A3D8604B7023A3D34353B3435B7D9
+S12332E054CE3002FD30131635A8CD30021634E486201635E23130CC00008D0000273D0322
+S123330003E630163496E630163496B760840F26E9860D1635E2860A1635E28D0000271CB4
+S12333203435B754CE3002FD30131635A8CD30021634E486201635E2313020BE860D1635C5
+S1233340E2860A1635E23A31303D34353B020406491633BC810D26101635E21633BC810A73
+S123336026061635E21633BC1635E21633C22738180E1633BC810D26101635E21633BC81B2
+S12333800A26061635E21633BC1635E21633C22717B7811634CA6A3020B4860D1635E2864B
+S12333A00A1635E23A31303D860D1635E2860A1635E2CE360B1635B73A31303D1635E92739
+S12333C0FB3D8130250F81392308814125078146220310FB3D14043D3BCD0000E630271A11
+S12333E0C1202716C1302D17C1392213C03037CC000A13B7C63319ED20E287B7023A3D8642
+S123340004B7023A3D353BB7D4CD30021634E4B7C5863D1635E2863E1635E2EC00CE300203
+S1233420FD30131635A81634713686201635E21635E232CD30021634E43686201635E216E6
+S123344035E232CE3002FD30131635A8CD3002163556860D1635E2860A1635E23A313D34F3
+S12334603536A67F27056A3020F8876A303231303D343B37180E86251635E2CE001055B75B
+S12334802084018B301635E20405088E000826EE3320EB3A303D3B353487CE00101810B713
+S12334A050810A24048B3020048B41800A1635E2180F810A24048B3020048B41800A163549
+S12334C0E286201635E230313A3D814125028007803037C61012180F33C1412502C007C012
+S12334E03018063D343B358C000027533635348630CE3015CD00051635B13031876A403299
+S1233500CE001018108E00002716C10A2D0ACB41C00A6B60B7D420E8CB306B60B7D420E04F
+S12335208C000026E586246A60CE301516345F1635B7FD3026CE30151635A8313A303D8607
+S1233540241635E286301635E21635E21635E21635E2313A303D343B358C000027413635D1
+S1233560348630CE3015CD00051635B13031876A4032CE000A18108E00002708CB306B6035
+S1233580B7D420EE8C000026F3CE301516345F1635B7FD3026CE30151635A8313A303D8674
+S12335A0301635E2313A303D36876A300436FB323D6A300436FB3D36A63027051635E22046
+S12335C0F7323D3635341635E927FB810D270A6A301635E203270220ED860A1635E23031AF
+S12335E0323D4FCC80FC5ACF3D4FCC200396CF3D873D696E76616C696420696E7075742C54
+S123360020616464726573730D0A00696E76616C696420696E7075742C20646174610D0A55
+S123362000696E76616C696420696E7075742C20636F6D6D616E640D0A0057656C636F6DA6
+S12336406520746F2054797065205772697465722C20796F75206D6179207479706520622B
+S1233660656C6F772E0D0A5265737461727420746F20656E746572206D61696E206D656EFF
+S12336807520616761696E2E0D0A00533A20202020202053686F772074686520636F6E7429
+S12336A0656E7473206F66206D656D6F7279206C6F636174696F6E20696E20776F72640D45
+S12336C00A573A202020202020577269746520746865206461746120776F726420286E6F64
+S12336E07420627974652920746F206D656D6F7279206C6F636174696F6E0D0A4D443A201E
+S123370020202020446973706C61792074686520636F6E74656E7473206F6620636F6E7497
+S1233720696E756F7573206D656D6F7279206C6F636174696F6E730D0A4C443A20202020DC
+S1233740204C6F6164206120626C6F636B206F66206461746120746F20636F6E74696E7547
+S12337606F7573206D656D6F7279206C6F636174696F6E730D0A474F3A20202020205275FB
+S12337806E207468652070726F6772616D2061742074686520737065636966696564206D8F
+S12337A0656D6F7279206C6F636174696F6E0D0A515549543A202020517569742074686568
+S12337C0206D61696E2070726F6772616D2C2072756E205479706520777269746572207058
+S10D37E0726F6772616D2E0D0A000E
S9030000FC
diff --git a/cmpen472hw12_McDonnell/bin/main.dbg b/cmpen472hw12_McDonnell/bin/main.dbg
index dead2ce..0e16fc5 100644
--- a/cmpen472hw12_McDonnell/bin/main.dbg
+++ b/cmpen472hw12_McDonnell/bin/main.dbg
@@ -151,9 +151,11 @@ CheckInput
cmpa #'Q' ; Compare A to 'Q'
lbeq cTypeWrite ; If A == 'Q', branch to cTypeWrite
cmpa #'M' ; Compare A to 'M'
- beq cMDCommand ; If A != 'M', Check if MD command
+ beq cMDCommand ; If A != 'M', Check if LD command
+ cmpa #'L' ; Compare A to 'L'
+ lbeq cLDCommand ; If A != 'L', Check if GO command
cmpa #'G' ; Compare A to 'G'
- beq cGoTo ; If A != 'G', Check if GO command
+ beq cGoTo ; If A != 'G', Check if L command
cmpa #'S' ; Compare A to 'S'
lbne cUnknownCMD ; If A != 'S', Command unknown
ldaa 0,x ; Load next character but don't increment
@@ -167,7 +169,7 @@ CheckInput
ldy lenBuf ; Loadd length of the buffer into Y
jsr Zeros ; Fill buffer with Zeros
pulx ; Restore X from the stack
- bra cDone ; branch always to cDone
+ lbra cDone ; branch always to cDone
cGoTo ldaa 1,x+ ; Load next character
cmpa #'O' ; Compare to 'O'
lbne cUnknownCMD ; If A != 'S', Command unknown
@@ -177,9 +179,36 @@ cGoTo ldaa 1,x+ ; Load next character
jsr ReadHex ; ReadHex to Read the memory Address
lbeq cBadAddr ; If Z == 1, branch to cBadAddr
jsr 0,y ; Launch address in Y
- bra cNoPrint ; Done with command
+ lbra cNoPrint ; Done with command
cMDCommand ldaa 1,x+ ; Load next character into A
cmpa #'D' ; Compare do 'D' character
+ lbne cUnknownCMD ; If A != 'D', unknown command
+ ldaa 0,x ; Load next character but don't increment
+ cmpa #'$' ; Compare A to '$'
+ lbne cUnknownCMD ; If A != '$', branch to unknown command
+ jsr ReadHex ; ReadHex to Read the memory Address
+ lbeq cBadAddr ; If Z == 1, branch to cBadAddr
+ exg Y,D ; Exchange Y and D
+ pshd ; Save D to the stack
+mSkipSpaces ldaa 1,x+ ; Load next character into A
+ lbeq cBadData ; If A == 0, branch to bad Data (no data given)
+ cmpa #' ' ; Compare A to space character
+ lbeq mSkipSpaces ; While A == ' ', loop to skip spaces
+ cmpa #'$' ; Compare A to '$'
+ lbne cBadData ; If A != '$', branch to cBadData
+ dex ; Decrement X by 1
+ jsr ReadHex ; Jump to ReadHex to read hex data
+ lbeq cBadData ; If Z == 1, branch to cBadData
+ puld ; Restore D from the stack
+ exg D,X ; Exchange D and X
+ pshd ; Save D to the stack, cBadData usually has 2 D's on the stack
+ cpy #2 ; Compare Y to 2
+ blo cBadData ; No distances below 2 bytes
+ puld ; Restore D from the stack
+ jsr MDCommand ; Jump to MDCommand
+ lbra cNoPrint ; Done with command
+cLDCommand ldaa 1,x+ ; Load next character into A
+ cmpa #'D' ; Compare do 'D' character
bne cUnknownCMD ; If A != 'D', unknown command
ldaa 0,x ; Load next character but don't increment
cmpa #'$' ; Compare A to '$'
@@ -188,10 +217,10 @@ cMDCommand ldaa 1,x+ ; Load next character into A
beq cBadAddr ; If Z == 1, branch to cBadAddr
exg Y,D ; Exchange Y and D
pshd ; Save D to the stack
-mSkipSpaces ldaa 1,x+ ; Load next character into A
+lSkipSpaces ldaa 1,x+ ; Load next character into A
beq cBadData ; If A == 0, branch to bad Data (no data given)
cmpa #' ' ; Compare A to space character
- beq mSkipSpaces ; While A == ' ', loop to skip spaces
+ beq lSkipSpaces ; While A == ' ', loop to skip spaces
cmpa #'$' ; Compare A to '$'
bne cBadData ; If A != '$', branch to cBadData
dex ; Decrement X by 1
@@ -200,10 +229,10 @@ mSkipSpaces ldaa 1,x+ ; Load next character into A
puld ; Restore D from the stack
exg D,X ; Exchange D and X
pshd ; Save D to the stack, cBadData usually has 2 D's on the stack
- cpy #2 ; Compare Y to 2
+ cpy #1 ; Compare Y to 1
blo cBadData ; No distances below 2 bytes
puld ; Restore D from the stack
- jsr MDCommand ; Jump to MDCommand
+ jsr LDCommand ; Jump to MDCommand
bra cNoPrint ; Done with command
cWrite ldaa 0,x ; Load next character but don't increment
cmpa #'$' ; Compare A to '$'
@@ -378,6 +407,79 @@ MDDone ldaa #CR ; Load CR into A
pulx ; Restore X from the stack
rts ; Return
+LDCommand
+ pshx ; Save X to the stack
+ pshy ; Save Y to the stack
+ pshd ; Save D to the stack
+ iny ; Add 1 to y for loop
+LDLoop dbeq y,LDDone ; Decrement y, y == 0, done
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #CR ; Compare to CR
+ bne NotNewline ; If A != CR, not newline
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #LF ; Compare to LF
+ bne NotNewline ; If not LF, skip next read
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+NotNewline jsr putchar ; Echo to serial
+ jsr IsValidHex ; Check if valid hex
+ beq LDInvalid ; If Z == 1, invalid
+ tab ; Transfer A to B
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #CR ; Compare to CR
+ bne NotNewline2 ; If A != CR, not newline
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+ cmpa #LF ; Compare to LF
+ bne NotNewline2 ; If not LF, skip next read
+ jsr putchar ; Echo to serial
+ jsr GetCharLoop ; Read Character from serial
+NotNewline2 jsr putchar ; Echo to serial
+ jsr IsValidHex ; Check if valid hex
+ beq LDInvalid ; If Z == 1, invalid
+ exg a,b ; Swap A and B
+ jsr ReadHexByte ; Read ASCII Hex into data
+ staa 1,x+ ; Store byte into memory
+ bra LDLoop ; Loop
+LDDone ldaa #CR ; Load CR into A
+ jsr putchar ; Print to serial
+ ldaa #LF ; Load LF into A
+ jsr putchar ; Print to serial
+ puld ; Restore D from the stack
+ puly ; Restore Y from the stack
+ pulx ; Restore X from the stack
+ rts ; Return
+LDInvalid ldaa #CR ; Load CR into A
+ jsr putchar ; Print to serial
+ ldaa #LF ; Load LF into A
+ jsr putchar ; Print to serial
+ ldx #badData ; Load the address of bad data string
+ jsr WriteString ; Write string to serial
+ puld ; Restore D from the stack
+ puly ; Restore Y from the stack
+ pulx ; Restore X from the stack
+ rts ; Return
+
+GetCharLoop
+ jsr getchar ; Read character from serial
+ beq GetCharLoop ; If 0, loop
+ rts ; Return
+
+IsValidHex
+ cmpa #'0' ; Compare A to '0'
+ blo InvalidHex ; A < '0', invalid
+ cmpa #'9' ; Compare A to '9'
+ bls ValidHex ; A <= '9', valid hex
+ cmpa #'A' ; Compare A to 'A'
+ blo InvalidHex ; A < 'A', invalid
+ cmpa #'F' ; Compare A to 'F'
+ bhi InvalidHex ; A > 'F', invalid
+ValidHex andcc #%11111011 ; Clear Zero Bit
+ rts ; Return
+InvalidHex orcc #%00000100 ; Set the Zero Bit
+ rts ; Return
+
;*************************************************************************
; ReadDecimal subroutine
;
@@ -577,6 +679,23 @@ PrintDone jsr putchar ; Print character to serial
puld ; Restore D from the stack
rts ; Return
+ReadHexByte
+ cmpa #'A' ; Compare A to 'A'
+ blo RHBNotHex ; If A < 'A', decimal number
+ suba #7 ; 'A' - '0' = 17, 'A' - '0' - 7 = 10 = $A
+RHBNotHex suba #'0' ; Remove offset
+ pshb ; Save B to the stack
+ ldab #16 ; 16 to shift digit to left
+ mul ; A * 16, left shift digit
+ tba ; Store result in A
+ pulb ; Restore B from stack
+ cmpb #'A' ; Compare B to 'A'
+ blo RHBNotHexB ; If B < 'A', decimal number
+ subb #7 ; 'A' - '0' = 17, 'A' - '0' - 7 = 10 = $A
+RHBNotHexB subb #'0' ; Remove offset
+ aba ; Add A to B
+ rts ; Return
+
;*************************************************************************
; PrintHexWord subroutine
;
diff --git a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.o b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.o
index adf48c0..dedfe7d 100644
--- a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.o
+++ b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.o
Binary files differ
diff --git a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.sx b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.sx
index 593a0e6..48035c8 100644
--- a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.sx
+++ b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.sx
@@ -1,52 +1,60 @@
S0860000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E343732687731325F4D63446F6E6E656C6C5C636D70656E343732687731325F4D63446F6E6E656C6C5F446174615C5374616E646172645C4F626A656374436F64655C6D61696E2E61736D2E70726D71
S1233000000500000000000000000000000000000000000010000000000000000000000097
S10B3020000000000000001094
-S1233100CF310086FF5A03860C5ACBCC00015CC8CE35941634C0CE3002FD30131634B186BF
-S12331203E1634EB86201634EBCE3002FD30131634CCCE300216314C20DCCE35431634C008
-S12331401634F227FB1634EB5A0120F4343BA6308157182700828151182700CB814D274377
-S1233160814727248153182600B4A6008124182600AC16324018270092B7E534CE3002FD17
-S123318030131634B130207DA630814F1826008EA6008124182600861632401827006C1557
-S12331A0402065A63081442675A6008124266F1632402757B7E43BA6302759812027F881BD
-S12331C024265109163240274B3AB7C53B8D000225423A16328B2030A60081242640163210
-S12331E0402728B7E43BA630272A812027F881242708091632FB271C20060916324027142A
-S12332003AB7C56D001633283A303DCE34FB1634C03A303DCE35141634C03A3A303DCE35BC
-S12332202A1634C03A303DA630815526F1A630814926EBA630815426E5A63026E106313A37
-S12332403BCD0000E630C124263BE6302732C120272EC1302D2FC139220EC03037CC0010E7
-S123326013B7C63319ED20E2C1412D19C1462215C041CB0A37CC001013B7C63319ED20CA5D
-S123328087B7023A3D8604B7023A3D34353B3435B754CE3002FD30131634B1CD300216331E
-S12332A0ED86201634EB3130CC00008D0000273D0303E6301633B9E6301633B9B760840F44
-S12332C026E9860D1634EB860A1634EB8D0000271C3435B754CE3002FD30131634B1CD30D2
-S12332E0021633ED86201634EB313020BE860D1634EB860A1634EB3A31303D3BCD0000E625
-S123330030271AC1202716C1302D17C1392213C03037CC000A13B7C63319ED20E287B702AE
-S12333203A3D8604B7023A3D353BB7D4CD30021633EDB7C5863D1634EB863E1634EBEC00CF
-S1233340CE3002FD30131634B11633943686201634EB1634EB32CD30021633ED36862016B2
-S123336034EB1634EB32CE3002FD30131634B1CD300216345F860D1634EB860A1634EB3A19
-S1233380313D343536A67F27056A3020F8876A303231303D343B37180E86251634EBCE00AE
-S12333A01055B72084018B301634EB0405088E000826EE3320EB3A303D3B353487CE0010AF
-S12333C01810B750810A24048B3020048B41800A1634EB180F810A24048B3020048B418098
-S12333E00A1634EB86201634EB30313A3D343B358C000027533635348630CE3015CD0005F3
-S12334001634BA3031876A4032CE001018108E00002716C10A2D0ACB41C00A6B60B7D420C1
-S1233420E8CB306B60B7D420E08C000026E586246A60CE30151633821634C0FD3026CE300B
-S1233440151634B1313A303D86241634EB86301634EB1634EB1634EB1634EB313A303D340B
-S12334603B358C000027413635348630CE3015CD00051634BA3031876A4032CE000A1810E2
-S12334808E00002708CB306B60B7D420EE8C000026F3CE30151633821634C0FD3026CE302E
-S12334A0151634B1313A303D86301634EB313A303D36876A300436FB323D6A300436FB3D56
-S12334C036A63027051634EB20F7323D3635341634F227FB810D270A6A301634EB0327023E
-S12334E020ED860A1634EB3031323D4FCC80FC5ACF3D4FCC200396CF3D873D696E76616C6B
-S1233500696420696E7075742C20616464726573730D0A00696E76616C696420696E70757E
-S1233520742C20646174610D0A00696E76616C696420696E7075742C20636F6D6D616E64B4
-S12335400D0A0057656C636F6D6520746F2054797065205772697465722C20796F75206DEC
-S1233560617920747970652062656C6F772E0D0A5265737461727420746F20656E746572E7
-S1233580206D61696E206D656E7520616761696E2E0D0A00533A20202020202053686F773A
-S12335A02074686520636F6E74656E7473206F66206D656D6F7279206C6F636174696F6EF1
-S12335C020696E20776F72640D0A573A202020202020577269746520746865206461746186
-S12335E020776F726420286E6F7420627974652920746F206D656D6F7279206C6F63617466
-S1233600696F6E0D0A4D443A2020202020446973706C61792074686520636F6E74656E748C
-S123362073206F6620636F6E74696E756F7573206D656D6F7279206C6F636174696F6E7302
-S12336400D0A4C443A20202020204C6F6164206120626C6F636B206F662064617461207476
-S12336606F20636F6E74696E756F7573206D656D6F7279206C6F636174696F6E730D0A475D
-S12336804F3A202020202052756E207468652070726F6772616D20617420746865207370F6
-S12336A065636966696564206D656D6F7279206C6F636174696F6E0D0A515549543A202037
-S12336C0205175697420746865206D61696E2070726F6772616D2C2072756E205479706582
-S11636E0207772697465722070726F6772616D2E0D0A00B9
+S1233100CF310086FF5A03860C5ACBCC00015CC8CE368B1635B7CE3002FD30131635A886D7
+S12331203E1635E286201635E2CE3002FD30131635C3CE300216314C20DCCE363A1635B730
+S12331401635E927FB1635E25A0120F4343BA6308157182700D181511827011A814D274DDE
+S1233160814C1827008C814727268153182600FDA6008124182600F516328F182700DBB769
+S1233180E534CE3002FD30131635A830182000C4A630814F182600D5A6008124182600CDA4
+S12331A016328F182700B31540182000AAA6308144182600B8A6008124182600B016328F6A
+S12331C018270096B7E43BA6301827009681201827FFF481241826008A0916328F18270036
+S12331E0823AB7C53B8D000225793A1632DA18200065A63081442675A6008124266F1632D4
+S12332008F2757B7E43BA6302759812027F8812426510916328F274B3AB7C53B8D0001259F
+S1233220423A16334A2030A6008124264016328F2728B7E43BA630272A812027F8812427CB
+S123324008091633D8271C20060916328F27143AB7C56D001634053A303DCE35F21635B7A4
+S12332603A303DCE360B1635B73A3A303DCE36211635B73A303DA630815526F1A630814980
+S123328026EBA630815426E5A63026E106313A3BCD0000E630C124263BE6302732C120273A
+S12332A02EC1302D2FC139220EC03037CC001013B7C63319ED20E2C1412D19C1462215C051
+S12332C041CB0A37CC001013B7C63319ED20CA87B7023A3D8604B7023A3D34353B3435B7D9
+S12332E054CE3002FD30131635A8CD30021634E486201635E23130CC00008D0000273D0322
+S123330003E630163496E630163496B760840F26E9860D1635E2860A1635E28D0000271CB4
+S12333203435B754CE3002FD30131635A8CD30021634E486201635E2313020BE860D1635C5
+S1233340E2860A1635E23A31303D34353B020406491633BC810D26101635E21633BC810A73
+S123336026061635E21633BC1635E21633C22738180E1633BC810D26101635E21633BC81B2
+S12333800A26061635E21633BC1635E21633C22717B7811634CA6A3020B4860D1635E2864B
+S12333A00A1635E23A31303D860D1635E2860A1635E2CE360B1635B73A31303D1635E92739
+S12333C0FB3D8130250F81392308814125078146220310FB3D14043D3BCD0000E630271A11
+S12333E0C1202716C1302D17C1392213C03037CC000A13B7C63319ED20E287B7023A3D8642
+S123340004B7023A3D353BB7D4CD30021634E4B7C5863D1635E2863E1635E2EC00CE300203
+S1233420FD30131635A81634713686201635E21635E232CD30021634E43686201635E216E6
+S123344035E232CE3002FD30131635A8CD3002163556860D1635E2860A1635E23A313D34F3
+S12334603536A67F27056A3020F8876A303231303D343B37180E86251635E2CE001055B75B
+S12334802084018B301635E20405088E000826EE3320EB3A303D3B353487CE00101810B713
+S12334A050810A24048B3020048B41800A1635E2180F810A24048B3020048B41800A163549
+S12334C0E286201635E230313A3D814125028007803037C61012180F33C1412502C007C012
+S12334E03018063D343B358C000027533635348630CE3015CD00051635B13031876A403299
+S1233500CE001018108E00002716C10A2D0ACB41C00A6B60B7D420E8CB306B60B7D420E04F
+S12335208C000026E586246A60CE301516345F1635B7FD3026CE30151635A8313A303D8607
+S1233540241635E286301635E21635E21635E21635E2313A303D343B358C000027413635D1
+S1233560348630CE3015CD00051635B13031876A4032CE000A18108E00002708CB306B6035
+S1233580B7D420EE8C000026F3CE301516345F1635B7FD3026CE30151635A8313A303D8674
+S12335A0301635E2313A303D36876A300436FB323D6A300436FB3D36A63027051635E22046
+S12335C0F7323D3635341635E927FB810D270A6A301635E203270220ED860A1635E23031AF
+S12335E0323D4FCC80FC5ACF3D4FCC200396CF3D873D696E76616C696420696E7075742C54
+S123360020616464726573730D0A00696E76616C696420696E7075742C20646174610D0A55
+S123362000696E76616C696420696E7075742C20636F6D6D616E640D0A0057656C636F6DA6
+S12336406520746F2054797065205772697465722C20796F75206D6179207479706520622B
+S1233660656C6F772E0D0A5265737461727420746F20656E746572206D61696E206D656EFF
+S12336807520616761696E2E0D0A00533A20202020202053686F772074686520636F6E7429
+S12336A0656E7473206F66206D656D6F7279206C6F636174696F6E20696E20776F72640D45
+S12336C00A573A202020202020577269746520746865206461746120776F726420286E6F64
+S12336E07420627974652920746F206D656D6F7279206C6F636174696F6E0D0A4D443A201E
+S123370020202020446973706C61792074686520636F6E74656E7473206F6620636F6E7497
+S1233720696E756F7573206D656D6F7279206C6F636174696F6E730D0A4C443A20202020DC
+S1233740204C6F6164206120626C6F636B206F66206461746120746F20636F6E74696E7547
+S12337606F7573206D656D6F7279206C6F636174696F6E730D0A474F3A20202020205275FB
+S12337806E207468652070726F6772616D2061742074686520737065636966696564206D8F
+S12337A0656D6F7279206C6F636174696F6E0D0A515549543A202020517569742074686568
+S12337C0206D61696E2070726F6772616D2C2072756E205479706520777269746572207058
+S10D37E0726F6772616D2E0D0A000E
S9033100CB
diff --git a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt
index 9fadc43..49d76ad 100644
--- a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt
+++ b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt
Binary files differ
diff --git a/cmpen472hw12_McDonnell/example.txt b/cmpen472hw12_McDonnell/example.txt
new file mode 100644
index 0000000..3c7d4a0
--- /dev/null
+++ b/cmpen472hw12_McDonnell/example.txt
@@ -0,0 +1,4 @@
+LD$3E00 $0030
+43686F69CF3E00CE3E00A6300713A630
+070FA630070BA6300707A7A7A7A7A720
+F94FCC80FC5ACF3D0000000000000000 \ No newline at end of file