.ORIG x3000 ; this sets where the following ; code will start in memory LEA R0, HELLO TRAP x22 PRNTPRMPT LEA R0, PROMPT ; Start of main loop TRAP x22 JSR getDecInt ; Get a decimal number ADD R5, R5, 0 ; If quit flag is set, quit BRz DONE LEA R0, RESULT TRAP x22 JSR printBin ; Print number in binary LD R0, NL TRAP x21 TRAP x21 BR PRNTPRMPT ; Loop back to start DONE TRAP x25 ; this HALTS the program ; Multiplication subroutine ; R1 = R1 * R2 ; R3 holds original R1 mult ADD R2, R2, #-1 AND R3, R3, #0 AND R3, R1, R1 MULTLOOP ADD R1, R1, R3 ADD R2, R2, #-1 BRp MULTLOOP MULTDONE RET ; Takes in characters from the keyboard ; and forms a two's complement number ; from them ; R0 = character temp ; R1 = the number ; R2 = temp ; R4 = quit flag getDecInt ST R7,R7SAVE AND R1,R1,0 AND R5,R5,0 INLOOP TRAP x20 TRAP x21 LD R2, XOFF ; It's an 'X' ADD R2, R0, R2 BRz INDONE LD R2, xOFF ; It's an 'x' ADD R2, R0, R2 BRz INDONE LD R2, NLOFF ; It's a '\n' ADD R2, R0, R2 BRz INDONE LD R2, NEGOFF ; It's a '-' ADD R2, R0, R2 BRnp CONVERT AND R4, R4, #0 ADD R4, R4, #1 ; Set the negative flag BR INLOOP CONVERT LD R2, ASCIIDEC ; Convert from ascii to decimal, ADD R0, R0, R2 ; multiply total by 10, add new LD R2, TEN ; number to total. JSR mult ADD R1, R1, R0 ADD R5, R5, #1 BR INLOOP INDONE ADD R4, R4, #-1 ; If negative flag set, convert BRn GETDECDONE ; to two's complement negative NOT R1, R1 ADD R1, R1, #1 GETDECDONE LD R7, R7SAVE RET ; Print number in binary ; R0 = character temp ; R1 = number to be printed ; R2 = counter printBin ST R7, R7SAVE AND R2, R2, #0 ADD R2, R2, #8 ; Set counter to 16 ADD R2, R2, #8 CONTPRINT ADD R1, R1, #0 ; Check R1, if negative, print a BRn PRINTONE ; one, if positive or zero, print LD R0, ASCZERO ; a zero. TRAP x21 BR SHIFT PRINTONE LD R0, ASCONE TRAP x21 SHIFT ADD R1, R1, R1 ; Shift R1 left one bit ADD R2, R2, #-1 BRp CONTPRINT ; Keep printing until counter is 0 LD R7, R7SAVE RET HELLO .STRINGZ "This is the conversion program\n" PROMPT .STRINGZ "Enter a decimal number or X to quit: " RESULT .STRINGZ "Here it is in decimal: " NL .FILL x000A NLOFF .FILL xFFF6 NEGOFF .FILL xFFD3 TEN .FILL x000A ASCONE .FILL x0031 ASCZERO .FILL x0030 XOFF .FILL xFFA8 xOFF .FILL xFF88 ASCIIDEC .FILL xFFD0 R7SAVE .FILL x0000 NUMSTART .FILL x0000 .END