From 5951aeb505fa85d04d51c9a7feaa80132a10ff07 Mon Sep 17 00:00:00 2001
From: Stewart Brodie <sbrodie@gitlab.riscosopen.org>
Date: Fri, 18 Aug 2000 12:23:18 +0000
Subject: [PATCH] Added a test program and profiling for messages.

Detail:
  The kernel can now disable all substitutions into error messages that
    it generates and count the number of times each error is looked up.
    The ErrorCount BASIC program then displays that information so that
    you can see if any odd errors are occurring or weird errors that you
    would not be expecting.
  It is not sensible to build a release with countmsgusage enabled.
Admin:
  Tested in Ursula build.

Version 5.32. Not tagged
---
 TestSrc/ErrorCount,ffb | Bin 0 -> 2403 bytes
 VersionASM             |   6 +-
 VersionNum             |   8 +--
 s/MsgCode              | 145 ++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 150 insertions(+), 9 deletions(-)
 create mode 100644 TestSrc/ErrorCount,ffb

diff --git a/TestSrc/ErrorCount,ffb b/TestSrc/ErrorCount,ffb
new file mode 100644
index 0000000000000000000000000000000000000000..67416ed54affe43f7d6da26f59bbaeac2176b027
GIT binary patch
literal 2403
zcmaJ?O^j1j6n<@nXfzk)N00>d@SHccOsCTs2O=FhG7N(jp@TC;#D(Oxy=`B3eYd{*
zN~fsA7<Hj6T%ZdV#sv#?;lj9Jp~ko{EYKJiE{qTiMiLT@kS>f1^*gU+sKGdknRm}Q
z_dDnNzVqG)%Sv}?PB%M&TdRjOnaO16pe!po;FbeTMOCi*+S9cTHNCR1tW{n7n(xwn
zx2$}lD%A2TDxk2gXtpWK_|wm%=qVK#SNk-X&QO92?0(8lP6K3bmpZyd4cQ@Ihtx6(
zD6XNZ>nT#pWz`JH^{K2IP0y7+MrylZJ?hlQNdsl9OGo-Bx)e%Wkhs$9kgg7vk_>MQ
zKh-7vsfS@RJ3iiSx6?8jJgtM;xYwg)#`ovv<_k;nV;KI%#eA0z`JOU{0`*+W4M4us
zA=$)uWm&?|o@|p2NY(;{T&Q{ccHoAtUrUkE)vzrC1+>SyRB=rhxTRM3F9rL&2r3K~
zKtt)1J-bBtC7X87F6Ea}fGKq8aK8BX!l5D^o?Tp=Efn+fOSG^^a|?w%`C@*dfYV-@
zEgYdI@`XJqQqT`xspV$CEHJ9e+Nuf*33f}0Em(1os;J<zX{xeYb;}^=*IKfssHTsr
zzy~jCs-WQ-_Ss;_3V?>Y<hczulwlOSxgP_r@fO{&rb{#PL7;;<-ST12`XOQ6zpqP0
z-hx)>dT!XEGMH=M>rhGYid1?_a17m*XE2=%sV<Kzq?J#lmh1H@gq48GCVjxv=5z%V
zRLC}9HPEVIYAwSwVA1o%#Y6Kirit<)NzZ6_3q>G~&(wuAIRiSn9FgIjlGN0$A3{c$
z>*+Q%R6_?HvgdgDD-oaFxNywaP<7{hw}c(a(a7FCj|gio_#S++%biVKx0#J1ztt!K
zoVV9)U=9UXQmhh{7?#^|T~7gUH$Cc2X`qg<o&g|eaY-?dzVT$JqM;H;4;i&Mm83vJ
zTOZJoz5N<k#VZ={K9;qAT=}l@L$4#O$^vxM(W`2r{ea?(?#ZC0Oo&OVia!CEqeE4R
z^$!&7mX!jC@J7(?R<*i-b*VxvVfi4veE;>MZ5<p-+$v5|STC=-B&<^?dwcB#>K8&}
z2dVcE{cv@uRdsS(I3%o3Ca=JCoHO()Wm04pG?|X6E7|O;1`#8#%j}OWtk3V}n>oI;
zWo$}V=aSdRUUE+;*1RvVp%HufB-c&bpcN{Ei{EXGmdD8@I59Sr9G~2dZ^Mr}u27<v
z*@{4tcFyolpny*GXNu7I8wX_#UVJDEyk8zdV^*nW_khPHOZIdRQdqx(^Pgg6W)U0O
zRFXzHIS!59XuNH^h^-zHv3pYh#U~iX9Mp!tb921$_=_cYkk1Etde|anqds-_Me?2g
z{7DhpzTqOKj}#le8Qrz^BC9!2w-1q~HUp6&(4M{LG8Ng2v%MG18JiHX`Wot$7M*0S
z=!jUbiMS^pBPLt$xOEE6U)W5&Hk@L5QD$=6cH~}rfaps9+DwLCSt-Qfl!(1K%G_2a
zXMi&&RG=fTM!5mQjB=NEZX-G`VrMqqa>IrwA0hj-h@D;atB8FGO6S*I=hvdI#n=P@
zzDM}de=)uK|1););*PtV+{lj14iWnc)kN1;v`O_e!Nw)*X%WADpn6Kg*Cu<_sgscr
zAUJI&DK~>n8DuTun<E185fF%HhD1EO>L(H3gNMQzyiO69hFr$m6o2~8tF-K-I*y2!
z)?LP9WE>}9Tin|~beTF%ZrK@~fT0{0@#7;rMr1_C!LG9-00VGaHt_^BAisne(EfFv
z;WYPu7yaMo*ZE&%AK!cKbdNqDQqej^*FRm4cn_FGiDF-EL2QL7*WWxv1>bH$L8MKT
zjGm&z4?Mun7~r?*3v>qmb`#P`X0OWOtQ^kScJ|y`^r&=Z9-iQ{93K5Ffnzc&ozdJx
u_M0q1BL2rtT#fc=;O+|6l@H|b%(hH6_k|ozZObG_?Q}YAXWxkK{{0Ukq3LA+

literal 0
HcmV?d00001

diff --git a/VersionASM b/VersionASM
index 95fd4578..602c97e3 100644
--- a/VersionASM
+++ b/VersionASM
@@ -11,8 +11,8 @@
 Module_MajorVersion     SETS    "5.32"
 Module_Version          SETA    532
 Module_MinorVersion     SETS    ""
-Module_Date             SETS    "17 Aug 2000"
-Module_ApplicationDate2 SETS    "17-Aug-00"
-Module_ApplicationDate4 SETS    "17-Aug-2000"
+Module_Date             SETS    "18 Aug 2000"
+Module_ApplicationDate2 SETS    "18-Aug-00"
+Module_ApplicationDate4 SETS    "18-Aug-2000"
 Module_FullVersion      SETS    "5.32"
                         END
diff --git a/VersionNum b/VersionNum
index 9ad31340..a6ef902e 100644
--- a/VersionNum
+++ b/VersionNum
@@ -5,14 +5,14 @@
  */
 #define Module_MajorVersion_CMHG        5.32
 #define Module_MinorVersion_CMHG        
-#define Module_Date_CMHG                17 Aug 2000
+#define Module_Date_CMHG                18 Aug 2000
 
 #define Module_MajorVersion             "5.32"
 #define Module_Version                  532
 #define Module_MinorVersion             ""
-#define Module_Date                     "17 Aug 2000"
+#define Module_Date                     "18 Aug 2000"
 
-#define Module_ApplicationDate2         "17-Aug-00"
-#define Module_ApplicationDate4         "17-Aug-2000"
+#define Module_ApplicationDate2         "18-Aug-00"
+#define Module_ApplicationDate4         "18-Aug-2000"
 
 #define Module_FullVersion              "5.32"
diff --git a/s/MsgCode b/s/MsgCode
index 740182f8..0e14087c 100644
--- a/s/MsgCode
+++ b/s/MsgCode
@@ -27,6 +27,13 @@
 ;            returned.
 ;       V Set.
 ;
+
+        GBLL    countmsgusage
+countmsgusage SETL {FALSE}
+     [ countmsgusage
+        ! 0,    "*** WARNING: Cacheing *ALL* messages - even those with substitutions"
+     ]
+
 TranslateError_VClear  ROUT
         Push    "r4,LR"
         MOV     r4,#0
@@ -101,10 +108,121 @@ TranslateError_UseR4
   [ CacheCommonErrors
    ; This block MUST not be empty
 CommonErrorAddresses
-        &       ErrorBlock_BadNumb
-        &       ErrorBlock_BuffOverflow
+    [ countmsgusage
+        &       ErrorBlock_RCExc
+        &       ErrorBlock_RCNegative
+        &       ErrorBlock_BadString
+        &       ErrorBlock_VarCantFind
+        &       ErrorBlock_BadVarType
+        &       ErrorBlock_BadVarNam
+        &       ErrorBlock_VarTooLong
+        &       ErrorBlock_BadMacVal
+        &       ErrorBlock_VarNoRoom
+        &       ErrorBlock_BadBra
+        &       ErrorBlock_StkOFlo
+        &       ErrorBlock_MissOpn
+        &       ErrorBlock_MissOpr
+        &       ErrorBlock_BadInt
+        &       ErrorBlock_StrOFlo
+        &       ErrorBlock_NaffItm
+        &       ErrorBlock_DivZero
+        &       ErrorBlock_BadBase
+        &       ErrorBlock_NumbTooBig
+        &       ErrorBlock_BadClaimNum
+        &       ErrorBlock_SysHeapFull
+        &       ErrorBlock_BadDynamicArea
+        &       ErrorBlock_AreaAlreadyExists
+        &       ErrorBlock_AreaNotOnPageBdy
+        &       ErrorBlock_OverlappingAreas
+        &       ErrorBlock_CantAllocateArea
+        &       ErrorBlock_CantAllocateLevel2
+        &       ErrorBlock_UnknownAreaHandler
+        &       ErrorBlock_CantGetPhysMem
+        &       ErrorBlock_AplWSpaceInUse
+        &       ErrorBlock_ChDynamCAO
+        &       ErrorBlock_RAMFsUnchangeable
+        &       ErrorBlock_HeapBadReason
+        &       ErrorBlock_HeapFail_Init
+        &       ErrorBlock_HeapFail_BadDesc
+        &       ErrorBlock_HeapFail_BadLink
+        &       ErrorBlock_HeapFail_Alloc
+        &       ErrorBlock_HeapFail_NotABlock
+        &       ErrorBlock_HeapFail_BadExtend
+        &       ErrorBlock_HeapFail_ExcessiveShrink
+        &       ErrorBlock_NoSuchSWI1
+        &       ErrorBlock_NoSuchSWI
+        &       ErrorBlock_UndefinedInstruction
+        &       ErrorBlock_InstructionAbort
+        &       ErrorBlock_DataAbort
+        &       ErrorBlock_AddressException
+        &       ErrorBlock_BranchThrough0
+        &       ErrorBlock_BadEnvNumber
+        &       ErrorBlock_BadReadSysInfo
+        &       ErrorBlock_BadModuleReason
+        &       ErrorBlock_NoMoreModules
+        &       ErrorBlock_NoMoreIncarnations
+        &       ErrorBlock_PostfixNeeded
+        &       ErrorBlock_IncarnationExists
+        &       ErrorBlock_ChunkNotRM
+        &       ErrorBlock_MHNoRoom
+        &       ErrorBlock_ModulePostfix
+        &       ErrorBlock_NotMod
+        &       ErrorBlock_BadRMHeaderField
+        &       ErrorBlock_CantKill
+        &       ErrorBlock_RMNotFound
+        &       ErrorBlock_IncarnationNotFound
+        &       ErrorBlock_RMNotFoundInROM
+        &       ErrorBlock_ModuleTooOld
+        &       ErrorBlock_BadParameters
+        &       ErrorBlock_ArgRepeated
+        &       ErrorBlock_NaffDevNo
+        &       ErrorBlock_BadDevVecRel
+        &       ErrorBlock_RedirectFail
+        &       ErrorBlock_StackFull
+        &       ErrorBlock_OscliLongLine
+        &       ErrorBlock_NoOscliSpecials
+        &       ErrorBlock_OscliTooHard
+        &       ErrorBlock_BadParmString
+        &       ErrorBlock_CoreNotWriteable
+        &       ErrorBlock_CoreNotReadable
+        &       ErrorBlock_BadCommand
+        &       ErrorBlock_NoSuchSWI2
+        &       ErrorBlock_TooManyParms
+        &       ErrorBlock_BadKey
+        &       ErrorBlock_BadAddress
+        &       ErrorBlock_OutsideFile
+        &       ErrorBlock_Escape
+        &       ErrorBlock_BadTime
+        &       ErrorBlock_BadMODE
+        &       ErrorBlock_ModeNotAvailable
+        &       ErrorBlock_BadPixelDepth
+        &       ErrorBlock_Sprite_BadDPI
+        &       ErrorBlock_BadMSFlags
+        &       SpriteErr_NoWorkSpace
+        &       SpriteErr_NoRoom
+        &       SpriteErr_DoesntExist
+        &       SpriteErr_NoSprites
+        &       SpriteErr_NotGraphics
+        &       SpriteErr_NotEnoughRoom
+        &       SpriteErr_BadSpriteFile
+        &       SpriteErr_NoRoomToMerge
+        &       SpriteErr_Bad2ndPtr
+        &       SpriteErr_InvalidRowOrCol
+        &       SpriteErr_InvalidHeight
+        &       SpriteErr_InvalidWidth
+        &       SpriteErr_NoRoomToInsert
+        &       SpriteErr_SpriteAlreadyExists
+        &       SpriteErr_InvalidSpriteMode
+        &       SpriteErr_BadReasonCode
+        &       SpriteErr_CantInTeletext
+        &       SpriteErr_InvalidSaveArea
+        &       SpriteErr_SpriteIsCurrentDest
+        &       SpriteErr_NoMaskOrPaletteAllowedInThisDepth
+     ]
         &       ErrorBlock_ChDynamNotAllMoved
         &       ErrorBlock_NaffRelease
+        &       ErrorBlock_BuffOverflow
+        &       ErrorBlock_BadNumb
 EndCommonErrorAddresses
 
         GBLA    ECEACount
@@ -113,15 +231,20 @@ ECEACount SETA  (EndCommonErrorAddresses-CommonErrorAddresses)/4
 
         ! 0, "Requiring ":CC:(:STR:(ECEACount*256)):CC:" bytes for error cache"
         ! 0, "Cached error block pointer at ":CC::STR:CachedErrorBlocks
+        ! 0, "Cacheing ":CC:(:STR:ECEACount):CC:" error messages"
 
 ; This routine exits with Z clear if it can supply a cached translation; else must set Z
 ; so that the TranslateError_UseR4 routine continues to function and set R9 to the cache
 ; block to use for the result (or set R9 to zero to indicate no cacheing for this error)
 CheckCommonErrorCache ROUT
         Entry   "r1-r3"
+    [ countmsgusage
+        MOV     r4, #0                      ; prevents substitutions
+    |
         CMP     r4, #1                      ; is R4 = 0?  If so, clear C for next instruction
         SBCS    r9, r4, r4                  ; R9=0,Z set - if R4 was >0, else R9=-1, Z clear
         EXIT    EQ
+    ]
         LDR     r9, [r4, #KernelMessagesBlock] ; R4 guaranteed zero from above
         TEQ     r9, #0
         EXIT    EQ                          ; not initialised messages yet!  Exit R9=0, Z set
@@ -143,6 +266,12 @@ CheckCommonErrorCache ROUT
         MOVS    r9, #0
         EXIT
 20
+    [ countmsgusage
+        ADD     r3, r9, #ECEACount*256
+        LDR     r1, [r3, r2, LSL #2]
+        ADD     r1, r1, #1
+        STR     r1, [r3, r2, LSL #2]
+    ]
         ; Read the cached error number (0 = we don't have this cached or we have uncached it)
         ; Update R9 to point to the actual error buffer at the same time.
         LDR     r1, [r9, r2, LSL #8]!
@@ -158,7 +287,11 @@ CommonErrorCacheInit ROUT
         Entry   "r0-r8"
         MOVS    r2, r9                          ; copy R9 to R2 - only claim memory if it was 0
         BNE     %FT10
+    [ countmsgusage
+        LDR     r3, =ECEACount*260              ; size of block required
+    |
         LDR     r3, =ECEACount*256              ; size of block required
+    ]
         BL      ClaimSysHeapNode
         MOVS    r9, #0                          ; set Z for STREQ below and for return
         EXIT    VS
@@ -168,10 +301,18 @@ CommonErrorCacheInit ROUT
 
         GBLA    CECLoop
 CECLoop SETA    0
+     [ countmsgusage
+        LDR     r4, =ECEACount*260
+90
+        SUBS    r4, r4, #4
+        STR     r3, [r2, r4]
+        BNE     %BT90
+     |
         WHILE CECLoop < ECEACount
           STR   r3, [r2, #CECLoop * 256]
 CECLoop SETA    CECLoop+1
         WEND
+     ]
 
         MOVS    r9, r2                          ; set up R9; clear Z
         EXIT
-- 
GitLab