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

;Polling-Routine für Videotextdekoder
;Name VTGRAB		;"das Ende des Videotextes?"
	include	prolog.asm	;immer zuerst!
	P286N
	WARN	PRO
	DISPLAY "VTGrab 0.80 - Videotext-Einleseprogramm von haftmann#software"
PUBLIC VGInit,VGRun,VGDone
;### 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??)
	include	"strings.asm"
	include	"sound.asm"

;### HIER GEBRAUCHTE MAKROS ###
macro WCHR chr
	mov	al,chr
	call	OCHR
	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
ifdef resident
	include	"instchk.asm"	;Installations-Check (Transienter Teil=Makro)
	include	"odis.asm"	;der Motor für den Hintergrundprozeß
endif

;### INITIALISIERUNGSSCHWANZ ###
;########################

DATASEG
cmdline	db	128 dup (?)
extrn PrefixSeg:word;
CODESEG

proc VGInit
;Eintrittspunkt für PASCAL: kopiert Kommandozeile nach DS
	push	ds
	 LD	es,ds
	 mov	ds,[PrefixSeg]
	 mov	si,80h
	 mov	di,ofs cmdline
	 mov	cl,[ds:si]
	 inc	cl		;terminierendes 0Dh mitnehmen
	 and	cx,7Fh
	 inc	cx		;max. 128 Bytes
	 cld
	 rep	movsb
	pop	ds
	LD	es,ds
	call	start1
	mov	al,1
	sbb	al,0		;CY->false, NC->true
	ret
endp

proc VGRun
	LD	es,ds
	call	VPollRun
	ret
endp

proc VGDone
	LD	es,ds
	call	VPollDone
	call	Stats_Resume
	ret
endp

;### 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 title$ byte
	irpc	x,<VTGrab>
	 db	'_',8,'&x&'
	endm
	db	' 0.80'
ifdef VD2000S
	db	' {VD2000S}'
else
	db	' {c''t}'
endif
	db	' (haftmann#software): $'

label help$ byte
    db 'Hilfe:	+++ KEINE FREEWARE +++',nl
    db '  Parameter:  VTGRAB  [Optionen]  [Aktion]',nl
    db 10
    db 'Optionen: -R',8,'R		RAM-Check unterbinden',nl
    db '	  -D',8,'D		TSR deaktivieren',nl
    db '	  -E',8,'E		VTGRAB aktivieren (default)',nl
    db '	  -B',8,'B{-}		Hintergrundarbeit ein (default), mit "-" ausschalten',nl
    db '	  -Q',8,'Q{-}		Piepser ausschalten, mit "-" wieder einschalten',nl
    db '	  -P',8,'P[:|=]xxx	Portadresse [hex] festlegen, sonst Auto-Detect',nl
    db '	  -W',8,'W[:|=]$$$	Arbeitsverzeichnis festlegen (sonst aktuelles)',nl
    db '	  -S',8,'S[:|=]xxx	Datei-Maximalgröße in Kilobyte festlegen, sonst 2MB',nl
    db '	  -M',8,'M[:|=]xx	Multiplexer-Nummer [hex] festlegen, sonst Auto-Detect',nl
    db 10
    db 'Aktion:	  (keine)	TSR laden oder Status anzeigen',nl
    db '	  S',8,'S		Nur Status anzeigen',nl
    db '	  U',8,'U		TSR entfernen, wenn möglich',nl
    db '	  ?',8,'? oder H',8,'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

start1:	;hier gehts richtig los!
	PRINT	Title$
ifdef resident
	call	InstChk		;die alte Leier auch hier...
else
	mov	ch,80h		;Keine Probleme machen
endif
	mov	si,ofs cmdline+1
	cld
scancl:	lodsb
scanc1:	cmp	al,'/'
	jz	scancl
	cmp	al,'-'
	jz	scancl
	cmp	al,' '
	jz	scancl
	cmp	al,'?'
	jz	help
	cmp	al,0dh
	jn	z,install
	BRES	al,bit 5
	cmp	al,'H'
	jz	help
ifdef resident
	cmp	al,'S'
	jz	statm
	cmp	al,'U'
	jz	UnInst
endif
	;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
	stc
	ret


install:
	PRINTZ	'Mache Programm '
	mov	ax,cs
	cmp	ax,0b000h
	jc	insta1
	PRINTZ	'im UMB '
insta1:	PRINTZLN '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
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:
	call	VPollInit	;EXTRN, Adresse und Größe des Indexspeichers
				;übergeben
	ret

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