vorige:
[en] The MSX World Expo ‘99 report
MCCW nummer 91, januari/februari 2000
Terug naar inhoud
volgende:
Wammes’ kolom
het nieuwe van Japan in Europa is nu bruikbaar
MSX-Kanji ontsluierd

Het zal niemand ontgaan zijn dat vanaf de MSX2+ en/of MSX-DOS 2.20 Europa de Kanji-schermen kent. Sinds mijn niet geringe MSX-collectie werd aangevuld met de MSX turbo R, zijn de Kanji-schermen en het commando PUT KANJI — dat overigens in werkelijk iedere MSX2 en hoger zit, ook in de Europese versies — na flink uitspitten mij een heel stuk duidelijker geworden. Met de Kanji-statements zijn heel leuke dingen te realiseren. Het eerste voordeel die de Kanji biedt is het plaatsen van tekst op een grafisch scherm met simpele LOCATE- en PRINT-statements, echter de rom bevat veel meer leuke dingen, waaronder een conversiesysteem tussen Katakana-, Hiragana- en Kanji-tekens.

 
Albert Beevendorp
 
Inhoud
Kanji-schermen
Kanji-stringmanipulatie
Kanji add-ons
Kanji in machinetaal
Het PUT KANJI-commando
PUT KANJI in machinetaal



Kanji-tekens zijn voor ons de samengetrokken tekens van de Hiragana-tekens die vaak kleiner boven deze Kanji-tekens staan op de diverse verpakkingen van spellen. De Katakana-tekens worden door de Japanners gebruikt om bijvoorbeeld Engelse woorden fonetisch te kunnen schrijven. Ook worden diverse namen in Katakana-tekens getoond. Hiragana-tekens worden gebruikt om de teksten te kunnen formuleren, maar wat dit alles inhoudt is mij nog geheel onbekend. Het vertalen van Japans naar een andere taal wordt hierdoor maar aan de kenners overgelaten. Dit artikel beperkt zich tot het gebruik van de Kanji-schermen en PUT KANJI. Naast Kanji-basic is de Kanji-rom beperkt benaderbaar in machinetaal, waarbij ter voorbeeld enkele assemblysources zijn opgenomen.

Kanji-schermen
De MSX Kanji-rom bestaat uit een viertal Kanji-schermen en diverse functies die ook buiten deze Kanji-schermen kunnen worden gebruikt. Er zijn zes CALL-statements die de Kanji-schermen kunnen in- en uitschakelen. De tabel “Kanji-schermen” geeft een overzicht van de CALL-statements die de Kanji-schermen kunnen instellen. Het CALL-statement zelf kan tevens worden vervangen door een underscore (_), dus CALL ANK en _ANK hebben hetzelfde resultaat:

    

Kanji-schermen
StatementResolutieOpmerking
_KANJI(64,13)Tekenformaat 8×16 (WIDTH 64 maximaal)
_KANJI0(64,13)Tekenformaat 8×16 (WIDTH 64 maximaal)
_KANJI1(80,13)Tekenformaat 6×16 (WIDTH 80 maximaal)
_KANJI2(64,24)Interlaced 8×8 (WIDTH 64 maximaal)
_KANJI3(80,24)Interlaced 6×8 (WIDTH 80 maximaal)
_ANK(80,24)SCREEN 0 of SCREEN 1

    Na instellen van een Kanji-scherm neemt het toetsenbord de Japanse indeling aan, waardoor de niet-japanse toetsenborden totaal in de war zijn geraakt. Dit is met de MSX-DOS 2.20 duidelijk naar voren gekomen en diverse omgebouwde MSX2+ machines hebben een omgeprogrammeerde eprom die het normale toetsenbord indeling behouden. Maar officieel is de Kanji-rom voor de Japanse markt en daardoor is het de Japanse indeling blijven houden. Met de MSX-DOS 2.20-Kanji is het mogelijk met CLS het scherm schoon te maken, terwijl het officiële Kanji-statement _CLS de manier is voor een schoon scherm. Gewoon CLS geeft zonder pardon een foutmelding. Ook kunnen de palette-waarden worden gewijzigd binnen de Kanji-schermen met _PALETTE(C,R,G,B). De uitwerking is 100% gelijk aan COLOR=(C,R,G,B), echter op de Kanji-schermen gericht omdat COLOR=(C,R,G,B) een gedeelte van het scherm verminkt.

