;*********** WINDLX Ex.1: Read a positive integer number *************
;*********** (c) 1991 Günther Raidl *************
;*********** Modified 1992 Maziar Khosravipour *************
;-----------------------------------------------------------------------------
;Subprogram call by symbol "InputUnsigned"
;expect the address of a zero-terminated prompt string in R1
;returns the read value in R1
;changes the contents of registers R1,R13,R14
;-----------------------------------------------------------------------------
.data
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar: .space 4
SaveR2: .space 4
SaveR3: .space 4
SaveR4: .space 4
SaveR5: .space 4
.text
.global InputSigned
InputSigned:
;*** save register contents
sw SaveR2,r2
sw SaveR3,r3
sw SaveR4,r4
sw SaveR5,r5
;*** Prompt
sw PrintfPar,r1
addi r14,r0,PrintfPar
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10 ;Decimal system
petla: ;*** reads digits to end of line
lbu r3,0(r2)
;odczytujemy jaki znak stoi na 1 miejscu +,-,czy moze liczba bez znaku
snei r5, r3, #45 ;jezeli - to do znakminus
beqz r5, minus
snei r5, r3, #43 ;i jesli sa rowne to ustawi sie na 0
beqz r5, plus
snei r5,r3,#10 ;LF -> Exit jak wczyta entera to zkaonczy wczytywanie tego ciagu
beqz r5,Finish
subi r3,r3,#48 ;´0´
multu r1,r1,r4 ;Shift decimal
add r1,r1,r3
addi r2,r2,#1 ;increment pointer
snei r5,r3,#10 ;LF -> Exit
beqz r5,Finish
j petla
minus:
addi r6,r0,#-1 ;zaznaczamy że liczba ujemna
addi r2,r2,#1 ;zwiekszamy increment pointer
j petla
plus:
addi r2,r2,1 ;zwiekszamy increment pointer
j petla
ujemna:
addi r7,r7,#-1 ;ladujemy do r7 -1
mult r1,r1,r7 ;mnożymy r1 razy -1 zeby otrzymac liczbe ujemna
addi r6,r0,#0 ;zeruje r6
addi r7,r0,#0 ;zeruje r7
Finish: ;*** restore old register contents
bnez r6,ujemna
lw r2,SaveR2
lw r3,SaveR3
lw r4,SaveR4
lw r5,SaveR5
jr r31