Skip to content

Instantly share code, notes, and snippets.

@xk
Created November 1, 2017 11:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xk/b0d468e2dab8a9098b454bae8ad3bc6c to your computer and use it in GitHub Desktop.
Save xk/b0d468e2dab8a9098b454bae8ad3bc6c to your computer and use it in GitHub Desktop.
6502 (FAKE) COUNT TO 100e6 (PLAYING THE GAME OF MIRRORS) (Apple II)
;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