| Routines

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.
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.