0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PC-G850 用のグラフィックローダーを生成するプログラムを書く

0
Last updated at Posted at 2026-07-16

はじめに

『PASTA/80 for PC-G850』用にグラフィックライブラリを書いたので、適当な画像を読み込ませてみたくなりました。

グラフィックローダージェネレーター

画像データは Pascal 形式のコードが欲しいのです。具体的にはこのようなものです。

const
  BgData: array [0..53] of array [0..15] of Byte = 
  (
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $20, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
      ...  
    ($9F, $80, $9F, $A0, $A0, $A0, $9F, $80, $BF, $84, $84, $84, $83, $80, $C0, $7F)
  );

ソースコード

本当は慣れている Delphi で書きたかったのですが、PASTA/80 は『Free Pascal』で書かれているため、こちらも Free Pascal で書いた方がいいだろう、という事で。

BmpToG850.pas
program BmpToG850;
{$mode objfpc}{$H+}

uses
  Classes, SysUtils, FPImage, FPReadBMP;

var
  Img: TFPMemoryImage;
  Reader: TFPReaderBMP;
  x, y, page, bitPos, i, j: Integer;
  b: Byte;
  VRAM: array [0..863] of Byte;
  OutFile: Text;
  InName, OutName: string;
begin
  if ParamCount < 1 then
  begin
    Writeln('Usage: BmpToG850 <input.bmp> [output.pas]');
    Exit;
  end;
  InName := ParamStr(1);
  if ParamCount >= 2 then
    OutName := ParamStr(2)
  else
    OutName := ChangeFileExt(InName, '.pas');
  Img := TFPMemoryImage.Create(0, 0);
  Reader := TFPReaderBMP.Create;
  try
    Writeln('Loading ', InName, '...');
    Img.LoadFromFile(InName, Reader);
    if (Img.Width <> 144) or (Img.Height <> 48) then
    begin
      Writeln('Error: Image must be exactly 144x48 pixels!');
      Exit;
    end;
    FillChar(VRAM, SizeOf(VRAM), 0);
    for page := 0 to 5 do
    begin
      for x := 0 to 143 do
      begin
        b := 0;
        for bitPos := 0 to 7 do
        begin
          y := page * 8 + bitPos;
          if Img.Colors[x, y].red < $8000 then
            b := b or (1 shl bitPos);
        end;
        VRAM[page * 144 + x] := b;
      end;
    end;
    Assign(OutFile, OutName);
    Rewrite(OutFile);
    Writeln(OutFile, 'program ', ChangeFileExt(InName, ''), ';');
    Writeln(OutFile, '{$u+}');
    Writeln(OutFile, '{$i rtl\g850grph.pas}');
    Writeln(OutFile, 'const');
    Writeln(OutFile, '  Data: array [0..53] of array [0..15] of Byte = ');
    Writeln(OutFile, '  (');
    for i := 0 to 53 do
    begin
      Write(OutFile, '    (');
      for j := 0 to 15 do
      begin
        Write(OutFile, '$', IntToHex(VRAM[i * 16 + j], 2));
        if j < 15 then 
          Write(OutFile, ', ');
      end;
      Write(OutFile, ')');
      if i < 53 then
        Write(OutFile, ',');
      Writeln(OutFile);
    end;
    Writeln(OutFile, '  );');
    Writeln(OutFile, 'begin');
    Writeln(OutFile, '  Move(Data, Ptr(GetVramAddr)^, 864);');
    Writeln(OutFile, '  RepaintLCD;');
    Writeln(OutFile, '  while not KeyPressed do;');
    Writeln(OutFile, 'end.');
    Close(OutFile);
    Writeln('Success! Saved to ', OutName);
  finally
    Img.Free;
    Reader.Free;
  end;
end.

次のようにしてコンパイルするとグラフィックローダージェネレーターが生成されます。

fpc BmpToG850.pas

Windows だと BmpToG850.exe ができます。

Free Pascal は不慣れなので、コードに無駄があるかもしれません

使い方

144x48 のモノクロ BMP を用意します。画像の名前は GRADIUS2.BMP です。

image.png

次のように実行すると、GRADIUS2.PAS が得られます。

BmpToG850 GRADIUS2.BMP

実際に出力された GRADIUS2.PAS がこちらです。

GRADIUS2.PAS
program GRADIUS2;
{$u+}
{$i rtl\g850grph.pas}
const
  Data: array [0..53] of array [0..15] of Byte = 
  (
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $20, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $20, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $10, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $00, $00, $04, $7C, $88),
    ($30, $C0, $00, $06, $1A, $E4, $88, $30, $C0, $00, $00, $00, $00, $00, $00, $00),
    ($FE, $03, $61, $E1, $C1, $C1, $C1, $41, $41, $41, $41, $41, $41, $41, $41, $C1),
    ($41, $41, $41, $C1, $41, $41, $41, $C1, $41, $41, $41, $C1, $41, $C1, $41, $C1),
    ($41, $C1, $41, $41, $41, $41, $41, $41, $C1, $C1, $C1, $E1, $61, $01, $03, $FE),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0),
    ($A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0),
    ($A0, $A0, $A0, $A0, $A0, $E0, $C0, $20, $C0, $40, $80, $80, $A0, $D0, $F8, $D8),
    ($F8, $F8, $B8, $B0, $A0, $F0, $E0, $E0, $60, $78, $4F, $78, $E0, $C0, $E0, $C1),
    ($BE, $A4, $63, $DC, $C0, $60, $FF, $A9, $DC, $83, $40, $00, $00, $08, $00, $00),
    ($FF, $00, $00, $00, $01, $03, $07, $07, $0F, $0F, $1F, $1F, $30, $37, $31, $3F),
    ($30, $0D, $62, $6F, $60, $6D, $60, $6F, $60, $67, $68, $EF, $C0, $1F, $30, $37),
    ($30, $3F, $34, $35, $11, $1F, $0F, $07, $07, $03, $01, $00, $00, $00, $00, $FF),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14),
    ($14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14, $14),
    ($14, $14, $14, $14, $14, $1C, $0C, $13, $0C, $08, $04, $04, $14, $2C, $7F, $6C),
    ($7F, $7C, $77, $34, $17, $3C, $1F, $1C, $1B, $7B, $CB, $7B, $1C, $0F, $1C, $0F),
    ($F7, $94, $1B, $EC, $0F, $1B, $FF, $54, $EF, $04, $0B, $00, $00, $00, $00, $00),
    ($FF, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $0E, $0F, $0F, $0F, $0F, $0D, $0D, $0D, $0D, $0D, $0D, $0C, $0C, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $D0, $E0, $E0, $C0, $C0, $40, $40, $50, $A0, $50, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $10, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $07, $00, $00, $80, $F8, $46),
    ($31, $0C, $03, $80, $60, $9C, $47, $32, $0C, $03, $00, $00, $00, $00, $00, $00),
    ($FF, $00, $3E, $3E, $3E, $3E, $3E, $BE, $BE, $BE, $80, $A2, $A2, $A2, $A2, $22),
    ($A2, $A2, $A2, $80, $A2, $94, $94, $88, $08, $94, $94, $A2, $80, $A2, $A2, $A2),
    ($A2, $22, $A2, $A2, $A2, $80, $BE, $A2, $A2, $A2, $22, $22, $22, $3E, $00, $FF),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $1E, $1E, $1E, $0C, $00, $00),
    ($00, $01, $00, $00, $00, $00, $00, $00, $01, $00, $01, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $01, $01, $00, $00, $00, $80, $00, $00, $00, $00, $00, $00, $00),
    ($FF, $00, $00, $00, $00, $80, $80, $88, $08, $08, $88, $88, $88, $88, $08, $00),
    ($8F, $88, $88, $88, $88, $08, $88, $8F, $80, $8F, $88, $08, $88, $88, $88, $88),
    ($0F, $00, $8F, $08, $08, $08, $88, $08, $88, $8F, $80, $80, $00, $00, $00, $FF),
    ($00, $00, $00, $00, $10, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $1E, $1E),
    ($1E, $0C, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $04, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $10, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00),
    ($7F, $C0, $80, $80, $93, $A4, $A4, $A4, $99, $80, $BF, $84, $84, $84, $83, $80),
    ($BF, $A4, $A4, $A4, $A0, $80, $BF, $A4, $A4, $A4, $A0, $80, $A0, $BF, $A0, $A0),
    ($9F, $80, $9F, $A0, $A0, $A0, $9F, $80, $BF, $84, $84, $84, $83, $80, $C0, $7F)
  );
begin
  Move(Data, Ptr(GetVramAddr)^, 864);
  RepaintLCD;
  while not KeyPressed do;
end.

これを PASTA/80 でコンパイルして PC-G850 で実行するとこうなります。

image.png

何かキーを押すと終了します。

おわりに

妄想が捗りますね!!

追記

MSX 版『GRADIUS』が 2026/07/25 で 40 周年という事でオマケを。

gradius.pas
program GRADIUS;
{$u+}
{$i rtl\g850grph.pas}
const
  Data: array [0..107] of array [0..15] of Byte = 
  (
    ($FB, $F7, $EF, $F7, $EF, $F7, $EF, $F7, $EF, $FF, $EF, $FF, $EF, $FF, $EF, $DF),
    ($EF, $DF, $AF, $DF, $AF, $DF, $AF, $DF, $AF, $DF, $AF, $5F, $AF, $1F, $AF, $17),
    ($AB, $07, $AB, $05, $AA, $01, $0A, $00, $02, $00, $02, $00, $0A, $01, $AA, $07),
    ($AA, $5F, $AA, $7F, $AB, $7F, $AF, $FF, $BB, $FF, $FF, $FF, $FF, $FD, $FA, $FF),
    ($FF, $FF, $FF, $FF, $FF, $DF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FE, $FF, $FE, $FF, $FE, $FF, $FA, $FF, $FA, $FF, $FA, $FF),
    ($FA, $F5, $EA, $F7, $EA, $FF, $AA, $FF, $AA, $F7, $AA, $FD, $AA, $D5, $AA, $D5),
    ($AA, $DD, $AA, $FD, $AA, $FD, $AA, $F5, $AA, $F7, $AA, $F7, $AA, $F7, $AB, $F7),
    ($AA, $75, $AA, $7F, $AA, $7F, $AE, $5F, $AE, $5F, $AA, $DF, $AA, $FF, $AA, $7D),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $EF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FF, $FA, $FF),
    ($FA, $FD, $EA, $F4, $EA, $D0, $AA, $D0, $A8, $C0, $A8, $C0, $AA, $F0, $AA, $F8),
    ($AA, $FC, $EA, $FC, $EA, $FF, $FA, $FF, $FA, $FF, $FE, $FF, $BE, $FF, $FE, $FF),
    ($FF, $FF, $FF, $FF, $FF, $7F, $AF, $17, $AA, $57, $AF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $EF, $FF, $FF, $FF),
    ($FF, $FF, $BF, $5F, $BF, $7F, $BB, $5F, $2F, $57, $2F, $5F, $BF, $7F, $AE, $7F),
    ($FE, $FF, $FE, $FF, $FE, $FF, $FA, $FF, $FA, $FF, $FA, $FF, $EA, $FF, $EA, $FF),
    ($EA, $FD, $EA, $FF, $EA, $DD, $AA, $D5, $AA, $DF, $AA, $FD, $AA, $DD, $AA, $FD),
    ($EF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $EA, $7F, $FA, $7F, $FE, $FF, $FF, $FF),
    ($BF, $7F, $BF, $3F, $BF, $7F, $AF, $7F, $AF, $FF, $BF, $1F, $AF, $1F, $AF, $47),
    ($AF, $17, $AA, $11, $AA, $77, $2A, $70, $2A, $77, $2A, $77, $AA, $11, $AA, $17),
    ($AF, $47, $AF, $1F, $AF, $1F, $BF, $FF, $AF, $7F, $AF, $7F, $BF, $3F, $BF, $7F),
    ($FF, $FF, $FE, $FF, $FE, $7E, $FE, $7C, $FE, $FC, $FE, $FC, $FE, $FE, $FE, $FF),
    ($FE, $FF, $FF, $FF, $FB, $FF, $FB, $FF, $FB, $FF, $FB, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FD, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F),
    ($BF, $7F, $AF, $47, $AB, $D3, $AB, $D7, $AF, $DF, $AF, $DF, $AF, $1F, $AF, $8F),
    ($AF, $07, $AF, $47, $AF, $5F, $AF, $47, $AA, $47, $AA, $56, $AA, $44, $EA, $65),
    ($AA, $24, $AA, $06, $AA, $27, $AA, $65, $AA, $75, $AB, $15, $AA, $55, $AA, $77),
    ($2A, $57, $AA, $15, $AA, $22, $AA, $02, $AA, $06, $AA, $22, $AA, $15, $AA, $17),
    ($AA, $77, $AA, $55, $AA, $77, $AB, $75, $AA, $65, $AA, $27, $AA, $06, $AA, $24),
    ($AA, $65, $EA, $44, $AA, $56, $AA, $47, $AA, $47, $AF, $5F, $AF, $47, $AF, $07),
    ($AF, $0F, $AF, $1F, $AF, $DF, $AF, $DF, $AF, $D7, $AB, $D3, $AB, $47, $AF, $7F),
    ($BF, $7F, $FF, $FF, $FF, $FF, $FF, $FD, $FA, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FD, $FB, $F9, $E8, $D0),
    ($AA, $DC, $AA, $DD, $AA, $DD, $AA, $DD, $BA, $1D, $BA, $31, $BA, $31, $BA, $75),
    ($BA, $75, $BA, $75, $EA, $75, $EA, $E4, $EA, $E5, $EA, $D4, $AA, $00, $AA, $20),
    ($AA, $44, $AA, $45, $AA, $F5, $EA, $55, $AA, $55, $AA, $17, $AA, $C7, $AA, $C1),
    ($AA, $C0, $AA, $20, $AA, $50, $AA, $10, $AA, $98, $AA, $D0, $AA, $B0, $AA, $C0),
    ($AA, $C0, $AA, $D5, $AA, $55, $AA, $55, $AA, $55, $AA, $D5, $AA, $55, $AA, $55),
    ($AA, $24, $AA, $01, $AA, $F4, $EA, $E5, $EA, $E4, $EA, $75, $EA, $75, $BA, $75),
    ($BA, $75, $BA, $31, $BA, $31, $BA, $1D, $BA, $1D, $AA, $DD, $AA, $DD, $AA, $DC),
    ($AA, $F0, $E8, $F9, $FB, $FD, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $BF, $5F),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FF, $FE, $FF, $FE, $FF, $FE, $FD),
    ($FA, $FF, $FA, $FF, $FA, $FC, $FA, $FC, $EA, $FD, $EB, $FD, $EB, $FF, $EB, $D3),
    ($EA, $D3, $AB, $97, $AA, $C7, $AA, $F0, $AA, $FE, $AE, $DF, $AF, $D7, $AB, $D7),
    ($EA, $F5, $AA, $11, $A8, $91, $8A, $10, $AA, $D1, $A2, $C3, $AA, $D3, $BA, $D1),
    ($AA, $F1, $BB, $D3, $AB, $D3, $AA, $FF, $AF, $F6, $AA, $F7, $AA, $F7, $AB, $F3),
    ($EA, $D3, $EB, $FF, $EB, $FD, $EB, $FD, $EA, $F4, $FA, $FC, $FA, $FF, $FA, $FF),
    ($FA, $FD, $FE, $FF, $FE, $FF, $FE, $FF, $FE, $FF, $FE, $FF, $EF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FE, $FA, $F0),
    ($FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FE, $FF, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $7F, $BF, $FF, $EF, $FF, $FB, $FF),
    ($FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FF, $FE, $F9),
    ($FB, $F9, $FB, $FD, $EA, $F5, $EA, $F5, $EA, $C1, $AA, $0D, $AA, $FD, $FB, $FD),
    ($AE, $FF, $AA, $FF, $FE, $FF, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $AF, $DF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $BF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $BB, $7F, $BF, $7F, $BF, $FF, $FF, $FF, $FF, $FF, $FE, $FF, $FB, $FF),
    ($FF, $FF, $BB, $B7, $AB, $E7, $EB, $F9, $FA, $FF, $FE, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $BF, $DF, $AF, $FF, $EE, $FF, $FE, $F9, $BB, $FF),
    ($BE, $FF, $EA, $F7, $EB, $F7, $AB, $D7, $AF, $D7, $AF, $F7, $EF, $DF, $AF, $DF),
    ($AF, $DF, $AF, $DF, $BF, $DF, $BF, $FF, $BF, $7F, $BF, $7F, $BF, $7F, $BF, $7F),
    ($AF, $7F, $BF, $1F, $AF, $1F, $AF, $07, $AB, $07, $AB, $91, $AB, $E1, $EB, $FD),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FF, $FF, $FF, $FF, $FF),
    ($EA, $D5, $AA, $D5, $AA, $DF, $AA, $FF, $AA, $FF, $BB, $FF, $AF, $FF, $AB, $FF),
    ($AA, $DF, $EB, $FF, $EF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F, $3F, $3F, $3F, $0F, $0F, $07),
    ($83, $01, $A1, $00, $AA, $00, $AA, $55, $AA, $57, $AA, $17, $AB, $C7, $EB, $F7),
    ($EA, $C7, $BF, $DF, $BF, $FF, $BE, $FF, $BF, $FF, $BA, $3F, $FA, $FF, $FE, $FF),
    ($FA, $F7, $BA, $7F, $BA, $FD, $FA, $FD, $FE, $FF, $FA, $FD, $FA, $FD, $EE, $FF),
    ($FA, $FF, $FA, $FD, $FE, $7E, $FE, $FD, $FA, $FE, $FE, $FF, $FF, $FF, $FF, $FF),
    ($FF, $7F, $FF, $7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $BF, $FF, $FF, $7F, $BF, $FF, $BF, $FF, $BE, $FF, $FF, $FF, $FF, $FF),
    ($FF, $7F, $FF, $7F, $FF, $7F, $FF, $7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($7F, $1F, $9F, $8F, $8F, $C7, $EB, $C1, $E0, $E4, $EA, $E8, $EE, $E5, $E8, $F0),
    ($EA, $F0, $EA, $F0, $AA, $D1, $AA, $F0, $A8, $D5, $AA, $15, $BA, $1F, $2A, $1F),
    ($2A, $1F, $BA, $7F, $FA, $FF, $AE, $07, $0A, $03, $03, $01, $0B, $03, $0A, $07),
    ($AF, $7F, $FA, $F5, $FA, $DF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $BF, $FF, $FF, $FF, $FE, $FF, $FF, $FF, $FF, $7F, $BF, $FF, $BF, $FF),
    ($EA, $FD, $AA, $FD, $AA, $D5, $AB, $77, $AB, $FF, $FF, $FF, $FF, $FF, $EF, $FF),
    ($FF, $FF, $BF, $FF, $BF, $FF, $AF, $FF, $AE, $5F, $AE, $7F, $AE, $7F, $AB, $FF),
    ($EA, $FD, $FA, $FD, $BE, $FF, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FC),
    ($FC, $FC, $F8, $F0, $EA, $E0, $E8, $C0, $A8, $C0, $E0, $F0, $E8, $E0, $E0, $F0),
    ($FA, $F8, $FA, $FD, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($BF, $FF, $FF, $FF, $FA, $F5, $FB, $FF, $FB, $FF, $EA, $00, $AA, $00, $00, $00),
    ($00, $00, $AA, $00, $AB, $FF, $FA, $F0, $EA, $C0, $A8, $00, $A0, $00, $80, $00),
    ($0A, $00, $2A, $07, $AF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB, $FF, $EF, $FF),
    ($FF, $FF, $FF, $FF, $EF, $FF, $AF, $FF, $AB, $DF, $AA, $FF, $AA, $FF, $AA, $FF),
    ($FF, $FF, $FF, $FF, $FE, $FF, $FE, $FF, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FB, $FF, $EA, $F7, $FB, $FF, $FB, $FD, $BA, $FD, $FA, $FD, $FA, $FD, $FA, $FD),
    ($FE, $FF, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $EA, $80, $A0, $00),
    ($80, $00, $AA, $00, $AA, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FC, $FA, $F0),
    ($EA, $C0, $A8, $00, $AA, $01, $AB, $5F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),
    ($FF, $FF, $EB, $FF, $EA, $FF, $EA, $FF, $EA, $FF, $EA, $FF, $FA, $FF, $FE, $FF),
    ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $DF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF)
  );
var
  y, oy: byte;
  Keys: TKeyArray;  
begin
  oy := 255;
  y := 0;
  while True do
  begin
    ScanKeyboard(Keys);
    if (y > 0) and ((Keys[3] and $80) <> 0) then Dec(y); 
    if (y < 6) and ((Keys[3] and $40) <> 0) then Inc(y); 
    if oy <> y then
    begin
      Move(Data[y * 9], Ptr(GetVramAddr)^, 864);
      RepaintLCD;
    end;
    oy := y;
    Delay(100);
  end;    
end.

上下キーでスクロールします。

image.png
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?