Language Alphabets

view of dialog

  This version contains alphabets for the languages Deutsch (German), English, Español (Spanish), Français (French), Italiano (Italian), Русƹкий (Russian), Svenska (Swedish) and Türkçe (Turkish); punctuation, superscript/subscript, currency symbols, Roman numerals and box drawing.

  The currency symbols and box drawing sections turned out to be large projects by themselves, so I made them popup dialogs in DLLs called from Language Alphabets. (The compiled program is 71Kbytes, the box drawing DLL compiled to 72Kbytes and currency symbols DLL a wopping 92Kbytes.) By using explicit loading the DLLs are completely optional. The program will run without the DLLs, unlike with implicit loading. If either is selected and the DLL(s) is/are not present a message box will inform, and something else may be selected.

Downloads

Get the first zip file if you just want use it. To compile it yourself, get the second and third zip files for source code and icons.
Compiled program download contains LanguageAlphabetsW.exe, CurrencyPopup.dll and BoxDrawPopup.dll .
Source code download contains LanguageAlphabetsWin2.bas
Optional icons download contains . .

Source Code

  The code is shown for those just wanting to read it, or for copy/paste if virus scanner blocks downloading of ZIP files containing dot BAS files.

  This version compiles "as is" in PowerBASIC For Windows version 10. The largest difficulty modifying for earlier versions of PowerBASIC is moving data in ASMDATA blocks to DATA blocks inside procedures (FUNCTION or SUB) and pointers to indexes for READ$.

Viewable code for the popups at Currency Popup and Box Drawing Popup. Moved because they made this page too long.

For main program
#dim all
#compile exe "LanguageAlphabetsW.exe"
%unicode = 1
'$DecKeyFmt = "* ####0 " 'no DEC$ in PBWin9, this is mask for FORMAT$
global gLetterLines(), gLttrValLines() as wstring 'gLangNameLines(),
global gLangCode as wstring * 2
global gDecimalSel, gDeskUntX, gDeskUntY as long
global pgLangCode as dword ptr
global ghFixedFont as dword
global gDeskUntX, gDeskUntY as long
#resource icon, 101, "KeyBd.ico"
'-------------------------------------------------------------------------------
declare sub CrncySymbolsDlg (byval ghParent as dword, _
                                         byval ParentPosX as long, _
                                         byval ParentPosY as long, _
                                         byval ParentSzX as long, _
                                         byval ParentSzY as long)
'===============================================================================
sub ReadLettersAndVals(byval hParent as dword)
  local pData, hCrncyDLL, pCrncySymbl as dword
  local TmpLetter, TmpVal as wstring
  local LetterCnt, LetterNum, LineNum, LineCnt, Clmn as long
  local DlgPosX, DlgPosY, DlgSzX, DlgSzY as long
  'pointer to data block for language  . . . . . . . . . . . . . . . . . . . . .
  select case as const$$ gLangCode
    case "de"$$ 'German
      pData = codeptr(DE)
    case "el"$$ 'Greek (modern)
      pData = codeptr(EL)
    case "en"$$ 'English
      pData = codeptr(EN)
    case "es"$$ 'Spanish
      pData = codeptr(ES)
    case "fr"$$ 'French
      pData = codeptr(FR)
    case "it"$$ 'Italian
      pData = codeptr(IT)
    case "ru"$$ 'Russian
      pData = codeptr(RU)
    case "sv"$$ 'Swedish
      pData = codeptr(SV)
    case "tr"$$ 'Turkish
      pData = codeptr(TR)
    case "x1"$$ 'Punctuation
      pData = codeptr(X1)
    case "x2"$$ 'Super/Sub Script numbers
      pData = codeptr(X2)
    case "x3"
      import addr "CrncySymDlg", "CurrencyPopup.dll" to pCrncySymbl, hCrncyDLL
      'CurSymbols(hParent, ghFixedFont)
      if hCrncyDLL = 0 then
        msgbox "Problem opening currency symbol DLL.", _
           %mb_ok or %mb_iconerror or %mb_taskmodal, "DLL Error"
        exit sub
      elseif pCrncySymbl = 0 then
        msgbox "Problem finding currency symbol dialog SUB in DLL.", _
           %mb_ok or %mb_iconerror or %mb_taskmodal, "DLL Error"
        exit sub
      else
        dialog get loc hParent to DlgPosX, DlgPosY
        dialog get size hParent to DlgSzX, DlgSzY
        call dword pCrncySymbl using CrncySymbolsDlg(hParent, DlgPosX, DlgPosY, _
                                                              DlgSzX, DlgSzY)
        import close hCrncyDLL
      end if
      exit sub
    case "x5"
      pData = codeptr(X5)
    case "x9"$$ 'Box Drawing
      import addr "DrawCharDlg", ".\BoxDrawPopup.dll" to pCrncySymbl, hCrncyDLL
      if hCrncyDLL = 0 then
        msgbox "Problem opening box drawing DLL.", _
           %mb_ok or %mb_iconerror or %mb_taskmodal, "DLL Error"
        exit sub
      elseif pCrncySymbl = 0 then
        msgbox "Problem finding box drawing dialog SUB in DLL.", _
           %mb_ok or %mb_iconerror or %mb_taskmodal, "DLL Error"
        exit sub
      else
        dialog get loc hParent to DlgPosX, DlgPosY
        dialog get size hParent to DlgSzX, DlgSzY
        call dword pCrncySymbl using CrncySymbolsDlg(hParent, DlgPosX, DlgPosY, _
                                                              DlgSzX, DlgSzY)
        import close hCrncyDLL
      end if
      exit sub


    case else
      #if %def(%pb_cc32)
        con.color 12, -1, 5 : print "Error";
        print " The language code you entered, " + $$dq + gLangCode + $$dq;
        print ", is not supported."
        con.color 12, -1, 5 : print "Error";
        print
        con.color 12, -1, 5 : print "Error";
        print " Or, there was an entry error."
      #else
        msgbox "The language code you entered, " + $$dq + gLangCode + $$dq + _
               ", is not supported." + $$crlf + _
               "Or, there was an entry error.", _
               %mb_ok or %mb_iconerror or %mb_taskmodal, "Language Error"
      #endif
      exit sub
  end select
  LetterCnt = (peek(long, pData)) '- 1 '
  LineCnt = LngDivCeil( LetterCnt, 8)
  '. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  reset gLetterLines()
  reset gLttrValLines()
  dim gLetterLines(LineCnt * 2 )
  dim gLttrValLines(LineCnt  * 2)
  LineNum = 1
  pData += 4  'pointer to first letter
  'read letters and put value "under" them
  for LetterNum = 0 to LetterCnt - 1
    TmpLetter = peek$$(pData, 1)
    Clmn = LetterNum mod 8
    if Clmn = 0 then
      gLetterLines(LineNum) += string$$( 5, $$spc) + TmpLetter
      if gDecimalSel then
        TmpVal = dec$(asc(TmpLetter),-5, 0, 0)
        gLttrValLines(LineNum) += string$$(2, $$spc) + TmpVal
      else 'is hex
        TmpVal = hex$(asc(TmpLetter), 4)
        gLttrValLines(LineNum) += string$$(3, $$spc) + TmpVal
      end if
    else '1, 2, 3, 4, 5, 6 and 7
      gLetterLines(LineNum) += string$$( 8, $$spc) + TmpLetter
      if gDecimalSel then
        TmpVal = dec$(asc(TmpLetter),-5, 0, 0)
        gLttrValLines(LineNum) += string$$(4, $$spc) + TmpVal
      else 'is hex
        TmpVal = hex$(asc(TmpLetter), 4)
        gLttrValLines(LineNum) += string$$(5, $$spc) + TmpVal
      end if
    end if
    if clmn = 7 then incr LineNum
    pData += 2
  next
  incr LineNum
 ' for LetterNum = LetterCnt - 2 to (LetterCnt * 2) - 3
   for LetterNum = 0 to LetterCnt - 1
    TmpLetter = peek$$(pData, 1)
    Clmn = LetterNum mod 8
    if Clmn = 0 then
      gLetterLines(LineNum) += string$$( 5, $$spc) + TmpLetter
      if gDecimalSel then
        TmpVal = dec$(asc(TmpLetter),-5, 0, 0)
        gLttrValLines(LineNum) += string$$(2, $$spc) + TmpVal
      else 'is hex
        TmpVal = hex$(asc(TmpLetter), 4)
        gLttrValLines(LineNum) += string$$(3, $$spc) + TmpVal
      end if
    else '1, 2, 3, 4, 5, 6 and 7
      gLetterLines(LineNum) += string$$( 8, $$spc) + TmpLetter
      if gDecimalSel then
        TmpVal = dec$(asc(TmpLetter),-5, 0, 0)
        gLttrValLines(LineNum) += string$$(4, $$spc) + TmpVal
      else 'is hex
        TmpVal = hex$(asc(TmpLetter), 4)
        gLttrValLines(LineNum) += string$$(5, $$spc) + TmpVal
      end if
    end if
    if clmn = 7 then incr LineNum
    pData += 2
  next

end sub
'

'.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
'In BASIC code this would take 2 divides (a "\" and a "MOD"), and a CEIL, plus
'some "glue" code to do as integer.
'This way uses 1 divide, and the CEIL becomes part of the "glue" code.
'In this program the negative value tests are not needed, but lets you copy
'the FASTPROC "as is" to use elsewhere. (no need to understand assembly if
'you don't want to.)
fastproc LngDivCeil(byval Dividend as long, byval Divisor as long) as long
  ! push eax
  ! push edx
  ! xor edx, edx      'clear, upper 32 bits of dividend not used
  ! mov eax, Dividend '
  ! bt  eax, 31       'bit 31 "1" for negative dividend
  ! jnc DvdndNotNeg   'if dividend negative set edx to
    ! not edx         'all "1"s for 2's complement
  ! DvdndNotNeg:
  ! idiv Divisor      'the divide
  ! cmp edx, 0        'test for remainder (fraction if we were doing floating)
  ! jz NoRemainder
    ! bt  eax, 31     'do not increament for negative with remainder
    ! jc NoRemainder  'if positive quotient and nonzero remainder, then
      ! inc eax       'increament quotient
  ! NoRemainder:
  ! mov Divisor, eax  'register to memory for fastproc return
  ! pop edx
  ! pop eax
end fastproc = Divisor
' List of ISO 639-1 codes (to ID languages)

'===============================================================================
%ID_LangLstLbl    = 1000
%ID_LangLstCmboBx = 1001
%ID_ValOptFrm     = 1002
%ID_DecimalOptBtn = 1003
%ID_HexOptBtn     = 1004
%ID_AlphbtTxtBx   = 1005
'-------------------------------------------------------------------------------
sub DispNamesAndVals(byval hMainDlg as dword)
  local DispStr as wstring
  local LineNum as long
    for LineNum = 1 to ubound(gLetterLines())
      DispStr += gLetterLines(LineNum) + $$crlf + _
                 gLttrValLines(LineNum) + $$crlf + _
                 string$$(2, $$spc) + string$$(69,"-") + $$crlf
    next
  control set text hMainDlg, %ID_AlphbtTxtBx, DispStr
end sub
'-------------------------------------------------------------------------------

sub DoLangNames(byval hMainDlg as dword)
  local pData as dword
  local LangName as wstring
  local LangCnt, LangNameLen, LineNum as long

  pData = codeptr(LANG_LST)
  LangCnt = peek(long, pData)
  pData += 4
  for LineNum = 1 to LangCnt
    LangNameLen = peek(word, pData)
    pData += 2
    LangName = peek$$(pData, LangNameLen)
    pData += (LangNameLen * 2)
    combobox add hMainDlg, %ID_LangLstCmboBx, LangName
  next

end sub
'-------------------------------------------------------------------------------
callback function MainDlgCB() as long
  local TmpStr as wstring
  static hCrncyPop as dword
  select case as long cb.msg
    case %wm_initdialog
      DoLangNames cb.hndl
    case %wm_command
      select case as long cb.ctl
        case %ID_DecimalOptBtn
          if cb.ctlmsg = %bn_clicked or cb.ctlmsg = %bn_hilite then
            gDecimalSel = -1
                   'cb.ctl is lo word of w, cb.ctlmsg is hi word of w
            dialog post cb.hndl, %wm_command, _
                                 mak(dword, lo(word, %ID_LangLstCmboBx), _
                                            lo(word, %cbn_selendok)), 0
          end if '-  -  -  -  -  -  -  -  -
        case %ID_HexOptBtn
          if cb.ctlmsg = %bn_clicked then
            gDecimalSel = 0
            dialog post cb.hndl, %wm_command, _
                                 mak(dword, lo(word, %ID_LangLstCmboBx), _
                                            lo(word, %cbn_selendok)), 0
          end if '-  -  -  -  -  -  -  -  -
        case %ID_LangLstCmboBx
          if cb.ctlmsg = %cbn_selendok then
            control get text cb.hndl, %ID_LangLstCmboBx to TmpStr
            gLangCode = right$(TmpStr, 2)
            @pgLangCode = @pgLangCode or &h00200020???
            ReadLettersAndVals cb.hndl
            DispNamesAndVals(cb.hndl)
          end if
      end select
   ' case %UM_CrncyPop
    '  if cb.wparam = (%USC_Handle and &hFFFF0000) then
     '   hCrncyPop = cb.lparam
     ' end if
  end select
