Commit cd1be707 authored by Robert Sprowson's avatar Robert Sprowson
Browse files

Add support for wide translation tables for window tool furniture

With the introduction of 16bpp/32bpp modes it became possible to request tables from ColourTrans which used > 1 byte per colour, but the Wimp wasn't using this extension. Therefore tool sprites designed in 8bpp or less would be quantised horribly when plotted in a 16bpp or 32bpp mode.
The Wimp now requests and plots with a wide table, and to avoid thrashing ColourTrans so much with the prevalence of individually paletted icon sprites, keeps the table seperately to the icon sprites ones. At worst (in 32bpp) this uses an extra 256x4 bytes of RAM.
Trace.s: Split out the tracing routines from Wimp10 as it was getting a bit big.
Tiling.s: Namespace change for the icons versus tools distinction. Removed some unnecessary PC+8/PC+12 confused NOPs.
Tiling3D.s: Namespace change for the icons versus tools distinction.
Wimp01.s: New set of variables to track the tool translation tables separately. Various jiggling to keep ADRs in range.
Wimp02.s: Namespace change. Remove some double handling in Wimp_SetColourMapping.
Wimp04.s: Namespace change. Made factor rationalisation common to both the icon and tool grinding code. Removed dual use of cachespritedata for both icons and tools. The tintfunc moves to Wimp10. Service_InvalidateCache confusion resolved by adding a new flag to remember that the tools need regenerating rather than just marking the tool list as missing (which subsequently got restored in Tool_SpriteOp without actually doing any palette work.
Wimp10.s: Label tools_area renamed as it was immensely confusing to have that (which was actually holding the RMA allocation of the tool_list) and tool_area (which contains the sprite area) hanging around. Changed references to use tools-only cachetolspritedata routine. Added 'wide' flags to sprite op and colour trans calls. Tool_SpriteOp changed to actually regenerate the colour tables when they're known invalid (previously the tools list pointer was merely restored and no colour tables used). Trace functions extracted. Resolved confusion as to what recache_tools_trans and recache_tools_trans2 should be doing.

Tested with 4bpp "NewLook" sprites in 4bpp/8bpp/16bpp/32bpp and 8bpp smooth greyscaled "Steel" tool sprites in same modes.
Also ran a task window doing repeated Service_InvalidateCache calls while monitoring the RMA for leaks.
Generally navigated around some directories to ensure that inverse icons (during double click) and filer windows (with individually paletted sprites) were being rendered.

Version 5.20. Tagged as 'Wimp-5_20'
......@@ -11,13 +11,13 @@
GBLS Module_HelpVersion
GBLS Module_ComponentName
GBLS Module_ComponentPath
Module_MajorVersion SETS "5.19"
Module_Version SETA 519
Module_MajorVersion SETS "5.20"
Module_Version SETA 520
Module_MinorVersion SETS ""
Module_Date SETS "09 Oct 2012"
Module_ApplicationDate SETS "09-Oct-12"
Module_Date SETS "28 Mar 2013"
Module_ApplicationDate SETS "28-Mar-13"
Module_ComponentName SETS "Wimp"
Module_ComponentPath SETS "castle/RiscOS/Sources/Desktop/Wimp"
Module_FullVersion SETS "5.19"
Module_HelpVersion SETS "5.19 (09 Oct 2012)"
Module_FullVersion SETS "5.20"
Module_HelpVersion SETS "5.20 (28 Mar 2013)"
END
/* (5.19)
/* (5.20)
*
* This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.1.
*
*/
#define Module_MajorVersion_CMHG 5.19
#define Module_MajorVersion_CMHG 5.20
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 09 Oct 2012
#define Module_Date_CMHG 28 Mar 2013
#define Module_MajorVersion "5.19"
#define Module_Version 519
#define Module_MajorVersion "5.20"
#define Module_Version 520
#define Module_MinorVersion ""
#define Module_Date "09 Oct 2012"
#define Module_Date "28 Mar 2013"
#define Module_ApplicationDate "09-Oct-12"
#define Module_ApplicationDate "28-Mar-13"
#define Module_ComponentName "Wimp"
#define Module_ComponentPath "castle/RiscOS/Sources/Desktop/Wimp"
#define Module_FullVersion "5.19"
#define Module_HelpVersion "5.19 (09 Oct 2012)"
#define Module_LibraryVersionInfo "5:19"
#define Module_FullVersion "5.20"
#define Module_HelpVersion "5.20 (28 Mar 2013)"
#define Module_LibraryVersionInfo "5:20"
......@@ -48,8 +48,6 @@ plotspritebackground
wsaddr R4,clipx0
MOV R14,PC
MOV PC,R1
NOP
NOP
Pull "R0-R5,PC"
2
TEQ R0,#1 ; colour 1
......@@ -85,9 +83,9 @@ plotspritebackground
LDR R0,sprite_log2py
STR R0,tile_log2py
LDR R14,needsfactors
LDRB R14,sprite_needsfactors
TEQ R14,#0
ADRNE R14,factors
ADRNE R14,sprite_factors
Push R3
......@@ -97,7 +95,7 @@ plotspritebackground
STMIA R14,{R0-R3}
Pull R3
LDR R1,needsfactors ; needs preserving
LDRB R1,sprite_needsfactors ; needs preserving
Push R1
B %FT6
......@@ -129,15 +127,16 @@ plotspritebackground
MOV R0,#0
STR R0,lengthflags ; spritename is a pointer
LDR R0,tile_pixtable
LDR R1,needsfactors ; needs preserving
LDRB R1,sprite_needsfactors ; needs preserving
Push R1
STR R0,tile_temptab
LDR R0,tile_sc_block
STR R0,needsfactors
TEQ R0, #0
MOVNE R0, #-1
STRB R0,sprite_needsfactors
LDR R0,tile_pixtable
STR R0,tile_temptab
LDR R3,tile_width
LDR R4,tile_height
......@@ -210,7 +209,7 @@ err2
Pull "x0-y1"
Pull R0
STR R0,needsfactors
STRB R0,sprite_needsfactors
ADRL R14,tile_log2px ; restore global tile info
Pull "R0-R3"
......@@ -274,7 +273,7 @@ findwimptilesprite Entry "R0-R1"
STR R3,tile_width
STR R4,tile_height
LDR R1,needsfactors
LDRB R1,sprite_needsfactors
Push "R2-R3"
LDR R2,tile_pixtable
......@@ -284,7 +283,7 @@ findwimptilesprite Entry "R0-R1"
TEQ R1,#0
ADRNE R14,factors
ADRNE R14,sprite_factors
LDMNEIA R14,{R0-R3}
MOVEQ R0,#0
......@@ -347,7 +346,7 @@ findwimpspritefordepth
tile_putsprite
Push "R1-R7,LR"
;
LDR R0,needsfactors
LDRB R0,sprite_needsfactors
TEQ R0,#0 ; do I need to translate
;
MOVNE R0,#SpriteReason_PutSpriteScaled
......
......@@ -345,12 +345,12 @@ get_tile_sprite_info
mov r4,r4,LSL r0
str r4,[r8,#TileInfo_Height]
ldr r0,needsfactors
ldrb r0,sprite_needsfactors
teq r0,#0
moveq r0,#-1 ; if the scale factors are not needed then the first one is -1
adrne r14,factors
adrne r14,sprite_factors
ldmneia r14,{r0-r3}
add r14,r8,#TileInfo_ScaleFactors
......
; Copyright 2013 Castle Technology Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; > Trace
; Some extra tracing routines by Jonathan. All preserve all registers and
; all flags
; HostFS_WriteC * &40102
;---------------------------------------------------------------------------
trace_char ROUT
; R0 = character to trace
EntryS "R0, R1, R2"
CMP R0, #32
BLT |trace_char: nonprintable character|
CMP R0, #127
BGE |trace_char: nonprintable character|
|trace_char: printable character|
;write character
SWI HostFS_WriteC
;if it's a backslash, write it again
CMP R0, #"\\"
SWIEQ HostFS_WriteC
B |trace_char: exit|
|trace_char: nonprintable character|
CMP R0, #:CHR: 10
BNE |trace_char: control character|
|trace_char: linefeed|
SWI HostFS_WriteC
MOV R0, #:CHR: 13
SWI HostFS_WriteC
B |trace_char: exit|
|trace_char: control character|
;save the character
MOV R1, R0
ADR R2, |trace_char: digits|
; R1 = character to trace
; R2 -> representation table
MOV R0, #"\\"
SWI HostFS_WriteC
MOV R0, #"x"
SWI HostFS_WriteC
;trace top nybble
MOV R0, R1, LSR #4
LDRB R0, [R2, R0]
SWI HostFS_WriteC
;trace bottom nybble
AND R0, R1, #&F
LDRB R0, [R2, R0]
SWI HostFS_WriteC
|trace_char: exit|
EXITS
|trace_char: digits|
= "0123456789ABCDEF"
ALIGN
;---------------------------------------------------------------------------
trace_string ROUT
; R0 -> string to trace
EntryS "R0, R1"
MOV R1, R0
; R1 -> string to trace
B |trace_string: end loop|
|trace_string: start loop|
BL trace_char
ADD R1, R1, #1
|trace_string: end loop|
LDRB R0, [R1]
CMP R0, #:CHR: 0
BNE |trace_string: start loop|
EXITS
;---------------------------------------------------------------------------
trace_decimal ROUT
; R0 = integer to trace
EntryS "R0, R1, R2"
SUB SP, SP, #16
MOV R1, SP
MOV R2, #15
SWI OS_ConvertInteger4
;trace it
BL trace_string
ADD SP, SP, #16
EXIT
;---------------------------------------------------------------------------
trace_hex ROUT
; R0 = integer to trace
Push "R0, R1, R2, LR"
SUB SP, SP, #16
MOV R1, SP
MOV R2, #15
SWI OS_ConvertHex8
;trace it
BL trace_string
ADD SP, SP, #16
Pull "R0, R1, R2, PC",, ^
;---------------------------------------------------------------------------
trace_nl ROUT
EntryS "R0"
MOV R0, #:CHR: 10
BL trace_char
EXITS
END
......@@ -106,5 +106,8 @@ LoadWimpOptions SETS "GET Options.s.$Options"
GET Wimp10.s
GET NewSWIs.s
GET AutoScroll.s
[ debug
GET Trace.s
]
END
......@@ -850,6 +850,7 @@ plotsprCB # 4 ; backdrop tiling CB
; these have moved!
RAM_SWIEntry # 12 ; 3 instructions for getting R12 back
OScopy_ChangeDynamic # 4 ; this must follow immediately
longjumpSP # 4 ; for cutting out the middle-man
ROMstart # 4 ; ROM base address
ROMend # 4 ; ROM end address (inclusive)
......@@ -949,7 +950,10 @@ gcolaction # 1 ; used by Wimp_SetColour
sysflags # 1 ; actions on moving windows (drag?)
memoryOK # 1 ; flag for ChangeDynamicArea
modechanged # 1 ; flag set on mode change
preservett # 1 ; used to hang onto translation tables
sprite_needsfactors # 1 ; otherwise 1:1 scaling for this mode
tsprite_needsfactors # 1 ; otherwise 1:1 scaling for this mode
tsprite_needsregen # 1 ; need to recalculate the tool sprite pixtrans
selecttable_crit # 1 ; ignore invalidate cache service calls if we're the cause
[ ChildWindows
openspending # 1 ; whether we're in the middle of a set of opens
]
......@@ -1059,7 +1063,6 @@ sender # 4
myref # 4
maxmenus * 8
longjumpSP # 4 ; for cutting out the middle-man
whichmenu # 4
menus_temporary # 4 ; if set, Wimp_Poll kills the menus
menuhandle # 4
......@@ -1234,34 +1237,41 @@ lastmode_x1 # 4 ; (xwindlimit+1) * px for previous mode
lastmode_y1 # 4 ; (ywindlimit+1) * py for previous mode
forceflags # 4 ; for putting windows back
lastmode # 4
ditheringflag # 4 ; flag to control dithering
sprite_lastmode # 4
sprite_log2bpp # 4 ; for mode-independent sprite plotting
sprite_log2px # 4
sprite_log2py # 4
needsfactors # 4
tsprite_lastmode # 4
tsprite_log2bpp # 4 ; for mode-independent toolsprite plotting
tsprite_log2px # 4
tsprite_log2py # 4
ALIGNHASH 16
factors # 16
ditheringflag # 4 ; flag to control dithering
sprite_factors # 16
tsprite_factors # 16
usephyspaltable # 4 ; use the physical palette table
physpaltable # 4*16 ; secondary palette table (disconnected from Wimp jobbie)
temppaltable # 4*16 ; temporary store for a palette
usephyspaltable # 4 ; use the physical palette table
transtable1 # 2 ; 1bpp mapping from wimp -> sprite pixels
transtable2 # 4 ; 2bpp ---------- "" ------------
transtable4 # 16 ; 4bpp ---------- "" ------------
ALIGNHASH 4
ALIGNHASH 16
selecttable_args # 4*6 ; parameters used for the last sprite select table call
pixtable_params # 4*6 ; parameters used for the select table call
pixtable_at # 4
pixtable_size # 4 ; size and position of pixtrans table currently setup
temppaltable # 4*16 ; temporary store for a palette
list_at # 4 ; head of sprite cache list
list_size # 4 ; size of buffer claimed
list_end # 4 ; end of list used for chop
tpixtable_at # 4
tpixtable_size # 4 ; size and position of tool pixtrans table currently setup
[ windowsprite :LAND: :LNOT: ThreeDPatch
tile_sc_block # 16
tile_log2px # 4
......@@ -1529,8 +1539,7 @@ errordynamic * errorbuffer+4 ; put these after stashed PC
errordynamicsize * ?errorbuffer-4
stackspace # 0 ; temporary stack for debugging!
tools_area # 4 ; area for tools list
tools_trans_size # 4 ; size of last tools_trans
tool_list_backup # 4 ; backup copy of tool_list
copyerror # 240 ; copy of error block
greys_mode # 1 ; last grey mode.
last_greys # 1 ; previous greys mode
......@@ -1594,6 +1603,8 @@ maxwork * :INDEX:@
! 0, "Free pool = R12+&" :CC: :STR: :INDEX: freepool
! 0, "#pixtable_at = R12+&" :CC: :STR: :INDEX: pixtable_at
! 0, "#pixtable_size = R12+&" :CC: :STR: :INDEX: pixtable_size
! 0, "#tpixtable_at = R12+&" :CC: :STR: :INDEX: tpixtable_at
! 0, "#tpixtable_size = R12+&" :CC: :STR: :INDEX: tpixtable_size
! 0, "#list_at = R12+&" :CC: :STR: :INDEX: list_at
! 0, "#list_size = R12+&" :CC: :STR: :INDEX: list_size
! 0, "#list_end = R12+&" :CC: :STR: :INDEX: list_end
......@@ -3654,9 +3665,15 @@ gotwork
MOV R0,#0
STR R0,automenu_inactivetimeout
;
STRB R0,selecttable_crit ; don't mind losing it on an invalidate cache service call
STRB R0,tsprite_needsregen ; doesn't because there isn't one
STR R0,pixtable_at ; no pixel translation table
STR R0,pixtable_size
STRB R0,preservett ; don't mind losing it on an invalidate cache service call
STR R0,tpixtable_at ; no tool pixel translation table
STR R0,tpixtable_size
STR R0,list_at
STR R0,list_size ; mark to indicate now list present
STR R0,filehandle
......@@ -3669,7 +3686,7 @@ gotwork
[ NewErrorSystem
STR R0,watchdogcodew
]
ADRL R14,tools_area
ADRL R14,tool_list_backup
STR R0,[R14]
; ADRL R14,wimpmodebefore
; STR R0,[R14]
......@@ -4306,20 +4323,20 @@ releasewrchvpremodechange
invalidatecache
Push "R0,R2,LR"
LDRB R2,preservett ; avoid discarding the table when we know
LDRB R2,selecttable_crit ; avoid discarding the table when we know
CMP R2,#0 ; that it is still valid
BNE %FT10
Pull "R0,R2,PC", NE
LDR R2,pixtable_at
CMP R2,#0 ; has a pixtable been setup?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; attempt to release - ignore errors
;
MOV R2,#0
STR R2,pixtable_at ; mark the pixtable as being zapped!
;
MOV R2,#-1 ; and the PixTrans mode
STR R2,lastmode
STR R2,sprite_lastmode
[ ThreeDPatch
; MB - must add invalidating of new tile pixel tables here
......@@ -4329,23 +4346,20 @@ invalidatecache
STR R2,tile_temptab
]
[ false
BL freetoollist ; Lose cached tool data
|
; tool translation table is invalid, try to recache
LDR R2,tool_area
CMP R2,#0
BEQ %FT99
LDR R2,tool_list
CMP R2,#0
BEQ %FT99
LDR R2,tpixtable_at
CMP R2,#0 ; has a tool pixtable been setup?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; attempt to release - ignore errors
MOV R2,#0
STR R2,tool_list ; force recache next time we need it
STR R2,tpixtable_at ; mark the tool pixtable as being zapped!
STR R2,tool_transtable
MOV R2,#-1 ; and the tool PixTrans mode
STR R2,tsprite_lastmode
STRB R2,tsprite_needsregen ; re-calcuate border based information
99
]
10
Pull "R0,R2,PC"
;
......@@ -4587,6 +4601,10 @@ deallocateptrs ROUT
LDR R2,pixtable_at
CMP R2,#0
BLNE XROS_Module ; release the pixtrans table (ignore errors)
;
LDR R2,tpixtable_at
CMP R2,#0
BLNE XROS_Module ; release the tools pixtrans table (ignore errors)
;
LDR R2,fileaddress
CMP R2,#0
......@@ -4594,6 +4612,8 @@ deallocateptrs ROUT
;
STR R1,pixtable_at
STR R1,pixtable_size
STR R1,tpixtable_at
STR R1,tpixtable_size
STR R1,filehandle
STR R1,fileaddress ; tag as free'd
;
......@@ -5384,7 +5404,7 @@ sysinfo_memclaim
B ExitWimp
sysinfo_transtables
LDR R0,pixtable_at
LDR R0,tpixtable_at
ADRL R2,tool_plotparams
LDR R1,[R2]
STMIA sp,{R1-R2}
......
......@@ -2965,7 +2965,7 @@ inittasks
STR R0,menutaskhandle
;
MOV R14,#-1 ; invalidate sprite translation stuff
STR R14,lastmode
STR R14,sprite_lastmode
;
; Braindead panic redraw indication.
;
......@@ -3320,10 +3320,12 @@ recalcpalette
;
BL readvduvars ; just in case
;
MOV R14,#-1 ; sprite stuff is now invalid (as is ColourTrans's cache)
STR R14,lastmode
SWI XColourTrans_InvalidateCache
;
[ false ; this stuff gets done in Service_InvalidateCache
MOV R14,#-1 ; sprite stuff is now invalid (as is ColourTrans's cache)
STR R14,sprite_lastmode
LDR R2,pixtable_at
TEQ R2,#0 ; pixtable currently claimed?
MOVNE R0,#ModHandReason_Free
......@@ -3331,6 +3333,7 @@ recalcpalette
;
MOV R2,#0
STR R2,pixtable_at ; mark block as released
]
;
; first set up border & mouse colours
;
......@@ -8855,7 +8858,7 @@ forcetint_on EntryS "R0,R2"
TEQ R0, #0
TEQNE R0, R14
STRNEB R0, tinted_tool
BLNE recache_tools_trans2 ; uses R2 as set up above (-> first sprite)
BLNE recache_tools_trans ; uses R2 as set up above (-> first sprite)
EXITS ; must preserve flags
;
......@@ -8871,7 +8874,7 @@ forcetint_off EntryS "R2"
TEQ R14, #0
MOVNE R14, #0
STRNEB R14, tinted_tool
BLNE recache_tools_trans2 ; uses R2 as set up above (-> first sprite)
BLNE recache_tools_trans ; uses R2 as set up above (-> first sprite)
EXITS ; must preserve flags
]
......
......@@ -2080,7 +2080,7 @@ icontext_paint
LDR R0,tool_list ; 320nk
TEQ R0,#0
BLEQ recache_tools_trans ; make sure there's something there
BLEQ restore_tool_list ; make sure there's something there
; just in case we're in the middle of
; plotting a title bar, for instance.
......@@ -2576,7 +2576,7 @@ iconformatted_width_ok
LDR R0,tool_list ; 320nk
TEQ R0,#0
BLEQ recache_tools_trans ; make sure there's something there
BLEQ restore_tool_list ; make sure there's something there
; just in case we're in the middle of
; plotting a title bar, for instance.
iconformatted_fancy_next
......@@ -3222,7 +3222,7 @@ SWIWimp_ReadPixTrans
BVS ExitWimp
;
CMP R6,#0
ADRNE R14,factors
ADRNE R14,sprite_factors
LDMNEIA R14,{R1-R4}
STMNEIA R6,{R1-R4} ; copy factors out
;
......@@ -3234,6 +3234,46 @@ SWIWimp_ReadPixTrans
;
B ExitWimp
;;----------------------------------------------------------------------------
;; Rationalise sprite scaling factors
;; Entry: R0,R1 sprite's eigx/eigy
;; R5,R6 mode's eigx/eigy
;; R2 --> where to store the factors
;; Exit: R0,R1,R5,R6 corrupted
;; [R2] factors stored (xmul,ymul,xdiv,ydiv)
;;----------------------------------------------------------------------------
rationalisefactors
Entry
MOV R14,#1
; all factors are ?:1 or 1:? so make R0:R5, R1:R6
; into this form
CMP R0,R5
MOVEQ R0,#1
MOVEQ R5,#1
MOVLT R5,R14,LSL R5
MOVLT R5,R5, LSR R0
MOVLT R0,#1
MOVGT R0,R14,LSL R0
MOVGT R0,R0, LSR R5
MOVGT R5,#1
CMP R1,R6
MOVEQ R1,#1
MOVEQ R6,#1
MOVLT R6,R14,LSL R6
MOVLT R6,R6, LSR R1
MOVLT R1,#1
MOVGT R1,R14,LSL R1
MOVGT R1,R1, LSR R6
MOVGT R6,#1
STMIA R2,{R0-R1,R5-R6} ; store the scaling block
EXIT
;;----------------------------------------------------------------------------
;; Mode-independent sprite code
......@@ -3244,13 +3284,11 @@ SWIWimp_ReadPixTrans
;; mode data set up if different input mode from last time
;;----------------------------------------------------------------------------
ASSERT ?pixtable_params =4*6
cachespritedata
Entry "R1-R2,R5-R7"
MOV R2,#1
STRB R2,preservett ; entering critical period for pixtable
STRB R2,selecttable_crit ; entering critical period for pixtable
LDR R2,lengthflags
CMP R2,#0 ; absolute pointer?
......@@ -3258,7 +3296,7 @@ cachespritedata
BLNE cachespriteaddress
MOVVC R0,#&200+SpriteReason_ReadSpriteSize
SWIVC XOS_SpriteOp ; read information about the sprite
EXIT VS
BVS %FT92
;
; R2 -> sprite in area
;
......@@ -3271,27 +3309,16 @@ cachespritedata
CMP R14,#0 ; is a pixtable defined?
BEQ %FT10
[ TrueIcon3
LDRB R14, tinted_tool
TEQ R14, #0 ; if it's tinted, we must recalculate the table
BNE %FT10
]
TEQ R7,#spPalette ; does it have a palette?
LDREQ R14,lastmode
LDREQ R14,sprite_lastmode
TEQEQ R6,R14 ; no, so have we already cached this information?
EXIT EQ
BEQ %FT92
10 MOV R0,R6 ; R0 = mode of sprite
TEQ R7,#spPalette
MOVNE R6,#-1 ; if it has a palette then corrupt last mode
[ TrueIcon3
LDRB R14, tinted_tool
TEQ R14, #0 ; if we're generating a tinted table, corrupt last mode too
MOVNE R6, #-1
]
STR R6,lastmode
STR R6,sprite_lastmode
Push "R2,R3-R4" ; R2 -> sprite, R3,R4 = height / width
......@@ -3307,15 +3334,11 @@ cachespritedata
SWIVC XOS_ReadModeVariable
STRVC R2,sprite_log2py ; get the Y scaling factor (pixels => OS units)
Pull "R2,R3-R4",VS
EXIT VS
BVS %FT92
LDR R1,sprite_log2bpp
LDR R6,log2bpp
TEQ R1,R6 ; any special translating?
; [ TrueIcon3
; LDRB R1, tinted_tool
; TEQEQ R1, #0 ; any special translating due to tinting?
; ]
LDR R0,sprite_log2px
LDR R5,log2px
TEQEQ R0,R5
......@@ -3324,50 +3347,16 @@ cachespritedata
TEQEQ R1,R6 ; any special scaling?
MOVEQ R14,#0
MOVNE R14,#-1
STR R14,needsfactors ; can be modified later
MOV R14,#1
[ false
MOV R0,R14,LSL R0 ; multiplication factors
MOV R1,R14,LSL R1
MOV R5,R14,LSL R5 ; division factors
MOV R6,R14,LSL R6
|
; all factors are ?:1 or 1:? so make R0:R5, R1:R6
; into this form
CMP R0,R5
MOVEQ R0,#1
MOVEQ R5,#1
MOVLT R5,R14,LSL R5
MOVLT R5,R5, LSR R0
MOVLT R0,#1
MOVGT R0,R14,LSL R0
MOVGT R0,R0, LSR R5
MOVGT R5,#1
CMP R1,R6
MOVEQ R1,#1
MOVEQ R6,#1
MOVLT R6,R14,LSL R6
MOVLT R6,R6, LSR R1
MOVLT R1,#1
MOVGT R1,R14,LSL R1
MOVGT R1,R1, LSR R6
MOVGT R6,#1
]
STRB R14,sprite_needsfactors ; may be modified later
ADR R14,factors
STMIA R14,{R0-R1,R5-R6} ; store the scaling block
ADR r2,sprite_factors
BL rationalisefactors
Pull "R1" ; R1 -> sprite
MOV R2,#-1
MOV R3,#-1 ; convert to the current mode
[ Medusa
MOV R5,#(1:SHL:0) :OR: 1:SHL:1 ; See PRM 5a-120
MOV R5,#(1:SHL:0) :OR: 1:SHL:1 ; Use mode's palette if sprite has none
|
MOV R5,#(1:SHL:0)
]
......@@ -3388,7 +3377,7 @@ cachespritedata
BLT %FT02
LDR R0,baseofromsprites ; might have 8+ bpp sprites in ROM now
LDR R4,[R0,#0]
LDR R4,[R0,#saEnd]
ADD R4,R0,R4 ; R4 -> end of ROM sprite area
CMP R1,R0
CMPHS R4,R1 ; is sprite in ROM?
......@@ -3399,23 +3388,6 @@ cachespritedata
; it based on the translation table defined in workspace
;
[ false
; nk
LDR R0,log2bpp
TEQ R0,R14
BNE %FT02
; same depth, no palette so no trans table
LDR R2,pixtable_at
CMP R2,#0 ; is there a pixel table defined yet?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; free it if there is - ignoring errors
MOV R2,#0
STR R2,pixtable_at ; mark as the pix table has been released
STR R2,pixtable_size
Pull "R3,R4"
EXIT
]
02
LDR R0,[R1,#spMode] ; R0 = mode of sprite
ADRL R1,temppaltable ; R1 -> temporary palette area
......@@ -3472,22 +3444,13 @@ cachespritedata
20 MOV R6,R4 ; R6 = size of table generated (first time)
LDR R4,pixtable_at
ADR R7,pixtable_params
STMIA R7,{R0-R1,R2-R3,R4,R5} ; push enty parameters for the translation
ASSERT ?selecttable_args = 4*6
ADR R7,selecttable_args
STMIA R7,{R0-R1,R2-R3,R4,R5} ; cache entry parameters for the translation
Debug ic,"Sprite src mode, src pptr, dest mode, dest pptr",R0,R1,R2,R3
[ TrueIcon3
Push "R6,R7"
LDRB R6, tinted_tool
ORR R5, R5, R6
MOV R6, wsptr
ADRL R7, tintfunc
SWI XColourTrans_GenerateTable
Pull "R6,R7"
|
SWI XColourTrans_SelectTable
]
BVS %FT90 ; return if not important
CMP R6,#256
......@@ -3497,16 +3460,17 @@ cachespritedata
BMI %FT90 ; return if end of the world reached
LDRB R14,[R4,R6]
TEQ R14,R6 ; is the byte valid?
TEQ R14,R6 ; colour number = index? (1:1 mapped)
BEQ %BT35
40
MOV R14,#-1
STR R14,needsfactors ; mark as needing translation
STRB R14,sprite_needsfactors ; mark as needing translation
90
MOV R3, #0
STRB R3, preservett ; passed the critical moment for pixtable
Pull "R3-R4"
92
MOV R14, #0
STRB R14, selecttable_crit ; passed the critical moment for pixtable
EXIT
;..............................................................................
......@@ -3898,12 +3862,12 @@ wimp_SpriteOp_putsprite
]
BLNE calcinverse ; updates R7
;
LDR R0,needsfactors
LDRB R0,sprite_needsfactors
TEQ R0,#0 ; do I need to translate
TSTEQ R1,#if_halfsize ; does need factors if half size
;
MOVNE R0,#SpriteReason_PutSpriteScaled
ADRNE R6,factors
ADRNE R6,sprite_factors
BNE scaled
;
MOV R0,#SpriteReason_PutSpriteUserCoords
......@@ -3993,44 +3957,26 @@ calcinverse ROUT
EXIT EQ ; no pixtable!
[ true ; BJGA bugfix: was sometimes trying to work from a paged-out sprite!
LDR R1, sprite_log2bpp ; if <256-colour sprite without palette, we pass palette from Wimp workspace, so no problem
CMP R1, #3 ; if <256-colour sprite with palette, cachespritedata has already updated pixtable_params
CMP R1, #3 ; if <256-colour sprite with palette, cachespritedata has already updated selecttable_args
BLGE cachespriteaddress ; R2 -> this sprite, ie *not* the first sprite in this run of matching-mode sprites!
EXIT VS ; bail out now if sprite not found!
CMP R1, #3
Push "R2", GE
ADR R0, pixtable_params
ADR R0, selecttable_args
LDMIA R0, {R0-R5}
LDRGE R0, baseofsprites ; any non-system sprite area will do
Pull "R1", GE
|
ADR R0,pixtable_params
ADR R0,selecttable_args
LDMIA R0,{R0-R5} ; get the parameters for the call
[ false
BNE %FT05
; pixtable has been stolen! This can make a mess of the tools!!!
Push "R0-R3"
MOV R0,#ModHandReason_Claim
LDR R3,pixtable_size
BL XROS_Module
Pull "R0-R3",VS
EXITS VS ; ok as pixtable_at will be zero
STR R2,pixtable_at
STR R2,pixtable_params+16
MOV R4,R2
Pull "R0-R3"
STR R4,[sp,#28] ; updates R7
05
]
]
ORR R5,R5,#1:SHL:2 ; mark as a transfer function supplied
SWI XColourTrans_GenerateTable
; SWI XColourTrans_InvalidateCache
MOV R0,#-1
STR R0,lastmode
STR R0,needsfactors ; mark as recache and needing translation table
STR R0,sprite_lastmode
STRB R0,sprite_needsfactors ; mark as recache and needing translation table
CLRV
EXIT
......@@ -4204,101 +4150,6 @@ inversefunc EntryS "R1-R4"
ORR R0,R0,R3,LSL #24 ; recombine to make &BBGGRRxx
EXITS
[ TrueIcon3
;------------------------------------------------------------------------------
; Routine called to process a palette entry to "tint" a tool sprite
; Maps greys on to title bar foreground-background scale
; White - &bbbbbb00 - Black ---> White - [titlecolour] - [truetitlefg]
;
; In: R0 = input palette entry
; Out: R0 = modified palette entry
; all other registers preserved
;------------------------------------------------------------------------------
tintfunc Entry "R1-R8"
MOV R8, #&FF
MOV R3, R0, LSR #24 ; blue component
AND R2, R8, R0, LSR #16 ; green component
AND R1, R8, R0, LSR #8 ; red component
TEQ R1, R2
TEQEQ R2, R3
EXIT NE ; leave colours alone
LDR R4, titlecolour
AND R2, R8, R4, LSR #8 ; title background red component
AND R3, R8, R4, LSR #16 ; title background green component
MOV R4, R4, LSR #24 ; title background blue component
CMP R1, #&BB
BLT %FT02
; bright shades: blend to white
SUB R1, R8, R1 ; distance of source from white
SUB R2, R8, R2 ; R2 = distance from white
MUL R0, R1, R2 ; scale up by new size
DivRem R2, R0, #&44, R14 ; scale down by old size
SUB R2, R8, R2 ; make relative to white again
SUB R3, R8, R3
MUL R0, R1, R3
DivRem R3, R0, #&44, R14
SUB R3, R8, R3
SUB R4, R8, R4
MUL R0, R1, R4
DivRem R4, R0, #&44, R14
SUB R4, R8, R4
B %FT01
02 ; dark shades: blend between foreground and background
LDR R7, truetitlefg
AND R5, R8, R7, LSR #8 ; title foreground red component
AND R6, R8, R7, LSR #16 ; title foreground green component
MOV R7, R7, LSR #24 ; title foreground blue component
RSB R1, R1, #&BB ; distance of source from Wimp grey 2
SUBS R5, R2, R5 ; R5 = total distance between bg and fg
BEQ %FT10 ; just in case fg=bg (!)
RSBLT R5, R5, #0 ; R5 = |R5|
SavePSR R8 ; remember flags for later
MUL R0, R1, R5 ; scale up by new size
DivRem R5, R0, #&BB, R14 ; scale down by old size
RestPSR R8,,f ; restore flags
ADDLT R2, R2, R5 ; make relative to new background
SUBGT R2, R2, R5 ; (accounting for the sign of R2-R5 above)
10
SUBS R6, R3, R6
BEQ %FT10
RSBLT R6, R6, #0
SavePSR R8
MUL R0, R1, R6
DivRem R6, R0, #&BB, R14
RestPSR R8,,f
ADDLT R3, R3, R6
SUBGT R3, R3, R6
10
SUBS R7, R4, R7
BEQ %FT10
RSBLT R7, R7, #0
SavePSR R8
MUL R0, R1, R7
DivRem R7, R0, #&BB, R14
RestPSR R8,,f
ADDLT R4, R4, R7
SUBGT R4, R4, R7
10
01 ; recombine RGB from R2, R3, R4
MOV R0, R2, LSL #8
ORR R0, R0, R3, LSL #16
ORR R0, R0, R4, LSL #24
EXIT
]
;; ---------------------------------------------------------------------------
;; Miscellaneous routines
;; ---------------------------------------------------------------------------
......@@ -6803,18 +6654,23 @@ SWIWimp_SetColourMapping
CMP R2,#0 ; has a pixtable been setup?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; attempt to release - ignore errors
;
MOV R2,#0
STR R2,pixtable_at ; mark the pixtable as being zapped!
;
MOV R2,#-1 ; and the PixTrans mode
STR R2,lastmode
STR R2,sprite_lastmode
;
LDR R2,tpixtable_at
CMP R2,#0 ; has a tool pixtable been setup?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; attempt to release - ignore errors
[ false
BL maketoollist ; re-calcuate border based information
|
BL recache_tools_trans
]
MOV R2,#0
STR R2,tpixtable_at ; mark the tool pixtable as being zapped!
MOV R2,#-1 ; and the tool PixTrans mode
STR R2,tsprite_lastmode
;
STRB R2,tsprite_needsregen ; re-calcuate border based information
;
LDR R2,log2bpp ; is it <8BPP?
CMP R2,#3
......
......@@ -634,7 +634,7 @@ maketoollist EntryS "R1-R11"
;
TEQ R2,#0 ; has the list buffer been setup yet?
BNE %FT07
ADRL R14,tools_area
ADRL R14,tool_list_backup
LDR R2,[R14] ; this is a constant size so try and reuse
CMP R2,#0
STRNE R2,tool_list
......@@ -646,7 +646,7 @@ maketoollist EntryS "R1-R11"
MOV R0,#ModHandReason_Claim
BL XROS_Module
STRVC R2,tool_list
ADRVCL R14,tools_area
ADRVCL R14,tool_list_backup
STRVC R2,[R14]
EXITS VS ; return if it fails to claim
......@@ -942,25 +942,8 @@ cachetoolspriteaddress ; [spritename], [thisCBptr], [lengthflags] as for cachesp
MOV R2,#0
STR R2,lengthflags ; [spritename] is absolute
;
[ false
LDR R2,pixtable_at
TEQ R2,#0
LDRNE R1,tool_transtable
TEQNE R1,R2 ; if they're the same, don't free
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module
LDR R2,tool_transtable
STR R2,pixtable_at ; attempt to reuse area
ADRL R14,tools_trans_size
LDR R2,[R14]
STR R2,pixtable_size
|
BL freetooltrans ; release tool translation table
]
BL cachespritedata ; attempt to build a suitable pixtrans table
BL cachetoolspritedata ; attempt to build a suitable pixtrans table
;
BVC %FT42
; a failure here usually means that we can't even allocate a pix table
......@@ -968,30 +951,35 @@ cachetoolspriteaddress ; [spritename], [thisCBptr], [lengthflags] as for cachesp
BL freetoolarea
EXITS
42
[ Medusa
MOV R1, #8+32 ; Plot masked with wide tables by default
|
MOV R1, #8 ; Plot masked by default
]
[ fastborders
LDR R1,needsfactors ; do we need to do translation
TEQ R1,#0
LDRB R0,tsprite_needsfactors ; do we need to do translation
TEQ R0,#0
LDREQ R0,=&200+SpriteReason_PutSpriteUserCoords
LDRNE R0,=&200+SpriteReason_PutSpriteScaled
MOV R1,#8
ADRNEL R2,tool_scalingblk
LDRNE R3,pixtable_at
LDRNE R3,tpixtable_at
MOVEQ R3,#0
|
LDR R0,=&200+SpriteReason_PutSpriteScaled
[ TrueIcon3
LDR R1, tool_area
LDR R14, tool_area
LDR R2, ROMstart
LDR R3, ROMend
CMP R1, R2
CMPHS R3, R1
MOVHS R1, #0 ; pretend ROM toolsprites are unmasked
MOVLO R1, #8
CMP R14, R2
CMPHS R3, R14
[ Medusa
MOVHS R1, #0+32 ; pretend ROM toolsprites are unmasked
|
MOV R1,#8
MOVHS R1, #0
]
]
ADRL R2,tool_scalingblk
LDR R3,pixtable_at
LDR R3,tpixtable_at
]
;
ASSERT tool_maskop = tool_plotop+4
......@@ -1005,35 +993,23 @@ cachetoolspriteaddress ; [spritename], [thisCBptr], [lengthflags] as for cachesp
[ :LNOT: fastborders
TEQ R3,#0 ; not needed with fastborders set
]
MOVNE R0,#0
STRNE R0,pixtable_at
STRNE R0,pixtable_size ; flag as no active pixtable ('cos we stole it!)
[ ChildWindows
ADR R14,factors
ADR R14,tsprite_factors
LDMIA R14,{R3,R4,R5,R6}
ADRL R14,tool_scalingblk
STMIA R14,{R3,R4,R5,R6} ; take a copy of the scaling block (even if the tools don't always need it)
|
[ fastborders
ADRNE R14,factors
ADRNE R14,tsprite_factors
LDMNEIA R14,{R3,R4,R5,R6}
STMNEIA R2,{R3,R4,R5,R6} ; take a copy of the scaling block
|
ADR R14,factors
ADR R14,tsprite_factors
LDMIA R14,{R3,R4,R5,R6}
STMIA R2,{R3,R4,R5,R6} ; take a copy of the scaling block
]
]
;
[ true
; we store info about the current pixtable so that we can reuse it without freeing RMA
; this can become very important as RMA begins to run out.
LDR R0,pixtable_size
ADRL R1,tools_trans_size
STR R0,[R1]
]
;
; calculate values + an OS unit for correct tessalation.
;
......@@ -1227,20 +1203,21 @@ freetoollist ROUT
;;-----------------------------------------------------------------------------
;; Free the translation table associated with the tool plotting routines.
;;
;; in [tool_transtable] -> table / =0 for none
;; out [tool_transtable] = 0 (block released)
;; in [tpixtable_at] -> table / =0 for none
;; out [tpixtable_at] = 0 (block released)
;;-----------------------------------------------------------------------------
freetooltrans ROUT
MOV R1,R14
;
LDR R2,tool_transtable
LDR R2,tpixtable_at
CMP R2,#0 ; has a table been defined yet?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; if so then release - ignore errors
;
MOV R0,#0
STR R0,tpixtable_at
STR R0,tool_transtable
;
CLRV
......@@ -1501,7 +1478,7 @@ modifytool_clicked
TEQ R3,#0 ; is there a glyph list?
BNE %FT05
Push "R2" ; R2 corrupted :-(
BL recache_tools_trans ; if not, try to get one again
BL restore_tool_list ; if not, try to get one again
Pull "R2"
LDR R3,tool_list
TEQ R3,#0
......@@ -1512,7 +1489,7 @@ modifytool_clicked
]
EXIT EQ ; return 'cos not allowed to toggle the state
;
; scroll bars are a special case - so handle seperatelym
; scroll bars are a special case - so handle seperately
;
[ PushBothBars
Pull "R14" ; check to see if an adjust click on a scrollbar
......@@ -3030,222 +3007,383 @@ LoseFont_lost_symbol_font
]
[ debug
; Some extra tracing routines by Jonathan. All preserve all registers and
; all flags
; HostFS_WriteC * &40102
;;-----------------------------------------------------------------------------
;; Tool_SpriteOp
;; Perform an OS_SpriteOp on a tool from the tool_area
;; Entry: R0 reason code (b9 set)
;; R2-R7 as required by the respective reason code
;; Exit: R0,R1 preserved
;; R2-R7 as returned by the respective reason code
;;-----------------------------------------------------------------------------
;---------------------------------------------------------------------------
trace_char ROUT
Tool_SpriteOp
EntryS "R0,R1"
LDRB R1,tsprite_needsregen
TEQ R1,#0
BEQ %FT05
Push "R2"
BL restore_tool_list ; ensure tool list valid, get 1st sprite entry
BL recache_tools_trans ; make new tpixtable from 1st sprite entry
Pull "R2"
LDR R7,tool_transtable ; reload new table
MOV R1,#0
STRB R1,tsprite_needsregen
05
LDR R1,tool_area ; R1 is quite often wrong!
BIC R2,R2,#1
SWI XOS_SpriteOp
EXITS
; R0 = character to trace
;;----------------------------------------------------------------------------
;; Mode-independent sprite code
;; Entry: [spritename] --> sprite name
;; [thisCBptr] --> sprite area
;; [lengthflags] ==> is R2 a name ptr or a sprite ptr?
;; Exit: R3,R4 = sprite size (pixels)
;; mode data set up if different input mode from last time
;;----------------------------------------------------------------------------
EntryS "R0, R1, R2"
cachetoolspritedata
Entry "R1-R2,R5-R7"
CMP R0, #32
BLT |trace_char: nonprintable character|
CMP R0, #127
BGE |trace_char: nonprintable character|
MOV R2,#1
STRB R2,selecttable_crit ; entering critical period for pixtable
|trace_char: printable character|
;write character
SWI HostFS_WriteC
;if it's a backslash, write it again
CMP R0, #"\\"
SWIEQ HostFS_WriteC
B |trace_char: exit|
LDR R2,lengthflags
CMP R2,#0 ; absolute pointer?
LDR R2,spritename
BLNE cachespriteaddress
MOVVC R0,#&200+SpriteReason_ReadSpriteSize
SWIVC XOS_SpriteOp ; read information about the sprite
BVS %FT92
;
; R2 -> sprite in area
;
LDR R7,[R2,#spImage]
LDR R14,[R2,#spTrans]
CMP R7,R14 ; min(image,trans)
MOVHI R7,R14
|trace_char: nonprintable character|
CMP R0, #:CHR: 10
BNE |trace_char: control character|
LDR R14,tpixtable_at
CMP R14,#0 ; is a pixtable defined?
BEQ %FT10
|trace_char: linefeed|
SWI HostFS_WriteC
[ TrueIcon3
LDRB R14, tinted_tool
TEQ R14, #0 ; if it's tinted, we must recalculate the table
BNE %FT10
]
MOV R0, #:CHR: 13
SWI HostFS_WriteC
TEQ R7,#spPalette ; does it have a palette?
LDREQ R14,tsprite_lastmode
TEQEQ R6,R14 ; no, so have we already cached this information?
BEQ %FT92
B |trace_char: exit|
10 MOV R0,R6 ; R0 = mode of sprite
|trace_char: control character|
;save the character
TEQ R7,#spPalette
MOVNE R6,#-1 ; if it has a palette then corrupt last mode
[ TrueIcon3
LDRB R14, tinted_tool
TEQ R14, #0 ; if we're generating a tinted table, corrupt last mode too
MOVNE R6, #-1
]
STR R6,tsprite_lastmode
MOV R1, R0
ADR R2, |trace_char: digits|
Push "R2,R3-R4" ; R2 -> sprite, R3,R4 = height / width
; R1 = character to trace
; R2 -> representation table
MOV R1,#VduExt_Log2BPP
SWI XOS_ReadModeVariable
STRVC R2,tsprite_log2bpp ; get the depth of the sprite
MOVVC R1,#VduExt_XEigFactor
SWIVC XOS_ReadModeVariable
STRVC R2,tsprite_log2px ; get the X scaling factor (pixels => OS units)
MOVVC R1,#VduExt_YEigFactor
SWIVC XOS_ReadModeVariable
STRVC R2,tsprite_log2py ; get the Y scaling factor (pixels => OS units)
Pull "R2,R3-R4",VS
BVS %FT92
LDR R1,tsprite_log2bpp
LDR R6,log2bpp
TEQ R1,R6 ; any special translating?
LDR R0,tsprite_log2px
LDR R5,log2px
TEQEQ R0,R5
LDR R1,tsprite_log2py
LDR R6,log2py
TEQEQ R1,R6 ; any special scaling?
MOVEQ R14,#0
MOVNE R14,#-1
STRB R14,tsprite_needsfactors ; may be modified later
ADR r2,tsprite_factors
BL rationalisefactors
Pull "R1" ; R1 -> sprite
MOV R2,#-1
MOV R3,#-1 ; convert to the current mode
[ Medusa
MOV R5,#(1:SHL:0) :OR: 1:SHL:1 :OR: 1:SHL:4 ; Use mode's palette if sprite has none, make wide table
|
MOV R5,#(1:SHL:0)
]
;
; we must now attempt to cope with the dilemma of sorting out the correct
; mapping table for the sprite.
;
; in earlier versions of the Window Manager it made no attempt to cope
; with different depth sprites other than 1,2 or 4BPP so we will break
; new ground and go boldly where no larma has been parping before.
;
LDR R14,tsprite_log2bpp
MOV R0, #"\\"
SWI HostFS_WriteC
Debug ic,"Sprite bpp, palette",R14,R7
MOV R0, #"x"
SWI HostFS_WriteC
CMP R14,#3 ; is it 8,16 or 32BPP?
CMPLT R7,#(spPalette+4) ; or does it have a palette?
BLT %FT02
;trace top nybble
MOV R0, R1, LSR #4
LDRB R0, [R2, R0]
SWI HostFS_WriteC
LDR R0,baseofromsprites ; might have 8+ bpp sprites in ROM now
LDR R4,[R0,#saEnd]
ADD R4,R0,R4 ; R4 -> end of ROM sprite area
CMP R1,R0
CMPHS R4,R1 ; is sprite in ROM?
LDRLO R0,baseofsprites ; no, use RAM sprite area ; 320nk Medusa fix
B %FT10
;
; sprite is in a depth less than 8BPP so take the current palette and munge
; it based on the translation table defined in workspace
;
;trace bottom nybble
AND R0, R1, #&F
LDRB R0, [R2, R0]
SWI HostFS_WriteC
02
LDR R0,[R1,#spMode] ; R0 = mode of sprite
ADRL R1,temppaltable ; R1 -> temporary palette area
Push "R0-R3,R5"
|trace_char: exit|
EXITS
BL getpalpointer ; R14 -> palette to be used
|trace_char: digits|
= "0123456789ABCDEF"
ALIGN
;---------------------------------------------------------------------------
trace_string ROUT
LDR R4,tsprite_log2bpp
CMP R4,#1
ADRLTL R4,transtable1 ; R4 => translation 1BPP
ADREQL R4,transtable2 ; translation 2BPP
ADRGTL R4,transtable4 ; translation 4BPP
MOV R5,#15
05 LDRB R3,[R4,R5] ; get index into real palette
LDR R3,[R14,R3,LSL #2]
BIC R3,R3,#&000000FF ; R3 = &BBGGRR00
STR R3,[R1,R5,LSL #2]
SUBS R5,R5,#1
BPL %BT05 ; loop back copying the data
Pull "R0-R3,R5"
10 MOV R4,#0 ; R4 =0 read table size
SWI XColourTrans_SelectTable
BVS %FT90 ; exit
LDR R14,tpixtable_at
TEQ R14,#0 ; does the pixtable exist?
LDRNE R14,tpixtable_size
CMP R14,R4 ; is it big enough?
BHS %FT20
Push "R0-R3"
LDR R2,tpixtable_at
CMP R2,#0 ; is there a pixel table defined yet?
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module ; free it if there is - ignoring errors
; R0 -> string to trace
MOV R2,#0
STR R2,tpixtable_size
STR R2,tpixtable_at ; mark as the pix table has been released
EntryS "R0, R1"
MOV R0,#ModHandReason_Claim
MOV R3,R4
BL XROS_Module ; attempt to claim a new buffer big enough
STRVC R2,tpixtable_at
STRVC R3,tpixtable_size ; store pointer and define the size
MOV R1, R0
; R1 -> string to trace
STRVS R0,[SP]
Pull "R0-R3"
BVS %FT90 ; return if it errors
B |trace_string: end loop|
|trace_string: start loop|
BL trace_char
ADD R1, R1, #1
|trace_string: end loop|
LDRB R0, [R1]
CMP R0, #:CHR: 0
BNE |trace_string: start loop|
20 MOV R6,R4 ; R6 = size of table generated (first time)
LDR R4,tpixtable_at
EXITS
;---------------------------------------------------------------------------
trace_decimal ROUT
Debug ic,"Sprite src mode, src pptr, dest mode, dest pptr",R0,R1,R2,R3
; R0 = integer to trace
[ TrueIcon3
Push "R6,R7"
LDRB R6, tinted_tool
ORR R5, R5, R6
MOV R6, wsptr
ADR R7, tintfunc
SWI XColourTrans_GenerateTable
Pull "R6,R7"
|
SWI XColourTrans_SelectTable
]
BVS %FT90 ; return if not important
EntryS "R0, R1, R2"
CMP R6,#256
BHI %FT40 ; if its greater than 8bpp then we can ignore it (was GT)
SUB SP, SP, #16
MOV R1, SP
MOV R2, #15
SWI OS_ConvertInteger4
35 SUBS R6,R6,#1 ; decrease the index into the table
BMI %FT90 ; return if end of the world reached
;trace it
BL trace_string
ADD SP, SP, #16
LDRB R14,[R4,R6]
TEQ R14,R6 ; colour number = index? (1:1 mapped)
BEQ %BT35
40
MOV R14,#-1
STRB R14,tsprite_needsfactors; mark as needing translation
90
Pull "R3-R4"
92
MOV R14, #0
STRB R14, selecttable_crit ; passed the critical moment for pixtable
EXIT
;---------------------------------------------------------------------------
trace_hex ROUT
; R0 = integer to trace
Push "R0, R1, R2, LR"
SUB SP, SP, #16
MOV R1, SP
MOV R2, #15
SWI OS_ConvertHex8
;trace it
BL trace_string
ADD SP, SP, #16
Pull "R0, R1, R2, PC",, ^
;---------------------------------------------------------------------------
trace_nl ROUT
EntryS "R0"
MOV R0, #:CHR: 10
BL trace_char
EXITS
[ TrueIcon3
;------------------------------------------------------------------------------
; Routine called to process a palette entry to "tint" a tool sprite
; Maps greys on to title bar foreground-background scale
; White - &bbbbbb00 - Black ---> White - [titlecolour] - [truetitlefg]
;
; In: R0 = input palette entry
; Out: R0 = modified palette entry
; all other registers preserved
;------------------------------------------------------------------------------
tintfunc Entry "R1-R8"
MOV R8, #&FF
MOV R3, R0, LSR #24 ; blue component
AND R2, R8, R0, LSR #16 ; green component
AND R1, R8, R0, LSR #8 ; red component
TEQ R1, R2
TEQEQ R2, R3
EXIT NE ; leave colours alone
LDR R4, titlecolour
AND R2, R8, R4, LSR #8 ; title background red component
AND R3, R8, R4, LSR #16 ; title background green component
MOV R4, R4, LSR #24 ; title background blue component
CMP R1, #&BB
BLT %FT02
; bright shades: blend to white
SUB R1, R8, R1 ; distance of source from white
SUB R2, R8, R2 ; R2 = distance from white
MUL R0, R1, R2 ; scale up by new size
DivRem R2, R0, #&44, R14 ; scale down by old size
SUB R2, R8, R2 ; make relative to white again
SUB R3, R8, R3
MUL R0, R1, R3
DivRem R3, R0, #&44, R14
SUB R3, R8, R3
SUB R4, R8, R4
MUL R0, R1, R4
DivRem R4, R0, #&44, R14
SUB R4, R8, R4
B %FT01
02 ; dark shades: blend between foreground and background
LDR R7, truetitlefg
AND R5, R8, R7, LSR #8 ; title foreground red component
AND R6, R8, R7, LSR #16 ; title foreground green component
MOV R7, R7, LSR #24 ; title foreground blue component
RSB R1, R1, #&BB ; distance of source from Wimp grey 2
SUBS R5, R2, R5 ; R5 = total distance between bg and fg
BEQ %FT10 ; just in case fg=bg (!)
RSBLT R5, R5, #0 ; R5 = |R5|
SavePSR R8 ; remember flags for later
MUL R0, R1, R5 ; scale up by new size
DivRem R5, R0, #&BB, R14 ; scale down by old size
RestPSR R8,,f ; restore flags
ADDLT R2, R2, R5 ; make relative to new background
SUBGT R2, R2, R5 ; (accounting for the sign of R2-R5 above)
10
SUBS R6, R3, R6
BEQ %FT10
RSBLT R6, R6, #0
SavePSR R8
MUL R0, R1, R6
DivRem R6, R0, #&BB, R14
RestPSR R8,,f
ADDLT R3, R3, R6
SUBGT R3, R3, R6
10
SUBS R7, R4, R7
BEQ %FT10
RSBLT R7, R7, #0
SavePSR R8
MUL R0, R1, R7
DivRem R7, R0, #&BB, R14
RestPSR R8,,f
ADDLT R4, R4, R7
SUBGT R4, R4, R7
10
01 ; recombine RGB from R2, R3, R4
MOV R0, R2, LSL #8
ORR R0, R0, R3, LSL #16
ORR R0, R0, R4, LSL #24
EXIT
]
Tool_SpriteOp
EntryS "R0,R1"
[ false ; fastborders
; This reason code is only generated when fastborders is active - but this comparison
; is flawed anyway, because bit 9 of R0 is always set at this stage!! BJGA May 1998
TEQ R0,#SpriteReason_PutSpriteUserCoords
BEQ %FT05 ; no trans table needed if plotting
]
LDR R1,tool_list
TEQ R1,#0
BLEQ recache_tools_trans
05
LDR R1,tool_area ; R1 is quite often wrong!
BIC R2,R2,#1
SWI XOS_SpriteOp
LDR R1,tool_list ; if the tool list is wrong then reset the pointer
TEQ R1,#0
ADREQL R1,tools_area
LDREQ R1,[R1]
STREQ R1,tool_list
EXITS
;;-----------------------------------------------------------------------------
;; restore_tool_list
;; Get a valid tool list from the backup (which is never freed to save bashing the RMA)
;; Entry: -
;; Exit: R2 -> first sprite in the tools list
;;-----------------------------------------------------------------------------
recache_tools_trans
Push "lr"
ADRL R2,tools_area
restore_tool_list
ADRL R2,tool_list_backup
LDR R2,[R2] ; tool list pointer
STR R2,tool_list
LDR R2,[R2] ; get first tool, we assume that this is representitive
TEQ R2,#0
BEQ %FT99
B %FT99
99
CLRV ; clear errors
Pull "PC"
MOV PC, LR
[ TrueIcon3
; In: R2 -> tool_list
; note that this code seems once to have been part of recache_tools_trans, but was dead
; code until the direct_tools_trans2 label was added as part of the TrueIcon3 work
recache_tools_trans2
Push "R0-R5,R14"
;;-----------------------------------------------------------------------------
;; recache_tools_trans
;; Regenerate the pixel translation tables for the tool sprites
;; In: R2 -> sprite representative of one in the tool_list
;;-----------------------------------------------------------------------------
recache_tools_trans
Push "R0-R4,R14"
BIC R2,R2,#1
STR R2,spritename
MOV R2,#0
STR R2,lengthflags
; if pixtable is already in use, we must free it up before we re-use all
; the the standard pixtable variables in order to invoke cachespritedata
LDR R2,pixtable_at
CMP R2,#0
MOVNE R0,#ModHandReason_Free
BLNE XROS_Module
LDR R2,tool_transtable ; reuse tool_transtable memory area
STR R2,pixtable_at
STR R2,lengthflags ; flag it's a sprite address (not a name)
MOV R14,#0
STR R14,tool_transtable ; for safety, make sure that only one variable points to it at once
STR R14,tool_transtable ; might move during cachetoolspritedata so kill it
ADRL R5,tools_trans_size
LDR R2,[R5]
STR R2,pixtable_size
BL cachespritedata ; this sets up pixtable area
BVS %FT98
BL cachetoolspritedata ; this sets up the tool pixtable area
LDRVC R0,tpixtable_at
STRVC R0,tool_transtable ; update the new table location
LDR R0,pixtable_size
STR R0,[R5]
LDR R0,pixtable_at
STR R0,tool_transtable
MOV R0,#0
STR R0,pixtable_at ; exit with standard pixtable marked as needing recalculation
STR R0,pixtable_size
98
CLRV ; clear errors
Pull "R0-R5,PC"
Pull "R0-R4,PC"
]
LTORG
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment