180 likes | 304 Views
ME 4447/6405. Microprocessor Control of Manufacturing Systems and Introduction to Mechatronics Instructor: Professor Charles Ume Lecture #12. MON12 Utility Subroutines. MON12 Utility Subroutines. MON12 Utility Subroutines These subroutines are available for performing I/O tasks.
E N D
ME 4447/6405 Microprocessor Control of Manufacturing Systems and Introduction to Mechatronics Instructor: Professor Charles Ume Lecture #12
MON12 Utility Subroutines MON12 Utility Subroutines These subroutines are available for performing I/O tasks. A jump table has been set up in EEPROM beneath the interrupt vectors. To use these subroutines, execute a jump to subroutine (JSR) command to the appropriate entry in the jump table.
Subroutine Listing UPCASE If character in accumulator A is lower case alpha, convert to upper case. WCHEK Test character in accumulator A and return with Z bit set if character is whitespace (space, comma, tab). DCHEK Test character in accumulator A and return with Z bit set if character is delimiter (carriage return or whitespace). ONSCIO Initialize I/O device. INPUT Read I/O device. OUTPUT Write I/O device. OUTLHLF Convert left nibble of accumulator A contents to ASCII and output to terminal port. OUTRHLF Convert right nibble of accumulator A contents to ASCII and output to terminal port.
Subroutine Listing Cont’d OUTA Output accumulator A ASCII character. OUT1BYT Convert binary byte at address in index register X to two ASCII characters and output. Return address in index register X pointing to next byte. OUT1BSP Convert binary byte at address in index register X to two ASCII characters and output followed by a space. Returns address in index register. OUT2BSP Convert two consecutive binary bytes starting at address in index X to four ASCII characters and output followed by a space. Returns address in index register X pointing to next byte. OUTCCRLF Output ASCII carriage return followed by a line feed. OUTSTRG Output string of ASCII bytes pointed to by address in index register X until character is an end of transmission ($04). OUTSTRGO Same as OUTSTRG except leading carriage return and line feed is skipped. INCHAR Waits for you to type an ASCII character from the keyboard, and stores the corresponding ASCII number in accumulator A, and then outputs the ASCII character to the screen.
$FF37 UPCASE Convert character to uppercase $FF3A WCHEK Test character for whitespace $FF3D DCHEK Check character for delimiter $FF40 ONSCIO Initialize I/O device $FF43 INPUT Read I/O device $FF46 OUTPUT Write I/O device $FF49 OUTLHLF Convert left nibble to ASCII and output $FF4C OUTRHLF Convert right nibble to ASCII and output $FF4F OUTA Output ASCII character $FF52 OUTlBYT Convert binary byte to 2 ASCII characters and output $FF55 OUT1BSP Convert binary byte to 2 ASCII characters and output followed by space $FF58 OUT2BSP Convert 2 consecutive binary bytes to 4 ASCII characters and output followed by space. $FF5B OUTCRLF Output ASCII carriage return followed by line feed $FF5E OUTSTRG Output ASCII string until end of transmission ($04) $FF61 OUTSTRGO Same as OUTSTRG except leading carriage return and line feed is skipped $FF64 INCHAR Input ASCII character and echo back To use an I/O subroutine, Jump Sub Routine (JSR) to the specified address listed below.ADDRESSSUBROUTINEFUNCTION
Utility Subroutines Examples Example: OUTA ORG $1000 LDAA #$41 *Load acc. A with ASCII code for the *character A. JSR $FF4F *JSR to the subroutine OUTA SWI END Result A is written to the screen.
Utility Subroutines Examples Example: OUTSTRG (Out ASCII CharacterString until EOT, $04, is encountered) STR1 EQU $2100 OUTSTRG EQU $FF5E ORG STR1 FCC “ABCDEFG” FCB #$04 ORG $1000 LDX #STR1 JSR OUTSTRG *Go to OUTSTRG routine which *outputs ASCII characters contained in each *address starting from $2100 until *an EOT character is found. SWI END ResultABCDEFG written to the screen on a new line. (Note: ASCII end of transmission (EOT) character must be used with the OUTSTRG subroutine to let it know when to stop reading from memory. EOT ASCII = #$04)
Difference Between the Utility Subroutines OUTSTRG and OUTSTRG0 Assume you want to print the following to the screen: MEMORY LOCATION $_____CONTAINS _____ IN DECIMAL. Use subroutine OUTSTRG to print “MEMORY LOCATION $” to screen on a new line (It always starts printing on a new line, because it outputs carriage return with line feed). Use subroutine OUTSTRG0 to print “CONTAINS” to screen on same line as “MEMORY LOCATION $” (Because it does not output carriage return with line feed) Use subroutine OUTSTRG0 to print “IN DECIMAL.” to screen on the same line (Note: Refer to Lab website for example program to print decimal numbers to the screen.)
Example:OUTLHLF(OutLeftHalf) andOUTRHLF(OutRightHalf) ORG $1000 LDAA #$AF *Puts hex number $AF in acc. A JSR $FF49 *Goes to subroutine OUTLHLF which converts left *nibble, #$A, to ASCII number, $41, and then outputs *its ASCII character, ‘A, to the screen. LDAA #$AF *Reload Acc. A since OUTLHLF modifies the contents of *Acc. A JSR $FF4C *Goes to subroutine OUTRHLF which converts right *nibble, #$F, to ASCII number, $46, and then outputs *its ASCII character, ‘F, to the screen. SWI END Result AF is written to the screen. Utility Subroutines Examples
Example: OUT1BYT (Out1Byte) and OUT1BSP (Out1Byte with Space) Assume that memory contains the following: 2100 FA FB Now execute the following code: ORG $1000 LDX #$2100 JSR $FF52 *Goes to subroutine OUT1BYT which converts the *content of the address pointed to by the X register to *two ASCII equivalents and outputs their characters to *the screen, and increments X register by #$1. JSR $FF55 *Goes to subroutine OUT1BSP which converts the *content of the address pointed to by the X register to *two ASCII equivalents and outputs their characters to the *screen followed by a space. SWI END Result FAFB_ sent to screen (Note: last character is a space) Utility Subroutines Examples
Example: OUT2BSP (Out 2Bytes with Space) Assume that memory contains the following: 2100 FA FB Now execute the following code. ORG $1000 LDX #$2100 JSR $FF58 *JSR to subroutine OUT2BSP which converts two *consecutive binary bytes to their 4 ASCII numbers *and outputs their ASCII characters to the screen followed by a *space. SWI END ResultFAFB_ sent to screen (last character is a space). Utility Subroutines Examples
Example: OUTCRLF (Output Carriage Return with Line Feed) ORG $1000 JSR $FF5B *Go to subroutine OUTCRLF *which outputs ASCII carriage return *followed by a line feed. SWI END Result New line on screen (Note:Equivalent to pressing Enter in your computer) Utility Subroutines Examples
Example: INCHAR (Input Character) ORG $1000 JSR $FF64 *Goes to subroutine INCHAR. Waits for you to *type an ASCII character from the keyboard, *and stores the corresponding ASCII number in *accumulator A SWI END Result-> If you type 9 on the keyboard, ASCII number $39 is stored in accumulator A Utility Subroutines Examples
Example • Write an assembly language program to output a string of characters to the screen. • Solution: This particular solution will print “Hello” to the screen using the OUTA subroutine OUTA EQU $FF4F ORG $2000 FCC “HELLO” FCB #$04 ORG $1000 LDX #$2000 Loop LDAA $00,X CMPA #$04 BEQ Quit JSR OUTA INX BRA Loop Quit SWI END FCC is used to store a string of characters FCB is used to store End Of Transmission (EOT) (Note: EOT in ASCII is $04) (Note 2: In this particular example any non-printing character can be used)
Program Initialization Skip Ahead Until Last Loop CPU Registers Used in Program: OUTA EQU $FF4F ORG $2000 FCC “Hello” FCB #$04 ORG $1000 LDX #$2000 Loop LDAA $00,X CMPA #$04 BEQ Quit JSR OUTA INX BRA Loop Quit SWI END #$48 #$6F #$04 #$65 CCR Z is 1 since Accum A equals $04 CCR Z is 0 since Accum A does not equal $04 #$2005 #$2001 #$2002 #$2000 0 1 Memory Locations Used in Program: Does not branch because CCR Z is 0 Branch since CCR Z is 1 $48 Always Branches $65 Ascii Equivalent of “Hello” $6C Computer Screen: $6C e H llo $6F $04
Solution 2: This particular solution will print “Hello” to the screen using the OUTSTRG subroutine OUTSTRG EQU $FF5E ORG $2000 FCC “HELLO” FCB #$04 ORG $1000 LDX #$2000 JSR OUTSTRG SWI END OUTSTRG: Output ASCII string until end of transmission ($04) (Note: EOT must be used because the OUTSTRG Subroutine uses EOT as the end of the string)