/*
    Jack Raats
    Noorddonk 107
    4651 ZD Steenbergen
    01670 - 65298
    Email:  2:285/751@fidonet.org
           27:1331/304@SIGnet.org

    30 december 1992     DeSmet C / C68 v3.05
*/

/*
#define QL
*/

#include <stdio.h>

#ifdef QL
#include <stdlib.h>
#endif

char *tabel[] =
{
    " ","{1}","{2}","{7}","{4}",
    "{5}","{T}","{E}","{A}","{D}",
    "{S}","\"","#","$",":",
    "?","(",")",">","<",
    "=","+","-","*","/",
    ";",",",".","0","1",
    "2","3","4","5","6",
    "7","8","9","A","B",
    "C","D","E","F","G",
    "H","I","J","K","L",
    "M","N","O","P","Q",
    "R","S","T","U","V",
    "W","X","Y","Z","RND",
    "INKEY$","PI","CALL ","ERR MSGS ","DPOKE ",
    "ERROR ","CHAR "," ","TRACE ","DRAW ",
    "UNDRAW ","PROTECT ","EDIT ","AUTO ","DEF PROC ",
    "END PROC ","","DELETE ","DO ","LOOP ",
    "EXIT ","UNTIL ","WHILE ","WHEN ","INDENT ",
    "RESEQ ","OFF","CURSOR ","DATA ","RESTORE ",
    "READ ","NOSTALGIC ","USER ","*","ON",
    "HOME ","BREAK ","DPEEK ","LINE ","POP ",
    "PUSH ","CLR STACK ","DUP ","ELSE ","END WHEN ",
    "?","?","?","?","?",
    "?","?","?","?","?",
    "?","?","?","?","?",
    "?","?","?","[ ]","{Q}",
    "{W}","{6}","{R}","{8}","{Y}",
    "{E}","{H}","{G}","{F}","[\"]",
    "[#]","[$]","[:]","[?]","[(]",
    "[)]","[>]","[<]","[=]","[+]",
    "[-]","[*]","[/]","[;]","[,]",
    "[.]","[0]","[1]","[2]","[3]",
    "[4]","[5]","[6]","[7]","[8]",
    "[9]","[A]","[B]","[C]","[D]",
    "[E]","[F]","[G]","[H]","[I]",
    "[J]","[K]","[L]","[M]","[N]",
    "[O]","[P]","[Q]","[R]","[S]",
    "[T]","[U]","[V]","[W]","[X]",
    "[Y]","[Z]","\"\"","AT ","TAB ",
    "?","CODE ","VAL ","LEN ","SIN ",
    "COS ","TAN ","ASN ","ACS ","ATN ",
    "LN ","EXP ","INT ","SQR ","SGN ",
    "ABS ","PEEK ","USR ","STR$ ","CHR$ ",
    "NOT ","**"," OR "," AND ","<=",
    ">=","<>"," THEN "," TO "," STEP ",
    "LPRINT ","LLIST ","STOP ","SLOW ","FAST ",
    "NEW ","SCROLL ","CONT ","DIM ","REM ",
    "FOR ","GOTO ","GOSUB ","INPUT ","LOAD ",
    "LIST ","LET ","PAUSE ","NEXT ","POKE ",
    "PRINT ","PLOT ","RUN ","SAVE ","RAND ",
    "IF ","CLS ","UNPLOT ","CLEAR ","RETURN ",
    "COPY "
};

unsigned char buffer [128];
int  a,
     b,
     c,
     teller,
     lengte,
     count,
     dfile,
     regel;

FILE *fi, 
     *fo;

#ifdef QL
_endmsg = 0;
char _PROG_NAME[] = "zx81list";
#endif

int dpeek ( positie )
int positie;
{
    a = buffer [positie];
    b = buffer [positie+1];
    return ( a + 256 * b );
}

int newline ( )
{
    fread ( buffer, 1, 4, fi );
    regel = 256 * buffer[0] + buffer[1];
    lengte = dpeek ( 2 );
    if ( teller >= dfile ) return ( 0 );
    fprintf ( fo, "\n%4d ", regel );
    count = 0;
    teller += 4;
    return ( 0 );
}

fout ( )
{
#ifdef QL
    printf ("\n\n   Press ENTER to EXIT ");
    fflush ( stdout );
    getchar();
#else
    printf ("\n\n");
    fflush ( stdout );
#endif
    exit ( 1 );
}

main ( argc, argv )
int argc;
char *argv[];
{
    printf ( "\n   ZX81  list utility       V301292");
    printf ( "\n   (C) Jack Raats, Steenbergen 1992");
    printf ( "\n   Email:     2:285/751@fidonet.org");
    printf ( "\n             27:1331/304@signet.org");

    if ( argc != 3 )
    {
        printf ("\n\n   USAGE:");
#ifdef QL
        printf ("\n\n   EX ZX81LIST;'filename_P filename_OUT'");
#else
        printf ("\n\n   ZX81LIST filename.P filename.OUT");
#endif
        fout();
    }

    if ( ! ( fi = fopen ( argv[1], "rb" ) ) ) 
    {
        printf ("\n\n   Cannot open %s", argv[1] );
        fout();
    }

    if ( ! ( fo = fopen ( argv[2], "wb" ) ) ) 
    {
        printf ("\n\n   Cannot open %s", argv[2] );
        fout();
    }

    fprintf ( fo, "\nZX81 LIST utility        V051292");
    fprintf ( fo, "\n(C) Jack Raats, Steenbergen 1992");
    fprintf ( fo, "\nEmail:     2:285/751@fidonet.org");
    fprintf ( fo, "\n          27:1331/304@signet.org");

    fread ( buffer, 1, (16509-16393), fi );

    fprintf ( fo, "\n\nFILE: %s", argv [1] );

    fprintf ( fo, "\n\n----- SYSTEM VARIABLES -----\n");
    fprintf ( fo, "\nPROG  : %5d", 16509 );
    dfile = dpeek ( 3 );
    fprintf ( fo, "\nD_FILE: %5d", dfile );
    fprintf ( fo, "\nVARS  : %5d", dpeek (  7) );
    fprintf ( fo, "\nE_LINE: %5d", dpeek ( 11) );
    fprintf ( fo, "\nSTKBOT: %5d", dpeek ( 17) );
    fprintf ( fo, "\nSTKEND: %5d", dpeek ( 19) );

    fprintf ( fo, "\n\n----- LEGENDA -----\n");
    fprintf ( fo, "\n[A] means  INVERSE A");
    fprintf ( fo, "\n{A} means GRAPHICS A");
    fprintf ( fo, "\n\n----- START OF LISTING -----\n");

    teller = 16509;

    newline();

    while ( teller < dfile )
    {
        c = fgetc ( fi );
        teller++;
        count++;
        switch (c)
        {
            case 118:
                if ( count != lengte )
                {
                    b = lengte - count;
                    for ( a = 1 ; a <= b ; a ++ )
                        c = fgetc ( fi );
                    teller += b;
                }
                newline();
                break;
            case 126:
                fread ( buffer, 1, 5, fi );
                teller += 5;
                count += 5;
                break;
            default:
                fprintf ( fo, "%s", tabel[c] );
                break;
        }
    }
    fprintf ( fo, "\n\n----- END OF LISTING -----\n");
    fclose ( fi );
    fclose ( fo );
    printf ("\n\n   READY...\n\n");
    exit (0);
}