end function
'-------------------------------------------------------------------------------
function MainDlg() as long
  local hMainDlg as dword
  local DeskPxlX, DeskPxlY as long
  dialog default font "Microsoft Sans Serif", 12, 0, 1
  font new "Consolas", 12,0 , 1, 0, 0 to ghFixedFont
  dialog new 0, "Alphabets Of (Some) Languages In Unicode", , , 341, 173, _
     %ds_3dlook or %ds_modalframe or %ds_nofailcreate or %ds_setfont or _
     %ws_caption or %ws_clipsiblings or %ws_dlgframe or %ws_minimizebox or _
     %ws_popup or %ws_sysmenu, _
     %ws_ex_left or %ws_ex_ltrreading or %ws_ex_rightscrollbar       to hMainDlg

  desktop get client to DeskPxlX, DeskPxlY
  dialog pixels hMainDlg, DeskPxlX, DeskPxlY to units gDeskUntX, gDeskUntY
  #if %pb_revision = &h1004
    swap gDeskUntX, gDeskUntY
  #endif
  dialog set loc hMainDlg, gDeskUntX - 344, gDeskUntY - 185
  dialog set icon hMainDlg, "#101"
  dialog set color hMainDlg, -1, &h00B0B0B0&
  control add label, hMainDlg, %ID_LangLstLbl, "Language Select", 5, 1, 70, 11
  control set color hMainDlg, %ID_LangLstLbl, -1, &h00B0B0B0&
  control add combobox, hMainDlg, %ID_LangLstCmboBx,  , 3, 11, 152, 60, _
     %cbs_disablenoscroll or %cbs_dropdownlist or %ws_tabstop or %ws_vscroll, _
     %ws_ex_clientedge or  %ws_ex_left


  control add frame, hMainDlg, %ID_ValOptFrm, "Unicode Letter Value Options", _
     158, 1, 180, 24
  control set color hMainDlg, %ID_ValOptFrm, -1, &h00B0B0B0&

  control add option, hMainDlg, %ID_DecimalOptBtn, "Values In Decimal", _
     161, 10, 85, 12, %bs_vcenter or %ws_group or %ws_tabstop, %ws_ex_left
  control set color hMainDlg, %ID_DecimalOptBtn, -1, &h00B0B0B0&
  control add option, hMainDlg, %ID_HexOptBtn, "Values In Hexadecimal", _
     249, 10, 85, 12
  control set color hMainDlg, %ID_HexOptBtn, -1, &h00B0B0B0&


  control set option hMainDlg, %ID_HexOptBtn, %ID_DecimalOptBtn, %ID_HexOptBtn
  control add textbox, hMainDlg, %ID_AlphbtTxtBx, "", 3, 28, 335, 142, _
     %es_left or %es_multiline or %es_readonly or %ws_border or %ws_tabstop or _
     %ws_vscroll or %ws_group, %ws_ex_clientedge or %ws_ex_left
  control set font hMainDlg, %ID_AlphbtTxtBx, ghFixedFont
  control set color hMainDlg, %ID_AlphbtTxtBx, -1, &h00E0E0E0&
  '
  dialog show modal hMainDlg call MainDlgCB
  font end ghFixedFont
end function

'===============================================================================
'= Main function (starts dialog/callback for GUI, or Console control loop)======

function pbmain () as long
  pgLangCode = varptr(gLangCode)
  #if %def(%pb_cc32)
    local CmdVal as long
    CmdVal = 3
    ConsoleControlLoop(CmdVal)
  #else
    MainDlg
  #endif
end function

'= Data area ===================================================================
'   ....................     ....................     ....................
'    x        x        x        x        x        x        x        x
'*.....##**.....##**.....##**.....##**.....##**.....##**.....##**.....##
'**....##***....##***....##***....##***....##***....##***....##***....##

'- Alphbet Data  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
asmdata LANG_LST
  dd 14& 'count of included languages
  dw 12??, "Deutsch - de"
  dw 28??, chr$$( &h0395??, &h03BB??, &h03BB??, &h03B7??, &h03BD??, &h03B9??)
  dw       chr$$( &h03BA??, &h03AC??), " (modern Greek) - el"
  dw 12??, "English - en"
  dw 12??, "Español - es"
  dw 13??, "Français - fr" '  français
  dw 13??, "Italiano - it"
  dw 12??, chr$$(&h420, &h443, &h441, &h441, &h43A, &h438, &h439) + " - ru"
  dw 12??, "Svenska - sv"
  dw 11??, "Türkçe - tr"
  dw 16??, "Punctuation - x1"
  dw 20??, "Super/Sub Sript - x2"
  dw 13??, "Currency - x3"
  dw 19??, "Roman numerals - x5"
  dw 16??, "Box Drawing - x9"
