home *** CD-ROM | disk | FTP | other *** search
- {$C-}
- {$R-}
- program pc_status;
-
- const dos_ds = $0040;
- dos_ds_str = '0040:';
-
- type registers = record
- ax, bx, cx, dx, bp, si, di, ds, es, flags: integer
- end;
-
- info = record case integer of
- 1 : (b: byte);
- 2 : (i: integer);
- 3 : (pac: packed array[0..7] of char)
- end;
-
- addr_ptr = ^full_address;
- full_address = record
- offset,
- segment: integer
- end;
-
- page_ptr = ^page;
- page = packed array[0..4095] of char;
-
- s80 = string[80];
-
- var regs : registers;
- crt_mode_set,
- data_ptr : ^info;
- old_int_vec,
- new_int_vec : addr_ptr;
- p0, p1 : page_ptr;
- equip_flag,
- mem_size,
- max_drives,
- i : integer;
- CGA80 : boolean;
-
- { DOS command line area in our PSP not otherwise used in this program }
- error : integer absolute cseg:$0080;
-
-
- function use_env(which: boolean; var name: s80; var value: s80): boolean;
- external 'useenv.com';
-
-
- { Get an interrupt vector's address }
- procedure get_vector(vec_num: byte; var address: addr_ptr);
- begin
- regs.ax := $3500 + vec_num;
- msdos(regs);
- address := ptr(regs.es, regs.bx)
- end;
-
-
- { Set an interrupt vector's address }
- procedure set_vector(vec_num: byte; var address: addr_ptr);
- begin
- regs.ax := $2500 + vec_num;
- regs.ds := seg(address^);
- regs.dx := ofs(address^);
- msdos(regs)
- end;
-
- { Handler is enterred at its first byte of user-specified code.
- This means we bypass Turbo's set up for a normal procedure entry.
- All Handler does is save the error code reported by DOS (we assume
- a disk error), clean up the stack, and pass control directly back
- to the Turbo code file location following the INT 21 which resulted
- in the critical handler being invoked }
-
- procedure handler;
- begin
-
- { move the error code in DI into our error variable }
- inline ($FB/$2E/$89/$3E/$80/$00);
- { FB STI
- 2E CS:
- 893E8000 MOV [0080],DI }
-
- { pop off the DOS return info and a set of registers }
- inline ($58/$58/$58/$58/$5B/$59/$5A/$5E/$5F/$5D/$1F/$07);
- { 58 POP AX DOS return address
- 58 POP AX " "
- 58 POP AX DOS flags register
- 58 POP AX Turbo registers
- 5B POP BX " "
- 59 POP CX " "
- 5A POP DX " "
- 5E POP SI " "
- 5F POP DI " "
- 5D POP BP " "
- 1F POP DS " "
- 07 POP ES " " }
-
- { override the normal Turbo return with an IRET }
- inline ($CF);
- { CF IRET }
- end;
-
-
- procedure write_hex( value: integer );
- const hexes : array[0..$F] of char = '0123456789ABCDEF';
- var bump, divisor : integer;
- begin
- if value < 0 then
- begin
- value := value - 32767 - 1;
- bump := 8
- end
- else
- bump := 0;
- divisor := 4096;
- while divisor >= 1 do
- begin
- write( hexes[bump + (value div divisor)] );
- value := value mod divisor;
- divisor := divisor div 16;
- bump := 0
- end
- end;
-
-
- procedure blank_display;
- begin
- crt_mode_set := ptr(dos_ds, $0065);
- crt_mode_set^.b := crt_mode_set^.b and $F7;
- port[$03d8] := crt_mode_set^.b
- end;
-
-
- procedure restore_display;
- begin
- crt_mode_set := ptr(dos_ds, $0065);
- crt_mode_set^.b := crt_mode_set^.b and $F7;
- crt_mode_set^.b := crt_mode_set^.b + $08;
- port[$03d8] := crt_mode_set^.b
- end;
-
-
- procedure move_page( from_page, to_page: page_ptr);
- begin
- blank_display;
- move(from_page^, to_page^, sizeof(page));
- restore_display
- end;
-
-
- function has_cga: boolean;
- var base_6845: ^integer;
- begin
- base_6845 := ptr($0040, $0063);
- has_cga := base_6845^ = $3D4
- end;
-
-
- procedure save_a_copy;
- begin
- p0 := ptr($B800, 0);
- p1 := ptr($B800, 4096);
- move_page(p0, p1)
- end;
-
-
- procedure layout;
- begin
- clrscr;
- if has_cga then textbackground(blue);
- textcolor(cyan);
- writeln('IMMMMMMMMMMMMMMMMMMMQMMMMMMMMMMMMMMMMMMMQMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM;');
- write( ':');
- textcolor(yellow);
- write( ' MEMORY:');
- textcolor(cyan);
- write('3':12);
- textcolor(yellow);
- write(' EQUIPMENT:');
- textcolor(cyan);
- write('3': 9);
- textcolor(yellow);
- write(' VIDEO: ');
- textcolor(cyan);
- writeln(':':29);
- writeln(': Planar 3 Printers 3 Initial Mode',':':25);
- writeln(': Total 3 Serial Ports 3 Current Mode',':':25);
- writeln(': Free 3 Floppy Drives 3 Attribute @ Cursor',':':19);
- writeln(': From 3 Game Adaptor 3 Buffer Offset, Length',':':16);
- writeln('GDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDD4 Video Page',':':27);
- write(':');
- textcolor(yellow);
- write(' KEYBOARD BUFFER:');
- textcolor(cyan);
- writeln('3':23,' Cursor Mode',':':26);
- writeln(': Capacity Start 3 6845 Mode',':':28);
- writeln(': ( characters ) End 3 6845 Pallette',':':24);
- writeln('GDDDDDDDDDDDDDDDDDDDBDDDDDDDDDDDDDDDDDDDEDDDDDDDDDDDDDDDDDBDDDDDDDDDDDDDDDDDDD6');
- write(':');
- textcolor(yellow);
- write(' DOS VER:');
- textcolor(cyan);
- write('3':11);
- textcolor(yellow);
- write(' ROM VER:');
- textcolor(cyan);
- write('3':11);
- textcolor(yellow);
- write(' ^C CHECK:');
- textcolor(cyan);
- write('3':8);
- textcolor(yellow);
- write(' DISK VERIFY:');
- textcolor(cyan);
- writeln(':':7);
- writeln('GDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDD6');
- write(':');
- textcolor(yellow);
- write(' FREE SPACE ON DISKETTE DRIVES:');
- textcolor(cyan);
- writeln(':':47);
- writeln(':',':':78);
- writeln(':',':':78);
- writeln('GDDDDDDDDDDDDDDDDDDDDBDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD6');
- write(':');
- textcolor(yellow);
- write(' F. D. PARAMETERS:');
- textcolor(cyan);
- write('3':3);
- textcolor(yellow);
- write(' ENVIRONMENT SETTINGS:');
- textcolor(cyan);
- writeln(':':35);
- writeln(': On Time ms 3',':':57);
- writeln(': Off Time s 3',':':57);
- writeln(': Settling ms 3',':':57);
- writeln(': B/S, S/T 3',':':57);
- writeln('HMMMMMMMMMMMMMMMMMMMMOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM<');
- write(' PC-STATUS','Copyright 1985 John D. Falconer ':69);
- textcolor(green)
- end;
-
-
- procedure show_equipment;
- begin
- data_ptr := ptr(dos_ds, $0010);
- equip_flag := data_ptr^.i;
- max_drives := ((equip_flag shr 6) and 3) * (1 and equip_flag)
- + (1 and equip_flag);
- gotoxy(38,3); write(equip_flag shr 14:2);
- gotoxy(38,4); write((equip_flag shr 9) and 7:2);
- gotoxy(38,5); write(max_drives:2);
- gotoxy(38,6); write((equip_flag shr 12) and 1:2);
- gotoxy(13,3); write(((equip_flag shr 2) and 3) * 16 + 16:6, 'K');
- end;
-
-
- procedure show_total_memory;
- begin
- data_ptr := ptr(dos_ds, $0013);
- mem_size := data_ptr^.i;
- gotoxy(13, 4); write(mem_size:6,'K')
- end;
-
-
- procedure show_mem_usage;
- begin
- gotoxy(16, 5); write(mem_size - (cseg + 16) div 64,'K');
- gotoxy(10, 6); write_hex(cseg); write(':0100H')
- end;
-
-
- procedure show_kb_info;
- var kb_start, kb_end: integer;
- begin
- data_ptr := ptr(dos_ds, $0080);
- kb_start := data_ptr^.i;
- gotoxy( 30, 9); write(dos_ds_str); write_hex(kb_start); write('H');
- data_ptr := ptr(dos_ds, $0082);
- kb_end := data_ptr^.i;
- gotoxy( 30,10); write(dos_ds_str); write_hex(kb_end); write('H');
- gotoxy( 14, 9); writeln((kb_end - kb_start)/2 - 1:0:0)
- end;
-
-
- procedure show_video_info;
-
- procedure show_initial_video( mode: integer );
- begin
- gotoxy(64,3);
- case (mode) and 3 of
- 1: write('40 x 25 BW/CGA');
- 2: write('80 x 25 BW/CGA');
- 3: write('80 x 25 BW/BW');
- end
- end;
-
-
- procedure show_current_video;
- begin
- data_ptr := ptr(dos_ds, $0049);
- gotoxy(64, 4);
- case (data_ptr^.b) of
- 0: write('40 x 25 BW');
- 1: write('40 x 25 color');
- 2: write('80 x 25 BW');
- 3: write('80 x 25 color');
- end;
- CGA80 := data_ptr^.b = 3
- end;
-
-
- procedure show_attribute;
-
- function get_attr: byte;
- begin
- regs.ax := $0800;
- regs.bx := $0100;
- intr($10, regs);
- get_attr := regs.ax shr 8
- end;
-
- begin { show_attribute }
- gotoxy(72, 5);
- write(get_attr:6)
- end;
-
-
- begin { show_video_info }
- show_initial_video(equip_flag shr 4);
- show_current_video;
- show_attribute;
- data_ptr := ptr(dos_ds, $004E); { crt_start }
- gotoxy(65, 6); write(data_ptr^.i:6,',');
- data_ptr := ptr(dos_ds, $004C); { crt_len }
- gotoxy(72, 6); write(data_ptr^.i:6);
- data_ptr := ptr(dos_ds, $0062); { active_page }
- gotoxy(72, 7); write(data_ptr^.b:6);
- data_ptr := ptr(dos_ds, $0060); { cursor_mode }
- gotoxy(72, 8); write(data_ptr^.i:6);
- gotoxy(72, 9); write(data_ptr^.b:6);
- data_ptr := ptr(dos_ds, $0066); { crt_pallette }
- gotoxy(72, 10); write(data_ptr^.b:6)
- end;
-
-
- procedure show_version_info;
- type s4 = string[4];
- var dos_version: s4;
-
- procedure get_version( var dos_version: s4 );
- begin
- dos_version := ' .00';
- regs.ax := $3000;
- msdos(regs);
- dos_version[1] := chr(lo(regs.ax) + ord('0'));
- if hi(regs.ax) >= 10 then
- dos_version[3] := chr((hi(regs.ax) div 10) + ord('0'));
- dos_version[4] := chr((hi(regs.ax) mod 10) + ord('0'));
- end;
-
- begin { show_version_info }
- get_version(dos_version);
- gotoxy(16, 12); write(dos_version);
- data_ptr := ptr($F000, $FFF5);
- gotoxy(32, 12); for i := 0 to 7 do write(data_ptr^.pac[i]);
- end;
-
-
- procedure show_control_C;
-
- function control_C_check: boolean;
- begin
- regs.ax := $3300;
- msdos(regs);
- control_C_check := (regs.dx and $01) = 1
- end;
-
- begin
- gotoxy(55, 12);
- if control_C_check then write('ON':3) else write('OFF')
- end;
-
-
- procedure show_disk_verify;
-
- function disk_verify_check: boolean;
- begin
- regs.ax := $5400;
- msdos(regs);
- disk_verify_check := (regs.ax and $01) = 1
- end;
-
- begin
- gotoxy(75, 12);
- if disk_verify_check then write('ON':3) else write('OFF')
- end;
-
-
- procedure show_env_info;
- var env_name,
- env_value: s80;
-
- procedure show_env(env_name: s80);
- begin
- write(env_name + ' = ':10);
- if use_env( false, env_name, env_value ) then
- write(env_value)
- else
- write('undefined');
- end;
-
- begin { show_env_info }
- gotoxy(24, 19); show_env('COMSPEC');
- gotoxy(24, 20); show_env('PROMPT');
- gotoxy(24, 21); show_env('PATH')
- end;
-
-
- procedure show_disk_parms;
- const disk_pointer = $0078;
- type disk_info = record
- misc1, misc2, motor_wait,
- bytes_sector, sectors_track, gap_length,
- dtl, fmt_gap_length, fmt_fill_byte,
- settle, motor_start
- : byte
- end;
- var disk_vector : addr_ptr;
- disk_parms : ^disk_info;
- begin
- disk_vector := ptr($0000, disk_pointer);
- disk_parms := ptr(disk_vector^.segment, disk_vector^.offset);
- with disk_parms^ do
- begin
- gotoxy(15, 19); write(125 * motor_start:3);
- gotoxy(15, 20); write(motor_wait / 18.5:3:1);
- gotoxy(15, 21); write( settle:3);
- gotoxy(14, 22); write(256 * bytes_sector:3,',');
- gotoxy(18, 22); write(sectors_track:3);
- end
- end;
-
-
- procedure show_drive_space;
- var drive: byte;
- avail: real;
-
- function free_space(drv_num: byte): real;
- var a, b, c: real;
- begin
- regs.ax := $3600;
- regs.dx := drv_num;
- msdos(regs);
- if regs.ax <> $FFFF then
- begin
- a := regs.ax;
- b := regs.bx;
- c := regs.cx;
- free_space := a * b * c
- end
- else
- free_space := -1
- end;
-
- begin
- drive := 0;
- while drive < max_drives do
- begin
- error := 0;
- gotoxy( 3 + drive mod 4 * 20, 15 + drive div 4);
- drive := drive + 1;
- write(chr(drive - 1 + ord('A')),': ');
-
- {
- If DOS generates a critical error interrupt because of a problem
- during free_space's use of a drive, the interrupt will be handled
- by "handler" which will load the code of the error into our "error"
- variable.
- }
-
- avail := free_space(drive);
- if error > 0 then
- begin
- textcolor(red + blink);
- case error of
- 1 : write('UNK. UNIT');
- 2 : write('NOT READY');
- 4 : write('CRC ERROR');
- 8 : write('SECTOR ERROR')
- end;
- textcolor(green)
- end
- else
- if avail = -1 then write('UNAVAILABLE')
- else
- write(avail:8:0);
- end
- end;
-
-
- begin
- get_vector($24, old_int_vec);
- new_int_vec := ptr(cseg, ofs(handler) + 7);
- set_vector($24, new_int_vec);
- layout;
- show_equipment;
- show_total_memory;
- show_mem_usage;
- show_kb_info;
- show_video_info;
- show_version_info;
- show_control_C;
- show_disk_verify;
- show_env_info;
- show_disk_parms;
- show_drive_space;
- gotoxy(1, 24);
- if has_cga then save_a_copy;
- set_vector($24, old_int_vec)
- end.