{ ------------------------- KERNEL.INC ----------------------------
  Include-File fuer Grafikbefehle auf dem JOYCE unter Turbo Pascal.
  Hauptmodul, enthaelt MCode und elementare Routinen. Mu~ auf alle
  F{lle ins Hauptprogramm eingebinden werden.
  Es sind enthalten:

     procedure GraphInit       -> Initialisierung des MCode
     procedure Plot(x,y,m)     -> Pixel set/reset/invert
     procedure Screen_On       -> Bildschirm einschalten
     procedure Screen_Off      -> Bildschirm ausschalten
     procedure ShowCursor      -> Cursor ein
     procedure HideCursor      -> Cursor aus
     function  DotColor()      -> TRUE=Pixel gesetzt
     procedure Symbol(...)     -> Zeichensatz aendern
     procedure Hex_Symbol(...) ->      "         "

   Variablen & Prozeduren mit dem Namen GX_ sind zu vermeiden, um
   nicht mit Interna der Grafikerweiterungen zu kollidieren...

   Zum Compilieren die Endadresse auf $F3FF setzen, um nicht den
   MCode zu ueberschreiben!!!
--------------------------------------------------------------------- }


type GX_MCode  = array[0..202] of byte;
     GX_String = string[8];
     Strg_14   = string[14];
     Strg_90   = string[90];

var  GX_MProg : GX_MCode   absolute $F400;

const GX_Data:GX_MCode =
  ($ED,$5B,$10,$F4,$2A,$12,$F4,$01,$14,$F4,$CD,$5A,$FC,$E9,$00,$C9,
   $00,$00,$00,$00,$3E,$03,$A2,$57,$E5,$26,$00,$29,$01,$00,$B6,$09,
   $4E,$23,$46,$79,$E6,$F8,$6F,$60,$29,$19,$7D,$E6,$F8,$6F,$79,$E6,
   $07,$B5,$6F,$7B,$E6,$07,$3C,$47,$AF,$37,$1F,$10,$FD,$C1,$4F,$78,
   $FE,$00,$20,$04,$79,$B6,$77,$C9,$FE,$01,$20,$05,$79,$2F,$A6,$77,
   $C9,$FE,$02,$20,$04,$79,$AE,$77,$C9,$FE,$03,$C0,$79,$A6,$32,$13,
   $F4,$C9,$01,$6B,$F4,$CD,$5A,$FC,$E9,$00,$C9,$21,$77,$F4,$01,$08,
   $00,$11,$00,$00,$ED,$B0,$C9,$00,$00,$00,$00,$00,$00,$00,$00,$01,
   $88,$F4,$CD,$5A,$FC,$E9,$00,$C9,$21,$00,$00,$01,$08,$00,$11,$77,
   $F4,$ED,$B0,$C9,$01,$9D,$F4,$CD,$5A,$FC,$E9,$00,$C9,$1E,$00,$3E,
   $00,$16,$00,$07,$17,$17,$17,$6F,$7A,$CE,$B6,$67,$7E,$23,$66,$6F,
   $EB,$29,$29,$19,$29,$01,$08,$00,$3E,$00,$FE,$00,$20,$06,$11,$77,
   $F4,$ED,$B0,$C9,$EB,$21,$77,$F4,$ED,$B0,$C9);



procedure GX_Dot; external $F400;

procedure GX_Symb; external $F462;

procedure GX_Get; external $F47F;

procedure GX_ScrAcc; external $F494;


procedure GraphInit;
begin
  GX_MProg:=GX_Data;
end;


procedure Plot (x:integer; y,m:byte);
var  GX_X    : integer absolute $F410;
     GX_Y    : byte    absolute $F412;
     GX_M    : byte    absolute $F413;
begin
  GX_X:=x;
  GX_Y:=y;
  GX_M:=m;
  GX_Dot;
end;


function DotColor (x:integer; y:byte):boolean;
begin
  Plot(x,y,3);
  DotColor:=mem[$F413] <> 0;
end;


procedure Screen_On;
begin
  port[248]:=7;
end;

procedure Screen_Off;
begin
  port[248]:=8;
end;

procedure HideCursor;
begin
 write(#27,'f');
end;

procedure ShowCursor;
begin
  write(#27,'e');
end;


function GX_Convert(var rowpic:GX_String):byte;
var  i,j : byte;
begin
  if length(rowpic)<8 then
    for i:=succ(length(rowpic)) to 8 do rowpic:=rowpic+' ';
  j:=0;
  for i:=1 to 8 do begin
    j:=j shl 1;
    if rowpic[i]='*' then j:=succ(j)
  end;
  GX_Convert:=j
end;


procedure Symbol(Code:byte; rp0,rp1,rp2,rp3,rp4,rp5,rp6,rp7:GX_String);
var   matrix : array[0..7] of byte absolute $F477;
      CStart : integer absolute $F472;
begin
  matrix[0]:=GX_Convert(rp0);
  matrix[1]:=GX_Convert(rp1);
  matrix[2]:=GX_Convert(rp2);
  matrix[3]:=GX_Convert(rp3);
  matrix[4]:=GX_Convert(rp4);
  matrix[5]:=GX_Convert(rp5);
  matrix[6]:=GX_Convert(rp6);
  matrix[7]:=GX_Convert(rp7);
  CStart:=Code*8+$B800;
  GX_Symb;
end;


procedure Hex_Symbol(Code,r0,r1,r2,r3,r4,r5,r6,r7:byte);
var   matrix : array[0..7] of byte absolute $F477;
      CStart : integer absolute $F472;
begin
  matrix[0]:=r0;
  matrix[1]:=r1;
  matrix[2]:=r2;
  matrix[3]:=r3;
  matrix[4]:=r4;
  matrix[5]:=r5;
  matrix[6]:=r6;
  matrix[7]:=r7;
  CStart:=Code*8+$B800;
  GX_Symb;
end;


{ ------------------ Ende von KERNEL.INC ---------------------- }