end asmdata
asmdata DE 'German
  dd 30& 'number of letters
  'upper case
  dw "A"$$, "B"$$, "C"$$, "D"$$, "E"$$, "F"$$, "G"$$, "H"$$, "I"$$, "J"$$
  dw "K"$$, "L"$$, "M"$$, "N"$$, "O"$$, "P"$$, "Q"$$, "R"$$, "S"$$, "T"$$
  dw "U"$$, "V"$$, "W"$$, "X"$$, "Y"$$, "Z"$$
  dw chr$$(196), chr$$(214), chr$$(220), chr$$(7838)
  'lower case
  dw "a"$$, "b"$$, "c"$$, "d"$$, "e"$$, "f"$$, "g"$$, "h"$$, "i"$$, "j"$$
  dw "k"$$, "l"$$, "m"$$, "n"$$, "o"$$, "p"$$, "q"$$, "r"$$, "s"$$, "t"$$
  dw "u"$$, "v"$$, "w"$$, "x"$$, "y"$$, "z"$$
  dw chr$$(228), chr$$(246), chr$$(252), chr$$(223)
end asmdata
asmdata EL 'Modern Greek
  '(Greek has one upper character with two lower case versions of that
  'character. The second lower case character is only used as last letter of a
  'word. Therefore, one empty position in upper case.)
  dd 25& 'number of letters
  'upper case
  dw chr$$(&h0391??, &h0392??, &h0393??, &h0394??, &h0395??, &h0396??)
  dw chr$$(&h0397??, &h0398??, &h0399??, &h039A??)
  dw chr$$(&h039B??, &h039C??, &h039D??, &h039E??, &h039F??, &h03A0??)
  dw chr$$(&h03A1??, &h03A3??), $$spc, chr$$(&h03A4??)
  dw chr$$(&h03A5??, &h03A6??, &h03A7??, &h03A8??, &h03A9??)
  'lower case
  dw chr$$(&h03B1??, &h03B2??, &h03B3??, &h03B4??, &h03B5??, &h03B6??)
  dw chr$$(&h03B7??, &h03B8??, &h03B9??, &h03BA??)
  dw chr$$(&h03BB??, &h03BC??, &h03BD??, &h03BE??, &h03BF??, &h03C0??)
  dw chr$$(&h03C1??, &h03C3??, &h03C2??, &h03C4??)
  dw chr$$(&h03C5??, &h03C6??, &h03C7??, &h03C8??, &h03C9??)
end asmdata
asmdata EN 'English
  dd 26& 'number of letters
  'upper case
  dw "A"$$, "B"$$, "C"$$, "D"$$, "E"$$, "F"$$, "G"$$, "H"$$, "I"$$, "J"$$
  dw "K"$$, "L"$$, "M"$$, "N"$$, "O"$$, "P"$$, "Q"$$, "R"$$, "S"$$, "T"$$
  dw "U"$$, "V"$$, "W"$$, "X"$$, "Y"$$, "Z"$$
  'lower case
  dw "a"$$, "b"$$, "c"$$, "d"$$, "e"$$, "f"$$, "g"$$, "h"$$, "i"$$, "j"$$
  dw "k"$$, "l"$$, "m"$$, "n"$$, "o"$$, "p"$$, "q"$$, "r"$$, "s"$$, "t"$$
  dw "u"$$, "v"$$, "w"$$, "x"$$, "y"$$, "z"$$
end asmdata


asmdata ES 'Spanish
  dd 33& 'number of letters
  'upper case
  '   A         A'          B      C      D      E          E'         F
  dw "A"$$, chr$$(&hC1??), "B"$$, "C"$$, "D"$$, "E"$$, chr$$(&hC9??), "F"$$
  '   G      H      I           I'         J     K      L      M      N
  dw "G"$$, "H"$$, "I"$$, chr$$(&hCD??), "J"$$, "K"$$, "L"$$, "M"$$, "N"$$
  '       N~        O           O'        P      Q      R      S      T
  dw chr$$(&hD1??), "O"$$, chr$$(&hD3??), "P"$$, "Q"$$, "R"$$, "S"$$, "T"$$
  '     U          U'             U..        V      W      X      Y      Z
  dw "U"$$, chr$$(&hDA??), chr$$(&hDC??), "V"$$, "W"$$, "X"$$, "Y"$$, "Z"$$
  'upside down ?
  dw chr$$(&hBF??)
  'lower case
  '   a          a'         b      c      d      e          e'        f
  dw "a"$$, chr$$(&hE1??), "b"$$, "c"$$, "d"$$, "e"$$, chr$$(&hE9??), "f"$$
  '   g       h     i          i'         j      k      l       m     n
  dw "g"$$, "h"$$, "i"$$, chr$$(&hED??), "j"$$, "k"$$, "l"$$, "m"$$, "n"$$
  '        n~        o          o'         p      q      r      s      t
  dw chr$$(&hF1??), "o"$$, chr$$(&hF3??), "p"$$, "q"$$, "r"$$, "s"$$, "t"$$
  '   u           u'            u..        v      w      x      y      z
  dw "u"$$, chr$$(&hFA??), chr$$(&hFC??), "v"$$, "w"$$, "x"$$, "y"$$, "z"$$
  'upside down !
  dw chr$$(&hA1??)
