All pastes #912074 Raw Edit

Stuff

public text v1 · immutable
·published 2008-02-21 03:02 UTC
rendered paste body
.TITLE "assignment1"
.PSIZE 35,80
/*****************************************************************
* FILENAME: lab5
* AUTHOR (STUDENT NAME): Marc Tessier
* STUDENT NUMBER: 040576114
* E-MAIL ADDRESS: tess0072@algonquincollege.com
* LAB SECTION: 313
* ASSIGNMENT NUMBER AND NAME: lab 4 - Read a Line Program 
* PROFESSOR'S NAME: Robert E. Allison
* Purpose: Read lines of ASCII characters from the keyboard
* and store each line in turn into a buffer in memory.
*****************************************************************/

/************ INCLUDES ******************************************/
.NOLIST
.INCLUDE "..\\include\\ascii.i"
.LIST

/************ CONSTANT DATA *************************************/
.TEXT 1
MsgProgramID:
	.ASCIZ "Welcome to the Read a Line Program"

MsgStringFull:
        .ASCIZ "The string is full..."

MsgUserPrompt:
        .ASCIZ "Please enter a string, Press enter for newline or CTRL+D to exit:"

MsgUserExit:
	.ASCIZ "Goodbye!"

.EQU	CRLF,0x0D
.EQU	EOF,0x04

/************* VARIABLE DATA ************************************/
.DATA
String:
        .SPACE 1024,0
CapNext:
	.SPACE 1,0

/************* PROCESS INSTRUCTIONS *****************************/
.TEXT 0
.GLOBAL assignment1

assignment1:
	MOVEA.L #MsgProgramID,A0
	JSR	PrintMsg
	JSR	NewLine
	MOVEA.W #MsgUserPrompt,A0
	JSR	PrintMsg
	JSR	NewLine
	MOVEA.L #String,A0	| Point A0 to the strings location in memory
	MOVE.W	#1024,D1	| Store size of the string
	MOVE.B	#0,D2		| Store amount of characters enteres
	JSR	ReadLine	| Go to Read Line
	RTS

ReadLine:
	JSR	ConsoleIn	| Get character
	JSR	ConsoleOut	| Output character
	ADDQ.B	#1,D3		| Increment Total Character Count
	CMP.B	#CRLF,D0	| If "Enter" Go to New Line
	BEQ.W	NewLine
	CMP.B	#EOF,D0		| If "Ctrl+D" Go to End Program
	BEQ.W	EndProgram
        ADDQ.B  #1,D2		| Increament Character Count
	MOVE.W	D0,(A0)		| Move character into string
	ADDQ.L	#1,A0		| Increament the string
	SUBQ.B	#1,D1		| Subtract 1 from characters remaining
	CMP.B	#0,D1		| If string is full
	BEQ.W	StringFull
        JMP     ReadLine	| Repeat
	

StringFull:
	MOVEA.L	A0,A1		| Move A0 to A1
	SUBA.L	#1,A1		| Go to the beggining of the last character
	CMP.B	#0x00,(A1)	| If that character is "EOL" End Program
	BEQ.W	EndProgram
	MOVE.B	#-1,D0		| Else Return -1(String Overflow)
	JSR	NewLine
        MOVEA.L #MsgStringFull,A0
        JSR     PrintMsg
        JMP     EndProgram	| Go to End of Program

NewLine:
        MOVE.B  #0x00,(A0)	| Attach "EOL" to what user entered
	ADDQ.L	#1,A0		| Increment the string
	ADDQ.B	#1,D2		| Increment the character count
	SUBQ.B	#1,D1		| Decrease size characters remaining
	MOVEA.L	#CapNext,A3	| Load my capitalise flag into A3
	MOVE.B	#1,(A3)		| Set my capitalise flag to 1 for first character
	JSR	CharCheck	| Go to my Capitalisation check function
	JSR	PrintMsg	| Output user input
	JSR	NewLine		
	MOVEA.L	A0,A2		| Move string into "safe" place
	SUBA.L	D2,A0		| Go to begining of string
	MOVEA.L A2,A0		| Move A2 back to A0
	CMP.B	#0,D1		| Check if string is full
	BEQ.W	StringFull	
	MOVE.B	#0,D2		| Reset The string buffer
        JMP     ReadLine	| Go to Read Line
	
CharCheck:
	CMP.B	#0X00,(A0)	| Check to see if we are at the EOL
	BEQ.W	EndProgram	
	CMP.B   #1,(A0)		| If the capatalise flag is up
	BEQ.W	CapChar		| Capitalise that character
	CMP.B   #0x21,(A0) 	| Check for ! character
	BEQ.W   FlagSet
	CMP.B   #0x3F,(A0) 	| Check for ? character
	BEQ.W   FlagSet
	CMP.B   #0x2E,(A0) 	| Check for . character
	BEQ.W   FlagSet
	CMP.B   #0x69,(A0) 	| Check for i character
	BEQ.W   iCap
	CMP.B   #0x41,(A0) 	| Check for < A
	BLT.W   NextChar
	CMP.B   #0x5A,(A0) 	| Check for > Z
	BGT.W   NextChar
	MOVE.B  (A0),D0		| Load character into D0
	JSR     ToUpper		| Make character upper case
	MOVE.B  D0,(A0)		| Return character to string	
	MOVE.B  #0,(A3)   	| Remove the capatalise flag
	JMP     NextChar	| Go to next character

iCap:

CapChar:
	CMP.B   #0x21,(A0)	| Check for ! character
        BEQ.W   FlagSet
	CMP.B   #0x3F,(A0)	| Check for ? character
	BEQ.W   FlagSet
	CMP.B   #0x2E,(A0)	| Check for . character
	BEQ.W   FlagSet
	CMP.B   #0x30,(A0)	| Check for > 0
	BLT.W   NextChar
	CMP.B   #0x39,(A0)	| Check for < 9 
	BLT.W   AlreadyCap
	CMP.B   #0x41,(A0)	| Check for below A
	BLT.W   NextChar
	CMP.B   #0x5A,(A0)	| Check for below Z
	BLT.W   AlreadyCap
	CMP.B   #0x61,(A0)	| Check for below a
	BLT.W   NextChar
	CMP.B   #0x7A,(A0)	| Check for above z
	BGT.W   NextChar
	MOVE.B  (A0),D0		| Load character into D0
	JSR     ToUpper		| Make character upper case
	MOVE.B  D0,(A0)		| Return character to string	
	MOVE.B  #0,(A3)   	| Remove the capatalise flag
	JMP     NextChar

FlagSet:
	MOVE.B  #1,(A3)		| Set the capatalise flag
	JMP     NextChar	| Get next character

AlreadyCap:
	MOVE.B  #0,(A3)		| Remove the capatalise flag
	JMP     NextChar	| Get next character

NextChar:
	ADDQ.L  #1,A0		| Go to the next character
	JMP CharCheck		| Go check the new character

EndProgram:
	CMP.B	#-1,D0		| If String overflow go straigh to EOP
	BEQ.W	Finish
	MOVE.W	#1024,D3	| Else subtract the total amount
	SUB.B	D1,D3		| of characters enter from the
	MOVE.B	D3,D0		| total amount possible
	
Finish:
	MOVE.B	#0,(A0)		| Null A0
	MOVEA.L	#MsgUserExit,A0	
	JSR	PrintMsg
        RTS			| End program
/********* END OF PROGRAM **************************************/