Source file: /~heha/vt/viewers/vt080.zip/src/VTGRAB.ASM

;Polling-Routine für Videotextdekoder
;Name VTGRAB		;"das Ende des Videotextes?"
	IDEAL
	%NOINCL
EXTRN GetTickCount:far
EXTRN lstrlen:far, lstrcpy:far
EXTRN AllocSelector:far, PrestoChangoSelector:far, FreeSelector:far
EXTRN Message:near, MessageStat:near
EXTRN wsprintf:far

	include	"prolog.asm"	;immer zuerst!
	%INCL
	%MACS
	P286N
	WARN	PRO
PUBLIC VGInit, VGRun, VGDone
;PUBLIC Ctrl0, Buf

	DISPLAY "VTGrab 0.80 - Videotext-Einleseprogramm von haftmann#software"
;### SCHALTER ###
Verbose=	1	;Ausgabe von allerlei Kommentaren
;Resident=	1	;meist "verbose" ODER "resident" !!!
;Englisch=	1	;naja, "kömmt später"
;georgelt=	1	;mit ORGS versehen, möglichst OHNE Verbose!
;maximal=	1	;Maximale Interruptanzapfung, sonst weniger Überwachung
;VD2000S=	1	;Version für die Videodat-Karte erzeugen

;### SPEZFIKATIONEN ###
AnsCode=	'He'
VerCode=	007Dh
;Funktionsnummern AL des Int2F
;00h: Installationscheck / Bestimmung der Segmentadresse
;01h: Bestimmung der Offsets von - Acq0, - CurIdx, - Index
;02h: Wiedereinschalten / Dateien öffnen
;03h: Abschalten der Funktion / Dateien schließen
;04h: Idle Call
;05h: Background On
;06h: Background Off (für Betrachter u.ä.)
;
;80h: Rundruf Senderwechsel (Datei okay)
;81h: Rundruf Senderwechsel (Kein FS-Signal, kein Videotext)
;84h: Rundruf Seite im Req0-Bereich gefunden

SuchShortTimeOut=2*18	;Zustand "suchend" Level 3
SuchTimeOut=	90*18	;Zustand "suchend" Level 0, 1 und 2
SuchSubTimeOut=	10*60*18;Zustand "suchend" mit Unterseite
WarteTimeOut=	18/4	;Zustand "wartend"
SuchSpezTimeOut=24	;Zustand "spezial" = reichliche Sekunde
INDEXSIZE=	2048	;2 Megabyte für MTV (reicht ganz gut aus)
PIEPSLEN=	4	;4 Ticks
MAXLOECHER=	10	;gibt maximal 10KB zu große Dateien
MAXDISCOUNT=	3	;wg. 3 Akquisitoren!
FERTIGTIMEOUT=	18*3	;aller 3 Sekunden PIEPS
MINIDXFORVTI=	16	;Anzahl der Indizes MINDESTENS, ab der die *.VTI-Datei
			;geschrieben wird (verhindert mikronesische Indexdateien)

;### STANDARD-INCLUDES MIT MAKRODEFINITIONEN ###
;(Festplatten-Zappelprogramm??)
	%NOINCL
	include	"strings.asm"
	include	"sound.asm"
	%INCL

;### HIER GEBRAUCHTE MAKROS ###
macro WCHR chr
	mov	al,chr
	call	OCHR
	endm

macro PRINTSTAT str:rest
local thestr
	DATASEG
label thestr byte
	dz	str
	CODESEG
	 push	ds
	 push	ofs thestr
	 push	0
	 call	MessageStat
	endm

macro PRINTZ str:rest
	LEAZ	dx,str
	call	zkout2
	endm

macro PRINTZLN str:rest
	LEAZ	dx,str
	call	zkonl
	endm

acq	equ	(tAcq di)
req	equ	(tReq di)

struc tReq			;Requester-Struktur 4 Bytes
Page	dw	?		;Bit15:Request aktiv, Bit14:Auto-Request
SubP	dw	?		;Bit15:NoCare für Unterseite
	ends

enum tZust	ruhend,suchend,wartend,spezial
;Zustände - ruhend  = Keine Aufgabe (zur Initialisierung o.ä.)
;	  - suchend = Akquisitor sucht gerade nach einer bestimmten Seite
;	  - wartend = Akquisitor hat die Seite gerade gefunden und wartet
;		      nun auf vollständigen Einlauf der Seite
;	  - spezial = Akquisitor sucht nach "*.*", um eine Bitmap der
;		      vorhandenen Seiten zu füllen

struc tAcq		;16 Byte große Struktur
 Page	dw	?	;Sucht gerade nach Seite PAGE, Bit15=NoCare
 SubP	dw	?	;Sucht gerade nach SubSeite SUBP, Bit15=NoCare
 union
  Stat	dw	?
  struc
   Zust	tZust	?	;Zustand=(ruhend,suchend,wartend,Spezialaufgabe)
   Level db	?	;Privilege Level des Suchvorgangs (0..3)
  ends
 ends
 Zeit	dw	?	;Zähler wird um vergangene Zeit erhöht
 fPage	dw	?	;Gefundene Seite
 fSubPg	dw	?	;Gefundene Unterseite (Schit Kopro!)
 fBits	dw	?	;Gefundene Statusbits, wohlgeordnet
 fHamE	db	?	;HamError-Bits
 Reseve	db	?	;um die ganze Sache abzurunden
ends

;##############################
;### Residenter Codebereich ###
;##############################

;### RESIDENTE INCLUDE-DATEIEN MIT UNTERPROGRAMMEN ###
ifdef VD2000S
	include	"vI²C_vds.asm"	;I2C-Programmierungs-Teil der Wiegand-Karte
else
	include	"vI²C.asm"	;I2C-Programmierungs-Teil der c't-Karte
endif
	include	"saavt.asm"	;Bits zusammenstoppeln und ähnliches
	include	"estimate.asm"	;allerlei zwecks Vollständigkeitscheck
	include	"predict.asm"	;Vorhersage für Suchseiten
	include	"resident.asm"	;Alles übrige residente zum Videotext

;### INITIALISIERUNGSSCHWANZ ###
ToRes:
	;Initialisierungsprozedur
	; CX: Anzahl Indizes, daraufhin wird entsprechend DOS-Speicher
	;     angefordert (möglicher Fehlercode 08: Out Of Memory)
	call	VPollInit	;EXTRN, Adresse und Größe des Indexspeichers
				;übergeben
	mov	al,1
	sbb	al,0		;BOOLEAN an Pascal übergeben
	ret

proc VGRun
	LD	es,ds
;	call	Point
	call	VPollRun
	ret
endp VGRun

proc VGDone
	LD	es,ds
	call	VPollDone	;EXTRN
 ifdef Verbose
	call	Stats_Resume
 endif
	ret
endp VGDone

;### RESIDENTE DATEN, Z.T. TRANSIENT ÜBERSCHRIEBEN ###
	DATASEG
	include	"resdata.asm"	;alle residenten Daten!
	CODESEG

;###################################
;### SemiTransienter Codebereich ###
;###################################
proc dscase
@@l:	cmp	[di],al
	jz	@@e
	add	di,3		;nächster Versuch
case:	;Einsprung "von unten"
	cmp	[by di],1
	jnc	@@l		;Fehler: Nicht gefunden!
@@e:	inc	di
	ret
endp

	_INW2			;Zahleneingabe Basis BL

