APPENDere in Turbo Pascal per CP/M

Prerequisiti tecnici: conoscenza della gestione dei file di testo in Turbo Pascal

Consideriamo un programma scritto in Turbo Pascal 3 che si occupi, in sequenza, di:

  • Aprire un file di testo in scrittura, e scriverci una riga
  • Aprire lo stesso file in append, quindi scrittura in coda, e aggiungere una seconda riga
  • Aprire lo stesso file in lettura e stamparne il contenuto a video

Per esempio…

PROGRAM TestAppend;
VAR f:TEXT;
s:STRING[80];
BEGIN
  ASSIGN(f,'test.txt');

  REWRITE(f);
  WRITELN(f,'First row');
  CLOSE(f);

  APPEND(f);
  WRITELN(f,'Second row');
  CLOSE(f);

  RESET(f);
  WHILE NOT EOF(f) DO BEGIN
    READLN(f,s);
    WRITELN(s)
  END;
  CLOSE(f);
END.

Se compilato in Turbo Pascal 3 per MS-DOS, fila tutto liscio. Se compilato invece in Turbo Pascal 3 ma sotto CP/M in fase di compilazione riceveremo il seguente messaggio di errore:

Error 41: Unknown identifier or syntax error. Press <ESC>

Quindi nella versione CP/M del compilatore la procedura APPEND è semplicemente (e misteriosamente) scomparsa nonostante la sua indubbia utilità. Grazie però alla segnalazione di Marco Luciano sono riuscito a trovare presso questo link sul sito di Werner Cirsovius un suo lavoro del lontano 1988 (qui il disassemblato commentato), in pratica una implementazione in Assembly Z80 della procedura APPEND, valida però solo per i file di testo (non vale per i file binari), che quindi è valida per il nostro codice di esempio sopra riportato. Riporto in questa pagina di RetroAcademy esattamente il codice di Werner Cirsovius:

procedure append(var f:text);
{ ============================================================== }
{                                                                }
{ 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                                      }
{                                                                }
{ ============================================================== }
begin{Module APPEND}
  inline (
  {0000} $22/*+139/$11/$0c/$00/$19/$e5/$22/*+133/$11/$24/$00/$19/$22/
  {0010} *+128/$e1/$cd/*+108/$0e/$0f/$cd/*+94/$20/$54/$2a/*+114/
  {0020} $eb/$0e/$1a/$cd/$05/$00/$0e/$23/$cd/*+78/$20/$3f/$11/$21/$00/
  {0030} $2a/*+93/$19/$4e/$23/$5e/$23/$56/$79/$b2/$b3/$28/$22/$0d/$f2/
  {0040} *+3/$1b/$72/$2b/$73/$2b/$71/$0e/$21/$cd/*+44/$20/$1d/$2a/
  {0050} *+64/$0e/$00/$06/$80/$3e/$1a/$be/$ca/*+6/$23/$0c/$10/$f8/
  {0060} $2a/*+43/$36/$40/$23/$23/$71/$3e/$00/$18/$07/$3e/$02/$c3/*+4/
  {0071} $3e/$01/$32/$d0/$00/$c9/$ed/$5b/*+21/$cd/$05/$00/$b7/$c9/$11/
  {0081} $0c/$00/$19/$06/$18/$36/$00/$23/$10/$fb/$c9/$00/$00/$00/$00/$00/
  {0091} $00);
end; {APPEND}

Per cui, per rendere operativo il codice di esempio anche sotto CP/M basterà quindi semplicemente includere questo prezioso e antico segmento di codice. Il risultato così ottenuto sarà quindi perfettamente funzionante:

PROGRAM TestAppend;
VAR f:TEXT;
s:STRING[80];

PROCEDURE APPEND(VAR f:TEXT);
BEGIN
  inline (
  $22/*+139/$11/$0c/$00/$19/$e5/$22/*+133/$11/$24/$00/$19/$22/
  *+128/$e1/$cd/*+108/$0e/$0f/$cd/*+94/$20/$54/$2a/*+114/
  $eb/$0e/$1a/$cd/$05/$00/$0e/$23/$cd/*+78/$20/$3f/$11/$21/$00/
  $2a/*+93/$19/$4e/$23/$5e/$23/$56/$79/$b2/$b3/$28/$22/$0d/$f2/
  *+3/$1b/$72/$2b/$73/$2b/$71/$0e/$21/$cd/*+44/$20/$1d/$2a/
  *+64/$0e/$00/$06/$80/$3e/$1a/$be/$ca/*+6/$23/$0c/$10/$f8/
  $2a/*+43/$36/$40/$23/$23/$71/$3e/$00/$18/$07/$3e/$02/$c3/*+4/
  $3e/$01/$32/$d0/$00/$c9/$ed/$5b/*+21/$cd/$05/$00/$b7/$c9/$11/
  $0c/$00/$19/$06/$18/$36/$00/$23/$10/$fb/$c9/$00/$00/$00/$00/$00/
  $00);
END;

BEGIN
  ASSIGN(f,'test.txt');

  REWRITE(f);
  WRITELN(f,'First row');
  CLOSE(f);

  APPEND(f);
  WRITELN(f,'Second row');
  CLOSE(f);

  RESET(f);
  WHILE NOT EOF(f) DO BEGIN
    READLN(f,s);
    WRITELN(s)
  END;
  CLOSE(f);
END.

Un esempio pratico di utilizzo di questo utilissimo tip l’ho utilizzato nel gioco Open Source “Queens” per CP/M (compatibile con i terminali ADM-31, C128 e KayPro), i cui sorgenti ed eseguibili binari sono liberamente scaricabili presso GitHub:

https://github.com/sblendorio/queens-cpm

Nel caso specifico di Queens, la funzione APPEND è stata utile durante la memorizzazione delle soluzioni trovate dal giocatore, e aggiunte man mano a un archivio, in seguito visionabile mediante l’apposita opzione del gioco.

Buon divertimento e buona retro-programmazione!

Link esterni:

Francesco Sblendorio

Francesco Sblendorio nasce nel 1977. Nel 1985 fa conoscenza con il mondo dei computer attraverso un Commodore 16: da quel momento la discesa verso il lato oscuro è inesorabile e si trasforma in un geek impenitente. Nell'ambito del retrocomputing ha un sogno: che i vecchi computer non debbano semplicemente sopravvivere (conservando la loro funzionalità), piuttosto devono vivere, attraverso nuovi software sviluppati oggi per i computer di ieri.

Potrebbero interessarti anche...