Magic Disk 64

home to index to html: MD8810-KURS-VIRENPROGRAMMIERKURS_TEIL_4-6.1.html
                 Virenprogrammierkurs                
                 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾                
Nach einem Sommermonat langen Wartens ist er nun end-
lich da: Der 4. Teil des Virenprogrammierkurses!     
Heute geht es wieder um das komplexe Thema der  Fort-
pflanzung beim Laden.                                
Wie schon im letzten Teil erwähnt fehlt uns nur  noch
der Rest der LOAD-Vermehrung  und  noch  eine  kleine
Routine, die am Anfang der Virus-Load-Routine  steht.
Und um genau diese Routine geht es heute.            
Sie erinnern sich: Wir hatten gesagt,  daß  wir  alle
Befehle aus dem Betriebssystem übernehmen wollen,  so
daß die ganz normale  LOAD-Routine  ausgeführt  wird,
mit dem Unterschied, daß sich unser Virus dann hinzu-
schalten kann, wann ER  möchte!  Dies  muß  er  schon
gleich am Anfang tun, nämlich dort, wo über den  Vek-
tor in die LOAD-Routine eingesprungen wird, und zwar,
um sich den Filenamen des Programms  zu  merken,  daß
geladen werden soll.  Dieser  wird  normalerweise  ja
schon von Basic irgendwo im Speicher abgelegt.       
Anschließend übergibt BASIC der LOAD-Routine die Ad- 
resse und Länge des Filenamens mit Hilfe der SETNAM- 
Routine. Diese steht im Betriebssystem bei $FFBD und 
wird folgendermaßen aufgerufen:                      
X-Register: LO-Byte der Adresse des Filenamens       
Y-Register: HI-Byte der Adresse des Filenamens       
Akku      : Länge des Filenamens                     
Zum besseren Verständnis hier ein Beispiel:          
8000  LDA #$04                                       
8002  LDX #$0A                                       
8004  LDY #$80                                       
8006  JSR $FFBD                                      
8009  RTS                                            
800A  .TX "NAME"                                     
Es werden also  die  Adresse  des  Filenamens  (hier:
$800A) und die Länge des Filenamens (hier 4)  überge-
ben.                                                 
Die Routine SETNAM  macht  nun  nichts  anderes,  als
diese Werte, die ja nachher beim Laden wichtig  sind,
in drei Speicherzellen in  der  Zeropage  zwischenzu-
speichern. Diese Speicherzellen sind $BB und $BC  für
die Namensparameter. In Speicherzelle  $B7  wird  die
Länge des Namens zwischengespeichert. Leider  bleiben
diese Werte dort nicht bis in alle Ewigkeiten stehen.
Sie gehen im  Laufe  der  LOAD-Routine  verloren,  da
diese Speicherzellen noch anderweitig verwendet  wer-
den. Der Filename z.B. wird vom Betriebssystem an das
Ende des normalen Basic-Arbeitsspeichers gelegt.  Und
dort ist er leider nicht genug geschützt. Ein  langes
Programm überschreibt ihn  einfach  beim  Laden.  Wir
müssen  uns  diese  Werte  und  den  Filenamen   also
"merken",  bevor  wir  die  LOAD-Routine  auf   diese
Bereiche loslassen.                                  
Und genau das tut unsere  kleine  Routine  von  Zeile
1020 bis 1130. Wie immer folgt nun eine kleine  Doku-
mentation, die Ihnen die Funktion der Routine  erläu-
tern soll:                                           
1020 -LOAD   PHA               ;Akku retten          
1030 -       LDA FILELO        ;LO-Adresse des       
1040 -       STA $FB           ;Namens setzen        
1050 -       LDA FILEHI        ;HI-Adresse des       
1060 -       STA $FC           ;Namens setzen        
1070 -       LDY FILELENG      ;Länge des Namens     
1080 -       STY LENGNAM       ;setzen               
1090 -LOOP2  LDA ($FB),Y       ;Name kopieren        
1100 -       STA NAMEBUFF+2,Y                        
1110 -       DEY               ;Zähler vermindern    
1120 -       BPL LOOP2         ;Fertig?              
1130 -       PLA               ;Akku zurückholen     
In Zeile 1020 wird erst einmal der Akku auf den  Sta-
pel geschoben, da wir  seinen  Inhalt  später  wieder
brauchen. Um dies verständlich zu machen, muß man zu-
erst einmal wissen, welche Parameter die LOAD-Routine
beim Aufruf benötigt.                                
Ähnlich wie bei der SAVE-Routine müssen der LOAD-Rou-
tine zuerst Filename, Filenummer, Geräte- und  Sekun-
däradresse des zu ladenden Files übergeben werden.   
Dies geschieht, wie schon bei der SAVE-Routine, durch
die Betriebssystemroutinen SETPAR ($FFBA) und  SETNAM
($FFBD), welche wir ja schon beschrieben hatten.  An-
schließend kann erst die LOAD-Routine aufgerufen wer-
den, und zwar mit den folgenden Parametern:          
X- und Y-Register enthalten die Startadresse des Pro-
gramms, das geladen werden soll.                     
Der Akku dient als LOAD/VERIFY-Flag.                 
Wie wir ja vom letzten Teil des Kurses  noch  wissen,
werden die Werte aus X und Y schon von  der  "Vorrou-
tine" des Betriebssystems bei  $F49E  zwischengespei-
chert, so daß deren Inhalt unwichtig wird und wir so-
mit diese Register  verwenden  dürfen.  Nur  im  Akku
steht noch eine Information, die ebenfalls nicht ver-
loren gehen darf, aber erst später vom Betriebssystem
zwischengespeichert wird. Im Akku steht nämlich  eine
Information, die dem Betriebssystem sagt, ob ein LOAD
oder nur ein VERIFY erfolgen soll.                   
Steht im Akku eine 0, so wird ein Programm  ordnungs-
gemäß geladen. Bei einer 1 allerdings  wird  nur  das
Programm auf der Diskette mit dem  derzeitigen  Spei-
cherinhalt verglichen, eben die VERIFY-Funktion  aus-
geführt. Logischerweise müssen wir also den Akku erst
einmal auf den Speicher retten.                      
Weiter nun mit unserer Routine ab Zeile 1020:        
Nachdem nun der Akku endlich benutzbar wurde,  werden
als Erstes die Zwischenspeicherbytes der Adresse  des
Filenamens in die Adressen  $FB  und  $FC  umkopiert.
Diese beiden Adressen befinden sich, wie Sie ja sehen
(es werden nur 8 Bit benutzt), auch in der  Zeropage.
Sie sind zusammen mit den zwei  folgenden  Bytes  $FD
und $FE eine der Ausnahmen, die nicht  vom  Betriebs-
system benutzt werden, sondern dem  Assemblerprogram-
mierer zur freien Verfügung stehen.                  
Wir wollen mit Hilfe der indirekt-indizierten  Adres-
sierung den Filenamen auslesen.                      
Dies geschieht über  einen  Zeiger,  den  wir  soeben
durch unsere "Umkopiererei" ins Leben gerufen  haben.
Vorher sichern wir aber zuerst  noch  die  Länge  des
Filenamens in einem Variablenbyte  (LENGNAM).  Dieses
wurde im Assemblerquelltext definiert, und  zwar  als
6. Byte vor Beginn des  Programms,  ähnlich  wie  bei
einigen weiteren Laufvariablen, die hauptsächlich von
dem Gag-Programm am Ende verwendet werden.  Übrigens:
Die Namen FILELO, FILEHI und FILELENG sind Konstanten
und ebenfalls am Anfang  des  Quelltextes  definiert.
Sie stehen für die Zwischenspeicherbytes des  Filena-
mens.                                                
Anschließend wird nun der Filename  umkopiert.  Einen
Zähler für die Länge des Filenamens haben wir ja noch
vom Umkopieren im Y-Register  stehen.  Also  brauchen
wir immer nur einen Wert herunterzuzählen und zu prü-
fen, ob schon alle Bytes kopiert wurden. NAMEBUF  ist
übrigens auch ein Label für einen  Speicher,  diesmal
am Ende des Quellistings, in dem 16  Bytes  (so  lang
darf der Filename maximal  sein)  für  den  Filenamen
Platz sind.                                          
Warum in diese Adresse "+2"  gespeichert  werden  muß
und nicht gleich an die Adresse NAMEBUF, wird  später
noch erklärt.                                        
Jetzt wird  erst  der  Akkuinhalt  wieder  vom  Stack
geholt und weiter geht's mit  den  Betriebssystemrou-
tinen.                                               
Hiermit wären wir auch gleichzeitig  am  Ende  dieses
Kursteils angekommen. Nächsten Monat wollen wir  dann
die Fortpflanzung endlich ganz abhaken.              
Bis dahin wünschen wir  Ihnen  jedenfalls  viel  Spaß
beim Virenzüchten.                                   
Valid HTML 4.0 Transitional Valid CSS!