Turbo Pascal 3.0
Listing of SPACE.PAS
1: 0 FUNCTION Freier_Diskettenplatz(Laufwerk:byte):integer;
2: 0 (* fuer CP/M + bzw. CP/M 3.0 und hoeher *)
3: 0 TYPE DMA_Puffer=RECORD
4: 1 Anzahl_der_Records_low:integer;
5:1 Anzahl_der_Records_high:byte;
6:1Fueller:ARRAY[0..124] OF byte;
7: 1 END;
8: 0 VAR p:^DMA_Puffer;
9: 0 BEGIN
10:1 new(p);
11:1 bdos(26,ord(p));
12:1IF Laufwerk=O THEN Laufwerk:=bdos(25)+1;
13:1 bdos(46,Laufwerk-1);
14:1 Freier_Diskettenplatz:=p^.Anzahl_der_Records_low SHR 3
15:1 +p^.Anzahl_der_Records_high SHL 13;
16:1 dispose(p);
17:1END;
18:0
19: 0 BEGIN
20: 1 write(Freier_Diskettenplatz(0));
21: 1 END.
8251 (z.B. TA-PC)
function ZeichenVorhanden:boolean;
begin
ZeichenVorhanden:=BIT(1,PORT[$41])
end;
funktion DarfSenden:boolean;
begin
DarfSenden:=BIT(0,PORT[$41])
end;
Z80-SIO (z.B. BONDWELL 14)
function ZeichenVorhanden:boolean;
begin
ZeichenVorhanden:=BIT(2,PORT[$41])
end;
function DarfSenden:boolean;
begin
DarfSenden:=BIT(0,PORT[$41])
end;
function ZeichenVorhanden:boolean;
begin
ZeichenVorhanden:=MEM[xyz]>0
end;
Listing of CPM-80.BIB
1:0 (******************************************************************************)
2: 0 (* Bibliotheks-Modul CPM-80.BIB *)
3: 0 (* Wichtige Betriebssystem-Prozeduren fuer CPM-80 *)
4: 0 (* Laufwerkscode : 0=Bezugslaufwerk, 1=A:, 2=B ... *)
5: 0 (* c SpeicherEinheit (real) fuer MemAvail und MaxAvail *)
6: 0 (* p DiskReset setzt Disketensystem zurueck *)
7: 0 (* p DiskAnmelden(d) definiert d als Bezugslaufwerk *)
8: 0 (* f Aktlaufwerk gibt Bezugslaufwerk zurueck *)
9: 0 (* f ErsterEintrag(FCB,DMA):byte sucht ersten Directory-Eintrag, der auf *)
10: 0 (* den File-Control-Block passt. Ergebnis in DMA, falls Wert255 *)
11: 0 (* f NaechsterEintrag:byte sucht naechsten passenden Eintrag *)
12: 0 (****************************************************************************)
13: 0
14: 0 CONST SpeicherEinheit 1.0; {wird gebraucht fuer MemAvail etc.}
15: 0
16: 0 PROCEDURE DiskReset;
17: 0 BEGIN
18: 1 BDOS(13)
19: 1 END;
20: 0
21: 0 PROCEDURE DiskAnmelden(drive:byte);
22: 0 BEGIN
23: 1 IF drive>0 THEN BDOS(14,(drive-1) AND 15)
24: 1 END;
25: 0
26: 0 FUNCTION AktLaufwerk : byte;
27: 0 BEGIN
28: 1 AktLaufwerk:=BDOS(25)+1
29: 1 END;
30: 0
31: 0 FUNCTION ErsterEintrag(VAR FCB; VAR DMA) : byte;
32: 0 BEGIN
33: 1 BDOS(26,addr(DMA));
34: 1 ErsterEintrag:=BDOS(17,addr(FCB))
35: 1 END;
36: 0
37: 0 FUNCTION NaechsterEintrag : byte;
38: 0 BEGIN
39: 1 NaechsterEintrag:=BDOS(18)
40: 1 END;
Listing of PUFFER.BIB
1: 0 (****************************************************************************)
2: 0 (* Bibliotheks-Modul PUFFER.BIB *)
3: 0 (* Listenoperationen fuer Puffer-Listen *)
4: 0 (* Setzt das Vorhandensein des Typs 'Pufferinhalt' varaus *)
5: 0 (* (t Puffer definiert einer FIFO-Speicherstruktur) *)
6: 0 (* (t PufferEintrag) *)
7: 0 (* (v PufferAnfang, PufferEnde : Puffer) *)
8: 0 (* f PufferVoll : boolean wird wahr, wenn Puffer ueberlauft *)
9: 0 (* v PufferLeer : boolean wird wahr, wenn kein Element im Puffer *)
10: 0 (* p InitPuffer initialister PufferAnfang- und Ende sowie Pufferleer *)
11: 0 (* p SchreibInPuffer(E : Pufferinhalt) prueft nicht auf Ueberlauf *)
12: 0 (* p HolVonPuffer(var E : Pufferinhalt) E undefiniert, falls PufferLeer *)
13: 0 (* Alle drei Prozeduren veraendern PufferVoll und PufferLeer *)
14: 0
15: 0
16: 0 TYPE Puffer = APufferEintrag;
17: 0 PufferEintrag = RECORD
18: 1 Eintrag : Pufferinhalt;
19: 1 Naechster : Puffer
20: 1 END;
21: 0
22: 0 VAR PufferAnfang,
23: 0 PufferEnde : Puffer;
24: 0 PufferLeer : boolean;
25: 0
26: 0 FUNCTION PufferVoll : boolean;
27: 0 CONST MemEinheit = 16.0; (*1.0 bei CP/M-80*)
28: 0 VAR PufferAvail : real;
29: 0 BEGIN
30: 1 IF MemAvail
31: 1 THEN PufferAvail:=MemEinheit*(65536.0+MemAvail)
32: 1 ELSE PufferAvail:=MemEinheit*MemAvail;
33: 1 Puf ferVoll:=Puf ferAvail
34: 1 END;
35: 0
36: 0 PROCEDURE InitPuffer;
37: 0 BEGIN
38: 1 PufferAnfang:=NIL; PufferEnde:=NIL; PufferLeer:=true;
39: 1 END;
40: 0
41: 0 PROCEDURE SchreibInPuffer(E : Pufferinhalt);
42: 0 VAR p : Puffer;
43: 0 BEGIN
44: 1 IF NOT PufferVoll THEN
45: 1 BEGIN
46: 2 new(p); PufferLeer:=false;
47: 2 WITH p^ DO BEGIN Eintrag:=E; Naechster:=NIL END;
48: 2 IF PufferEndeNIL
49: 2 THEN PufferEnde^.Naechster=p
50: 2 ELSE IF PufferAnfangNIL THEN PufferAnfangA.Naechster:=p
51: 2 ELSE PufferAnfang:=p;
52: 2 PufferEnde:=p
53: 2 END
54: 1 END;
55: 0
56: 0 PROCEDURE HolVonPuffer(VAR E : Pufferinhalt);
57: 0 VAR p : Puffer;
58: 0 BEGIN
59: 1 IF PufferAnfang=NIL
60: 1 THEN PufferLeer:=true
61: 1 ELSE BEGIN
62: 2 p:=PufferAnfang; E:=p^.Eintrag; PufferAnfang:=p^.Naechster;
63: 2 dispose(p); PufferLeer:=PufferAnfang=NIL;
64: 2 IF PufferLeer THEN PufferEnde:=NIL
65: 2 END
66: 1 END;