Rnd

From Maze

(Difference between revisions)
Jump to: navigation, search
(→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>

Current revision

View this revision of Rnd.

Personal tools