   10REM > SAA505Xlib
   20REM A library for switching the MODE 7 language settings as per the
   30REM SAA505X family of Teletext character generators from Mullard.
   40REM Currently the supported codes are: 0 / 5050: English (default),
   50REM 1 / 5051: German, 2 / 5052: Swedish, 3 / 5053: Italian,
   60REM 4 / 5054: Belgian, 5 / 5055: US ASCII, 6 / 5056: Hebrew and
   70REM 7 / 5057: Cyrillic
   80DEFPROCsaa505xlibset(code%, alt%)
   90LOCAL loop%, j%
  100j%=0: IF alt% THEN j%=128
  110SYS "OS_Byte",42,1
  120PROCsaa505xreset(alt%,0)
  130CASE code% OF
  140WHEN 0,5050: REM English, default
  150WHEN 1,5051: REM German
  160   PROCsaa505xr(&23,j%+&23,1): PROCsaa505xr(&A7,j%+&40,1): PROCsaa505xr(&C4,j%+&5B,1): PROCsaa505xr(&D6,j%+&5C,1)
  170   PROCsaa505xr(&DC,j%+&5D,1): PROCsaa505xr(&5E,j%+&5E,1): PROCsaa505xr(&5F,j%+&5F,1): PROCsaa505xr(&B0,j%+&60,1)
  180   PROCsaa505xr(&E4,j%+&7B,1): PROCsaa505xr(&F6,j%+&7C,1): PROCsaa505xr(&FC,j%+&7D,1): PROCsaa505xr(&DF,j%+&7E,1)
  190WHEN 2,5052: REM Swedish
  200   PROCsaa505xr(&23,j%+&23,1): PROCsaa505xr(&A4,j%+&24,1): PROCsaa505xr(&C9,j%+&40,1): PROCsaa505xr(&C4,j%+&5B,1)
  210   PROCsaa505xr(&D6,j%+&5C,1): PROCsaa505xr(&C5,j%+&5D,1): PROCsaa505xr(&DC,j%+&5E,1): PROCsaa505xr(&5F,j%+&5F,1)
  220   PROCsaa505xr(&E9,j%+&60,1): PROCsaa505xr(&E4,j%+&7B,1): PROCsaa505xr(&F6,j%+&7C,1): PROCsaa505xr(&E5,j%+&7D,1)
  230   PROCsaa505xr(&FC,j%+&7E,1)
  240WHEN 3,5053: REM Italian
  250   PROCsaa505xr(&E9,j%+&40,1): PROCsaa505xr(&B0,j%+&5B,1): PROCsaa505xr(&E7,j%+&5C,1): PROCsaa505xr(&D9,j%+&60,1)
  260   PROCsaa505xr(&E0,j%+&7B,1): PROCsaa505xr(&D2,j%+&7C,1): PROCsaa505xr(&E8,j%+&7D,1): PROCsaa505xr(&EC,j%+&7E,1)
  270WHEN 4,5054: REM Belgian/French
  280   PROCsaa505xr(&E9,j%+&23,1): PROCsaa505xr(&EF,j%+&24,1): PROCsaa505xr(&E0,j%+&40,1): PROCsaa505xr(&EB,j%+&5B,1)
  290   PROCsaa505xr(&EA,j%+&5C,1): PROCsaa505xr(&D9,j%+&5D,1): PROCsaa505xr(&EE,j%+&5E,1): PROCsaa505xr(&E8,j%+&60,1)
  300   PROCsaa505xr(&E2,j%+&7B,1): PROCsaa505xr(&F4,j%+&7C,1): PROCsaa505xr(&FB,j%+&7D,1): PROCsaa505xr(&E7,j%+&7E,1)
  310WHEN 5,5055: REM US-ASCII
  320   FOR loop%=&5B TO &60:PROCsaa505xr(loop%, loop%+j%,1):NEXT
  330   PROCsaa505xr(&23,j%+&23,1): PROCsaa505xr(&7B,j%+&7B,1): PROCsaa505xr(&7C,j%+&7C,1): PROCsaa505xr(&7D,j%+&7D,1): PROCsaa505xr(&7E,j%+&7E,1)
  340WHEN 6,5056: REM Hebrew
  350   FOR loop%=0 TO 27:PROCsaa505xr(loop%,j%+loop%+&60,1):NEXT
  360WHEN 7,5057: REM Cyrillic
  370    FOR loop%=0 TO &3E:PROCsaa505xr(loop%,j%+loop%+&40,2):NEXT
  380    PROCsaa505xr(&23,j%+&23,1): PROCsaa505xr(&3F,j%+&26,2)
  390ENDCASE
  400SYS "OS_Byte",42,2
  410ENDPROC
  420:
  430DEFPROCsaa505xmapeuro(alt%)
  440PROCsaa505xr(&80,&7F+(&80*alt%),1)
  450ENDPROC
  460:
  470DEFPROCsaa505xreset(alt%, f%): REM Reset a font table to SAA5050 layout
  480LOCAL loop%, j%
  490j%=0:IF alt% THEN j%=128
  500IF f% THEN SYS"OS_Byte",42,1
  510FOR loop%=32TO126:PROCsaa505xr(loop%,loop%+j%,1):NEXT
  520PROCsaa505xr(&A3,j%+&23,1): PROCsaa505xr(&8F,j%+&5B,1): PROCsaa505xr(&BD,j%+&5C,1): PROCsaa505xr(&90,j%+&5D,1)
  530PROCsaa505xr(&8D,j%+&5E,1): PROCsaa505xr(&23,j%+&5F,1) :PROCsaa505xr(&96,j%+&60,1): PROCsaa505xr(&BC,j%+&7B,1)
  530PROCsaa505xr(&9D,j%+&7C,1): PROCsaa505xr(&BE,j%+&7D,1): PROCsaa505xr(&F7,j%+&7E,1): PROCsaa505xr(&81,j%+&7F,1)
  540IF f% THEN SYS"OS_Byte",42,2
  550ENDPROC
  560:
  570DEFPROCsaa505xr(chi%, cho%, bank%)
  580LOCAL blk%%
  590DIM HIMEM blk%% 64
  600blk%%?0 = 4
  610blk%%?1 = 44
  620blk%%?2 = chi%
  630blk%%?3 = bank%
  640SYS "OS_Word",&8B,blk%%
  650blk%%?0 = 44
  660blk%%?1 = 0
  670blk%%?2 = cho%
  680blk%%?3 = 0
  690SYS "OS_Word",&8C,blk%%
  700DIM HIMEM blk%% -1
  710ENDPROC