Kanji-stringmanipulatie
Naast de acht Kanji-schermmanipulatie statements zijn er ook nog tien Kanji-stringmanipulatie statements opgenomen. De tabel “Kanji-stringmanipulaties” toont de statements die na de lijst uitgebreid worden beschreven:

    

Kanji-stringmanipulaties
FunctieOmschrijving
_AKCNV(A$,B$)Converteer een Ank-string naar een Kanji-string.
_JIS(A$,B$)Zet Jis-code van teken B$ (met _KNJ verkregen) in hexadecimale notatie in A$.
_KACNV(A$,B$)Converteer een Kanji-string naar een Ank-string.
_KEXT(A$,B$,A)Filter de tekens van het opgegeven type A uit string B$ naar string A$.
_KINSTR(A,B,A$,B$)Komt overeen met A=INSTR(B,A$,B$), echter gericht op de Kanji-strings.
_KLEN(A,A$)Komt overeen met A=LEN(A$), echter gericht op de Kanji-strings.
_KMID(A$,B$,A,B)Komt overeen met A$=MID(B$,A,B), echter gericht op de Kanji-strings.
_KNJ(A$,B$)Zet teken met Jis-code B$ in A$.
_KTYPE(A,A$,B)Geef het type van het teken op positie B van A$ in A.
_SJIS(A$,B$)Zet ascii-waarden van teken B$ (met _KNJ verkregen) in hexadecimale notatie in A$.

    Sommige commando’s vereisen extra uitleg en voorbeelden om het exacte resultaat duidelijk te maken. Ook zal veel geprobeerd moeten worden om alles echt te begrijpen. Ook kunnen de juiste Japanse tekens getoond worden mits de ondersteuning voor het Japans is geinstalleerd, anders zijn er onduidelijke tekens te zien.

    _KNJ(A$,B$) converteert van een Jis-code naar de string die gebruikt worden om het teken op de Kanji-schermen te kunnen tonen. In de Japanse handboeken worden de karakters in de Jis-code uitgedrukt. Deze standaard code wordt door ieder Japans computer-systeem gebruikt om het juiste teken te tonen ook al zijn intern de tekens via een heel andere methode aan te spreken. En deze conversie dient altijd vanuit de Jis-code te gebeuren. De Jis-code zelf dient in B$ te staan en het resultaat komt in A$ terecht. Omdat meestal de Jis-code in hexadecimale notatie wordt weergegeven, is dit hier ook gedaan. Ter voorbeeld nemen we Jis-code “4B62”. Willen we dit teken op het scherm zien, dan doen we _KNJ(A$,"4B62") waarna A$ het Kanji-teken zal bevatten dat op de Kanji-schermen juist getoond wordt. Op de MSX ziet het teken er zo uit:

    Dit Kanji-teken kan weer worden geconverteerd naar de Jis-code met _JIS(B$,A$) waarna B$ de string “4B62” zal bevatten. Ook kunnen de twee ascii-tekens in een 4-byte string worden gezet met _SJIS(C$,A$) waarna C$ de waarde “9682” zal hebben. Het eerste ascii-teken is dan in dit geval &H96 en het tweede ascii-teken is &H82. Worden deze twee waarden achter elkaar naar een Kanji-scherm geprint, dan verschijnt het teken weer. Ook grappig en veel gebruikt is het converteren tussen een Ank-string en een Kanji-string. Hierdoor wordt in de Kanji-schermen de tekst dubbelbreed op het scherm geplaatst. Minder vaak gebruikt is het converteren van een Kanji-string naar een Ank-string, zij het in beperkte mate, omdat in de Kanji-rom veel meer karakters zijn opgeslagen en het converteren naar een Ank-string zich beperkt tot de karakters die zich in de 256 karakters bevinden.

    Willen we een tekst, dus converteren van een Ank-string naar een Kanji-string, dubbelbreed op een Kanji-scherm plaatsen, dan is _AKCNV(A$,"Hallo") genoeg. Zetten we A$ op het Kanji-scherm dan zien we inderdaad de tekst dubbelbreed omdat de Kanji-tekens niet 8, maar 16 pixels breed zijn omdat op het Kanji-scherm voor één teken dan twee posities worden gebruikt. Willen we deze Kanji-string converteren naar een Ank-string dan doen we _KACNV(B$,A$) waarna in B$ weer netjes “Hallo” — ook buiten de Kanji-schermen — te lezen is. De Katakana- en Hiragana-tekens zijn na conversie van een Ank-string naar een Kanji-string veel vloeiender doordat het geen 8x8 karakters zijn, maar 16×16 karakters uit een heel eigen rom: de Jis-rom.

    Met _KEXT(A$,B$,A) is het mogelijk de tekens van het in A opgegeven type uit te string te filteren. Het is mogelijk een combinatie van Ank- en Kanji-type tekens in eenzelfde string te gebruiken. Voor A zijn twee waarden mogelijk. Als geldt A=0, dan worden alle Ank-type tekens uit B$ in A$ gefilterd. Als geldt A=1 dan worden alle Kanji-type tekens uit B$ in A$ gefilterd. Op deze manier is het mogelijk de lengte van een string te kunnen bepalen met _KLEN(A,A$) voor een of ander doel. Wil je het type van een teken op een bepaalde positie bepalen binnen een string met _KTYPE of met _KMID een deel van de string op te vragen, dan is het verstandig om eerst de lengte van deze string op te vragen, omdat A=LEN(A$) een andere waarde geeft dan _KLEN(A,A$) mochten er Kanji-type tekens in staan.

    Met _KTYPE(A,A$,B) kan het type van het aangewezen teken binnen een string worden bepaald. Verstandig is eerst met _KLEN de lengte van de string op te halen om de laatste positie binnen de string te kunnen bepalen zonder dat er een foutmelding komt. De waarde voor A=0 als het teken in A$ op positie B een Ank-type teken is en A=1 als het een Kanji-type teken betrof. Met _KMID(A$,B$,A,B) kan een gedeelte van een string worden opgehaald. Ook hier geldt dat er rekening gehouden wordt met Ank-type tekens en Kanji-type tekens binnen dezelfde string, waardoor de lengte van de string opgevraagd dient te worden met _KLEN.

