home *** CD-ROM | disk | FTP | other *** search
- PROGRAM txt2exe_BROWSER;
- {
- Autor : P.Fischer-Haaser
- Mozartstr. 10
- D-74072 Heilbronn
- Tel.: 07131/81947
- Fax: 07131/962843
- }
-
- {$DEFINE FalscherCompiler}
-
- {$IFNDEF Ver60}
- {$ifdef Ver70}
- {$undef FalscherCompiler}
- {$EndIF}
- {$else}
- {$undef FalscherCompiler}
- {$Endif}
-
- {$ifdef FalscherCompiler}
- BEGIN
- WriteLn('Turbo/Borland Pascal Version 6.0 / 7.0 besorgen');
-
- {$else}
- {$Ifdef Ver60}
-
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X+}
- {$M 8192,0,64000}
-
- {$else}
-
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,R-,S-,V-,X+,Y-}
- {$M 8192,0,64000}
-
- {$endif}
-
- (* keine USES-Liste notwendig, mach 'mer alles selber !! *)
-
- (***************************************************************************)
-
- CONST
- MAGIC = 3727; { Länge von T2BR.EXE }
- SeitenLaenge = 24; { darstellb. Zahl der Zeilen einer Seite }
-
- HZ : STRING [48] = #24#25'-auf/ab ■ Bild'#24#25'-Seite vor/zurück ■ ESC-Ende';
-
- VBASE : WORD = $B000; { Video-Base Adresse, default : mono }
- fg : byte = 15; { Farb-Attribut : Zeichen Vordergr. }
- bg : byte = 0; { Farb-Attribut : Zeichen Hintergr. }
- hfg : byte = 0; { Farb-Attribut : Hilfz. Vordergr. }
- hbg : byte = 7; { Farb-Attribut : Hilfz. Hintergr. }
- Zeilen : LongInt = 0; { Anzahl Zeilen, max 2 Mrd... }
- TabOffset : LongInt = 0; { Offset Verweis-Tabelle }
-
- (***************************************************************************)
-
- PROCEDURE addch(VAR S : STRING; c : Char); { hängt <c> an <s> an, ohne stack-verschwendung }
- VAR
- L : Byte ABSOLUTE S;
- BEGIN
- Inc(L);
- S[L] := c;
- END; { addch }
-
- (***************************************************************************)
-
- FUNCTION Replicate(nr : Byte; ch : Char) : STRING;
- VAR { String der Länge <nr>, bestehend aus <ch> }
- tmpS : STRING;
- BEGIN
- fillchar(tmps,succ(nr),ch);
- tmps[0] := chr(nr);
- Replicate := tmpS;
- END; { replicate }
-
- (***************************************************************************)
-
- PROCEDURE Gxy(x,y:byte); assembler; { GotoXY }
- asm
- mov ax,0f00h
- Int 10h
- mov ax,0200h
- mov dh,y
- Dec dh
- mov dl,x
- Dec dl
- Int 10h
- END; { Gxy }
-
- (***************************************************************************)
-
- PROCEDURE Coff; assembler; { Cursor OFF }
- asm
- mov ah,01
- mov cx,2020h
- Int 10h
- END; { Coff }
-
- (***************************************************************************)
-
- PROCEDURE Con; assembler;
- asm { Cursor ON }
- mov ah,01
- mov cx,0611h
- Int 10h
- END; { Con }
-
- (***************************************************************************)
-
- PROCEDURE WrXYAttr(_x,_y:integer; _fg,_bg:byte; _s:STRING); assembler;
- { write string _S ab _Y,_Y mit Fraben _FG,_BG }
- asm
- push ds
-
- mov dx,_y
- Dec dx
- mov cl,7
- SHL dx,cl
- mov ax,dx { (y-1) * 128 }
- mov dx,_y
- Dec dx
- mov cl,5
- SHL dx,cl { (y-1) * 32 }
- add ax,dx
- add ax,_x
- add ax,_x
- sub ax,2 { Video-Offset := (y-1)*(128+32)+(x*2)-2) }
- mov di,ax { ES:DI ist Ziel }
-
- mov cx,VBASE
- mov es,cx { Zielsegment : VBASE }
-
- mov dl,_bg
- mov cl,4
- SHL dl,cl
- mov bl,dl
- add bl,_fg { Farbe : bg shl 4 + fg }
-
- lds si,_s { Source in DS:SI }
- cld
- lodsb { Längenbyte laden }
- XOR ah,ah
- xchg ax,cx { in CX ablegen }
- cmp cx,0
- jz @@ende { String 0 Zeichen lang ?? }
- @@P_loop:
- lodsb { Zeichen laden }
- mov ah,bl { Attribut dazu }
- stosw { wortweise (Zeichen+attr) in das VRAM kopieren }
- loop @@P_loop { CX = 0 ? --> weiter ab P_Loop }
- @@ende:
- pop ds
- END; { WRXY }
-
- (***************************************************************************)
-
- PROCEDURE HaltError(s : STRING); { STOP, Write S, Cursor ON }
- BEGIN
- WrXYAttr(1,25,7,0,s);
- gxy(1,25);
- Con;
- Halt;
- END; { Halterror }
-
- (***************************************************************************)
-
- PROCEDURE io; { io-check }
- BEGIN
- IF IOResult <> 0 THEN
- HaltError('IO FEHLER');
- END; { io }
-
- (***************************************************************************)
-
-
- FUNCTION GetKey : Word; Assembler; { Tastatur lesen }
- asm
- mov ah,0
- Int 16h { BIOS-WAITKEY }
- cmp al,0
- jz @@special { oh, Sondertaste...}
- XOR ah,ah { nö, normale Taste }
- jmp @@finis { Fuktions-Ergebnis in AX }
- @@special:
- mov al,ah
- XOR ah,ah
- add ax,1000 { bei Sondertaste : 1000 hinzu...}
- @@finis: { Ergebnis ist in AX }
- END;
-
- (***************************************************************************)
-
- PROCEDURE HilfZeile(s : STRING);
- Var
- SLEN : Byte Absolute S;
- BEGIN
- WrXYAttr(1, 25, hfg, hbg, replicate(80, #32));
- WrXYAttr(1, 25, hfg, hbg ,s);
- END; { Hilfzeile }
-
- (***************************************************************************)
-
- PROCEDURE Display; { Text anzeigen und Tasten auswerten }
- VAR
- f : FILE;
- tmpS : STRING;
- chi : integer;
- oben : LongInt;
- dummy : word;
-
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
-
- FUNCTION GetStr(nr : LongInt) : STRING; { string aus Zeile NR lesen }
- VAR
- offs : LongInt;
- BEGIN
- Seek(f,TabOffset+pred(nr) SHL 2); { Position der Zeile in Tabelle errechnen
- =TabellenOffset+ZeilenNr*4 }
- io;
- BlockRead(f, offs, sizeof(longint)); { Tabellen-Verweis auf String lesen }
- Seek(f, offs); { jetzt auf die String-Position ... }
- BlockRead(f, tmpS[0], 81); { und Zeile Lesen ... hier : max 81 Zeichen }
- { Länge stimmt, da in tmps[0] }
- GetStr := tmpS; { und kopiern }
-
- END; { Display.GetStr }
-
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
-
- PROCEDURE ShowPage(start : LongInt); { Seite anzeigen ab Zeile : start }
- VAR { setzt glob. OBEN neu.. }
- i : LongInt;
- zl : Byte;
- BEGIN
- IF (start < 1) THEN start := 1;
- IF (start > Zeilen-SeitenLaenge) AND (Zeilen > SeitenLaenge) THEN
- start := Zeilen-SeitenLaenge;
- zl := 1;
- FOR i := start TO start+SeitenLaenge-1 DO
- BEGIN
- WrXYAttr(1,zl,fg,bg,replicate(80,' '));
- IF i <= Zeilen THEN
- WrXYAttr(1,zl,fg,bg,GetStr(i));
- Inc(zl);
- END;
- oben := start;
- END; { Display.SHOWPAGE }
-
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
-
- BEGIN { DISPLAY }
- {$i-} { no i/o-abortion via RunTime-Lib }
- filemode := 0; { r/o flag ? -> egal, TP-Open modus anpassen }
- Assign(f, ParamStr(0)); { aufgerufene Programmdatei öffnen }
- Reset(f, 1); { untyp. file, LRECL = 1 }
- io; { ALLES OK ? }
-
- Seek(f, MAGIC); { Auf Ende des Browsers positionieren...}
- io; { ALLES OK ? }
-
- BlockRead(f, Zeilen, SizeOf(longint), dummy); { Anzahl Zeilen lesen }
-
- BlockRead(f, TabOffset, SizeOf(longint),dummy); { Anfang der Verweis-Tabelle }
- IF dummy <> SizeOf(longint) THEN
- Halterror('');
-
- HilfZeile(HZ);
- ShowPage(1); { erste Seite... }
- coff;
-
- REPEAT
- chi := GetKey; { Tasten auswerten...}
- CASE chi OF
- 1072 : { Up }
- BEGIN
- IF oben > 1 THEN
- Dec(oben);
- showpage(oben)
- END;
- 1080 : { Down }
- BEGIN
- IF oben < zeilen-seitenlaenge THEN
- Inc(oben);
- showpage(Oben)
- END;
- 1071 : { Home }
- ShowPage(1);
- 1079 : { End }
- ShowPage(Zeilen-SeitenLaenge+1);
- 1073 : { PgUp }
- ShowPage(oben-SeitenLaenge);
- 1081 : { PgDn }
- ShowPage(oben+SeitenLaenge);
- END;
- UNTIL chi = 27; { ESC }
- Close(f); { Datei schließen }
- HaltError(#24)
- END; { Display }
-
- (***************************************************************************)
- (****** M A I N ************************************************************)
- (***************************************************************************)
- BEGIN
- {$i-}
- IF mem[$0040:$0049] <> 7 THEN { Farbe oder Mono ?? }
- BEGIN
- VBASE := $b800; { Farbe }
- fg := 14; bg := 1;
- END; { kein ELSE --> Mono ham'er scho }
-
- Display; { Text anzeigen }
-
- {$ENDIF}
- END. { Fertig }
- (***************************************************************************)