Noch mehr TechTalk:

Das FID-FILE-Format


Der folgende Artikel ist aus meiner jüngsten Beschäftigung mit einer Gattung von Fileformaten entstanden, die mit Auftauchen von Festplatten ihren Einzug gehalten hat und seitdem immer mehr Funktionen ausführt. Diese Files enden immer auf .FID (manche auch auf .FIB; das ist im Prinzip dasselbe). Diese Files werden von den neueren Generationen der Betriebssysteme von LocoScript und CP/M Plus ausgewertet. Namentlich sind das sämtliche LocoScriptversionen ab v2.16H (nicht das Standard v2.16), bis zur heutigen Generation v4.xx, sowie ab CP/M Plus mit XBIOS-Versionen 1.8 bis zum neuesten CP/M v1.15. Achtung! Die älteren Versionen von LocoScript und CP/M Plus, namentlich die auf den Disketten, die bei der Auslieferung vom Joyce dabei waren, ignorieren die .FID Files vollständig. Deshalb sind auch mit diesen Versionen keine Festplatten, gesteuerten 3,5" Laufwerke, LocoScript-Screensaver etc. möglich. Bei LocoScript ist das nicht weiter tragisch, wer benutzt schon noch die Versionen vor v2.16! Für CP/M sind Updates entweder bei Cirtech oder bei Locomotive erhältlich.

Um das in den folgenden Zeilen Beschriebene in der Praxis nachvollziehen zu können, ist es also nötig, mindestens LocoScript v2.16h und/oder CP/M v1.8 oder CP/M v1.15 zu verwenden. Die Versionsangabe wird immer beim Bootvorgang angezeigt!

.FID ist eine Endung, genauso wie .COM oder .EMS oder .SUB, aber diese Endung bewirkt folgendes: Neuere Betriebssystemversionen schauen während des Bootvorgangs nach solchen Files, noch bevor etwa ein CP/M nach einer PROFILE.SUB sucht, was ja auch automatisch geht, und laden Files mit dieser Endung und versuchen sie auszuführen. Bedingung dafür ist, daß das File im sogenannten 'PRL-Format' vorliegt, nach dem PRL-Header von 100H Bytes einen Sprungbefehl enthält und gleich anschließend die Bytefolge 8 mal Z, dann 'FID', dann 2 Bytes einer beliebigen Versionsnummer, dann eine 2stellige(!) Prüfsumme über das komplette File. Ist eine dieser Bedingungen nicht erfüllt, wird das File kommentarlos nicht ausgeführt.

Wozu ist das nun gut? Nun, z.B. um Bildschirmschoner, Festplatten, B- Laufwerke, FLASHDRIVES einzubinden und das Betriebssystem damit vertraut zu machen. Aber auch VIREN wären damit denkbar (vielleicht).

Ein kurzes AssemblerProgramm könnte also so ausschauen:

  cseg   ; auf relative Adressierung umschalten
      ; bei ZASM muesste hier rel stehen.
  JP Start   ; hier beginnt schon der FID-Header...  
  DB 26,26,26,26,26,26,26,26,'FID'   ; ..muss so sein..
  DB 0,1   ; version 1.0
  DW 0   ; hier muß später die Prüfsumme hin..
  DB 0,0,0,0,0,0,0,0   ; das hier ist reserviert..
  DB 0,0,0,0,0,0   ; ..und muss so sein
Start:      
  LD HL,Nachr   ; unser Programm zeigt sich ..
  OR A   ; Reset Carry: soll nicht resident sein
  ret   ; ..und verabschiedet sich.
Nachr: DB 'Ich bin nur bei neuen Betriebssystemen zu sehen'
  DB 0DH,0AH,0FFH   ; CRLF fuer CP/M und Abschlusszeichen.
  End    
       

dieses Programm muß durch den Assembler gejagt werden, z.B. ZASM. Dann folgt der LINK-Vorgang mit der Option ÄOPÜ, um ein .PRL-File zu erzeugen. Jetzt muß noch die Prüfsumme errechnet werden. Ich verwende dazu ein kleines Programm, das sich aus der Adresse (0001) des Files die Länge holt und umrechnet:

Len=eingetragene Länge + Länge der Relozierinfo + Länge des PRL-Headers (1)
Len=(0001) + int(((0001) +7)/8) + 256 (2)

Dann von Adresse 0000 des Files beginnend bis Len die Bytes ausliest und zusammenzählt. Das Ergebnis wird an Adresse (0110H) (unter SID: Adr. 120H), eingetragen. Dann muß noch die Endung von .PRL auf .FID umgeändert werden und auf eine Betriebssystemdiskette (entweder LocoScript ab v2.16H oder CP/M ab Bios v1.8) kopiert werden.

Das Programm muß dann so ausschauen (mit dem Dienstprogramm DUMP gedumpt):

CP/M 3 DUMP - Version 3.0
0000: 00 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00       .W..............       PRL-Header:
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................       ..Länge =0057H
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................       Len=57+(57+7)/8+100H
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................          =162H Bytes:
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
00A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................

00B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
00D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
00E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
00F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ................
0100: C3 20 01 1A 1A 1A 1A 1A 1A 1A 1A 46 49 44 00 01       . .........FID..       FID-Header
0110: 73 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00       s...............       110: Checksum=1773H
0120: 21 25 01 B7 C9 49 63 68 20 62 69 6E 20 6E 75 72       !%...Ich bin nur
0130: 20 62 65 69 20 6E 65 75 65 6E 20 42 65 74 72 69       bei neuen Betri
0140: 65 62 73 73 79 73 74 65 6D 65 6E 20 7A 75 20 73       ebssystemen zu s
0150: 65 68 65 6E 0D 0A FF 20 00 00 00 20 00 00 00 00       ehen... ... ....
0160: 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A       ................       Ende: Ab 162H nur
0170: 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A       ................       ..Füllbytes.

Beim Neustart von unserer so präparierten Startdiskette erscheint dann ....(ja das soll jeder selber ausprobieren können). Dieses kurze Beispielprogramm bewirkt nicht sehr viel im Joyce, macht sich nur am Start bemerkbar und verabschiedet sich dann. Es kann aber ausgebaut werden, um in die Betriebsabläufe des Joyce einzugreifen, und resident zu bleiben, d.h. dauerhaft im Speicher zu bleiben. Dazu genügt es schon, vor dem RETURN-Befehl oben das OR A durch ein SCF (set Carry Flag) zu ersetzen.

Wer sich damit beschäftigen will, der findet die zugehörigen Files FIDTST1.Z80 und FIDTST1.FID über diesen Download-Link. FIDTST1.FID ist das fertig assemblierte und präparierte Ergebnis aus obigem Beispiel, das direkt verwendet werden kann. Um einen Effekt zu bekommen, muß es auf eine Startdiskette mit geeignetem Betriebssystem (siehe oben) kopiert werden, in Gruppe 0, und dann von dieser Startdiskette ein Warm- oder Kaltstart ausgeführt werden.

Reiner Seitz


Wer sich mit der Erzeugung von eigenen '.FID'-Treiberfiles, insbesondere für die GIDE-Interface angesteuerte Festplatten, beschäftigen möchte, sei auf die Shareware-Baukasten o.g. Autors verwiesen. Mitglieder der JOYCE-User-AG e.V. können diesen über die Klubinterna downloaden.

 

Und hier gibt es weitere Infos zu Bildschirmschonern für CP/M und LocoScript im FID-File-Format.