Kanji add-ons
In de Kanji-mode, het gebruik van Kanji-schermen, is het mogelijk op een grafisch scherm direct teksten en zetten met het LOCATE- en PRINT-statement zonder dat er een bestand "GRP:" voor geopend hoeft te worden. Helaas is hierdoor het positioneren op pixel-niveau niet mogelijk. Als dat gewenst is, dan is het openen van een bestand "GRP:" wel weer nodig en is het PRINT #1-statement weer benodigd. Bij het “introduceren” van de Kanji in Europa werd dit voor het gemak ook veelvuldig toegepast in de MSX2+ demo’s die allemaal voorzien waren van een Kanji-rom. Ook veel omgebouwde MSX2-computers naar MSX2+ heeft een Kanji-rom ingebouwd met de internationale toetsenbordindeling en karakterset waardoor wij allen nog het probleem hadden van het moeten leven met de eigen tekenset omdat de Jis-rom niet gevonden kon worden. De kunst van het weglaten zullen we maar zeggen.

    De toetscombinaties GRAPH-SELECT en CTRL-SPACE herbergen leuke functies. Als er verschil is tussen deze twee toetscombinaties, dan is mij geheel onbekend wat dit verschil is. Beide toetscombinaties schakelen deze functie weer uit. In deze mode wordt onderin het scherm een cursor getoond, wordt het invoeren van de fonetische uitspraak van woorden automatisch ingeschakeld en zullen er altijd Hiragana-tekens getoond worden. Buiten deze mode, en tevens buiten de Kanji-schermen, is dit mogelijk via de toetscombinatie SHIFT-KANA waarbij de CAPS-LOCK dienst doet als selectie tussen het invoeren van Hiragana-tekens (CAPS-LOCK uit) en Katakana-tekens (CAPS-LOCK aan).

    Bij het invoeren van tekst kan met enkele toetsen nog het een en ander gedaan worden. Met de cursor-toetsen links en rechts is het mogelijk door de tekst heen te wandelen. Wanneer op de cursor-toets omhoog, omlaag of de spatiebalk wordt gedrukt, kan door een selectie van Hiragana naar Kanji conversies worden gewandeld. De RETURN-toets zet de tekens zoals deze op dat moment op de regel staan, worden getransfereerd naar het scherm vanaf de cursor-positie. De KANA-toets schakelt tussen fonetisch invoeren en directe Hiragana invoer. F1 schakelt het normale invoeren volgens het alfabet aan en uit, F2 converteert de invoer van Hiragana naar Katakana in Kanji-type, F3 doet deze conversie in Ank-type.

