| Routines

247D: THE 'INITIAL PARAMETERS' SUBROUTINE

This subroutine is called by both CIRCLE and DRAW to set their initial parameters. It is called by CIRCLE with X, Y and the radius Z on the top of the stack, reading upwards. It is called by DRAW with its own X, Y, SIN (G/2) and Z, as defined in DRAW i., on the top of the stack. In what follows the stack is only shown from Z upwards. The subroutine returns in B the arc-count A as explained in both CIRCLE and DRAW, and in mem-0 to mem-5 the quantities G/A, SIN (G/2*A), 0, COS (G/A), SIN (G/A) and G. For a circle, G must be taken to be equal to 2π.
Output
B | Arc count
CD_PRMS1 | 247D | RST $28 | Z
| 247E | DEFB $31 | duplicate: Z, Z
| 247F | DEFB $28 | sqr: Z, SQR Z
| 2480 | DEFB $34 | stk_data: Z, SQR Z, 2
| 2481 | DEFB $32,$00
| 2483 | DEFB $01 | exchange: Z, 2, SQR Z
| 2484 | DEFB $05 | division: Z, 2/SQR Z
| 2485 | DEFB $E5 | get_mem_5: Z, 2/SQR Z, G
| 2486 | DEFB $01 | exchange: Z, G, 2/SQR Z
| 2487 | DEFB $05 | division: Z, G*SQR Z/2
| 2488 | DEFB $2A | abs: Z, G'*SQR Z/2 (G'=ABS G)
| 2489 | DEFB $38 | end_calc: Z, G'*SQR Z/2=A1, say
| 248A | CALL FP_TO_A | A1 to A from the stack, if possible.
| 248D | JR C,USE_252 | If A1 rounds to 256 or more, use 252.
| 248F | AND $FC | 4*INT (A1/4) to A.
| 2491 | ADD A,$04 | Add 4, giving the arc-count A.
| 2493 | JR NC,DRAW_SAVE | Jump if still under 256.
USE_252 | 2495 | LD A,$FC | Here, just use 252.
DRAW_SAVE | 2497 | PUSH AF | Now save the arc-count.
| 2498 | CALL STACK_A | Copy it to calculator stack too.
| 249B | RST $28 | Z, A
| 249C | DEFB $E5 | get_mem_5: Z, A, G
| 249D | DEFB $01 | exchange: Z, G, A
| 249E | DEFB $05 | division: Z, G/A
| 249F | DEFB $31 | duplicate: Z, G/A, G/A
| 24A0 | DEFB $1F | sin: Z, G/A, SIN (G/A)
| 24A1 | DEFB $C4 | st_mem_4: (SIN (G/A) is copied to mem-4)
| 24A2 | DEFB $02 | delete: Z, G/A
| 24A3 | DEFB $31 | duplicate: Z, G/A, G/A
| 24A4 | DEFB $A2 | stk_half: Z, G/A, G/A, 0.5
| 24A5 | DEFB $04 | multiply: Z, G/A, G/2*A
| 24A6 | DEFB $1F | sin: Z, G/A, SIN (G/2*A)
| 24A7 | DEFB $C1 | st_mem_1: (SIN (G/2*A) is copied to mem-1)
| 24A8 | DEFB $01 | exchange: Z, SIN (G/2*A), G/A
| 24A9 | DEFB $C0 | st_mem_0: (G/A is copied to mem-0)
| 24AA | DEFB $02 | delete: Z, SIN (G/2*A)=S
| 24AB | DEFB $31 | duplicate: Z, S, S
| 24AC | DEFB $04 | multiply: Z, S*S
| 24AD | DEFB $31 | duplicate: Z, S*S, S*S
| 24AE | DEFB $0F | addition: Z, 2*S*S
| 24AF | DEFB $A1 | stk_one: Z, 2*S*S, 1
| 24B0 | DEFB $03 | subtract: Z, 2*S*S-1
| 24B1 | DEFB $1B | negate: Z, 1-2*S*S=COS (G/A)
| 24B2 | DEFB $C3 | st_mem_3: (COS (G/A) is copied to mem-3)
| 24B3 | DEFB $02 | delete: Z
| 24B4 | DEFB $38 | end_calc
| 24B5 | POP BC | Restore the arc-count to B.
| 24B6 | RET | Finished.