Created
November 1, 2017 11:00
-
-
Save xk/b0d468e2dab8a9098b454bae8ad3bc6c to your computer and use it in GitHub Desktop.
6502 (FAKE) COUNT TO 100e6 (PLAYING THE GAME OF MIRRORS) (Apple II)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;See "Hypercount2017" @ c.s.a2 | |
;https://groups.google.com/forum/#!topic/comp.sys.apple2/3hag0ebN-ts | |
;And "Counting from 1 to 1,000,000 on the FASTChip" @ c.s.a2 | |
;https://groups.google.com/forum/#!topic/comp.sys.apple2/ibI06hDLiaY%5B1-25%5D | |
* = $1000 | |
cero = $b0 | |
display = 1464 | |
digitos = 8 | |
cls = $fc58 | |
keyb = $c000 | |
keyb_strobe = $c010 | |
bell = $ff3a | |
cls = $fc58 | |
;Counts up to 100001536 in 3m23s => 1e6/(100001536/(23+3*60)) = 2.02µs/count | |
jsr cls | |
clear_display | |
ldx #digitos | |
lda #cero | |
clr_display | |
sta display,x | |
dex | |
bpl clr_display | |
go | |
lda display | |
cmp #$b1 ;'1' | |
bne not_done_yet | |
jsr bell | |
rts | |
;1e6/60 = 16666 cpu cycles per video frame | |
;31 loops of 256 inx each = 7936 counts per loop (per frame) | |
;(31*2*256) + (30*(2+3)) + (2+2) = 16026 cpu cycles per loop | |
;16666-16026 = 640 cycles max time for update_display to do its job | |
not_done_yet | |
ldx #0 ;2 | |
ldy #31 ;2 | |
loop0 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
inx ;2 | |
dey ;2 | |
beq update_display ;3 | |
jmp loop0 | |
update_display | |
;add 31*256 = 7936 counts to the display | |
;we've got max 16666-(2+2+16026+3) = 633 cycles to do it | |
;jsr wait_key | |
;put 7936 into count | |
ldx #digitos ;2 | |
lda #6 ;2 | |
sta count,x ;5 | |
dex ;2 | |
lda #3 ;2 | |
sta count,x ;5 | |
dex ;2 | |
lda #9 ;2 | |
sta count,x ;5 | |
dex ;2 | |
lda #7 ;2 | |
sta count,x ;5 | |
dex ;2 | |
lda #0 ;2 | |
clr_count | |
sta count,x ;5 | |
dex ;2 | |
bpl clr_count ;2..3 | |
;jsr wait_key | |
jsr poll_key | |
;(4*(2+2+5)) + (2+2) + (6*(5+2)) + (5*3) + 2 = 99 | |
;add count to what was on the display | |
ldx #digitos ;2 | |
loop | |
lda display,x ;4 | |
and #$0f ;2 | |
clc ;2 | |
adc count,x ;4 | |
cmp #9 ;2 | |
bcc no_carry ;2..3 | |
beq no_carry | |
carry | |
dex ;2 | |
inc count,x ;6 | |
inx ;2 | |
sec | |
sbc #10 ;2 | |
no_carry | |
ora #$b0 ;2 | |
sta display,x ;4 | |
dex ;2 | |
bpl loop ;2..3 | |
;((4+2+2+4+2+2.5) + (2+6+2+2)/2 + (2+4+2+3))*10 ~ = 335; | |
;335 + 99 < 633 so we're good | |
jmp go ;3 | |
poll_key | |
ldy keyb | |
bmi key | |
rts | |
wait_key | |
ldy keyb | |
bpl wait_key | |
key | |
sty keyb_strobe | |
cpy #155 | |
beq quit | |
rts | |
quit | |
pla | |
pla | |
rts | |
count = * | |
1000:20 58 FC A2 08 A9 B0 9D | |
:B8 05 CA 10 FA AD B8 05 | |
:C9 B1 D0 04 20 3A FF 60 | |
:A2 00 A0 1F E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 E8 E8 E8 E8 | |
:E8 E8 E8 E8 88 F0 03 4C | |
:1C 10 A2 08 A9 06 9D 81 | |
:11 CA A9 03 9D 81 11 CA | |
:A9 09 9D 81 11 CA A9 07 | |
:9D 81 11 CA A9 00 9D 81 | |
:11 CA 10 FA 20 6B 11 A2 | |
:08 BD B8 05 29 0F 18 7D | |
:81 11 C9 09 90 0A F0 08 | |
:CA FE 81 11 E8 38 E9 0A | |
:09 B0 9D B8 05 CA 10 E1 | |
:4C 0D 10 AC 00 C0 30 06 | |
:60 AC 00 C0 10 FB 8C 10 | |
:C0 C0 9B F0 01 60 68 68 | |
:60 | |
1000G |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment