Created
January 20, 2021 07:11
-
-
Save mankeli/1ed7eec8ee8501d73e55c225b0d19166 to your computer and use it in GitHub Desktop.
Test program to demonstrate copper timing issue in winuae
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
CUSTOM equ $dff000 | |
code | |
include "hardware/custom.i" | |
include "hardware/dmabits.i" | |
include "hardware/cia.i" | |
include "exec/memory.i" | |
include "lvo/exec_lib.i" | |
INCLUDE "exec/libraries.i" | |
_start: | |
dc.b 'D','O','S',0 ; disk type | |
dc.l 0 ; checksum | |
dc.l 880 ; root block | |
; Because this is a bootblock, we will have ExecBase in a6 here | |
jmp start2 | |
framenumber: | |
dc.w $0 | |
counter: | |
dc.w $0000 | |
bplmemptrs: | |
dc.l $0 | |
dc.l $0 | |
dc.l $0 | |
dc.l $0 | |
dc.l $0 | |
copper1ptr: | |
dc.l $deadface | |
vbldone: | |
dc.w 0 | |
align 4 | |
vblank: | |
movem.l a0/a4/d0/d1/d2,-(sp) | |
lea vbldone(pc),a0 | |
bset #0,(a0) | |
movem.l (sp)+,a0/a4/d0/d1/d2 | |
move.w #$0020,intreq(a5) | |
rte | |
start2: | |
lea.l CUSTOM,a5 ; and custom in a5 here! :)))D;)D.9d | |
move.w #$7FFF,intena(a5) | |
move.w #$7FFF,intreq(a5) | |
jsr bufferalloc2 | |
jsr setupscreen | |
move.w #$f00,$180(a5) | |
move.w #$000,$180(a5) | |
move.w #$0000,bltcon1(a5) | |
move.w #0000,bltamod(a5) | |
move.w #0000,bltbmod(a5) | |
move.w #0000,bltcmod(a5) | |
move.w #0000,bltdmod(a5) | |
jsr rand_init | |
move.l (bplmemptrs+$00)(pc),a0 | |
move.l (bplmemptrs+$04)(pc),a1 | |
move.l (bplmemptrs+$08)(pc),a2 | |
move.l (bplmemptrs+$0C)(pc),a3 | |
move.l (bplmemptrs+$10)(pc),a4 | |
add.l #$04,a0 | |
add.l #$06,a1 | |
add.l #$08,a2 | |
add.l #$0A,a3 | |
add.l #$0C,a4 | |
move.w #127,d1 | |
.loopba | |
jsr rand_clock | |
move.w d0,(a0) | |
lea 40(a0),a0 | |
jsr rand_clock | |
move.w d0,(a1) | |
lea 40(a1),a1 | |
jsr rand_clock | |
move.w d0,(a2) | |
lea 40(a2),a2 | |
jsr rand_clock | |
move.w d0,(a3) | |
lea 40(a3),a3 | |
jsr rand_clock | |
move.w d0,(a4) | |
lea 40(a4),a4 | |
dbf d1,.loopba | |
lea vblank(pc),a0 | |
move.l a0,$6C | |
move.w #$C020,intena(a5) | |
.lub: | |
lea counter(pc),a0 | |
move.w (a0),d0 | |
add.w #7,d0 | |
.calcbpl | |
move.w d0,(a0) | |
lsl.w #4,d0 | |
and.w #$7000,d0 | |
cmp.w #$6000,d0 | |
bne .norst | |
move.w #0,d0 | |
jmp .calcbpl | |
.norst | |
or.w #$0200,d0 | |
move.w d0,bplcon0(a5) | |
lea vbldone(pc),a0 | |
move.w #0,(a0) | |
move.l copper1ptr(pc),a0 | |
move.l a0,cop1lc(a5) | |
.waitvbl0 | |
btst #0,vbldone(pc) | |
beq .waitvbl0 | |
jmp .lub | |
bufferalloc2: | |
move.l #4*50,d0 | |
move.l #(MEMF_CHIP|MEMF_CLEAR),d1 | |
jsr _LVOAllocMem(a6) | |
cmp #0,d0 | |
beq .memfail | |
lea copper1ptr(pc),a0 | |
move.l d0,(a0) | |
move.l #40*256*5,d0 | |
move.l #(MEMF_CHIP|MEMF_CLEAR),d1 | |
jsr _LVOAllocMem(a6) | |
cmp #0,d0 | |
beq .memfail | |
lea bplmemptrs(pc),a0 | |
move.l d0,(a0) | |
move.w #4,d1 | |
.addptrsloop1 | |
add.l #256*40,d0 | |
add.l #4,a0 | |
move.l d0,(a0) | |
dbf d1,.addptrsloop1 | |
jmp .memsuccess | |
.memfail: | |
move.w #$f00,$180(a5) | |
move.w #$200,$180(a5) | |
jmp .memfail | |
.memsuccess: | |
rts | |
fillcopper: | |
move.w #(bplpt+0*4+2),(a0)+ | |
move.l (0*4)(a1),d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+0*4+0),(a0)+ | |
swap d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+1*4+2),(a0)+ | |
move.l (1*4)(a1),d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+1*4+0),(a0)+ | |
swap d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+2*4+2),(a0)+ | |
move.l (2*4)(a1),d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+2*4+0),(a0)+ | |
swap d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+3*4+2),(a0)+ | |
move.l (3*4)(a1),d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+3*4+0),(a0)+ | |
swap d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+4*4+2),(a0)+ | |
move.l (4*4)(a1),d0 | |
move.w d0,(a0)+ | |
move.w #(bplpt+4*4+0),(a0)+ | |
swap d0 | |
move.w d0,(a0)+ | |
move.l a0,d0 | |
add.l #8,d0 | |
move.w #(cop2lc+2),(a0)+ | |
move.w d0,(a0)+ | |
swap d0 | |
move.w #(cop2lc+0),(a0)+ | |
move.w d0,(a0)+ | |
; loop begins | |
move.l #($0001<<16)|($81FE),(a0)+ ;wait | |
move.l #(bpl1mod<<16)|((-40)&$FFFF),(a0)+ | |
move.l #(bpl2mod<<16)|((-40)&$FFFF),(a0)+ | |
move.l #($0101<<16)|($81FE),(a0)+ ;wait | |
move.l #(bpl1mod<<16)|((0)&$FFFF),(a0)+ | |
move.l #(bpl2mod<<16)|((0)&$FFFF),(a0)+ | |
move.l #($8001<<16)|($FF01),(a0)+ ; skip | |
move.l #(copjmp2<<16),(a0)+ ; jump | |
move.l a0,d0 | |
add.l #8,d0 | |
move.w #(cop2lc+2),(a0)+ | |
move.w d0,(a0)+ | |
swap d0 | |
move.w #(cop2lc+0),(a0)+ | |
move.w d0,(a0)+ | |
; loop begins | |
move.l #($8001<<16)|($81FE),(a0)+ ;wait | |
move.l #(bpl1mod<<16)|((-40)&$FFFF),(a0)+ | |
move.l #(bpl2mod<<16)|((-40)&$FFFF),(a0)+ | |
move.l #($8101<<16)|($81FE),(a0)+ ;wait | |
move.l #(bpl1mod<<16)|((0)&$FFFF),(a0)+ | |
move.l #(bpl2mod<<16)|((0)&$FFFF),(a0)+ | |
move.l #($ff01<<16)|($FF01),(a0)+ ; skip | |
move.l #(copjmp2<<16),(a0)+ ; jump | |
move.l #($ffe1<<16)|($FFFE),(a0)+ ;wait (bug ffe1, ffdf) | |
move.l a0,d0 | |
add.l #8,d0 | |
move.w #(cop2lc+2),(a0)+ | |
move.w d0,(a0)+ | |
swap d0 | |
move.w #(cop2lc+0),(a0)+ | |
move.w d0,(a0)+ | |
; loop begins | |
move.l #($0001<<16)|($81FE),(a0)+ ;wait | |
move.l #(bpl1mod<<16)|((-40)&$FFFF),(a0)+ | |
move.l #(bpl2mod<<16)|((-40)&$FFFF),(a0)+ | |
move.l #($0101<<16)|($81FE),(a0)+ ;wait | |
move.l #(bpl1mod<<16)|((0)&$FFFF),(a0)+ | |
move.l #(bpl2mod<<16)|((0)&$FFFF),(a0)+ | |
; UNCOMMENT THIS TO WORKAROUND THE BUG | |
;move.l #($FFFF<<16)|($FFFF),(a0)+ ; skip | |
move.l #(copjmp2<<16),(a0)+ ; jump | |
move.l #($FFFF<<16)|($FFFE),(a0)+ | |
rts | |
setupscreen: | |
.setupcopper: | |
move.l copper1ptr(pc),a0 | |
lea bplmemptrs(pc),a1 | |
jsr fillcopper | |
move.l copper1ptr(pc),a0 | |
move.l a0,cop1lc(a5) | |
move.w a0,copjmp1(a5) | |
move.w #0,bpl1mod(a5) | |
move.w #0,bpl2mod(a5) | |
.setuppalette: | |
move.l a5,a0 | |
add.l #$180,a0 | |
move.w #31,d0 | |
move.w #0,d1 | |
.setpal | |
move.w d1,(a0)+ | |
add.w #$71c,d1 | |
dbf d0,.setpal | |
.screenon: | |
move.w #$2c81,diwstrt(a5) ; DIWSTRT - topleft corner (2c81) | |
move.w #$2cc1,diwstop(a5) ; DIWSTOP - bottomright corner (c8d1) | |
move.w #$0038,ddfstrt(a5) ; DDFSTRT | |
move.w #$00d0,ddfstop(a5) ; DDFSTOP | |
move.w #$8180,dmacon(a5) | |
rts | |
; trashes a0 | |
rand_init: | |
lea rand_shiftreg(pc),a0 | |
move.l #$ABABABAB,(a0) | |
rts | |
; return in d0 | |
rand_clock: | |
movem.l a0,-(sp) | |
lea rand_shiftreg(pc),a0 | |
move.l (a0),d0 | |
rol.l d0 | |
bcc noxor | |
eor.l #$C4,d0 | |
noxor: | |
move.l d0,(a0) | |
movem.l (sp)+,a0 | |
rts | |
rand_shiftreg: | |
dc.l $0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment