Index: trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuEvent.asm
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuEvent.asm	(revision 188)
+++ trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuEvent.asm	(revision 189)
@@ -4,10 +4,4 @@
 ; Section containing code
 SECTION .text
-
-struc ITEM_TYPE_REFRESH
-	.HardDisk			resb	2
-	.FloppyDrive		resb	2
-endstruc
-
 
 ;--------------------------------------------------------------------
@@ -29,4 +23,17 @@
 	add		bx, BootMenuEvent_Handler
 	jmp		bx
+
+MENUEVENT_InitializeMenuinitFromDSSI equ  (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler)
+MENUEVENT_ExitMenu equ  (BootMenuEvent_Handler.EventCompleted - BootMenuEvent_Handler)
+MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler)
+MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler)
+MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler)
+MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler)
+MENUEVENT_RefreshInformation equ (BootMenuEvent_Handler.RefreshInformation - BootMenuEvent_Handler)
+MENUEVENT_RefreshItemFromCX equ (BootMenuEvent_Handler.RefreshItemFromCX - BootMenuEvent_Handler)
+; 
+; Note that there is no entry for MENUEVENT_IdleProcessing.  If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined, 
+; then the entry point will not be called (saving memory on this end and at the CALL point).
+;
 		
 %else
@@ -35,24 +42,8 @@
 	ja		SHORT .EventNotHandled
 	jmp		[cs:bx+.rgfnEventSpecificHandlers]
-		
-%endif
-		
+
 .EventNotHandled:
 	clc
 	ret
-
-%ifdef MENUEVENT_INLINE_OFFSETS
-		
-MENUEVENT_InitializeMenuinitFromDSSI equ  (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler)
-MENUEVENT_ExitMenu equ  (BootMenuEvent_Handler.EventCompleted - BootMenuEvent_Handler)
-MENUEVENT_IdleProcessing equ (BootMenuEvent_Handler.EventNotHandled - BootMenuEvent_Handler)
-MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler)
-MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler)
-MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler)
-MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler)
-MENUEVENT_RefreshInformation equ (BootMenuEvent_Handler.RefreshInformation - BootMenuEvent_Handler)
-MENUEVENT_RefreshItemFromCX equ (BootMenuEvent_Handler.RefreshItemFromCX - BootMenuEvent_Handler)
-
-%else
 		
 ALIGN WORD_ALIGN
@@ -162,14 +153,13 @@
 ALIGN JUMP_ALIGN
 .RefreshItemFromCX:
-	mov		bx, .rgwItemTypeRefresh
-	jmp		SHORT .RefreshItemOrInformationWithJumpTableInCSBX
-
-
+	mov		bl,00h
+	SKIP2B  dx		; dx corrupted below by BootMenu_GetDriveToDXforMenuitemInCX
+	; Fall to .RefreshInformation
+		
 ; Parameters:
 ;	CX:			Index of highlighted item
 ;	Cursor has been positioned to the beginning of first line
-ALIGN JUMP_ALIGN
 .RefreshInformation:
-	mov		bx, .rgwInformationItemTypeRefresh
+	mov		bl,040h
 	; Fall to .RefreshItemOrInformationWithJumpTableInCSBX
 
@@ -188,21 +178,13 @@
 	call	RamVars_GetSegmentToDS
 	call	BootMenu_GetDriveToDXforMenuitemInCX
-	test	dl, dl					; Floppy drive?
-	jns		SHORT .DrawFloppyDrive
-	jmp		[cs:bx+ITEM_TYPE_REFRESH.HardDisk]
+	or		bl,dl
+	shl		bl,1
+	jc		SHORT BootMenuPrint_HardDiskMenuitem
+		
+;;; 
+;;; Fall-through (to BootMenuPrint_FloppyMenuitem)
+;;; (checked at assembler time with the code after BootMenuPrint_FloppyMenuitem)
+;;;
 ALIGN JUMP_ALIGN
-.DrawFloppyDrive:
-	jmp		[cs:bx+ITEM_TYPE_REFRESH.FloppyDrive]
+BootMenuEvent_FallThroughToFloppyMenuitem:	
 
-; Jump tables for .RefreshItemOrInformationWithJumpTableInCSBX
-ALIGN WORD_ALIGN
-.rgwItemTypeRefresh:
-istruc ITEM_TYPE_REFRESH
-	at	ITEM_TYPE_REFRESH.HardDisk,			dw	BootMenuPrint_HardDiskMenuitem
-	at	ITEM_TYPE_REFRESH.FloppyDrive,		dw	BootMenuPrint_FloppyMenuitem
-iend
-.rgwInformationItemTypeRefresh:
-istruc ITEM_TYPE_REFRESH
-	at	ITEM_TYPE_REFRESH.HardDisk,			dw	BootMenuPrint_HardDiskMenuitemInformation
-	at	ITEM_TYPE_REFRESH.FloppyDrive,		dw	BootMenuPrint_FloppyMenuitemInformation
-iend
Index: trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrint.asm
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrint.asm	(revision 188)
+++ trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrint.asm	(revision 189)
@@ -5,4 +5,34 @@
 SECTION .text
 
+;;;
+;;; Fall-through from BootMenuEvent.asm!
+;;; BootMenuPrint_FloppyMenuitem must be the first routine in this file
+;;; (checked at assembler time with the code after BootMenuPrint_FloppyMenuitem)
+;;;
+;--------------------------------------------------------------------
+; BootMenuPrint_FloppyMenuitem
+;	Parameters:
+;		DL:		Untranslated Floppy Drive number
+;	Returns:
+;		Nothing
+;	Corrupts registers:
+;		AX, DX, SI, DI
+;--------------------------------------------------------------------
+ALIGN JUMP_ALIGN
+BootMenuPrint_FloppyMenuitem:
+	js		BootMenuPrint_FloppyMenuitemInformation
+	call	PrintDriveNumberAfterTranslationFromDL
+	push	bp
+	mov		bp, sp
+	mov		si, g_szFDLetter
+	ePUSH_T	ax, g_szFloppyDrv
+	add		dl, 'A'
+	push	dx					; Drive letter
+	jmp		BootMenuPrint_FormatCSSIfromParamsInSSBP
+
+%if BootMenuPrint_FloppyMenuitem <> BootMenuEvent_FallThroughToFloppyMenuitem
+%error "BootMenuPrint.asm must follow BootMenuEvent.asm, and BootMenuPrint_FloppyMenuitem must be the first routine in BootMenuPrint.asm"
+%endif
+		
 ;--------------------------------------------------------------------
 ; BootMenuPrint_ClearScreen