end asmdata


asmdata FR
  dd 41& 'number of letters
  'upper case
  dw "A"$$, chr$$(&hC0??, &hC2??, &hC6??), "B"$$, "C"$$, chr$$(&hC7??), "D"$$
  dw "E"$$, chr$$(&hC9??)
  '10
  dw chr$$(&hC8??, &hCA??, &hCB??), "G"$$, "H"$$, "I"$$, chr$$(&hCE??, &hCF??)
  dw "J"$$, "K"$$
  '20
  dw "L"$$, "M"$$, "N"$$, "O"$$, chr$$(&hD4??, &h0152??), "P"$$, "Q"$$, "R"$$
  dw "S"$$
  '30
  dw "T"$$, "U"$$, chr$$(&hD9??, &hDB??, &hDC??), "V"$$, "W"$$, "X"$$, "Y"$$
  dw chr$$(&h0178??)
  '40
  dw "Z"$$ '41
  'lower case
  dw "a"$$, chr$$(&hE0??, &hE2??, &hE6??), "b"$$, "c"$$, chr$$(&hE7??), "d"$$
  dw "e"$$, chr$$(&hE9??)
  dw chr$$(&hE8??, &hEA??, &hEB??), "g"$$, "h"$$, "i"$$, chr$$(&hEE??, &hEF??)
  dw "j"$$, "k"$$
  dw "l"$$, "m"$$, "n"$$, "o"$$, chr$$(&hF4??, &h0153??), "p"$$, "q"$$, "r"$$
  dw "s"$$
  dw "t"$$, "u"$$, chr$$(&hF9??, &hFB??, &hFC??), "v"$$, "w"$$, "x"$$, "y"$$
  dw chr$$(&hFF??)
  dw "z"$$
end asmdata
asmdata IT 'Italian
  dd 31& 'letter count
  'upper case
  dw chr$$(&h0041??, &h00C0??, &h0042??, &h0043??, &h0044??, &h0045??)
  dw chr$$(&h00C8??, &h00C9??, &h0046??, &h0047??)
  dw chr$$(&h0048??, &h0049??, &h00CC??, &h00CD??, &h00CE??, &h004C??)
  dw chr$$(&h004D??, &h004E??, &h004F??, &h00D2??)
  dw chr$$(&h00D3??, &h0050??, &h0051??, &h0052??, &h0053??, &h0054??)
  dw chr$$(&h0055??, &h00D9??, &h00DA??, &h0056??)
  dw chr$$(&h005A??)
  'lower case
  dw chr$$(&h0061??, &h00E0??, &h0062??, &h0063??, &h0064??, &h0065??)
  dw chr$$(&h00E8??, &h00E9??, &h0066??, &h0067??)
  dw chr$$(&h0068??, &h0069??, &h00EC??, &h00ED??, &h00EE??, &h006C??)
  dw chr$$(&h006D??, &h006E??, &h006F??, &h00F2??)
  dw chr$$(&h00F3??, &h0070??, &h0071??, &h0072??, &h0073??, &h0074??)
  dw chr$$(&h0075??, &h00F9??, &h00FA??, &h0076??)
  dw chr$$(&h007A??)
