;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
|
|