Add creation of .dat file by writing header and few machine codes
authorJason Self <j@jxself.org>
Thu, 23 May 2019 02:00:21 +0000 (19:00 -0700)
committerJason Self <j@jxself.org>
Thu, 23 May 2019 02:00:21 +0000 (19:00 -0700)
zilasm/header.c
zilasm/header.h
zilasm/main.c
zilasm/parser.c

index 54ce75e95d553fc05b6645e452c3646cbd0528d3..e5f350fbaa0265d5a0267721a2137714df8e58f3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * header.c -- part of ZilUtils/ZilAsm
  *
- * Copyright (C) 2016 Jason Self <j@jxself.org>
+ * Copyright (C) 2016, 2019 Jason Self <j@jxself.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -21,6 +21,7 @@
 
 #include <string.h>  /* bzero */
 #include <assert.h>
+#include <stdio.h>
 
 #include "header.h"
 
@@ -41,3 +42,20 @@ ZMemblock *program_header_build(void)
        /* TODO */
        return zmb;
 }
+
+
+Word swapBytes(Word w)
+{
+       return ((w & 255) << 8) + (w >> 8);
+}
+
+
+void outputToFile(Program_header_struct *pHeader, FILE* file)
+{
+       Program_header_struct h;
+       memcpy(&h, pHeader, sizeof(Program_header_struct));
+
+       h.startPC = swapBytes(h.startPC);
+       h.h_file_size = swapBytes(h.h_file_size);
+       fwrite(&h, sizeof(Program_header_struct), 1, file);
+}
\ No newline at end of file
index 28ab5952ed0376bf4e64bd267a486c7d118e59e7..41f82fbaf6ee01ff8cf4b7d9d449247eebebbdc8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * header.h -- part of ZilUtils/ZilAsm
  *
- * Copyright (C) 2016 Jason Self <j@jxself.org>
+ * Copyright (C) 2016, 2019 Jason Self <j@jxself.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -28,67 +28,113 @@ typedef unsigned long   Byte_address;
 typedef unsigned long   Word_address;
 typedef unsigned long Packed_address;
 typedef unsigned long        Offset8;
-typedef unsigned int            Word;
-typedef   signed char           Byte;
+typedef unsigned short          Word;
+typedef unsigned char           Byte;
 typedef          int            Bool;
 
