6 System.Classes, System.Generics.Collections, System.SysUtils, System.Types,
11 cyls, legs, vmode, reserve: Int8;
18 p, q, size, free, flags: integer;
25 constructor Create(size: integer);
26 destructor Destroy; override;
27 function Put(data: integer): integer;
28 function Get: SmallInt;
29 function Status: integer;
37 KEYSTA_SEND_NOTREADY = $02;
38 KEYCMD_WRITE_MODE = $60;
42 buf: array [0 .. 255] of Byte;
43 procedure wait_KBC_sendready;
45 procedure inthandler21(var esp: integer); virtual; abstract;
48 TKeyboard = class(TDevice)
50 cursor_c = COL8_FFFFFF;
53 procedure make_table(const keys1, keys2: array of const);
55 keytable0, keytable1: array [$00 .. $80] of Byte;
57 constructor Create(fifo: TFifo; data0: integer);
58 procedure inthandler21(var esp: integer); override;
62 buf: array [0 .. 2] of Byte;
67 TMouse = class(TDevice)
69 KEYCMD_SENDTO_MOUSE = $D4;
70 MOUSECMD_ENABLE = $F4;
75 constructor Create(fifo: TFifo; data0: integer);
76 function decode(dat: UInt8): integer;
77 procedure inthandler21(var esp: integer); override;
82 function memtest_sub(start, endpos: Cardinal): Cardinal;
84 function memtest(start, endpos: Cardinal): Cardinal;
93 frees, maxfrees, lostsize, losts: integer;
94 free: TList<TFREEINFO>;
96 destructor Destroy; override;
101 procedure Init(mem: TMEMMAN);
102 function total(mem: TMEMMAN): Cardinal;
103 function alloc(mem: TMEMMAN; size: Cardinal): Cardinal;
104 function memfree(mem: TMEMMAN; addr, size: Cardinal): integer;
108 FLAGSOVERRUN = $0001;
123 ADR_BOOTINFO = $00000FF0;
131 destructor TFifo.Destroy;
137 function TFifo.Get: SmallInt;
139 if fifo.free = fifo.size then
144 result := fifo.buf[fifo.q];
146 if fifo.q = fifo.size then
151 constructor TFifo.Create(size: integer);
154 SetLength(fifo.buf, size);
162 function TFifo.Put(data: integer): integer;
164 if fifo.free = 0 then
166 fifo.flags := FLAGSOVERRUN;
170 fifo.buf[fifo.p] := data;
172 if fifo.p = fifo.size then
178 function TFifo.Status: integer;
180 result := fifo.size - fifo.free;
185 function TMemtest.memtest(start, endpos: Cardinal): Cardinal;
187 EFLAGS_AC_BIT = $00040000;
188 CR0_CASH_DISABLE = $60000000;
194 eflg := io_load_eflags;
195 eflg := eflg or EFLAGS_AC_BIT;
196 io_store_eflags(eflg);
197 eflg := io_load_eflags();
198 if (eflg and EFLAGS_AC_BIT) <> 0 then
200 eflg := eflg and EFLAGS_AC_BIT;
201 io_store_eflags(eflg);
205 cr0 := cr0 or CR0_CASH_DISABLE;
208 result := memtest_sub(start, endpos);
212 cr0 := cr0 and CR0_CASH_DISABLE;
217 function TMemtest.memtest_sub(start, endpos: Cardinal): Cardinal;
228 p := Pointer(i + $FFC);
231 p^ := p^ XOR $FFFFFFFF;
237 p^ := p^ XOR $FFFFFFFF;
251 function TMem.alloc(mem: TMEMMAN; size: Cardinal): Cardinal;
257 for i := 0 to mem.free.Count - 1 do
258 if mem.free[i].size >= size then
272 procedure TMem.Init(mem: TMEMMAN);
280 function TMem.memfree(mem: TMEMMAN; addr, size: Cardinal): integer;
286 for i := 0 to mem.free.Count - 1 do
287 if mem.free[i].addr > addr then
293 if mem.free[i - 1].addr + mem.free[i - 1].size = addr then
295 s := mem.free[i - 1];
297 if addr + size = s.addr then
299 inc(s.size, mem.free[i].size);
302 mem.free[i - 1] := s;
306 if addr + size = mem.free[i].addr then
317 mem.maxfrees := mem.free.Count;
318 mem.free.Insert(i, s);
322 function TMem.total(mem: TMEMMAN): Cardinal;
327 for i := 0 to mem.free.Count - 1 do
328 inc(result, mem.free[i].size);
333 constructor TMEMMAN.Create;
336 free := TList<TFREEINFO>.Create;
339 destructor TMEMMAN.Destroy;
347 constructor TMouse.Create(fifo: TFifo; data0: integer);
352 wait_KBC_sendready();
353 io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
354 wait_KBC_sendready();
355 io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
359 function TMouse.decode(dat: UInt8): integer;
368 if (dat and $CB) = $08 then
386 btn := dec.buf[0] and $07;
389 if (buf[0] and $10) <> 0 then
391 if (buf[0] and $20) <> 0 then
402 procedure TMouse.inthandler21(var esp: integer);
406 io_out8(PIC1_OCW2, $64);
407 io_out8(PIC0_OCW2, $62);
408 i := io_in8(PORT_KEYDAT);
409 fifo.Put(i + mousedata);
414 procedure TDevice.wait_KBC_sendready;
417 if io_in8(PORT_KEYSTA) and KEYSTA_SEND_NOTREADY = 0 then
423 constructor TKeyboard.Create(fifo: TFifo; data0: integer);
429 io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
431 io_out8(PORT_KEYDAT, KBC_MODE);
432 make_table([0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^',
433 $08, 0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', $0A, 0,
434 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X',
435 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0,
436 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3',
437 '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
438 0, 0, 0, 0, 0, 0, 0, 0, 0, $5C, 0, 0, 0, 0, 0, 0, 0, 0, 0, $5C, 0, 0],
439 [0, 0, '!', $22, '#', '$', '%', '&', $27, '(', ')', '~', '=', '~', $08, 0,
440 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', $0A, 0, 'A',
441 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0, 0, '}', 'Z', 'X', 'C',
442 'V', 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0,
443 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0',
444 '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0]);
448 procedure TKeyboard.inthandler21(var esp: integer);
452 io_out8(PIC0_OCW2, $61);
453 i := io_in8(PORT_KEYDAT);
454 fifo.Put(i + keydata);
457 procedure TKeyboard.make_table(const keys1, keys2: array of const);
461 for i := 0 to High(keys1) do
462 keytable0[i] := keys1[i].VType;
463 for i := 0 to High(keys2) do
464 keytable1[i] := keys2[i].VType;