Prev: 369B Up: Map Next: 36AF
36A0: THE 'MODULUS' SUBROUTINE (offset +32)
The address of this routine is found in the table of addresses. It is called via the calculator literal +32 by the routine at S_RND.
This subroutine calculates N (mod M), where M is a positive integer held at the top of the calculator stack (the 'last value'), and N is the integer held on the stack beneath M.
The subroutine returns the integer quotient INT (N/M) at the top of the calculator stack (the 'last value'), and the remainder N-INT (N/M) in the second place on the stack.
This subroutine is called during the calculation of a random number to reduce N mod 65537.
Input
Output
n_mod_m 36A0 RST $28 N, M
36A1 DEFB $C0 st_mem_0: N, M (mem-0 holds M)
36A2 DEFB $02 delete: N
36A3 DEFB $31 duplicate: N, N
36A4 DEFB $E0 get_mem_0: N, N, M
36A5 DEFB $05 division: N, N/M
36A6 DEFB $27 int: N, INT (N/M)
36A7 DEFB $E0 get_mem_0: N, INT (N/M), M
36A8 DEFB $01 exchange: N, M, INT (N/M)
36A9 DEFB $C0 st_mem_0: N, M, INT (N/M) (mem-0 holds INT (N/M))
36AA DEFB $04 multiply: N, M*INT (N/M)
36AB DEFB $03 subtract: N-M*INT (N/M)
36AC DEFB $E0 get_mem_0: N-M*INT (N/M), INT (N/M)
36AD DEFB $38 end_calc
36AE RET Finished.
Prev: 369B Up: Map Next: 36AF