+//typedef struct {
+//     unsigned version;  // 1..6
+//     // [$01] V1..V3: Flags1
+//     Bool  statusline_type;      // bit1: 0=score/turns, 1=hh:mm
+//     Bool  split_two_discs;      // bit2
+//     Bool  statusline_notavail;  // bit4
+//     Bool  screensplit_avail;    // bit5
+//     Bool  varpitchfont_default; // bit6
+//     // [$01] V4: Flags1
+//     Bool  colors_avail;         // v5: bit0
+//     Bool  pics_avail;           // v6: bit1
+//     Bool  bold_avail;           // v4: bit2
+//     Bool  italic_avail;         // v4: bit3
+//     Bool  fixedspace_avail;     // v4: bit4
+//     Bool  sound_avail;          // v6: bit5
+//     Bool  timedkeyb_avail;      // v4: bit7
+//     // Addresses
+//     Byte_address   highmem_base;  // [$04]
+//     Byte_address   start_pc;      //  [$06], v1
+//     Packed_address start_routine; //  [$06], v6
+//     Byte_address   dictionary;    // [$08]
+//     Byte_address   objects;       // [$0A]
+//     Byte_address   globals;       // [$0C]
+//     Byte_address   static_base;   // [$0E]
+//     // [$10] Flags2
+//     Bool  transcript_on;        // v1: bit0
+//     Bool  print_fixedfont;      // v3: bit1
+//     Bool  request_redraw;       // v6: bit2
+//     Bool  want_pics;            // v5: bit3
+//     Bool  want_undo;            // v5: bit4
+//     Bool  want_mouse;           // v5: bit5
+//     Bool  want_colors;          // v5: bit6
+//     Bool  want_sound;           // v5: bit7
+//     Bool  want_menus;           // v5: bit8
+//     //
+//     Byte_address  abbrevs;        // [$18], v2
+//     Word  file_length;            // [$1A], v3
+//     Word  checksum;               // [$1C], v3
+//     Byte  interpreter_number;     // [$1E], v4
+//     Byte  interpreter_version;    // [$1F], v4
+//     // Screen
+//     Byte  screen_lines;           // [$20], v4 ($FF = infinite)
+//     Byte  screen_chars;           // [$21], v4
+//     Word  screen_width;           // [$22], v5
+//     Word  screen_height;          // [$24], v5
+//     Byte  font_width;             // [$26], v5/v6
+//     Byte  font_height;            // [$27], v5/v6
+//     // Tables
+//     Offset8  routines;            // [$28], v6
+//     Offset8  strings;             // [$2A], v6
+//     Byte     backcolor;           // [$2C], v5
+//     Byte     forecolor;           // [$2D], v5
+//     Byte_address  term_chartable; // [$2E], v5
+//     Word     width3;              // [$30], v6
+//     Word     revnumber;           // [$32], v1
+//     Byte_address  alphabet;       // [$34], v5
+//     Byte_address  header_ext;     // [$36], v5
+//} Program_header_struct;
+
+
+enum MODE_FLAGS
+{
+       COLOR_AVAILABLE = 0,
+       DISPLAY_AVAILABLE = 1,
+       BOLD_AVAILABLE = 2,
+       ITALIC_AVAILABLE = 4,
+       MONOSPACE_AVAILABLE = 8
+};
+
 typedef struct {
-       unsigned version;  // 1..6
-       // [$01] V1..V3: Flags1
-       Bool  statusline_type;      // bit1: 0=score/turns, 1=hh:mm
-       Bool  split_two_discs;      // bit2
-       Bool  statusline_notavail;  // bit4
-       Bool  screensplit_avail;    // bit5
-       Bool  varpitchfont_default; // bit6
-       // [$01] V4: Flags1
-       Bool  colors_avail;         // v5: bit0
-       Bool  pics_avail;           // v6: bit1
-       Bool  bold_avail;           // v4: bit2
-       Bool  italic_avail;         // v4: bit3
-       Bool  fixedspace_avail;     // v4: bit4
-       Bool  sound_avail;          // v6: bit5
-       Bool  timedkeyb_avail;      // v4: bit7
-       // Addresses
-       Byte_address   highmem_base;  // [$04]
-       Byte_address   start_pc;      //  [$06], v1
-       Packed_address start_routine; //  [$06], v6
-       Byte_address   dictionary;    // [$08]
-       Byte_address   objects;       // [$0A]
-       Byte_address   globals;       // [$0C]
-       Byte_address   static_base;   // [$0E]
-       // [$10] Flags2
-       Bool  transcript_on;        // v1: bit0
-       Bool  print_fixedfont;      // v3: bit1
-       Bool  request_redraw;       // v6: bit2
-       Bool  want_pics;            // v5: bit3
-       Bool  want_undo;            // v5: bit4
-       Bool  want_mouse;           // v5: bit5
-       Bool  want_colors;          // v5: bit6
-       Bool  want_sound;           // v5: bit7
-       Bool  want_menus;           // v5: bit8
-       //
-       Byte_address  abbrevs;        // [$18], v2
-       Word  file_length;            // [$1A], v3
-       Word  checksum;               // [$1C], v3
-       Byte  interpreter_number;     // [$1E], v4
-       Byte  interpreter_version;    // [$1F], v4
-       // Screen
-       Byte  screen_lines;           // [$20], v4 ($FF = infinite)
-       Byte  screen_chars;           // [$21], v4
-       Word  screen_width;           // [$22], v5
-       Word  screen_height;          // [$24], v5
-       Byte  font_width;             // [$26], v5/v6
-       Byte  font_height;            // [$27], v5/v6
-       // Tables
-       Offset8  routines;            // [$28], v6
-       Offset8  strings;             // [$2A], v6
-       Byte     backcolor;           // [$2C], v5
-       Byte     forecolor;           // [$2D], v5
-       Byte_address  term_chartable; // [$2E], v5
-       Word     width3;              // [$30], v6
-       Word     revnumber;           // [$32], v1
-       Byte_address  alphabet;       // [$34], v5
-       Byte_address  header_ext;     // [$36], v5
+       Byte version;  // 1..6
+       Byte mode;
+       Word release;
+       Word resident_size;
+       Word startPC;
+       Word dictionaryTableOffset;
+       Word objectsTableOffset;
+       Word globalsTableOffset;
+       Word dynamic_size;
+       Word flags;
+       unsigned char serial[6];
+       Word h_abbreviations;
+       Word h_file_size;
+       Word checkSum;
+       unsigned char interpreterNumber;
+       unsigned char interpreterVersion;
+       unsigned char H_SCREEN_ROWS;
+       unsigned char H_SCREEN_COLS;
+       Word H_SCREEN_WIDTH;
+       Word H_SCREEN_HEIGHT;
+       unsigned char H_FONT_HEIGHT; /* this is the font width in V5 */
+       unsigned char H_FONT_WIDTH; /* this is the font height in V5 */
+       Word H_FUNCTIONS_OFFSET;
+       Word H_STRINGS_OFFSET;
+       unsigned char H_DEFAULT_BACKGROUND;
+       unsigned char  H_DEFAULT_FOREGROUND;
+       Word H_TERMINATING_KEYS;
+       Word H_LINE_WIDTH;
+       unsigned char  H_STANDARD_HIGH;
+       unsigned char H_STANDARD_LOW;
+       Word H_ALPHABET;
+       Word H_EXTENSION_TABLE;
+       char USER_NAME[8];
 } Program_header_struct;
 
 extern Program_header_struct Program_header;
