English Amiga Board


Go Back   English Amiga Board > Coders > Coders. Asm / Hardware

 
 
Thread Tools
Old 11 February 2024, 14:26   #21
paraj
Registered User
 
paraj's Avatar
 
Join Date: Feb 2017
Location: Denmark
Posts: 1,146
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)
Attached Files
File Type: 68k ascreen.68k (8.4 KB, 21 views)
paraj is offline  
Old 11 February 2024, 19:13   #22
paraj
Registered User
 
paraj's Avatar
 
Join Date: Feb 2017
Location: Denmark
Posts: 1,146
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
paraj is offline  
 


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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 02:08.

Top

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Page generated in 0.09110 seconds with 16 queries