Kanji in machinetaal
Er zullen ongetwijfeld meer dingen zijn die via machinetaal met de Kanji-rom te doen zijn, echter de beperking nu ligt bij het schakelen tussen Kanji-schermen, welk Kanji-scherm momenteel actief is en of de Kanji-driver geinstalleerd is. De Kanji-routines worden net zoals de DOS2 memory routines en MST’s MemMan via de H.EXTB aangesproken. De ID-code wordt in register D geplaatst en is waarde 17 (&H11) en het ‘commando’ wordt in register E geplaatst. Voor de machinetaal kenners hier de drie routines in een WB-ASS2 source.

    

ML-listing: KANJI.ASM

;
; Kanji-driver check - BiFi'96/'99
;
; Out: Z-flag set when no driver
;
KNJCHK: LD    A,255
        LD    DE,&H1100       ; D = ID-code, E = Command
        CALL  &HFFCA
        INC   A
        RET
;
; Read Kanji-mode - BiFi'96/'99
;
; Out: A=Current Kanji-mode
;         =0   ANK
;         =1   KANJI0
;         =2   KANJI1
;         =3   KANJI2
;         =4   KANJI3
;
RD_KNJ: LD    DE,&H1100
        JP    &HFFCA
;
; Set Kanji-mode - BiFi'96/'99
;
; In:  A = Kanji-mode
;
WRTKNJ: LD    DE,&H1101
        JP    &HFFCA

Het PUT KANJI-commando
Een Basic-commando waar, tot nu toe, weinig over bekend was, maar wel degelijk in iedere MSX2 zit, is PUT KANJI. PUT KANJI is ongedocumenteerd gebleven, omdat er in de Europese MSX2-computers geen Jis-rom aanwezig is. PUT KANJI is een grafisch commando. Dat wil zeggen dat het alleen vanuit een grafsich scherm kan worden gebruikt. Ook is in de MSX2 sub-rom een bios-entry opgenomen om de PUT KANJI in machinetaal te realiseren. Voor de volledigheid wordt deze ook opgenomen in het artikel. De volledige schrijfwijze, syntaxis, van het commando is:

     PUT KANJI [STEP] [(X-coordinaat,Y-coordinaat)], <Jis-code> [,<Kleur>] [,<Logische-operatie>] [,<Afdruk-mode>]

     Net zoals zoveel grafische commando’s kan ook hier met optie "STEP" worden gebruikt om relatief te positioneren. Tussen de haakjes staan de (met STEP de relatieve) coordinaten voor het teken. <Jis-code> is verplicht en geeft aan welk teken op het scherm getoond moet worden. Aangezien in dit artikel alle Jis-codes in hexadecimale notatie zijn gegeven en hier een decimale notatie vereist is, is het handig ook hier de hexadecimale notatie aan te houden, dus moet het teken met Jis-code “4B62” worden getoond, dan moet de Jis-code voor onze leesbaarheid en snelle referentie als &H4B62 in PUT KANJI worden opgenomen. <Kleur> is afhankelijk van het aantal kleuren op het grafische scherm. Standaard is <Kleur> de huidige voorgrondkleur. Ook hier wordt de <Logische-operatie> in lettervorm opgenomen. De standaardinstelling voor <Logische-operatie> is PSET.

    <Afdruk-mode> vereist extra uitleg. Er zijn drie afdruk-modi en de onderstaande tabel geeft de betekenis aan van de drie afdruk-modi:

    

