Skip to content

Instantly share code, notes, and snippets.

@mankeli
Created January 20, 2021 07:11
Show Gist options
  • Save mankeli/1ed7eec8ee8501d73e55c225b0d19166 to your computer and use it in GitHub Desktop.
Save mankeli/1ed7eec8ee8501d73e55c225b0d19166 to your computer and use it in GitHub Desktop.
Test program to demonstrate copper timing issue in winuae
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