end asmdata
asmdata RU 'Russian
  dd 33& 'letter count
  'upper case
  dw chr$$(&h0410??, &h0411??, &h0412??, &h0413??, &h0414??, &h0415??)
  dw chr$$(&h0401??, &h0416??, &h0417??, &h0418??)
  dw chr$$(&h0419??, &h041A??, &h041B??, &h041C??, &h041D??, &h041E??)
  dw chr$$(&h041F??, &h0420??, &h0421??, &h0422??)
  dw chr$$(&h0423??, &h0424??, &h0425??, &h0426??, &h0427??, &h0428??)
  dw chr$$(&h0429??, &h042A??, &h042B??, &h042C??)
  dw chr$$(&h042D??, &h042E??, &h042F??)
  'lower case
  dw chr$$(&h0430??, &h0431??, &h0432??, &h0433??, &h0434??, &h0435??)
  dw chr$$(&h0451??, &h0436??, &h0437??, &h0438??)
  dw chr$$(&h0419??, &h043A??, &h043B??, &h043C??, &h043D??, &h043E??)
  dw chr$$(&h043F??, &h0440??, &h0441??, &h0442??)
  dw chr$$(&h0443??, &h0444??, &h0445??, &h0446??, &h0447??, &h0448??)
  dw chr$$(&h0449??, &h044A??, &h044B??, &h044C??)
  dw chr$$(&h044D??, &h044E??, &h044F??)
end asmdata
asmdata SV 'Swedish
  dd 29& 'number of letters
  'upper case
  dw "A"$$, "B"$$, "C"$$, "D"$$, "E"$$, "F"$$, "G"$$, "H"$$, "I"$$, "J"$$
  dw "K"$$, "L"$$, "M"$$, "N"$$, "O"$$, "P"$$, "Q"$$, "R"$$, "S"$$, "T"$$
  dw "U"$$, "V"$$, "W"$$, "X"$$, "Y"$$, "Z"$$, chr$$(197), chr$$(196)
  dw chr$$(214)
  'lower case
  dw "a"$$, "b"$$, "c"$$, "d"$$, "e"$$, "f"$$, "g"$$, "h"$$, "i"$$, "j"$$
  dw "k"$$, "l"$$, "m"$$, "n"$$, "o"$$, "p"$$, "q"$$, "r"$$, "s"$$, "t"$$
  dw "u"$$, "v"$$, "w"$$, "x"$$, "y"$$, "z"$$, chr$$(229), chr$$(228)
  dw chr$$(246)
end asmdata

asmdata TR 'Turkish
  dd 29& 'number of letters
  'upper case
  dw "A"$$, "B"$$, "C"$$, chr$$(199), "D"$$, "E"$$, "F"$$, "G"$$, chr$$(286)
  dw "H"$$
  dw chr$$(73), chr$$(304), "J"$$, "K"$$, "L"$$, "M"$$, "N"$$, "O"$$
  dw chr$$(214), "P"$$
  dw "R"$$, "S"$$, chr$$(350), "T"$$, "U"$$, chr$$(220), "V"$$, "Y"$$, "Z"$$
  'lower case
  dw "a"$$, "b"$$, "c"$$, chr$$(231), "d"$$, "e"$$, "f"$$, "g"$$, chr$$(287)
  dw "h"$$
  dw chr$$(305), chr$$(105), "j"$$, "k"$$, "l"$$, "m"$$, "n"$$, "o"$$
  dw chr$$(246), "p"$$
  dw "r"$$, "s"$$, chr$$(351), "t"$$, "u"$$, chr$$(252), "v"$$, "y"$$, "z"$$
