95 lines
1.9 KiB
ArmAsm
95 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
|