********* REGS ************************************ ExecBase = 4 OpenLib = -552 CloseLib = -414 SysCopper = 38 CUSTOM = $DFF000 DMACONR = $002 DMACON = $096 VPOSR = $004 COP1LCH = $080 COPJMP1 = $088 COLOR00 = $180 COLOR01 = $182 BPLCON0 = $100 DIWSTRT = $08E DIWSTOP = $090 DDFSTRT = $092 DDFSTOP = $094 BPL1PTH = $0E0 BPL1PTL = $0E2 BPL2PTH = $0E4 BPL2PTL = $0E6 BPL3PTH = $0E8 BPL3PTL = $0EA BPL4PTH = $0EC BPL4PTL = $0EE BPL5PTH = $0F0 BPL5PTL = $0F2 BPL6PTH = $0F4 BPL6PTL = $0F6 BPL1MOD = $108 BPL2MOD = $10A INTREQ = $09C INTREQR = $01E INTENA = $09A INTENAR = $01C ********* STARTUP SEQUENCE ************************************ start: move.l ExecBase,a6 ; get the addres of the graphics libary move.l #gfxname,a1 clr.l d0 jsr OpenLib(a6) tst.l d0 beq end move.l d0,gfxbase ; and save clr.l d0 ; get the address of the system copper move.l gfxbase,a6 move.l SysCopper(a6),d0 tst.l d0 beq end move.l d0,oldcopper ; and save lea CUSTOM,a6 ; move the base to a6 move.w DMACONR(a6),olddma ; save the current dma state ; from DMACONR move.w INTENAR(a6),oldintena ; save currentely enabled ; interrupts move.l $6C.w,oldirq3 ; save old irq (VBL) bsr waitVBI ; wait VBI befor changing the ; DMA to avois evential glitches move.w #$7FFF,DMACON(a6) ; deactivate all DMA channels move.w #$7FFF,INTENA(a6) ; deactivate all interrupts move.w #$7FFF,INTREQ(a6) ; deactivate all int requests ; probably not necessary ... ********* JUMP TO MAIN **************************************** jsr run ********* CELAN AND EXIT ************************************** exit: move.l ExecBase,a6 ; close graphics library move.l gfxbase,a1 jsr CloseLib(a6) end: lea CUSTOM,a6 move.l oldirq3,$6C.w ; retore old irq3 ; befor enabling irqs move.l oldcopper,COP1LCH(a6) ; restore system copper move.w #$7FFF,DMACON(a6) ; deactivate all DMA channels or.w #$8200,olddma ; set bits 15 and 9 move.w olddma,DMACON(a6) ; retore old DMA to DMACON or.w #$C000,oldintena ; set bit 15 and 14 move.w oldintena,INTENA(a6) ; restore old interrupts rts ********* ROUTINES *********************************** *** wait for vertical blank interrupt waitVBI: move.l d0,-(sp) ; save d0 on stack waitVBIloop: move.l $DFF004,d0 ; get VPOSR lsr.l #8,d0 ; shift 8 to left and.l #$1FF,d0 ; mask out the 9bits of vpos cmp.l #$138,d0 ; are we at VBI bne waitVBIloop ; no -> wait move.l (sp)+,d0 ; restore previous d0 from stack rts *** wait for a raster position waitraster: ; expects line to wait for in d1.w move.l d0,-(sp) ; save the chnaged variables to the stack waitrasterloop: move.l $DFF004,d0 ; get VPOSR lsr.l #8,d0 ; shift 8 to left and.l #$1FF,d0 ; mask out the 9bits of vpos cmp.l d1,d0 ; are we at the wanted line bne waitrasterloop ; no -> wait move.l (sp)+,d0 ; restore d0 rts ********* DATA in FAST MEM ************************ gfxname: dc.b 'graphics.library',0 even gfxbase: ds.l 1 oldcopper: ds.l 1 olddma: ds.w 1 oldintena: ds.w 1 ; this is for a register -> 16 bit oldirq3: ds.l 1 ; this is for an adress -> 32bit