diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-02-19 11:44:00 -0500 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2025-02-19 11:44:00 -0500 |
| commit | 2ed987d75b46bac8457b2836b3bd64dcc77ea90c (patch) | |
| tree | 74e72f6729e934f089cdab198c6a35f49b8d5b69 /cmpen472hw5_McDonnell/Sources/example.asm | |
| parent | 9503fe39e53e9c7a2147be9bdb22479035130966 (diff) | |
HW 5 Final???
Diffstat (limited to 'cmpen472hw5_McDonnell/Sources/example.asm')
| -rw-r--r-- | cmpen472hw5_McDonnell/Sources/example.asm | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/cmpen472hw5_McDonnell/Sources/example.asm b/cmpen472hw5_McDonnell/Sources/example.asm new file mode 100644 index 0000000..323f7ce --- /dev/null +++ b/cmpen472hw5_McDonnell/Sources/example.asm @@ -0,0 +1,211 @@ +*********************************************************************** +* +* Title: SCI Serial Port and 7-segment Display at PORTB +* +* Objective: CMPEN 472 Homework 5, in-class-room demonstration +* program +* +* Revision: V3.2 for CodeWarrior 5.2 Debugger Simulation +* +* Date: Sep. 16, 2020 +* +* Programmer: Kyusun Choi +* +* Company: The Pennsylvania State University +* Department of Computer Science and Engineering +* +* Program: Simple SCI Serial Port I/O and Demonstration +* Typewriter program and 7-Segment display, at PORTB +* +* +* Algorithm: Simple Serial I/O use, typewriter +* +* Register use: A: Serial port data +* X,Y: Delay loop counters +* +* Memory use: RAM Locations from $3000 for data, +* RAM Locations from $3100 for program +* +* Output: +* PORTB bit 7 to bit 4, 7-segment MSB +* PORTB bit 3 to bit 0, 7-segment LSB +* +* Observation: This is a typewriter program that displays ASCII +* data on PORTB - 7-segment displays. +* +*********************************************************************** +* Parameter Declearation Section +* +* Export Symbols + XDEF pstart ; export 'pstart' symbol + ABSENTRY pstart ; for assembly entry point + +* Symbols and Macros +PORTB EQU $0001 ; i/o port B addresses +DDRB EQU $0003 + +SCIBDH EQU $00C8 ; Serial port (SCI) Baud Register H +SCIBDL EQU $00C9 ; Serial port (SCI) Baud Register L +SCICR2 EQU $00CB ; Serial port (SCI) Control Register 2 +SCISR1 EQU $00CC ; Serial port (SCI) Status Register 1 +SCIDRL EQU $00CF ; Serial port (SCI) Data Register + +CR equ $0d ; carriage return, ASCII 'Return' key +LF equ $0a ; line feed, ASCII 'next line' character + +*********************************************************************** +* Data Section: address used [ $3000 to $30FF ] RAM memory +* + ORG $3000 ; Reserved RAM memory starting address + ; for Data for CMPEN 472 class +Counter1 DC.W $008F ; X register count number for time delay + ; inner loop for msec +Counter2 DC.W $000C ; Y register count number for time delay + ; outer loop for sec +msg1 DC.B 'Hello', $00 +msg2 DC.B 'You may type below', $00 +; Each message ends with $00 (NULL ASCII character) for your program. +; +; There are 256 bytes from $3000 to $3100. If you need more bytes for +; your messages, you can put more messages 'msg3' and 'msg4' at the end of +; the program - before the last "END" line. + ; Remaining data memory space for stack, + ; up to program memory start + +* +*********************************************************************** +* Program Section: address used [ $3100 to $3FFF ] RAM memory +* + ORG $3100 ; Program start address, in RAM +pstart LDS #$3100 ; initialize the stack pointer + + LDAA #%11111111 ; Set PORTB bit 0,1,2,3,4,5,6,7 + STAA DDRB ; as output + + LDAA #%00000000 + STAA PORTB ; clear all bits of PORTB + + 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) +; ldd #$0002 ; Set SCI Baud Register = $0002 => 750K baud at 24MHz +; ldd #$000D ; Set SCI Baud Register = $000D => 115200 baud at 24MHz +; ldd #$009C ; Set SCI Baud Register = $009C => 9600 baud at 24MHz + std SCIBDH ; SCI port baud rate change + + ldx #msg1 ; print the first message, 'Hello' + jsr printmsg + + ldaa #CR ; move the cursor to beginning of the line + jsr putchar ; Cariage Return/Enter key + ldaa #LF ; move the cursor to next line, Line Feed + jsr putchar + + ldx #msg2 ; print the second message + jsr printmsg + + ldaa #CR ; move the cursor to beginning of the line + jsr putchar ; Cariage Return/Enter key + ldaa #LF ; move the cursor to next line, Line Feed + jsr putchar + +looop jsr getchar ; type writer - check the key board + cmpa #$00 ; if nothing typed, keep checking + beq looop + ; otherwise - what is typed on key board + jsr putchar ; is displayed on the terminal window - echo print + + staa PORTB ; show the character on PORTB + + cmpa #CR + bne looop ; if Enter/Return key is pressed, move the + ldaa #LF ; cursor to next line + jsr putchar + bra looop + + +;subroutine section below + +;***********printmsg*************************** +;* Program: Output character string to SCI port, print message +;* Input: Register X points to ASCII characters in memory +;* Output: message printed on the terminal connected to SCI port +;* +;* Registers modified: CCR +;* Algorithm: +; Pick up 1 byte from memory where X register is pointing +; Send it out to SCI port +; Update X register to point to the next byte +; Repeat until the byte data $00 is encountered +; (String is terminated with NULL=$00) +;********************************************** +NULL equ $00 +printmsg psha ;Save registers + pshx +printmsgloop ldaa 1,X+ ;pick up an ASCII character from string + ; pointed by X register + ;then update the X register to point to + ; the next byte + cmpa #NULL + beq printmsgdone ;end of strint yet? + jsr putchar ;if not, print character and do next + bra printmsgloop + +printmsgdone pulx + pula + rts +;***********end of printmsg******************** + + +;***************putchar************************ +;* Program: Send one character to SCI port, terminal +;* Input: Accumulator A contains an ASCII character, 8bit +;* Output: Send one character to SCI port, terminal +;* Registers modified: CCR +;* Algorithm: +; Wait for transmit buffer become empty +; Transmit buffer empty is indicated by TDRE bit +; TDRE = 1 : empty - Transmit Data Register Empty, ready to transmit +; TDRE = 0 : not empty, transmission in progress +;********************************************** +putchar brclr SCISR1,#%10000000,putchar ; wait for transmit buffer empty + staa SCIDRL ; send a character + rts +;***************end of putchar***************** + + +;****************getchar*********************** +;* Program: Input one character from SCI port (terminal/keyboard) +;* if a character is received, other wise return NULL +;* Input: none +;* Output: Accumulator A containing the received ASCII character +;* if a character is received. +;* Otherwise Accumulator A will contain a NULL character, $00. +;* Registers modified: CCR +;* Algorithm: +; Check for receive buffer become full +; Receive buffer full is indicated by RDRF bit +; RDRF = 1 : full - Receive Data Register Full, 1 byte received +; RDRF = 0 : not full, 0 byte received +;********************************************** +getchar brclr SCISR1,#%00100000,getchar7 + ldaa SCIDRL + rts +getchar7 clra + rts +;****************end of getchar**************** + + +;OPTIONAL +;more variable/data section below +; this is after the program code section +; of the RAM. RAM ends at $3FFF +; in MC9S12C128 chip + +msg3 DC.B 'Enter your command below:', $00 +msg4 DC.B 'Error: Invalid command', $00 + + + END ; this is end of assembly source file + ; lines below are ignored - not assembled/compiled |