DATASEG
label help$ byte
    db 'Hilfe:  +++ FREEWARE +++',nl
    db '  Parameter:  VTGRAB  [Optionen]  [Aktion]',nl
    db 10
    db 'Optionen: -R         RAM-Check unterbinden',nl
    db '          -D         TSR deaktivieren',nl
    db '          -E         VTGRAB aktivieren (default)',nl
    db '          -B{-}      Hintergrundarbeit ein (default), mit "-" ausschalten',nl
    db '          -Q{-}      Piepser ausschalten, mit "-" wieder einschalten',nl
    db '          -P[:|=]xxx Portadresse [hex] festlegen, sonst Auto-Detect',nl
    db '          -W[:|=]$$$ Arbeitsverzeichnis festlegen (sonst aktuelles)',nl
    db '          -S[:|=]xxx Datei-Maximalgr÷▀e in Kilobyte festlegen, sonst 2MB',nl
    db '          -M[:|=]xx  Multiplexer-Nummer [hex] festlegen, sonst Auto-Detect',nl
    db 10
    db 'Aktion:   (keine)    TSR laden oder Status anzeigen',nl
    db '          S          Nur Status anzeigen',nl
    db '          U          TSR entfernen, wenn m÷glich',nl
    db '          ? oder H   Diese Hilfe',nl
    dz '  Das Schalterzeichen kann "/" oder "-" sein oder ganz weggelassen werden.'
CODESEG

;###############################
;### Transienter Codebereich ###
;###############################
	include	"transient.asm"	;Alles transiente, was mit I2C zusammenhängt
	include	"stats.asm"	;Abschluß-Statistik, TRANSIENT

;### PROGRAMMSTARTPUNKT ###
DATASEG
extrn CmdLine:DWord
UDATASEG
cline	db	128 dup (?)
CODESEG
VGInit:	;hier gehts richtig los!
	;int	3		;DEBUG
	push	ds ofs cline
	push	[CmdLine]
	call	lstrcpy		;Kommandozeile ins Datensegment umkopieren
	LD	es,ds
	cld
	PRINTZ	'VTGrab 0.80 (08/98) {c''t} (haftmann#software): '
	mov	ch,80h		;Keine Probleme machen
	lea	si,[cline]
	cld
scancl:	lodsb
scanc1:	cmp	al,'/'
	jz	scancl
	cmp	al,'-'
	jz	scancl
	cmp	al,' '
	jz	scancl
	cmp	al,'?'
	jz	help
	or	al,al
	jn	z,install
	BRES	al,bit 5
	cmp	al,'H'
	jz	help
	;Alle "Aktionen" abgeparst
	mov	di,ofs upvt
DATASEG
label upvt byte
	dvt	'Q',Quiet
	dvt	'W',WorkDir
	dvt	'S',SetSize
	dvt	'P',SetPort
	dvt	'R',noRAMt
	db	0		;die Endekennung
CODESEG
	call	case
	jc	scancf		;meckern!
	call	[wo di]		;müssen CY je nach Fehler setzen!
	jnc	scancl
scancf:	LEAZ	dx,'Kommandozeilen-'
	jmp	ttext

help:	mov	dx,ofs help$
TXTOut:	call	zkonl
	mov	al,0		;FALSE
	ret

;proc printf c
;arg @@sp:word, @@arglist
;local @@s[256]:byte
;extrn wvsprintf:far
;	lea	ax,[@@s]
;	push	ss ax
;	mov	ax,[@@sp]
;	push	ds ax
;	lea	ax,[@@arglist]
;	push	ss ax
;	call	wvsprintf
;	call
;	ret
;endp printf

install:
	PRINTZLN 'Mache Programm resident...'
	mov	dx,[I2CBasis]	;default: Automatische Portsuche
	call	CheckPort	;trägt in I2CBasis den richtigen Wert ein!
	LEAZ	dx,'Dekoder nicht gefunden! - '
	jn	c,ttext
	PRINTZ	'Dekoder auf Portadresse '
	mov	ax,[I2CBasis]
	call	AXHX
	PRINTZ	'h, Wartezyklen: 4'
tNewChk:
	call	CheckSpeed	;1 gelöschte Seite lesen, EXTRN
	jc	TooFast
	jnz	TooFast		;Rechner ist nun zu schnell
	call	SubWaitI2C	;EXTRN oder CALLBACK-Funktion fürs Hochzählen
	jc	tChecked	;Weniger als 0 Waitstates gibt's nicht
	pushf
	 WCHR	8		;Backstep
	popf
	mov	al,[by Waits]	;EXTRN
	add	al,'0'
	call	OCHR
	jr	tNewChk
TooFast:
	call	AddWaitI2C	;Einen Waitstate dazu
	LEAZ	dx,'??? (RAM-) '
	jc	ttext		;RAM defekt ?? bei mehr als 4 nötigen Waitstates
	WCHR	8		;Backstep
	mov	al,[by Waits]	;EXTRN
	add	al,'0'
	call	OCHR
tChecked:
	btst	[ClFlag],bit 5	;RAMTest ausgeschaltet?
	jnz	nort

	PRINTZ	nl,'Teste RAM-Chip..'
	;call	RAMTest		;RAM des VTD testen, setzt Punkte
	xor	al,al
test4:	LEAZ	dx,'I▓C-Bus-'
	jc	ttext
	LEAZ	dx,' RAM-'
	jnz	ttext
	PRINTZ	' okay.'
nort:	;
	call	Stats_Clear	;Statistik rücksetzen
	mov	si,[pWorkDir]
	 call	MakeVREQName	;macht ein bißchen FEXPAND usw.
	jnc	test5
	PRINTZ	nl,'Verzeichnis "'
	mov	dx,ofs SemaFile
	call	zkout2
	LEAZ	dx,'" existiert nicht. '
	jmp	ttext
test5:
	jmp	ToRes

OOM:
	LEAZ	dx,'Nicht genug Speicher! '
ttext:	;"Abort" mit DX-String und "Fehler!"
	call	ZKOUT2
	LEAZ	dx,'Fehler! Abbruch!'
	jmp	TXTOut

DATASEG
pWorkDir dw	ofs Leer$
CODESEG

proc Quiet	;Quiet ein/aus
	cmp	[by si],'-'
	jnz	@@1
	inc	si
	bres	[es:ctrl0],bit 5	;Töne einschalten
	jr	@@e
@@1:	bset	[es:ctrl0],bit 5
	bset	[CLFlag],bit 2	;im Installationsfalle ausgewertet: Q!
@@e:	ret
endp

proc WorkDir
	;später: Einbau einer Routine, die im residenten Teil patcht
	call	SkipDelim
	mov	[pWorkDir],si	;merken (Leerstring überschreiben)
@@1:	lodsb
	cmp	al,21h		;Ende suchen (simpelster Weißraum-Check)
	jnc	@@1		;Nächstes Zeichen
	mov	[by si-1],0	;Weißraum zu Null machen
Leer$=	$-1
	pop	dx		;Clear Stack
	jmp	scanc1		;und mit AL weiterparsen
endp WorkDir

proc SetSize
	;später: Einbau einer Routine, die im residenten Teil patcht
	call	SkipDelim	;":" oder "=" übergehen
	mov	bl,10
	call	inw2		;Default dezimale Zahleneingabe
	jc	@@e		;Fehler
	cmp	ax,64		;64K?
	jc	@@e		;Zu klein (Unsinnig!)
	cmp	ax,2001h	;>8M
	cmc
	jc	@@e		;Zu groß (32K Index ist bei weitem genug!)
	mov	[MaxIdx],ax	;Neuen Wert eintragen
@@e:	ret
endp SetSize

proc SetPort			;Nur "on startup" erlaubt!!
	btst	ch,bit 7
	stc
	jz	@@e		;Fehlermeldung erzwingen
	call	SkipDelim
	mov	bl,10h
	call	inw2		;Portadresse hex einlesen
	jc	@@e
	mov	[I2CBasis],ax
@@e:	ret
endp SetPort

proc noRAMt
	btst	ch,bit 7
	stc
	jz	@@e		;Fehlermeldung erzwingen
	bset	[ClFlag],bit 5	;RAMTEST-Disable-Bit setzen
@@e:	ret
endp noRAMt

proc SkipDelim
	lodsb
	cmp	al,':'
	jz	@@e
	cmp	al,'='
	jz	@@e
	dec	si
@@e:	ret
endp SkipDelim

	endC		;HUCH, endlich fertig, würde TASM hier sagen...
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded