procedure page_01; const BIOScseg = $C000; BIOSext = $AA55; PCROMseg = $F000; dells: array [2..$11] of string[5] = ('200', '300', '?', '220', '310', '325', '?', '310A', '316', '220E', '210', '316SX', '316LT', '320LX', '?', '425E'); dellnums: set of 0..$FF = [2, 3, 5..7, 9..$0F, $11]; var xbool : boolean; xbyte : byte; xchar : char; xlong : longint; xword1 : word; xword2 : word; s: string; function BIOSscan(a, b, c : word; var d : word) : boolean; const max = 3; notice : array[1..max] of string = ('(C)', 'COPR.', 'COPYRIGHT'); var i : 1..max; len : byte; target : string; xbool : boolean; xlong : longint; xword : word; function scan(a : string; b, c, d : word; var e : word) : boolean; var i : longint; j : byte; len : byte; xbool1 : boolean; xbool2 : boolean; begin i:=c; len:=length(a); xbool1:=false; repeat if i <= longint(d) - len + 1 then begin j:=0; xbool2:=false; repeat if j < len then if upcase(chr(mem[b : i + j])) = a[j + 1] then inc(j) else begin xbool2:=true; inc(i) end else begin xbool2:=true; xbool1:=true; e:=i; scan:=true end until xbool2 end else begin xbool1:=true; scan:=false end until xbool1 end; {scan} begin (* function BIOSscan *) xlong:=c; xbool:=false; for i:=1 to max do begin target:=notice[i]; len:=length(target); if xbool then xlong:=longint(xword) - 2 + len; if (xlong >= b) and (xlong <= c) and (scan(target, a, b, xlong, xword)) then xbool:=true end; if xbool then begin while (xword > b) and (chr(mem[a : xword - 1]) in pchar) do dec(xword); d:=xword end; BIOSscan:=xbool end; {biosscan} procedure showBIOS(a, b : word); var xbool : boolean; xchar : char; begin xbool:=false; repeat xchar:=chr(mem[a : b]); if xchar in pchar then begin write(xchar); if b < $FFFF then inc(b) else xbool:=true end else xbool:=true until xbool; writeln end; {showbios} begin (* procedure page_01 *) caption2('Machine type'); if UpCase(Chr(Mem[$F000:$E076])) = 'D' then begin s:=''; for xword1:=$E077 to $E079 do s:=s + UpCase(Chr(Mem[$F000:xword1])); if s = 'ELL' then begin Write('Dell '); xbool:=true; xbyte:=Mem[$F000:$E845]; if xbyte in dellnums then Write(dells[xbyte]) else begin Write('(unknown - ID is ', hex(xbyte, 2)); xbool:=false end; if xbool then begin caption3('BIOS Revision'); for xword1:=$E845 to $E847 do Write(Chr(Mem[$F000:xword1])) end; Writeln; caption2('Standard BIOS call says'); Writeln end end; with regs do begin AH:=$C0; intr($15, regs); if nocarry then begin xword1:=memw[ES : BX + 2]; xbyte:=MemW[ES:BX + 4]; case xword1 of $00FC: if xbyte = 1 then Writeln('PC-AT 2x9') else Writeln('Industrial AT 7531/2'); $01FC: case xbyte of $00: Writeln('PC-AT 3x9 or clone'); $30: Writeln('Tandy 3000NL') else Writeln('Compaq 286/386 or clone'); end; $00FB: if xbyte = 1 then Writeln('PC-XT w/ Enh kbd, 3.5" support') else Writeln('PC-XT'); $01FB: Writeln('PC-XT/2'); $02FC: Writeln('PC-XT/286'); $00F9: Writeln('PC-Convertible'); $00FA: Writeln('PS/2 Model 30'); $01FA: Writeln('PS/2 Model 25'); $09FC: Writeln('PS/2 Model 30-286'); $04FC: if xbyte = 3 then Writeln('PS/2 Model 50Z') else Writeln('PS/2 Model 50'); $05FC: Writeln('PS/2 Model 60'); $04F8, $09F8: Writeln('PS/2 Model 70'); $0CF8: Writeln('PS/2 Model 55SX'); $1BF8: Writeln('PS2 Model 70-486'); $00F8: Writeln('PS/2 Model 80 16MHz'); $01F8: Writeln('PS/2 Model 80 20MHz'); $06FC: Writeln('7552 Gearbox'); $81FC: Writeln('AT clone with Phoenix 386 BIOS'); else unknown('machine - model/type word', xword1, 4); end; {case} caption3('BIOS revision level'); writeln(mem[ES : BX + 4]); xbyte:=mem[ES : BX + 5]; caption3('DMA channel 3 used'); yesorno(xbyte and $80 = $80); caption3('Slave 8259 present'); yesorno(xbyte and $40 = $40); caption3('Real-time clock'); yesorno(xbyte and $20 = $20); caption3('Keyboard intercept available'); yesorno(xbyte and $10 = $10); caption3('Wait for external event available'); yesorno(xbyte and $08 = $08); caption3('Extended BIOS data area segment'); if xbyte and $04 = $04 then begin AH:=$C1; intr($15, regs); if nocarry then writeln(hex(ES, 4)) else dontknow end else writeln('(none)'); caption3('Micro Channel'); yesorno(xbyte and $02 = $02) end else begin xbyte:=mem[$FFFF : $000E]; s:=''; for xword1:=$FFF5 to $FFFC do s:=s + Chr(Mem[$F000:xword1]); case xbyte of $FF : begin Write('PC '); if s = '04/24/81' then Write('(original)'); if s = '10/19/81' then Write('(revised BIOS)'); if s = '10/27/82' then Write('(HD, 640K, EGA supported)'); Writeln; end; $FE : begin Write('PC-XT'); if s = '11/08/82' then Write(' or Portable'); Writeln; end; $FD : writeln('PCjr'); $FC : writeln('PC-AT'); $9A : Writeln('Compaq XT or Compaq Plus'); $30 : Writeln('Sperry PC'); $2D : Writeln('Compaq PC or Compaq Deskpro') else unknown('machine - model byte', xbyte, 2) end end end; (* Byte 12:12 p. 174 *) caption2('BIOS source'); if BIOSscan(PCROMseg, $C000, $FFFF, xword1) then showBIOS(PCROMseg, xword1) else dontknow; caption2('BIOS date'); i:=$0005; xbool:=false; xchar:=chr(mem[$FFFF : i]); while (i < $0010) and (xchar in pchar) do begin xbool:=true; write(xchar); inc(i); xchar:=chr(mem[$FFFF : i]) end; if xbool then writeln else dontknow; caption2('BIOS extensions'); xword1:=BIOScseg; xbool:=false; for i:=0 to 94 do begin if (memw[xword1 : 0] = BIOSext) then begin if not xbool then begin writeln; window(3, wherey + hi(windmin), twidth, tlength - 2); caption1('Segment Size Copyright notice'); writeln; xbool:=true end; pause2; if endit then Exit; Write(hex(xword1, 4), ' ', ((longint(512) * Mem[xword1: 2]) div 1024):3, 'K '); if BIOSscan(xword1, $0000, $1FFF, xword2) then showBIOS(xword1, xword2) else dontknow end; inc(xword1, $0080) end; if not xbool then writeln('(none)') end;