Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .ORIG x3000
- START AND R0, R0, #0 ;initialize all registers to 0, except for R7
- AND R1, R1, #0
- AND R2, R2, #0
- AND R3, R3, #0
- AND R4, R4, #0
- AND R5, R5, #0
- AND R6, R6, #0
- LD R1, User_Char ;load variables
- LD R2, This_Digit
- LD R3, Neg_Flag
- LD R4, User_Int
- LEA R0, STARTPROMPT ;print welcome message
- PUTS
- AND R0, R0, #0
- LEA R0, OPTIONPROMPT ;print option message
- PUTS
- GET_USER_CHAR
- AND R0, R0, #0 ;reset R0 for user input
- AND R1,R1,0
- GETC
- OUT
- ADD R1, R1, R0 ;Update User_Char
- ADD R0, R0, #-16 ;Subtract 45 (-) from ASCII value in R1
- ADD R0, R0, #-16
- ADD R0, R0, #-13
- BRz SET_NEG_FLAG ;Branch out to SET_NEG_FLAG if character in User_Char is '-'
- AND R0, R0, #0 ;Reload User_Char into R0
- ADD R0, R0, R1
- ADD R0, R0, #-16 ;Subtract 88 (X) from ASCII value in R1
- ADD R0, R0, #-16
- ADD R0, R0, #-16
- ADD R0, R0, #-16
- ADD R0, R0, #-16
- ADD R0, R0, #-8
- BRz GOODBYE ;Branch out to GOODBYE if character in User_Char is 'X'
- AND R0, R0, #0 ;Subtract 10 (Newline) from ASCII value in R1 moved to R0
- ADD R0, R0, R1
- ADD R0, R0, #-10
- BRnp UPDATE_INT ;Branch out to UPDATE_INT if character in User_Char is NOT '\n'
- ADD R3, R3, #0
- BRnz PRINT_USER_INT_LOOP ;Branch out to PRINT_USER_INT_LOOP if Neg_Flag is NOT set
- NOT R4, R4
- ADD R4, R4, #1
- BR PRINT_USER_INT_LOOP ;Branch out to PRINT_USER_INT_LOOP after taking 2SC of User_Int
- SET_NEG_FLAG
- ADD R3, R3, #1 ;Neg_Flag=1
- BR GET_USER_CHAR ;Branch back to user input
- UPDATE_INT
- AND R0, R0, #0
- ADD R0, R0, R1
- ADD R0, R0, #-16 ;Subtract "0" in ASCII from inputted value
- ADD R0, R0, #-16
- ADD R0, R0, #-16
- AND R2, R2, #0
- ADD R2, R0, #0 ;Update This_Digit
- AND R0, R0, #0 ;Reset R0 for updating User_Int
- ADD R0, R4, R4 ;R0=2*R4(original)
- ADD R4, R4, R4 ;R4=2*R4(original)
- ADD R4, R4, R0
- ADD R4, R4, R0
- ADD R4, R4, R0
- ADD R4, R4, R0 ;R4=10*R4(original)
- ADD R4, R4, R2 ;User_Int=User_Int*10+This_Digit
- BR GET_USER_CHAR ;Branch back to user input
- PRINT_USER_INT_LOOP
- AND R0, R0, #0
- ADD R0, R0, R5 ;R5 is both an offset for array element retrieval, and loop counter
- ADD R0, R0, #-15
- ADD R0, R0, #-1 ;Check whether all 16 bits of User_Int were accessed
- BRz PRINT_NEWLINE ;Print '\n' after 16 binary digits of User_Int have been printed
- AND R0, R0, #0 ;clears R0 for storage of array elements
- AND R6, R6, #0 ;clears previous bit mask retrieved from Mask_Array
- LEA R6, Mask_Array ;store Mask_Array pointer in R6
- ADD R6, R6, R5 ;add offset value of R5 to Mask_Array pointer
- LDR R0, R6, #0 ;Load array value at R6+R5 into R0
- AND R0, R0, R4 ;Look at specific bit of User_Int
- BRnp ONE ;Branch out to print '1' if specific bit of User_Int is non-zero
- AND R0, R0, #0 ;Resets R0 to be used for printing '1'
- LEA R0, Zero
- LDR R0, R0, #0 ;load string "0" into R0
- PUTC
- BR INCREMENT ;Branch to INCREMENT to increment loop counter by 1
- ONE AND R0, R0, #0 ;Resets R0 to be used for printing '0'
- LEA R0, One
- LDR R0, R0, #0 ;load string "1" into R0
- PUTC
- INCREMENT ADD R5, R5, #1 ;Increments offset
- BR PRINT_USER_INT_LOOP
- PRINT_NEWLINE ;Print newline, option prompt, and return to user input
- AND R0, R0, #0
- LEA R0, New_Line ;print newline
- PUTS
- AND R0, R0, #0
- LEA R0, OPTIONPROMPT ;print option message
- PUTS
- BR START
- GOODBYE
- AND R0, R0, #0
- LEA R0, New_Line ;print \n
- PUTS
- AND R0, R0, #0
- LEA R0, ENDPROMPT ; prints exit message
- PUTS
- HALT
- STARTPROMPT .STRINGZ "Welcome to the conversion program!\n"
- ENDPROMPT .STRINGZ "Bye. Have a great day."
- OPTIONPROMPT .STRINGZ "Enter a decimal number or X to quit:\n"
- User_Char .FILL #0
- This_Digit .FILL #0
- Neg_Flag .FILL #0
- User_Int .FILL #0
- Zero .STRINGZ "0"
- One .STRINGZ "1"
- New_Line .STRINGZ "\n"
- Mask_Array:
- .FILL b1000000000000000
- .FILL b0100000000000000
- .FILL b0010000000000000
- .FILL b0001000000000000
- .FILL b0000100000000000
- .FILL b0000010000000000
- .FILL b0000001000000000
- .FILL b0000000100000000
- .FILL b0000000010000000
- .FILL b0000000001000000
- .FILL b0000000000100000
- .FILL b0000000000010000
- .FILL b0000000000001000
- .FILL b0000000000000100
- .FILL b0000000000000010
- .FILL b0000000000000001
- .END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement