Rnd
From Maze
(Difference between revisions)
(→Technical and Philosophical Definitions of Randomness) | (→C64 Rnd(0) Disassembly) | ||
| Line 124: | Line 124: | ||
E09E 20 F3 FF JSR $FFF3 ; read base address of I/O device | E09E 20 F3 FF JSR $FFF3 ; read base address of I/O device | ||
E0A1 86 22 STX $22 ; INDEX 0022-0025 34-37 Utility Pointer Area | E0A1 86 22 STX $22 ; INDEX 0022-0025 34-37 Utility Pointer Area | ||
| − | E0A3 84 23 STY $23 | + | E0A3 84 23 STY $23 ; store i/o dev addr in YX |
| − | E0A5 A0 04 LDY #$04 | + | E0A5 A0 04 LDY #$04 ; start at offset 4 |
E0A7 B1 22 LDA ($22),Y | E0A7 B1 22 LDA ($22),Y | ||
| − | E0A9 85 62 STA $62 | + | E0A9 85 62 STA $62 ; mantissa byte 1 = |
E0AB C8 INY | E0AB C8 INY | ||
E0AC B1 22 LDA ($22),Y | E0AC B1 22 LDA ($22),Y | ||
| − | E0AE 85 64 STA $64 | + | E0AE 85 64 STA $64 ; mantissa byte 3 = |
E0B0 A0 08 LDY #$08 | E0B0 A0 08 LDY #$08 | ||
E0B2 B1 22 LDA ($22),Y | E0B2 B1 22 LDA ($22),Y | ||
| − | E0B4 85 63 STA $63 | + | E0B4 85 63 STA $63 ; mantissa byte 2 = |
E0B6 C8 INY | E0B6 C8 INY | ||
E0B7 B1 22 LDA ($22),Y | E0B7 B1 22 LDA ($22),Y | ||
| − | E0B9 85 65 STA $65 | + | E0B9 85 65 STA $65 ; mantissa byte 4 = |
E0BB 4C E3 E0 JMP $E0E3 | E0BB 4C E3 E0 JMP $E0E3 | ||
| + | |||
; positive number, e.g. rnd(1) | ; positive number, e.g. rnd(1) | ||
| − | E0BE A9 8B LDA #$8B ; | + | ; retrieve float accu from zero page |
| + | |||
| + | E0BE A9 8B LDA #$8B ; RNDX 008B-008F Floating RND Function Seed Value. | ||
E0C0 A0 00 LDY #$00 | E0C0 A0 00 LDY #$00 | ||
| − | E0C2 20 A2 BB JSR $BBA2 ; retrieve float accu from index XY | + | E0C2 20 A2 BB JSR $BBA2 ; retrieve float accu from zero page |
| − | E0C5 A9 8D LDA #$8D ; load generator seeds | + | ; copy seeds to 2nd float |
| + | |||
| + | E0C5 A9 8D LDA #$8D ; point to generator seeds | ||
E0C7 A0 E0 LDY #$E0 | E0C7 A0 E0 LDY #$E0 | ||
| − | E0C9 20 28 BA JSR $BA28 ; move float indexed by AY into second float accu | + | E0C9 20 28 BA JSR $BA28 ; multiplication |
| + | |||
| + | ; float acc = (float)seeds1 + (float)seeds2 | ||
E0CC A9 92 LDA #$92 ; load more generator seeds | E0CC A9 92 LDA #$92 ; load more generator seeds | ||
| Line 155: | Line 162: | ||
; negative operand, e.g. rnd(-1) | ; negative operand, e.g. rnd(-1) | ||
| + | ; swap mantissa bytes 1 and 4 | ||
| + | |||
E0D3 A6 65 LDX $65 ; swap $65 and $62 | E0D3 A6 65 LDX $65 ; swap $65 and $62 | ||
E0D5 A5 62 LDA $62 | E0D5 A5 62 LDA $62 | ||
E0D7 85 65 STA $65 | E0D7 85 65 STA $65 | ||
E0D9 86 62 STX $62 | E0D9 86 62 STX $62 | ||
| + | |||
| + | ; swap mantissa bytes 2 and 3 | ||
E0DB A6 63 LDX $63 ; swap $63 and $64 | E0DB A6 63 LDX $63 ; swap $63 and $64 | ||
| Line 165: | Line 176: | ||
E0E1 86 64 STX $64 | E0E1 86 64 STX $64 | ||
| − | ; common entry point for rnd | + | ; clear sign of float acc #1 |
| − | E0E3 A9 00 LDA #$00 ; clear sign of float acc #1 | + | E0E3 A9 00 LDA #$00 |
E0E5 85 66 STA $66 | E0E5 85 66 STA $66 | ||
| − | E0E7 A5 61 LDA $61 ; more float acc #1 stuff (exponent and rounding) | + | ; low order <= exponent |
| − | E0E9 85 70 STA $70 | ||
| − | E0EB A9 80 LDA #$80 | + | E0E7 A5 61 LDA $61 ; exp |
| − | E0ED 85 61 STA $61 | + | E0E9 85 70 STA $70 ; low order |
| − | E0EF 20 D7 B8 JSR $B8D7 ; a floating-point routine | + | |
| + | ; exp = 0x80 | ||
| + | E0EB A9 80 LDA #$80 | ||
| + | E0ED 85 61 STA $61 ; exp | ||
| + | E0EF 20 D7 B8 JSR $B8D7 ; clear acc? | ||
E0F2 A2 8B LDX #$8B | E0F2 A2 8B LDX #$8B | ||
E0F4 A0 00 LDY #$00 | E0F4 A0 00 LDY #$00 | ||
| − | E0F6 4C D4 BB JMP $BBD4 ; store float accu in index XY | + | E0F6 4C D4 BB JMP $BBD4 ; store float accu in zero page, then RTS |
| − | |||
| − | |||
| Line 193: | Line 205: | ||
; a floating-point routine | ; a floating-point routine | ||
| + | (http://www.devili.iki.fi/Computers/Commodore/C64/Programmers_Reference/page_iii.html) | ||
| + | ; hex dec Description | ||
| + | ; FACEXP 0061 97 Floating-Point Accumulator #1: Exponent | ||
| + | ; FACHO 0062-0065 98-101 Floating Accum. #1: Mantissa | ||
| + | ; FACSGN 0066 102 Floating Accum. #1: Sign | ||
| + | ; FACOV 0070 112 Floating Accum. #1. Low-Order (Rounding) | ||
| − | B8D7 A0 00 LDY #$00 | ||
| − | B8D9 98 TYA | ||
| − | B8DA 18 CLC | ||
| − | B8DB A6 62 LDX $62 | + | ; begin |
| − | B8DD D0 4A BNE $B929 | + | B8D7 A0 00 LDY #$00 ; Y =0 |
| + | B8D9 98 TYA ; A =0 | ||
| + | B8DA 18 CLC ; carry=0; | ||
| − | B8DF A6 63 LDX $63 | + | ; if mantissa byte 1 <= 0 jump Post-Shift @ b929 |
| − | B8E1 86 62 STX $62 | ||
| − | B8E3 A6 64 LDX $64 | + | B8DB A6 62 LDX $62 ; |
| − | B8E5 86 63 STX $63 | + | B8DD D0 4A BNE $B929 ; |
| + | |||
| + | ; rotate zeros into mantissa from the left | ||
| + | B8DF A6 63 LDX $63 ; | ||
| + | B8E1 86 62 STX $62 ; mantissa byte 1 <= mantissa byte 2 | ||
| + | |||
| + | B8E3 A6 64 LDX $64 ; | ||
| + | B8E5 86 63 STX $63 ; mantissa byte 2 <= mantissa byte 3 | ||
B8E7 A6 65 LDX $65 | B8E7 A6 65 LDX $65 | ||
| − | B8E9 86 64 STX $64 | + | B8E9 86 64 STX $64 ; mantissa byte 3 <= mantissa byte 4 |
| − | B8EB A6 70 LDX $70 | + | B8EB A6 70 LDX $70 ; |
| − | B8ED 86 65 STX $65 | + | B8ED 86 65 STX $65 ; mantissa byte 4 <= low-order rounding byte |
| − | B8EF 84 70 STY $70 | + | B8EF 84 70 STY $70 ; low-order rounding byte set = 0 |
| − | B8F1 69 08 ADC #$08 | + | B8F1 69 08 ADC #$08 ; repeat 3 more times. |
| − | B8F3 C9 20 CMP #$20 | + | B8F3 C9 20 CMP #$20 ; Why compare to 0x20, why? |
B8F5 D0 E4 BNE $B8DB | B8F5 D0 E4 BNE $B8DB | ||
| − | B8F7 A9 00 LDA #$00 | + | B8F7 A9 00 LDA #$00 ; A=0 |
| − | B8F9 85 61 STA $61 | + | B8F9 85 61 STA $61 ; clear exponent |
| − | B8FB 85 66 STA $66 | + | B8FB 85 66 STA $66 ; clear sign |
B8FD 60 RTS | B8FD 60 RTS | ||
| + | ; postshift | ||
| − | BA28 20 8C BA JSR $BA8C | + | ; rotate mantissa to left, doubling it |
| + | B91D 69 01 ADC #$01 | ||
| + | B91F 06 70 ASL $70 | ||
| + | B921 26 65 ROL $65 | ||
| + | B923 26 64 ROL $64 | ||
| + | B925 26 63 ROL $63 | ||
| + | B927 26 62 ROL $62 | ||
| + | B929 10 F2 BPL $B91D | ||
| + | |||
| + | B92B 38 SEC ; set carry | ||
| + | B92C E5 61 SBC $61 ; A-=exponent | ||
| + | B92E B0 C7 BCS $B8F7 ; if carry set, clear exp and round | ||
| + | B930 49 FF EOR #$FF ; invert acc | ||
| + | B932 69 01 ADC #$01 ; add one | ||
| + | B934 85 61 STA $61 ; exp = 1+(exp^0xff) | ||
| + | |||
| + | B936 90 0E BCC $B946 ; done | ||
| + | |||
| + | B938 E6 61 INC $61 ; increase exponent | ||
| + | |||
| + | B93A F0 42 BEQ $B97E ; if shifted exponent off the end, that's an overflow error! | ||
| + | |||
| + | ; rotate mantissa one step to the right | ||
| + | B93C 66 62 ROR $62 | ||
| + | B93E 66 63 ROR $63 | ||
| + | B940 66 64 ROR $64 | ||
| + | B942 66 65 ROR $65 | ||
| + | B944 66 70 ROR $70 | ||
| + | B946 60 RTS | ||
| + | |||
| + | |||
| + | |||
| + | BA28 20 8C BA JSR $BA8C ; move float indexed by AY into second float accu | ||
| + | BA2B D0 03 BNE $BA30 ; times operator | ||
| + | BA2D 4C 8B BA JMP $BA8B ; | ||
| + | BA8B 60 RTS | ||
; move float indexed by AY into second float accu | ; move float indexed by AY into second float accu | ||
| Line 235: | Line 294: | ||
BA92 B1 22 LDA ($22),Y | BA92 B1 22 LDA ($22),Y | ||
BA94 85 6D STA $6D | BA94 85 6D STA $6D | ||
| + | |||
BA96 88 DEY | BA96 88 DEY | ||
BA97 B1 22 LDA ($22),Y | BA97 B1 22 LDA ($22),Y | ||
BA99 85 6C STA $6C | BA99 85 6C STA $6C | ||
BA9B 88 DEY | BA9B 88 DEY | ||
| + | |||
BA9C B1 22 LDA ($22),Y | BA9C B1 22 LDA ($22),Y | ||
BA9E 85 6B STA $6B | BA9E 85 6B STA $6B | ||
BAA0 88 DEY | BAA0 88 DEY | ||
| + | |||
BAA1 B1 22 LDA ($22),Y | BAA1 B1 22 LDA ($22),Y | ||
BAA3 85 6E STA $6E | BAA3 85 6E STA $6E | ||
BAA5 45 66 EOR $66 | BAA5 45 66 EOR $66 | ||
BAA7 85 6F STA $6F | BAA7 85 6F STA $6F | ||
| + | |||
BAA9 A5 6E LDA $6E | BAA9 A5 6E LDA $6E | ||
BAAB 09 80 ORA #$80 | BAAB 09 80 ORA #$80 | ||
BAAD 85 6A STA $6A | BAAD 85 6A STA $6A | ||
| + | |||
BAAF 88 DEY | BAAF 88 DEY | ||
BAB0 B1 22 LDA ($22),Y | BAB0 B1 22 LDA ($22),Y | ||
| Line 256: | Line 320: | ||
| − | ; retrieve float accu from index XY | + | ; retrieve float accu from utility pointer |
| − | BBA2 85 22 STA $22 | + | BBA2 85 22 STA $22 ; INDEX 0022-0025 Utility Pointer Area. |
BBA4 84 23 STY $23 | BBA4 84 23 STY $23 | ||
BBA6 A0 04 LDY #$04 | BBA6 A0 04 LDY #$04 | ||
| − | BBA8 B1 22 LDA ($22),Y | + | BBA8 B1 22 LDA ($22),Y ; A = *utilPointer |
| − | BBAA 85 65 STA $65 | + | BBAA 85 65 STA $65 ; mantissa byte 4 = *(utilPointer+4) |
BBAC 88 DEY | BBAC 88 DEY | ||
BBAD B1 22 LDA ($22),Y | BBAD B1 22 LDA ($22),Y | ||
| − | BBAF 85 64 STA $64 | + | BBAF 85 64 STA $64 ; mantissa byte 3 = *(utilPointer+3) |
BBB1 88 DEY | BBB1 88 DEY | ||
BBB2 B1 22 LDA ($22),Y | BBB2 B1 22 LDA ($22),Y | ||
| − | BBB4 85 63 STA $63 | + | BBB4 85 63 STA $63 ; mantissa byte 2 = *(utilPointer+2) |
BBB6 88 DEY | BBB6 88 DEY | ||
BBB7 B1 22 LDA ($22),Y | BBB7 B1 22 LDA ($22),Y | ||
| − | BBB9 85 66 STA $66 | + | BBB9 85 66 STA $66 ; sign byte = *(utilPointer+1) |
BBBB 09 80 ORA #$80 | BBBB 09 80 ORA #$80 | ||
| − | BBBD 85 62 STA $62 | + | BBBD 85 62 STA $62 ; mantissa byte 1 = 0x80 | *(utilPointer+1) |
BBBF 88 DEY | BBBF 88 DEY | ||
| − | BBC0 B1 22 LDA ($22),Y | + | BBC0 B1 22 LDA ($22),Y |
| − | BBC2 85 61 STA $61 | + | BBC2 85 61 STA $61 ; exponent = *(utilPointer) |
BBC4 84 70 STY $70 | BBC4 84 70 STY $70 | ||
BBC6 60 RTS | BBC6 60 RTS | ||
| Line 344: | Line 408: | ||
| − | ; read base address of I/O device into XY | + | ; read base address of I/O device into YX |
; D000-DFFF 53248-57343 Input/Output Devices and Color RAM or Character Generator ROM or RAM - 4096 Bytes | ; D000-DFFF 53248-57343 Input/Output Devices and Color RAM or Character Generator ROM or RAM - 4096 Bytes | ||
; DC00 56320 Data Port A (Keyboard, Joystick, Paddles, Light-Pen) 7-0 Write Keyboard Column Values for Keyboard Scan 7-6 Read Paddles on Port A / B (01 = Port A, 10 = Port B) 4 Joystick A Fire Button: 1 = Fire 3-2 Paddle Fire Buttons 3-0 Joystick A Direction (0-15) | ; DC00 56320 Data Port A (Keyboard, Joystick, Paddles, Light-Pen) 7-0 Write Keyboard Column Values for Keyboard Scan 7-6 Read Paddles on Port A / B (01 = Port A, 10 = Port B) 4 Joystick A Fire Button: 1 = Fire 3-2 Paddle Fire Buttons 3-0 Joystick A Direction (0-15) | ||
| Line 352: | Line 416: | ||
E502 A0 DC LDY #$DC ; high DC00 | E502 A0 DC LDY #$DC ; high DC00 | ||
E504 60 RTS | E504 60 RTS | ||
| + | |||
| + | |||
</pre> | </pre> | ||
