title APPEND fuer CP/M 80 TURBO PASCAL 3,0 name ('APPEND') ; Emulation der MS-DOS TURBO PASCAL Prozedur APPEND fuer CP/M 80 ; ; Der Aufruf der Prozedur muss folgende Gestalt haben : ; ; APPEND(TEXT_Datei); ; ; Die Datei 'TEXT_datei' vom Typ 'TEXT' muss nicht geoeffnet ; sein. Wird die Datei nicht gefunden, so erhaelt die Variable ; 'IORESULT' den Wert 01 (Siehe I/O Fehlermeldungen im Handbuch) ; Falls die Datei leer ist, so wird 02 zurueckgegeben ; Damit obliegt es dem Programmierer, die Fehlermeldung zu ; verarbeiten. ; ; Copyright (C) Werner Cirsovius ; Hohe Weide 44 ; D-2000 Hamburg 20 ; Tel.: 040-4223247 ; Version 1.0 von Juli 1988 BDOS equ 0005h ; CP/M OS Aufruf .open equ 15 ; Datei oeffnen .setdma equ 26 ; Disk Puffer setzen .rndrd equ 33 ; Beliebigen Rekord lesen .filsiz equ 35 ; Dateigroesse ermitteln _EX equ 12 ; Position des Extents _RRN equ 33 ; Position des Rekords FCBlen equ 36 ; Komplette FCB-Laenge reclng equ 128 ; Standardrekordlaenge eof equ 1ah ; End of file Zeichen _FCB equ 12 ; FCB Offset im TURBO FIB _DMA equ 48 ; DMA Offset im TURBO FIB Fout equ 01000000b ; Ausgabebit im FIB IOResult equ 00d0h ; Adresse des IO Rsultates _NOERR equ 0 ; Standardfehlermeldungen _NOFILE equ 1 _NOREAD equ 2 APPEND: ld (FIB),hl ; FIB retten ld de,_FCB add hl,de ; Zeiger auf FCB push hl ld (FCB),hl ld de,_DMA-_FCB add hl,de ; .. und Puffer ld (DMA),hl pop hl call ClearFCB ; FCB vorbereiten ld c,.open call FBDOS ; Datei oeffnen jr nz,NoFile ; .. nicht vorhanden ld de,(DMA) ld c,.setdma call BDOS ; Puffer setzen ld c,.filsiz call FBDOS ; Dateigroesse ermitteln jr nz,NoRead ld de,_RRN ld hl,(FCB) add hl,de ; Zeiger auf Dateigroesse ld c,(hl) ; Groesse laden inc hl ld e,(hl) inc hl ld d,(hl) ld a,c or d or e jr z,GotEOF ; Bei Groesse Null Ende dec c ; Rekord erniedrigen jp p,RRN.ok dec de ; .. Uebertrag nicht vergessen RRN.ok: ld (hl),d ; Neuen Rekord speichern dec hl ld (hl),e dec hl ld (hl),c ld c,.rndrd call FBDOS ; Letzten Rekord lesen jr nz,NoRead ld hl,(DMA) ; Pufferadresse ld c,0 ; .. Laenge Null setzen ld b,reclng ld a,eof SrcEOF: cp (hl) ; Nach EOF suchen jr z,GotEOF inc hl inc c djnz SrcEOF GotEOF: ld hl,(FIB) ld (hl),Fout ; Ausgabe setzen inc hl inc hl ld (hl),c ; .. Sektor-Pufferzeiger setzen ld a,_NOERR jr NoERR NoRead: ld a,_NOREAD jr NoERR NoFile: ld a,_NOFILE NoERR: ld (IOResult),a ; Resultat speichern ret ; ; BDOS Funktion in Register C aufrufen ; Das gesetzte ZERO Bit zeigt Erfolg an ; FBDOS: ld de,(FCB) ; FCB laden call BDOS ; .. Aufruf ausfuehren or a ; Ergebnis setzen ret ; ; FCB in Register HL initialisieren ; ClearFCB: ld de,_EX add hl,de ; Zeiger einstellen ld b,FCBlen-_EX ; .. Laenge Clear: ld (hl),0 ; .. Null setzen inc hl djnz Clear ret ; FIB: dw 0 FCB: dw 0 DMA: dw 0 end