241 lines
4.5 KiB
ArmAsm
241 lines
4.5 KiB
ArmAsm
XDEF _TakeOverSystem
|
|
XDEF _GiveBackSystem
|
|
XDEF _InitializeCopperlist
|
|
XDEF _SetUpDisplay
|
|
XDEF _AddDisplayToCopperlist
|
|
XDEF _AddColorsToCopperlist
|
|
XDEF _EndCopperlist
|
|
|
|
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 numm 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
|
|
|
|
; low
|
|
SWAP D3
|
|
MOVE.W D1,(A0)+
|
|
MOVE.W D3,(A0)+
|
|
; high
|
|
SWAP D3
|
|
ADDQ #2,D1
|
|
MOVE.W D1,(A0)+
|
|
MOVE.W D3,(A0)+
|
|
DBRA D0,.continue
|
|
MOVE.L A0,D0
|
|
MOVEM.L (SP)+,A2/D2/D3
|
|
|
|
RTS
|
|
|
|
; @stack *copperlist
|
|
; @stack *colors
|
|
; @stach 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
|
|
|
|
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
|