[comp.sys.amiga.programmer] Assembly Graphics Help Needed

G60LG@CUNYVM.BITNET (Anton Mitchell) (06/26/91)

     I have tried to get this assembly program to work for the longest.
Any help would be great. What I dont understand is when assembled and
executed the bitplanes are not cleared. When allocating the memory I set
the Clear and Chip flags. But it is not cleared. The only way I have been
able to clear the bitplanes is by using:
                                         lea     PlaneAdr,a1
                                         move.l  PlaneSize*6,d1
                                 Loop:   move.w  #0,(a1)+
                                         dbra    d1,Loop
Also when executed several times the bars which usually present in a
blue wind up with other colors etc. And after several executions it will
not execute. Any help on what is wrong with the code would be great. I
have just started programming Assembly and I am going crazy with this
program.

                                             Thanks in Advance,
                                             Anton Mitchell





;CustomChip-Register

INTENA  EQU $9A
DMACON  EQU $96
COLOR00 EQU $180
VHPOSR  EQU $6

;COPPER REGISTER

COP1LC  EQU $80
COP2LC  EQU $84
COPJMP1 EQU $88
COPJMP2 EQU $8A

;BITPLANE REGISTER

BPLCON0 EQU $100
BPLCON1 EQU $102
BPLCON2 EQU $104
BPL1PTH EQU $0E0
BPL1PTL EQU $0E2
BPL1MOD EQU $108
BPL2MOD EQU $10A
DIWSTRT EQU $08E
DIWSTOP EQU $090
DDFSTRT EQU $092
DDFSTOP EQU $094

;CIA-A PORT REGISTER A (MOUSE BUTTON)

CIAAPRA EQU $BFE001

;EXEC LIBRARY BASE OFFSETS

OpenLibrary  EQU -552
CloseLibrary EQU -414
Forbid       EQU -132
Permit       EQU -138
AllocMem     EQU -198
FreeMem      EQU -210

;Grafix Base

StartList   EQU 38

;Other Labels

ExecBase   EQU 4
PlaneSize  EQU 40*200
CLsize     EQU 13*4
Chip       EQU $02
Clear      EQU $10000+Chip

;****** Initialize Main Program ********
;Request memory for bitplanes

Start:
 move.l ExecBase,a6
 move.w #PlaneSize*6,d0
 move.w Clear,d1

 jsr    AllocMem(a6)
 move.l d0,Planeadr
 beq    Exit

 move.l Planeadr,a1
 move.l #PlaneSize,d1
LoopA:
 move.w #%11110000,(a1)+
 dbra   d1,LoopA

;Request Memory for copperlist

 moveq  #CLsize,d0
 moveq  #Chip,d1
 jsr    AllocMem(a6)
 move.l d0,CLadr
 beq    FreePlane

; Build CopperList
 moveq  #5,d4
 move.l d0,a0
 move.l Planeadr,d1
 move.w #BPL1PTH,d3

MakeCL:
 move.w d3,(a0)+
 addq.w #2,d3
 swap   d1
 move.w d1,(a0)+
 move.w d3,(a0)+
 addq.w #2,d3
 swap   d1
 move.w d1,(a0)+
 add.l  #PlaneSize,d1
 dbf    d4,MakeCL
 move.l #$fffffffe,(a0)


;*******Main Program *********
; DMA Task switching off

 jsr    Forbid(a6)
 lea    $dff000,a5
 move.w #$03e0,DMACON(a5)

;Copper Initialization

 move.l CLadr,COP1LC(a5)
 clr.w  COPJMP1(a5)

;Color Table with different color fills

 moveq  #31,d0
 lea    COLOR00(a5),a1
 moveq  #1,d1

SetTab:
 move.w d1,(a1)+
 mulu   #3,d1
 dbf    d0,SetTab

;PlayField Initilization
 move.w #$2C81,DIWSTRT(a5)
 move.w #$F4C1,DIWSTOP(a5)
 move.w #$0038,DDFSTRT(a5)
 move.w #$00d0,DDFSTOP(a5)
 move.w #%0110001000000000,BPLCON0(a5)
 clr.w  BPLCON1(a5)
 clr.w  BPLCON2(a5)
 clr.w  BPL1MOD(a5)
 clr.w  BPL2MOD(a5)

