chrisly42
9c48c11cd1
- Bugfix: WaitForFrame was completely broken. Now also caters for race-condition that would have waited one extra frame. - Bugfix: InitPart would overwrite innocent memory (reported by Gigabates and Losso) - Bugfix: Palette LERP had wrong bias. - Removed extra paths in include statement, use default include paths instead - Added Raspberry Casket no-jitter background calc mode (FW_MUSIC_PLAYER_CHOICE = 6) - Updated Raspberry Casket to V2.0 presto branch (WIP) - Removed fw_FrameCounterLong, use fw_FrameCounter-2 for debug purposes - Support for blue noise palette LERPing (like in Is Real). Provide your own blue noise table (4 KB), stuff it into fw_BlueNoiseTablePtr, set FW_PALETTE_LERP_SUPPORT to 2 - Music tick routine is now replaceable during runtime (fw_MusicTickRoutine) - Support for softints and audio interrupts - LMB exit can also be disabled dynamically when using FW_LMB_EXIT_SUPPORT = 2 and fw_DisableLMBExit != 0 - Added LSP Micro support and LSP Nano (custom format that uses note pitches instead of periods) - Minor other things
214 lines
6.5 KiB
OpenEdge ABL
214 lines
6.5 KiB
OpenEdge ABL
IFND FRAMEWORK_MACROS_I
|
|
FRAMEWORK_MACROS_I SET 1
|
|
|
|
IFD FW_DEMO_PART
|
|
CALLFW MACRO
|
|
jsr _LVOFrameWork\1(a6)
|
|
ENDM
|
|
ELSE
|
|
CALLFW MACRO
|
|
bsr fw_\1
|
|
ENDM
|
|
ENDC
|
|
|
|
DEFFWFUNC MACRO
|
|
IF FWGENLVOTABLE
|
|
dc.w fw_\1-*
|
|
ELSE
|
|
FWLVOPOS SET FWLVOPOS-6
|
|
IFND _LVOFrameWork\1
|
|
_LVOFrameWork\1 = FWLVOPOS
|
|
ENDC
|
|
ENDC
|
|
ENDM
|
|
|
|
DISABLE_INTS MACRO
|
|
; do this twice so to be sure that it has propagated to IPL and we really don't get an interrupt
|
|
move.w #INTF_INTEN,intena(a5)
|
|
move.w #INTF_INTEN,intena(a5)
|
|
ENDM
|
|
|
|
ENABLE_INTS MACRO
|
|
move.w #INTF_SETCLR|INTF_INTEN,intena(a5)
|
|
ENDM
|
|
|
|
;Blitter logic macros
|
|
;& (bitwise and)
|
|
;^ (bitwise exclusive-or)
|
|
;| (bitwise inclusive-or)
|
|
;~ (bitwise not)
|
|
; idle cycles for normal operation (not line or fill!)
|
|
BLTEN_A = $0800 ; 1 idle cycle
|
|
BLTEN_B = $0400 ; 2 idle cycles
|
|
BLTEN_C = $0200 ; 1 idle cycle
|
|
BLTEN_D = $0100 ; 1 idle cycle
|
|
BLTEN_AD = (BLTEN_A|BLTEN_D) ; NO idle cycle
|
|
BLTEN_BD = (BLTEN_B|BLTEN_D) ; 1 idle cycle
|
|
BLTEN_CD = (BLTEN_C|BLTEN_D) ; 1 idle cycle
|
|
BLTEN_ABD = (BLTEN_A|BLTEN_B|BLTEN_D) ; NO idle cycle
|
|
BLTEN_ACD = (BLTEN_A|BLTEN_C|BLTEN_D) ; NO idle cycle
|
|
BLTEN_BCD = (BLTEN_B|BLTEN_C|BLTEN_D) ; 1 idle cycle
|
|
BLTEN_ABCD = (BLTEN_A|BLTEN_B|BLTEN_C|BLTEN_D) ; NO idle cycle
|
|
BLTEN_AB = (BLTEN_A|BLTEN_B) ; 1 idle cycle
|
|
BLTEN_AC = (BLTEN_A|BLTEN_C) ; NO idle cycle
|
|
BLTEN_BC = (BLTEN_B|BLTEN_C) ; 1 idle cycle
|
|
BLTEN_ABC = (BLTEN_A|BLTEN_B|BLTEN_C) ; NO idle cycle
|
|
|
|
BLT_A = %11110000
|
|
BLT_B = %11001100
|
|
BLT_C = %10101010
|
|
|
|
BLTHOGON MACRO
|
|
move.w #DMAF_SETCLR|DMAF_BLITHOG,dmacon(a5)
|
|
ENDM
|
|
BLTHOGOFF MACRO
|
|
move.w #DMAF_BLITHOG,dmacon(a5)
|
|
ENDM
|
|
|
|
BLTWAIT MACRO
|
|
.bw\@
|
|
btst #DMAB_BLTDONE-8,dmaconr(a5)
|
|
bne.s .bw\@
|
|
ENDM
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
; channels, minterm, shift a, shift b, (optional: target)
|
|
BLTCON_SET MACRO
|
|
; write both bltcon0/bltcon1
|
|
IFNC '\5',''
|
|
move.l #(((BLTEN_\1+((\2)&$ff))|(\3<<12))<<16)|(\4<<12),\5
|
|
ELSE
|
|
move.l #(((BLTEN_\1+((\2)&$ff))|(\3<<12))<<16)|(\4<<12),bltcon0(a5)
|
|
ENDC
|
|
ENDM
|
|
|
|
; channels, minterm, shift a, (optional: target)
|
|
BLTCON0_SET MACRO
|
|
; write only bltcon0
|
|
IFNC '\4',''
|
|
move.w #((BLTEN_\1+((\2)&$ff))|(\3<<12)),\4
|
|
ELSE
|
|
move.w #((BLTEN_\1+((\2)&$ff))|(\3<<12)),bltcon0(a5)
|
|
ENDC
|
|
ENDM
|
|
|
|
; channels, minterm, shift a, shift b, bltcon1 flags, (optional: target)
|
|
BLTCON_SET_X MACRO
|
|
; write both bltcon0/bltcon1
|
|
IFNC '\6',''
|
|
move.l #(((BLTEN_\1+((\2)&$ff))|(\3<<12))<<16)|(\4<<12)|(\5),\6
|
|
ELSE
|
|
move.l #(((BLTEN_\1+((\2)&$ff))|(\3<<12))<<16)|(\4<<12)|(\5),bltcon0(a5)
|
|
ENDC
|
|
ENDM
|
|
|
|
; issue blitter wait to copper list (in a0)
|
|
COPBLITWAIT MACRO
|
|
move.l #COP_WAITBLIT_DATA,(a0)+
|
|
move.l #COP_WAITBLIT_DATA,(a0)+ ; avoid OCS hardware bug
|
|
ENDM
|
|
|
|
; issue immediate write of register to copper list (in a0)
|
|
COPIMOVE MACRO
|
|
move.l #((\2)<<16)|((\1)&$ffff),(a0)+
|
|
ENDM
|
|
|
|
; issue register (or ea) write of register to copper list (in a0)
|
|
COPRMOVE MACRO
|
|
move.w #\2,(a0)+
|
|
move.w \1,(a0)+
|
|
ENDM
|
|
|
|
; write 32 bit pointer to register pair to copper list (in a0) using temp data register
|
|
COPPTMOVE MACRO
|
|
move.l \1,\3
|
|
swap \3
|
|
move.w #\2,(a0)+
|
|
move.w \3,(a0)+
|
|
move.w #(\2)+2,(a0)+
|
|
move.w \1,(a0)+
|
|
ENDM
|
|
|
|
; reuse temp register of COPPTMOVE to write the same pointer to more register pairs
|
|
COPPTMOVEMORE MACRO
|
|
move.w #\2,(a0)+
|
|
move.w \3,(a0)+
|
|
move.w #(\2)+2,(a0)+
|
|
move.w \1,(a0)+
|
|
ENDM
|
|
|
|
; write 32 bit pointer in data register to register pair to copper list (in a0)
|
|
COPDPTMOVE MACRO
|
|
swap \1
|
|
move.w #\2,(a0)+
|
|
move.w \1,(a0)+
|
|
swap \1
|
|
move.w #(\2)+2,(a0)+
|
|
move.w \1,(a0)+
|
|
ENDM
|
|
|
|
IF FW_BLITTERQUEUE_SUPPORT
|
|
; shortcut macro for AddToBlitterQueue (queue must NOT be empty!)
|
|
; first parameter: node
|
|
; second parameter: scratch address register
|
|
ADD_TO_BLITTER_QUEUE MACRO
|
|
move.l fw_BlitterQueueWritePtr(a6),\2
|
|
move.l \1,(\2)
|
|
move.l \1,fw_BlitterQueueWritePtr(a6)
|
|
ENDM
|
|
|
|
; the following macros are for a series of blits,
|
|
; shortcut macro for AddToBlitterQueue (queue must NOT be empty!)
|
|
; parameter: register that is used for storing the previous node pointer
|
|
PREP_ADD_TO_BLITTER_QUEUE MACRO
|
|
move.l fw_BlitterQueueWritePtr(a6),\1
|
|
ENDM
|
|
|
|
; shortcut macro for AddToBlitterQueue (queue MUST be empty!), replaces PREP_ADD_TO_BLITTER_QUEUE
|
|
; first parameter: node
|
|
; second parameter: register that is used for storing the previous node pointer
|
|
FIRST_ADD_TO_BLITTER_QUEUE MACRO
|
|
move.l \1,\2
|
|
ENDM
|
|
|
|
; shortcut macro for AddToBlitterQueue (queue must NOT be empty!)
|
|
; first parameter: node
|
|
; second parameter: register that is used for storing the previous node pointer
|
|
FAST_ADD_TO_BLITTER_QUEUE MACRO
|
|
move.l \1,(\2)
|
|
move.l \1,\2
|
|
ENDM
|
|
|
|
; shortcut macro for AddToBlitterQueue (queue MAY be empty!)
|
|
; first parameter: node
|
|
; second parameter: register that is used for storing the previous node pointer
|
|
SAFE_ADD_TO_BLITTER_QUEUE MACRO
|
|
tst.l fw_BlitterQueueWritePtr(a6)
|
|
beq.s .isfirst\@
|
|
move.l fw_BlitterQueueWritePtr(a6),\2
|
|
move.l \1,(\2)
|
|
.isfirst\@
|
|
move.l \1,\2
|
|
ENDM
|
|
|
|
; shortcut macro for AddToBlitterQueue (queue must NOT be empty!)
|
|
; first parameter: node
|
|
; second parameter: register that is used for storing the previous node pointer
|
|
LAST_ADD_TO_BLITTER_QUEUE MACRO
|
|
move.l \1,(\2)
|
|
move.l \1,fw_BlitterQueueWritePtr(a6)
|
|
ENDM
|
|
|
|
; shortcut macro for AddToBlitterQueue
|
|
; parameter: register that is used for storing the previous node pointer
|
|
TERM_ADD_TO_BLITTER_QUEUE MACRO
|
|
move.l \1,fw_BlitterQueueWritePtr(a6)
|
|
ENDM
|
|
|
|
TERMINATE_BLITTER_QUEUE MACRO
|
|
clr.l fw_BlitterQueueWritePtr(a6)
|
|
ENDM
|
|
ENDC
|
|
|
|
ENDC ; FRAMEWORK_MACROS_I |