diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-04-20 17:15:55 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-04-20 17:15:55 -0400 |
| commit | 85f6bf15f2a4f64f546414c7fc221962ef0566b4 (patch) | |
| tree | fecea56b86e7ae6568136a80c13291afc3649e64 | |
| parent | ea6836839c2a91a299cea810aaf75b6c7230b428 (diff) | |
HW 12: Everything seems to work except when using input file
| -rw-r--r-- | cmpen472hw12_McDonnell/Full_Chip_Simulation.ini | 2 | ||||
| -rw-r--r-- | cmpen472hw12_McDonnell/Sources/main.asm | 135 | ||||
| -rw-r--r-- | cmpen472hw12_McDonnell/bin/Project.abs | bin | 8626 -> 9702 bytes | |||
| -rw-r--r-- | cmpen472hw12_McDonnell/bin/Project.abs.s19 | 104 | ||||
| -rw-r--r-- | cmpen472hw12_McDonnell/bin/main.dbg | 135 | ||||
| -rw-r--r-- | cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.o | bin | 8626 -> 9702 bytes | |||
| -rw-r--r-- | cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/ObjectCode/main.asm.sx | 104 | ||||
| -rw-r--r-- | cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt | bin | 65256 -> 65757 bytes | |||
| -rw-r--r-- | cmpen472hw12_McDonnell/example.txt | 4 |
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 Binary files differindex adf48c0..dedfe7d 100644 --- a/cmpen472hw12_McDonnell/bin/Project.abs +++ b/cmpen472hw12_McDonnell/bin/Project.abs 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 Binary files differindex 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 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 Binary files differindex 9fadc43..49d76ad 100644 --- a/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt +++ b/cmpen472hw12_McDonnell/cmpen472hw12_McDonnell_Data/Standard/TargetDataWindows.tdt 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 |
