forked from brooke/mandel-6502
Brooke Vibber
405cec6d51
planning to try a 64KB table of 8x7-bit multiplies in the high memory on a 130XE or other high-memory-capable machine not yet working or finished too many cycles of overhead per invocation
94 lines
1.9 KiB
ArmAsm
94 lines
1.9 KiB
ArmAsm
FR0 = $d4 ; float48
|
|
PORTB = $d301
|
|
|
|
|
|
EXTENDED_RAM = $4000 ; 16KiB bank on the XE
|
|
bankswitch = ; ???
|
|
|
|
; input in X/Y (lo/hi)
|
|
; output in FR0
|
|
; clobbers FR0
|
|
; 128 cycles
|
|
proc imul8xe
|
|
output = FR0
|
|
ptr = FR0 + 2
|
|
|
|
lda #0 ; 2 cyc
|
|
sta ptr ; 3 cyc
|
|
sta ptr + 1 ; 3 cyc
|
|
|
|
; bottom 14 bits except the LSB are the per-bank table index
|
|
; add $4000 for the bank pointer
|
|
txa ; 2 cyc
|
|
and #$fe ; 2 cyc
|
|
sta ptr ; 3 cyc
|
|
tya ; 2 cyc
|
|
and #$3f ; 2 cyc
|
|
clc ; 2 cyc
|
|
adc #$40 ; 2 cyc
|
|
sta ptr + 1 ; 3 cyc
|
|
|
|
; top 2 bits are the table bank selector
|
|
tya ; 2 cyc
|
|
and #$c0 ; 2 cyc
|
|
; shift in extended RAM mode 2x 1 bits
|
|
sec ; 2 cyc
|
|
ror ; 2 cyc
|
|
ror ; 2 cyc
|
|
; shift in 0 bits
|
|
asr ; 2 cyc
|
|
asr ; 2 cyc
|
|
asr ; 2 cyc
|
|
|
|
; save the second param for later
|
|
phy ; 3 cyc
|
|
|
|
; disable interrupts
|
|
lda NMIEN ; 4 cyc
|
|
pha ; 3 cyc
|
|
lda #0 ; 2 cyc
|
|
sta NMIEN ; 4 cyc
|
|
|
|
; set the standard top RAM and OS ROM on
|
|
or #$81 ; 2 cyc
|
|
sta PORTB ; 4 cyc
|
|
|
|
|
|
; copy the entry into output
|
|
ldy #0 ; 2 cyc
|
|
lda (ptr),y ; 5 cyc
|
|
sta output ; 3 cyc
|
|
iny ; 2 cyc
|
|
lda (ptr),y ; 5 cyc
|
|
sta output+1 ; 3 cyc
|
|
|
|
; restore memory
|
|
lda #$81 ; 2 cyc
|
|
sta PORTB ; 4 cyc
|
|
|
|
; restore interrupts
|
|
pla ; 3 cyc
|
|
sta NMIEN ; 4 cyc
|
|
|
|
; check that 1 bit we skipped to fit into space
|
|
txa ; 2 cyc
|
|
and $#1 ; 2 cyc
|
|
beq done ; 2 cyc
|
|
|
|
; add the second param one last tie for the skipped bit
|
|
clc ; 2 cyc
|
|
pla ; 3 cyc
|
|
adc output ; 3 cyc
|
|
sta output ; 3 cyc
|
|
lda #0 ; 2 cyc
|
|
adc output+1 ; 3 cyc
|
|
sta output+1 ; 3 cyc
|
|
|
|
done:
|
|
pla
|
|
rts ; 6 cyc
|
|
endproc
|
|
|
|
proc imul8xe_init
|
|
rts
|
|
endproc
|