cool-bun-demo/system/system.s

278 lines
5.0 KiB
ArmAsm

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 bitplaneCount
_setUpDisplay:
MOVE.L D2,-(SP)
MOVE.L 4(A7),D2
LEA _custom,A1
MOVEQ #0,D0
MOVE.W #BPLCON0_COLOR,D0
MOVEQ #0,D1
MOVE.W D2,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)
MOVE.L (SP)+,D2
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