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