diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-03-01 17:02:08 -0500 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-03-01 17:02:08 -0500 |
| commit | e4373e0997375ee6b0446d4362ede229f6b95c1c (patch) | |
| tree | bb79c9e2b74125766e9bbf8c32b6d3fada1e607d | |
| parent | 58fbe5dfa0b0b3dab5262b36807b91605d9f961a (diff) | |
HW7 Almost Done
30 files changed, 2287 insertions, 5 deletions
diff --git a/cmpen472hw6_McDonnell/Full_Chip_Simulation.ini b/cmpen472hw6_McDonnell/Full_Chip_Simulation.ini index a59351c..6541589 100644 --- a/cmpen472hw6_McDonnell/Full_Chip_Simulation.ini +++ b/cmpen472hw6_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,457,164,2377,1187 +MainFrame=0,1,-1,-1,-1,-1,268,153,2188,1176 Configuration=Full_Chip_Simulation.hwc Statusbar=1 ShowToolbar=1 diff --git a/cmpen472hw6_McDonnell/Sources/cmpen472hw6_McDonnell.asm b/cmpen472hw6_McDonnell/Sources/cmpen472hw6_McDonnell.asm new file mode 100644 index 0000000..5287ff0 --- /dev/null +++ b/cmpen472hw6_McDonnell/Sources/cmpen472hw6_McDonnell.asm @@ -0,0 +1,730 @@ +************************************************************************** +* +* Title: Memory Monitor +* +* Objective: CMPEN 472 Homework 6 +* +* Revision: V1.0 +* +* Date: Feb. 28, 2025 +* +* Programmer: Jacob McDonnell +* +* Company: The Pennsylvania State University +* Department of Computer Science and Engineering +* +* Algorithm: Simple Serial I/O, address poking and modifying +* +* Register Use: A & B to current byte, etc, +* X & Y holds address of strings and length of string, +* D to hold data and address of the memory location to work on. +* +* Memory Use: RAM Locations from $3000 for data, +* RAM Locations from $3100 for program +* +* Input: Serial Port for User Input +* +* Output: Serial Port for String Output +* Memory locations changed if modified by user +* +* Observation: This program will prompt the user to print the contents of a +* memory location and to modify the location with hexadecimal or +* decimal data. If the user wishes, they can type 'QUIT' to exit +* the memory monitor and enter the type writer program. +* +* Note: ON CSM-12C128 board, +* +* Comments: This program is developed and simulated using CodeWarrior +* development software and targeted for Axion +* Manufacturing's CSM-12C128 board running at 24MHz. +* +************************************************************************** +* Parameter Declearation Section +* +* Export Symbols + xdef pgstart ; export 'pgstart' symbol + absentry pgstart ; for assembly entry point + +* Symbols and Macros +PORTA equ $0000 ; i/o port A addresses +DDRA equ $0002 ; data direction register for PORTA +PORTB equ $0001 ; i/o port B addresses +DDRB equ $0003 ; data direction register for PORTB + +SCIBDH equ $00C8 ; Serial port (SCI) Baud Register H +SCIBDL equ $00C9 ; Serial port (SCI) Baud Register L +SCICR2 equ $00CB ; Serial port (SCI) Control Register 2 +SCISR1 equ $00CC ; Serial port (SCI) Status Register 1 +SCIDRL equ $00CF ; Serial port (SCI) Data Register + +CR equ $0d ; carriage return, ASCII 'Return' key +LF equ $0a ; line feed, ASCII 'next line' character +NULL equ $00 ; NULL Terminator character + +************************************************************************** +* Data Section: address used [ $3000 to $30FF ] RAM Memory +* + org $3000 ; Reserved RAM memory starting address + ; for Data for CMPEN 472 class +TESTER dc.w $0005 ; Memory location to test showing data + ; and writing data. + +buffer ds.b $0010 ; Array of 16 bytes to read a string + dc.b NULL ; NULL terminated +lenBuf dc.w $0010 ; Length of buffer array + +buffer2 ds.b $0010 ; Array of 16 bytes for reading and reversal + dc.b NULL ; NULL terminated +lenBuf2 dc.w $0010 ; length of buffer2 + +* +* There is a section Data Section at the end of the file +************************************************************************** +* Program Section: address used [ $3100 to $3FFF ] RAM Memory +* + org $3100 ; Program start address, in RAM +pgstart lds #$3100 ; initialize the stack pointer + + ldaa #%11110001 ; LED 1,2,3,4 at PORTB bit 4,5,6,7 + staa DDRB ; set PORTB bit 4,5,6,7 as output + + ldaa #$0C ; Enable SCI port Tx and Rx units + staa SCICR2 ; disable SCI interrupts + + ldd #$0001 ; Set SCI Baud Register = $0001 => 1.5M baud at 24MHz (for simulation) + std SCIBDH ; SCI port baud rate change + + ldx #msg ; Load the address of the welcome message into X + jsr WriteString ; Write the string to the serial console + +mainLoop + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr Zeros ; Fill the buffer with zeros + + ldaa #'>' ; Load '>' into A + jsr putchar ; Jump to putchar to write to console + ldaa #' ' ; Load space character into A + jsr putchar ; Jump to putchar to write to console + + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr ReadString ; Read a line from the serial console + + ldx #buffer ; Load the address of the buffer into X + jsr CheckInput ; Jump to CheckInput to parse the user input + bra mainLoop ; Loop back to mainLoop always +TypeWriter ldx #twMsg ; Load Type Writer welcome message address + jsr WriteString ; Jump to WriteString to write message to serial +twReadLoop jsr getchar ; Read Character from Serial + beq twReadLoop ; While Character == 0, branch to twReadLoop + jsr putchar ; Write Character back to terminal + staa PORTB ; Write Character to PORTB + bra twReadLoop ; Branch always to twReadLoop + +************************************************************************** +* Subroutine Section: address used [ $3100 to $3FFF ] RAM Memory +* + +;************************************************************************* +; CheckInput subroutine +; +; This subroutine will check the input string and match the option. +; +; Input: Address of null terminated string in X. +; Output: No Output, Control flow changed to proper subroutine. +; Registers in use: X for the address of the string, A & B to read characters from +; from the string. +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine will not return a value, it will jump to the proper subroutine +; based on the input given. If "QUIT" is the command, this subroutine will jump +; to TypeWriter which will not return and needs to be restarted to exit. +; + +CheckInput + pshx ; Save X to the stack + pshd ; Save D to the stack + ldaa 1,x+ ; Read Character from the string in X + cmpa #'W' ; Compare Character to 'W' + beq cWrite ; If A == 'W', branch to cWrite + cmpa #'Q' ; Compare A to 'Q' + beq cTypeWrite ; If A == 'Q', branch to cTypeWrite + cmpa #'S' ; Compare A to 'S' + bne cUnknownCMD ; If A != 'S', Command unknown + ldaa 0,x ; Load next character but don't increment + cmpa #'$' ; Compare A to '$' + bne cUnknownCMD ; If A != '$', branch to unknown command + jsr ReadHex ; ReadHex to Read the memory Address + beq cBadAddr ; If Z == 1, branch to cBadAddr + exg Y,X ; Exchange Y for X + pshx ; Save X to the stack + ldx #buffer ; Load address of buffer into X + 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 +cWrite ldaa 0,x ; Load next character but don't increment + cmpa #'$' ; Compare A to '$' + bne cUnknownCMD ; If A != '$', branch to unknown command + jsr ReadHex ; ReadHex to Read the memory Address + beq cBadAddr ; If Z == 1, branch to cBadAddr + exg Y,D ; Exchange Y and D + pshd ; Save D to the stack +skipSpaces 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 skipSpaces ; While A == ' ', loop to skip spaces + cmpa #'$' ; Compare A to '$' + beq cHexData ; If A == '$', branch to cHexData + dex ; Decrement X by 1 + jsr ReadDecimal ; Jump to ReadDecimal + beq cBadData ; If Z == 1, branch to cBadData + bra cWriteData ; Branch always to cWriteData +cHexData dex ; Decrement X by 1 + jsr ReadHex ; Jump to ReadHex to read hex data + beq cBadData ; If Z == 1, branch to cBadData +cWriteData puld ; Restore D from the stack + exg D,X ; Exchange D and X + sty x ; Write data in Y to memory in X +cDone jsr PrintMem ; Jump to PrintMem to print the contents of the location + puld ; Restore D from the stack + pulx ; Restore X from the stack + rts ; Return to caller +cBadAddr ldx #badAddr ; Load the address of badAddr into X + jsr WriteString ; Write badAddr to serial console + puld ; Restore D from the stack + pulx ; Restore X from the stack + rts ; Return to caller +cBadData ldx #badData ; Load the address of badData into X + jsr WriteString ; Write badData to serial console + puld ; Restore D from the stack + puld ; Restore D from the stack + pulx ; Restore X from the stack + rts ; Return to caller +cUnknownCMD ldx #badCom ; Load the address of badCom into X + jsr WriteString ; Write badCom to the serial console + puld ; Restore D from the stack + pulx ; Restore X from the stack + rts ; Return to caller +cTypeWrite ldaa 1,x+ ; Load next character from X + cmpa #'U' ; Compare A to 'U' + bne cUnknownCMD ; If A != 'U', branch to unknown command + ldaa 1,x+ ; Load next character from X + cmpa #'I' ; Compare A to 'I' + bne cUnknownCMD ; If A != 'I', branch to unknown command + ldaa 1,x+ ; Load next character from X + cmpa #'T' ; Compare A to 'T' + bne cUnknownCMD ; If A != 'T', branch to unknown command + ldaa 1,x+ ; Load next character from X + bne cUnknownCMD ; If A != 0, branch to unknown command + jmp TypeWriter ; Jump to TypeWriter + +;************************************************************************* +; ReadHex subroutine +; +; This subroutine will read an ASCII string of a number in hex and convert it to +; its value. +; +; Input: A memory address in register X. +; Output: The value of the hex number in the Y register, and any errors printed +; to the serial line. Zero bit is set if error occurs. +; Registers in use: X for the address of the contents and for a buffer while printing, +; D for multiplication, B for the character, Y for output value. +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine will return the value in the Y register, and if an error occurs, +; the Zero bit in the CCR will be set. +; + +ReadHex + pshd ; Save D to the stack + ldy #0 ; Clear Y register + ldab 1,x+ ; Read character from X into B, add 1 to X + cmpb #'$' ; Compare B to '$' + bne rHError ; If B != '$', jump to error, not hex data +rHLoop ldab 1,x+ ; Read Next character from X + beq rHDone ; If B == 0, exit loop + cmpb #' ' ; Compare B to space character + beq rHDone ; If B == ' ', exit loop + cmpb #'0' ; Compare B to '0' character + blt rHError ; If B < '0', bad address, exit loop + cmpb #'9' ; Compare B to '9' character + bhi rHAlpha ; If B > '9', check if 'A'-'F' characters + subb #'0' ; Subtract '0' from B to get true value + pshb ; Save B to the stack + ldd #16 ; load 16 into D + emul ; Multiply Y and D + exg d,y ; Transfer data from D to Y + pulb ; Restore b from the stack + aby ; Add B to Y + bra rHLoop ; Branch always to rHLoop +rHAlpha cmpb #'A' ; Compare B to 'A' character + blt rHError ; If B < 'A', bad address, exit loop + cmpb #'F' ; Compare B to 'F' character + bhi rHError ; If B > 'F', invalid data, error out + subb #'A' ; Subtract 'A' from B to get true value + addb #$A ; Add $A to B to account for offet + pshb ; Save B to the stack + ldd #16 ; load 16 into D + emul ; Multiply Y and D + exg d,y ; Transfer data from D to Y + pulb ; Restore b from the stack + aby ; Add B to Y + bra rHLoop ; Branch always to rHLoop +rHDone clra ; clear A accumulator + tap ; Transfer A into CCR to clear zero bit + puld ; Restore D from the stack + rts ; Return to caller +rHError ldaa #4 ; Load 4 into A to set zero bit in CCR + tap ; Transfer A into CCR to set zero bit and warn error + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; ReadDecimal subroutine +; +; This subroutine will read an ASCII string of a number in decimal and convert it to +; its value. +; +; Input: A memory address in register X. +; Output: The value of the number in the Y register, and any errors printed +; to the serial line. Zero bit is set if error occurs. +; Registers in use: X for the address of the contents and for a buffer while printing, +; D for multiplication, B for the character, Y for output value. +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine will return the value in the Y register, and if an error occurs, +; the Zero bit in the CCR will be set. +; + +ReadDecimal + pshd ; Save D to the stack + ldy #0 ; Clear Y register +dHLoop ldab 1,x+ ; Read Next character from X + beq dHDone ; If B == 0, exit loop + cmpb #' ' ; Compare B to space character + beq dHDone ; If B == ' ', exit loop + cmpb #'0' ; Compare B to '0' character + blt dHError ; If B < '0', bad address, exit loop + cmpb #'9' ; Compare B to '9' character + bhi dHError ; If B > '9', check if 'A'-'F' characters + subb #'0' ; Subtract '0' from B to get true value + pshb ; Save B to the stack + ldd #10 ; load 10 into D + emul ; Multiply Y and D + exg d,y ; Transfer data from D to Y + pulb ; Restore b from the stack + aby ; Add B to Y + bra dHLoop ; Branch always to rHLoop +dHDone clra ; clear A accumulator + tap ; Transfer A into CCR to clear zero bit + puld ; Restore D from the stack + rts ; Return to caller +dHError ldaa #4 ; Load 4 into A to set zero bit in CCR + tap ; Transfer A into CCR to set zero bit and warn error + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; PrintMem subroutine +; +; This subroutine will print the address and contents of the given memory location. +; +; Input: A memory address in register X. +; Output: The memory address in Hex and the contents in binary, hex, & decimal +; on the serial output. +; Registers in use: X for the address of the contents and for a buffer while printing, +; D for the contents of the location, Y for another buffer address while +; reversing strings and printing. +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires the serial console to be setup before calling. +; + +PrintMem + pshy ; Save Y to the Stack + pshd ; Save D to the Stack + exg x,d ; Copy Address from X to D to print + ldy #buffer ; Load the address of buffer into Y + jsr PrintHexWord ; Print the Address in Hex + exg d,x ; Copy Address from D to X + ldaa #'=' ; Load the '=' character into A + jsr putchar ; Print the character to the serial + ldaa #'>' ; Load the '>' character into A + jsr putchar ; Print the character to the serial + ldd x ; Load data from address in X into D + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr Zeros ; Fill the buffer with Zeros + jsr PrintBinaryWord ; Print the binary word to the serial + psha ; Save A to the stack + ldaa #' ' ; Load Space character into A + jsr putchar ; Print Space character to the serial + jsr putchar ; Print Space character to the serial + pula ; Restore A from the stack + ldy #buffer ; Load the address of the buffer into Y + jsr PrintHexWord ; Prin the hex representation of the word to serial + psha ; Save A to the stack + ldaa #' ' ; Load Space character into A + jsr putchar ; Print Space character to the serial + jsr putchar ; Print Space character to the serial + pula ; Restore A from the stack + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr Zeros ; Fill the buffer with Zeros + ldy #buffer ; Load the address of the buffer into Y + jsr PrintDecimalWord; Prin the decimal representation of the word to serial + ldaa #CR ; Load the carriage return character into A + jsr putchar ; Print the character to serial + ldaa #LF ; Load the line feed character into A + jsr putchar ; Print the character to serial + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller + +;************************************************************************* +; strrev subroutine +; +; This subroutine will reverse a string from one buffer into another. +; +; Input: Address of null terminated string in X, address of a large enough +; buffer in Y. +; Output: The string in X reversed in Y. +; Registers in use: X for the address of the string, Y for the address of the buffer, +; A to read characters from the string. +; Memory locations in use: Memory Address for serial line, address of the string & buffer +; +; Comments: This subroutine will not check that the output buffer is large enough, that +; is the job of the caller. +; + +strrev + pshx ; Save X to the stack + pshy ; Save Y to the stack + psha ; Save A to the stack +revLoop ldaa 1,y- ; Load Character from Y into A, decrement Y + beq revDone ; If Character is 0, exit loop + staa 1,x+ ; Save character in address in X, increment X + bra revLoop ; Loop back always + clra ; Set A to Zero +revDone staa 1,x+ ; Copy Null terminator into new string + pula ; Restore A from the stack + puly ; Restore Y from the stack + pulx ; Restore X from the stack + rts ; Return to caller + +;************************************************************************* +; PrintBinaryWord subroutine +; +; This subroutine will print a given word of data to the serial in binary. +; +; Input: 1 word of data in register D +; Output: Binary representation of the data on the serial console +; Registers in use: X to count the number of bits written, D for the input, A for characters, +; B for the byte being written. +; Memory locations in use: Memory addresses for serial. +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +PrintBinaryWord + pshx ; Save X to the stack + pshd ; Save D (A:B) to the stack + pshb ; Save B to the stack (we want these bits again later) + tab ; Transfer A to B to get upper byte + ldaa #'%' ; Load '%' into A + jsr putchar ; Print '%' to serial to denote binary number + ldx #16 ; Load 16 into X, since we're printing 16 bits +bPrintLoop rolb ; Rotate MSB of B into C of CCR + tpa ; Copy CCR into A + anda #1 ; and A with 1 to get only LSB + adda #'0' ; Add '0' to A to get ASCII Character + jsr putchar ; Print Character A to serial + dbeq X,bPrintDone ; Decrement X and if X == 0, branch to done + cpx #8 ; Compare X to 8 to check if done with upper byte + bne bPrintLoop ; If X != 8, loop to bPrintLoop + pulb ; Restore B from stack to get lower byte + bra bPrintLoop ; Branch back into loop to print lower byte +bPrintDone puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller + +;************************************************************************* +; PrintHexWord subroutine +; +; This subroutine will print a given word of data to the serial in binary. +; +; Input: 1 word of data in register D, Buffer Address in Y +; Output: Hexadecimal representation of the data on the serial console +; Registers in use: Y for the address of the buffer, X to count the number of bits +; written and for division, D for the input, A for characters. +; Memory locations in use: Memory addresses for serial. +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +PrintHexWord + pshx ; Save X to the stack + pshd ; Save D (A:B) to the stack + pshy ; Save Y to the stack + cpd #0 ; Compare D to zero + beq hIsZero ; Branch to hIsZero + psha ; Save A to the stack + pshy ; Save Y to the stack + pshx ; Save x to the stack + ldaa #'0' ; Load the '0' character into A + ldx #buffer2 ; Load the address of buffer2 into X + ldy #5 ; Load 5 into Y + jsr memset ; Write '0' to the first 5 bytes in buffer2 + pulx ; Restore X from the stack + puly ; Restore Y from the stack + clra ; Set A to zero + staa 0,y ; Load Zero into Y for Null Terminator + pula ; Restore A from the stack +hPrintLoop ldx #16 ; Load 16 in X for division + idiv ; Divide D / 16 to get Hex Digit + cpx #0 ; Compare X to 0 + beq hCheck ; If X == 0, branch to check D is zero +hDNotZero cmpb #$0A ; Compare A to $0A + blt hex10 ; If B < $A, branch to hex10 + addb #'A' ; Add 'A' to B to get ASCII Character + subb #$0A ; Subtract $A to adjust characters + stab 1,+y ; Save character from B to Y + exg X,D ; Swap values in X and D + bra hPrintLoop ; loop to hPrintLoop +hex10 addb #'0' ; Add '0' to B to get ASCII Character + stab 1,+y ; Save character from B to Y + exg X,D ; Swap values in X and D + bra hPrintLoop ; Loop to hPrintLoop +hCheck cpd #0 ; Compare D to 0 + bne hDNotZero ; If D != 0, branch back to hDNotZero +hPrintDone ldaa #'$' ; Load '$' into + staa 1,+y ; Save '$' into buffer in Y to denote Hex + ldx #buffer2 ; Load the address of buffer2 in X + jsr strrev ; Reverse string in Y in buffer in X + jsr WriteString ; Jump to write string to write the number + ldy lenBuf2 ; Load the length of buffer2 into Y + ldx #buffer2 ; Load the address of buffer2 into X + jsr Zeros ; Fill buffer2 with zeros + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller +hIsZero ldaa #'$' ; Load '$' character into A + jsr putchar ; Print character to the screen + ldaa #'0' ; Load '0' character into A + jsr putchar ; Print character to the screen + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller + +;************************************************************************* +; PrintDecimalWord subroutine +; +; This subroutine will print a given word of data to the serial in binary. +; +; Input: 1 word of data in register D, Buffer Address in Y +; Output: Decimal representation of the data on the serial console +; Registers in use: Y for the address of the buffer, X to count the number of bits +; written and for division, D for the input, A for characters. +; Memory locations in use: Memory addresses for serial. +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +PrintDecimalWord + pshx ; Save X to the stack + pshd ; Save D (A:B) to the stack + pshy ; Save Y to the stack + cpd #0 ; Compare D to zero + beq dIsZero ; Branch to hIsZero + psha ; Save A to the stack + pshy ; Save Y to the stack + pshx ; Save x to the stack + ldaa #'0' ; Load the '0' character into A + ldx #buffer2 ; Load the address of buffer2 into X + ldy #5 ; Load 5 into Y + jsr memset ; Write '0' to the first 5 bytes in buffer2 + pulx ; Restore X from the stack + puly ; Restore Y from the stack + clra ; Set A to zero + staa 0,y ; Load Zero into Y for Null Terminator + pula ; Restore A from the stack +dPrintLoop ldx #10 ; Load 10 in X for division + idiv ; Divide D / 10 to get Hex Digit + cpx #0 ; Compare X to 0 + beq dCheck ; If X == 0, branch to check D is zero +dDNotZero addb #'0' ; Add '0' to B to get ASCII Character + stab 1,+y ; Save character from B to Y + exg X,D ; Swap values in X and D + bra dPrintLoop ; Loop to hPrintLoop +dCheck cpd #0 ; Compare D to 0 + bne dDNotZero ; If D != 0, branch back to hDNotZero +dPrintDone ldx #buffer2 ; Load the address of buffer2 in X + jsr strrev ; Reverse string in Y in buffer in X + jsr WriteString ; Jump to write string to write the number + ldy lenBuf2 ; Load the length of buffer2 into Y + ldx #buffer2 ; Load the address of buffer2 into X + jsr Zeros ; Fill buffer2 with zeros + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller +dIsZero ldaa #'0' ; Load '0' character into A + jsr putchar ; Print character to the screen + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller + +;************************************************************************* +; Zeros subroutine +; +; This subroutine will write zeros to every byte in a given array. +; +; Input: Address of an array in X and its length in Y +; Output: Zeros in every byte of an array. +; Registers in use: X for the address of the array, Y for the length, and A for 0 +; Memory locations in use: Memory Address of the array +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +Zeros + psha ; Save A to the Stack + clra ; Clear A +zerosLoop staa 1,x+ ; Load A into byte at X + dbne y,zerosLoop ; Decrement Y and loop if Y != 0 + pula ; Restore A from the stack + rts ; Return to caller + +;************************************************************************* +; memset subroutine +; +; This subroutine will write a given byte to every byte in a given array. +; +; Input: Address of an array in X and its length in Y, the byte in A +; Output: The given byte in every byte of an array. +; Registers in use: X for the address of the array, Y for the length, and A for the given byte +; Memory locations in use: Memory Address of the array +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +memset + staa 1,x+ ; Load A into byte at X + dbne y,memset ; Decrement Y and loop if Y != 0 + rts ; Return to caller + +;************************************************************************* +; WriteString subroutine +; +; This subroutine will write a given null terminated string to the serial. +; +; Input: Address of null terminated string in X +; Output: Null terminated string written to serial +; Registers in use: X for the address of the string and A for the current byte +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +WriteString + psha ; Save A to the stack +writeLoop ldaa 1,x+ ; Load the byte at addr in X, then add 1 + beq doneWrite ; if A == 0, branch to doneWrite + jsr putchar ; Jump to putchar to write byte to serial + bra writeLoop ; branch always to writeLoop +doneWrite pula ; restore A from the stack + rts ; return to caller + +;************************************************************************* +; ReadString subroutine +; +; This subroutine will read a string from the serial line to a given address. +; +; Input: Address of an array in X +; Output: Null terminated string in the given array +; Registers in use: X for the address of the string Y for the length of the string, +; and A for the current byte +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires serial to be setup and getchar subroutine. +; + +ReadString + psha ; Save accumulator A to the stack + pshy ; Save Y to the stack + pshx ; Save X to the stack +readLoop jsr getchar ; Jump to putchar to write byte to serial + beq readLoop ; While A == 0, loop + cmpa #CR ; If A == CR, exit loop + beq doneRead ; Branch to doneRead if A == CR + staa 1,x+ ; Save the byte to the addr in X, then add 1 + jsr putchar ; Write Character back to the terminal + dey ; Decrement Y by 1 + beq doneRead ; If Y == 0, no more room, stop reading + bra readLoop ; branch always to readLoop +doneRead ldaa #LF ; Load Line Feed into A + jsr putchar ; Write LF to terminal + pulx ; Restore X from the stack + pulY ; Restore Y from the stack + pula ; restore A from the stack + rts ; return to caller + +;************************************************************************* +; putchar subroutine +; +; This subroutine writes a single byte to a serial line +; +; Input: A single ASCII byte in accumulator A +; Output: Sends one character to SCI port +; Registers in use: Accumulator A with input byte +; Memory locations in use: SCISR1 and SCIDRL status and data registers +; + +putchar brclr SCISR1,#%10000000,putchar ; wait for transmit buffer empty + staa SCIDRL ; send a character + rts ; Return to caller + +;************************************************************************* +; putchar subroutine +; +; This subroutine reads one byte from the SCI port +; +; Input: One byte from the SCI port +; Output: One byte in accumulator A +; Registers in use: Accumulator A for output byte +; Memory locations in use: SCISR1 and SCIDRL status and data registers +; + +getchar brclr SCISR1,#%00100000,getchar7 ; If no input on SCI port, return 0 + ldaa SCIDRL ; Read one byte from SCI port into A + rts ; Return to caller +getchar7 clra ; Set A to 0 + rts ; Return to caller + +* +************************************************************************** +* Data Section 2: address used [ $3100 to $3FFF ] RAM Memory +* + +badAddr dc.b 'invalid input, address',CR,LF,NULL ; Error message for bad address + +badData dc.b 'invalid input, data',CR,LF,NULL ; Error message for bad data + +badCom dc.b 'invalid input, command',CR,LF,NULL ; Error message for bad command + +; twMsg: welcome message when type writer loads +twMsg dc.b 'Welcome to Type Writer, you may type below.',CR,LF + dc.b 'Restart to enter main menu again.',CR,LF,NULL + + +; msg: this is the main option menu string +msg dc.b 'S: Show the contents of memory location in word',CR,LF + dc.b 'W: Write the data word (not byte) to memory location',CR,LF + dc.b 'QUIT: Quit the main program, run Type writer program.',CR,LF,NULL + + end ; last line of the file diff --git a/cmpen472hw6_McDonnell/Sources/main.asm b/cmpen472hw6_McDonnell/Sources/main.asm index e5656e9..5287ff0 100644 --- a/cmpen472hw6_McDonnell/Sources/main.asm +++ b/cmpen472hw6_McDonnell/Sources/main.asm @@ -6,7 +6,7 @@ * * Revision: V1.0 * -* Date: Mar. 1, 2025 +* Date: Feb. 28, 2025 * * Programmer: Jacob McDonnell * @@ -615,7 +615,7 @@ zerosLoop staa 1,x+ ; Load A into byte at X memset staa 1,x+ ; Load A into byte at X - dbne y,memset ; Decrement Y and loop if Y != 0 + dbne y,memset ; Decrement Y and loop if Y != 0 rts ; Return to caller ;************************************************************************* diff --git a/cmpen472hw6_McDonnell/bin/Project.abs b/cmpen472hw6_McDonnell/bin/Project.abs Binary files differindex 83bccdd..bbdc8c7 100644 --- a/cmpen472hw6_McDonnell/bin/Project.abs +++ b/cmpen472hw6_McDonnell/bin/Project.abs diff --git a/cmpen472hw6_McDonnell/bin/main.dbg b/cmpen472hw6_McDonnell/bin/main.dbg index 066f6eb..4d945dc 100644 --- a/cmpen472hw6_McDonnell/bin/main.dbg +++ b/cmpen472hw6_McDonnell/bin/main.dbg @@ -6,7 +6,7 @@ * * Revision: V1.0 * -* Date: Mar. 1, 2025 +* Date: Feb. 28, 2025 * * Programmer: Jacob McDonnell * @@ -615,7 +615,7 @@ zerosLoop staa 1,x+ ; Load A into byte at X memset staa 1,x+ ; Load A into byte at X - dbne y,memset ; Decrement Y and loop if Y != 0 + dbne y,memset ; Decrement Y and loop if Y != 0 rts ; Return to caller ;************************************************************************* diff --git a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell.mcp b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell.mcp Binary files differindex b8bca08..c36ca3d 100644 --- a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell.mcp +++ b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell.mcp diff --git a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/CWSettingsWindows.stg b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/CWSettingsWindows.stg Binary files differindex b7b7e30..f4fb317 100644 --- a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/CWSettingsWindows.stg +++ b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/CWSettingsWindows.stg diff --git a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/ObjectCode/main.asm.o b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/ObjectCode/main.asm.o Binary files differindex 83bccdd..bbdc8c7 100644 --- a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/ObjectCode/main.asm.o +++ b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/ObjectCode/main.asm.o diff --git a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/TargetDataWindows.tdt b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/TargetDataWindows.tdt Binary files differindex 94bdf6c..c2d5e3f 100644 --- a/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/TargetDataWindows.tdt +++ b/cmpen472hw6_McDonnell/cmpen472hw6_McDonnell_Data/Standard/TargetDataWindows.tdt diff --git a/cmpen472hw7_McDonnell/ASM_layout.hwl b/cmpen472hw7_McDonnell/ASM_layout.hwl new file mode 100644 index 0000000..83fc014 --- /dev/null +++ b/cmpen472hw7_McDonnell/ASM_layout.hwl @@ -0,0 +1,21 @@ +OPEN source 0 0 60 42 +Source < attributes TOOLTIP on,TOOLTIP_FORMAT signed,TOOLTIP_MODE details,FREEZE off,MARKS off +OPEN assembly 60 0 40 30 +Assembly < attributes ADR on,CODE off,ABSADR on,SYMB off,FORMAT Auto,FREEZE off,TOPPC 0x3287 +OPEN procedure 60 60 40 17 +Procedure < attributes VALUES on,TYPES off +OPEN register 60 30 40 30 +Register < attributes FORMAT AUTO,COMPLEMENT None +OPEN memory 60 77 40 23 +Memory < attributes FORMAT hex,COMPLEMENT None,WORD 1,ASC on,ADR on,MODE automatic,UPDATERATE 10,ADDRESS 0x80 +OPEN data 0 42 60 28 +Data < attributes SCOPE global,COMPLEMENT None,FORMAT Symb,MODE automatic,SORT NotSort,UPDATERATE 10,NAMEWIDTH 16 +OPEN command 0 70 60 30 +Command < attributes CACHESIZE 1000 +OPEN Terminal 22 20 65 68 +Terminal < attributes CACHESIZE 1000 +Terminal < attributes SCI_DEFAULT_TEXT "Virtual SCI",SCI_CONNECTION 0,1,SCI_CONNECTION 1,0,SCI_CONNECTION 1,3,SCI_CONNECTION 3,1,SCI_PORT COM1,SCI_BAUD 9600,SCI_SHOW_PROTOCOL OFF,SCI_VIRTUAL_IN "Sci:2.SerialOutput",SCI_VIRTUAL_OUT "Sci:2.SerialInput",SCI_FILENAME_IN "",SCI_FILENAME_OUT "" +bckcolor 50331647 +font 'Courier New' 9 BLACK +AUTOSIZE on +ACTIVATE "Assembly" "Memory" "Register" "Command" "Data" "Source" "Procedure" "Terminal" diff --git a/cmpen472hw7_McDonnell/Default.mem b/cmpen472hw7_McDonnell/Default.mem Binary files differnew file mode 100644 index 0000000..bf49148 --- /dev/null +++ b/cmpen472hw7_McDonnell/Default.mem diff --git a/cmpen472hw7_McDonnell/Full_Chip_Simulation.hwc b/cmpen472hw7_McDonnell/Full_Chip_Simulation.hwc new file mode 100644 index 0000000..f3ce7c9 --- /dev/null +++ b/cmpen472hw7_McDonnell/Full_Chip_Simulation.hwc @@ -0,0 +1 @@ +LOADMEM default.mem diff --git a/cmpen472hw7_McDonnell/Full_Chip_Simulation.ini b/cmpen472hw7_McDonnell/Full_Chip_Simulation.ini new file mode 100644 index 0000000..9b200fa --- /dev/null +++ b/cmpen472hw7_McDonnell/Full_Chip_Simulation.ini @@ -0,0 +1,42 @@ +[Environment Variables] +GENPATH={Project}Sources;{Compiler}lib\hc12c\src;{Compiler}lib\hc12c\include;{Compiler}lib\hc12c\lib;{Compiler}lib\xgatec\src;{Compiler}lib\xgatec\include;{Compiler}lib\xgatec\lib +LIBPATH={Compiler}lib\hc12c\include;{Compiler}lib\xgatec\include +OBJPATH={Project}bin +TEXTPATH={Project}bin +ABSPATH={Project}bin + +[HI-WAVE] +Target=sim +Layout=ASM_layout.hwl +LoadDialogOptions=AUTOERASEANDFLASH NORUNAFTERLOAD +CPU=HC12 +MainFrame=0,1,-1,-1,-1,-1,556,102,2213,1114 +TOOLBAR=57600 57601 32795 0 57635 57634 57637 0 57671 57669 0 32777 32776 32782 32780 32781 32778 0 32806 +Configuration=Full_Chip_Simulation.hwc +Statusbar=1 +ShowToolbar=1 +Smallborder=0 +Hideheadline=0 +Hidetitle=0 + + + + + + + + + +[Simulator] +CMDFILE0=CMDFILE STARTUP ON ".\cmd\Full_Chip_Simulation_startup.cmd" + +[Simulator HC12] +CMDFILE0=CMDFILE RESET ON ".\cmd\Full_Chip_Simulation_reset.cmd" +CMDFILE1=CMDFILE PRELOAD ON ".\cmd\Full_Chip_Simulation_preload.cmd" +CMDFILE2=CMDFILE POSTLOAD ON ".\cmd\Full_Chip_Simulation_postload.cmd" +CMDFILE3=CMDFILE SETCPU ON ".\cmd\Full_Chip_Simulation_setcpu.cmd" +HCS12_SUPPORT=1 +FCS=MC9S12C32 +ZEROTIMEATRESET=1 +OSCFREQUENCY=48000000 +DISPLAYTIME=0 diff --git a/cmpen472hw7_McDonnell/Sources/derivative.inc b/cmpen472hw7_McDonnell/Sources/derivative.inc new file mode 100644 index 0000000..988343b --- /dev/null +++ b/cmpen472hw7_McDonnell/Sources/derivative.inc @@ -0,0 +1,10 @@ + + ; Note: This file is recreated by the project wizard whenever the MCU is + ; changed and should not be edited by hand + ; + + ; include derivative specific macros + INCLUDE 'mc9s12c32.inc' + + + diff --git a/cmpen472hw7_McDonnell/Sources/main.asm b/cmpen472hw7_McDonnell/Sources/main.asm new file mode 100644 index 0000000..a85a1cc --- /dev/null +++ b/cmpen472hw7_McDonnell/Sources/main.asm @@ -0,0 +1,611 @@ +************************************************************************** +* +* Title: Calculator +* +* Objective: CMPEN 472 Homework 7 +* +* Revision: V1.0 +* +* Date: Mar. 7, 2025 +* +* Programmer: Jacob McDonnell +* +* Company: The Pennsylvania State University +* Department of Computer Science and Engineering +* +* Algorithm: Simple Serial I/O, address poking and modifying +* +* Register Use: A & B to current byte, etc, +* X & Y holds address of strings and length of string, +* D to hold data and address of the memory location to work on. +* +* Memory Use: RAM Locations from $3000 for data, +* RAM Locations from $3100 for program +* +* Input: Serial Port for User Input +* +* Output: Serial Port for String Output +* Memory locations changed if modified by user +* +* Observation: This program is a simple 16-bit calculator. The input can be +* any 4 digit positive decimal integer, the output can be negative. +* The +, -, *, and / operators are supported. Only two numbers at +* a time. +* +* Note: ON CSM-12C128 board, +* +* Comments: This program is developed and simulated using CodeWarrior +* development software and targeted for Axion +* Manufacturing's CSM-12C128 board running at 24MHz. +* +************************************************************************** +* Parameter Declearation Section +* +* Export Symbols + xdef pgstart ; export 'pgstart' symbol + absentry pgstart ; for assembly entry point + +* Symbols and Macros +PORTA equ $0000 ; i/o port A addresses +DDRA equ $0002 ; data direction register for PORTA +PORTB equ $0001 ; i/o port B addresses +DDRB equ $0003 ; data direction register for PORTB + +SCIBDH equ $00C8 ; Serial port (SCI) Baud Register H +SCIBDL equ $00C9 ; Serial port (SCI) Baud Register L +SCICR2 equ $00CB ; Serial port (SCI) Control Register 2 +SCISR1 equ $00CC ; Serial port (SCI) Status Register 1 +SCIDRL equ $00CF ; Serial port (SCI) Data Register + +CR equ $0d ; carriage return, ASCII 'Return' key +LF equ $0a ; line feed, ASCII 'next line' character +NULL equ $00 ; NULL Terminator character + +************************************************************************** +* Data Section: address used [ $3000 to $30FF ] RAM Memory +* + org $3000 ; Reserved RAM memory starting address + ; for Data for CMPEN 472 class +numBuf dc.w $0000 ; Memory location for addition and subtraction + ; in Solve subroutine + +operator dc.b $0000 ; Operator character for VerifyInput + +buffer ds.b $0010 ; Array of 16 bytes to read a string + dc.b NULL ; NULL terminated +lenBuf dc.w $0010 ; Length of buffer array + +buffer2 ds.b $0010 ; Array of 16 bytes for reading and reversal + dc.b NULL ; NULL terminated +lenBuf2 dc.w $0010 ; length of buffer2 + +* +* There is a section Data Section at the end of the file +************************************************************************** +* Program Section: address used [ $3100 to $3FFF ] RAM Memory +* + org $3100 ; Program start address, in RAM +pgstart lds #$3100 ; initialize the stack pointer + + ldaa #%11110001 ; LED 1,2,3,4 at PORTB bit 4,5,6,7 + staa DDRB ; set PORTB bit 4,5,6,7 as output + + ldaa #$0C ; Enable SCI port Tx and Rx units + staa SCICR2 ; disable SCI interrupts + + ldd #$0001 ; Set SCI Baud Register = $0001 => 1.5M baud at 24MHz (for simulation) + std SCIBDH ; SCI port baud rate change + + ldx #msg ; Load the address of the welcome message into X + jsr WriteString ; Write the string to the serial console + +mainLoop + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr Zeros ; Fill the buffer with zeros + + ldx #prompt ; Load Address of prompt string into X + jsr WriteString ; Write string to serial console + + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr ReadString ; Read a line from the serial console + + ldx #buffer ; Load the address of the buffer into X + jsr VerifyInput ; Verify user input + beq mainLoop ; Invalid input, jump back to loop + + ldx #buffer ; Load the address of the buffer into X + jsr Solve ; Jump to Solve to solve the user input + bra mainLoop ; Loop back to mainLoop always + +************************************************************************** +* Subroutine Section: address used [ $3100 to $3FFF ] RAM Memory +* + +;************************************************************************* +; Solve subroutine +; +; This subroutine will solve the math equation in the given string. +; +; Input: Address of null terminated string in X. +; Output: No Output, Control flow changed to proper subroutine. +; Registers in use: X for the address of the string, A & B to read characters from +; from the string. +; Memory locations in use: Memory Address for serial line, address of the string, numBuf word +; +; Comments: This subroutine EXPECTS the input to be valid. RUN VerifyInput BEFORE +; TO MAKE SURE THE STRING IS VALID, OTHERWISE THERE WILL BE ERRORS. +; + +Solve + pshy ; Save Y to the stack + pshd ; Save D to the stack + pshx ; Save X to the stack + jsr ReadDecimal ; Read First number + pshy ; Save Y to the stack + ldaa -1,x ; Read operator from X and save to A + jsr ReadDecimal ; Read First number + cmpa #'+' ; Compare A to '+' + beq sAdd ; Jump to sAdd to add the numbers + cmpa #'-' ; Compare A to '-' + beq sSub ; Jump to sSub to add the numbers + cmpa #'*' ; Compare A to '*' + beq sMul ; Jump to sMul to add the numbers + exg y,x ; Exchange X and Y + puly ; Restore Y from the stack + exg y,d ; Exchange Y and D + idiv ; Divide D/X => X + exg x,d ; Exchange X & D + bra sDone ; Jump to sDone +sAdd sty numBuf ; Save Y to numBuf + puly ; Restore Y from the stack + exg y,d ; Exchange Y and D + addd numBuf ; Add D and numBuf + andcc #%00000010 ; And CCR to read just Overflow bit + psha ; Save A to the stack + tpa ; transfer CCR to A + cmpa #2 ; Compare A to 2 to read overflow bit + beq sOverflow ; If overflow bit set, jump to sOverflow + pula ; Restore A from the stack + bra sDone ; Jump to sDone +sSub sty numBuf ; Save Y to numBuf + puly ; Restore Y from the stack + exg y,d ; Exchange Y and D + subd numBuf ; Subtract D and numBuf + andcc #%00000010 ; And CCR to read just Overflow bit + psha ; Save A to the stack + tpa ; transfer CCR to A + cmpa #2 ; Compare A to 2 to read overflow bit + beq sOverflow ; If overflow bit set, jump to sOverflow + pula ; Restore A from the stack + bra sDone ; Jump to sDone +sMul exg y,d ; Exchange Y and D + puly ; Restore Y from the stack + emul ; Multiply Y*D => Y:D + cpy #0 ; Compare Y to 0 + bne sOverflow ; If Y != 0, Overflow +sDone pulx ; Restore X from the stack + jsr WriteString ; Write original equation to serial console + psha ; Save A to the stack + ldaa #'=' ; Load '=' into A + jsr putchar ; Print '=' to serial console + pula ; Restore A from the stack + ldy #buffer ; Load address of buffer into Y + jsr PrintDecimalWord; Print the answer to the Serial console + ldaa #CR ; Load CR into A + jsr putchar ; Jump to putchar to write CR + ldaa #LF ; Load LF into A + jsr putchar ; Jump to putchar to write CR + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller +sOverflow pulx ; Restore X from the stack + pshx ; Save X to the stack + jsr WriteString ; Write original string to serial console + ldaa #CR ; Load CR into A + jsr putchar ; Jump to putchar to write CR + ldaa #LF ; Load LF into A + jsr putchar ; Jump to putchar to write CR + ldx #overflow ; Load address of overflow string into X + jsr WriteString ; Write overflow string to serial + pulx ; Restore X from the stack + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller + +;************************************************************************* +; VerifyInput subroutine +; +; This subroutine will verify the user input is valid. +; +; Input: An address of a Null terminated string in register X. +; Output: If valid Zero bit = 0 in CCR, if invalid, Zero bit = 1 +; and the string is outputed up to the error on the serial +; console with an error message. +; Registers in use: X for the address of the string, A for reading characters. +; Y to count the number of digits in a number, & B to count the number of numbers +; Memory locations in use: Memory Address for serial line, address of the string, 1 byte for operator +; +; Comments: This subroutine will modify the user string if invalid. +; + +VerifyInput + pshy ; Save Y to the stack + pshd ; Save D to the stack + pshx ; Save X to the stack + clrb ; Set B to Zero + stab operator ; Clear operator + ldy #0 ; Load Zero into Y +vNumLoop ldaa 1,x+ ; Load character from X into A + cmpa #'9' ; Compare A to '9' + bhi vInvalid ; If A > '9', not valid string + cmpa #'0' ; Compare A to '0' + blt vIsOp ; If A < '0', check if operator + iny ; Increment Y by 1 to count numbers + cpy #4 ; Compare Y to 4 + bhi vInvalid ; If greater than 4, invalid + bra vNumLoop ; Loop back to check for more digits +vIsOp cmpa #'+' ; Compare A to '+' + beq vOp ; This is an operator + cmpa #'-' ; Compare A to '-' + beq vOp ; This is an operator + cmpa #'*' ; Compare A to '*' + beq vOp ; This is an operator + cmpa #'/' ; Compare A to '/' + beq vOp ; This is an operator + cmpa #NULL ; Compare A to NULL character + beq vEndOfLine ; Check if end of line +vInvalid clra ; Set A to zero + staa 0,X ; Write Null terminator to X + pulx ; Restore X from the stack + pshx ; Save X to the stack + jsr WriteString ; Write invalid string to serial console + ldaa #CR ; Load CR into A + jsr putchar ; Jump to putchar to write the character + ldaa #LF ; Load LF into A + jsr putchar ; Jump to putchar to write the character + ldx #invalidStr ; Load address of invalid string into X + jsr WriteString ; Write invalid string to serial console + ldaa #4 ; Load 4 into A to set zero bit + tap ; Transfer A to CCR + pulx ; Restore X from the stack + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller +vOp staa operator ; Store operator in operator buffer + ldaa -2,x ; Load previous character into A + cmpa #'0' ; Compare A to '0' + blt vInvalid ; Invalid string since previous is not number + cmpa #'9' ; Compare A to '9' + bhi vInvalid ; Invalid string since previous is not number + addb #1 ; Increment B by 1 + cmpb #1 ; Compare B to 1 + bhi vInvalid ; Invalid string since B > 1 and we have another operator + ldy #0 ; Set Y to 0 + bra vNumLoop ; Check for next number +vEndOfLine ldaa -2,x ; Load previous character into A + cmpa #'0' ; Compare A to '0' + blt vInvalid ; Invalid string since previous is not number + cmpa #'9' ; Compare A to '9' + bhi vInvalid ; Invalid string since previous is not number + ldaa operator ; Load operator character from buffer + beq vInvalid ; If operator buffer is zero, invalid + clra ; Set A to zero + tap ; Transfer A to CCR + pulx ; Restore X from the stack + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller + +;************************************************************************* +; ReadDecimal subroutine +; +; This subroutine will read an ASCII string of a number in decimal and convert it to +; its value. +; +; Input: A memory address in register X. +; Output: The value of the number in the Y register, and any errors printed +; to the serial line. Zero bit is set if error occurs. +; Registers in use: X for the address of the contents and for a buffer while printing, +; D for multiplication, B for the character, Y for output value. +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine will return the value in the Y register, and if an error occurs, +; the Zero bit in the CCR will be set. +; + +ReadDecimal + pshd ; Save D to the stack + ldy #0 ; Clear Y register +dHLoop ldab 1,x+ ; Read Next character from X + beq dHDone ; If B == 0, exit loop + cmpb #'+' ; Compare B to '+' + beq dHDone ; If B == '+', end of number + cmpb #'-' ; Compare B to '-' + beq dHDone ; If B == '-', end of number + cmpb #'*' ; Compare B to '*' + beq dHDone ; If B == '+', end of number + cmpb #'/' ; Compare B to '/' + beq dHDone ; If B == '-', end of number + cmpb #' ' ; Compare B to space character + beq dHDone ; If B == ' ', exit loop + cmpb #'0' ; Compare B to '0' character + blt dHError ; If B < '0', bad address, exit loop + cmpb #'9' ; Compare B to '9' character + bhi dHError ; If B > '9', check if 'A'-'F' characters + subb #'0' ; Subtract '0' from B to get true value + pshb ; Save B to the stack + ldd #10 ; load 10 into D + emul ; Multiply Y and D + exg d,y ; Transfer data from D to Y + pulb ; Restore b from the stack + aby ; Add B to Y + bra dHLoop ; Branch always to rHLoop +dHDone clra ; clear A accumulator + tap ; Transfer A into CCR to clear zero bit + puld ; Restore D from the stack + rts ; Return to caller +dHError ldaa #4 ; Load 4 into A to set zero bit in CCR + tap ; Transfer A into CCR to set zero bit and warn error + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; strrev subroutine +; +; This subroutine will reverse a string from one buffer into another. +; +; Input: Address of null terminated string in X, address of a large enough +; buffer in Y. +; Output: The string in X reversed in Y. +; Registers in use: X for the address of the string, Y for the address of the buffer, +; A to read characters from the string. +; Memory locations in use: Memory Address for serial line, address of the string & buffer +; +; Comments: This subroutine will not check that the output buffer is large enough, that +; is the job of the caller. +; + +strrev + pshx ; Save X to the stack + pshy ; Save Y to the stack + psha ; Save A to the stack +revLoop ldaa 1,y- ; Load Character from Y into A, decrement Y + beq revDone ; If Character is 0, exit loop + staa 1,x+ ; Save character in address in X, increment X + bra revLoop ; Loop back always + clra ; Set A to Zero +revDone staa 1,x+ ; Copy Null terminator into new string + pula ; Restore A from the stack + puly ; Restore Y from the stack + pulx ; Restore X from the stack + rts ; Return to caller + +;************************************************************************* +; PrintDecimalWord subroutine +; +; This subroutine will print a given word of data to the serial in binary. +; +; Input: 1 word of data in register D, Buffer Address in Y +; Output: Decimal representation of the data on the serial console +; Registers in use: Y for the address of the buffer, X to count the number of bits +; written and for division, D for the input, A for characters. +; Memory locations in use: Memory addresses for serial, and operator to hold sign +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +PrintDecimalWord + pshx ; Save X to the stack + pshd ; Save D (A:B) to the stack + pshy ; Save Y to the stack + cpd #0 ; Compare D to zero + beq dIsZero ; Branch to hIsZero + blt dIsNegative ; If D < 0, Jump to dIsNegative +dAfterNeg psha ; Save A to the stack + pshy ; Save Y to the stack + pshx ; Save x to the stack + ldaa #'0' ; Load the '0' character into A + ldx #buffer2 ; Load the address of buffer2 into X + ldy #5 ; Load 5 into Y + jsr memset ; Write '0' to the first 5 bytes in buffer2 + pulx ; Restore X from the stack + puly ; Restore Y from the stack + clra ; Set A to zero + staa 0,y ; Load Zero into Y for Null Terminator + pula ; Restore A from the stack +dPrintLoop ldx #10 ; Load 10 in X for division + idiv ; Divide D / 10 to get Hex Digit + cpx #0 ; Compare X to 0 + beq dCheck ; If X == 0, branch to check D is zero +dDNotZero addb #'0' ; Add '0' to B to get ASCII Character + stab 1,+y ; Save character from B to Y + exg X,D ; Swap values in X and D + bra dPrintLoop ; Loop to hPrintLoop +dCheck cpd #0 ; Compare D to 0 + bne dDNotZero ; If D != 0, branch back to hDNotZero +dPrintDone ldaa operator ; Load operator into A to see if negative + cmpa #'-' ; Compare A to '-' + bne dNotNeg ; If A != '-', jump to dNotNeg + staa 1,+y ; Save '-' into buffer +dNotNeg ldx #buffer2 ; Load the address of buffer2 in X + jsr strrev ; Reverse string in Y in buffer in X + jsr WriteString ; Jump to write string to write the number + ldy lenBuf2 ; Load the length of buffer2 into Y + ldx #buffer2 ; Load the address of buffer2 into X + jsr Zeros ; Fill buffer2 with zeros + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller +dIsZero ldaa #'0' ; Load '0' character into A + jsr putchar ; Print character to the screen + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller +dIsNegative psha ; Save A to the stack + ldaa #'-' ; Load '-' into A + staa operator ; Save '-' to operator buffer + pula ; Restore A from the stack + nega ; Two's complement of A + suba #1 ; Subtract 1 from A + negb ; Two'complement of B + subb #1 ; Subtract 1 from B + addd #1 ; Add 1 to D + bra dAfterNeg ; Jump back to dAfterNeg + +;************************************************************************* +; Zeros subroutine +; +; This subroutine will write zeros to every byte in a given array. +; +; Input: Address of an array in X and its length in Y +; Output: Zeros in every byte of an array. +; Registers in use: X for the address of the array, Y for the length, and A for 0 +; Memory locations in use: Memory Address of the array +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +Zeros + psha ; Save A to the Stack + clra ; Clear A +zerosLoop staa 1,x+ ; Load A into byte at X + dbne y,zerosLoop ; Decrement Y and loop if Y != 0 + pula ; Restore A from the stack + rts ; Return to caller + +;************************************************************************* +; memset subroutine +; +; This subroutine will write a given byte to every byte in a given array. +; +; Input: Address of an array in X and its length in Y, the byte in A +; Output: The given byte in every byte of an array. +; Registers in use: X for the address of the array, Y for the length, and A for the given byte +; Memory locations in use: Memory Address of the array +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +memset + staa 1,x+ ; Load A into byte at X + dbne y,memset ; Decrement Y and loop if Y != 0 + rts ; Return to caller + +;************************************************************************* +; WriteString subroutine +; +; This subroutine will write a given null terminated string to the serial. +; +; Input: Address of null terminated string in X +; Output: Null terminated string written to serial +; Registers in use: X for the address of the string and A for the current byte +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +WriteString + psha ; Save A to the stack +writeLoop ldaa 1,x+ ; Load the byte at addr in X, then add 1 + beq doneWrite ; if A == 0, branch to doneWrite + jsr putchar ; Jump to putchar to write byte to serial + bra writeLoop ; branch always to writeLoop +doneWrite pula ; restore A from the stack + rts ; return to caller + +;************************************************************************* +; ReadString subroutine +; +; This subroutine will read a string from the serial line to a given address. +; +; Input: Address of an array in X +; Output: Null terminated string in the given array +; Registers in use: X for the address of the string Y for the length of the string, +; and A for the current byte +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires serial to be setup and getchar subroutine. +; + +ReadString + psha ; Save accumulator A to the stack + pshy ; Save Y to the stack + pshx ; Save X to the stack +readLoop jsr getchar ; Jump to putchar to write byte to serial + beq readLoop ; While A == 0, loop + cmpa #CR ; If A == CR, exit loop + beq doneRead ; Branch to doneRead if A == CR + staa 1,x+ ; Save the byte to the addr in X, then add 1 + jsr putchar ; Write Character back to the terminal + dey ; Decrement Y by 1 + beq doneRead ; If Y == 0, no more room, stop reading + bra readLoop ; branch always to readLoop +doneRead ldaa #LF ; Load Line Feed into A + jsr putchar ; Write LF to terminal + pulx ; Restore X from the stack + pulY ; Restore Y from the stack + pula ; restore A from the stack + rts ; return to caller + +;************************************************************************* +; putchar subroutine +; +; This subroutine writes a single byte to a serial line +; +; Input: A single ASCII byte in accumulator A +; Output: Sends one character to SCI port +; Registers in use: Accumulator A with input byte +; Memory locations in use: SCISR1 and SCIDRL status and data registers +; + +putchar brclr SCISR1,#%10000000,putchar ; wait for transmit buffer empty + staa SCIDRL ; send a character + rts ; Return to caller + +;************************************************************************* +; putchar subroutine +; +; This subroutine reads one byte from the SCI port +; +; Input: One byte from the SCI port +; Output: One byte in accumulator A +; Registers in use: Accumulator A for output byte +; Memory locations in use: SCISR1 and SCIDRL status and data registers +; + +getchar brclr SCISR1,#%00100000,getchar7 ; If no input on SCI port, return 0 + ldaa SCIDRL ; Read one byte from SCI port into A + rts ; Return to caller +getchar7 clra ; Set A to 0 + rts ; Return to caller + +* +************************************************************************** +* Data Section 2: address used [ $3100 to $3FFF ] RAM Memory +* + +invalidStr dc.b 'Invalid input format',CR,LF,NULL ; Invalid input error message + +prompt dc.b 'Ecalc> ',NULL ; Prompt string for calculator + +overflow dc.b 'Overflow Error',CR,LF,NULL ; Overflow error message + +; msg: this is the main option menu string +msg dc.b 'Rules for Calculator:',CR,LF + dc.b '1) Input positive decimal integer numbers only',CR,LF + dc.b '2) Input and output maximum four digit numbers only',CR,LF + dc.b '3) Valid operators are: +, -, *, and /',CR,LF + dc.b '4) Input number with leading zero is OK',CR,LF + dc.b '5) Input only two numbers and one operator in between, no spaces',CR,LF + dc.b '6) Show Ecalc> prompt and echo print user keystrokes unltil Return key',CR,LF + dc.b '7) Repeat print user input and print answer after the = sign',CR,LF + dc.b '8) In case of an invalid input format, repeat print the user input until the error character',CR,LF + dc.b '9) In case of an invalid input format, print error message on the next line: Invalid input format',CR,LF + dc.b '10) Keep 16bit internal binary number format, detect and flag overflow error',CR,LF + dc.b '11) Use integer division and truncate any fraction',CR,LF,NULL + + end ; last line of the file diff --git a/cmpen472hw7_McDonnell/bin/Project.abs b/cmpen472hw7_McDonnell/bin/Project.abs Binary files differnew file mode 100644 index 0000000..6d2d9d3 --- /dev/null +++ b/cmpen472hw7_McDonnell/bin/Project.abs diff --git a/cmpen472hw7_McDonnell/bin/Project.abs.phy b/cmpen472hw7_McDonnell/bin/Project.abs.phy new file mode 100644 index 0000000..e120fa3 --- /dev/null +++ b/cmpen472hw7_McDonnell/bin/Project.abs.phy @@ -0,0 +1,2 @@ +S0580000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E3437326877375F4D63446F6E6E656C6C5C62696E5C50726F6A6563742E61627349 +S9030000FC diff --git a/cmpen472hw7_McDonnell/bin/Project.abs.s19 b/cmpen472hw7_McDonnell/bin/Project.abs.s19 new file mode 100644 index 0000000..45b3fbd --- /dev/null +++ b/cmpen472hw7_McDonnell/bin/Project.abs.s19 @@ -0,0 +1,47 @@ +S0580000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E3437326877375F4D63446F6E6E656C6C5C62696E5C50726F6A6563742E61627349 +S123300000000000000000000000000000000000000000000010000000000000000000009C +S10C302000000000000000001093 +S1233100CF310086F15A03860C5ACBCC00015CC8CE3381163316CE3003FD3014163307CEEE +S12331203368163316CE3003FD3014163322CE30031631CB27E0CE300316313E20D8353BDC +S12331403416324935A61F163249812B2713812D2724812A2735B7E531B7E41810B7D420FA +S1233160337D300031B7E4F33000100236B7208102273F32201E7D300031B7E4B330001098 +S12331800236B7208102272A322009B7E431138D0000261E3016331636863D16334132CD2C +S12331A03003163298860D163341860A1633413A313D3034163316860D163341860A163360 +S12331C041CE3370163316303A313D353B34C77B3002CD0000A6308139222081302D080263 +S12331E08D0004221620EE812B2730812D272C812A2728812F272481002738876A003034C6 +S1233200163316860D163341860A163341CE33511633168604B702303A313D7A3002A61ED8 +S123322081302DD7813922D3CB01C10122CDCD000020A2A61E81302DC2813922BEB6300234 +S123324027B987B702303A313D3BCD0000E630272AC12B2726C12D2722C12A271EC12F274C +S12332601AC1202716C1302D17C1392213C03037CC000A13B7C63319ED20D287B7023A3D3F +S12332808604B7023A3D343536A67F27056A3020F8876A303231303D343B358C0000274C3A +S12332A02D533635348630CE3016CD00051633103031876A4032CE000A18108E0000270875 +S12332C0CB306B60B7D420EE8C000026F3B63002812D26026A60CE3016163286163316FD20 +S12332E03027CE3016163307313A303D8630163341313A303D36862D7A3002324080015047 +S1233300C001C30001209B36876A300436FB323D6A300436FB3D36A630270516334120F789 +S1233320323D36353416334827FB810D270A6A3016334103270220ED860A163341303132FF +S12333403D4FCC80FC5ACF3D4FCC200396CF3D873D496E76616C696420696E7075742066EE +S12333606F726D61740D0A004563616C633E20004F766572666C6F77204572726F720D0A44 +S12333800031292020496E70757420706F73697469766520646563696D616C20696E74652D +S12333A0676572206E756D62657273206F6E6C790D0A32292020496E70757420616E642098 +S12333C06F7574707574206D6178696D756D20666F7572206469676974206E756D62657264 +S12333E073206F6E6C790D0A3329202056616C6964206F70657261746F7273206172653A40 +S1233400202B2C202D2C202A2C20616E64202F0D0A34292020496E707574206E756D6265A5 +S1233420722077697468206C656164696E67207A65726F206973204F4B0D0A3529202049B2 +S12334406E707574206F6E6C792074776F206E756D6265727320616E64206F6E65206F7075 +S1233460657261746F7220696E206265747765656E2C206E6F207370616365730D0A36297C +S1233480202053686F77204563616C633E2070726F6D707420616E64206563686F2070723B +S12334A0696E742075736572206B65797374726F6B657320756E6C74696C20526574757280 +S12334C06E206B65790D0A37292020526570656174207072696E74207573657220696E7066 +S12334E0757420616E64207072696E7420616E7377657220616674657220746865203D207F +S12335007369676E0D0A38292020496E2063617365206F6620616E20696E76616C696420C0 +S1233520696E70757420666F726D61742C20726570656174207072696E742074686520759E +S123354073657220696E70757420756E74696C20746865206572726F722063686172616354 +S12335607465720D0A39292020496E2063617365206F6620616E20696E76616C696420695C +S12335806E70757420666F726D61742C207072696E74206572726F72206D657373616765EF +S12335A0206F6E20746865206E657874206C696E653A20496E76616C696420696E70757491 +S12335C020666F726D61740D0A313029204B65657020313662697420696E7465726E616CB5 +S12335E02062696E617279206E756D62657220666F726D61742C2064657465637420616E1C +S12336006420666C6167206F766572666C6F77206572726F720D0A31312920557365206932 +S12336206E7465676572206469766973696F6E20616E64207472756E6361746520616E793B +S10F3640206672616374696F6E0D0A00ED +S9030000FC diff --git a/cmpen472hw7_McDonnell/bin/main.dbg b/cmpen472hw7_McDonnell/bin/main.dbg new file mode 100644 index 0000000..8cd24da --- /dev/null +++ b/cmpen472hw7_McDonnell/bin/main.dbg @@ -0,0 +1,609 @@ +************************************************************************** +* +* Title: Calculator +* +* Objective: CMPEN 472 Homework 7 +* +* Revision: V1.0 +* +* Date: Mar. 7, 2025 +* +* Programmer: Jacob McDonnell +* +* Company: The Pennsylvania State University +* Department of Computer Science and Engineering +* +* Algorithm: Simple Serial I/O, address poking and modifying +* +* Register Use: A & B to current byte, etc, +* X & Y holds address of strings and length of string, +* D to hold data and address of the memory location to work on. +* +* Memory Use: RAM Locations from $3000 for data, +* RAM Locations from $3100 for program +* +* Input: Serial Port for User Input +* +* Output: Serial Port for String Output +* Memory locations changed if modified by user +* +* Observation: This program is a simple 16-bit calculator. The input can be +* any 4 digit positive decimal integer, the output can be negative. +* The +, -, *, and / operators are supported. Only two numbers at +* a time. +* +* Note: ON CSM-12C128 board, +* +* Comments: This program is developed and simulated using CodeWarrior +* development software and targeted for Axion +* Manufacturing's CSM-12C128 board running at 24MHz. +* +************************************************************************** +* Parameter Declearation Section +* +* Export Symbols + xdef pgstart ; export 'pgstart' symbol + absentry pgstart ; for assembly entry point + +* Symbols and Macros +PORTA equ $0000 ; i/o port A addresses +DDRA equ $0002 ; data direction register for PORTA +PORTB equ $0001 ; i/o port B addresses +DDRB equ $0003 ; data direction register for PORTB + +SCIBDH equ $00C8 ; Serial port (SCI) Baud Register H +SCIBDL equ $00C9 ; Serial port (SCI) Baud Register L +SCICR2 equ $00CB ; Serial port (SCI) Control Register 2 +SCISR1 equ $00CC ; Serial port (SCI) Status Register 1 +SCIDRL equ $00CF ; Serial port (SCI) Data Register + +CR equ $0d ; carriage return, ASCII 'Return' key +LF equ $0a ; line feed, ASCII 'next line' character +NULL equ $00 ; NULL Terminator character + +************************************************************************** +* Data Section: address used [ $3000 to $30FF ] RAM Memory +* + org $3000 ; Reserved RAM memory starting address + ; for Data for CMPEN 472 class +numBuf dc.w $0000 ; Memory location for addition and subtraction + ; in Solve subroutine + +operator dc.b $0000 ; Operator character for VerifyInput + +buffer ds.b $0010 ; Array of 16 bytes to read a string + dc.b NULL ; NULL terminated +lenBuf dc.w $0010 ; Length of buffer array + +buffer2 ds.b $0010 ; Array of 16 bytes for reading and reversal + dc.b NULL ; NULL terminated +lenBuf2 dc.w $0010 ; length of buffer2 + +* +* There is a section Data Section at the end of the file +************************************************************************** +* Program Section: address used [ $3100 to $3FFF ] RAM Memory +* + org $3100 ; Program start address, in RAM +pgstart lds #$3100 ; initialize the stack pointer + + ldaa #%11110001 ; LED 1,2,3,4 at PORTB bit 4,5,6,7 + staa DDRB ; set PORTB bit 4,5,6,7 as output + + ldaa #$0C ; Enable SCI port Tx and Rx units + staa SCICR2 ; disable SCI interrupts + + ldd #$0001 ; Set SCI Baud Register = $0001 => 1.5M baud at 24MHz (for simulation) + std SCIBDH ; SCI port baud rate change + + ldx #msg ; Load the address of the welcome message into X + jsr WriteString ; Write the string to the serial console + +mainLoop + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr Zeros ; Fill the buffer with zeros + + ldx #prompt ; Load Address of prompt string into X + jsr WriteString ; Write string to serial console + + ldx #buffer ; Load the address of the buffer into X + ldy lenBuf ; Load the length of the buffer into Y + jsr ReadString ; Read a line from the serial console + + ldx #buffer ; Load the address of the buffer into X + jsr VerifyInput ; Verify user input + beq mainLoop ; Invalid input, jump back to loop + + ldx #buffer ; Load the address of the buffer into X + jsr Solve ; Jump to Solve to solve the user input + bra mainLoop ; Loop back to mainLoop always + +************************************************************************** +* Subroutine Section: address used [ $3100 to $3FFF ] RAM Memory +* + +;************************************************************************* +; Solve subroutine +; +; This subroutine will solve the math equation in the given string. +; +; Input: Address of null terminated string in X. +; Output: No Output, Control flow changed to proper subroutine. +; Registers in use: X for the address of the string, A & B to read characters from +; from the string. +; Memory locations in use: Memory Address for serial line, address of the string, numBuf word +; +; Comments: This subroutine EXPECTS the input to be valid. RUN VerifyInput BEFORE +; TO MAKE SURE THE STRING IS VALID, OTHERWISE THERE WILL BE ERRORS. +; + +Solve + pshy ; Save Y to the stack + pshd ; Save D to the stack + pshx ; Save X to the stack + jsr ReadDecimal ; Read First number + pshy ; Save Y to the stack + ldaa -1,x ; Read operator from X and save to A + jsr ReadDecimal ; Read First number + cmpa #'+' ; Compare A to '+' + beq sAdd ; Jump to sAdd to add the numbers + cmpa #'-' ; Compare A to '-' + beq sSub ; Jump to sSub to add the numbers + cmpa #'*' ; Compare A to '*' + beq sMul ; Jump to sMul to add the numbers + exg y,x ; Exchange X and Y + puly ; Restore Y from the stack + exg y,d ; Exchange Y and D + idiv ; Divide D/X => X + exg x,d ; Exchange X & D + bra sDone ; Jump to sDone +sAdd sty numBuf ; Save Y to numBuf + puly ; Restore Y from the stack + exg y,d ; Exchange Y and D + addd numBuf ; Add D and numBuf + andcc #%00000010 ; And CCR to read just Overflow bit + psha ; Save A to the stack + tpa ; transfer CCR to A + cmpa #2 ; Compare A to 2 to read overflow bit + beq sOverflow ; If overflow bit set, jump to sOverflow + pula ; Restore A from the stack + bra sDone ; Jump to sDone +sSub sty numBuf ; Save Y to numBuf + puly ; Restore Y from the stack + exg y,d ; Exchange Y and D + subd numBuf ; Subtract D and numBuf + andcc #%00000010 ; And CCR to read just Overflow bit + psha ; Save A to the stack + tpa ; transfer CCR to A + cmpa #2 ; Compare A to 2 to read overflow bit + beq sOverflow ; If overflow bit set, jump to sOverflow + pula ; Restore A from the stack + bra sDone ; Jump to sDone +sMul exg y,d ; Exchange Y and D + puly ; Restore Y from the stack + emul ; Multiply Y*D => Y:D + cpy #0 ; Compare Y to 0 + bne sOverflow ; If Y != 0, Overflow +sDone pulx ; Restore X from the stack + jsr WriteString ; Write original equation to serial console + psha ; Save A to the stack + ldaa #'=' ; Load '=' into A + jsr putchar ; Print '=' to serial console + pula ; Restore A from the stack + ldy #buffer ; Load address of buffer into Y + jsr PrintDecimalWord; Print the answer to the Serial console + ldaa #CR ; Load CR into A + jsr putchar ; Jump to putchar to write CR + ldaa #LF ; Load LF into A + jsr putchar ; Jump to putchar to write CR + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller +sOverflow pulx ; Restore X from the stack + pshx ; Save X to the stack + jsr WriteString ; Write original string to serial console + ldaa #CR ; Load CR into A + jsr putchar ; Jump to putchar to write CR + ldaa #LF ; Load LF into A + jsr putchar ; Jump to putchar to write CR + ldx #overflow ; Load address of overflow string into X + jsr WriteString ; Write overflow string to serial + pulx ; Restore X from the stack + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller + +;************************************************************************* +; VerifyInput subroutine +; +; This subroutine will verify the user input is valid. +; +; Input: An address of a Null terminated string in register X. +; Output: If valid Zero bit = 0 in CCR, if invalid, Zero bit = 1 +; and the string is outputed up to the error on the serial +; console with an error message. +; Registers in use: X for the address of the string, A for reading characters. +; Y to count the number of digits in a number, & B to count the number of numbers +; Memory locations in use: Memory Address for serial line, address of the string, 1 byte for operator +; +; Comments: This subroutine will modify the user string if invalid. +; + +VerifyInput + pshy ; Save Y to the stack + pshd ; Save D to the stack + pshx ; Save X to the stack + clrb ; Set B to Zero + stab operator ; Clear operator + ldy #0 ; Load Zero into Y +vNumLoop ldaa 1,x+ ; Load character from X into A + cmpa #'9' ; Compare A to '9' + bhi vInvalid ; If A > '9', not valid string + cmpa #'0' ; Compare A to '0' + blt vIsOp ; If A < '0', check if operator + iny ; Increment Y by 1 to count numbers + cpy #4 ; Compare Y to 4 + bhi vInvalid ; If greater than 4, invalid + bra vNumLoop ; Loop back to check for more digits +vIsOp cmpa #'+' ; Compare A to '+' + beq vOp ; This is an operator + cmpa #'-' ; Compare A to '-' + beq vOp ; This is an operator + cmpa #'*' ; Compare A to '*' + beq vOp ; This is an operator + cmpa #'/' ; Compare A to '/' + beq vOp ; This is an operator + cmpa #NULL ; Compare A to NULL character + beq vEndOfLine ; Check if end of line +vInvalid clra ; Set A to zero + staa 0,X ; Write Null terminator to X + pulx ; Restore X from the stack + pshx ; Save X to the stack + jsr WriteString ; Write invalid string to serial console + ldaa #CR ; Load CR into A + jsr putchar ; Jump to putchar to write the character + ldaa #LF ; Load LF into A + jsr putchar ; Jump to putchar to write the character + ldx #invalidStr ; Load address of invalid string into X + jsr WriteString ; Write invalid string to serial console + ldaa #4 ; Load 4 into A to set zero bit + tap ; Transfer A to CCR + pulx ; Restore X from the stack + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller +vOp staa operator ; Store operator in operator buffer + ldaa -2,x ; Load previous character into A + cmpa #'0' ; Compare A to '0' + blt vInvalid ; Invalid string since previous is not number + cmpa #'9' ; Compare A to '9' + bhi vInvalid ; Invalid string since previous is not number + addb #1 ; Increment B by 1 + cmpb #1 ; Compare B to 1 + bhi vInvalid ; Invalid string since B > 1 and we have another operator + ldy #0 ; Set Y to 0 + bra vNumLoop ; Check for next number +vEndOfLine ldaa -2,x ; Load previous character into A + cmpa #'0' ; Compare A to '0' + blt vInvalid ; Invalid string since previous is not number + cmpa #'9' ; Compare A to '9' + bhi vInvalid ; Invalid string since previous is not number + ldaa operator ; Load operator character from buffer + beq vInvalid ; If operator buffer is zero, invalid + clra ; Set A to zero + tap ; Transfer A to CCR + pulx ; Restore X from the stack + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller + +;************************************************************************* +; ReadDecimal subroutine +; +; This subroutine will read an ASCII string of a number in decimal and convert it to +; its value. +; +; Input: A memory address in register X. +; Output: The value of the number in the Y register, and any errors printed +; to the serial line. Zero bit is set if error occurs. +; Registers in use: X for the address of the contents and for a buffer while printing, +; D for multiplication, B for the character, Y for output value. +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine will return the value in the Y register, and if an error occurs, +; the Zero bit in the CCR will be set. +; + +ReadDecimal + pshd ; Save D to the stack + ldy #0 ; Clear Y register +dHLoop ldab 1,x+ ; Read Next character from X + beq dHDone ; If B == 0, exit loop + cmpb #'+' ; Compare B to '+' + beq dHDone ; If B == '+', end of number + cmpb #'-' ; Compare B to '-' + beq dHDone ; If B == '-', end of number + cmpb #'*' ; Compare B to '*' + beq dHDone ; If B == '+', end of number + cmpb #'/' ; Compare B to '/' + beq dHDone ; If B == '-', end of number + cmpb #' ' ; Compare B to space character + beq dHDone ; If B == ' ', exit loop + cmpb #'0' ; Compare B to '0' character + blt dHError ; If B < '0', bad address, exit loop + cmpb #'9' ; Compare B to '9' character + bhi dHError ; If B > '9', check if 'A'-'F' characters + subb #'0' ; Subtract '0' from B to get true value + pshb ; Save B to the stack + ldd #10 ; load 10 into D + emul ; Multiply Y and D + exg d,y ; Transfer data from D to Y + pulb ; Restore b from the stack + aby ; Add B to Y + bra dHLoop ; Branch always to rHLoop +dHDone clra ; clear A accumulator + tap ; Transfer A into CCR to clear zero bit + puld ; Restore D from the stack + rts ; Return to caller +dHError ldaa #4 ; Load 4 into A to set zero bit in CCR + tap ; Transfer A into CCR to set zero bit and warn error + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; strrev subroutine +; +; This subroutine will reverse a string from one buffer into another. +; +; Input: Address of null terminated string in X, address of a large enough +; buffer in Y. +; Output: The string in X reversed in Y. +; Registers in use: X for the address of the string, Y for the address of the buffer, +; A to read characters from the string. +; Memory locations in use: Memory Address for serial line, address of the string & buffer +; +; Comments: This subroutine will not check that the output buffer is large enough, that +; is the job of the caller. +; + +strrev + pshx ; Save X to the stack + pshy ; Save Y to the stack + psha ; Save A to the stack +revLoop ldaa 1,y- ; Load Character from Y into A, decrement Y + beq revDone ; If Character is 0, exit loop + staa 1,x+ ; Save character in address in X, increment X + bra revLoop ; Loop back always + clra ; Set A to Zero +revDone staa 1,x+ ; Copy Null terminator into new string + pula ; Restore A from the stack + puly ; Restore Y from the stack + pulx ; Restore X from the stack + rts ; Return to caller + +;************************************************************************* +; PrintDecimalWord subroutine +; +; This subroutine will print a given word of data to the serial in binary. +; +; Input: 1 word of data in register D, Buffer Address in Y +; Output: Decimal representation of the data on the serial console +; Registers in use: Y for the address of the buffer, X to count the number of bits +; written and for division, D for the input, A for characters. +; Memory locations in use: Memory addresses for serial. +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +PrintDecimalWord + pshx ; Save X to the stack + pshd ; Save D (A:B) to the stack + pshy ; Save Y to the stack + cpd #0 ; Compare D to zero + beq dIsZero ; Branch to hIsZero + blt dIsNegative ; If D < 0, Jump to dIsNegative +dAfterNeg psha ; Save A to the stack + pshy ; Save Y to the stack + pshx ; Save x to the stack + ldaa #'0' ; Load the '0' character into A + ldx #buffer2 ; Load the address of buffer2 into X + ldy #5 ; Load 5 into Y + jsr memset ; Write '0' to the first 5 bytes in buffer2 + pulx ; Restore X from the stack + puly ; Restore Y from the stack + clra ; Set A to zero + staa 0,y ; Load Zero into Y for Null Terminator + pula ; Restore A from the stack +dPrintLoop ldx #10 ; Load 10 in X for division + idiv ; Divide D / 10 to get Hex Digit + cpx #0 ; Compare X to 0 + beq dCheck ; If X == 0, branch to check D is zero +dDNotZero addb #'0' ; Add '0' to B to get ASCII Character + stab 1,+y ; Save character from B to Y + exg X,D ; Swap values in X and D + bra dPrintLoop ; Loop to hPrintLoop +dCheck cpd #0 ; Compare D to 0 + bne dDNotZero ; If D != 0, branch back to hDNotZero +dPrintDone ldaa operator ; Load operator into A to see if negative + cmpa #'-' ; Compare A to '-' + bne dNotNeg ; If A != '-', jump to dNotNeg + staa 1,+y ; Save '-' into buffer +dNotNeg ldx #buffer2 ; Load the address of buffer2 in X + jsr strrev ; Reverse string in Y in buffer in X + jsr WriteString ; Jump to write string to write the number + ldy lenBuf2 ; Load the length of buffer2 into Y + ldx #buffer2 ; Load the address of buffer2 into X + jsr Zeros ; Fill buffer2 with zeros + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller +dIsZero ldaa #'0' ; Load '0' character into A + jsr putchar ; Print character to the screen + puly ; Restore Y from the stack + puld ; Restore D (A:B) from the stack + pulx ; Restore X from the stack + rts ; Return to caller +dIsNegative psha ; Save A to the stack + ldaa #'-' ; Load '-' into A + staa operator ; Save '-' to operator buffer + pula ; Restore A from the stack + nega ; Two's complement of A + suba #1 ; Subtract 1 from A + negb ; Two'complement of B + subb #1 ; Subtract 1 from B + addd #1 ; Add 1 to D + bra dAfterNeg ; Jump back to dAfterNeg + +;************************************************************************* +; Zeros subroutine +; +; This subroutine will write zeros to every byte in a given array. +; +; Input: Address of an array in X and its length in Y +; Output: Zeros in every byte of an array. +; Registers in use: X for the address of the array, Y for the length, and A for 0 +; Memory locations in use: Memory Address of the array +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +Zeros + psha ; Save A to the Stack + clra ; Clear A +zerosLoop staa 1,x+ ; Load A into byte at X + dbne y,zerosLoop ; Decrement Y and loop if Y != 0 + pula ; Restore A from the stack + rts ; Return to caller + +;************************************************************************* +; memset subroutine +; +; This subroutine will write a given byte to every byte in a given array. +; +; Input: Address of an array in X and its length in Y, the byte in A +; Output: The given byte in every byte of an array. +; Registers in use: X for the address of the array, Y for the length, and A for the given byte +; Memory locations in use: Memory Address of the array +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +memset + staa 1,x+ ; Load A into byte at X + dbne y,memset ; Decrement Y and loop if Y != 0 + rts ; Return to caller + +;************************************************************************* +; WriteString subroutine +; +; This subroutine will write a given null terminated string to the serial. +; +; Input: Address of null terminated string in X +; Output: Null terminated string written to serial +; Registers in use: X for the address of the string and A for the current byte +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires serial to be setup and putchar subroutine. +; + +WriteString + psha ; Save A to the stack +writeLoop ldaa 1,x+ ; Load the byte at addr in X, then add 1 + beq doneWrite ; if A == 0, branch to doneWrite + jsr putchar ; Jump to putchar to write byte to serial + bra writeLoop ; branch always to writeLoop +doneWrite pula ; restore A from the stack + rts ; return to caller + +;************************************************************************* +; ReadString subroutine +; +; This subroutine will read a string from the serial line to a given address. +; +; Input: Address of an array in X +; Output: Null terminated string in the given array +; Registers in use: X for the address of the string Y for the length of the string, +; and A for the current byte +; Memory locations in use: Memory Address for serial line, address of the string +; +; Comments: This subroutine requires serial to be setup and getchar subroutine. +; + +ReadString + psha ; Save accumulator A to the stack + pshy ; Save Y to the stack + pshx ; Save X to the stack +readLoop jsr getchar ; Jump to putchar to write byte to serial + beq readLoop ; While A == 0, loop + cmpa #CR ; If A == CR, exit loop + beq doneRead ; Branch to doneRead if A == CR + staa 1,x+ ; Save the byte to the addr in X, then add 1 + jsr putchar ; Write Character back to the terminal + dey ; Decrement Y by 1 + beq doneRead ; If Y == 0, no more room, stop reading + bra readLoop ; branch always to readLoop +doneRead ldaa #LF ; Load Line Feed into A + jsr putchar ; Write LF to terminal + pulx ; Restore X from the stack + pulY ; Restore Y from the stack + pula ; restore A from the stack + rts ; return to caller + +;************************************************************************* +; putchar subroutine +; +; This subroutine writes a single byte to a serial line +; +; Input: A single ASCII byte in accumulator A +; Output: Sends one character to SCI port +; Registers in use: Accumulator A with input byte +; Memory locations in use: SCISR1 and SCIDRL status and data registers +; + +putchar brclr SCISR1,#%10000000,putchar ; wait for transmit buffer empty + staa SCIDRL ; send a character + rts ; Return to caller + +;************************************************************************* +; putchar subroutine +; +; This subroutine reads one byte from the SCI port +; +; Input: One byte from the SCI port +; Output: One byte in accumulator A +; Registers in use: Accumulator A for output byte +; Memory locations in use: SCISR1 and SCIDRL status and data registers +; + +getchar brclr SCISR1,#%00100000,getchar7 ; If no input on SCI port, return 0 + ldaa SCIDRL ; Read one byte from SCI port into A + rts ; Return to caller +getchar7 clra ; Set A to 0 + rts ; Return to caller + +* +************************************************************************** +* Data Section 2: address used [ $3100 to $3FFF ] RAM Memory +* + +invalidStr dc.b 'Invalid input format',CR,LF,NULL ; Invalid input error message + +prompt dc.b 'Ecalc> ',NULL ; Prompt string for calculator + +overflow dc.b 'Overflow Error',CR,LF,NULL ; Overflow error message + +; msg: this is the main option menu string +msg dc.b '1) Input positive decimal integer numbers only',CR,LF + dc.b '2) Input and output maximum four digit numbers only',CR,LF + dc.b '3) Valid operators are: +, -, *, and /',CR,LF + dc.b '4) Input number with leading zero is OK',CR,LF + dc.b '5) Input only two numbers and one operator in between, no spaces',CR,LF + dc.b '6) Show Ecalc> prompt and echo print user keystrokes unltil Return key',CR,LF + dc.b '7) Repeat print user input and print answer after the = sign',CR,LF + dc.b '8) In case of an invalid input format, repeat print the user input until the error character',CR,LF + dc.b '9) In case of an invalid input format, print error message on the next line: Invalid input format',CR,LF + dc.b '10) Keep 16bit internal binary number format, detect and flag overflow error',CR,LF + dc.b '11) Use integer division and truncate any fraction',CR,LF,NULL + diff --git a/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Postload.cmd b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Postload.cmd new file mode 100644 index 0000000..ac4d359 --- /dev/null +++ b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Postload.cmd @@ -0,0 +1 @@ +// After load the commands written below will be executed diff --git a/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Preload.cmd b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Preload.cmd new file mode 100644 index 0000000..0bed464 --- /dev/null +++ b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Preload.cmd @@ -0,0 +1 @@ +// Before load the commands written below will be executed diff --git a/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Reset.cmd b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Reset.cmd new file mode 100644 index 0000000..bf55944 --- /dev/null +++ b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Reset.cmd @@ -0,0 +1 @@ +// After reset the commands written below will be executed diff --git a/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_SetCPU.cmd b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_SetCPU.cmd new file mode 100644 index 0000000..6a1549a --- /dev/null +++ b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_SetCPU.cmd @@ -0,0 +1 @@ +// At startup the commands written below will be executed diff --git a/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Startup.cmd b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Startup.cmd new file mode 100644 index 0000000..6a1549a --- /dev/null +++ b/cmpen472hw7_McDonnell/cmd/Full_Chip_Simulation_Startup.cmd @@ -0,0 +1 @@ +// At startup the commands written below will be executed diff --git a/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell.mcp b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell.mcp Binary files differnew file mode 100644 index 0000000..1108ec8 --- /dev/null +++ b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell.mcp diff --git a/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/CWSettingsWindows.stg b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/CWSettingsWindows.stg Binary files differnew file mode 100644 index 0000000..d189836 --- /dev/null +++ b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/CWSettingsWindows.stg diff --git a/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/ObjectCode/main.asm.o b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/ObjectCode/main.asm.o Binary files differnew file mode 100644 index 0000000..6d2d9d3 --- /dev/null +++ b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/ObjectCode/main.asm.o diff --git a/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/ObjectCode/main.asm.sx b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/ObjectCode/main.asm.sx new file mode 100644 index 0000000..b3bde1e --- /dev/null +++ b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/ObjectCode/main.asm.sx @@ -0,0 +1,47 @@ +S0840000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E3437326877375F4D63446F6E6E656C6C5C636D70656E3437326877375F4D63446F6E6E656C6C5F446174615C5374616E646172645C4F626A656374436F64655C6D61696E2E61736D2E70726DCB +S123300000000000000000000000000000000000000000000010000000000000000000009C +S10C302000000000000000001093 +S1233100CF310086F15A03860C5ACBCC00015CC8CE3381163316CE3003FD3014163307CEEE +S12331203368163316CE3003FD3014163322CE30031631CB27E0CE300316313E20D8353BDC +S12331403416324935A61F163249812B2713812D2724812A2735B7E531B7E41810B7D420FA +S1233160337D300031B7E4F33000100236B7208102273F32201E7D300031B7E4B330001098 +S12331800236B7208102272A322009B7E431138D0000261E3016331636863D16334132CD2C +S12331A03003163298860D163341860A1633413A313D3034163316860D163341860A163360 +S12331C041CE3370163316303A313D353B34C77B3002CD0000A6308139222081302D080263 +S12331E08D0004221620EE812B2730812D272C812A2728812F272481002738876A003034C6 +S1233200163316860D163341860A163341CE33511633168604B702303A313D7A3002A61ED8 +S123322081302DD7813922D3CB01C10122CDCD000020A2A61E81302DC2813922BEB6300234 +S123324027B987B702303A313D3BCD0000E630272AC12B2726C12D2722C12A271EC12F274C +S12332601AC1202716C1302D17C1392213C03037CC000A13B7C63319ED20D287B7023A3D3F +S12332808604B7023A3D343536A67F27056A3020F8876A303231303D343B358C0000274C3A +S12332A02D533635348630CE3016CD00051633103031876A4032CE000A18108E0000270875 +S12332C0CB306B60B7D420EE8C000026F3B63002812D26026A60CE3016163286163316FD20 +S12332E03027CE3016163307313A303D8630163341313A303D36862D7A3002324080015047 +S1233300C001C30001209B36876A300436FB323D6A300436FB3D36A630270516334120F789 +S1233320323D36353416334827FB810D270A6A3016334103270220ED860A163341303132FF +S12333403D4FCC80FC5ACF3D4FCC200396CF3D873D496E76616C696420696E7075742066EE +S12333606F726D61740D0A004563616C633E20004F766572666C6F77204572726F720D0A44 +S12333800031292020496E70757420706F73697469766520646563696D616C20696E74652D +S12333A0676572206E756D62657273206F6E6C790D0A32292020496E70757420616E642098 +S12333C06F7574707574206D6178696D756D20666F7572206469676974206E756D62657264 +S12333E073206F6E6C790D0A3329202056616C6964206F70657261746F7273206172653A40 +S1233400202B2C202D2C202A2C20616E64202F0D0A34292020496E707574206E756D6265A5 +S1233420722077697468206C656164696E67207A65726F206973204F4B0D0A3529202049B2 +S12334406E707574206F6E6C792074776F206E756D6265727320616E64206F6E65206F7075 +S1233460657261746F7220696E206265747765656E2C206E6F207370616365730D0A36297C +S1233480202053686F77204563616C633E2070726F6D707420616E64206563686F2070723B +S12334A0696E742075736572206B65797374726F6B657320756E6C74696C20526574757280 +S12334C06E206B65790D0A37292020526570656174207072696E74207573657220696E7066 +S12334E0757420616E64207072696E7420616E7377657220616674657220746865203D207F +S12335007369676E0D0A38292020496E2063617365206F6620616E20696E76616C696420C0 +S1233520696E70757420666F726D61742C20726570656174207072696E742074686520759E +S123354073657220696E70757420756E74696C20746865206572726F722063686172616354 +S12335607465720D0A39292020496E2063617365206F6620616E20696E76616C696420695C +S12335806E70757420666F726D61742C207072696E74206572726F72206D657373616765EF +S12335A0206F6E20746865206E657874206C696E653A20496E76616C696420696E70757491 +S12335C020666F726D61740D0A313029204B65657020313662697420696E7465726E616CB5 +S12335E02062696E617279206E756D62657220666F726D61742C2064657465637420616E1C +S12336006420666C6167206F766572666C6F77206572726F720D0A31312920557365206932 +S12336206E7465676572206469766973696F6E20616E64207472756E6361746520616E793B +S10F3640206672616374696F6E0D0A00ED +S9033100CB diff --git a/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/TargetDataWindows.tdt b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/TargetDataWindows.tdt Binary files differnew file mode 100644 index 0000000..395730a --- /dev/null +++ b/cmpen472hw7_McDonnell/cmpen472hw7_McDonnell_Data/Standard/TargetDataWindows.tdt diff --git a/cmpen472hw7_McDonnell/prm/burner.bbl b/cmpen472hw7_McDonnell/prm/burner.bbl new file mode 100644 index 0000000..0c57619 --- /dev/null +++ b/cmpen472hw7_McDonnell/prm/burner.bbl @@ -0,0 +1,157 @@ +/* logical s-record file */ +OPENFILE "%ABS_FILE%.s19" +format=motorola +busWidth=1 +origin=0 +len=0x1000000 +destination=0 +SRECORD=Sx +SENDBYTE 1 "%ABS_FILE%" +CLOSE + + +/* physical s-record file */ +OPENFILE "%ABS_FILE%.phy" +format = motorola +busWidth = 1 +len = 0x4000 + +/* logical non banked flash at $4000 and $C000 to physical */ +origin = 0x004000 +destination = 0x0F8000 +SENDBYTE 1 "%ABS_FILE%" + +origin = 0x00C000 +destination = 0x0FC000 +SENDBYTE 1 "%ABS_FILE%" + +/* physical FTS512K flash window to physical +origin = 0x008000 +destination = 0x080000 +SENDBYTE 1 "%ABS_FILE%" +*/ + +/* physical FTS256K parts flash window to physical +origin = 0x008000 +destination = 0x0C0000 +SENDBYTE 1 "%ABS_FILE%" +*/ + +/* physical FTS128K parts flash window to physical +origin = 0x008000 +destination = 0x0E0000 +SENDBYTE 1 "%ABS_FILE%" +*/ + +/* physical FTS64K parts flash window to physical +origin = 0x008000 +destination = 0x0F0000 +SENDBYTE 1 "%ABS_FILE%" +*/ + +/* physical FTS32K parts flash window to physical +origin = 0x008000 +destination = 0x0F8000 +SENDBYTE 1 "%ABS_FILE%" +*/ + +/* logical 512 kB banked flash to physical */ +origin = 0x208000 +destination = 0x080000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x218000 +destination = 0x084000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x228000 +destination = 0x088000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x238000 +destination = 0x08C000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x248000 +destination = 0x090000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x258000 +destination = 0x094000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x268000 +destination = 0x098000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x278000 +destination = 0x09C000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x288000 +destination = 0x0A0000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x298000 +destination = 0x0A4000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x2A8000 +destination = 0x0A8000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x2B8000 +destination = 0x0AC000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x2C8000 +destination = 0x0B0000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x2D8000 +destination = 0x0B4000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x2E8000 +destination = 0x0B8000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x2F8000 +destination = 0x0BC000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x308000 +destination = 0x0C0000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x318000 +destination = 0x0C4000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x328000 +destination = 0x0C8000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x338000 +destination = 0x0CC000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x348000 +destination = 0x0D0000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x358000 +destination = 0x0D4000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x368000 +destination = 0x0D8000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x378000 +destination = 0x0DC000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x388000 +destination = 0x0E0000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x398000 +destination = 0x0E4000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x3A8000 +destination = 0x0E8000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x3B8000 +destination = 0x0EC000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x3C8000 +destination = 0x0F0000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x3D8000 +destination = 0x0F4000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x3E8000 +destination = 0x0F8000 +SENDBYTE 1 "%ABS_FILE%" +origin = 0x3F8000 +destination = 0x0FC000 +SENDBYTE 1 "%ABS_FILE%" + +CLOSE + |