;DMA on
 move.w #$8380,DMACON(a5)

Wait:
 btst   #6,CIAAPRA
 bne    Wait

;****** END LOOP ******

;Activate Old CopperList

 moveq   #0,d0
 move.l  ExecBase,a6
 lea     GFXName,a1
 jsr     OpenLibrary(a6)
 move.l  d0,GFXBase
 movea.l d0,a4


 move.l StartList(a4),COP1LC(a5)
 clr.w  COPJMP1(a5)
 move.w #$8060,DMACON(a5)
 jsr    Permit(a6)

;Free Memory for Copper List

 move.l CLadr,a1
 moveq  #CLsize,d0
 jsr    FreeMem(a6)

;Free Memory for BitPlanes

FreePlane:
 move.l Planeadr,a1
 move.l #PlaneSize*6,d0
 jsr    FreeMem(a6)


 movea.l 4,a6
 move.l  GFXBase,a1
 jsr     CloseLibrary(a6)

Exit:
 clr.l   d0
 rts

;Variables
CLadr:     dc.l 0
Planeadr   dc.l 0
GFXBase    dc.l 0

;Constants
GFXName dc.b "graphics.library",0

Program end
 end

chrisg@cbmvax.commodore.com (Chris Green) (06/26/91)

In article <91177.015130G60LG@CUNYVM.BITNET> G60LG@CUNYVM.BITNET (Anton Mitchell) writes:
>
>     I have tried to get this assembly program to work for the longest.
>Any help would be great. What I dont understand is when assembled and
>executed the bitplanes are not cleared. When allocating the memory I set
>the Clear and Chip flags. But it is not cleared. The only way I have been
>able to clear the bitplanes is by using:
>                                         lea     PlaneAdr,a1
>                                         move.l  PlaneSize*6,d1
>                                 Loop:   move.w  #0,(a1)+
>                                         dbra    d1,Loop
>Also when executed several times the bars which usually present in a
>blue wind up with other colors etc. And after several executions it will
>not execute. Any help on what is wrong with the code would be great. I
>have just started programming Assembly and I am going crazy with this
>program.
>
>                                             Thanks in Advance,
>                                             Anton Mitchell
>
>
> move.w #PlaneSize*6,d0
	This should be MOVE.L #PlaneSize*6,d0
> move.w Clear,d1
	This should be MOVE.L #Clear,d1


	Also, your replacement of the system copper list didn't look robust enough.
That would explain your messed up colors.
-- 
*-------------------------------------------*---------------------------*
|Chris Green - Graphics Software Engineer   - chrisg@commodore.COM      f
|                  Commodore-Amiga          - uunet!cbmvax!chrisg       n
|My opinions are my own, and do not         - killyouridolssonicdeath   o
|necessarily represent those of my employer.- itstheendoftheworld       r
*-------------------------------------------*---------------------------d

peterk@cbmger.UUCP (Peter Kittel GERMANY) (06/26/91)

In article <91177.015130G60LG@CUNYVM.BITNET> G60LG@CUNYVM.BITNET (Anton Mitchell) writes:
>
>     I have tried to get this assembly program to work for the longest.
>Any help would be great. What I dont understand is when assembled and
>executed the bitplanes are not cleared. When allocating the memory I set
>the Clear and Chip flags. But it is not cleared.

>Chip       EQU $02
>Clear      EQU $10000+Chip
                 ^^^^^
This is a LONG value! A WORD would only be max. 4 hex digits,
you have here 5.

> move.w Clear,d1
       ^
Make this a move.l

-- 
Best regards, Dr. Peter Kittel  // E-Mail to  \\  Only my personal opinions... 
Commodore Frankfurt, Germany  \X/ {uunet|pyramid|rutgers}!cbmvax!cbmger!peterk

ins760z@monu4.cc.monash.edu.au (mr c.r. hames) (06/27/91)

In article <91177.015130G60LG@CUNYVM.BITNET> G60LG@CUNYVM.BITNET (Anton Mitchell) writes:
>
>     I have tried to get this assembly program to work for the longest.
>Any help would be great. What I dont understand is when assembled and
>executed the bitplanes are not cleared. When allocating the memory I set
>the Clear and Chip flags. But it is not cleared. The only way I have been
>able to clear the bitplanes is by using:
>                                         lea     PlaneAdr,a1
>                                         move.l  PlaneSize*6,d1
>                                 Loop:   move.w  #0,(a1)+
>                                         dbra    d1,Loop

     Besides the faults with your allocate mem putting words into
d0 and d1 instead of longs which has been mentioned and the general
nastiness of wacking in your own copperlist.   REMEMBER that dbra
does one more operation than what the counter started with.  Many
people forget this an overwrite memory not owned by them.

So if you want to clear 100 words.

       move.l   MemPtr,a0
       moveq	#100-1,d1     ; Note The -1
       moveq    #0,d0         ; lets not be too slow hey!
Loop:  move.w   d0,(a0)+
       dbra     d1,Loop


--
Chris Hames         Person to blame for DirWork, VMK, FSDirs, etc
                    And soon for PC-Task?
ins760z@monu4.cc.monash.edu.au  OR  bytey@phoenix.pub.uu.oz.au  OR 3:633/353
I speak for nobody not even myself.....

carolyn@cbmvax.commodore.com (Carolyn Scheppner - CATS) (06/28/91)

In article <91177.015130G60LG@CUNYVM.BITNET> G60LG@CUNYVM.BITNET (Anton Mitchell) writes:
>
>     I have tried to get this assembly program to work for the longest.
>Any help would be great. What I dont understand is when assembled and
>executed the bitplanes are not cleared. When allocating the memory I set
>the Clear and Chip flags. But it is not cleared. The only way I have been
>able to clear the bitplanes is by using:
>                                         lea     PlaneAdr,a1
>                                         move.l  PlaneSize*6,d1
>                                 Loop:   move.w  #0,(a1)+
>                                         dbra    d1,Loop

I don't know if anyone has pointed this out yet, but do you know
that the decrement-and-branch instructions (like dbra) operate on
just the low word of the data register ? ie. the maximum number
of iterations a single dbra loop can get you is 65536.  So you
are probably only moving a portion of what you are trying to move...
-- 
==========================================================================
 Carolyn Scheppner -- Tech. Mgr. CATS - Commodore Amiga Technical Support
 PHONE 215-431-9180 {uunet,rutgers}!cbmvax!carolyn  carolyn@commodore.com

 Signed characters are xenophobic.  
==========================================================================

mykes@amiga0.SF-Bay.ORG (Mike Schwartz) (06/28/91)

In article <1991Jun27.140403.15476@monu0.cc.monash.edu.au> ins760z@monu4.cc.monash.edu.au (mr  c.r. hames) writes:
>In article <91177.015130G60LG@CUNYVM.BITNET> G60LG@CUNYVM.BITNET (Anton Mitchell) writes:
>>
>>     I have tried to get this assembly program to work for the longest.
>>Any help would be great. What I dont understand is when assembled and
>>executed the bitplanes are not cleared. When allocating the memory I set
>>the Clear and Chip flags. But it is not cleared. The only way I have been
>>able to clear the bitplanes is by using:
>>                                         lea     PlaneAdr,a1
>>                                         move.l  PlaneSize*6,d1
>>                                 Loop:   move.w  #0,(a1)+
>>                                         dbra    d1,Loop
>
>     Besides the faults with your allocate mem putting words into
>d0 and d1 instead of longs which has been mentioned and the general
>nastiness of wacking in your own copperlist.   REMEMBER that dbra
>does one more operation than what the counter started with.  Many
>people forget this an overwrite memory not owned by them.
>

As well, most assemblers will allow you to let the OS do your memory
allocation for you.  For example, instead of using AllocMem to
allocate screen bitplanes, you could do the following:

	SECTION	screen,BSS,CHIP
myScreen	ds.b	(WIDTH/8)*HEIGHT*DEPTH

And you can put your copper list right into CHIP ram, too:

	SECTION	copper,DATA,CHIP
myCopper	dc.w	...
		...

--
****************************************************
* I want games that look like Shadow of the Beast  *
* but play like Leisure Suit Larry.                *
****************************************************