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