diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-04-07 13:09:43 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-04-07 13:09:43 -0400 |
| commit | 0f186fcaa044dcd15fe17ef660f5ea3e03de20a7 (patch) | |
| tree | 582cd978c71ba2e3de0142f8e751273ca4902a2f | |
| parent | f73c7eee8ec2dc3655ba4e9d035d0dd7bf968f3d (diff) | |
HW10: Initial
21 files changed, 2338 insertions, 0 deletions
diff --git a/cmpen472hw10_McDonnell/ASM_layout.hwl b/cmpen472hw10_McDonnell/ASM_layout.hwl new file mode 100644 index 0000000..22795c3 --- /dev/null +++ b/cmpen472hw10_McDonnell/ASM_layout.hwl @@ -0,0 +1,27 @@ +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 0x3100 +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 10 20 40 69 +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 "" +OPEN Visualizationtool 76 37 11 29 +VisualizationTool< Attributes [stEditM="0",swRefresh="3",refCycles="1"] +VisualizationTool< LoadInstrument Seg7[BoundX="26",BoundY="12",Port="0x1",swDM="2"] +VisualizationTool< LoadInstrument Seg7[BoundX="67",BoundY="14",Port="0x1",swDM="1"] +VisualizationTool< LoadInstrument DILSwitch[BoundX="25",BoundY="106",Port="0x1"] +VisualizationTool< ResetVT Undo +bckcolor 50331647 +font 'Courier New' 9 BLACK +AUTOSIZE on +ACTIVATE "Assembly" "Memory" "Register" "Command" "Data" "Source" "Procedure" "Terminal" "VisualizationTool" diff --git a/cmpen472hw10_McDonnell/Default.mem b/cmpen472hw10_McDonnell/Default.mem Binary files differnew file mode 100644 index 0000000..bf49148 --- /dev/null +++ b/cmpen472hw10_McDonnell/Default.mem diff --git a/cmpen472hw10_McDonnell/Full_Chip_Simulation.hwc b/cmpen472hw10_McDonnell/Full_Chip_Simulation.hwc new file mode 100644 index 0000000..f3ce7c9 --- /dev/null +++ b/cmpen472hw10_McDonnell/Full_Chip_Simulation.hwc @@ -0,0 +1 @@ +LOADMEM default.mem diff --git a/cmpen472hw10_McDonnell/Full_Chip_Simulation.ini b/cmpen472hw10_McDonnell/Full_Chip_Simulation.ini new file mode 100644 index 0000000..e6799e8 --- /dev/null +++ b/cmpen472hw10_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,1150,95,2453,1111 +Configuration=Full_Chip_Simulation.hwc +Statusbar=1 +ShowToolbar=1 +Smallborder=0 +Hideheadline=0 +Hidetitle=0 +TOOLBAR=57600 57601 32795 0 57635 57634 57637 0 57671 57669 0 32777 32776 32782 32780 32781 32778 0 32806 + + + + + + + + + +[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/cmpen472hw10_McDonnell/Sources/derivative.inc b/cmpen472hw10_McDonnell/Sources/derivative.inc new file mode 100644 index 0000000..988343b --- /dev/null +++ b/cmpen472hw10_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/cmpen472hw10_McDonnell/Sources/main.asm b/cmpen472hw10_McDonnell/Sources/main.asm new file mode 100644 index 0000000..245ce86 --- /dev/null +++ b/cmpen472hw10_McDonnell/Sources/main.asm @@ -0,0 +1,1010 @@ +************************************************************************** +* +* Title: Calculator Clock +* +* Objective: CMPEN 472 Homework 9 +* +* Revision: V1.0 +* +* Date: Apr. 2, 2025 +* +* Programmer: Jacob McDonnell +* +* Company: The Pennsylvania State University +* Department of Computer Science and Engineering +* +* Algorithm: Simple Serial I/O, Real Time Interrupts for Time Tracking +* +* Register Use: A & B to current byte, etc, +* X & Y holds address of strings and length of string, +* D to hold data for printing, reading, and updating time. +* +* 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 +* +* Observation: The HC12 will output the time and a command prompt every second. +* The user can input commands and the program will output a response +* based on the input. +* +* 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 + +CRGFLG EQU $0037 ; Clock and Reset Generator Flags +CRGINT EQU $0038 ; Clock and Reset Generator Interrupts +RTICTL EQU $003B ; Real Time Interrupt Control + +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 +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 + +hours dc.w $0000 ; Buffer to hold the hours of the time + +minutes dc.w $0000 ; Buffer to hold the minutes of the time + +seconds dc.w $0000 ; Buffer to hold the seconds of the time + +counter dc.w $0000 ; Counter for RTI ISR for 1 second + +numBuf dc.b $0000 ; Used by ReadDecimal for reading numbers + +operator dc.b $0000 ; Used by ReadDecimal for reading numbers + +inputBuffer ds.b $0010 ; Input Buffer Length + +lenInput dc.w $0010 ; Length of the Input Buffer + +outputBuf dc.b 's' ; Used to control what to output on 7 segment display + +outputVal dc.b $00 ; Used to track the output value of the wave + +outputCnt dc.w $0000 ; Used to track how many values have been outputted + +interval dc.w $3000 ; Used to set the timer module based on clock cycles + +waveType dc.b 'S' ; Used to track wave type 'T' for increasing triangle, + ; 't' for decreasing triangle, 'Q' for square + ; 'S' for sawtooth + +* +* There is a section Data Section at the end of the file +************************************************************************** +* RTI Vector Section: address used [ $FFF0 to $FFF1 ] RAM Memory +* + org $FFF0 ; Memory location for RTI interrupt vector section for simulator + dc.w rtiisr ; Real Time Interrupt vector +* +************************************************************************** +* Timer Interrupt Vector Section: address used [ $FFE2 to $FFE3 ] RAM Memory +* + org $FFE2 ; Timer channel 6 interrupt vector setup, on simulator + dc.w oc6isr +* +************************************************************************** +* 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 + + bset RTICTL,%00011001; set RTI: dev=10*(2**10)=2.555msec for C128 board + ; 4MHz quartz oscillator clock + bset CRGINT,%10000000; enable RTI interrupt + bset CRGFLG,%10000000; clear RTI IF (Interrupt Flag) + + ldaa #$FF ; Two 7 segment displays on PORTB + staa DDRB ; Set all of PORTB as output + + ldx #inputBuffer ; Load the address of inputBuffer into X + ldy lenInput ; Load the length of inputBuffer into Y + jsr Zeros ; Zero out inputBuffer + cli ; Enable interrupts + jsr PrintTime ; Jump to PrintTime to write to serial console + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Jump to PrintPrompt to write to serial console +mainLoop + ldx #inputBuffer ; Load the address of inputBuffer into X + ldy lenInput ; Load the length of inputBuffer into Y + jsr ReadString ; Jump to ReadString to read input + + ldx #inputBuffer ; Load the address of inputBuffer into X + jsr ExecuteCommand ; Jump to ExecuteCommand + + ldx #inputBuffer ; Load the address of inputBuffer into X + ldaa 0,x ; Load first character from inputBuffer into A + beq mainLoop ; If A == 0, branch to mainLoop, only zero if Solve was called + ldy lenInput ; Load the length of inputBuffer into Y + jsr Zeros ; Zero out inputBuffer + + sei ; Disable interrupts + jsr PrintTime ; Jump to PrintTime to print new time + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Jump to PrintPrompt to write to serial console + cli ; Enable interrupts + + bra mainLoop ; Loop back to mainLoop always + +TypeWrite + sei ; Disable Interrupts + bclr CRGINT,%10000000; Disable RTI interrupt + ldx #twMsg ; Load the address of twMsg into X + jsr WriteString ; Write the string to the serial console +twLoop jsr getchar ; Read a character from the serial console + tsta ; Compare A to 0 + beq twLoop ; If A == 0, branch to twLoop + staa PORTB ; Write A to PORTB + jsr putchar ; Write character to serial console + bra twLoop ; Branch always to twLoop + +************************************************************************** +* Subroutine Section: address used [ $3100 to $3FFF ] RAM Memory +* + +;************************************************************************* +; rtiisr subroutine +; +; This subroutine will increment the counter, seconds, minutes, & hours counters +; to track the time. This subroutine will be called ~400 times a second. +; +; Input: No input other than the timer to call the isr. +; Output: The counter, seconds, minutes, & hours buffers will +; be updated to track the time, the time & prompt will be +; printed every second. +; Registers in use: X for adding to the counter, seconds, minutes, & hours buffers. +; Memory locations in use: Memory Address for serial line, Memory addresses for RTIISR control, +; Buffer words for counters, seconds, minutes, & hours buffers. +; +; Comments: The counter buffer should be compared to 400, but for the simulator, +; the counter is compared to 200 to better simulate 1 second on my computer. +; + +rtiisr bset CRGFLG,%10000000; Clear RTI Interrupt Flag + ldx counter ; Load counter into X + inx ; Increment counter by 1 + stx counter ; Save X to counter + cpx #200 ; Compare counter to 200, This is about 1 second on my computer + bne rtiSkip ; If counter != 200, branch to rtiSkip + ldx #0 ; Load 0 into X + stx counter ; Save X to counter + ldx seconds ; Load the seconds into X + inx ; Increment the seconds by 1 + stx seconds ; Save the new seconds to the location + cpx #60 ; Compare X to 60 + bne rtidone ; If X != 60, exit isr + ldx #0 ; Reset the seconds + stx seconds ; Save the new seconds to the location + ldx minutes ; load the minutes into X + inx ; Increment the minutes by 1 + stx minutes ; Save the updated minutes + cpx #60 ; Compare the minutes to 60 + bne rtidone ; If X != 60, exit isr + ldx #0 ; Reset the minutes + stx minutes ; Save the updated minutes + ldx hours ; Load the hours into X + inx ; Increment the hours by 1 + stx hours ; Save the updated hours + cpx #24 ; Compare the hours to 24 + bne rtidone ; If X != 24, exit the isr + ldx #0 ; Reset the hours + stx hours ; Save the updated hours +rtidone jsr PrintTime ; Jump to PrintTime +rtiSkip RTI ; Return from RTI ISR + +oc6isr ldd interval ; Load the interval for the next clock cycle + addd TC6H ; for next interrupt + std TC6H ; + ldd outputCnt ; Load the count of values outputed into D + addd #1 ; Increase output count by 1 + std outputCnt ; Update the count of outputted values + cpd #2048 ; Compare D to the max number of values + bne oc6Done ; If D != 2048, exit ISR + ldd #0 ; Clear the D register + std outputCnt ; Reset the count + staa outputVal ; Reset the output value + RTI ; Return from interrupt +oc6Done jsr PrintWave ; Jump to PrintWave + RTI ; Return from interrupt + +PrintWave + pshd ; Save D to the stack + ldaa waveType ; Load the waveType into A + cmpa #'T' ; Compare to 'T' + beq TriangleInc ; If A == 'T', triangle wave increasing + cmpa #'t' ; Compare A to 't' + beq TriangleDec ; If A == 't', triangle wave decreasing + cmpa #'Q' ; Compare A to 'Q' + beq SquareWave ; If A == 'Q', square wave +SawToothWav clra ; Clear A + ldab outputVal ; Load the output value into B + jsr PrintDecimalWord; Print the lower byte of the output value; + addd #1 ; Increment output value by 1 + cpd #256 ; Compare D to 256 + bne DonePrint ; If D != 256, Done + clrb ; Reset to Zero + bra DonePrint ; Branch to DonePrint +SquareWave clra ; Clear A + ldab outputVal ; Load the output value into B + jsr PrintDecimalWord; Print the lower byte of the output value; + cmpb #255 ; Compare B to 255 + beq SquareIsHi ; If B == 255, branch to SquareIsHi + ldab #255 ; Load 255 into B + bra DonePrint ; Branch always to DonePrint +SquareIsHi clrb ; Reset B to zero + bra DonePrint ; Branch to DonePrint +TriangleInc clra ; Clear A + ldab outputVal ; Load the output value into B + jsr PrintDecimalWord; Print the lower byte of the output value; + addd #1 ; Add 1 to D + cpd #256 ; Compare D to 256 + bne DonePrint ; If D != 256, done + subd #1 ; Subtract 1 from D + ldaa #'t' ; Load 't' into A + staa waveType ; Update wave type to decreasing triangle + bra DonePrint ; Branch to DonePrint +TriangleDec clra ; Clear A + ldab outputVal ; Load the output value into B + jsr PrintDecimalWord; Print the lower byte of the output value; + cpd #0 ; Compare D to 0 + bne DonePrint ; If D != 0, done + ldaa #'T' ; Load 'T' into A + staa waveType ; Update wave type to increasing triangle + bra DonePrint ; Branch to DonePrint +TringleGood subd #1 ; Subtract 1 from D +DonePrint stab outputVal ; Store updated output value + puld ; Restore D from the stack + rts ; Return from Caller + +;************************************************************************* +; PrintTime subroutine +; +; This subroutine will print the time, command prompt, and maybe an error prompt. +; +; Input: No input. +; Output: The time prompt, time, command prompt, the current input, +; and/or an error on the serial console. +; Registers in use: A for the characters to print, X for buffer addresses, +; Y for buffer lengths, D for the seconds/minutes/hours for calling TimeOnPortB +; Memory locations in use: Memory Address for serial line, Buffer words for counters, +; seconds, minutes, & hours buffers, and buffer to print time, +; outputBuf for tracking what to output on PORTB. +; +; Comments: This subroutine requires TimeOnPortB subroutine and to be setup. The subroutine +; will print the current user input if its not finished. +; + +PrintTime + pshd ; Save D to the stack + ldaa outputBuf ; Load outputBuf into A + cmpa #'h' ; Compare A to 'h' + bne pTimeIsM ; If A != 'h', branch to pTimeIsM + ldd hours ; Load hours into B + bra skipRest ; Jump to skipRest +pTimeIsM cmpa #'m' ; Compare A to 'm' + bne pTimeIsS ; If A != 'm', branch to pTimeIsS + ldd minutes ; Load Minutes into D + bra skipRest ; Jump to skipRest +pTimeIsS ldd seconds ; Load seconds into D +skipRest jsr TimeOnPortB ; Call TimeOnPortB to output time + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; PrintPrompt subroutine +; +; This subroutine will output the CMD prompt and any current input to the serial console +; +; Input: No Input +; Output: The CMD prompt and any input onto the serial console +; Registers in use: X for addresses of strings +; Memory locations in use: PORTB memory location, CMD prompt memory locaiton, inputBuffer location +; +; Comments: This subroutine requires WriteString subroutine. +; + +PrintPrompt + pshx ; Save X to the stack + ldx #CMD ; Load the address of CMD into X + jsr WriteString ; Write the string to the serial + ldx #inputBuffer ; Load the address of the inputBuffer into X + jsr WriteString ; Write the string to the serial + pulx ; Restore X from the stack + rts ; Return + +;************************************************************************* +; TimeOnPortB subroutine +; +; This subroutine will output the time given on on PORTB for two seven segment displays. +; +; Input: Two Digit Decimal number in register D. +; Output: The given two digit decimal number on PORTB for two 7 segment displays. +; Registers in use: D for the input, and for math to split the digits, X for math to split digits. +; Memory locations in use: PORTB memory location. +; +; Comments: This subroutine will only work with two digit decimal numbers, and one digit decimal +; numbers (leading zeros will be added). +; + +TimeOnPortB + pshd ; Save D to the stack + pshx ; Save X to the stack + ldx #10 ; Load 10 into X to get digit + idiv ; Divide D by X and save Digit into D + pshb ; Save B to the stack (Lower Byte of D) + exg x,d ; Swap X and D + ldx #10 ; Load 10 into X to get digit + lslb ; Shift B left by 1 + lslb ; Shift B left by 1 + lslb ; Shift B left by 1 + lslb ; Shift B left by 1 + orab 1,sp+ ; Or B with Digit on stack + stab PORTB ; Save B to PORTB + pulx ; Restore X from the stack + puld ; Restore D from the stack + rts ; Return from caller + +;************************************************************************* +; ExecuteCommand subroutine +; +; This subroutine will parse user input and execute the proper command or error out. +; +; Input: An address of a NULL terminated string in X. +; Output: The output of the proper command or an error message. +; Registers in use: X for the address of the user input, A for individual characters, +; D & Y for numbers read from user input. +; Memory locations in use: Serial console memory locations. +; +; Comments: This subroutine will disable interrupts while setting the time and will +; reenable them after setting the time. +; + +ExecuteCommand + pshd ; Save D to the stack + pshy ; Save Y to the stack + ldaa 1,x+ ; Load the character from X into A + lbeq ecDone ; If A == 0, jump to ecDone + cmpa #'t' ; Compare A to 't' + bne isH ; If A != 't', branch to isH +skipSpaces ldaa 1,+x ; Load the next character into X + cmpa #' ' ; Compare A to ' ' character + beq skipSpaces ; If A == ' ', loop to skipSpaces + sei ; Disable interrupts + ldd hours ; Load hours into D + pshd ; Save hours to the stack + jsr ReadDecimal ; Read Hour number + exg y,d ; Exchange Y and D + cpd #24 ; Compare D to 24 + lbhs badHours ; If D >= 24, badHours + cpd #0 ; Compare D to 0 + lblt badHours ; If D < 0, badHours + std hours ; Save D to hours + ldaa -1,x ; Load the next character into A + cmpa #':' ; Compare A to ':' + lbne badHours ; If A != ':', badHours + ldd minutes ; Load minutes into D + pshd ; Save minutes to the stack + jsr ReadDecimal ; Read minute number + exg y,d ; Exchange Y and D + cpd #60 ; Compare D to 60 + bhs badMinutes ; If D >= 60, badMinutes + cpd #0 ; Compare D to 0 + blt badMinutes ; If D < 0, badMinutes + std minutes ; Save D to minutes + ldaa -1,x ; Load the next character into A + cmpa #':' ; Compare A to ':' + bne badMinutes ; If A != ':', badMinutes + ldd seconds ; Load seconds into D + pshd ; Save seconds to the stack + jsr ReadDecimal ; Read second number + exg y,d ; Exchange Y and D + cpd #60 ; Compare D to 60 + bhs badSeconds ; If D >= 60, badSeconds + cpd #0 ; Compare D to 0 + blt badSeconds ; If D < 0, badSeconds + std seconds ; Save D to seconds + ldaa -1,x ; Load the next character into A + cmpa #NULL ; Compare A to NULL + bne badSeconds ; If A != ':', badSeconds + clra ; Set A to 0 + staa counter ; Clear Counter + cli ; Enable interrupts + puld ; Restore D from the stack + puld ; Restore D from the stack + puld ; Restore D from the stack + bra ecDone ; Branch to ecDone +isH cmpa #'h' ; Compare A to 'h' + bne isM ; If A != 'h', branch to isM + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != CR, bad command + staa outputBuf ; Store A into outputBuf + bra ecDone ; Branch to ecDone +isM cmpa #'m' ; Compare A to 'm' + bne isS ; If A != 'm', branch to isS + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != CR, bad command + staa outputBuf ; Store A into outputBuf + bra ecDone ; Branch to ecDone +isS cmpa #'s' ; Compare A to 's' + bne isQ ; If A != 's', branch to isQ + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != CR, bad command + staa outputBuf ; Store A into outputBuf + bra ecDone ; Branch to ecDone +isQ cmpa #'q' ; Compare A to 'q' + bne isEquation ; If A != 'q', branch to isEquation + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != NULL, branch to ecDone + jmp TypeWrite ; Jump to TypeWrite +isEquation dex ; Decrement X by 1 + jsr VerifyInput ; Verify input is valid equation + beq badCommand ; If Z == 1, badCommand + jsr Solve ; Jump to Solve to solve equation + bra ecDone ; Branch always to ecDone +badSeconds puld ; Restore Seconds from the stack + std seconds ; Restore seconds before change +badMinutes puld ; Restore minutes from the stack + std minutes ; Restore minutes before change +badHours puld ; Restore hours from the stack + std hours ; Restore hours before change + cli ; Reenable interrupts +badCommand pshx ; Save X to the stack + ldaa #' ' ; Load Space character into A + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + ldx #error ; Load the address of the error prompt into X + jsr WriteString ; Jump to WriteString + ldx #badInput ; Load the address of badInput into X + jsr WriteString ; Jump to WriteString + pulx ; Restore X from the stack +ecDone puly ; Restore Y from the stack + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; 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 + 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 + 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 cpd #9999 ; Compare D to 9999 (Max output) + bgt sOverflow ; Branch to sOverflow if D > 9999 + cpd #-9999 ; Compare D to -9999 (Min output) + blt sOverflow ; Branch to sOverflow if D < -9999 + sei ; Disable Interrupts + jsr PrintTime ; Print Time to serial + psha ; Save A to the stack + ldaa #' ' ; Load the space character into A + jsr putchar ; Print the space character to the serial console + jsr putchar ; Print the space character to the serial console + jsr putchar ; Print the space character to the serial console + jsr putchar ; Print the space character to the serial console + pula ; Restore A from the stack + pulx ; Restore X from the stack + pshx ; Save X to the stack + jsr WriteString ; Write original equation to serial console + pulx ; Restore X from the stack + ldy lenInput ; Load the length of the input buffer into Y + jsr Zeros ; Clear input buffer + 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 + clra ; Clear A + staa operator ; Clear operator + jsr PrintTime ; Print the time to the serial console + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Write CMD prompt to serial + cli ; Enable Interrupts + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller +sOverflow ldaa #' ' ; Load a space character into A + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + ldx #error ; Load the address of the error prompt into X + jsr WriteString ; Write original string to serial console + ldaa #' ' ; Load a space character into A + jsr putchar ; Jump to putchar to write space character + 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 + 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 ':' + 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 + pshy ; Save Y to the stack + pshd ; Save D (A:B) 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 + puld ; Restore D (A:B) from the stack + puly ; Restore Y 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 + puld ; Restore D (A:B) from the stack + puly ; Restore Y 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 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 +* + +clock dc.b 'Tcalc> ',NULL ; Prompt string for clock + +CMD dc.b 'CMD> ',NULL ; Prompt string for CMD + +error dc.b 'Error> ',NULL ; Prompt string for errors + +badInput dc.b 'Invalid Input',NULL ; Invalid Input Prompt + +overflow dc.b 'Overflow Error',NULL ; Overflow error message + +; twMsg: welcome message for typewrite +twMsg dc.b CR,LF,'Clock stopped and Typewrite program started.',CR,LF + dc.b 'You may type below.',CR,LF,NULL + +; spacer: the white space between time and cmd prompt +spacer dc.b ' ',NULL + +; msg: this is the main option menu string +msg dc.b 'Commands:',CR,LF + dc.b 't: Set the time in format HH:MM:SS',CR,LF + dc.b 'h: Display the hours on the 7 segment displays',CR,LF + dc.b 'm: Display the minutes on the 7 segment displays',CR,LF + dc.b 's: Display the seconds on the 7 segment displays',CR,LF + dc.b 'q: Stop the clock and enter typewriter',CR,LF,NULL + + end ; last line of the file diff --git a/cmpen472hw10_McDonnell/bin/Project.abs b/cmpen472hw10_McDonnell/bin/Project.abs Binary files differnew file mode 100644 index 0000000..30d3567 --- /dev/null +++ b/cmpen472hw10_McDonnell/bin/Project.abs diff --git a/cmpen472hw10_McDonnell/bin/Project.abs.phy b/cmpen472hw10_McDonnell/bin/Project.abs.phy new file mode 100644 index 0000000..c70cbf6 --- /dev/null +++ b/cmpen472hw10_McDonnell/bin/Project.abs.phy @@ -0,0 +1,3 @@ +S0580000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E3437326877395F4D63446F6E6E656C6C5C62696E5C50726F6A6563742E61627347 +S2060FFFF031804A +S9030000FC diff --git a/cmpen472hw10_McDonnell/bin/Project.abs.s19 b/cmpen472hw10_McDonnell/bin/Project.abs.s19 new file mode 100644 index 0000000..9d3012b --- /dev/null +++ b/cmpen472hw10_McDonnell/bin/Project.abs.s19 @@ -0,0 +1,55 @@ +S0580000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E3437326877395F4D63446F6E6E656C6C5C62696E5C50726F6A6563742E61627347 +S123300000000000000000000000000000000000000010000000000000000000000000009C +S123302000000000001000000000000000000000000000000000000000000000000000007C +S106304000106811 +S1233100CF310086F15A03860C5ACBCC00015CC8CE36171635514C3B194C38804C3780864B +S1233120FF5A03CE3030FD304016354210EF1631D8CE3600163551163253CE3030FD304013 +S123314016355DCE303016327ACE3030A60027EAFD304016354214101631D8CE3600163562 +S12331605116325310EF20D214104D3880CE35BA16355116357E9727FA5A0116357720F33B +S12331804C3780FE302C087E302C8E00C82648CE00007E302CFE302A087E302A8E003C2658 +S12331A02ACE00007E302AFE3028087E30288E003C2618CE00007E3028FE3026087E30262B +S12331C08E00182606CE00007E30261631D8CE36001635511632530B3B3534860D16357719 +S12331E0860A163577CE3587163551FC30268C000A240736863016357732CD30001634D346 +S1233200863A163577FC30288C000A240736863016357732CD30001634D3863A163577FC9B +S1233220302A8C000A240736863016357732CD30001634D3B6304281682605FC3026200CBB +S1233240816D2605FC30282003FC302A16326230313A3D34CE358F163551CE3030163551D6 +S1233260303D3B34CE000A181037B7D4CE000A58585858EAB05B01303A3D3B35A630182752 +S123328000E08174266DA620812027FA1410FC30263B163480B7E48C0018182400A28C0016 +S12332A000182D009B7C3026A61F813A18260090FC30283B163480B7E48C003C247E8C0020 +S12332C0002D797C3028A61F813A2670FC302A3B163480B7E48C003C245E8C00002D597C8C +S12332E0302AA61F81002650877A302C10EF3A3A3A206F8168260BE630C10026497A3042CF +S12333002060816D260BE630C100263A7A304220518173260BE630C100262B7A30422042DB +S123332081712609E630C100261C063168091634172713163365202A3A7C302A3A7C3028F6 +S12333403A7C302610EF348620163577163577163577163577CE3595163551CE359D16355D +S12333605130313A3D353B3416348035A61F163480812B2713812D271A812A2721B7E53159 +S1233380B7E41810B7D4201F7D302E31B7E4F3302E20147D302E31B7E4B3302E2009B7E4F4 +S12333A031138D0000264D8C270F2E488CD8F12D4314101631D8368620163577163577160F +S12333C0357716357732303416355130FD304016354236863D16357732CD30001634D38791 +S12333E07A302F1631D8CE360016355116325310EF3A313D862016357716357716357716ED +S12334003577CE35951635518620163577CE35AB163551303A313D353B34C77B302FCD002C +S123342000A6308139222081302D08028D0004221620EE812B271B812D2717812A271381B7 +S12334402F270F81002723876A008604B702303A313D7A302FA61E81302DEC813922E8CB36 +S123346001C10122E2CD000020B7A61E81302DD7813922D3B6302F27CE87B702303A313D93 +S12334803BCD0000E630272EC12B272AC12D2726C12A2722C12F271EC13A271AC12027167A +S12334A0C1302D17C1392213C03037CC000A13B7C63319ED20CE87B7023A3D8604B7023ABC +S12334C03D343536A67F27056A3020F8876A303231303D34353B8C0000274C2D5336353456 +S12334E08630CE3013CD000516354B3031876A4032CE000A18108E00002708CB306B60B79B +S1233500D420EE8C000026F3B6302F812D26026A60CE30131634C1163551FD3024CE301351 +S12335201635423A31303D86301635773A31303D36862D7A302F3240800150C001C3000148 +S1233540209B36876A300436FB323D6A300436FB3D36A630270516357720F7323D36353486 +S123356016357E27FB810D270A6A3016357703270220ED3031323D4FCC80FC5ACF3D4FCC20 +S1233580200396CF3D873D5463616C633E2000434D443E20004572726F723E2000496E7692 +S12335A0616C696420496E707574004F766572666C6F77204572726F72000D0A436C6F6327 +S12335C06B2073746F7070656420616E64205479706577726974652070726F6772616D20E5 +S12335E0737461727465642E0D0A596F75206D617920747970652062656C6F772E0D0A0087 +S12336002020202020202020202020202020202020202020202000436F6D6D616E64733A7A +S12336200D0A743A20536574207468652074696D6520696E20666F726D61742048483A4D6E +S12336404D3A53530D0A683A20446973706C61792074686520686F757273206F6E207468DF +S1233660652037207365676D656E7420646973706C6179730D0A6D3A20446973706C61793A +S123368020746865206D696E75746573206F6E207468652037207365676D656E74206469EB +S12336A073706C6179730D0A733A20446973706C617920746865207365636F6E6473206FB1 +S12336C06E207468652037207365676D656E7420646973706C6179730D0A713A2053746F0C +S12336E0702074686520636C6F636B20616E6420656E7465722074797065777269746572B9 +S10637000D0A00AB +S105FFF031805A +S9030000FC diff --git a/cmpen472hw10_McDonnell/bin/main.dbg b/cmpen472hw10_McDonnell/bin/main.dbg new file mode 100644 index 0000000..69646bb --- /dev/null +++ b/cmpen472hw10_McDonnell/bin/main.dbg @@ -0,0 +1,973 @@ +************************************************************************** +* +* Title: Calculator Clock +* +* Objective: CMPEN 472 Homework 9 +* +* Revision: V1.0 +* +* Date: Apr. 2, 2025 +* +* Programmer: Jacob McDonnell +* +* Company: The Pennsylvania State University +* Department of Computer Science and Engineering +* +* Algorithm: Simple Serial I/O, Real Time Interrupts for Time Tracking +* +* Register Use: A & B to current byte, etc, +* X & Y holds address of strings and length of string, +* D to hold data for printing, reading, and updating time. +* +* 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 +* +* Observation: The HC12 will output the time and a command prompt every second. +* The user can input commands and the program will output a response +* based on the input. +* +* 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 + +CRGFLG EQU $0037 ; Clock and Reset Generator Flags +CRGINT EQU $0038 ; Clock and Reset Generator Interrupts +RTICTL EQU $003B ; Real Time Interrupt Control + +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 +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 + +hours dc.w $0000 ; Buffer to hold the hours of the time + +minutes dc.w $0000 ; Buffer to hold the minutes of the time + +seconds dc.w $0000 ; Buffer to hold the seconds of the time + +counter dc.w $0000 ; Counter for RTI ISR for 1 second + +numBuf dc.b $0000 ; Used by ReadDecimal for reading numbers + +operator dc.b $0000 ; Used by ReadDecimal for reading numbers + +inputBuffer ds.b $0010 ; Input Buffer Length + +lenInput dc.w $0010 ; Length of the Input Buffer + +outputBuf dc.b 'h' ; Used to control what to output on 7 segment display + +* +* There is a section Data Section at the end of the file +************************************************************************** +* RTI Vector Section: address used [ $FFF0 to $FFF1 ] RAM Memory +* + org $FFF0 ; Memory location for RTI interrupt vector section for simulator + dc.w rtiisr ; Real Time Interrupt vector +* +************************************************************************** +* 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 + + bset RTICTL,%00011001; set RTI: dev=10*(2**10)=2.555msec for C128 board + ; 4MHz quartz oscillator clock + bset CRGINT,%10000000; enable RTI interrupt + bset CRGFLG,%10000000; clear RTI IF (Interrupt Flag) + + ldaa #$FF ; Two 7 segment displays on PORTB + staa DDRB ; Set all of PORTB as output + + ldx #inputBuffer ; Load the address of inputBuffer into X + ldy lenInput ; Load the length of inputBuffer into Y + jsr Zeros ; Zero out inputBuffer + cli ; Enable interrupts + jsr PrintTime ; Jump to PrintTime to write to serial console + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Jump to PrintPrompt to write to serial console +mainLoop + ldx #inputBuffer ; Load the address of inputBuffer into X + ldy lenInput ; Load the length of inputBuffer into Y + jsr ReadString ; Jump to ReadString to read input + + ldx #inputBuffer ; Load the address of inputBuffer into X + jsr ExecuteCommand ; Jump to ExecuteCommand + + ldx #inputBuffer ; Load the address of inputBuffer into X + ldaa 0,x ; Load first character from inputBuffer into A + beq mainLoop ; If A == 0, branch to mainLoop, only zero if Solve was called + ldy lenInput ; Load the length of inputBuffer into Y + jsr Zeros ; Zero out inputBuffer + + sei ; Disable interrupts + jsr PrintTime ; Jump to PrintTime to print new time + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Jump to PrintPrompt to write to serial console + cli ; Enable interrupts + + bra mainLoop ; Loop back to mainLoop always + +TypeWrite + sei ; Disable Interrupts + bclr CRGINT,%10000000; Disable RTI interrupt + ldx #twMsg ; Load the address of twMsg into X + jsr WriteString ; Write the string to the serial console +twLoop jsr getchar ; Read a character from the serial console + tsta ; Compare A to 0 + beq twLoop ; If A == 0, branch to twLoop + staa PORTB ; Write A to PORTB + jsr putchar ; Write character to serial console + bra twLoop ; Branch always to twLoop + +************************************************************************** +* Subroutine Section: address used [ $3100 to $3FFF ] RAM Memory +* + +;************************************************************************* +; rtiisr subroutine +; +; This subroutine will increment the counter, seconds, minutes, & hours counters +; to track the time. This subroutine will be called ~400 times a second. +; +; Input: No input other than the timer to call the isr. +; Output: The counter, seconds, minutes, & hours buffers will +; be updated to track the time, the time & prompt will be +; printed every second. +; Registers in use: X for adding to the counter, seconds, minutes, & hours buffers. +; Memory locations in use: Memory Address for serial line, Memory addresses for RTIISR control, +; Buffer words for counters, seconds, minutes, & hours buffers. +; +; Comments: The counter buffer should be compared to 400, but for the simulator, +; the counter is compared to 200 to better simulate 1 second on my computer. +; + +rtiisr bset CRGFLG,%10000000; Clear RTI Interrupt Flag + ldx counter ; Load counter into X + inx ; Increment counter by 1 + stx counter ; Save X to counter + cpx #200 ; Compare counter to 200, This is about 1 second on my computer + bne rtiSkip ; If counter != 200, branch to rtiSkip + ldx #0 ; Load 0 into X + stx counter ; Save X to counter + ldx seconds ; Load the seconds into X + inx ; Increment the seconds by 1 + stx seconds ; Save the new seconds to the location + cpx #60 ; Compare X to 60 + bne rtidone ; If X != 60, exit isr + ldx #0 ; Reset the seconds + stx seconds ; Save the new seconds to the location + ldx minutes ; load the minutes into X + inx ; Increment the minutes by 1 + stx minutes ; Save the updated minutes + cpx #60 ; Compare the minutes to 60 + bne rtidone ; If X != 60, exit isr + ldx #0 ; Reset the minutes + stx minutes ; Save the updated minutes + ldx hours ; Load the hours into X + inx ; Increment the hours by 1 + stx hours ; Save the updated hours + cpx #24 ; Compare the hours to 24 + bne rtidone ; If X != 24, exit the isr + ldx #0 ; Reset the hours + stx hours ; Save the updated hours +rtidone jsr PrintTime ; Jump to PrintTime + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Jump to PrintPrompt +rtiSkip RTI ; Return from RTI ISR + +;************************************************************************* +; PrintTime subroutine +; +; This subroutine will print the time, command prompt, and maybe an error prompt. +; +; Input: No input. +; Output: The time prompt, time, command prompt, the current input, +; and/or an error on the serial console. +; Registers in use: A for the characters to print, X for buffer addresses, +; Y for buffer lengths, D for the seconds/minutes/hours for calling TimeOnPortB +; Memory locations in use: Memory Address for serial line, Buffer words for counters, +; seconds, minutes, & hours buffers, and buffer to print time, +; outputBuf for tracking what to output on PORTB. +; +; Comments: This subroutine requires TimeOnPortB subroutine and to be setup. The subroutine +; will print the current user input if its not finished. +; + +PrintTime + pshd ; Save D to the stack + pshy ; Save Y to the stack + pshx ; Save X to the stack + ldaa #CR ; Load the character CR into A + jsr putchar ; Write the character to the serial + ldaa #LF ; Load the character LF into A + jsr putchar ; Write the character to the serial + ldx #clock ; Load the address of the clock prompt into X + jsr WriteString ; Write the string to serial + ldd hours ; Load the hours into D + cpd #10 ; Compare D to 10 + bhs goodHours ; If D >= goodHours + psha ; Save A to the stack + ldaa #'0' ; Load '0' character into A + jsr putchar ; Print '0' to the serial + pula ; Restore A from the stack +goodHours ldy #buffer ; Load the address of buffer into Y + jsr PrintDecimalWord; Print the number to the serial + ldaa #':' ; Load the character ':' into A + jsr putchar ; Write the character to the serial + ldd minutes ; Load the minutes into D + cpd #10 ; Compare D to 10 + bhs goodMins ; If D >= goodMins + psha ; Save A to the stack + ldaa #'0' ; Load '0' character into A + jsr putchar ; Print '0' to the serial + pula ; Restore A from the stack +goodMins ldy #buffer ; Load the address of buffer into Y + jsr PrintDecimalWord; Print the number to the serial + ldaa #':' ; Load the character ':' into A + jsr putchar ; Write the character to the serial + ldd seconds ; Load the seconds into D + cpd #10 ; Compare D to 10 + bhs goodSecs ; If D >= goodSecs + psha ; Save A to the stack + ldaa #'0' ; Load '0' character into A + jsr putchar ; Print '0' to the serial + pula ; Restore A from the stack +goodSecs ldy #buffer ; Load the address of buffer into Y + jsr PrintDecimalWord; Print the number to the serial + ldaa outputBuf ; Load outputBuf into A + cmpa #'h' ; Compare A to 'h' + bne pTimeIsM ; If A != 'h', branch to pTimeIsM + ldd hours ; Load hours into B + bra skipRest ; Jump to skipRest +pTimeIsM cmpa #'m' ; Compare A to 'm' + bne pTimeIsS ; If A != 'm', branch to pTimeIsS + ldd minutes ; Load Minutes into D + bra skipRest ; Jump to skipRest +pTimeIsS ldd seconds ; Load seconds into D +skipRest jsr TimeOnPortB ; Call TimeOnPortB to output time + pulx ; Restore X from the stack + puly ; Restore Y from the stack + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; PrintPrompt subroutine +; +; This subroutine will output the CMD prompt and any current input to the serial console +; +; Input: No Input +; Output: The CMD prompt and any input onto the serial console +; Registers in use: X for addresses of strings +; Memory locations in use: PORTB memory location, CMD prompt memory locaiton, inputBuffer location +; +; Comments: This subroutine requires WriteString subroutine. +; + +PrintPrompt + pshx ; Save X to the stack + ldx #CMD ; Load the address of CMD into X + jsr WriteString ; Write the string to the serial + ldx #inputBuffer ; Load the address of the inputBuffer into X + jsr WriteString ; Write the string to the serial + pulx ; Restore X from the stack + rts ; Return + +;************************************************************************* +; TimeOnPortB subroutine +; +; This subroutine will output the time given on on PORTB for two seven segment displays. +; +; Input: Two Digit Decimal number in register D. +; Output: The given two digit decimal number on PORTB for two 7 segment displays. +; Registers in use: D for the input, and for math to split the digits, X for math to split digits. +; Memory locations in use: PORTB memory location. +; +; Comments: This subroutine will only work with two digit decimal numbers, and one digit decimal +; numbers (leading zeros will be added). +; + +TimeOnPortB + pshd ; Save D to the stack + pshx ; Save X to the stack + ldx #10 ; Load 10 into X to get digit + idiv ; Divide D by X and save Digit into D + pshb ; Save B to the stack (Lower Byte of D) + exg x,d ; Swap X and D + ldx #10 ; Load 10 into X to get digit + lslb ; Shift B left by 1 + lslb ; Shift B left by 1 + lslb ; Shift B left by 1 + lslb ; Shift B left by 1 + orab 1,sp+ ; Or B with Digit on stack + stab PORTB ; Save B to PORTB + pulx ; Restore X from the stack + puld ; Restore D from the stack + rts ; Return from caller + +;************************************************************************* +; ExecuteCommand subroutine +; +; This subroutine will parse user input and execute the proper command or error out. +; +; Input: An address of a NULL terminated string in X. +; Output: The output of the proper command or an error message. +; Registers in use: X for the address of the user input, A for individual characters, +; D & Y for numbers read from user input. +; Memory locations in use: Serial console memory locations. +; +; Comments: This subroutine will disable interrupts while setting the time and will +; reenable them after setting the time. +; + +ExecuteCommand + pshd ; Save D to the stack + pshy ; Save Y to the stack + ldaa 1,x+ ; Load the character from X into A + lbeq ecDone ; If A == 0, jump to ecDone + cmpa #'t' ; Compare A to 't' + bne isH ; If A != 't', branch to isH +skipSpaces ldaa 1,+x ; Load the next character into X + cmpa #' ' ; Compare A to ' ' character + beq skipSpaces ; If A == ' ', loop to skipSpaces + sei ; Disable interrupts + ldd hours ; Load hours into D + pshd ; Save hours to the stack + jsr ReadDecimal ; Read Hour number + exg y,d ; Exchange Y and D + cpd #24 ; Compare D to 24 + lbhs badHours ; If D >= 24, badHours + cpd #0 ; Compare D to 0 + lblt badHours ; If D < 0, badHours + std hours ; Save D to hours + ldaa -1,x ; Load the next character into A + cmpa #':' ; Compare A to ':' + lbne badHours ; If A != ':', badHours + ldd minutes ; Load minutes into D + pshd ; Save minutes to the stack + jsr ReadDecimal ; Read minute number + exg y,d ; Exchange Y and D + cpd #60 ; Compare D to 60 + bhs badMinutes ; If D >= 60, badMinutes + cpd #0 ; Compare D to 0 + blt badMinutes ; If D < 0, badMinutes + std minutes ; Save D to minutes + ldaa -1,x ; Load the next character into A + cmpa #':' ; Compare A to ':' + bne badMinutes ; If A != ':', badMinutes + ldd seconds ; Load seconds into D + pshd ; Save seconds to the stack + jsr ReadDecimal ; Read second number + exg y,d ; Exchange Y and D + cpd #60 ; Compare D to 60 + bhs badSeconds ; If D >= 60, badSeconds + cpd #0 ; Compare D to 0 + blt badSeconds ; If D < 0, badSeconds + std seconds ; Save D to seconds + ldaa -1,x ; Load the next character into A + cmpa #NULL ; Compare A to NULL + bne badSeconds ; If A != ':', badSeconds + clra ; Set A to 0 + staa counter ; Clear Counter + cli ; Enable interrupts + puld ; Restore D from the stack + puld ; Restore D from the stack + puld ; Restore D from the stack + bra ecDone ; Branch to ecDone +isH cmpa #'h' ; Compare A to 'h' + bne isM ; If A != 'h', branch to isM + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != CR, bad command + staa outputBuf ; Store A into outputBuf + bra ecDone ; Branch to ecDone +isM cmpa #'m' ; Compare A to 'm' + bne isS ; If A != 'm', branch to isS + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != CR, bad command + staa outputBuf ; Store A into outputBuf + bra ecDone ; Branch to ecDone +isS cmpa #'s' ; Compare A to 's' + bne isQ ; If A != 's', branch to isQ + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != CR, bad command + staa outputBuf ; Store A into outputBuf + bra ecDone ; Branch to ecDone +isQ cmpa #'q' ; Compare A to 'q' + bne isEquation ; If A != 'q', branch to isEquation + ldab 1,x+ ; Load next character into B + cmpb #NULL ; Compare B to NULL + bne badCommand ; If B != NULL, branch to ecDone + jmp TypeWrite ; Jump to TypeWrite +isEquation dex ; Decrement X by 1 + jsr VerifyInput ; Verify input is valid equation + beq badCommand ; If Z == 1, badCommand + jsr Solve ; Jump to Solve to solve equation + bra ecDone ; Branch always to ecDone +badSeconds puld ; Restore Seconds from the stack + std seconds ; Restore seconds before change +badMinutes puld ; Restore minutes from the stack + std minutes ; Restore minutes before change +badHours puld ; Restore hours from the stack + std hours ; Restore hours before change + cli ; Reenable interrupts +badCommand pshx ; Save X to the stack + ldaa #' ' ; Load Space character into A + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + ldx #error ; Load the address of the error prompt into X + jsr WriteString ; Jump to WriteString + ldx #badInput ; Load the address of badInput into X + jsr WriteString ; Jump to WriteString + pulx ; Restore X from the stack +ecDone puly ; Restore Y from the stack + puld ; Restore D from the stack + rts ; Return to caller + +;************************************************************************* +; 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 + 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 + 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 cpd #9999 ; Compare D to 9999 (Max output) + bgt sOverflow ; Branch to sOverflow if D > 9999 + cpd #-9999 ; Compare D to -9999 (Min output) + blt sOverflow ; Branch to sOverflow if D < -9999 + sei ; Disable Interrupts + jsr PrintTime ; Print Time to serial + psha ; Save A to the stack + ldaa #' ' ; Load the space character into A + jsr putchar ; Print the space character to the serial console + jsr putchar ; Print the space character to the serial console + jsr putchar ; Print the space character to the serial console + jsr putchar ; Print the space character to the serial console + pula ; Restore A from the stack + pulx ; Restore X from the stack + pshx ; Save X to the stack + jsr WriteString ; Write original equation to serial console + pulx ; Restore X from the stack + ldy lenInput ; Load the length of the input buffer into Y + jsr Zeros ; Clear input buffer + 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 + clra ; Clear A + staa operator ; Clear operator + jsr PrintTime ; Print the time to the serial console + ldx #spacer ; Load the address of spacer into X + jsr WriteString ; Write the spacer string to the output + jsr PrintPrompt ; Write CMD prompt to serial + cli ; Enable Interrupts + puld ; Restore D from the stack + puly ; Restore Y from the stack + rts ; Return to caller +sOverflow ldaa #' ' ; Load a space character into A + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + jsr putchar ; Jump to putchar to write space character + ldx #error ; Load the address of the error prompt into X + jsr WriteString ; Write original string to serial console + ldaa #' ' ; Load a space character into A + jsr putchar ; Jump to putchar to write space character + 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 + 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 ':' + 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 + pshy ; Save Y to the stack + pshd ; Save D (A:B) 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 + puld ; Restore D (A:B) from the stack + puly ; Restore Y 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 + puld ; Restore D (A:B) from the stack + puly ; Restore Y 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 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 +* + +clock dc.b 'Tcalc> ',NULL ; Prompt string for clock + +CMD dc.b 'CMD> ',NULL ; Prompt string for CMD + +error dc.b 'Error> ',NULL ; Prompt string for errors + +badInput dc.b 'Invalid Input',NULL ; Invalid Input Prompt + +overflow dc.b 'Overflow Error',NULL ; Overflow error message + +; twMsg: welcome message for typewrite +twMsg dc.b CR,LF,'Clock stopped and Typewrite program started.',CR,LF + dc.b 'You may type below.',CR,LF,NULL + +; spacer: the white space between time and cmd prompt +spacer dc.b ' ',NULL + +; msg: this is the main option menu string +msg dc.b 'Commands:',CR,LF + dc.b 't: Set the time in format HH:MM:SS',CR,LF + dc.b 'h: Display the hours on the 7 segment displays',CR,LF + dc.b 'm: Display the minutes on the 7 segment displays',CR,LF + dc.b 's: Display the seconds on the 7 segment displays',CR,LF + dc.b 'q: Stop the clock and enter typewriter',CR,LF,NULL + diff --git a/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Postload.cmd b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Postload.cmd new file mode 100644 index 0000000..ac4d359 --- /dev/null +++ b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Postload.cmd @@ -0,0 +1 @@ +// After load the commands written below will be executed diff --git a/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Preload.cmd b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Preload.cmd new file mode 100644 index 0000000..0bed464 --- /dev/null +++ b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Preload.cmd @@ -0,0 +1 @@ +// Before load the commands written below will be executed diff --git a/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Reset.cmd b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Reset.cmd new file mode 100644 index 0000000..bf55944 --- /dev/null +++ b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Reset.cmd @@ -0,0 +1 @@ +// After reset the commands written below will be executed diff --git a/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_SetCPU.cmd b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_SetCPU.cmd new file mode 100644 index 0000000..6a1549a --- /dev/null +++ b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_SetCPU.cmd @@ -0,0 +1 @@ +// At startup the commands written below will be executed diff --git a/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Startup.cmd b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Startup.cmd new file mode 100644 index 0000000..6a1549a --- /dev/null +++ b/cmpen472hw10_McDonnell/cmd/Full_Chip_Simulation_Startup.cmd @@ -0,0 +1 @@ +// At startup the commands written below will be executed diff --git a/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell.mcp b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell.mcp Binary files differnew file mode 100644 index 0000000..9377caf --- /dev/null +++ b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell.mcp diff --git a/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/CWSettingsWindows.stg b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/CWSettingsWindows.stg Binary files differnew file mode 100644 index 0000000..1f2028b --- /dev/null +++ b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/CWSettingsWindows.stg diff --git a/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/ObjectCode/main.asm.o b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/ObjectCode/main.asm.o Binary files differnew file mode 100644 index 0000000..30d3567 --- /dev/null +++ b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/ObjectCode/main.asm.o diff --git a/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/ObjectCode/main.asm.sx b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/ObjectCode/main.asm.sx new file mode 100644 index 0000000..4207f45 --- /dev/null +++ b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/ObjectCode/main.asm.sx @@ -0,0 +1,55 @@ +S0840000433A5C55736572735C4A61636F62204D63446F6E6E656C6C5C446F63756D656E74735C434D50454E2D3437322D48575C636D70656E3437326877395F4D63446F6E6E656C6C5C636D70656E3437326877395F4D63446F6E6E656C6C5F446174615C5374616E646172645C4F626A656374436F64655C6D61696E2E61736D2E70726DC7 +S123300000000000000000000000000000000000000010000000000000000000000000009C +S123302000000000001000000000000000000000000000000000000000000000000000007C +S106304000106811 +S105FFF031805A +S1233100CF310086F15A03860C5ACBCC00015CC8CE36171635514C3B194C38804C3780864B +S1233120FF5A03CE3030FD304016354210EF1631D8CE3600163551163253CE3030FD304013 +S123314016355DCE303016327ACE3030A60027EAFD304016354214101631D8CE3600163562 +S12331605116325310EF20D214104D3880CE35BA16355116357E9727FA5A0116357720F33B +S12331804C3780FE302C087E302C8E00C82648CE00007E302CFE302A087E302A8E003C2658 +S12331A02ACE00007E302AFE3028087E30288E003C2618CE00007E3028FE3026087E30262B +S12331C08E00182606CE00007E30261631D8CE36001635511632530B3B3534860D16357719 +S12331E0860A163577CE3587163551FC30268C000A240736863016357732CD30001634D346 +S1233200863A163577FC30288C000A240736863016357732CD30001634D3863A163577FC9B +S1233220302A8C000A240736863016357732CD30001634D3B6304281682605FC3026200CBB +S1233240816D2605FC30282003FC302A16326230313A3D34CE358F163551CE3030163551D6 +S1233260303D3B34CE000A181037B7D4CE000A58585858EAB05B01303A3D3B35A630182752 +S123328000E08174266DA620812027FA1410FC30263B163480B7E48C0018182400A28C0016 +S12332A000182D009B7C3026A61F813A18260090FC30283B163480B7E48C003C247E8C0020 +S12332C0002D797C3028A61F813A2670FC302A3B163480B7E48C003C245E8C00002D597C8C +S12332E0302AA61F81002650877A302C10EF3A3A3A206F8168260BE630C10026497A3042CF +S12333002060816D260BE630C100263A7A304220518173260BE630C100262B7A30422042DB +S123332081712609E630C100261C063168091634172713163365202A3A7C302A3A7C3028F6 +S12333403A7C302610EF348620163577163577163577163577CE3595163551CE359D16355D +S12333605130313A3D353B3416348035A61F163480812B2713812D271A812A2721B7E53159 +S1233380B7E41810B7D4201F7D302E31B7E4F3302E20147D302E31B7E4B3302E2009B7E4F4 +S12333A031138D0000264D8C270F2E488CD8F12D4314101631D8368620163577163577160F +S12333C0357716357732303416355130FD304016354236863D16357732CD30001634D38791 +S12333E07A302F1631D8CE360016355116325310EF3A313D862016357716357716357716ED +S12334003577CE35951635518620163577CE35AB163551303A313D353B34C77B302FCD002C +S123342000A6308139222081302D08028D0004221620EE812B271B812D2717812A271381B7 +S12334402F270F81002723876A008604B702303A313D7A302FA61E81302DEC813922E8CB36 +S123346001C10122E2CD000020B7A61E81302DD7813922D3B6302F27CE87B702303A313D93 +S12334803BCD0000E630272EC12B272AC12D2726C12A2722C12F271EC13A271AC12027167A +S12334A0C1302D17C1392213C03037CC000A13B7C63319ED20CE87B7023A3D8604B7023ABC +S12334C03D343536A67F27056A3020F8876A303231303D34353B8C0000274C2D5336353456 +S12334E08630CE3013CD000516354B3031876A4032CE000A18108E00002708CB306B60B79B +S1233500D420EE8C000026F3B6302F812D26026A60CE30131634C1163551FD3024CE301351 +S12335201635423A31303D86301635773A31303D36862D7A302F3240800150C001C3000148 +S1233540209B36876A300436FB323D6A300436FB3D36A630270516357720F7323D36353486 +S123356016357E27FB810D270A6A3016357703270220ED3031323D4FCC80FC5ACF3D4FCC20 +S1233580200396CF3D873D5463616C633E2000434D443E20004572726F723E2000496E7692 +S12335A0616C696420496E707574004F766572666C6F77204572726F72000D0A436C6F6327 +S12335C06B2073746F7070656420616E64205479706577726974652070726F6772616D20E5 +S12335E0737461727465642E0D0A596F75206D617920747970652062656C6F772E0D0A0087 +S12336002020202020202020202020202020202020202020202000436F6D6D616E64733A7A +S12336200D0A743A20536574207468652074696D6520696E20666F726D61742048483A4D6E +S12336404D3A53530D0A683A20446973706C61792074686520686F757273206F6E207468DF +S1233660652037207365676D656E7420646973706C6179730D0A6D3A20446973706C61793A +S123368020746865206D696E75746573206F6E207468652037207365676D656E74206469EB +S12336A073706C6179730D0A733A20446973706C617920746865207365636F6E6473206FB1 +S12336C06E207468652037207365676D656E7420646973706C6179730D0A713A2053746F0C +S12336E0702074686520636C6F636B20616E6420656E7465722074797065777269746572B9 +S10637000D0A00AB +S9033100CB diff --git a/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/TargetDataWindows.tdt b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/TargetDataWindows.tdt Binary files differnew file mode 100644 index 0000000..2273a25 --- /dev/null +++ b/cmpen472hw10_McDonnell/cmpen472hw10_McDonnell_Data/Standard/TargetDataWindows.tdt diff --git a/cmpen472hw10_McDonnell/prm/burner.bbl b/cmpen472hw10_McDonnell/prm/burner.bbl new file mode 100644 index 0000000..0c57619 --- /dev/null +++ b/cmpen472hw10_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 + |
