; --- putd(n) converts n to decimal and outputs it --- ; activation record structure RETAD = 0 ; return address N = 4 ; parameter n DIGIT = 8 ; this digit REM = 12 ; remaining digits ARSIZE = 16 ; size of activation record ; code PUTD: ; on entry: R2 stack pointer ; R3 value of n to print ; has permission to wipe out R3-R7 ; returns nothing useful STORE R1,R2,RETAD ; -- save RA STORE R3,R2,N ; -- save parameter n LOAD R3,R2,N ; -- parameter 1 LIS R5,10 ; -- parameter 2 LIL R1,DIVIDEU ADDI R2,R2,ARSIZE JSRS R1,R1 ; digit = n%10; rem = n/10 ADDI R2,R2,-ARSIZE STORE R4,R2,DIGIT STORE R3,R2,REM LOAD R3,R2,REM CMPI R3,0 BLE PUTENDF ; if (rem > 0) { LOAD R3,R2,REM ; -- param ADDI R2,R2,ARSIZE JSR R1,PUTD ; putd( rem ) -- recursion ADDI R2,R2,-ARSIZE PUTENDF: ; } LOAD R3,R2,DIGIT ADDI R3,R3,'0' ; -- param LIL R1,PUTCHAR ADDI R2,R2,ARSIZE JSRS R1,R1 ; putchar( digit + '0' ) ADDI R2,R2,-ARSIZE LOAD R1,R2,RETAD ; -- restore RA JUMPS R1 ; return END