[Back to CRT SWAG index]  [Back to Main SWAG index]  [Original]

unit mycrt;
{$g+}

INTERFACE

const
  colseg:word=$b800;

procedure ch2scr(x,y:word;ch:char;c:byte);
procedure str2scr(const s:string;const x,y:word;const c:byte);
function  readkey:char;
function  keypressed:boolean;
procedure centerstr(const s:string;const y:word;const c:byte);
procedure centerstr2(const s:string;const y:word;const c:byte);
procedure textbox(const x,y,x2,y2:byte;const c:byte;const cha:char);
procedure clrscr(const where:word;const c:byte;const c2:char);
function  activepage:byte;
function  where_x(const page:byte):byte;
function  where_y(const page:byte):byte;
function  wherex:byte;
function  wherey:byte;
procedure goto_xy(const page,x,y:byte);
procedure gotoxy(const x,y:byte);
procedure setcursor(const cursor:word);
function  getcursor:word;
procedure hcursor;
procedure scursor;
procedure dupeit(c:char;co:byte;n,x,y:word);
procedure statbar(snum,bnum:longint;x,y,fc,ec:byte);

IMPLEMENTATION

procedure ch2scr(x,y:word;ch:char;c:byte); assembler;
asm
  mov es,segb800
  dec [x]
  dec [y]
  mov di,[y]
  mov bx,di
  shl di,6
  shl bx,4
  add di,bx
  add di,[x]
  mov al,[&ch]
  mov ah,[c]
  mov es:[di],ax
end;

procedure str2scr(const s:string;const x,y:word;const c:byte); assembler;
asm
  push ds
  dec [x]
  dec [y]
  mov es,segb800
  mov di,[y]
  mov bx,di
  shl di,6
  shl bx,4
  add di,bx
  add di,[x]
  shl di,1
  lds si,s

  xor ch,ch
  mov cl,ds:[si]
  inc si
  mov ah,[c]
 @@loop:
   lodsb
   stosw
   loop @@loop
 @@exit:
 pop ds
end;

function readkey:char; assembler;
asm
  xor ah,ah
  int 16h
end;

function keypressed:boolean; assembler;
asm
  mov ah, 01h
  int 16h
  mov ax, 00h
  jz @1
  inc ax
  @1:
end;

procedure centerstr(const s:string;const y:word;const c:byte); assembler;
asm
  push ds
  xor ax,ax
  xor cx,cx
  dec [y]
  mov es,segb800
  mov di,[y]
  mov bx,di
  shl di,6
  shl bx,4
  add di,bx
  shl di,1
  lds si,s
  mov bx,40
  mov al,ds:[si]
  mov cl,al
  sub bx,ax
  add di,bx
  add di,bx
  inc si
  mov ah,[c]
 @@loop:
   lodsb
   stosw
   loop @@loop
 @@exit:
 pop ds
end;

procedure centerstr2(const s:string;const y:word;const c:byte); assembler;
var tempy:word;
asm
  push ds
  xor ax,ax
  xor cx,cx
  xor dx,dx
  dec [y]
  mov es,segb800
  mov di,[y]
  mov bx,di
  shl di,6
  shl bx,4
  add di,bx
  shl di,1
  mov tempy,di
  lds si,s
  mov cl,ds:[si]
  mov dl,cl
  mov bx,tempy
  add bx,159
  inc si
  mov ah,[c]
  mov al,' '
 @@loop1: { This loop makes the 'bar'. }
   stosw
   cmp di,bx
   jbe @@loop1
  mov di,tempy
  mov bx,40
  shr dl,1
  sub bx,dx
  shl bx,1
  sub bx,2
  add di,bx
 @@loop2: { This loop draws the text. }
   lodsb
   stosw
   loop @@loop2
 @@exit:
  pop ds
end;

procedure textbox(const x,y,x2,y2:byte;const c:byte;const cha:char); assembler;
{
  bl=X counter.
  bh=Y counter.
  cl=X max.
  ch=Y max.
}
asm
  mov es,segb800
  xor ax,ax
  mov al,[y]
  mov di,ax
  dec di
  mov bx,di
  shl di,6
  shl bx,4
  add di,bx
  xor ax,ax
  mov al,[x]
  add di,ax
  dec di
  shl di,1

  mov bl,[x]
  mov bh,[y]
  mov cl,[x2]
  mov ch,[y2]

  @@vertloop:

end;

procedure clrscr(const where:word;const c:byte;const c2:char); assembler;
asm
  mov ax,[where]
  mov es,ax
  xor di,di
  mov cx,8000
  mov al,[c2]
  mov ah,[c]
  rep stosw
{ The next code is just to recenter the cursor at (0,0) }
  mov ah,0Fh
  int 010h
  mov ah,02h
  mov dl,0
  mov dh,0
  int 010h
end;

function activepage:byte; assembler;
asm
  mov ah,0Fh
  int 010h
  mov al,bh
end;

function where_x(const page:byte):byte; assembler;
asm
  mov ah,03h
  mov bh,[page]
  int 010h
  mov al,dl
end;

function where_y(const page:byte):byte; assembler;
asm
  mov ah,03h
  mov bh,[page]
  int 010h
  mov al,dh
end;

function wherex:byte;
begin
  wherex:=succ(where_x(activepage));
end;

function wherey:byte;
begin
  wherey:=succ(where_y(activepage));
end;

procedure goto_xy(const page,x,y:byte); assembler;
asm
  mov ah,02h
  mov bh,[page]
  mov dl,[x]
  mov dh,[y]
  int 010h
end;

procedure gotoxy(const x,y:byte);
begin
  goto_xy(activepage,pred(x),pred(y));
end;

procedure setcursor(const cursor:word); assembler;
asm
  mov ah,1
  mov bh,0
  mov cx,[cursor]
  int 010h
end;

function getcursor:word; assembler;
asm
  mov ah,3
  mov bh,0
  int 010h
  mov ax,cx
end;

procedure hcursor;
begin
  setcursor($2000);
end;

procedure scursor;
begin
  setcursor($0607);
end;

procedure dupeit(c:char;co:byte;n,x,y:word); assembler;
asm
  mov es,segb800
  mov di,[y]
  dec di
  mov bx,di
  shl di,6
  shl bx,4
  add di,bx
  add di,[x]
  dec di
  shl di,1
  mov ah,[co]
  mov al,[c]
  cld
  mov cx,n
  rep stosw
end;

procedure statbar(snum,bnum:longint;x,y,fc,ec:byte);
const
  magic=2; { 100/magic(2) = 50 }
  empty='±'; { #177 }
  full='Û';  { #219 }
var
  p1,p2:word;
  s:string;
begin
  p1:=round(snum/bnum*100/magic);
  p2:=round(snum/bnum*100);
  str(p2,s);
  dupeit(empty,ec,{50}(100 div magic)-p1,x,y);
  dupeit(full,fc,p1-1,x,y);
  str2scr(s,(x+(p1+((100 div magic)-p1))),y,fc);
end;

end.

[Back to CRT SWAG index]  [Back to Main SWAG index]  [Original]