PUT KANJI afdruk-modi
Afdruk-modeBetekenis
0Gehele KANJI-teken afdrukken
1Even lijnen afdrukken
2Oneven lijnen afdrukken

     Afdruk-mode 0 toont het hele Kanji-teken op de actieve schermpagina. Dit is de default-mode en wordt gebruikt als er geen interlace mode gewenst is. Afdruk-mode 1 toont alleen de even lijnen op de actieve pagina. De even lijnen dienen wel op een even genummerde schermpagina worden getoond om tezamen met afdruk-mode 2 die op de bijhorende oneven genummerde schermpagina te worden getoond om het hele teken weer interlaced te kunnen weergeven. Nog even ter herinnering: schermpagina’s 0 en 1 zijn gekoppeld en schermpagina’s 2 en 3 zijn gekoppeld. De twee voorbeeld programmaatjes tonen het gebruik van PUT KANJI in Basic. Het eerste programmaatje toont een Jis-tekst in afdruk-mode 0, het tweede programmaatje toont dezelfde tekst in afdruk-modi 1 en 2:

    

Basic-listing: KANJI1.BAS

10 SCREEN 5: X=60: Y=80: RESTORE
20 READ A$: IF A$<>"*" THEN Z=VAL("&H"+A$): GOSUB 40: X=X+16: GOTO 20
30 I$=INPUT$(1): SCREEN 0: END
40 PUT KANJI (X,Y),Z,14,PSET,0: RETURN
50 DATA 234D,2353,2358,2342,2341,2353,2349,2343,*

    

Basic-listing: KANJI2.BAS

10 SCREEN 7,,,,,3: X=180: Y=100: RESTORE
20 SET PAGE ,1: CLS: SET PAGE 1
30 READ A$: IF A$<>"*" THEN Z=VAL("&H"+A$): GOSUB 50: X=X+16: GOTO 30
40 I$=INPUT$(1): SCREEN 0,,,,,0: END
50 SET PAGE ,0: PUT KANJI (X,Y),Z,14,PSET,1
60 SET PAGE ,1: PUT KANJI (X,Y),Z,14,PSET,2: RETURN
70 DATA 234D,2353,2358,2342,2341,2353,2349,2343,*

    Bovenstaande programmaatjes bevatten de Jis-codes in DATA regels. Het kan gemakkelijker door gebruik te maken van de Kanji-rom. Zoals eerder beschreven is het mogelijk een string te converteren van een Ank-type string naar een Kanji-type string en daar per teken de Jis-code van op te vragen. De statements die hiervoor nodig zijn: _AKCNV, _JIS, _KLEN en _KMID. De programmaatjes zouden er dan na enig wijzigen als volgt uit zien:

    

Basic-listing: KANJI3.BAS

10 SCREEN 5: X=60: Y=80: _AKCNV (A$,"MSXBASIC")
20 _KLEN (M,A$): FOR L=1 TO M: GOSUB 50: GOSUB 40: X=X+16: NEXT L
30 I$=INPUT$(1): SCREEN 0: END
40 PUT KANJI (X,Y),Z,14,PSET,0: RETURN
50 _KMID (B$,A$,L,1): _JIS (C$,B$): Z=VAL("&H"+C$): RETURN

    

Basic-listing: KANJI4.BAS

10 SCREEN 7,,,,,3: X=180: Y=100: _AKCNV (A$,"MSXBASIC")
20 SET PAGE ,1: CLS: SET PAGE 1
30 _KLEN (M,A$): FOR L=1 TO M: GOSUB 70: GOSUB 50: X=X+16: NEXT L
40 I$=INPUT$(1): SCREEN 0,,,,,0: END
50 SET PAGE ,0: PUT KANJI (X,Y),Z,14,PSET,1
60 SET PAGE ,1: PUT KANJI (X,Y),Z,14,PSET,2: RETURN
70 _KMID (B$,A$,L,1): _JIS (C$,B$): Z=VAL("&H"+C$): RETURN

PUT KANJI in machinetaal
In de sub-rom van iedere MSX2 is een bios-entry opgenomen om een PUT KANJI in machinetaal te doen. De coordinaten dienen te worden geplaatst in GRPACX en GRPACY en worden automatisch geupdate, de logische operatie is te vinden in LOGOPR en de kleur is te vinden in ATRBYT. Voor het interlace printen moet ACPAGE worden ingesteld voordat de PUT KANJI wordt gedaan. Tot slot wordt de interlace mode in de VDP ingesteld door bits 2 en 3 van R#9 te setten en de R#2 page de waarde 63 voor page 1 te geven en de waarde 127 voor page 3 om beide pagina’s interlaced te kunnen zien. De voorbeeld source geeft alleen het bovenstaande voorbeeld van interlaced PUT KANJI. In deze source zijn wat meer variabelen meegenomen:

    

ML-listing: PUTKANJI.ASM

        ORG   &HC000
;
; EQU's (BIOS)
;
CHGMOD: EQU   &H5F
CHGET:  EQU   &H9F
CLS:    EQU   &HC3
SUBROM: EQU   &H015F
KNJPRT: EQU   &H01BD
;
; EQU's (Systeem variabelen)
;
VDP2RG: EQU   &HF3E1
ATRBYT: EQU   &HF3F2
ACPAGE: EQU   &HFAF6
LOGOPR: EQU   &HFB02
GRPACX: EQU   &HFCB7
GRPACY: EQU   &HFCB9
VDP9RG: EQU   &HFFE8
;
; PUT KANJI demo - BiFi'99 - Interlaced versie
; Non-interlace is heel simpel uit deze source
; te maken.
;
START:  LD    A,7             ; SCREEN 7
        CALL  CHGMOD

        LD    A,(VDP9RG)      ; Interlace aan
        OR    12
        LD    (VDP9RG),A
        OUT   (&H99),A
        LD    A,128+9
        OUT   (&H99),A

        LD    A,63            ; SET PAGE 1,1
        LD    (VDP2RG),A
        OUT   (&H99),A
        LD    A,128+2
        OUT   (&H99),A
        LD    A,1
        LD    (ACPAGE),A

        XOR   A
        CALL  CLS

        LD    HL,180          ; X = 180
        LD    (GRPACX),HL
        LD    HL,100          ; Y = 100
        LD    (GRPACY),HL
        LD    HL,TJIS

PRT_LP: LD    C,(HL)          ; Lees Jis-code
        INC   HL
        LD    B,(HL)
        INC   HL
        LD    A,B             ; Controleer voor tabel einde
        OR    C
        JR    Z,PRTDNE

        CALL  PRINT           ; Twee maal PUT KANJI
        JR    PRT_LP

PRTDNE: CALL  CHGET           ; Wacht op toetsindruk
        LD    A,(VDP9RG)      ; Interlace uit
        AND   243
        LD    (VDP9RG),A
        OUT   (&H99),A
        LD    A,128+9
        OUT   (&H99),A
        XOR   A               ; SCREEN 0
        JP    CHGMOD
;
PRINT:  LD    DE,(GRPACX)
        PUSH  DE
        LD    E,0
        CALL  KANJI
        POP   DE
        LD    (GRPACX),DE
        LD    E,1

KANJI:  LD    A,14            ; Kleur
        LD    (ATRBYT),A
        LD    A,0             ; Logische operatie
        LD    (LOGOPR),A
        LD    A,E             ; SET PAGE (actieve deel)
        LD    (ACPAGE),A
        INC   A               ; Afdruk-mode

        LD    IX,KNJPRT
        JP    SUBROM
;
TJIS:   DW    &H234D,&H2353,&H2358,&H2342
        DW    &H2341,&H2353,&H2349,&H2343,0

    De routine KANJI doet het eigenlijke PUT KANJI gedeelte nadat de diverse instellingen zijn gedaan. Het SET PAGE-gedeelte kan bij afdruk-mode 0 weggelaten worden, alsmede het instellen van de interlace-mode. De source aanpassen voor gebruik van afdruk-mode 0 is niet zo moeilijk. De keuze om de source te plaatsen van de interlace-versie is omdat de versie van de niet-interlace heel simpel uit deze source te halen is.

vorige:
[en] The MSX World Expo ‘99 report
MSX Computer & Club Webmagazine
nummer 91, januari/februari 2000
volgende:
Wammes’ kolom