OSDN Git Service

形ができてきました
authoryamat0jp <yamat0jp@yahoo.co.jp>
Thu, 28 Jun 2018 11:50:30 +0000 (20:50 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Thu, 28 Jun 2018 11:50:30 +0000 (20:50 +0900)
bootpack.pas
wand.dpr

index b2aa293..aec5c60 100644 (file)
@@ -20,8 +20,8 @@ type
     procedure setp(start, endpos: integer; rgb: TBytes);
     procedure putfont8(vram: TBytes; xsize, x, y: integer; c: Int8;
       font: TBytes);
-    procedure putfont8_asc(vram: TBytes; xsize, x, y: integer; c: Int8;
-      s: UInt8);
+    procedure putfonts8_asc(vram: TBytes; xsize, x, y: integer; c: Int8;
+      s: PAnsiChar);
     procedure mouse_cursor8(mouse: TBytes; bc: Int8);
   end;
 
@@ -45,7 +45,7 @@ type
     function Status(var fifo: TFIFO8): integer;
   end;
 
-  TKeyboard = class
+  TDevice = class
   const
     PORT_KEYDAT = $0060;
     PORT_KEYSTA = $0064;
@@ -53,15 +53,37 @@ type
     KEYSTA_SEND_NOTREADY = $02;
     KEYCMD_WRITE_MODE = $60;
     KBC_MODE = $47;
-  private
+  protected
     procedure wait_KBC_sendready;
   public
-    fifo: TFIFO8;
-    keyfifo: TFifo;
+    fifo8: TFIFO8;
+    fifo: TFifo;
     constructor Create;
     destructor Destroy; override;
-    procedure Init;
-    procedure inthandler21(var esp: integer);
+    procedure Init; virtual; abstract;
+    procedure inthandler21(var esp: integer); virtual; abstract;
+  end;
+
+  TKeyboard = class(TDevice)
+  public
+    procedure Init; override;
+    procedure inthandler21(var esp: integer); override;
+  end;
+
+  TMOUSE_DEC = record
+    buf: array [0 .. 2] of Byte;
+    phase: Byte;
+    x, y, btn: integer;
+  end;
+
+  TMouse = class(TDevice)
+  const
+    KEYCMD_SENDTO_MOUSE = $D4;
+    MOUSECMD_ENABLE = $F4;
+  public
+    procedure enable_mouse(DEC: TMOUSE_DEC);
+    function decode(DEC: TMOUSE_DEC; dat: UInt8): integer;
+    procedure inthandler21(var esp: integer); override;
   end;
 
   TMemtest = class
@@ -130,7 +152,7 @@ const
   PIC1_ICW3 = $00A1;
   PIC1_ICW4 = $00A1;
 
-  COL8_000000 = 0;
+  COL8_000000: Int8 = 0;
   COL8_FF0000 = 1;
   COL8_00FF00 = 2;
   COL8_FFFF00 = 3;
@@ -147,7 +169,7 @@ const
   COL8_008484 = 14;
   COL8_848484 = 15;
 
-  ADR_BOOTINFO = $00000ff0;
+  ADR_BOOTINFO = $00000FF0;
 
 implementation
 
@@ -191,7 +213,7 @@ begin
   inc(fifo.p);
   if fifo.p = fifo.size then
     fifo.p := 0;
-  dec(fifo.free);
+  DEC(fifo.free);
   result := 0;
 end;
 
@@ -200,44 +222,6 @@ begin
   result := fifo.size - fifo.free;
 end;
 
-{ TKeyboard }
-
-constructor TKeyboard.Create;
-begin
-  inherited;
-  keyfifo := TFifo.Create;
-end;
-
-destructor TKeyboard.Destroy;
-begin
-  keyfifo.free;
-  inherited;
-end;
-
-procedure TKeyboard.Init;
-begin
-  wait_KBC_sendready;
-  io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
-  wait_KBC_sendready;
-  io_out8(PORT_KEYDAT, KBC_MODE)
-end;
-
-procedure TKeyboard.inthandler21(var esp: integer);
-var
-  i: UInt8;
-begin
-  io_out8(PIC0_OCW2, $61);
-  i := io_in8(PORT_KEYDAT);
-  keyfifo.Put(fifo, i);
-end;
-
-procedure TKeyboard.wait_KBC_sendready;
-begin
-  while True do
-    if io_in8(PORT_KEYSTA) and KEYSTA_SEND_NOTREADY = 0 then
-      break;
-end;
-
 { TMemtest }
 
 function TMemtest.memtest(start, endpos: Cardinal): Cardinal;
@@ -317,7 +301,7 @@ begin
       s := mem.free[i];
       result := s.addr;
       inc(s.addr, size);
-      dec(s.size, size);
+      DEC(s.size, size);
       if s.size = 0 then
         mem.free.delete(i)
       else
@@ -616,14 +600,14 @@ begin
   end;
 end;
 
-procedure TPallet.putfont8_asc(vram: TBytes; xsize, x, y: integer; c: Int8;
-  s: UInt8);
+procedure TPallet.putfonts8_asc(vram: TBytes; xsize, x, y: integer; c: Int8;
+  s: PAnsiChar);
 var
   hankaku: TBytes;
 begin
-  while s <> $00 do
+  while Byte(s[0]) <> $00 do
   begin
-    putfont8(vram, xsize, x, y, c, @hankaku[s * 16]);
+    putfont8(vram, xsize, x, y, c, @hankaku[Byte(s) * 16]);
     inc(s);
     inc(x, 8);
   end;
@@ -681,4 +665,102 @@ begin
   boxfill8(vram, x, COL8_FFFFFF, x - 3, y - 24, x - 3, y - 3);
 end;
 
+{ TMouse }
+
+function TMouse.decode(DEC: TMOUSE_DEC; dat: UInt8): integer;
+begin
+  result:=0;
+  case DEC.phase of
+    0:
+      if dat = $FA then
+        DEC.phase := 1;
+    1:
+      if (dat and $CB) = $08 then
+      begin
+        DEC.buf[0] := dat;
+        DEC.phase := 2;
+      end;
+    2:
+      begin
+        DEC.buf[1] := dat;
+        DEC.phase := 3;
+      end;
+    3:
+      begin
+        DEC.buf[2] := dat;
+        DEC.phase := 1;
+        DEC.btn := DEC.buf[0] and $07;
+        DEC.x := DEC.buf[1];
+        DEC.y := DEC.buf[2];
+        if (DEC.buf[0] and $10) <> 0 then
+          DEC.x := DEC.x or $FFFFFF00;
+        if (DEC.buf[0] and $20) <> 0 then
+          DEC.y := DEC.y or $FFFFFF00;
+        DEC.y := -DEC.y;
+        result:=1;
+      end;
+  else
+    result:=-1;
+  end;
+end;
+
+procedure TMouse.enable_mouse(DEC: TMOUSE_DEC);
+begin
+  wait_KBC_sendready;
+  io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
+  wait_KBC_sendready;
+  io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
+  DEC.phase := 0;
+end;
+
+procedure TMouse.inthandler21(var esp: integer);
+var
+  i: integer;
+begin
+  io_out8(PIC1_OCW2, $64);
+  io_out8(PIC0_OCW2, $62);
+  i := io_in8(PORT_KEYDAT);
+  fifo.Put(fifo8, i);
+end;
+
+{ TDevice }
+
+constructor TDevice.Create;
+begin
+  inherited;
+  fifo := TFifo.Create;
+end;
+
+destructor TDevice.Destroy;
+begin
+  fifo.free;
+  inherited;
+end;
+
+procedure TDevice.wait_KBC_sendready;
+begin
+  while True do
+    if io_in8(PORT_KEYSTA) and KEYSTA_SEND_NOTREADY = 0 then
+      break;
+end;
+
+{ TKeyboard }
+
+procedure TKeyboard.Init;
+begin
+  wait_KBC_sendready;
+  io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
+  wait_KBC_sendready;
+  io_out8(PORT_KEYDAT, KBC_MODE)
+end;
+
+procedure TKeyboard.inthandler21(var esp: integer);
+var
+  i: UInt8;
+begin
+  io_out8(PIC0_OCW2, $61);
+  i := io_in8(PORT_KEYDAT);
+  fifo.Put(fifo8, i);
+end;
+
 end.
index 5d9d827..8f866c7 100644 (file)
--- a/wand.dpr
+++ b/wand.dpr
@@ -2,6 +2,7 @@ program wand;
 
 uses
   System.SysUtils,
+  System.Classes,
   bootpack in 'bootpack.pas',
   asmhead in 'asmhead.pas';
 
@@ -11,8 +12,9 @@ const
 var
   binfo: ^TBOOTINFO = Pointer(ADR_BOOTINFO);
   screen: TScreen;
+  font: TPallet;
+  mousefifo: TMouse;
   keyboard: TKeyboard;
-  keybuf: TBytes;
   i: SmallInt;
   memtest: TMemtest;
   memtotal: Cardinal;
@@ -20,54 +22,72 @@ var
   mem: TMem;
   sheet: TShtCtl;
   mouse, win, back: integer;
+  s: string[40];
+  buf_win, buf_back, keybuf, buf_mouse: TBytes;
+  mx, my: integer;
 
-procedure window8(buf: array of Byte; xsize, ysize: integer; var title: string);
+procedure window8(buf: TBytes; xsize, ysize: integer; title: PAnsiChar);
 const
-  closebtn: array [0 .. 14, 0 .. 15] of Char = (('0', '0', '0', '0', '0', '0',
-    '0', '0', '0', '0', '0', '0', '0', '0', '0', '@'),
-    ('0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', '$',
-    '@'), ('0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q',
-    '$', '@'), ('0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q',
-    'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', '@', '@', 'Q', 'Q', 'Q', 'Q', '@', '@',
-    'Q', 'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', 'Q', '@', '@', 'Q', 'Q', '@', '@',
-    'Q', 'Q', 'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', 'Q', 'Q', '@', '@', '@', '@',
-    'Q', 'Q', 'Q', 'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', '@', '@',
-    'Q', 'Q', 'Q', 'Q', 'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', 'Q', 'Q', '@', '@',
-    '@', '@', 'Q', 'Q', 'Q', 'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', 'Q', '@', '@',
-    'Q', 'Q', '@', '@', 'Q', 'Q', 'Q', '$', '@'), ('0', 'Q', 'Q', 'Q', '@', '@',
-    'Q', 'Q', 'Q', 'Q', '@', '@', 'Q', 'Q', '$', '@'),
-    ('0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', '$',
-    '@'), ('0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q',
-    '$', '@'), ('0', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$',
-    '$', '$', '@'), ('@', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@',
-    '@', '@', '@', '@'));
-begin
-
-end;
-
+  closebtn: array [0 .. 14] of string[16] = ( //
+    ('000000000000000@'), //
+    ('0QQQQQQQQQQQQQ$@'), //
+    ('0QQQQQQQQQQQQQ$@'), //
+    ('0QQQQQQQQQQQQQ$@'), //
+    ('0QQQ@@QQQQ@@QQ$@'), //
+    ('0QQQQ@@QQ@@QQQ$@'), //
+    ('0QQQQQ@@@@QQQQ$@'), //
+    ('0QQQQQQ@@QQQQQ$@'), //
+    ('0QQQQQ@@@@QQQQ$@'), //
+    ('00QQQ@@QQ@@QQQ$@'), //
+    ('0QQQ@@QQQQ@@QQ$@'), //
+    ('0QQQQQQQQQQQQQ$@'), //
+    ('0QQQQQQQQQQQQQ$@'), //
+    ('0$$$$$$$$$$$$$$@'), //
+    ('@@@@@@@@@@@@@@@@') //
+    );
+var
+  y: integer;
+  x: integer;
+  c: AnsiChar;
+  i: Byte;
 begin
-  screen:=TScreen.Create;
-  screen.Init(binfo^.vram,binfo^.scrnx,binfo^.scrny);
-  keyboard := TKeyboard.Create;
-  SetLength(keybuf, 32);
-  with keyboard do
+  with screen do
   begin
-    keyfifo.Init(fifo, 32, keybuf);
-    while True do
+    boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, xsize - 1, 0);
+    boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, xsize - 2, 1);
+    boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, 0, ysize - 1);
+    boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, 1, ysize - 2);
+    boxfill8(buf, xsize, COL8_848484, xsize - 2, 1, xsize - 2, ysize - 2);
+    boxfill8(buf, xsize, COL8_000000, xsize - 1, 0, xsize - 1, ysize - 1);
+    boxfill8(buf, xsize, COL8_C6C6C6, 2, 2, xsize - 3, ysize - 3);
+    boxfill8(buf, xsize, COL8_000084, 3, 3, xsize - 4, 20);
+    boxfill8(buf, xsize, COL8_848484, 1, ysize - 2, xsize - 2, ysize - 2);
+    boxfill8(buf, xsize, COL8_000000, 0, ysize - 1, xsize - 1, ysize - 1);
+  end;
+  font.putfonts8_asc(buf, xsize, 24, 4, COL8_FFFFFF, title);
+  for y := 0 to 14 do
+    for x := 1 to 16 do
     begin
-      io_cli;
-      if keyfifo.Status(fifo) = 0 then
-        // ioshift()
+      c := closebtn[y][x];
+      case c of
+        '@':
+          i := COL8_000000;
+        '$':
+          i := COL8_848484;
+        '0':
+          i := COL8_C6C6C6;
       else
-      begin
-        i := keyfifo.Get(fifo);
-        io_sti;
-        // sprintf
-        // boxfill8
-        // putfonts8
+        i := COL8_FFFFFF;
       end;
+      buf[(5 + y) * xsize + (xsize - 21 + x)] := i;
     end;
-  end;
+end;
+
+begin
+  screen := TScreen.Create;
+  screen.Init(binfo^.vram, binfo^.scrnx, binfo^.scrny);
+  keyboard := TKeyboard.Create;
+  mousefifo := TMouse.Create;
   {
     memtest:=TMemtest.Create;
     memtotal:=memtest.memtest($00400000,$bfffffff);
@@ -78,13 +98,65 @@ begin
     mem.Free;
     memtest.Free;
   }
+  font := TPallet.Create;
   sheet := TShtCtl.Create;
   back := sheet.allock;
   mouse := sheet.allock;
   win := sheet.allock;
   sheet.slide(mouse, 10, 10);
   sheet.slide(win, 80, 72);
+  SetLength(buf_win, 160 * 68);
+  SetLength(keybuf, 32);
+  SetLength(buf_mouse, 128);
+  sheet.setbuf(back, buf_back, binfo^.scrnx, binfo^.scrny, -1);
+  sheet.setbuf(mouse, buf_mouse, 16, 16, 99);
+  sheet.setbuf(win, buf_win, 160, 68, -1);
+  font.mouse_cursor8(buf_mouse, 99);
+  window8(buf_win, 160, 68, 'window');
+  font.putfonts8_asc(buf_win, 160, 24, 28, COL8_000000, 'Welcom to');
+  font.putfonts8_asc(buf_win, 160, 24, 44, COL8_000000, 'Haribote-XE');
+  mx := (binfo^.scrnx - 16) div 2;
+  my := (binfo^.scrny - 28 - 16) div 2;
+  sheet.slide(mouse, mx, my);
+  sheet.slide(win, 80, 72);
+  sheet.updown(back, 0);
+  sheet.updown(mouse, 1);
+  sheet.updown(win, 2);
+  // sprintf
+  font.putfonts8_asc(binfo^.vram, 0, 32, COL8_FFFFFF, s);
+  sheet.refresh(Rect(0, 0, 80, 16));
+  mousefifo.Init(mousefifo.fifo8, 128, buf_mouse);
+  keyboard.Init(keyboard.fifo8, 32, keybuf);
+  while True do
+  begin
+    io_cli;
+    if keyboard.fifo.Status(keyboard.fifo8) + mousefifo.fifo.Status
+      (mousefifo.fifo8) = 0 then
+      io_stihlt
+    else
+    begin
+      if keyboard.fifo.Status(keyboard.fifo8) <> 0 then
+      begin
+        i := keyboard.fifo.Get(keyboard.fifo8);
+        io_sti;
+        // sprintf
+        screen.boxfill8(buf_back, binfo^.scrnx, COL8_008484, 0, 16, 15, 31);
+        font.putfonts8_asc(buf_back, binfo^.scrnx, 0, 16, COL8_FFFFFF, s);
+        sheet.refresh(Rect(0, 16, 16, 32));
+      end
+      else if mousefifo.fifo.Status(mousefifo.fifo8) <> 0 then
+      begin
+        i := mousefifo.fifo.Get(mousefifo.fifo8);
+        io_sti;
+        sheet.refresh(Rect(0, 0, 80, 16));
+      end;
+    end;
+  end;
+  font.Free;
   sheet.Free;
   keyboard.Free;
+  mousefifo.Free;
+  Finalize(keybuf);
   screen.Free;
+
 end.