XDEF _takeOverSystem XDEF _giveBackSystem XDEF _initializeCopperlist XDEF _setUpDisplay XDEF _addDisplayToCopperlist XDEF _addColorsToCopperlist XDEF _endCopperlist XDEF _myWaitBlit XDEF _WaitBOF XREF _custom FUNC_CNT SET -30 FUNCDEF MACRO _LVO\1 EQU FUNC_CNT FUNC_CNT SET FUNC_CNT-6 ENDM INCDIR "include_i_39:" INCDIR "extra_lvos_39:" INCLUDE "exec/exec_lib.i" INCLUDE "exec/types.i" INCLUDE "exec/libraries.i" # get the CALLLIB macro INCLUDE "graphics/gfxbase.i" INCLUDE "graphics_lvo.i" INCLUDE "hardware/custom.i" INCLUDE "hardware/dmabits.i" ; @param 1 Pointer to null terminated name of library ; @param 2 Minimum version of library, 0 for any ; @outreg D0 pointer to library in memory OpenLibrary MACRO MOVE.L 4,A6 MOVEM.L A1,-(SP) MOVE.L \1,A1 MOVE.L \2,D0 CALLLIB _LVOOpenLibrary MOVEM.L (SP)+,A1 ENDM PreserveRegister MACRO MOVE.L D0,-(SP) LEA _custom,A0 MOVE.W \1r(A0),D0 OR.W #$8000,D0 MOVE.W D0,Old\1 MOVE.L (SP)+,D0 ENDM RestoreRegister MACRO MOVE.W #$7FFF,\1(A0) MOVE.W Old\1,\1(A0) ENDM STRUCTURE ScreenSetup,0 UWORD ScreenSetup_width UWORD ScreenSetup_height UWORD ScreenSetup_bitplanes ULONG ScreenSetup_memoryStart LABEL ScreenSetup_SIZEOF BPLCON0_COLOR EQU $200 _takeOverSystem: MOVE.L A6,-(SP) OpenLibrary #GraphicsLibrary,#0 MOVE.L D0,GraphicsBase MOVE.L D0,A6 MOVE.L gb_ActiView(A6),OldView MOVE.L gb_copinit(A6),OldCopper LEA _custom,A0 PreserveRegister dmacon PreserveRegister intena PreserveRegister intreq PreserveRegister adkcon ; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0036.html MOVE.W #$C000,intena(A0) ; enable master interrupt MOVE.W #$3FFF,intena(A0) ; disable every other interrupt MOVE.W #DMAF_SETCLR|DMAF_COPPER|DMAF_RASTER|DMAF_BLITTER,dmacon(A0) MOVE.W #DMAF_AUDIO|DMAF_DISK|DMAF_SPRITE,dmacon(A0) MOVE.L #0,A1 CALLLIB _LVOLoadView CALLLIB _LVOWaitTOF CALLLIB _LVOWaitTOF CALLLIB _LVOOwnBlitter CALLLIB _LVOWaitBlit MOVE.L $4,A6 CALLLIB _LVOForbid MOVE.L (SP)+,A6 RTS _giveBackSystem: MOVE.L A6,-(SP) LEA _custom,A0 RestoreRegister dmacon RestoreRegister intena RestoreRegister intreq RestoreRegister adkcon MOVE.L OldCopper,cop1lc(A0) MOVE.L GraphicsBase,A6 MOVE.L OldView,A1 CALLLIB _LVOLoadView CALLLIB _LVOWaitTOF CALLLIB _LVOWaitTOF CALLLIB _LVOWaitBlit CALLLIB _LVODisownBlitter MOVE.L $4,A6 CALLLIB _LVOPermit MOVE.L (SP)+,A6 RTS ; @stack *copperlist Pointer to copperlist _initializeCopperlist: MOVE.L 4(A7),A0 MOVE.L #$FFFFFFFE,(A0) RTS ; @stack *copperlist Pointer to copperlist ; @stack ScreenSetup Pointer to screensetup struct _addDisplayToCopperlist: MOVE.L 4(A7),A0 ; copperlist MOVE.L 8(A7),A1 ; struct ; A2,D2,D3 MOVEM.L A2/D2/D3,-(SP) MOVE.W ScreenSetup_bitplanes(A1),D0 MOVE.L ScreenSetup_memoryStart(A1),A2 ; get bitplane offset MOVEQ #0,D2 MOVE.W ScreenSetup_width(A1),D2 ROR.W #3,D2 MULU ScreenSetup_height(A1),D2 SUBQ #1,D0 .continue: ; set up bplpt MOVEQ #0,D1 MOVE.L D0,D1 ROL.L #2,D1 ADD.W #bplpt,D1 ; set up bitplane pointer MOVE.L D0,D3 MULU D2,D3 ADD.L A2,D3 ; high byte SWAP D3 MOVE.W D1,(A0)+ MOVE.W D3,(A0)+ ; low byte SWAP D3 ADDQ #2,D1 MOVE.W D1,(A0)+ MOVE.W D3,(A0)+ DBRA D0,.continue ; current copperlist position MOVE.L A0,D0 MOVEM.L (SP)+,A2/D2/D3 RTS ; @stack *copperlist ; @stack *colors ; @stack count _addColorsToCopperlist: MOVE.L 4(A7),A0 ; copperlist MOVE.L 8(A7),A1 ; colors MOVE.L 12(A7),D0 ; count MOVEM.L A2/D2,-(SP) LEA _custom,A2 MOVE.L #color,D2 ADD.L D2,A2 SUBQ #1,D0 .continue: MOVE.W (A1)+,(A2)+ DBRA D0,.continue MOVE.L A2,D0 MOVEM.L (SP)+,A2/D2 RTS ; @stack *copperlist _endCopperlist: MOVE.L 4(A7),A0 MOVE.W #$ffff,(A0)+ MOVE.W #$fffe,(A0)+ MOVE.L A0,D0 RTS ; @stack *ScreenSetup _setUpDisplay: MOVE.L 4(A7),A0 LEA _custom,A1 MOVEQ #0,D0 MOVE.W #BPLCON0_COLOR,D0 MOVEQ #0,D1 MOVE.W ScreenSetup_bitplanes(A0),D1 AND.W #$7,D1 ROL.W #8,D1 ROL.W #4,D1 ADD.W D1,D0 MOVE.W D0,bplcon0(A1) MOVE.W #0,bplcon1(A1) MOVE.W #0,bpl1mod(A1) MOVE.W #$2c21,diwstrt(A1) MOVE.W #$2cc1,diwstop(A1) MOVE.W #$0038,ddfstrt(A1) MOVE.W #$00d0,ddfstop(A1) RTS _myWaitBlit: LEA _custom,A0 BTST.B #DMAB_BLTDONE-8,dmaconr(A0) BTST.B #DMAB_BLTDONE-8,dmaconr(A0) BEQ .done .loop: BTST.B #DMAB_BLTDONE-8,dmaconr(A0) BNE .loop .done: RTS _WaitBOF: MOVE.W 6(A7),D1 ROL.W #8,D1 MOVE.L $dff004,D0 AND.L #$1ff00,D0 CMP.L D1,D0 BNE.B _WaitBOF .loop2: MOVE.L $dff004,D0 AND.L #$1ff00,D0 CMP.L D1,D0 BEQ.B .loop2 RTS CNOP 0,4 OldView dc.l 0 OldCopper dc.l 0 GraphicsBase dc.l 0 Olddmacon dc.w 0 Oldintena dc.w 0 Oldintreq dc.w 0 Oldadkcon dc.w 0 CNOP 0,4 GraphicsLibrary GRAPHICSNAME