@@ -81,25 +111,4 @@
 
 ;--------------------------------------------------------------------
-; BootMenuPrint_FloppyMenuitem
-;	Parameters:
-;		DL:		Untranslated Floppy Drive number
-;	Returns:
-;		Nothing
-;	Corrupts registers:
-;		AX, DX, SI, DI
-;--------------------------------------------------------------------
-ALIGN JUMP_ALIGN
-BootMenuPrint_FloppyMenuitem:
-	call	PrintDriveNumberAfterTranslationFromDL
-	push	bp
-	mov		bp, sp
-	mov		si, g_szFDLetter
-	ePUSH_T	ax, g_szFloppyDrv
-	add		dl, 'A'
-	push	dx					; Drive letter
-	jmp		BootMenuPrint_FormatCSSIfromParamsInSSBP
-
-
-;--------------------------------------------------------------------
 ; BootMenuPrint_HardDiskMenuitem
 ;	Parameters:
@@ -113,4 +122,5 @@
 ALIGN JUMP_ALIGN
 BootMenuPrint_HardDiskMenuitem:
+	js		BootMenuPrint_HardDiskMenuitemInformation
 	call	PrintDriveNumberAfterTranslationFromDL
 	call	RamVars_IsDriveHandledByThisBIOS
Index: trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm	(revision 188)
+++ trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm	(revision 189)
@@ -21,4 +21,5 @@
 	mov		bp, ROMVARS.ideVars0			; CS:BP now points to first IDEVARS
 .DriveDetectLoop:
+	mov		si,g_szDetect
 	call	.DetectDrives_WithIDEVARS		; Detect Master and Slave
 	add		bp, BYTE IDEVARS_size			; Point to next IDEVARS
@@ -29,4 +30,5 @@
  	jz		.done
 	mov		bp, ROMVARS.ideVarsSerialAuto
+	mov		si,g_szSerial
 ;;; fall-through		
 %else
@@ -42,4 +44,5 @@
 ;		DS:			RAMVARS segment
 ;		ES:			Zero (BDA segment)
+;       SI:		    Ptr to template string
 ;	Returns:
 ;		Nothing
@@ -49,8 +52,11 @@
 .DetectDrives_WithIDEVARS:
 	push	cx
+		
+	push	si
 	mov		ax, g_szMaster
 	mov		bh, MASK_DRVNHEAD_SET								; Select Master drive
 	call	StartDetectionWithDriveSelectByteInBHandStringInAX	; Detect and create DPT + BOOTNFO
-
+	pop		si
+		
 	mov		ax, g_szSlave
 	mov		bh, MASK_DRVNHEAD_SET | FLG_DRVNHEAD_DRV
Index: trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectPrint.asm
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectPrint.asm	(revision 188)
+++ trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectPrint.asm	(revision 189)
@@ -30,4 +30,5 @@
 ;		CS:AX:	Ptr to "Master" or "Slave" string
 ;		CS:BP:	Ptr to IDEVARS
+;       SI:		Ptr to template string 
 ;	Returns:
 ;		Nothing
@@ -37,9 +38,8 @@
 DetectPrint_StartDetectWithMasterOrSlaveStringInAXandIdeVarsInCSBP:
 	push	bp
-	mov		si, [cs:bp+IDEVARS.wPort]
+	mov		di, [cs:bp+IDEVARS.wPort]
 	mov		bp, sp
 	push	ax							; Push "Master" or "Slave"
-	push	si							; Push port number
-	mov		si, g_szDetect
+	push	di							; Push port number
 	jmp		BootMenuPrint_FormatCSSIfromParamsInSSBP
 
Index: trunk/XTIDE_Universal_BIOS/Src/Strings.asm
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/Strings.asm	(revision 188)
+++ trunk/XTIDE_Universal_BIOS/Src/Strings.asm	(revision 189)
@@ -14,5 +14,5 @@
 g_szSlave:		db	"Slave ",NULL
 g_szDetect:		db	"IDE %s at %x: ",NULL			; IDE Master at 1F0h:
-
+g_szSerial:		db	"Serial Port %s: ",NULL
 
 ; Boot loader strings