@@ -96,4 +142,15 @@ extern Program_header_struct Program_header;
 void program_header_reset(unsigned zversion);
 ZMemblock *program_header_build(void);
 
+typedef struct {
+       Byte numberOfSelfinseringCharacters;
+       Byte *pSymbols;
+       Byte numberOfBytesInEachEntry;
+
+} Program_dictionary_struct ;
+
+
+
+void outputToFile(Program_header_struct *h, FILE* file);
+
 #endif  /* ifndef ZILASM_HEADER */
index f0f335b61e8c5fb3768d1eb1c53cb836dbaae1de..b60233930a32f83ea2b8c7132654f14157909aa8 100644 (file)
@@ -2,7 +2,7 @@
  * main.c
  *
  * Copyright (C) 2015 Alexander Andrejevic <theflash AT sdf DOT lonestar DOT org>
- * Copyright (C) 2015 Jason Self <j@jxself.org>
+ * Copyright (C) 2015, 2019 Jason Self <j@jxself.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -30,6 +30,8 @@
 
 #include "config.h"
 
+#include "header.h"
+
 const int DEFAULT_ZVERSION = 6;
 
 enum { ZVERSION = 11, ZORKID, ZSERIAL };
@@ -176,9 +178,41 @@ int init_assembly(void)
        return OK;
 }
 
-int assembly(void)
+int assembly(char *output_file)
 {
        /* TODO */
+       FILE *file = fopen(output_file, "w");
+       if (file)
+       {
+               program_header_reset(6);
+
+               int size = sizeof(Program_header );
+               //Program_header.
+
+               Program_header.mode = 0; // DISPLAY_AVAILABLE | MONOSPACE_AVAILABLE;
+               Program_header.release = 1; // game version
+
+               Program_header.startPC = 64;
+
+               Program_header.dynamic_size = 128;
+               Program_header.h_file_size = 9;  //sizeof(Program_header) + zmb->used_size;
+
+               ZMemblock *zmb = zmem_init(Program_header.h_file_size * 8);
+
+               //fprintf(file, "%c", 178); // printi command
+               //fprintf(file, "hello, world!");
+
+               zmem_putbyte(zmb, 186); // quit command
+
+
+
+               outputToFile(&Program_header, file);
+
+               //fprintf(file, "%c", 186);
+               fwrite(zmb->contents, zmb->allocated_size, 1, file);
+               fclose(file);
+       }
+
        return OK;
 }
 
@@ -227,7 +261,7 @@ int main(int argc, char *argv[], char *envp[])
 
        init_opcodes(Config.zversion, 0);
 
-       while(init_assembly() == OK && assembly() == NEED_RESTART);
+       while(init_assembly() == OK && assembly(output_file) == NEED_RESTART);
 
        /* TODO! List global symbols */
        /* TODO! Find abbreviations */
index 61038a4fc7e4061cdc76b7630e9c05c841bfea68..81713cc03b1f7df9e847ba73853cf1299062744f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * parser.c -- part of ZilUtils/ZilAsm
  *
- * Copyright (C) 2016 Jason Self <j@jxself.org>
+ * Copyright (C) 2016, 2019 Jason Self <j@jxself.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -124,12 +124,14 @@ int parse_line(const char *p)
        return 0;
 }
 
+#define MAX_LINESIZE 1024
+
 int parse_file(const char *filename)
 {
        FILE *fp = fopen(filename, "r");
        if (!fp) fatal_error("wrong file");
 
-       const int MAX_LINESIZE = 1024;
+        //const int MAX_LINESIZE = 1024;
        char line[MAX_LINESIZE];
        int newline_missing = 0;