home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / EXTRA-ST / APPLE-II / APPLE2-V.TAR / apple2 / misc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-09  |  29.8 KB  |  1,123 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <vga.h>
  4. #include <unistd.h>
  5. #include <sys/ioctl.h>
  6. #include <sys/signal.h>
  7. #include <vgakeyboard.h>
  8.  
  9. int            debug_start;
  10. int            debug_end;
  11.  
  12. int            chipset;        /* VGA chipset           */
  13. int            page_2_offset;        /* SVGA page 2 screen off. */
  14.  
  15. #define C_Flag        0x1            /* Carry            */
  16. #define X_Flag        0x2            /* X-tra           */
  17. #define I_Flag        0x4            /* Interrupt disable       */
  18. #define V_Flag        0x8            /* Overflow               */
  19. #define B_Flag        0x10            /* Break           */
  20. #define D_Flag        0x20            /* Decimal mode               */
  21. #define Z_Flag        0x40            /* Zero                  */
  22. #define N_Flag        0x80            /* Neg                  */
  23.  
  24. #define C_Flag_6502    0x1            /* Carry on 6502       */
  25. #define X_Flag_6502    0x20            /* Xtra on 6502           */
  26. #define I_Flag_6502    0x4            /* Interrupt flag on 6502  */
  27. #define V_Flag_6502    0x40            /* Overflow flag on 6502   */
  28. #define B_Flag_6502    0x10            /* Break flag on 6502       */
  29. #define D_Flag_6502    0x8            /* Decimal mode flag on 6502 */
  30. #define Z_Flag_6502    0x2            /* Zero flag on 6502       */
  31. #define N_Flag_6502    0x80            /* Neg flag on 6502       */
  32.  
  33. #define    K *1024
  34.  
  35. typedef enum { False, True } Tr;    /* --- Domain of Truth values
  36.                            (using the notation by
  37.                            John Allen -
  38.                         "The Anatomy of LISP") --- */
  39.  
  40. typedef void (*Function)();
  41.  
  42. /* ----------------------------------
  43.     External jump table functions
  44.    ---------------------------------- */
  45.  
  46. extern void    read_ram_default();
  47.  
  48. extern void    write_ram_default(),
  49.         write_ram_text_page0(),
  50.         write_ram_text_mixed0(),
  51.         write_ram_text_page1(),
  52.         write_ram_text_mixed1(),
  53.         write_ram_hires_page0_even(),
  54.         write_ram_hires_page0_odd(),
  55.         write_ram_hires_mixed0_even(),
  56.         write_ram_hires_mixed0_odd(),
  57.         write_ram_hires_page1_even(),
  58.         write_ram_hires_page1_odd(),
  59.         write_ram_hires_mixed1_even(),
  60.         write_ram_hires_mixed1_odd(),
  61.  
  62.         ram_nop(),
  63.         read_keyboard_strobe(),
  64.         read_random(),
  65.         read_speaker_toggle_pc(),
  66.         read_switch_primary_page(),
  67.         read_switch_secondary_page(),
  68.         read_switch_graphics(),
  69.         read_switch_text(),
  70.         read_switch_no_mixed(),
  71.         read_switch_mixed(),
  72.         read_switch_lores(),
  73.         read_switch_hires(),
  74.  
  75.         read_button0(),
  76.         read_button1(),
  77.         read_button2(),
  78.         read_gc0(),
  79.         read_gc1(),
  80.         read_gc_strobe(),
  81.     
  82.         lc_c080(),
  83.         lc_c081(),
  84.         lc_c082(),
  85.         lc_c083(),
  86.         lc_c088(),
  87.         lc_c089(),
  88.         lc_c08a(),
  89.         lc_c08b(),
  90.  
  91.         disk_read_nop(),
  92.         disk_read_phase(),
  93.         disk_read_motor_off(),
  94.         disk_read_motor_on(),
  95.         disk_read_select_a(),
  96.         disk_read_select_b(),
  97.         disk_read_byte(),
  98.         disk_read_latch(),
  99.         disk_write_latch(),
  100.         disk_read_prepare_in(),
  101.         disk_read_prepare_out();
  102.  
  103. extern void    c_init_6();
  104.  
  105. extern void    update_video_screen();
  106.  
  107. extern unsigned char read_keyboard();
  108. extern void c_initialize_keyboard();
  109. extern void c_initialize_mouse();
  110.  
  111. unsigned short      video_line_offset[24] =
  112.            { 0x000, 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380,
  113.              0x028, 0x0A8, 0x128, 0x1A8, 0x228, 0x2A8, 0x328, 0x3A8,
  114.              0x050, 0x0D0, 0x150, 0x1D0, 0x250, 0x2D0, 0x350, 0x3D0 };
  115.  
  116. unsigned char     *GM;         /* --- Base address of graphic area --- */
  117. unsigned char     *svga_GM;  /* --- SVGA base address of graphic area --- */
  118.  
  119. Tr          normal_vga_mode = False;
  120. Tr          force_vga_mode = False;
  121.  
  122. unsigned char     char_rom[0x800];           /* --- Character ROM --- */
  123. unsigned char     expanded_font[0x800*8];    /* --- Font --- */
  124.  
  125. unsigned char     expanded_col_highres_even[0x100*8]; /* --- Precalculated color
  126.                                                          bytes for highres. --- */
  127.  
  128. unsigned char     expanded_col_highres_odd[0x100*8]; /* --- Precalculated color
  129.                                                         bytes for highres. --- */
  130.  
  131. unsigned char     text_page_rows[1 K];       /* --- Precalculated text page
  132.                           rows given offset addr --- */
  133. unsigned char      text_page_cols[1 K];       /* --- Precalculated text page
  134.                           cols given offset addr --- */
  135. unsigned short      hires_page_offset[8 K];   /* --- Precalculated hi-res page
  136.                            SVGA offsets given addr --- */
  137.  
  138. unsigned char      table_encode_flags[256];
  139. unsigned char      table_decode_flags[256];
  140.  
  141. unsigned char      apple_ii_64k[64 K];
  142. unsigned char      apple_ii_rom[12 K];
  143. unsigned char      language_card[8 K];
  144. unsigned char      language_bank0[4 K];
  145. unsigned char      language_bank1[4 K];
  146.  
  147. unsigned char      language_current_bank;
  148. unsigned char      language_card_second;
  149. unsigned char      language_card_write;
  150. unsigned char      language_card_read;
  151.  
  152. unsigned char      exception_type = 0;
  153. unsigned char      exception_flag = 0;
  154.  
  155. Function      table_read_memory[64 K];
  156. Function      table_write_memory[64 K];
  157.  
  158. unsigned char      vmode_text;
  159. unsigned char      vmode_mixed;
  160. unsigned char      vmode_page2;
  161. unsigned char      vmode_hires;
  162. unsigned char      vmode_active;
  163.  
  164. unsigned char      current_slot;
  165.  
  166. unsigned short      apple_speed = 1;
  167. short           color_mode = 1;
  168. short          sound_mode = 1;
  169. extern short         joy_mode;
  170. extern short      joy_step;
  171. extern short      joy_center_x;
  172. extern short      joy_center_y;
  173.  
  174. unsigned char      random_value = 0;
  175.  
  176. extern unsigned char    disk_path[ 1024 ];
  177. unsigned char         system_path[ 2048 ] = ".";
  178.  
  179. unsigned char      temp[ 4096 ];
  180.  
  181. #include "colors.h"
  182.  
  183. #define GR_AREA_PAGE_0        0
  184. #define GR_AREA_PAGE_1          1
  185.  
  186. #define X_OFFSET        20
  187. #define Y_OFFSET        4
  188.  
  189. unsigned char    vga_mem_page_0[ 64 K ];  /* Only used in standard VGA */
  190. unsigned char    vga_mem_page_1[ 64 K ];     /* Only used in standard VGA */
  191.  
  192. int        crnt_visual_svga_page = -1; /* Current visual SVGA page */
  193. int        crnt_active_svga_page = -2; /* Current active SVGA page */
  194.  
  195. /* -------------------------------------------------------------------------
  196.     c_setpage(p):    Set SVGA 64k page and update GM
  197.                      (Graph Memory base address)
  198.    ------------------------------------------------------------------------- */
  199.  
  200. void c_setpage(p)
  201. {
  202.     if (!normal_vga_mode)
  203.     {
  204.         vga_setpage( p );
  205.         svga_GM = GM = vga_getgraphmem();
  206.     }
  207.     else
  208.     {
  209.         c_lock_menu_mode_on();
  210.         svga_GM = vga_getgraphmem();
  211.     GM = (crnt_visual_svga_page == p) ? svga_GM :
  212.          ((p == 0) ? vga_mem_page_0 : vga_mem_page_1);
  213.         c_lock_menu_mode_off();
  214.  
  215.         crnt_active_svga_page = p;
  216.     }
  217. }
  218.  
  219. /* -------------------------------------------------------------------------
  220.     c_setscreen(p):    Switch to screen page p
  221.    ------------------------------------------------------------------------- */
  222.  
  223. void c_setscreen(int m)
  224. {
  225.     if (!normal_vga_mode)
  226.         vga_setdisplaystart( m * page_2_offset );
  227.     else
  228.     {
  229.         c_wait_menu_buf_empty();
  230.         c_lock_menu_mode_on();
  231.         if (m != crnt_visual_svga_page)
  232.         {
  233.         memcpy( ((crnt_visual_svga_page == 0) ?
  234.                 vga_mem_page_0 : vga_mem_page_1),
  235.             svga_GM, 64 K );
  236.         memcpy( svga_GM, ((m == 0) ? vga_mem_page_0 : vga_mem_page_1),
  237.             64 K );
  238.         crnt_visual_svga_page = m;
  239.         GM = (crnt_active_svga_page == m) ? svga_GM :
  240.                  ((crnt_active_svga_page == 0) ?
  241.                   vga_mem_page_0 : vga_mem_page_1);
  242.     }
  243.         c_lock_menu_mode_off();
  244.     }
  245. }
  246.  
  247. void c_update_video_screen()
  248. {
  249.     int        i;
  250.     
  251.     c_wait_menu_buf_empty();
  252.     vga_clear();
  253.  
  254.     if (normal_vga_mode)
  255.     memset( vga_mem_page_0, 0, 64 K ),
  256.     memset( vga_mem_page_1, 0, 64 K );
  257.  
  258.     update_video_screen();
  259. }
  260.  
  261. /* -------------------------------------------------------------------------
  262.     c_initialize_highres_values()
  263.    ------------------------------------------------------------------------- */
  264.  
  265. void c_initialize_highres_values()
  266. {
  267.     int     value, b, v, e, color_toggle, last_not_black;
  268.  
  269.     for (value = 0x00; value <= 0xFF; value++)
  270.     for (e = value * 8, last_not_black = False, v = value, b = 0;
  271.          b < 7; b++, v >>= 1, e++)
  272.     {
  273.         if (v & 1)
  274.         {
  275.         expanded_col_highres_even[ e ] = last_not_black ?
  276.                         COLOR_LIGHT_WHITE :
  277.                     ((b & 1) ?
  278.                         ((value & 0x80) ?
  279.                              COLOR_LIGHT_RED :
  280.                          COLOR_LIGHT_PURPLE) :
  281.                         ((value & 0x80) ?
  282.                          COLOR_LIGHT_BLUE :
  283.                          COLOR_LIGHT_GREEN));
  284.  
  285.         expanded_col_highres_odd[ e ] = last_not_black ?
  286.                         COLOR_LIGHT_WHITE :
  287.                     ((b & 1) ?
  288.                         ((value & 0x80) ?
  289.                              COLOR_LIGHT_BLUE :
  290.                          COLOR_LIGHT_GREEN) :
  291.                         ((value & 0x80) ?
  292.                          COLOR_LIGHT_RED :
  293.                          COLOR_LIGHT_PURPLE));
  294.         if (last_not_black && b > 0)
  295.             expanded_col_highres_even[ e - 1 ] = COLOR_LIGHT_WHITE,
  296.             expanded_col_highres_odd[ e - 1 ] = COLOR_LIGHT_WHITE;
  297.  
  298.         last_not_black = True;
  299.         }
  300.         else
  301.         expanded_col_highres_even[ e ] = COLOR_BLACK,
  302.         expanded_col_highres_odd[ e ] = COLOR_BLACK,
  303.             last_not_black = False;
  304.     }
  305.  
  306.     if (color_mode == 0) /* No color */
  307.     {
  308.         for (value = 0x00; value <= 0xFF; value++)
  309.         for (b = 0, e = value * 8; b < 7; b++, e++)    
  310.         {
  311.         if (expanded_col_highres_even[ e ] != COLOR_BLACK)
  312.             expanded_col_highres_even[ e ] = COLOR_LIGHT_WHITE;
  313.         if (expanded_col_highres_odd[ e ] != COLOR_BLACK)
  314.             expanded_col_highres_odd[ e ] = COLOR_LIGHT_WHITE;
  315.         }
  316.     }
  317.     else
  318.     if (color_mode == 2) /* Color and interpolated */
  319.     {
  320.         for (value = 0x00; value <= 0xFF; value++)
  321.     {
  322.         for (b = 1, e = value * 8 + 1; b <= 5; b += 2, e += 2)    
  323.         {
  324.         if (expanded_col_highres_even[ e ] == COLOR_BLACK &&
  325.             expanded_col_highres_even[ e - 1 ] != COLOR_BLACK &&
  326.             expanded_col_highres_even[ e + 1 ] != COLOR_BLACK)
  327.               expanded_col_highres_even[ e ] =
  328.               expanded_col_highres_even[ e - 1 ];
  329.  
  330.         if (expanded_col_highres_odd[ e ] == COLOR_BLACK &&
  331.             expanded_col_highres_odd[ e - 1 ] != COLOR_BLACK &&
  332.             expanded_col_highres_odd[ e + 1 ] != COLOR_BLACK)
  333.               expanded_col_highres_odd[ e ] =
  334.               expanded_col_highres_odd[ e - 1 ];
  335.         }
  336.  
  337.         for (b = 0, e = value * 8; b <= 6; b += 2, e += 2)    
  338.         {
  339.         if (expanded_col_highres_odd[ e ] == COLOR_BLACK)
  340.         {
  341.             if (b > 0 && b < 6)
  342.                 if (expanded_col_highres_even[ e + 1 ] != COLOR_BLACK &&
  343.                 expanded_col_highres_even[ e - 1 ] != COLOR_BLACK &&
  344.                 expanded_col_highres_even[ e + 1 ] != COLOR_LIGHT_WHITE &&
  345.                 expanded_col_highres_even[ e - 1 ] != COLOR_LIGHT_WHITE)
  346.                     expanded_col_highres_even[ e ] =
  347.                         expanded_col_highres_even[ e - 1 ];
  348.             else;
  349.             else
  350.             if (b == 0)
  351.             if (expanded_col_highres_even[ e + 1 ] != COLOR_BLACK &&
  352.                 expanded_col_highres_even[ e + 1 ] != COLOR_LIGHT_WHITE)
  353.                 expanded_col_highres_even[ e ] =
  354.                 expanded_col_highres_even[ e + 1 ];
  355.             else;
  356.             else
  357.             if (expanded_col_highres_even[ e - 1 ] != COLOR_BLACK &&
  358.                 expanded_col_highres_even[ e - 1 ] != COLOR_LIGHT_WHITE)
  359.                 expanded_col_highres_even[ e ] =
  360.                 expanded_col_highres_even[ e - 1 ];
  361.         }
  362.  
  363.         if (expanded_col_highres_odd[ e ] == COLOR_BLACK)
  364.         {
  365.             if (b > 0 && b < 6)
  366.                 if (expanded_col_highres_odd[ e + 1 ] != COLOR_BLACK &&
  367.                 expanded_col_highres_odd[ e - 1 ] != COLOR_BLACK &&
  368.                 expanded_col_highres_odd[ e + 1 ] != COLOR_LIGHT_WHITE &&
  369.                 expanded_col_highres_odd[ e - 1 ] != COLOR_LIGHT_WHITE)
  370.                     expanded_col_highres_odd[ e ] =
  371.                         expanded_col_highres_odd[ e - 1 ];
  372.             else;
  373.             else
  374.             if (b == 0)
  375.             if (expanded_col_highres_odd[ e + 1 ] != COLOR_BLACK &&
  376.                 expanded_col_highres_odd[ e + 1 ] != COLOR_LIGHT_WHITE)
  377.                 expanded_col_highres_odd[ e ] =
  378.                 expanded_col_highres_odd[ e + 1 ];
  379.             else;
  380.             else
  381.             if (expanded_col_highres_odd[ e - 1 ] != COLOR_BLACK &&
  382.                 expanded_col_highres_odd[ e - 1 ] != COLOR_LIGHT_WHITE)
  383.                 expanded_col_highres_odd[ e ] =
  384.                 expanded_col_highres_odd[ e - 1 ];
  385.         }
  386.         }
  387.     }
  388.     }
  389. }
  390.  
  391. /* -------------------------------------------------------------------------
  392.     c_initialize_font():     Initialize ROM character table
  393.    ------------------------------------------------------------------------- */
  394.  
  395. void c_initialize_font()
  396. {
  397.     int            c, i, j, v, p;
  398.  
  399.     FILE *f;
  400.  
  401.     sprintf(temp, "%s/character.rom", system_path);
  402.     if ((f = fopen(temp, "r")) == NULL)
  403.     {
  404.     printf("Cannot find file 'character.rom'.\n");
  405.     exit(1);
  406.     }
  407.     fread( char_rom, 1, 0x800, f );
  408.     fclose( f );
  409.  
  410.     for (p = 0, c = 0; c < 256; c++)
  411.     for (i = c * 8; i < c * 8 + 8; i++, p++)
  412.         for (v = char_rom[ i ] >> 2, j = 0; j < 7; j++, v >>= 1, p++)
  413.             expanded_font[ p ] = (c < 128) ?
  414.                       ((v & 1) ? 0 : COLOR_LIGHT_WHITE) :
  415.                       ((v & 1) ? COLOR_LIGHT_WHITE : 0);
  416.  
  417.     for (c = 0x40, p = c * 64; c < 0x80; c++)
  418.         for (i = c * 8; i < c * 8 + 64; i++, p++)
  419.         expanded_font[ p ] = (expanded_font[ p ] == COLOR_LIGHT_WHITE) ?
  420.                         COLOR_FLASHING_WHITE :
  421.                     COLOR_FLASHING_BLACK;
  422. }
  423.  
  424. /* -------------------------------------------------------------------------
  425.     c_initialize_row_col_tables()
  426.    ------------------------------------------------------------------------- */
  427.  
  428. void c_initialize_row_col_tables()
  429. {
  430.     int            x, y, off;
  431.  
  432.     for (y = 0; y < 24; y++)
  433.     for (x = 0; x < 40; x++)
  434.         text_page_rows[ video_line_offset[ y ] + x ] = y,
  435.         text_page_cols[ video_line_offset[ y ] + x ] = x;
  436.  
  437.     for (y = 0; y < 24; y++)
  438.     for (off = 0; off < 8; off++)
  439.         for (x = 0; x < 40; x++)
  440.         hires_page_offset[ video_line_offset[ y ] + 0x400 * off + x ]
  441.                    = (y * 8 + off + 4) * 320 + x * 7 + 20;
  442. }
  443.  
  444. /* -------------------------------------------------------------------------
  445.     c_initialize_colors():    Initialize color palette
  446.    ------------------------------------------------------------------------- */
  447.  
  448. void c_initialize_colors()
  449. {
  450.     static int            col[ 32 ] = { 0, 6, 10, 14, 18, 22, 25, 28,
  451.                           31, 34, 37, 39, 41, 43, 45, 47,
  452.                           48, 49, 50, 51, 52, 53, 54, 55,
  453.                           56, 57, 58, 59, 60, 61, 62, 63 };
  454.  
  455.     static int            col2[ 3 ] = { 27, 40, 62 };
  456.  
  457.     int                i, j;
  458.  
  459.     for (i = 0; i < 8; i++)
  460.     for (j = 0; j < 32; j++)
  461.         vga_setpalette( j+i*32, (i & 1) ? col[ j ] : 0,
  462.                                     (i & 2) ? col[ j ] : 0,
  463.                                     (i & 4) ? col[ j ] : 0 );
  464.  
  465.     for (i = 0; i < 8; i++)
  466.     for (j = 0; j < 3; j++)
  467.         vga_setpalette( j+i*3+32, (i & 1) ? col2[ j ] : 0,
  468.                                       (i & 2) ? col2[ j ] : 0,
  469.                                       (i & 4) ? col2[ j ] : 0 );
  470.  
  471.     vga_setpalette( COLOR_FLASHING_BLACK, 0, 0, 0 );
  472.     vga_setpalette( COLOR_FLASHING_WHITE, 63, 63, 63 );
  473.  
  474.     /* Low resolution colors */
  475.  
  476.     vga_setpalette( 1, 255, 0, 255 );         /* Magenta         */
  477.     vga_setpalette( 2, 0, 0, 255 );        /* Medium blue        */
  478.     vga_setpalette( 3, 160, 32, 240 );        /* Purple        */
  479.     vga_setpalette( 4, 0, 100, 0 );        /* Dark green        */
  480.     vga_setpalette( 5, 127, 127, 127 );        /* Gray    (50%)        */
  481.     vga_setpalette( 6, 30, 144, 255 );        /* Dodger blue        */
  482.     vga_setpalette( 7, 173, 216, 230 );        /* Light blue        */
  483.     vga_setpalette( 8, 165, 42, 42 );        /* Brown        */
  484.     vga_setpalette( 9, 255, 69, 0 );        /* Orange red        */
  485.     vga_setpalette( 10, 127, 127, 127 );    /* Gray (50%)        */
  486.     vga_setpalette( 11, 255, 192, 203 );    /* Pink            */
  487.     vga_setpalette( 12, 0, 255, 0 );        /* Green        */
  488.     vga_setpalette( 13, 255, 255, 0 );        /* Yellow        */
  489.     vga_setpalette( 14, 127, 255, 212 );    /* Aquamarine        */
  490.     vga_setpalette( 15, 255, 255, 255 );    /* White        */
  491. }
  492.  
  493. /* -------------------------------------------------------------------------
  494.     c_initialize_tables()
  495.    ------------------------------------------------------------------------- */
  496.  
  497. void c_initialize_tables()
  498. {
  499.     int        i, x, y, off;
  500.  
  501.     for (i = 0; i < 256; i++)
  502.     {
  503.     unsigned char    val = 0;
  504.  
  505.     if (i & C_Flag)
  506.         val |= C_Flag_6502;
  507.     if (i & X_Flag)
  508.         val |= X_Flag_6502;
  509.     if (i & I_Flag)
  510.         val |= I_Flag_6502;
  511.     if (i & V_Flag)
  512.         val |= V_Flag_6502;
  513.     if (i & B_Flag)
  514.         val |= B_Flag_6502;
  515.     if (i & D_Flag)
  516.         val |= D_Flag_6502;
  517.     if (i & Z_Flag)
  518.         val |= Z_Flag_6502;
  519.     if (i & N_Flag)
  520.         val |= N_Flag_6502;
  521.  
  522.     table_encode_flags[ i ] = val | 0x20;
  523.     table_decode_flags[ val ] = i;
  524.     }
  525.  
  526.     for (i = 0; i < 0x10000; i++)
  527.     table_read_memory[ i ] = read_ram_default,
  528.     table_write_memory[ i ] = write_ram_default;
  529.  
  530.     for (i = 0xC000; i < 0x10000; i++)
  531.     table_write_memory[ i ] = ram_nop;
  532.  
  533.     for (y = 0; y < 24; y++)
  534.     for (x = 0; x < 40; x++)
  535.     {
  536.         table_write_memory[ video_line_offset[ y ] + x + 0x400] =
  537.             (y < 20) ? write_ram_text_page0 :
  538.                    write_ram_text_mixed0;
  539.  
  540.         table_write_memory[ video_line_offset[ y ] + x + 0x800] =
  541.             (y < 20) ? write_ram_text_page1 :
  542.                    write_ram_text_mixed1;
  543.  
  544.         for (i = 0; i < 8; i++)
  545.         {
  546.             table_write_memory[ 0x2000 + video_line_offset[ y ]
  547.                            + 0x400 * i + x ] =
  548.                 (y < 20) ? ((x & 1) ? write_ram_hires_page0_odd :
  549.                           write_ram_hires_page0_even)
  550.                  : ((x & 1) ? write_ram_hires_mixed0_odd :
  551.                           write_ram_hires_mixed0_even);
  552.  
  553.             table_write_memory[ 0x4000 + video_line_offset[ y ]
  554.                            + 0x400 * i + x ] =
  555.                 (y < 20) ? ((x & 1) ? write_ram_hires_page1_odd :
  556.                           write_ram_hires_page1_even)
  557.                  : ((x & 1) ? write_ram_hires_mixed1_odd :
  558.                           write_ram_hires_mixed1_even);
  559.         }
  560.     }
  561.  
  562.     for (i = 0xC000; i < 0xC010; i++)
  563.         table_read_memory[ i ] = (Function) read_keyboard;
  564.     for (i = 0xC000; i < 0xC010; i++)
  565.     table_write_memory[ i ] = ram_nop;
  566.  
  567.     for (i = 0xC010; i < 0xC020; i++)
  568.         table_read_memory[ i ] = table_write_memory[ i ] = read_keyboard_strobe;
  569.  
  570.     for (i = 0xC020; i < 0xC030; i++)
  571.     table_read_memory[ i ] = table_write_memory[ i ] = read_random;
  572.  
  573.     table_read_memory[ 0xC054 ] = table_write_memory[ 0xC054 ] =
  574.         read_switch_primary_page;
  575.     table_read_memory[ 0xC055 ] = table_write_memory[ 0xC055 ] =
  576.         read_switch_secondary_page;
  577.  
  578.     table_read_memory[ 0xC050 ] = table_write_memory[ 0xC050 ] =
  579.     read_switch_graphics;
  580.     table_read_memory[ 0xC051 ] = table_write_memory[ 0xC051 ] =
  581.     read_switch_text;
  582.  
  583.     table_read_memory[ 0xC052 ] = table_write_memory[ 0xC052 ] =
  584.     read_switch_no_mixed;
  585.     table_read_memory[ 0xC053 ] = table_write_memory[ 0xC053 ] =
  586.     read_switch_mixed;
  587.  
  588.     table_read_memory[ 0xC056 ] = table_write_memory[ 0xC056 ] =
  589.     read_switch_lores;
  590.     table_read_memory[ 0xC057 ] = table_write_memory[ 0xC057 ] =
  591.     read_switch_hires;
  592.  
  593.     table_read_memory[ 0xC061 ] = table_read_memory[ 0xC069 ] =
  594.         read_button0;
  595.     table_read_memory[ 0xC062 ] = table_read_memory[ 0xC06A ] =
  596.         read_button1;
  597.     table_read_memory[ 0xC063 ] = table_read_memory[ 0xC06B ] =
  598.         read_button2;
  599.     table_read_memory[ 0xC064 ] = table_read_memory[ 0xC06C ] =
  600.         read_gc0;
  601.     table_read_memory[ 0xC065 ] = table_read_memory[ 0xC06D ] =
  602.         read_gc1;
  603.     for (i = 0xC070; i < 0xC080; i++)
  604.     table_read_memory[ i ] = table_write_memory[ i ] = read_gc_strobe;
  605.  
  606.     table_read_memory[ 0xC080 ] = table_write_memory[ 0xC080 ] =
  607.     table_read_memory[ 0xC084 ] = table_write_memory[ 0xC084 ] =
  608.     lc_c080;
  609.     table_read_memory[ 0xC081 ] = table_write_memory[ 0xC081 ] =
  610.     table_read_memory[ 0xC085 ] = table_write_memory[ 0xC085 ] =
  611.     lc_c081;
  612.     table_read_memory[ 0xC082 ] = table_write_memory[ 0xC082 ] =
  613.     table_read_memory[ 0xC086 ] = table_write_memory[ 0xC086 ] =
  614.     lc_c082;
  615.     table_read_memory[ 0xC083 ] = table_write_memory[ 0xC083 ] =
  616.     table_read_memory[ 0xC087 ] = table_write_memory[ 0xC087 ] =
  617.     lc_c083;
  618.  
  619.     table_read_memory[ 0xC088 ] = table_write_memory[ 0xC088 ] =
  620.     table_read_memory[ 0xC08C ] = table_write_memory[ 0xC08C ] =
  621.     lc_c088;
  622.     table_read_memory[ 0xC089 ] = table_write_memory[ 0xC089 ] =
  623.     table_read_memory[ 0xC08D ] = table_write_memory[ 0xC08D ] =
  624.     lc_c089;
  625.     table_read_memory[ 0xC08A ] = table_write_memory[ 0xC08A ] =
  626.     table_read_memory[ 0xC08E ] = table_write_memory[ 0xC08E ] =
  627.     lc_c08a;
  628.     table_read_memory[ 0xC08B ] = table_write_memory[ 0xC08B ] =
  629.     table_read_memory[ 0xC08F ] = table_write_memory[ 0xC08F ] =
  630.     lc_c08b;
  631.  
  632.     table_read_memory[ 0xC0E0 ] = table_read_memory[ 0xC0E2 ] =
  633.     table_read_memory[ 0xC0E4 ] = table_read_memory[ 0xC0E6 ] =
  634.         disk_read_nop;
  635.  
  636.     table_read_memory[ 0xC0E1 ] = table_read_memory[ 0xC0E3 ] =
  637.     table_read_memory[ 0xC0E5 ] = table_read_memory[ 0xC0E7 ] =
  638.         disk_read_phase;
  639.  
  640.     table_read_memory[ 0xC0E8 ] = disk_read_motor_off;
  641.     table_read_memory[ 0xC0E9 ] = disk_read_motor_on;
  642.     table_read_memory[ 0xC0EA ] = disk_read_select_a;
  643.     table_read_memory[ 0xC0EB ] = disk_read_select_b;
  644.     table_read_memory[ 0xC0EC ] = disk_read_byte;
  645.     table_read_memory[ 0xC0ED ] = disk_read_latch;
  646.     table_read_memory[ 0xC0EE ] = disk_read_prepare_in;
  647.     table_read_memory[ 0xC0EF ] = disk_read_prepare_out;
  648.  
  649.     for (i = 0xC0E0; i < 0xC0F0; i++)
  650.         table_write_memory[ i ] = table_read_memory[ i ];
  651.  
  652.     table_write_memory[ 0xC0ED ] = disk_write_latch;
  653. }
  654.  
  655. /* -------------------------------------------------------------------------
  656.     c_initialize_apple_ii_memory()
  657.    ------------------------------------------------------------------------- */
  658.  
  659. void c_initialize_apple_ii_memory()
  660. {
  661.      FILE    *f;
  662.      int    i;
  663.      static int rom_loaded = 0;
  664.  
  665.      for (i = 0; i < 64 K; i++)
  666.          apple_ii_64k[ i ] = 0;
  667.      for (i = 0; i < 8 K; i++)
  668.          language_card[ i ] = 0;
  669.      for (i = 0; i < 4 K; i++)
  670.          language_bank0[ i ] = language_bank1[ i ] = 0;
  671.  
  672.      if (!rom_loaded)
  673.      {
  674.          sprintf(temp, "%s/apple_II.rom", system_path);
  675.          if ((f = fopen( temp, "r" )) == NULL)
  676.          {
  677.              printf("Cannot not find file 'apple_II.rom'.\n");
  678.          exit( 0 );
  679.          }
  680.  
  681.          fread( apple_ii_rom, 0x3000, 1, f );
  682.          fclose( f );
  683.      }
  684.  
  685.      for (i = 0xD000; i < 0x10000; i++)
  686.          apple_ii_64k[ i ] = apple_ii_rom[ i - 0xD000 ];
  687.  
  688.      for (i = 0; i < 0x1000; i++)
  689.      language_bank0[ i ] = apple_ii_rom[ i ];
  690.      for (i = 0; i < 0x2000; i++)
  691.      language_card[ i ] = apple_ii_rom[ i + 0x1000 ];
  692.  
  693.      for (i = 0xC100; i < 0xD000; i++)
  694.          apple_ii_64k[ i ] = i & 0xFF;
  695.  
  696.      apple_ii_64k[ 0xC000 ] = 0x00;
  697.  
  698.      sprintf(temp, "%s/slot6.rom", system_path);
  699.      if ((f = fopen( temp, "r" )) == NULL)
  700.      {
  701.          printf("Cannot not find file 'slot6.rom'.\n");
  702.      exit( 0 );
  703.      }
  704.  
  705.      fread( apple_ii_64k + 0xC600, 0x100, 1, f );
  706.      fclose( f );
  707.  
  708.      rom_loaded = 1;
  709. }
  710.  
  711. /* -------------------------------------------------------------------------
  712.     void c_initialize_sound()
  713.    ------------------------------------------------------------------------- */
  714.  
  715. void c_initialize_sound()
  716. {
  717.     int        i;
  718.  
  719.     ioperm( 0x42, 1, 1 );
  720.     ioperm( 0x61, 1, 1 );
  721.  
  722.     for (i = 0xC030; i < 0xC040; i++)
  723.         table_read_memory[ i ] = table_write_memory[ i ] =
  724.         sound_mode ? read_speaker_toggle_pc : ram_nop;
  725. }
  726.  
  727. /* -------------------------------------------------------------------------
  728.     void c_initialize()
  729.    ------------------------------------------------------------------------- */
  730.  
  731. #define my_pixel(x, y, c) GM[(y)*320+(x)]=(c)
  732.  
  733. void c_initialize()
  734. {
  735.     int        x, y;
  736.  
  737.     vga_disabledriverreport();
  738.  
  739.     chipset = vga_getcurrentchipset();
  740.  
  741.     if (force_vga_mode)
  742.     chipset = VGA;
  743.  
  744.     page_2_offset = 0x10000;
  745.     /* Trident cards use a different scan line width */
  746.     if (chipset == TVGA8900)
  747.         page_2_offset /= 4;
  748.     else
  749.     if (chipset == VGA)
  750.     {
  751.     if (!force_vga_mode)
  752.         printf("Warning: SVGAlib cannot use SVGA features due to unknown"
  753.                " chipset.\n"),
  754.         printf("         Standard VGA is used instead with some "
  755.            " performance degradation.\n");
  756.     else
  757.         printf("Warning: Forcing to standard VGA mode with some "
  758.            "performance degradation.\n");
  759.  
  760.     printf("Press RETURN to continue...");
  761.     getchar();
  762.     normal_vga_mode = True;
  763.     }
  764.     else
  765.     if (chipset == UNDEFINED)
  766.     {
  767.     vga_setmode(TEXT);
  768.     printf("SVGAlib couldn't detect an appropriate chipset.\n");
  769.     exit( 0 );
  770.     }
  771.  
  772.     c_initialize_font();
  773.     c_load_interface_font();
  774.     c_initialize_highres_values();
  775.     c_initialize_row_col_tables();
  776.     c_initialize_tables();
  777.     c_initialize_apple_ii_memory();
  778.     c_initialize_sound();
  779.     c_init_6();
  780.  
  781.     vga_setchipset( chipset );
  782.     vga_setmode( G320x200x256 );
  783.     vga_claimvideomemory( 131072 );
  784.  
  785.     c_initialize_keyboard();
  786.  
  787.     svga_GM = GM = vga_getgraphmem();
  788.     c_initialize_colors();
  789.  
  790.     c_setpage( 1 );
  791.  
  792.     for (y = 0; y < 200; y++)
  793.     for (x = 0; x < 320; x++)
  794.             my_pixel( x, y, 0 );
  795.  
  796.     c_setpage( 0 );
  797.  
  798.     for (y = 0; y < 200; y++)
  799.     for (x = 0; x < 320; x++)
  800.             my_pixel( x, y, 0 );
  801.  
  802.     vmode_text = vmode_mixed = True;
  803.     vmode_page2 = vmode_hires = False;
  804.     vmode_active = False;
  805.  
  806.     language_card_read = language_card_write = language_card_second = 0;
  807.     language_current_bank = 0;
  808.  
  809.     c_initialize_mouse();
  810. }
  811.  
  812. void c_read_random()
  813. {
  814.    random_value = (unsigned char)(rand() >> 8);
  815. }
  816.  
  817. typedef unsigned int Reg;
  818.  
  819. /*
  820. void print_instruction( int p )
  821. {
  822.     switch (p)
  823.     {
  824.     case 0: printf("BRK"); break;
  825.     case 1: printf("
  826. */
  827.  
  828. void debug_here()
  829. {
  830.       printf("I'm here\n");
  831. }
  832.  
  833. void debug( Reg eax, Reg ebx, Reg ecx, Reg edx, Reg esi, Reg edi )
  834. {
  835.       static int cnt = 0;
  836.  
  837.       if (++cnt >= debug_end)
  838.       {
  839.         for (cnt = 0; cnt < 256; cnt++)
  840.         {
  841.             printf("%02X ", apple_ii_64k[ cnt ] );
  842.         if (cnt % 8 == 7)
  843.             printf("\n");
  844.         }
  845.         keyboard_close();
  846.         exit( 0 );
  847.       }
  848.  
  849.       if (cnt < debug_start)
  850.       return;
  851.  
  852.     printf("(%8d) ", cnt);
  853.     printf("PC = %04X; SP = %04X; X = %02X; Y = %02X; A = %02X; (%02X) ",
  854.         esi, edx, ebx & 0xff, (ebx >> 8) & 0xff, ecx & 0xff, apple_ii_64k[ esi ] );
  855.  
  856.     ecx >>= 8;
  857.     if (ecx & C_Flag)
  858.     printf("C");
  859.     if (ecx & X_Flag)
  860.     printf("X");
  861.     if (ecx & I_Flag)
  862.     printf("I");
  863.     if (ecx & V_Flag)
  864.     printf("V");
  865.     if (ecx & B_Flag)
  866.     printf("B");
  867.     if (ecx & D_Flag)
  868.     printf("D");
  869.     if (ecx & Z_Flag)
  870.     printf("Z");
  871.     if (ecx & N_Flag)
  872.     printf("N");
  873.  
  874.     printf("\n");
  875. }
  876.  
  877. void z_debug( Reg eax, Reg ebx, Reg ecx, Reg edx, Reg esi, Reg edi, Reg esp )
  878. {
  879.     printf("-- EBX: %d, ECX: %d\n", ebx, ecx);
  880. /*
  881.     printf("-- PC = %04X; SP = %04X; X = %02X; Y = %02X; A = %02X; EADDR = %04X; ESP = %08X ",
  882.         esi, edx, ebx & 0xff, (ebx >> 8) & 0xff, ecx & 0xff, edi, esp );
  883.  
  884.     ecx >>= 8;
  885.     if (ecx & C_Flag)
  886.     printf("C");
  887.     if (ecx & X_Flag)
  888.     printf("X");
  889.     if (ecx & I_Flag)
  890.     printf("I");
  891.     if (ecx & V_Flag)
  892.     printf("V");
  893.     if (ecx & B_Flag)
  894.     printf("B");
  895.     if (ecx & D_Flag)
  896.     printf("D");
  897.     if (ecx & Z_Flag)
  898.     printf("Z");
  899.     if (ecx & N_Flag)
  900.     printf("N");
  901. */
  902.  
  903.     printf("\n");
  904. }
  905.  
  906. unsigned char * find_equal_sign( char *s )
  907. {
  908.     char *p = s;
  909.  
  910.     for (p = s; *p != '\0' && *p != '='; p++)
  911.     { }
  912.  
  913.     if (*p == '\0')
  914.     return NULL;
  915.  
  916.     for (p++; *p != '\0' && *p == ' '; p++)
  917.     { }
  918.  
  919.     return p;
  920. }
  921.  
  922. void strip_percent( char *s )
  923. {
  924.     char *p = s + strlen(s) - 1;
  925.     if (p >= s && *p == '%')
  926.     *p = '\0';
  927. }
  928.  
  929. void lowercase_string( char *s )
  930. {
  931.     char *p;
  932.  
  933.     for (p = s; *p != '\0'; p++)
  934.     *p = tolower(*p);
  935. }
  936.  
  937. void strip_string( char *s )
  938. {
  939.     char *p = s + strlen(s) - 1;
  940.  
  941.     if (*p == 10)
  942.     *p = '\0';
  943. }
  944.  
  945. void c_system_defaults( FILE *f )
  946. {
  947.     static char *parameters[] =
  948.     { "speed", "path", "color", "sound", "joystick",
  949.       "origin_x", "origin_y", "sensitivity",
  950.       "system_path", NULL };
  951.     static char temp[1024];
  952.     int       cmd, line;
  953.  
  954.     for (line = 0;;line++)
  955.     {
  956.         if (fgets( temp, 1000, f ) == NULL)
  957.         break;
  958.  
  959.     for (cmd = 0; parameters[cmd] != NULL; cmd++)
  960.         if (strncmp(parameters[cmd], temp, strlen(parameters[cmd])) == 0)
  961.         break;
  962.  
  963.     if (parameters[cmd] == NULL)
  964.         printf("Unknown command at line %d in .apple2\n", line);
  965.     else
  966.     {
  967.         unsigned char *p = find_equal_sign( temp );
  968.         if (p == NULL)
  969.         printf("Missing '=' after command at line %d in .apple2\n", line);
  970.         else
  971.         switch (cmd)
  972.         {
  973.         case 0:
  974.         strip_string( temp );
  975.         strip_percent( temp );
  976.             apple_speed = 101 - atoi( p );
  977.         if (apple_speed < 1)
  978.             apple_speed = 1;
  979.         else
  980.         if (apple_speed > 100)
  981.             apple_speed = 100;
  982.         break;
  983.         case 1:
  984.         strip_string( temp );
  985.         strcpy( disk_path, p );
  986.         break;
  987.         case 2:
  988.         strip_string( temp );
  989.         lowercase_string( p );
  990.         if (strcmp( p, "off" ) == 0)
  991.             color_mode = 0;
  992.         else
  993.             if (strcmp( p, "on" ) == 0)
  994.             color_mode = 1;
  995.         else
  996.         if (strcmp( p, "interpolated" ) == 0)
  997.             color_mode = 2;
  998.         else
  999.         printf("Illegal value to color parameter at line %d in .apple2\n", line);
  1000.         break;
  1001.         case 3:
  1002.         strip_string( temp );
  1003.         lowercase_string( p );
  1004.         if (strcmp( p, "off" ) == 0)
  1005.             sound_mode = 0;
  1006.         else
  1007.         if (strcmp( p, "on" ) == 0)
  1008.             sound_mode = 1;
  1009.         else
  1010.         if (strcmp( p, "pc speaker" ) == 0)
  1011.             sound_mode = 1;
  1012.         else
  1013.         printf("Illegal value to sound parameter at line %d in .apple2\n", line);
  1014.         break;
  1015.         case 4:
  1016.         strip_string( temp );
  1017.         lowercase_string( p );
  1018.         if (strcmp( p, "linear" ) == 0)
  1019.             joy_mode = 0;
  1020.         else
  1021.         if (strcmp( p, "digital" ) == 0)
  1022.             joy_mode = 1;
  1023.         else
  1024.         if (strcmp( p, "off" ) == 0)
  1025.             joy_mode = 2;
  1026.         else
  1027.             printf("Illegal value to joystick parameter at line %d in .apple2\n", line);
  1028.         break;
  1029.         case 5:
  1030.         strip_string( temp );
  1031.             joy_center_x = atoi( p );
  1032.         if (joy_center_x < 0)
  1033.             joy_center_x = 0;
  1034.         else
  1035.         if (joy_center_x > 255)
  1036.             joy_center_x = 255;
  1037.         break;
  1038.         case 6:
  1039.         strip_string( temp );
  1040.             joy_center_y = atoi( p );
  1041.         if (joy_center_y < 0)
  1042.             joy_center_y = 0;
  1043.         else
  1044.         if (joy_center_y > 255)
  1045.             joy_center_y = 255;
  1046.         break;
  1047.         case 7:
  1048.         strip_string( temp );
  1049.         strip_percent( p );
  1050.             joy_step = atoi( p );
  1051.         if (joy_step < 1)
  1052.             joy_step = 1;
  1053.         else
  1054.         if (joy_step > 100)
  1055.             joy_step = 100;
  1056.         break;
  1057.         case 8:
  1058.         strip_string( temp );
  1059.         strcpy( system_path, p );
  1060.         break;
  1061.         }
  1062.     }
  1063.     }
  1064. }
  1065.  
  1066. int main(int argc, char *argv[])
  1067. {
  1068.     int        i;
  1069.     FILE    *f;
  1070.  
  1071.     for (i = 1; i < argc; i++)
  1072.     {
  1073.     lowercase_string( argv[ i ] );
  1074.     if (strcmp( argv[ i ], "-vga") == 0)
  1075.         force_vga_mode = True;
  1076.     }
  1077.  
  1078.     f = fopen( ".apple2", "r");
  1079.     if (f == NULL)
  1080.     printf("Warning. Cannot find the .apple2 system defaults file.\n");
  1081.     else
  1082.     {
  1083.     c_system_defaults( f );
  1084.     fclose( f );
  1085.     }
  1086.  
  1087.     c_initialize();
  1088.  
  1089.     exception_flag = 1;
  1090.     exception_type = 0;
  1091.  
  1092.     vmode_active = False;
  1093.     c_setpage( 0 );
  1094.     c_setscreen( 0 );
  1095.  
  1096.     for (;;)
  1097.     {
  1098.         cpu6502();
  1099.  
  1100.         c_initialize_apple_ii_memory();
  1101.         c_init_6();
  1102.  
  1103.         vmode_text = vmode_mixed = True;
  1104.         vmode_page2 = vmode_hires = False;
  1105.  
  1106.         language_card_read = language_card_write = language_card_second = 0;
  1107.         language_current_bank = 0;
  1108.  
  1109.     exception_flag = 1;
  1110.     exception_type = 0;
  1111.  
  1112.         vmode_active = False;
  1113.     c_setpage( 0 );
  1114.     c_setscreen( 0 );
  1115.  
  1116.     c_update_video_screen();
  1117.     }
  1118.  
  1119.     vga_setmode(TEXT);
  1120.     keyboard_close();
  1121.     exit( 0 );
  1122. }
  1123.