Index: trunk/XTIDE_Universal_BIOS/Src/StringsCompress.pl
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/StringsCompress.pl	(revision 189)
+++ trunk/XTIDE_Universal_BIOS/Src/StringsCompress.pl	(revision 189)
@@ -0,0 +1,398 @@
+#======================================================================================
+#
+# Project name	:	XTIDE Universal BIOS
+#
+# Authors       :   Greg Lindhorst
+#                   gregli@hotmail.com
+#
+# Description	:	Script for compiling and compressing strings for 
+#                   use by DisplayFormatCompressed.asm.  See the header of that file
+#                   for a description of the compression scheme.
+#
+# Usage         :   stdin:  Listing of strings.asm, 
+#                           assembled with MODULE_STRINGS_COMPRESSED_PRECOMPRESS.
+#                           We used the listing so that the assembler can take care of
+#                           resolving %define and EQU symbol definitions.
+#
+#                   stdout: StringsCompressed.asm,
+#                           plug replacement for Strings.asm (included by Main.asm)
+#
+#                   Also see the XTIDE makefile for building StringsCompressed.asm
+#
+
+#----------------------------------------------------------------------
+#
+# Translated and Format characters
+#
+# DisplayFormatCompressed can only deal with characters in one of the following categories:
+#  1. Those in the Translate associative array
+#  2. Those in the Format associative array
+#  3. Characters between $normal_base and $normal_base+0x40
+#  4. Null characters (marking the end of strings)
+#  5. The special string LF,CR
+#
+# If a character or format read at the input cannot be found in one of the above categories, 
+# it must be added here before this script will accept it (and DisplayFormatCompressed can 
+# display it).
+#
+# Note that these tables are not present in DisplayFormatCompressed, and do not need to
+# updated there.  Needed information is put in the compression output that it reads.
+#
+$translate{ord(' ')} = 0;
+$translate{172}      = 1;     # ONE_QUARTER
+$translate{171}      = 2;     # ONE_HALF
+$translate{179}      = 3;     # SINGLE_VERTICAL
+$translate{175}      = 4;     # ANGLE_QUOTE_RIGHT
+$translate{ord('!')} = 5;
+$translate{ord('"')} = 6;
+$translate{ord(',')} = 7;
+$translate{ord('-')} = 8;
+$translate{ord('.')} = 9;
+$translate{ord('/')} = 10;
+$translate{ord('1')} = 11;    
+$translate{ord('2')} = 12;
+$translate{ord('3')} = 13;
+$translate{ord('4')} = 14;
+$translate{ord('5')} = 15;
+$translate{ord('6')} = 16;
+$translate{ord('8')} = 17;
+$translate{200}      = 18;    # DOUBLE_BOTTOM_LEFT_CORNER
+$translate{181}      = 19;    # DOUBLE_LEFT_HORIZONTAL_TO_SINGLE_VERTICAL
+
+#
+# Formats begin immediately after the last Translated character (they are in the same table)
+#
+$format_begin = 20;
+
+$format{"s"}   = 20;        # n/a
+$format{"c"}   = 21;        # n/a
+$format{"2-I"} = 22;        # must be even
+$format{"u"}   = 23;        # must be odd
+$format{"5-u"} = 24;        # must be even
+$format{"x"}   = 25;        # must be odd
+$format{"5-x"} = 26;        # must be even
+$format{"nl"}  = 27;        # n/a
+$format{"2-u"} = 28;        # must be even
+$format{"A"}   = 29;        # n/a
+
+# NOTE: The last $format cannot exceed 31 (stored in a 5-bit quantity).
+
+#
+# Starting point for the "normal" range, typically around 0x40 to cover upper and lower case
+# letters.  If lower case 'z' is not used, 0x3a can be a good choice as it adds ':' to the 
+# front end.
+#
+$normal_base = 0x3a;
+
+#
+# High order code bits, determining which type of character we have (translated or not) and
+# if a space or null should come after this character.
+#
+$code_space = 0xc0;
+$code_null = 0x80;
+$code_normal = 0x40;
+$code_translate = 0x00;
+
+#
+# Bit used if it is a translated byte
+#
+$code_translate_null = 0x00;
+$code_translate_normal = 0x20;
+
+print ";;;======================================================================\n";
+print ";;;\n";
+print ";;; This file is generated by StringsCompress.pl from source in Strings.asm\n";
+print ";;; DO NOT EDIT DIRECTLY - See the maekfile for how to rebuild this file.\n";
+print ";;; This file only needs to be rebuilt if Strings.asm is changed.\n";
+print ";;;\n";
+print ";;;======================================================================\n\n";
+
+#
+# Loop through lines of the listing, looking for 'db' lines (and dealing with continuations)
+# and compressing each line as it is encountered.
+#
+while(<>)
+{
+	#
+	# The <number> indicates a line from an include file, do not include in the output
+	#
+	if( /^\s*\d+\s*\<\d\>/ )
+	{
+	}
+
+	#
+	# a 'db' line, with or without a label
+	#
+	elsif( /^\s*\d+\s[0-9A-F]+\s([0-9A-F]+)(-?)\s+([a-z0-9_]+:)?(\s+)(db\s+)(.*)/i )
+	{
+		$bytes = $1;
+		$continuation = $2;
+		$label = $3;
+		$spacing = $4;
+		$db = $5;
+		$string = $6;
+
+		print $label.$spacing."; ".$db.$string."\n";
+
+		if( $continuation eq "-" )
+		{
+			do
+			{
+				$_ = <>;
+				/^\s*\d+\s[0-9A-F]+\s([0-9A-F]+)(\-?)/i || die "parse error on continuation";
+				$bytes .= $1;
+				$continuation = $2;
+			}
+			while( $continuation eq "-" );
+		}
+
+		&processString( $bytes, $label.$spacing, $db );
+	}
+	
+	# 
+	# everything else, copy to the output as is
+	#
+	elsif( /^\s*\d+\s*(.*)$/ )
+	{
+		print $1."\n";
+	}
+}
+
+print ";;; end of strings.asm\n\n";
+
+#--------------------------------------------------------------------------------
+#
+# Output constants and the TranslatesAndFormats table
+#
+
+print "StringsCompressed_NormalBase     equ   ".$normal_base."\n\n";
+
+print "StringsCompressed_FormatsBegin   equ   ".$format_begin."\n\n";
+
+print "StringsCompressed_TranslatesAndFormats: \n";
+
+foreach $f (keys(%translate))
+{
+	$translate_index[$translate{$f}] = $f;
+	$used{$f} || print "translate $f unused\n";
+	$translate{$f} <= 31 || die $translate{$f}.": translate codes must be below 32";
+}
+
+for( $g = 0; $translate_index[$g]; $g++ )
+{
+	print "        db     ".$translate_index[$g]."  ; ".$g."\n";
+}
+
+foreach $f (keys(%format))
+{
+	$n = $f;
+	$n =~ s/\-/_/g;
+	$format_index[$format{$f}] = "DisplayFormatCompressed_Format_".$n;
+	$used{$f} || die "format $f unused\n";
+	$format{$f} <= 31 || die $format{$f}.": format codes must be below 32";
+}
+
+for( $t = $format_begin; $format_index[$t]; $t++ )
+{
+	print "        db     (DisplayFormatCompressed_BaseFormatOffset - ".$format_index[$t].")    ; ".$t."\n";
+}
+
+print "\n";
+
+# 
+# Ensure that branch targets are within reach
+#
+for( $t = $format_begin; $format_index[$t]; $t++ )
+{
+	print "%if DisplayFormatCompressed_BaseFormatOffset < $format_index[$t] || DisplayFormatCompressed_BaseFormatOffset - $format_index[$t] > 255\n";
+	print "%error \"".$format_index[$t]." is out of range of DisplayFormatCompressed_BaseFormatOffset\"\n";
+	print "%endif\n";
+}
+
+#--------------------------------------------------------------------------------
+#
+# Output usage statistics
+#
+
+print "\n;; translated usage stats\n";
+foreach $f (keys(%special))
+{
+	print ";; ".$f.":".$used{$f}."\n";
+	$translate_count++;
+}
+print ";; total translated: ".$translate_count."\n";
+
+print "\n;; format usage stats\n";
+$format_count = 0;
+foreach $f (keys(%format))
+{
+	print ";; ".$f.":".$used{$f}."\n";
+	$format_count++;
+}
+print ";; total format: ".$format_count."\n";
+
+print "\n;; alphabet usage stats\n";
+
+$used_count = 0;
+for( $t = $normal_base; $t < $normal_base + 0x40; $t++ )
+{
+	print ";; ".$t.",".chr($t).":".$used{$t}."\n";
+	if( $used{$t} )
+	{
+		$used_count++;
+	}
+}
+print ";; alphabet used count: ".$used_count."\n";
+
+#--------------------------------------------------------------------------------
+#
+# processString does the real compression work...
+#
+
+sub processString
+{
+	$chars = $_[0];
+	$label = $_[1];
+	$db = $_[2];
+
+	$label =~ s/[a-z0-9_:]/ /ig;      # replace with spaces for proper output spacing
+
+	#
+	# Copy numeric bytes out of hexadecimal pairs in the listing
+	#
+	$#v = 0;
+
+	$orig = "";
+	for( $g = 0; $g < length($chars); $g += 2 )
+	{
+		$i = $g/2;
+		$v[$i] = hex(substr($chars,$g,2));
+		$orig .= sprintf( ($v[$i] > 0x9f ? ", %03xh" : ",  %02xh"), $v[$i] );
+	}
+	$v[length($chars)/2] = 0xff;      # guard byte to avoid thinking going past the end of 
+	                                  # the string is a null
+
+	$output = "";
+	#
+	# Loop through bytes...
+	# looking ahead as needed for possible space and null optimizations, compiling formats
+	#
+	for( $g = 0; $g < $#v-1; $g++ )    # -1 for the guard byte
+	{
+		#
+		# Special translation of LF,CR to a format
+		#
+		if( $v[$g] == 10 && $v[$g+1] == 13 )
+		{
+			$g++;
+			$post = $code_translate;
+			$code = $format{"nl"};
+			$used{"nl"}++;
+		}
+
+		#
+		# Format operators
+		#
+		elsif( $v[$g] == 0x25 )    # "%"
+		{
+			$fo = "";
+			$g++;
+			if( $v[$g] >= ord("0") && $v[$g] <= ord("9") )
+			{
+				$fo = $fo.chr($v[$g]);
+				$g++;
+			}
+			if( $v[$g] == ord("-") )
+			{
+				$fo = $fo.chr($v[$g]);
+				$g++;
+			}
+			$fo = $fo.chr($v[$g]);
+
+			$format{$fo} || die "unknown format operator: '".$fo."'\n";
+
+			$code = $format{$fo};
+			$post = $code_translate;
+			$used{$fo}++;
+		}
+
+		#
+		# Translated characters
+		#
+		elsif( $v[$g] == 32 || $translate{$v[$g]} )
+		{
+			$post = $code_translate;
+			$code = $translate{$v[$g]};
+			$used{$v[$g]}++;
+		}
+		
+		#
+		# "normal" characters (alphabet, and ASCII characters around the alphabet)
+		#
+		elsif( $v[$g] >= $normal_base && $v[$g] < ($normal_base+0x40) )
+		{
+			$used{$v[$g]}++;
+
+			$post = $code_normal;
+			$code = $v[$g] - $normal_base;
+		}
+
+		#
+		# Not found
+		# 
+		else
+		{
+			die $v[$g].": no translation or format, and out of normal range - may need to be added\n";
+		}
+
+		if( $post == $code_translate )
+		{
+			#
+			# NULL optimization (space optimization not possible on translate/format)
+			#
+			if( $v[$g+1] == 0 )
+			{
+				$g++;
+				$post = $post | $code_translate_null;
+			}
+			else
+			{
+				$post = $post | $code_translate_normal;
+			}
+		}
+		else # $post == $code_normal
+		{
+			#
+			# Space optimization
+			#
+			if( $v[$g+1] == 0x20 && $v[$g+2] != 0 )
+			{
+				# can't take this optimization if the next byte is a null, 
+				# since we can't have both a postfix space and null
+				$g++;
+				$post = $code_space;
+			}
+
+			#
+			# NULL optimization
+			#
+			elsif( $v[$g+1] == 0 )
+			{
+				$g++;
+				$post = $code_null;
+			}
+		}
+
+		$code = $code | $post;
+		$output .= sprintf( ($code > 0x9f ? ", %03xh" : ",  %02xh"), $code );
+	}
+
+	print $label."; ".$db.substr($orig,2)."    ; uncompressed\n";
+	print $label."  ".$db.substr($output,2);
+	for( $t = length($output); $t < length($orig); $t++ )
+	{
+		print " ";
+	}
+	print "    ; compressed\n\n";
+}
+
Index: trunk/XTIDE_Universal_BIOS/Src/StringsCompressed.asm
===================================================================
--- trunk/XTIDE_Universal_BIOS/Src/StringsCompressed.asm	(revision 188)
+++ trunk/XTIDE_Universal_BIOS/Src/StringsCompressed.asm	(revision 189)
@@ -18,115 +18,118 @@
 
 ; POST drive detection strings
-g_szRomAt:
- db  034h, 020h, 0c6h, 039h, 01bh
-; source:  25h, 73h, 20h, 40h, 20h, 25h, 78h, 0Ah, 0Dh, 00h
-
-g_szMaster:
- db  053h, 067h, 079h, 07ah, 06bh, 0b8h
-; source:  4Dh, 61h, 73h, 74h, 65h, 72h, 00h
-
-g_szSlave:
- db  059h, 072h, 067h, 07ch, 06bh, 000h
-; source:  53h, 6Ch, 61h, 76h, 65h, 20h, 00h
-
-g_szDetect:
- db  04fh, 04ah, 0cbh, 034h, 020h, 067h, 0fah, 039h, 040h, 000h
-; source:  49h, 44h, 45h, 20h, 25h, 73h, 20h, 61h, 74h, 20h, 25h, 78h, 3Ah, 20h, 00h
-
+g_szRomAt:		; db	"%s @ %x",LF,CR,NULL
+          		; db	 25h,  73h,  20h,  40h,  20h,  25h,  78h,  0ah,  0dh,  00h    ; uncompressed
+          		  db	 34h,  20h, 0c6h,  39h,  1bh                                  ; compressed
+
+g_szMaster:		; db	"Master",NULL
+           		; db	 4dh,  61h,  73h,  74h,  65h,  72h,  00h    ; uncompressed
+           		  db	 53h,  67h,  79h,  7ah,  6bh, 0b8h          ; compressed
+
+g_szSlave:		; db	"Slave ",NULL
+          		; db	 53h,  6ch,  61h,  76h,  65h,  20h,  00h    ; uncompressed
+          		  db	 59h,  72h,  67h,  7ch,  6bh,  00h          ; compressed
+
+g_szDetect:		; db	"IDE %s at %x: ",NULL			; IDE Master at 1F0h:
+           		; db	 49h,  44h,  45h,  20h,  25h,  73h,  20h,  61h,  74h,  20h,  25h,  78h,  3ah,  20h,  00h    ; uncompressed
+           		  db	 4fh,  4ah, 0cbh,  34h,  20h,  67h, 0fah,  39h,  40h,  00h                                  ; compressed
+
+g_szSerial:		; db	"Serial Port %s: ",NULL
+           		; db	 53h,  65h,  72h,  69h,  61h,  6ch,  20h,  50h,  6fh,  72h,  74h,  20h,  25h,  73h,  3ah,  20h,  00h    ; uncompressed
+           		  db	 59h,  6bh,  78h,  6fh,  67h, 0f2h,  56h,  75h,  78h, 0fah,  34h,  40h,  00h                            ; compressed
 
 
 ; Boot loader strings
-g_szTryToBoot:
- db  048h, 075h, 075h, 07ah, 06fh, 074h, 0edh, 06ch, 078h, 075h, 0f3h, 034h, 020h, 039h, 024h, 039h, 01bh
-; source:  42h, 6Fh, 6Fh, 74h, 69h, 6Eh, 67h, 20h, 66h, 72h, 6Fh, 6Dh, 20h, 25h, 73h, 20h, 25h, 78h, AFh, 25h, 78h, 0Ah, 0Dh, 00h
-
-g_szBootSectorNotFound:
- db  048h, 075h, 075h, 0fah, 079h, 06bh, 069h, 07ah, 075h, 078h, 020h
-; source:  42h, 6Fh, 6Fh, 74h, 20h, 73h, 65h, 63h, 74h, 6Fh, 72h, 20h
-
-g_szNotFound:
- db  074h, 075h, 0fah, 06ch, 075h, 07bh, 074h, 06ah, 01bh
-; source:  6Eh, 6Fh, 74h, 20h, 66h, 6Fh, 75h, 6Eh, 64h, 0Ah, 0Dh, 00h
-
-g_szReadError:
- db  04bh, 078h, 078h, 075h, 0f8h, 039h, 025h, 01bh
-; source:  45h, 72h, 72h, 6Fh, 72h, 20h, 25h, 78h, 21h, 0Ah, 0Dh, 00h
+g_szTryToBoot:			; db	"Booting from %s %x",ANGLE_QUOTE_RIGHT,"%x",LF,CR,NULL
+              			; db	 42h,  6fh,  6fh,  74h,  69h,  6eh,  67h,  20h,  66h,  72h,  6fh,  6dh,  20h,  25h,  73h,  20h,  25h,  78h, 0afh,  25h,  78h,  0ah,  0dh,  00h    ; uncompressed
+              			  db	 48h,  75h,  75h,  7ah,  6fh,  74h, 0edh,  6ch,  78h,  75h, 0f3h,  34h,  20h,  39h,  24h,  39h,  1bh                                              ; compressed
+
+g_szBootSectorNotFound:	; db	"Boot sector "
+                       	; db	 42h,  6fh,  6fh,  74h,  20h,  73h,  65h,  63h,  74h,  6fh,  72h,  20h    ; uncompressed
+                       	  db	 48h,  75h,  75h, 0fah,  79h,  6bh,  69h,  7ah,  75h, 0f8h                ; compressed
+
+g_szNotFound:			; db	"not found",LF,CR,NULL
+             			; db	 6eh,  6fh,  74h,  20h,  66h,  6fh,  75h,  6eh,  64h,  0ah,  0dh,  00h    ; uncompressed
+             			  db	 74h,  75h, 0fah,  6ch,  75h,  7bh,  74h,  6ah,  1bh                      ; compressed
+
+g_szReadError:			; db	"Error %x!",LF,CR,NULL
+              			; db	 45h,  72h,  72h,  6fh,  72h,  20h,  25h,  78h,  21h,  0ah,  0dh,  00h    ; uncompressed
+              			  db	 4bh,  78h,  78h,  75h, 0f8h,  39h,  25h,  1bh                            ; compressed
 
 
 ; Boot menu bottom of screen strings
-g_szFDD:
- db  04ch, 04ah, 0cah, 020h, 020h, 020h, 000h
-; source:  46h, 44h, 44h, 20h, 20h, 20h, 20h, 20h, 00h
-
-g_szHDD:
- db  04eh, 04ah, 0cah, 020h, 020h, 020h, 000h
-; source:  48h, 44h, 44h, 20h, 20h, 20h, 20h, 20h, 00h
-
-g_szRomBoot:
- db  058h, 055h, 0d3h, 048h, 075h, 075h, 0bah
-; source:  52h, 4Fh, 4Dh, 20h, 42h, 6Fh, 6Fh, 74h, 00h
-
-g_szHotkey:
- db  03dh, 035h, 035h, 03dh, 034h, 03dh, 000h
-; source:  25h, 41h, 25h, 63h, 25h, 63h, 25h, 41h, 25h, 73h, 25h, 41h, 20h, 00h
+g_szFDD:		; db	"FDD     ",NULL
+        		; db	 46h,  44h,  44h,  20h,  20h,  20h,  20h,  20h,  00h    ; uncompressed
+        		  db	 4ch,  4ah, 0cah,  20h,  20h,  20h,  00h                ; compressed
+
+g_szHDD:		; db	"HDD     ",NULL
+        		; db	 48h,  44h,  44h,  20h,  20h,  20h,  20h,  20h,  00h    ; uncompressed
+        		  db	 4eh,  4ah, 0cah,  20h,  20h,  20h,  00h                ; compressed
+
+g_szRomBoot:	; db	"ROM Boot",NULL
+            	; db	 52h,  4fh,  4dh,  20h,  42h,  6fh,  6fh,  74h,  00h    ; uncompressed
+            	  db	 58h,  55h, 0d3h,  48h,  75h,  75h, 0bah                ; compressed
+
+g_szHotkey:		; db	"%A%c%c%A%s%A ",NULL
+           		; db	 25h,  41h,  25h,  63h,  25h,  63h,  25h,  41h,  25h,  73h,  25h,  41h,  20h,  00h    ; uncompressed
+           		  db	 3dh,  35h,  35h,  3dh,  34h,  3dh,  00h                                              ; compressed
 
 
 
 ; Boot Menu menuitem strings
-g_szDriveNum:
- db  039h, 000h
-; source:  25h, 78h, 20h, 00h
-
-g_szFDLetter:
- db  034h, 020h, 015h
-; source:  25h, 73h, 20h, 25h, 63h, 00h
-
-g_szFloppyDrv:
- db  04ch, 072h, 075h, 076h, 076h, 0ffh, 04ah, 078h, 06fh, 07ch, 0abh
-; source:  46h, 6Ch, 6Fh, 70h, 70h, 79h, 20h, 44h, 72h, 69h, 76h, 65h, 00h
-
-g_szforeignHD:
- db  04ch, 075h, 078h, 06bh, 06fh, 06dh, 0f4h, 04eh, 067h, 078h, 0eah, 04ah, 06fh, 079h, 0b1h
-; source:  46h, 6Fh, 72h, 65h, 69h, 67h, 6Eh, 20h, 48h, 61h, 72h, 64h, 20h, 44h, 69h, 73h, 6Bh, 00h
+g_szDriveNum:	; db	"%x ",NULL
+             	; db	 25h,  78h,  20h,  00h    ; uncompressed
+             	  db	 39h,  00h                ; compressed
+
+g_szFDLetter:	; db	"%s %c",NULL
+             	; db	 25h,  73h,  20h,  25h,  63h,  00h    ; uncompressed
+             	  db	 34h,  20h,  15h                      ; compressed
+
+g_szFloppyDrv:	; db	"Floppy Drive",NULL
+              	; db	 46h,  6ch,  6fh,  70h,  70h,  79h,  20h,  44h,  72h,  69h,  76h,  65h,  00h    ; uncompressed
+              	  db	 4ch,  72h,  75h,  76h,  76h, 0ffh,  4ah,  78h,  6fh,  7ch, 0abh                ; compressed
+
+g_szforeignHD:	; db	"Foreign Hard Disk",NULL
+              	; db	 46h,  6fh,  72h,  65h,  69h,  67h,  6eh,  20h,  48h,  61h,  72h,  64h,  20h,  44h,  69h,  73h,  6bh,  00h    ; uncompressed
+              	  db	 4ch,  75h,  78h,  6bh,  6fh,  6dh, 0f4h,  4eh,  67h,  78h, 0eah,  4ah,  6fh,  79h, 0b1h                      ; compressed
 
 
 ; Boot Menu information strings
-g_szCapacity:
- db  049h, 067h, 076h, 067h, 069h, 06fh, 07ah, 0ffh, 040h, 000h
-; source:  43h, 61h, 70h, 61h, 63h, 69h, 74h, 79h, 20h, 3Ah, 20h, 00h
-
-g_szSizeSingle:
- db  034h, 037h, 029h, 037h, 020h, 035h, 06fh, 088h
-; source:  25h, 73h, 25h, 75h, 2Eh, 25h, 75h, 20h, 25h, 63h, 69h, 42h, 00h
-
-g_szSizeDual:
- db  034h, 038h, 029h, 037h, 020h, 035h, 06fh, 0c8h, 02ah, 038h, 029h, 037h, 020h, 035h, 06fh, 048h, 01bh
-; source:  25h, 73h, 25h, 35h, 2Dh, 75h, 2Eh, 25h, 75h, 20h, 25h, 63h, 69h, 42h, 20h, 2Fh, 25h, 35h, 2Dh, 75h, 2Eh, 25h, 75h, 20h, 25h, 63h, 69h, 42h, 0Ah, 0Dh, 00h
-
-g_szCfgHeader:
- db  047h, 06ah, 06ah, 078h, 029h, 023h, 048h, 072h, 075h, 069h, 071h, 023h, 048h, 07bh, 079h, 023h, 04fh, 058h, 057h, 023h, 058h, 06bh, 079h, 06bh, 07ah, 01bh
-; source:  41h, 64h, 64h, 72h, 2Eh, B3h, 42h, 6Ch, 6Fh, 63h, 6Bh, B3h, 42h, 75h, 73h, B3h, 49h, 52h, 51h, B3h, 52h, 65h, 73h, 65h, 74h, 0Ah, 0Dh, 00h
-
-g_szCfgFormat:
- db  034h, 023h, 038h, 023h, 034h, 023h, 020h, 036h, 023h, 01ah
-; source:  25h, 73h, B3h, 25h, 35h, 2Dh, 75h, B3h, 25h, 73h, B3h, 20h, 25h, 32h, 2Dh, 49h, B3h, 25h, 35h, 2Dh, 78h, 00h
+g_szCapacity:	; db	"Capacity : ",NULL
+             	; db	 43h,  61h,  70h,  61h,  63h,  69h,  74h,  79h,  20h,  3ah,  20h,  00h    ; uncompressed
+             	  db	 49h,  67h,  76h,  67h,  69h,  6fh,  7ah, 0ffh,  40h,  00h                ; compressed
+
+g_szSizeSingle:	; db	"%s%u.%u %ciB",NULL
+               	; db	 25h,  73h,  25h,  75h,  2eh,  25h,  75h,  20h,  25h,  63h,  69h,  42h,  00h    ; uncompressed
+               	  db	 34h,  37h,  29h,  37h,  20h,  35h,  6fh,  88h                                  ; compressed
+
+g_szSizeDual:	; db	"%s%5-u.%u %ciB /%5-u.%u %ciB",LF,CR,NULL
+             	; db	 25h,  73h,  25h,  35h,  2dh,  75h,  2eh,  25h,  75h,  20h,  25h,  63h,  69h,  42h,  20h,  2fh,  25h,  35h,  2dh,  75h,  2eh,  25h,  75h,  20h,  25h,  63h,  69h,  42h,  0ah,  0dh,  00h    ; uncompressed
+             	  db	 34h,  38h,  29h,  37h,  20h,  35h,  6fh, 0c8h,  2ah,  38h,  29h,  37h,  20h,  35h,  6fh,  48h,  1bh                                                                                        ; compressed
+
+g_szCfgHeader:	; db	"Addr.",SINGLE_VERTICAL,"Block",SINGLE_VERTICAL,"Bus",  SINGLE_VERTICAL,"IRQ",  SINGLE_VERTICAL,"Reset",LF,CR,NULL
+              	; db	 41h,  64h,  64h,  72h,  2eh, 0b3h,  42h,  6ch,  6fh,  63h,  6bh, 0b3h,  42h,  75h,  73h, 0b3h,  49h,  52h,  51h, 0b3h,  52h,  65h,  73h,  65h,  74h,  0ah,  0dh,  00h    ; uncompressed
+              	  db	 47h,  6ah,  6ah,  78h,  29h,  23h,  48h,  72h,  75h,  69h,  71h,  23h,  48h,  7bh,  79h,  23h,  4fh,  58h,  57h,  23h,  58h,  6bh,  79h,  6bh,  7ah,  1bh                ; compressed
+
+g_szCfgFormat:	; db	"%s"   ,SINGLE_VERTICAL,"%5-u", SINGLE_VERTICAL,"%s",SINGLE_VERTICAL," %2-I",SINGLE_VERTICAL,"%5-x",  NULL
+              	; db	 25h,  73h, 0b3h,  25h,  35h,  2dh,  75h, 0b3h,  25h,  73h, 0b3h,  20h,  25h,  32h,  2dh,  49h, 0b3h,  25h,  35h,  2dh,  78h,  00h    ; uncompressed
+              	  db	 34h,  23h,  38h,  23h,  34h,  23h,  20h,  36h,  23h,  1ah                                                                            ; compressed
 
 
 g_szAddressingModes:					
-g_szLCHS:
- db  052h, 028h, 049h, 04eh, 099h
-; source:  4Ch, 2Dh, 43h, 48h, 53h, 00h
-
-g_szPCHS:
- db  056h, 028h, 049h, 04eh, 099h
-; source:  50h, 2Dh, 43h, 48h, 53h, 00h
-
-g_szLBA28:
- db  052h, 048h, 047h, 02ch, 011h
-; source:  4Ch, 42h, 41h, 32h, 38h, 00h
-
-g_szLBA48:
- db  052h, 048h, 047h, 02eh, 011h
-; source:  4Ch, 42h, 41h, 34h, 38h, 00h
+g_szLCHS:		; db	"L-CHS",NULL
+         		; db	 4ch,  2dh,  43h,  48h,  53h,  00h    ; uncompressed
+         		  db	 52h,  28h,  49h,  4eh,  99h          ; compressed
+
+g_szPCHS:		; db	"P-CHS",NULL
+         		; db	 50h,  2dh,  43h,  48h,  53h,  00h    ; uncompressed
+         		  db	 56h,  28h,  49h,  4eh,  99h          ; compressed
+
+g_szLBA28:		; db	"LBA28",NULL
+          		; db	 4ch,  42h,  41h,  32h,  38h,  00h    ; uncompressed
+          		  db	 52h,  48h,  47h,  2ch,  11h          ; compressed
+
+g_szLBA48:		; db	"LBA48",NULL
+          		; db	 4ch,  42h,  41h,  34h,  38h,  00h    ; uncompressed
+          		  db	 52h,  48h,  47h,  2eh,  11h          ; compressed
 
 g_szAddressingModes_Displacement equ (g_szPCHS - g_szAddressingModes)
@@ -147,51 +150,51 @@
 %endif				
 
-g_szFddUnknown:
- db  034h, 05bh, 074h, 071h, 074h, 075h, 07dh, 0b4h
-; source:  25h, 73h, 55h, 6Eh, 6Bh, 6Eh, 6Fh, 77h, 6Eh, 00h
-
-g_szFddSizeOr:
- db  034h, 02fh, 021h, 026h, 020h, 075h, 0f8h, 02dh, 022h, 026h, 020h, 04ah, 08ah
-; source:  25h, 73h, 35h, ACh, 22h, 20h, 6Fh, 72h, 20h, 33h, ABh, 22h, 20h, 44h, 44h, 00h
-
-g_szFddSize:
- db  034h, 034h, 026h, 027h, 020h, 037h, 020h, 071h, 06fh, 088h
-; source:  25h, 73h, 25h, 73h, 22h, 2Ch, 20h, 25h, 75h, 20h, 6Bh, 69h, 42h, 00h
-
-
-g_szFddThreeHalf:
- db  02dh, 002h
-; source:  33h, ABh, 00h
-
-g_szFddFiveQuarter:
- db  02fh, 001h
-; source:  35h, ACh, 00h
+g_szFddUnknown:	; db	"%sUnknown",NULL
+               	; db	 25h,  73h,  55h,  6eh,  6bh,  6eh,  6fh,  77h,  6eh,  00h    ; uncompressed
+               	  db	 34h,  5bh,  74h,  71h,  74h,  75h,  7dh, 0b4h                ; compressed
+
+g_szFddSizeOr:	; db	"%s5",ONE_QUARTER,QUOTATION_MARK," or 3",ONE_HALF,QUOTATION_MARK," DD",NULL
+              	; db	 25h,  73h,  35h, 0ach,  22h,  20h,  6fh,  72h,  20h,  33h, 0abh,  22h,  20h,  44h,  44h,  00h    ; uncompressed
+              	  db	 34h,  2fh,  21h,  26h,  20h,  75h, 0f8h,  2dh,  22h,  26h,  20h,  4ah,  8ah                      ; compressed
+
+g_szFddSize:	; db	"%s%s",QUOTATION_MARK,", %u kiB",NULL	; 3½", 1440 kiB
+            	; db	 25h,  73h,  25h,  73h,  22h,  2ch,  20h,  25h,  75h,  20h,  6bh,  69h,  42h,  00h    ; uncompressed
+            	  db	 34h,  34h,  26h,  27h,  20h,  37h,  20h,  71h,  6fh,  88h                            ; compressed
+
+
+g_szFddThreeHalf:		; db  "3",ONE_HALF,NULL
+                 		; db   33h, 0abh,  00h    ; uncompressed
+                 		  db   2dh,  02h          ; compressed
+
+g_szFddFiveQuarter:		; db  "5",ONE_QUARTER,NULL		
+                   		; db   35h, 0ach,  00h    ; uncompressed
+                   		  db   2fh,  01h          ; compressed
 
 g_szFddThreeFive_Displacement equ (g_szFddFiveQuarter - g_szFddThreeHalf)
 
 g_szBusTypeValues:		
-g_szBusTypeValues_8Dual:
- db  04ah, 031h, 000h
-; source:  44h, 38h, 20h, 00h
-
-g_szBusTypeValues_8Reversed:
- db  05eh, 031h, 000h
-; source:  58h, 38h, 20h, 00h
-
-g_szBusTypeValues_8Single:
- db  059h, 031h, 000h
-; source:  53h, 38h, 20h, 00h
-
-g_szBusTypeValues_16:
- db  020h, 02bh, 010h
-; source:  20h, 31h, 36h, 00h
-
-g_szBusTypeValues_32:
- db  020h, 02dh, 00ch
-; source:  20h, 33h, 32h, 00h
-
-g_szBusTypeValues_Serial:
- db  059h, 04bh, 098h
-; source:  53h, 45h, 52h, 00h
+g_szBusTypeValues_8Dual:		; db		"D8 ",NULL
+                        		; db		 44h,  38h,  20h,  00h    ; uncompressed
+                        		  db		 4ah,  31h,  00h          ; compressed
+
+g_szBusTypeValues_8Reversed:	; db		"X8 ",NULL
+                            	; db		 58h,  38h,  20h,  00h    ; uncompressed
+                            	  db		 5eh,  31h,  00h          ; compressed
+
+g_szBusTypeValues_8Single:		; db		"S8 ",NULL
+                          		; db		 53h,  38h,  20h,  00h    ; uncompressed
+                          		  db		 59h,  31h,  00h          ; compressed
+
+g_szBusTypeValues_16:			; db		" 16",NULL
+                     			; db		 20h,  31h,  36h,  00h    ; uncompressed
+                     			  db		 20h,  2bh,  10h          ; compressed
+
+g_szBusTypeValues_32:			; db		" 32",NULL
+                     			; db		 20h,  33h,  32h,  00h    ; uncompressed
+                     			  db		 20h,  2dh,  0ch          ; compressed
+
+g_szBusTypeValues_Serial:		; db		"SER",NULL
+                         		; db		 53h,  45h,  52h,  00h    ; uncompressed
+                         		  db		 59h,  4bh,  98h          ; compressed
 
 g_szBusTypeValues_Displacement equ (g_szBusTypeValues_8Reversed - g_szBusTypeValues)
@@ -218,37 +221,19 @@
 %endif				
 
-g_szSelectionTimeout:
- db  032h, 033h, 03dh, 059h, 06bh, 072h, 06bh, 069h, 07ah, 06fh, 075h, 0f4h, 06fh, 0f4h, 03ch, 020h, 0b9h
-; source:  C8h, B5h, 25h, 41h, 53h, 65h, 6Ch, 65h, 63h, 74h, 69h, 6Fh, 6Eh, 20h, 69h, 6Eh, 20h, 25h, 32h, 2Dh, 75h, 20h, 73h, 00h
-
-
-g_szDashForZero:
- db  028h, 000h
-; source:  2Dh, 20h, 00h
-
-StringsCompressed_NormalBase equ 58
-
-;; translated usage stats
-;; 179:8
-;; 50:2
-;; 32:33
-;; 51:3
-;; 33:1
-;; 52:1
-;; 34:3
-;; 53:2
-;; 44:1
-;; 54:1
-;; 45:3
-;; 46:4
-;; 56:5
-;; 47:1
-;; 49:1
-;; 200:1
-;; 171:2
-;; 181:1
-;; 172:2
-;; 175:1
-;; total special: 20
+g_szSelectionTimeout:	; db		DOUBLE_BOTTOM_LEFT_CORNER,DOUBLE_LEFT_HORIZONTAL_TO_SINGLE_VERTICAL,"%ASelection in %2-u s",NULL
+                     	; db		0c8h, 0b5h,  25h,  41h,  53h,  65h,  6ch,  65h,  63h,  74h,  69h,  6fh,  6eh,  20h,  69h,  6eh,  20h,  25h,  32h,  2dh,  75h,  20h,  73h,  00h    ; uncompressed
+                     	  db		 32h,  33h,  3dh,  59h,  6bh,  72h,  6bh,  69h,  7ah,  6fh,  75h, 0f4h,  6fh, 0f4h,  3ch,  20h, 0b9h                                              ; compressed
+
+
+g_szDashForZero:		; db		"- ",NULL
+                		; db		 2dh,  20h,  00h    ; uncompressed
+                		  db		 28h,  00h          ; compressed
+
+;;; end of strings.asm
+
+StringsCompressed_NormalBase     equ   58
+
+StringsCompressed_FormatsBegin   equ   20
+
 StringsCompressed_TranslatesAndFormats: 
         db     32  ; 0
@@ -272,9 +257,53 @@
         db     200  ; 18
         db     181  ; 19
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_s)    ; 20
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_c)    ; 21
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_2_I)    ; 22
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_u)    ; 23
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_5_u)    ; 24
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_x)    ; 25
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_5_x)    ; 26
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_nl)    ; 27
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_2_u)    ; 28
+        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_A)    ; 29
+
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_s || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_s > 255
+%error "DisplayFormatCompressed_Format_s is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_c || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_c > 255
+%error "DisplayFormatCompressed_Format_c is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_2_I || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_2_I > 255
+%error "DisplayFormatCompressed_Format_2_I is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_u || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_u > 255
+%error "DisplayFormatCompressed_Format_u is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_5_u || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_5_u > 255
+%error "DisplayFormatCompressed_Format_5_u is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_x || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_x > 255
+%error "DisplayFormatCompressed_Format_x is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_5_x || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_5_x > 255
+%error "DisplayFormatCompressed_Format_5_x is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_nl || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_nl > 255
+%error "DisplayFormatCompressed_Format_nl is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_2_u || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_2_u > 255
+%error "DisplayFormatCompressed_Format_2_u is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+%if DisplayFormatCompressed_BaseFormatOffset < DisplayFormatCompressed_Format_A || DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_A > 255
+%error "DisplayFormatCompressed_Format_A is out of range of DisplayFormatCompressed_BaseFormatOffset"
+%endif
+
+;; translated usage stats
+;; total translated: 
 
 ;; format usage stats
 ;; A:4
 ;; c:6
