home *** CD-ROM | disk | FTP | other *** search
- **
- ** A500/600/1000/1200/2000/3000/4000
- ** Kick 1.2,1.3 / OS 2.x/3.x
- ** 68000/010/020/030/040
- ** OCS/ECS/AGA
- **
- ** ** DEMO SUPPORT FUNCTIONS **
- **
- **
- ** Coded by Frank Wille 1994
- ** using PhxAss 4
- **
- **
- ** __MERGED SMALL DATA A4 - VERSION
- ** Link with: PhxLnk prog.o DemoSupp.o
- **
- **
- ** 10.12.94 demoStartup, demoCleanUp, demoIntVec (created)
- ** 12.12.94 Switched to __MERGED-SmallData
- ** 20.12.94 demoStdView, demoBplPtrs (created)
- ** 22.12.94 demoColors (created), code optimizations in demoStdView
- **
-
-
- ;=============================================================================
- ; Exported Symbols:
- ;=============================================================================
- ; SysBase : Pointer to ExecBase structure
- ; GfxBase : Pointer to GfxBase structure
- ; PALflag : true: System is in PAL mode
- ; AAflag ; true: AGA chips are available
- ;=============================================================================
-
-
- ;=============================================================================
- ; Exported Functions:
- ;=============================================================================
- ;
- ; demoStartup
- ; in: -
- ; out: Z-Flag = Error! Jump to demoCleanup immediately!
- ; a4 = Small Data Base
- ; a6 = CUSTOM
- ; All other registers are in random state!!!
- ; Small Data initialization. Disable Data Cache. Enable CLI or Workbench
- ; start. Determine VBR, PAL/NTSC mode, Gfx-chips. Save system state.
- ; Allocate Blitter. Turn off all interrupts and DMA channels. Disable
- ; AGA/ECS features. Save interrupt autovectors.
- ;
- ; demoCleanup
- ; in: -
- ; out: d0 = 0 (for return to CLI - no error)
- ; All other registers are in random state!!!
- ; Restores anything which has changed during the demo. Then, the program
- ; may return to CLI or WB without any danger.
- ;
- ; demoIntVec
- ; in: d0.w = Number of interrupt level vector to change (1-6)
- ; a0 = Pointer to interrupt routine (terminated by 'rte')
- ; (CAUTION: The 'rte' should be preceded by a 'nop',
- ; because of the 68040's instruction pipeline)
- ; out: -
- ; Set interrupt autovector.
- ;
- ; demoStdView
- ; in: d0.w = Display width in pixels (should be word-aligned)
- ; d1.w = Display height in lines
- ; d2.w = Horizontal start position (std.= $81)
- ; d3.w = Vertical start position (std.= $29)
- ; d4.w = Depth
- ; Bits 2-0 = Number of bitplanes (1-5)
- ; Bit 3 = Interleaved Mode (fast blits)
- ; a0 = Actual copper list pointer
- ; a1 = Display memory pointer
- ; out: a0 = New copper list pointer
- ; All registers, with the exception of a0, d0 and d1 will be saved
- ; All necessary copper instructions for defining a display of the pre-
- ; fered dimensions will be appended to the specified copper list.
- ; If Width exceeds 384, the HIRES mode will be activated. If Height
- ; exceeds 288 the LACE mode will be activated. Additionally to BPLxPT
- ; the following registers are initialized by these copper instructions:
- ; BPLxMOD, DIWSTRT, DIWSTOP, DDFSTRT, DDFSTOP, BPLCON0.
- ; BPLCON1 and BPLCON2 were already initialized in demoStartup.
- ;
- ; demoBplPtrs
- ; in: a0 = Actual copper list pointer
- ; a1 = Display memory pointer
- ; d0.w = Depth (1-5)
- ; d1 = Plane offset (mode-dependant, e.g. LACE or Interleaved)
- ; out: a0 = New copper list pointer
- ; All registers but a0 will be saved!
- ; Append copper instructions for bitplane pointer initialization. This
- ; routine will be also called by demoStdView.
- ;
- ; demoColors
- ; in: a0 = Actual copper list pointer
- ; a1 = Color table (RGB4 UWORDs)
- ; d0.w = Number of colors in table (always beginning with COLOR00)
- ; out: a0 = New copper list pointer
- ; Transfer colors from a UWORD-table directly to copper list.
- ;
- ;=============================================================================
-
-
- include "lib/exec.i"
- include "lib/graphics.i"
-
- include "exec/execbase.i"
- include "exec/libraries.i"
- include "dos/dosextens.i"
- include "graphics/gfxbase.i"
- include "hardware/dmabits.i"
- include "hardware/intbits.i"
- include "hardware/custom_all.i"
- include "hardware/cia.i"
-
-
- near a4,-2 ; Small Data __MERGED
-
- xref _DATA_BAS_ ; symbols will be supplied by PhxLnk
- xref _DATA_LEN_
- xref _BSS_LEN_
-
-
-
- code
-
-
- xdef demoStartup
- demoStartup:
- ; -> a4 = Small Data Base
- ; -> a6 = CUSTOM
- move.l ExecBase.w,a6
- lea _DATA_BAS_,a0
- lea 32766(a0),a4 ; a4 SmallData Base
- cmp.w #36,lib_Version(a6) ; OS2.0+ available?
- bhs.s 2$
- add.l #_DATA_LEN_,a0
- move.l #_BSS_LEN_,d0
- 1$: clr.l (a0)+ ; Initialize BSS area (for Kick 1.x)
- subq.l #4,d0
- bhi.s 1$
- bra.s 3$
- 2$: move.l #$100,d2
- moveq #0,d0
- move.l d2,d1
- jsr CacheControl(a6) ; disable Data Cache
- and.l d2,d0
- move.l d0,oldCache(a4)
- 3$: move.l a6,SysBase(a4)
- move.l ThisTask(a6),a2 ; pointer to actual process structure
- move.l pr_CLI(a2),d0
- bne.s 5$ ; Workbench start?
- 4$: lea pr_MsgPort(a2),a0
- jsr WaitPort(a6) ; get WBStartupMsg
- lea pr_MsgPort(a2),a0
- jsr GetMsg(a6)
- move.l d0,wbStartupMsg(a4)
- beq.s 4$
- 5$: sub.l a0,a0
- btst #AFB_68010,AttnFlags+1(a6)
- beq.s 6$
- lea get_VBR(pc),a5
- jsr Supervisor(a6) ; read and save VBR (68010+)
- 6$: move.l a0,VBReg(a4)
- lea $64(a0),a0
- lea autoVecs(a4),a1 ; save Interrupt Autovectors
- moveq #6-1,d0
- 7$: move.l (a0)+,(a1)+
- dbf d0,7$
- lea GfxName(pc),a1
- moveq #33,d0
- jsr OpenLibrary(a6) ; open graphics.library
- move.l d0,GfxBase(a4)
- beq 99$ ; error?
- move.l d0,a6
- move.l gb_ActiView(a6),ActiView(a4)
- sub.l a1,a1
- jsr LoadView(a6) ; LoadView(NULL)
- jsr WaitTOF(a6)
- jsr WaitTOF(a6)
- jsr OwnBlitter(a6) ; allocate Blitter
- jsr WaitBlit(a6)
- moveq #0,d2 ; d2 BEAMCON0 (init PAL or NTSC)
- btst #PALn,gb_DisplayFlags+1(a6)
- beq.s 8$ ; PAL?
- st PALflag(a4)
- moveq #$20,d2
- 8$: moveq #%1100,d0
- and.b gb_ChipRevBits0(a6),d0
- sne AAflag(a4) ; AGA available?
- lea CUSTOM,a6
- move.w DMACONR(a6),d0 ; save DMACON and INTENA states
- or.w #DMAF_SETCLR,d0
- move.w d0,oldDMACON(a4)
- move.w INTENAR(a6),d0
- or.w #INTF_SETCLR|INTF_INTEN,d0
- move.w d0,oldINTENA(a4)
- movem.l dmaintInit(pc),d0-d1 ; turn off DMA channels, CLXCON=0
- movem.l d0-d1,DMACON(a6) ; disable interrupts, clear INTREQ
-
- move.w d2,BEAMCON0(a6) ; *** disable AGA / ECS features ***
- lea bplconInit(pc),a0
- lea BPLCON0(a6),a1 ; init BPLCON0..4, BPL1MOD, BPL2MOD
- moveq #7-1,d0
- 9$: move.w (a0)+,(a1)+
- dbf d0,9$
- lea SPR0POS(a6),a0 ; clear all sprites
- moveq #16-1,d1
- moveq #0,d0
- 10$: move.l d0,(a0)+
- dbf d1,10$
- move.w d0,FMODE(a6) ; OCS fetch mode
- moveq #-1,d0
- 99$: rts
-
- machine 68010
- get_VBR:
- movec VBR,a0
- rte
- machine 68000
-
- bplconInit: ; init values for BPLCON0..4, BPL1/2MOD
- dc.w $0000,$0000,$0024,$0c00,$0000,$0000,$0011
- dmaintInit: ; init DMACON,CLXCON,INTENA,INTREQ
- dc.w $1fff,$0000,$7fff,$7fff
- GfxName:
- dc.b "graphics.library",0
- even
-
-
- xdef demoCleanup
- demoCleanup:
- move.l GfxBase(a4),d0
- beq 3$
- move.l d0,a6
- jsr WaitBlit(a6)
- lea CUSTOM,a5
- movem.l dmaintInit(pc),d0-d1 ; turn off DMA channels, CLXCON=0
- movem.l d0-d1,DMACON(a5) ; disable interrupts, clear INTREQ
- moveq #0,d0 ; zero audio volumes
- move.w d0,AUD0VOL(a5)
- move.w d0,AUD1VOL(a5)
- move.w d0,AUD2VOL(a5)
- move.w d0,AUD3VOL(a5)
- lea autoVecs(a4),a0
- move.l VBReg(a4),a1
- lea $64(a1),a1
- moveq #6-1,d0
- 4$: move.l (a0)+,(a1)+ ; restore interrupt autovectors
- dbf d0,4$
- move.w oldDMACON(a4),DMACON(a5) ; reactivate DMA channels and interrupts
- move.w oldINTENA(a4),INTENA(a5)
- bclr #1,CIAA|PRA ; turn on LED/filter
- move.l ActiView(a4),a1
- jsr LoadView(a6) ; restore system View
- jsr DisownBlitter(a6) ; free Blitter
- move.l gb_copinit(a6),COP1LC(a5) ; restart system copper lists
- move.l a6,a1
- move.l SysBase(a4),a6
- jsr CloseLibrary(a6) ; close graphics.library
- 3$: move.l SysBase(a4),a6
- cmp.w #36,lib_Version(a6)
- blo.s 2$ ; OS2.0+ available?
- moveq #-1,d0
- move.l oldCache(a4),d1
- jsr CacheControl(a6) ; enable Data Cache (if required)
- 2$: move.l wbStartupMsg(a4),d0 ; WB start? Reply WB message
- beq.s 1$
- move.l d0,a1
- jsr Forbid(a6)
- jsr ReplyMsg(a6)
- 1$: moveq #0,d0 ; Finished, return to CLI or Workbench
- rts
-
-
- xdef demoIntVec
- cnop 0,4
- demoIntVec:
- ; d0 = Interrupt Level (1-6)
- ; a0 = Pointer to interrupt routine
- move.l VBReg(a4),a1
- add.w d0,d0
- add.w d0,d0
- move.l a0,$60(a1,d0.w) ; set interrupt autovector
- rts
-
-
- xdef demoStdView
- cnop 0,4
- demoStdView:
- ; d0 = Width.w, d1 = Height.w
- ; d2 = HStart.w, d3 = VStart.w
- ; d4 = Depth.w (Bit 3 = Interleaved)
- ; a0 = Copper List
- ; a1 = Display Memory
- ; -> a0 = new Copper List
- movem.l d2-d7,-(sp)
- move.w #$0200,d6 ; d6 BPLCON0 Display Mode
- moveq #0,d7 ; d7 Std Modulo
- move.w d0,d5
- lsr.w #3,d5 ; d5 calculate bitplane offset
- cmp.w #384,d0
- blo.s 1$ ; Width >= 384 -> HIRES
- lsr.w #1,d0 ; convert to LoRes-width
- or.w #$8000,d6
- 1$: cmp.w #288,d1
- blo.s 2$ ; Height >= 288 -> LACE
- lsr.w #1,d1
- addq.w #4,d6
- move.w d5,d7 ; d7 set Lace Modulo
- bclr #3,d4 ; Lace-Interleaved?
- beq.s 4$
- mulu d4,d7
- add.l d7,d7
- bra.s 3$
- 2$: bclr #3,d4 ; Interleaved?
- beq.s 4$
- move.w d5,d7 ; d7 set Interleaved Modulo
- mulu d4,d7
- 3$: ext.l d5
- sub.l d5,d7
- bra.s 5$
-
- 7$: move.w d3,d7
- lsl.w #8,d7
- move.b d2,d7
- 6$: move.w d0,(a0)+
- move.w d7,(a0)+
- addq.w #2,d0
- rts
-
- 4$: mulu d1,d5
- 5$: exg d4,d0
- exg d5,d1
- bsr.s demoBplPtrs ; initialize bitplane pointers
- ror.w #4,d0
- or.w d0,d6 ; d6 BPLCON0 ready
- move.w #BPL1MOD,d0
- bsr.s 6$ ; initialize modulos
- bsr.s 6$
- move.w #DIWSTRT,d0
- bsr.s 7$ ; init DIWSTRT
- move.w d2,d1
- add.w d4,d2
- add.w d5,d3
- bsr.s 7$ ; init DIWSTOP
- moveq #8,d7
- tst.w d6 ; HIRES?
- bpl.s 8$
- moveq #4,d7
- 8$: lsr.w #1,d1 ; init DDFSTRT
- sub.w d7,d1
- neg.w d7
- and.w d1,d7
- bsr.s 6$
- lsr.w #1,d4 ; init DFFSTOP
- subq.w #8,d4
- add.w d4,d7
- bsr.s 6$
- move.w #BPLCON0,(a0)+ ; set BPLCON0 (DispMode, Planes)
- move.w d6,(a0)+
- movem.l (sp)+,d2-d7
- rts
-
-
- xdef demoBplPtrs
- cnop 0,4
- demoBplPtrs:
- ; d0 = Depth.w
- ; a0 = Copper List
- ; a1 = Display Memory
- ; d1 = Plane Offset
- ; -> d0, d1, a1 will be saved!
- ; -> a0 = new Copper List
- movem.l d0-d3,-(sp)
- subq.w #1,d0
- move.l a1,d3
- move.w #BPL1PT,d2
- 1$: bsr.s 2$
- bsr.s 2$
- add.l d1,d3
- dbf d0,1$
- movem.l (sp)+,d0-d3
- rts
- 2$: swap d3
- move.w d2,(a0)+
- move.w d3,(a0)+
- addq.w #2,d2
- rts
-
-
- xdef demoColors
- cnop 0,4
- demoColors:
- ; d0 = NumColors.w
- ; a0 = Copper List
- ; a1 = Color Table
- ; -> a0 = new Copper List
- subq.w #1,d0
- move.w #COLOR00,d1
- 1$: move.w d1,(a0)+
- move.w (a1)+,(a0)+
- addq.w #2,d1
- dbf d0,1$
- rts
-
-
-
-
- section "__MERGED",bss
-
-
- xdef SysBase,GfxBase,PALflag,AAflag
-
- SysBase: ds.l 1
- GfxBase: ds.l 1
- oldCache: ds.l 1
- wbStartupMsg: ds.l 1
- VBReg: ds.l 1
- ActiView: ds.l 1
- oldDMACON: ds.w 1
- oldINTENA: ds.w 1
- autoVecs: ds.l 6
- PALflag: ds.b 1
- AAflag: ds.b 1
-
- end
-