.TITLE "assign1"
.PSIZE 35,200
/*****************************************************************
******************************************************************
FILENAME: assignment1.a86
AUTHOR (STUDENT NAME): Jason Reid
STUDENT NUMBER: 040561786
E-MAIL ADDRESS: reid.jason@gmail.com
LAB SECTION: 313
ASSIGNMENT NUMBER AND NAME: Lab 5
PROFESSOR'S NAME: Robert Allison
PURPOSE: To read multiple lines from the user.
******************************************************************
*****************************************************************/
/************ [INCLUDE FILES] ***********************************/
.NOLIST
.INCLUDE "..\\include\\ascii.i" | ASCII symbols
.LIST
/*****************************************************************
*****************************************************************/
/************ [CONSTANT DATA] ***********************************/
.TEXT 1
WelcomeMessage: .ASCII "Enter a string, enter to seperate lines, ^D to quit."
.BYTE CR,LF,0
MaxMessage: .ASCII "Maximum amount of space reached."
.BYTE CR,LF,0
ExitMessage: .ASCII "Thank you for using the program."
.BYTE CR,LF,0
errorReport: .ASCII "An error occured with readLine, D0 is -1."
.BYTE CR,LF,0
CharMessage: .ASCII "Amount of characters entered: "
.BYTE CR,LF,0
debugmsg: .ASCII "WOOT"
.BYTE CR,LF,0
.EQU EOF,0x04
.EQU CRLF,0x0D
.EQU BACK,0x08
/*****************************************************************
*****************************************************************/
/************ [DATA] ********************************************/
.DATA
string: .SPACE 1024,0
capNext: .SPACE 1,0
/*****************************************************************
*****************************************************************/
/************ [VARIABLES] ***************************************/
.TEXT 0
.GLOBAL assign1
/*****************************************************************
*****************************************************************/
/************ [CODE] ********************************************/
assign1:
MOVEA.L #WelcomeMessage,A0
JSR NewLine
JSR PrintMsg | Output the welcome message.
JSR NewLine
MOVEA.L #string,A0 | Store location of string in A0
MOVE.W #1024,D1 | Store buffer size in D1
MOVE.B #0,D2 | Initiate D2 (used for count)
JSR readLine | readLine subrutine
CMP.B #-1,D0 | Check to see if an error returned
BNE.B endProgram | If no error occured
MOVEA.L #errorReport,A0
JSR NewLine
JSR PrintMsg | Ouput error message
endProgram:
MOVE.B #2,D1
MOVEA.L #CharMessage,A0
JSR NewLine
JSR PrintMsg
JSR OutHex
RTS
readLine:
JSR ConsoleIn
CMP.B #CRLF,D0
BEQ.W detectEnter | If the character hits enter.
CMP.B #EOF,D0
BEQ.W detectEOF | If the user enters the EOF character.
CMP.B #BACK,D0
BEQ.W detectBackspace
MOVE.B D0,(A0) | Store the character in the buffer.
JSR ConsoleOut
ADDQ.L #1,A0 | Increase by one so we are pointing to next memory location.
ADDQ.B #1,D2 | Increase temporary character count by one.
SUBQ.B #1,D1 | Decrease the variable buffer size.
CMP.B #0,D1
BEQ.W bufferFull
JMP readLine
detectEnter:
JSR NewLine
MOVE.B #0x00,(A0)
ADDQ.L #1,A0
ADDQ.B #1,D2 | Increase the temporary character count by one.
SUBQ.B #1,D1
MOVEA.L A0,A1 | Store A0 into A1 so we can manipulate it the A0 (for PrintMsg)
SUBA.L D2,A0 | Goto the start of the string.
JSR fixCaps
JSR PrintMsg | Print the name just entered.
JSR NewLine
MOVEA.L A1,A0 | Move stored A1 back into A0
MOVE.B #0,D2 | Empty the character count.
CMP.B #0,D1
BEQ.W bufferFull
JMP readLine
detectBackspace:
CMP.B #0,D2
BEQ.W readLine
JSR ConsoleOut
SUBQ.B #1,D2
ADDQ.B #1,D1
SUBA.L #1,A0
JMP readLine
fixCaps:
MOVEA.L #capNext,A4
MOVE.B #1,(A4)
MOVEA.L A0,A2
loopChar:
CMP.B #0x00,(A2)
BEQ.W endFixCaps
MOVEA.L #capNext,A4
CMP.B #1,(A4)
BEQ.W capChar
CMP.B #0x21,(A2) | If its a !
BEQ.W flagCaps
CMP.B #0x3F,(A2) | If its a ?
BEQ.W flagCaps
CMP.B #0x2E,(A2) | If its a .
BEQ.W flagCaps
CMP.B #0x69,(A2) | If its an i
BEQ.W capI
CMP.B #0x41,(A2) | below A
BLT.W nextChar
CMP.B #0x5A,(A2) | above Z
BGT.W nextChar
MOVE.B (A2),D0
JSR ToLower
MOVE.B D0,(A2)
MOVE.B #0,(A4)
JMP nextChar
capI:
MOVEA.L A2,A3
SUBA.L #1,A3
CMP.B #0x20,(A3) | If the previous character is not a space
BNE.W nextChar
ADDQ.L #2,A3 | If the next character is not a space
CMP.B #0x20,(A3)
BNE.W nextChar
MOVE.B (A2),D0
JSR ToUpper
MOVE.B D0,(A2)
JMP nextChar
capChar:
CMP.B #0x21,(A2) | If its a !
BEQ.W flagCaps
CMP.B #0x3F,(A2) | If its a ?
BEQ.W flagCaps
CMP.B #0x2E,(A2) | If its a .
BEQ.W flagCaps
CMP.B #0x30,(A2) | If its below 0
BLT.W nextChar
CMP.B #0x39,(A2) | If its a number... dont caps.. duh
BLT.W isCapChar
CMP.B #0x41,(A2) | If its below A
BLT.W nextChar
CMP.B #0x5A,(A2) | If its below Z but A or above... capital.
BLT.W isCapChar
CMP.B #0x61,(A2) | If its below a, but not A-Z
BLT.W nextChar
CMP.B #0x7A,(A2) | If its above z, so not A-Z
BGT.W nextChar
MOVE.B (A2),D0
JSR ToUpper
MOVE.B D0,(A2)
MOVEA.L #capNext,A4
MOVE.B #0,(A4) | Unflag capitalization.
JMP nextChar
flagCaps:
|MOVEA.L #debugmsg,A0
|JSR PrintMsg
MOVEA.L #capNext,A4
MOVE.B #1,(A4)
JMP nextChar
isCapChar:
MOVEA.L #capNext,A4
MOVE.B #0,(A4)
JMP nextChar
nextChar:
ADDQ.L #1,A2
JMP loopChar
endFixCaps:
RTS
bufferFull:
MOVEA.L A0,A1 | Store A0 into A1 so we can manipulate it.
SUBQ.L #1,A1 | Subtract 1 from A1 to point to last character.
CMP.B #0x00,(A1) | Check to see if the last character was CR
BEQ.B detectEOF | End the program.
JSR NewLine
MOVEA.L #MaxMessage,A0
JSR PrintMsg
ADDQ.L #1,A1
MOVEA.L A1,A0
MOVE.B #-1,D0 | Set D0 to -1 as we hit the buffer size and the last character is not CR.
detectEOF:
CMP.B #-1,D0
BEQ.B finish
MOVE.W #1024,D3 | Move our total size into D0.
SUB.B D1,D3 | Subtract space left from total size
MOVE.B D3,D0 | Move amount of characters into D0 per specs.
finish: MOVEA.L A0,A1 | Store A0 into A1 so we can output a message.
JSR NewLine
MOVEA.L #ExitMessage,A0
JSR PrintMsg | Print Exit Message
MOVEA.L A1,A0
MOVE.B #0 ,(A0)
RTS
/*****************************************************************
******************************************************************
************** [END OF PROGRAM] *********************************/