-;; s:13
+;; s:14
 ;; 2-u:1
 ;; u:5
@@ -285,20 +314,7 @@
 ;; nl:6
 ;; total format: 10
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_s)  ; 20
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_c)  ; 21
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_2_I)  ; 22
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_u)  ; 23
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_5_u)  ; 24
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_x)  ; 25
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_5_x)  ; 26
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_nl)  ; 27
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_2_u)  ; 28
-        db     (DisplayFormatCompressed_BaseFormatOffset - DisplayFormatCompressed_Format_A)  ; 29
-
-StringsCompressed_FormatsBegin   equ   20
-
 
 ;; alphabet usage stats
-;; 58,::2
+;; 58,::3
 ;; 59,;:
 ;; 60,<:
@@ -322,8 +338,8 @@
 ;; 78,N:
 ;; 79,O:1
-;; 80,P:1
+;; 80,P:2
 ;; 81,Q:1
 ;; 82,R:4
-;; 83,S:6
+;; 83,S:7
 ;; 84,T:
 ;; 85,U:1
@@ -339,24 +355,24 @@
 ;; 95,_:
 ;; 96,`:
-;; 97,a:6
+;; 97,a:7
 ;; 98,b:
 ;; 99,c:4
 ;; 100,d:4
-;; 101,e:9
+;; 101,e:10
 ;; 102,f:2
 ;; 103,g:2
 ;; 104,h:
-;; 105,i:11
+;; 105,i:12
 ;; 106,j:
 ;; 107,k:4
-;; 108,l:4
+;; 108,l:5
 ;; 109,m:1
 ;; 110,n:9
-;; 111,o:17
+;; 111,o:18
 ;; 112,p:3
 ;; 113,q:
-;; 114,r:11
+;; 114,r:13
 ;; 115,s:6
-;; 116,t:10
+;; 116,t:11
 ;; 117,u:2
 ;; 118,v:2
@@ -364,3 +380,3 @@
 ;; 120,x:
 ;; 121,y:2
-;; alphabet used_count: 39
+;; alphabet used count: 39
