2020#include "pico/divider.h"
2121
2222#include <stdbool.h>
23+ #include <string.h>
2324
2425#define CHAR_WIDTH 6
2526#define CHAR_HEIGHT 6
@@ -364,31 +365,52 @@ static void diagMode(uint16_t row, uint16_t* pixels)
364365 renderLeft ("MODE : " , & modeStr , "" , row , pixels );
365366}
366367
367- static void diagEmpty (uint16_t row , uint16_t * pixels )
368- {
369- }
370-
371368typedef void (* DiagPtr )(uint16_t , uint16_t * );
372369
373- DiagPtr leftDiags [] =
374- {
370+ DiagPtr leftDiags [32 ] = {0 };
371+ int leftDiagRows = 0 ;
372+
373+ DiagPtr performanceDiags [] = {
375374 & diagClock ,
376375 & diagRenderTime ,
377376 & diagGpuTime ,
378- & diagTemp ,
379- & diagEmpty ,
377+ & diagTemp };
378+
379+ DiagPtr addressDiags [] = {
380380 & diagMode ,
381381 & diagNameTab ,
382382 & diagColorTab ,
383383 & diagPattTab ,
384384 & diagSprAttrTab ,
385- & diagSprPattTab
386- };
385+ & diagSprPattTab };
386+
387+ void diagnosticsConfigUpdated ()
388+ {
389+ memset (leftDiags , 0 , sizeof (leftDiags ));
390+
391+ leftDiagRows = 0 ;
392+ if (tms9918 -> config [CONF_DIAG_PERFORMANCE ])
393+ {
394+ for (int j = 0 ; j < sizeof (performanceDiags ) / sizeof (void * ); ++ j )
395+ {
396+ leftDiags [leftDiagRows ++ ] = performanceDiags [j ];
397+ }
398+ leftDiagRows ++ ;
399+ }
400+
401+ if (tms9918 -> config [CONF_DIAG_ADDRESS ])
402+ {
403+ for (int j = 0 ; j < sizeof (addressDiags ) / sizeof (void * ); ++ j )
404+ {
405+ leftDiags [leftDiagRows ++ ] = addressDiags [j ];
406+ }
407+ leftDiagRows ++ ;
408+ }
409+ }
387410
388411static void renderPalette (int y , uint16_t * pixels )
389412{
390413 divmod_result_t dmResult = divmod_u32u32 (y , 6 );
391- int regIndex = to_quotient_u32 (dmResult );
392414 int row = to_remainder_u32 (dmResult );
393415
394416 int palette = (y - 216 ) / 6 ;
@@ -421,10 +443,11 @@ void renderDiagnostics(uint16_t y, uint16_t* pixels)
421443{
422444 y -= 1 ; // vertical border
423445
446+ // palette
424447 if (tms9918 -> config [CONF_DIAG_PALETTE ] && (y > 213 )) renderPalette (y + 2 , pixels );
425448
426449 divmod_result_t dmResult = divmod_u32u32 (y , 6 );
427- int regIndex = to_quotient_u32 (dmResult );
450+ int diagRow = to_quotient_u32 (dmResult );
428451 int row = to_remainder_u32 (dmResult );
429452
430453 int maxReg = 8 ;
@@ -433,26 +456,28 @@ void renderDiagnostics(uint16_t y, uint16_t* pixels)
433456 maxReg += sizeof (extReg ) / sizeof (int );
434457 }
435458
436- if (tms9918 -> config [CONF_DIAG_PERFORMANCE ] && (regIndex < sizeof (leftDiags ) / sizeof (DiagPtr )))
459+ // left panels
460+ if (diagRow < leftDiagRows )
437461 {
438- leftDiags [regIndex ](row , pixels );
462+ if ( leftDiags [diagRow ]) leftDiags [ diagRow ](row , pixels );
439463 }
440464
441- if (tms9918 -> config [CONF_DIAG_REGISTERS ] && (regIndex < maxReg ))
465+ // registers
466+ if (tms9918 -> config [CONF_DIAG_REGISTERS ] && (diagRow < maxReg ))
442467 {
443- if (regIndex >= 8 )
468+ if (diagRow >= 8 )
444469 {
445- regIndex = extReg [regIndex - 8 ];
470+ diagRow = extReg [diagRow - 8 ];
446471 }
447472
448- dmResult = divmod_u32u32 (regIndex , 10 );
473+ dmResult = divmod_u32u32 (diagRow , 10 );
449474 int xPos = 636 - (CHAR_WIDTH * 13 );
450475 char buf [] = "R00:" ; buf [1 ] = '0' + to_quotient_u32 (dmResult ); buf [2 ] = '0' + to_remainder_u32 (dmResult );
451476 xPos = renderText (row , buf , xPos , 0 , labelColor , 0 , pixels );
452477 xPos = backgroundPixels (xPos , 2 , pixels );
453- xPos = renderText (row , nibbleBinStr [TMS_REGISTER (tms9918 , regIndex ) >> 4 ], xPos , 0 , valueColor , 0 , pixels );
478+ xPos = renderText (row , nibbleBinStr [TMS_REGISTER (tms9918 , diagRow ) >> 4 ], xPos , 0 , valueColor , 0 , pixels );
454479 xPos = backgroundPixels (xPos , 2 , pixels );
455- xPos = renderText (row , nibbleBinStr [TMS_REGISTER (tms9918 , regIndex ) & 0xf ], xPos , 0 , valueColor , 0 , pixels );
480+ xPos = renderText (row , nibbleBinStr [TMS_REGISTER (tms9918 , diagRow ) & 0xf ], xPos , 0 , valueColor , 0 , pixels );
456481 }
457482
458483}
0 commit comments