end asmdata
'-------------------------------------------------------------------------------
asmdata X1 'Punctuation
  dd 30& 'number of characters
  'treat as upper case for display code
  '          spc      !       "      #        %       &       '       (
  dw chr$$(&h0020, &h0021, &h0022, &h0023, &h0025, &h0026, &h0027, &h0028)
  '            )      *       +       ,       -       .       /       :
  dw chr$$(&h0029, &h002A, &h002B, &h002C, &h002D, &h002E, &h002F, &h003A)
  '           ;       <       =        >      ?       @       [       \
  dw chr$$(&h003B, &h003C, &h003D, &h003E, &h003F, &h0040, &h005B, &h005C)
  '           ]       ^       _       `        {      |
  dw chr$$(&h005D, &h005E, &h005F, &h0060, &h007B, &h007C)
  'treat as lower case for display code
  '           }       ~      nbsp     ¡       ¦       §      ¨        ©
  dw chr$$(&h007D, &h007E, &h00A0, &h00A1, &h00A6, &h00A7, &h00A8, &h00A9)
  '           ª       «       ¬    s hypn,    ®       ¯       °       ±
  dw chr$$(&h00AA, &h00AB, &h00AC, &h00AD, &h00AE, &h00AF, &h00B0, &h00B1)
  '           ´       µ       ¶       ·       ¸       º       »       ¿
  dw chr$$(&h00B4, &h00B5, &h00B6, &h00B7, &h00B8, &h00BA, &h00BB, &h00BF)
  '           ×       ÷    bullet  dagger  d daggr  dbl !
  dw chr$$(&h00D7, &h00F7, &h2022, &h2020, &h2021, &h203C)
end asmdata
'#endif  #if 0
'-------------------------------------------------------------------------------
asmdata X2 'Superscript and subscript numbers
  dd 15&
  'Superscripts
  '         sup 0   sup 1   sup 2   sup 3   sup 4    sup 5   sup 6  sup 7
  dw chr$$(&h2070, &h00B9, &h00B2, &h00B3, &h2074, &h2075, &h2076, &h2077)
  '         sup 8   sup 9   sup +   sup -   sup =   sup (   sup )
  dw chr$$(&h2078, &h2079, &h207A, &h207B, &h207C, &h207D, &h207E)
  'Subscripts
  '         sub 0   sub 1   sub 2   sub 3   sub 4   sub 5   sub 6   sub 7
  dw chr$$(&h2080, &h2081, &h2082, &h2083, &h2084, &h2085, &h2086, &h2087)
  '         sub 8   sub 9   sub +   sub -   sub =   sub (   sub )
  dw chr$$(&h2088, &h2089, &h208A, &h208B, &h208C, &h208D, &h208E)
end asmdata
'-------------------------------------------------------------------------------
'X3 for Currency symbols uses a separate "popup" dialog.
'X4 and X6 to X8 are reserved.
'-------------------------------------------------------------------------------
asmdata X5 'Roman numerals
  dd 16&
  'Upper case
  '           I       II     III     IV       V      VI      VII    VIII
  dw chr$$(&h2160, &h2161, &h2162, &h2163, &h2164, &h2165, &h2166, &h2167)
  '           IX      X      XI      XII      L      C        D      M
  dw chr$$(&h2168, &h2169, &h216A, &h216B, &h216C, &h216D, &h216E, &h216F)
  'lower case
  '           i       ii     iii     iv       v      vi      vii    viii
  dw chr$$(&h2170, &h2171, &h2172, &h2173, &h2174, &h2175, &h2176, &h2177)
  '           ix      x      xi      xii      l       c       d       m
  dw chr$$(&h2178, &h2179, &h217A, &h217B, &h217C, &h217D, &h217E, &h217F)

end asmdata
asmdata X9 'Box Drawing
  dd 64& 'number of letters
  'treat as upper case for display code
  dw chr$$(&h2500,&h2501,&h2502,&h2503,&h2504,&h2505,&h2506,&h2507,&h2508,&h2509)
  dw chr$$(&h250A,&h250B,&h250C,&h250D,&h250E,&h250F,&h2510,&h2511,&h2512,&h2513)
  dw chr$$(&h2514,&h2515,&h2516,&h2517,&h2518,&h2519,&h251A,&h251B,&h251C,&h251D)
  dw chr$$(&h251E,&h251F,&h2520,&h2521,&h2522,&h2523,&h2524,&h2525,&h2526,&h2527)
  dw chr$$(&h2528,&h2529,&h252A,&h252B,&h252C,&h252D,&h252E,&h252F,&h2530,&h2531)
  dw chr$$(&h2532,&h2533,&h2534,&h2535,&h2536,&h2537,&h2538,&h2539,&h253A,&h253B)
  dw chr$$(&h253C,&h253D,&h253E,&h253F)
  'treat as lower case for display code
  dw chr$$(&h2540,&h2541,&h2542,&h2543,&h2544,&h2545,&h2546,&h2547,&h2548,&h2549)
  dw chr$$(&h254A,&h254B,&h254C,&h254D,&h254E,&h254F,&h2550,&h2551,&h2552,&h2553)
  dw chr$$(&h2554,&h2555,&h2556,&h2557,&h2558,&h2559,&h255A,&h255B,&h255C,&h255D)
  dw chr$$(&h255E,&h255F,&h2560,&h2561,&h2562,&h2563,&h2564,&h2565,&h2566,&h2567)
  dw chr$$(&h2568,&h2569,&h256A,&h256B,&h256C,&h256D,&h256E,&h256F,&h2570,&h2571)
  dw chr$$(&h2572,&h2573,&h2574,&h2575,&h2576,&h2577,&h2578,&h2579,&h257A,&h257B)
  dw chr$$(&h257C,&h257D,&h257E,&h257F,&h2580,&h2581,&h2532,&h2533,&h2534,&h2535)
  dw chr$$(&h2536,&h2537,&h2538,&h2539)
end asmdata
'
'

Created on 25 Aug 2021; last edit 19 Oct 2021