11 February 2024, 14:26 | #21 |
Registered User
Join Date: Feb 2017
Location: Denmark
Posts: 1,189
|
Ahh, attribute bit 7 is apparently used for blinking on zx. Yes, then bplcon4 will work, though it's a bit of a nightmare to get the bplcon4 change to take effect exactly at the right time.
Image is this one: https://zxart.ee/eng/authors/d/diver...eaven-s-devil/ (converted from incbin'ed scr file on startup) |
11 February 2024, 19:13 | #22 |
Registered User
Join Date: Feb 2017
Location: Denmark
Posts: 1,189
|
Cleaned up source (and added simple copper loop option) in case somebody wants to spot off-by-one errors. If you were making a ZX emulator you'd "unscramble" bitmap w/ copper instead, but I can't be bothered to do that.
Code:
include exec/execbase.i include graphics/gfxbase.i include hardware/custom.i include hardware/dmabits.i opt o+ mc68020 _LVOForbid EQU -132 _LVOPermit EQU -138 _LVOOldOpenLibrary EQU -408 _LVOCloseLibrary EQU -414 _LVOLoadView EQU -222 _LVOWaitBlit EQU -228 _LVOWaitTOF EQU -270 _LVOOwnBlitter EQU -456 _LVODisownBlitter EQU -462 ;========================== usecoploop=1 ;========================== screenw=256 screenh=192 nbpl=1 rowwords=screenw/16 rowbytes=2*rowwords bplbytes=rowwords*2*screenh dfstart=$38 xscroll=16 xstart=$91 ifne usecoploop ystart=$40 ; To make copper loops easier else ystart=$2c+(256-screenh)/2 endc custom=$dff000 SECTION code,code start: btst.b #1,vposr+custom bne .aga moveq #-1,d0 rts .aga move.l 4.w,a6 lea gfxname(pc),a1 jsr _LVOOldOpenLibrary(a6) move.l d0,a2 jsr _LVOForbid(a6) move.l a2,a6 move.l gb_ActiView(a6),-(sp) jsr _LVOOwnBlitter(a6) jsr _LVOWaitBlit(a6) sub.l a1,a1 jsr _LVOLoadView(a6) jsr _LVOWaitTOF(a6) jsr _LVOWaitTOF(a6) move.l #custom,a6 move.w #$7fff,d0 move.w intenar(a6),-(sp) or.w #$8000,(sp) move.w d0,intena(a6) move.w d0,intreq(a6) .wait1: btst.b #5,intreqr+1(a6) beq .wait1 move.w dmaconr(a6),-(sp) or.w #$8000,(sp) move.w d0,dmacon(a6) move.l a2,-(sp) bsr main move.l (sp)+,a2 lea custom,a6 move.w #$7fff,d0 move.w d0,intreq(a6) .wait2 btst.b #5,intreqr+1(a6) beq .wait2 move.w d0,dmacon(a6) move.w d0,intena(a6) move.l gb_copinit(a2),cop1lc(a6) move.l gb_LOFlist(a2),cop2lc(a6) clr.w copjmp1(a6) move.w (sp)+,dmacon(a6) move.w (sp)+,intena(a6) move.l (sp)+,a1 move.l a2,a6 jsr _LVOLoadView(a6) jsr _LVOWaitTOF(a6) jsr _LVOWaitTOF(a6) jsr _LVODisownBlitter(a6) move.l a6,a1 move.l $4.w,a6 jsr _LVOCloseLibrary(a6) jsr _LVOPermit(a6) moveq #0,d0 rts gfxname: dc.b 'graphics.library',0 even main: bsr buildpal bsr setpal bsr makecopperlist bsr copybpl bsr copyattr move.w #(nbpl&7)<<12!1<<9!(nbpl&8)<<1!1,bplcon0(a6) move.w #(xscroll>>4)<<10!(xscroll&$f)!1<<9,bplcon1(a6) ; + one hires pixel!! move.w #$0024,bplcon2(a6) move.w #1<<5,bplcon3(a6) ; border blank move.w #$0011,bplcon4(a6) moveq #-8,d0 move.w d0,bpl1mod(a6) move.w d0,bpl2mod(a6) move.w #(ystart<<8)!xstart,diwstrt(a6) move.w #(((ystart+screenh)<<8)&$ff00)!((xstart+screenw)&$ff),diwstop(a6) move.w #dfstart,ddfstrt(a6) move.w #dfstart+32*((screenw+63)/64),ddfstop(a6) move.w #3,fmode(a6) move.l #copperlist,cop1lc(a6) move.w #$7fff,intreq(a6) .waitf0: btst.b #5,intreqr+1(a6) beq .waitf0 move.w #$7fff,intreq(a6) move.w #DMAF_SETCLR!DMAF_MASTER!DMAF_RASTER!DMAF_COPPER!DMAF_BLITTER,dmacon(a6) .mainloop: btst.b #6,$bfe001 bne .mainloop move.w #0,fmode(a6) rts makecopperlist: moveq #nbpl-1,d0 move.w #bplpt,d1 move.l #screen,d2 swap d2 lea copperlist,a0 lea clines,a1 .bpl move.w d1,(a0)+ addq.w #2,d1 move.w d2,(a0)+ swap d2 move.w d1,(a0)+ addq.w #2,d1 move.w d2,(a0)+ add.l #bplbytes,d2 swap d2 dbf d0,.bpl ifne usecoploop move.w #screenh/8-1,d0 moveq #ystart,d1 ; Initial wait move.b d1,(a0)+ move.b #$01,(a0)+ move.w #-2,(a0)+ move.l #bplcon4<<16!$0011,d4 .y ; Restart point move.l a0,d2 addq.l #8,d2 move.w #cop2lc+2,(a0)+ move.w d2,(a0)+ move.w #cop2lc,(a0)+ swap d2 move.w d2,(a0)+ moveq #-128,d2 and.b d1,d2 move.b d2,(a0)+ move.b #(xstart-2)>>1!1,(a0)+ move.w #$80fe,(a0)+ move.l a0,(a1) addq.l #2,(a1)+ ; Line moveq #rowbytes,d2 ; One extra .x move.l d4,(a0)+ dbf d2,.x ; Wait for end of line moveq #-128,d2 and.b d1,d2 move.b d2,(a0)+ move.b #$df,(a0)+ move.w #$80fe,(a0)+ ; Advance addq.w #8,d1 ; Skip jump if reached next block move.b d1,(a0)+ move.b #$01,(a0)+ move.w #$7f01,(a0)+ move.l #copjmp2<<16,(a0)+ dbf d0,.y move.l #-2,(a0) else ; usecoploop move.w #screenh-1,d0 move.w #ystart<<8!((xstart-2)>>1)!1,d1 moveq #-2,d2 move.l #bplcon4<<16!$0011,d3 .y move.w d1,(a0)+ move.w d2,(a0)+ lea 2(a0),a2 move.l a2,(a1)+ moveq #rowbytes,d4 ; One extra to end with BPLCON4=$0011 .x move.l d3,(a0)+ dbf d4,.x add.w #1<<8,d1 bcc .nowrap move.w #$ffdf,(a0)+ move.w d2,(a0)+ .nowrap dbf d0,.y move.l d2,(a0)+ endc ; usecoploop rts copybpl: lea zxdata,a0 lea screen,a1 moveq #3-1,d0 .bank moveq #0,d1 .row move.l d1,d2 lsl.l #5,d2 ;mulu.w #rowbytes,d2 lea (a1,d2.l),a2 moveq #8-1,d2 .char ; copy 32 bytes from bank*rowbytes*64+row*rowbytes+char*rowbytes*8 ; rowbytes*(bank*64+row+char*8) rept 32/4 move.l (a0)+,(a2)+ endr add.w #rowbytes*7,a2 dbf d2,.char addq.b #1,d1 cmp.b #8,d1 bne .row add.w #rowbytes*64,a1 dbf d0,.bank rts copyattr: lea zxdata+bplbytes,a0 lea clines,a1 moveq #screenh/8-1,d0 .row ifne usecoploop move.l (a1)+,a2 moveq #rowbytes-1,d1 .line move.b (a0)+,d2 add.b d2,d2 move.b d2,(a2) addq.w #4,a2 dbf d1,.line else ; usecoploop moveq #8-1,d1 .char move.l a0,a2 move.l (a1)+,a3 moveq #rowbytes-1,d2 .line move.b (a2)+,d3 add.b d3,d3 move.b d3,(a3) addq.w #4,a3 dbf d2,.line dbf d1,.char add.w #rowbytes,a0 endc ; usecoploop dbf d0,.row rts buildpal: lea palette,a0 moveq #0,d0 .l ; bit 0-2 fg, 3-5 bg, 6 bright moveq #7,d2 move.l d0,d1 lsr.w #3,d1 and.w d2,d1 and.w d0,d2 lea .basic(pc),a1 btst #6,d0 beq .s lea .bright(pc),a1 .s move.l (a1,d1.w*4),(a0)+ move.l (a1,d2.w*4),(a0)+ addq.b #1,d0 cmp.b #128,d0 bne .l rts .basic: dc.l $000000,$0100CE,$CF0100,$CF01CE,$00CF15,$01CFCF,$CFCF15,$CFCFCF .bright: dc.l $000000,$0200FD,$FF0201,$FF02FD,$00FF1C,$02FFFF,$FFFF1D,$FFFFFF setpal: move.w #0,d0 lea palette,a0 .upperbank: move.w d0,bplcon3(a6) lea color(a6),a1 moveq #32-1,d1 .b1: move.l (a0)+,d2 ; d2=xxRr'GgBb lsr.l #4,d2 ; d2=xx0R'rGgB move.w d2,d3 ; d3=rGgB lsr.w #4,d3 ; d3=0rGg and.w #$f0,d3 ; d3=00G0 and.w #$0f,d2 ; d2=000B or.w d2,d3 ; d3=00GB swap d2 lsl.w #8,d2 ; d2=xR00 or.w d3,d2 ; d2=xRGB move.w d2,(a1)+ dbf d1,.b1 add.w #1<<13,d0 bne.b .upperbank lea palette,a0 .lowerbank: move.w d0,d1 or.w #1<<9,d1 ; LOCT move.w d1,bplcon3(a6) lea color(a6),a1 moveq #32-1,d1 .b2: move.l (a0)+,d2 ; d2=xxRr'GgBb move.l d2,d3 and.w #$f,d3 ; d3=000b lsr.w #4,d2 ; d2=xxRr'0GgB and.w #$f0,d2 ; d2=xxRr'00g0 or.w d2,d3 ; d3=00gb swap d2 ; d2=xxRr lsl.w #8,d2 ; d2=Rr00 or.w d3,d2 ; d2=Rrgb move.w d2,(a1)+ dbf d1,.b2 add.w #1<<13,d0 bne.b .lowerbank move.w #0,bplcon3(a6) rts SECTION data,data zxdata incbin diver.scr ; https://zxart.ee/eng/authors/d/diver/mercenary-4-the-heaven-s-devil/ ;incbin privet.scr ; https://zxart.ee/eng/authors/r/r0bat/privet/ ;incbin phantis.scr ; https://zxart.ee/eng/authors/m/mac/phantis11/ SECTION bss,bss palette: ds.l 256 clines: ifne usecoploop ds.l screenh/8 else ds.l screenh endc SECTION bss_c,bss_c screen: ds.w nbpl*rowwords*screenh copperlist: ds.w 2+nbpl*4+screenh*(4+2*rowbytes)+32 ; +32 to have some wiggle room |
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
Thread Tools | |
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
How To Change The Background Color For Input | DrkStarr | Coders. AMOS | 2 | 14 January 2023 18:24 |
Chunk True Color 4 pixels | remz | Coders. Asm / Hardware | 31 | 08 June 2022 13:04 |
Changing 3 registers every 16 horiz. pixels via Copper | Quagliarulo | Coders. Asm / Hardware | 5 | 20 September 2020 10:21 |
change the color 0 in realtime with the copper | Raislin77it | Coders. Blitz Basic | 7 | 09 February 2016 10:46 |
Copper color-changing restrictions? | Dan Locke | Coders. General | 24 | 01 February 2010 03:00 |
|
|