2012-04-29 12:55:59 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2012 Fabio Olimpieri
|
2012-04-15 18:16:37 +00:00
|
|
|
* Copyright 2003-2009 (C) Raster Software Vigo (Sergio Costas)
|
2012-04-29 12:55:59 +00:00
|
|
|
* This file is part of FBZX Wii
|
2012-04-15 18:16:37 +00:00
|
|
|
*
|
2012-04-29 12:55:59 +00:00
|
|
|
* FBZX Wii is free software; you can redistribute it and/or modify
|
2012-04-15 18:16:37 +00:00
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
2012-04-29 12:55:59 +00:00
|
|
|
* FBZX Wii is distributed in the hope that it will be useful,
|
2012-04-15 18:16:37 +00:00
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef computer_h
|
|
|
|
#define computer_h
|
|
|
|
|
|
|
|
#include <SDL/SDL.h>
|
|
|
|
#include <SDL/SDL_thread.h>
|
|
|
|
|
|
|
|
// #define MUT
|
|
|
|
|
2014-05-05 15:51:28 +00:00
|
|
|
#define KB_BUFFER_LENGHT 24
|
2013-02-10 13:08:05 +00:00
|
|
|
#define MAX_PATH_LENGTH 256
|
2013-03-24 14:31:03 +00:00
|
|
|
#define N_SAMPLES 8
|
2013-01-16 20:07:44 +00:00
|
|
|
|
2012-04-15 18:16:37 +00:00
|
|
|
extern char salir;
|
|
|
|
|
2013-05-03 20:24:52 +00:00
|
|
|
enum tapmodes {TAP_GUIDE, TAP_DATA, TAP_PAUSE, TAP_TRASH, TAP_STOP, TAP_STOP2, TAP_PAUSE2, TZX_PURE_TONE,
|
|
|
|
TZX_SEQ_PULSES, TAP_FINAL_BIT};
|
2012-04-15 18:16:37 +00:00
|
|
|
enum taptypes {TAP_TAP, TAP_TZX};
|
2013-02-24 08:04:20 +00:00
|
|
|
enum block_type {NOBLOCK, PROG, VAR, DATA};
|
2012-04-15 18:16:37 +00:00
|
|
|
|
2013-03-16 07:58:25 +00:00
|
|
|
extern int countdown_buffer;
|
2017-04-30 23:10:59 +02:00
|
|
|
extern unsigned char joybutton_matrix[6][322];
|
2012-04-25 21:13:57 +00:00
|
|
|
|
2012-04-15 18:16:37 +00:00
|
|
|
struct computer {
|
|
|
|
|
2012-07-29 08:39:21 +00:00
|
|
|
unsigned char precision; //If set 1 emulate with more precision
|
2013-01-03 10:00:10 +00:00
|
|
|
unsigned char precision_old;
|
2012-08-11 08:31:00 +00:00
|
|
|
unsigned char npixels; //1, 2 or 4 depending on dblscan and zaurus_mini
|
2012-08-12 15:28:08 +00:00
|
|
|
unsigned char progressive; //interlace or progressive 576
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned int temporal_io;
|
|
|
|
|
|
|
|
// screen private global variables
|
|
|
|
SDL_Surface *screen;
|
|
|
|
unsigned char *screenbuffer;
|
|
|
|
unsigned int screen_width;
|
|
|
|
unsigned int translate[6144],translate2[6144];
|
|
|
|
unsigned char zaurus_mini;
|
|
|
|
unsigned char text_mini;
|
|
|
|
unsigned char dblscan;
|
|
|
|
unsigned char bw;
|
2012-08-11 08:31:00 +00:00
|
|
|
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
int contador_flash;
|
|
|
|
|
|
|
|
unsigned int *p_translt,*p_translt2;
|
|
|
|
unsigned char *pixel; // current address
|
2012-08-11 08:31:00 +00:00
|
|
|
char border,flash, border_sampled;
|
2012-04-15 18:16:37 +00:00
|
|
|
int currline,currpix;
|
|
|
|
|
|
|
|
int tstados_counter; // counts tstates leaved to the next call
|
|
|
|
int resx,resy,bpp; // screen resolutions
|
|
|
|
int init_line; // cuantity to add to the base address to start to paint
|
|
|
|
int next_line; // cuantity to add when we reach the end of line to go to next line
|
|
|
|
int next_scanline; // cuantity to add to pass to the next scanline
|
|
|
|
int first_line; // first line to start to paint
|
|
|
|
int last_line; // last line to paint
|
2013-01-16 20:07:44 +00:00
|
|
|
int first_line_kb; // first line to start to paint the keyboard
|
|
|
|
int last_line_kb; // last line to paint the keyboard
|
2012-04-15 18:16:37 +00:00
|
|
|
int first_pixel; // first pixel of a line to paint
|
|
|
|
int last_pixel; // last pixel of a line to paint
|
|
|
|
int next_pixel; // next pixel
|
|
|
|
int pixancho,pixalto; // maximum pixel value for width and height
|
|
|
|
int jump_pixel;
|
2012-07-29 08:39:21 +00:00
|
|
|
int upper_border_line; //63 or 62 for 48k or 128k
|
|
|
|
int lower_border_line; //upper_border_line + 192
|
|
|
|
int start_screen; //Pixel at which the interrupt is generated
|
|
|
|
int cpufreq; //frequency CPU
|
|
|
|
int tstatodos_frame; //number of tstados per frame
|
|
|
|
int pixels_octect; //2 bits in the octect
|
|
|
|
int pixels_word; //2 bits in the word
|
2013-01-02 07:11:31 +00:00
|
|
|
int start_contention; //start tstados for contention
|
2012-12-27 15:39:35 +00:00
|
|
|
//int end_contention; //end tstados for contention
|
2012-07-29 08:39:21 +00:00
|
|
|
|
SDL sound, compile against MINGW (VK, fopen binary files, menu key calls FBZX Wii menu, return key active on KEYUP), 2 bugs in 128k snap format, turbo N in line command, separated code for normal and precise emulation, toggle full screen in FBZX menu, removed snow effect in normal emulation, changed save tape routine, fixed 2 bugs in z80, changed SP call in z80
2013-04-06 14:45:45 +00:00
|
|
|
//unsigned char screen_snow; // 0-> no emulate snow; 1-> emulate snow
|
2012-08-05 21:56:13 +00:00
|
|
|
unsigned char fetch_state;
|
SDL sound, compile against MINGW (VK, fopen binary files, menu key calls FBZX Wii menu, return key active on KEYUP), 2 bugs in 128k snap format, turbo N in line command, separated code for normal and precise emulation, toggle full screen in FBZX menu, removed snow effect in normal emulation, changed save tape routine, fixed 2 bugs in z80, changed SP call in z80
2013-04-06 14:45:45 +00:00
|
|
|
unsigned char contended_zone; // 0-> no contention; 1-> contention possible
|
2012-04-15 18:16:37 +00:00
|
|
|
int cicles_counter; // counts how many pixel clock cicles passed since las interrupt
|
|
|
|
|
|
|
|
char ulaplus; // 0 = inactive; 1 = active
|
|
|
|
unsigned char ulaplus_reg; // contains the last selected register in the ULAPlus
|
|
|
|
unsigned char ulaplus_palete[64]; // contains the current palete
|
|
|
|
|
|
|
|
// keyboard private global variables
|
|
|
|
|
|
|
|
unsigned char s8,s9,s10,s11,s12,s13,s14,s15;
|
|
|
|
unsigned char k8,k9,k10,k11,k12,k13,k14,k15;
|
|
|
|
unsigned char readed;
|
2013-02-09 07:41:56 +00:00
|
|
|
//unsigned char tab_extended;
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char esc_again;
|
|
|
|
|
|
|
|
// kempston joystick private global variables
|
|
|
|
|
|
|
|
unsigned char js,jk;
|
|
|
|
|
|
|
|
// Linux joystick private global variables
|
|
|
|
|
2013-01-05 06:43:46 +00:00
|
|
|
//unsigned char use_js;
|
|
|
|
//unsigned char updown,leftright;
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
// sound global variables
|
|
|
|
|
|
|
|
int tst_sample; // number of tstates per sample
|
|
|
|
int freq; // frequency for reproduction
|
|
|
|
int format; // 0: 8 bits, 1: 16 bits LSB, 2: 16 bits MSB
|
2012-05-06 10:37:14 +00:00
|
|
|
signed char sign; // 0: unsigned; -128: signed
|
2012-04-15 18:16:37 +00:00
|
|
|
int channels; // number of channels
|
|
|
|
int buffer_len; // sound buffer length (in samples)
|
2012-05-06 10:37:14 +00:00
|
|
|
int increment; // quantity to add to jump to the next sample
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char volume; // volume
|
2012-05-06 10:37:14 +00:00
|
|
|
unsigned char sample1[4]; // buffer with precalculated sample 1 (for buzzer) -currently not used
|
2013-01-26 08:10:57 +00:00
|
|
|
unsigned char sample1b[4]; // buffer with prec. sample 1 (for AY-3-8912) -currently not used
|
2012-05-06 10:37:14 +00:00
|
|
|
//unsigned char sample0[4]; // buffer with precalculated sample 0
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char sound_bit;
|
2013-01-26 08:10:57 +00:00
|
|
|
unsigned char sound_bit_mic;
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned int tstados_counter_sound;
|
2013-01-26 08:10:57 +00:00
|
|
|
unsigned int *current_buffer;
|
2014-05-10 12:14:02 +00:00
|
|
|
//unsigned char num_buff;
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned int sound_cuantity; // counter for the buffer
|
|
|
|
unsigned char ay_registers[16]; // registers for the AY emulation
|
|
|
|
unsigned int aych_a,aych_b,aych_c,aych_n,aych_envel; // counters for AY emulation
|
|
|
|
unsigned char ayval_a,ayval_b,ayval_c,ayval_n;
|
|
|
|
unsigned char ay_emul; // 0: no AY emulation; 1: AY emulation
|
2014-05-02 10:38:17 +00:00
|
|
|
unsigned char fuller_box_sound; // 0: no AY emulation; 1: AY emulation
|
2012-08-14 21:31:45 +00:00
|
|
|
unsigned char audio_mode; //mono, ABC, ACB, BAC
|
2014-12-25 10:14:47 +00:00
|
|
|
unsigned int gui_volume;
|
2014-12-29 18:38:05 +00:00
|
|
|
unsigned int currah_volume; // microspeech volume
|
2013-01-26 08:10:57 +00:00
|
|
|
unsigned int vol_a,vol_b,vol_c;
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned int tst_ay;
|
|
|
|
unsigned int ay_latch;
|
|
|
|
signed char ay_envel_value;
|
|
|
|
unsigned char ay_envel_way;
|
2012-08-14 21:31:45 +00:00
|
|
|
//unsigned char sound_current_value;
|
2013-02-19 08:50:27 +00:00
|
|
|
|
|
|
|
//Z80 instruction variables
|
2012-07-29 08:39:21 +00:00
|
|
|
unsigned int wr;
|
|
|
|
unsigned int r_fetch;
|
|
|
|
unsigned int io;
|
|
|
|
unsigned int contention;
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
// bus global variables
|
|
|
|
|
|
|
|
unsigned char bus_counter;
|
|
|
|
unsigned char bus_value;
|
|
|
|
unsigned char issue; // 2= 48K issue 2, 3= 48K issue 3
|
2012-07-29 08:39:21 +00:00
|
|
|
unsigned char mode128k; // 0=48K, 1=128K, 2=+2, 3=+3 4=sp
|
|
|
|
unsigned char videosystem; //0=PAL, 1=NTSC
|
2014-05-10 12:14:02 +00:00
|
|
|
unsigned char se_basic; //0=0ff; 1=0n
|
2017-04-30 23:10:59 +02:00
|
|
|
unsigned char joystick[6]; // 0=cursor, 1=kempston, 2=sinclair1, 3=sinclair2, 4=Fuller, 5=QAOP
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char port254;
|
|
|
|
|
|
|
|
|
|
|
|
// tape global variables
|
|
|
|
|
|
|
|
enum tapmodes tape_current_mode;
|
2013-02-24 08:04:20 +00:00
|
|
|
enum block_type next_block;
|
2013-03-06 22:37:42 +00:00
|
|
|
unsigned char tape_stop; // 1=tape stop
|
2013-03-09 10:00:42 +00:00
|
|
|
unsigned char tape_stop_fast; // 1=tape stop
|
|
|
|
unsigned char stop_tape_start_countdown; // 1=tape stop start countdown
|
2012-04-15 18:16:37 +00:00
|
|
|
enum taptypes tape_file_type;
|
|
|
|
unsigned int tape_counter0;
|
|
|
|
unsigned int tape_counter1;
|
|
|
|
unsigned int tape_counter_rep;
|
|
|
|
unsigned char tape_byte;
|
|
|
|
unsigned char tape_bit;
|
|
|
|
unsigned char tape_readed;
|
|
|
|
unsigned int tape_byte_counter;
|
|
|
|
unsigned int tape_pause_at_end;
|
2013-03-16 07:58:25 +00:00
|
|
|
unsigned int tape_position;
|
2012-04-15 18:16:37 +00:00
|
|
|
FILE *tap_file;
|
|
|
|
unsigned char tape_fast_load; // 0 normal load; 1 fast load
|
2013-01-27 14:04:18 +00:00
|
|
|
unsigned char rewind_on_reset;
|
2013-02-16 12:09:54 +00:00
|
|
|
unsigned char pause_instant_load;
|
2013-02-10 13:08:05 +00:00
|
|
|
unsigned char current_tap[MAX_PATH_LENGTH];
|
|
|
|
unsigned char last_selected_file[MAX_PATH_LENGTH];
|
|
|
|
unsigned char last_selected_poke_file[MAX_PATH_LENGTH];
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
unsigned char tape_current_bit;
|
|
|
|
unsigned int tape_block_level;
|
|
|
|
unsigned int tape_sync_level0;
|
|
|
|
unsigned int tape_sync_level1;
|
|
|
|
unsigned int tape_bit0_level;
|
|
|
|
unsigned int tape_bit1_level;
|
|
|
|
unsigned char tape_bits_at_end;
|
|
|
|
unsigned int tape_loop_counter;
|
2013-02-09 07:41:56 +00:00
|
|
|
unsigned int tape_start_countdwn;
|
2013-02-16 12:09:54 +00:00
|
|
|
unsigned int pause_fastload_countdwn;
|
2012-04-15 18:16:37 +00:00
|
|
|
long tape_loop_pos;
|
|
|
|
|
|
|
|
unsigned char tape_write; // 0 can't write; 1 can write
|
2015-02-25 09:46:20 +00:00
|
|
|
|
2015-03-28 07:49:44 +00:00
|
|
|
//RZX variables
|
2015-02-25 09:46:20 +00:00
|
|
|
unsigned char recording_rzx;
|
|
|
|
unsigned char playing_rzx;
|
|
|
|
unsigned short int maxicount;
|
|
|
|
unsigned short int icount;
|
2015-03-08 12:05:42 +00:00
|
|
|
unsigned int total_frames_rzx;
|
|
|
|
unsigned int frames_count_rzx;
|
2015-03-17 14:52:53 +00:00
|
|
|
unsigned char extract_screen_rzx;
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
// Microdrive global variables
|
|
|
|
FILE *mdr_file; // Current microdrive file
|
2013-02-10 13:08:05 +00:00
|
|
|
unsigned char mdr_current_mdr[MAX_PATH_LENGTH]; // current path and name for microdrive file
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char mdr_active; // 0: not installed; 1: installed
|
|
|
|
unsigned char mdr_paged; // 0: not pagined; 1: pagined
|
|
|
|
unsigned int mdr_tapehead; // current position in the tape
|
|
|
|
unsigned int mdr_bytes; // number of bytes read or written in this transfer
|
|
|
|
unsigned int mdr_maxbytes; // maximum number of bytes to read or write in this transfer
|
|
|
|
unsigned int mdr_gap; // TSTATEs remaining for GAP end
|
|
|
|
unsigned int mdr_nogap; // TSTATEs remaining for next GAP
|
|
|
|
unsigned char mdr_cartridge[137923]; // current cartridge
|
|
|
|
unsigned char mdr_drive; // current drive
|
|
|
|
byte mdr_old_STATUS; // to detect an edge in COM CLK
|
|
|
|
unsigned char mdr_modified; // if a sector is stored, this change to know that it must be stored in the file
|
|
|
|
|
2014-05-09 21:31:01 +00:00
|
|
|
// Currah microspeech variables
|
|
|
|
|
|
|
|
unsigned char currah_rom_unavailable;
|
|
|
|
unsigned char currah_active; // 0: not installed; 1: installed
|
|
|
|
unsigned char currah_paged; // 0: not pagined; 1: pagined
|
|
|
|
unsigned char currah_status; // 0: free; 1: busy
|
|
|
|
unsigned char current_allophone; // allophone to be played
|
|
|
|
unsigned char intonation_allophone;
|
|
|
|
int allophone_sound_cuantity; //pointer to allophone sample to be played
|
|
|
|
|
2012-04-15 18:16:37 +00:00
|
|
|
// OSD global variables
|
|
|
|
|
|
|
|
unsigned char osd_text[200];
|
|
|
|
unsigned int osd_time;
|
|
|
|
|
|
|
|
// pagination global variables
|
|
|
|
|
|
|
|
unsigned char mport1,mport2; // ports for memory management (128K and +3)
|
|
|
|
unsigned int video_offset; // 0 for page 5, and 32768 for page 7
|
|
|
|
unsigned char *block0,*block1,*block2,*block3; // pointers for memory access (one for each 16K block).
|
|
|
|
|
|
|
|
// public
|
|
|
|
|
|
|
|
unsigned char memoria[196608]; // memory (12 pages of 16K each one). 4 for ROM, and 8 for RAM
|
|
|
|
unsigned char shadowrom[8192]; // space for Interface I's ROMs
|
2014-05-09 21:31:01 +00:00
|
|
|
unsigned char currahrom[2048]; // space for Currah microspeech's ROMs
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char interr;
|
2012-07-29 08:39:21 +00:00
|
|
|
unsigned char readkeyboard;
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned char mustlock;
|
SDL sound, compile against MINGW (VK, fopen binary files, menu key calls FBZX Wii menu, return key active on KEYUP), 2 bugs in 128k snap format, turbo N in line command, separated code for normal and precise emulation, toggle full screen in FBZX menu, removed snow effect in normal emulation, changed save tape routine, fixed 2 bugs in z80, changed SP call in z80
2013-04-06 14:45:45 +00:00
|
|
|
//unsigned char other_ret; // 0=no change; 1=memory returns RET (201)
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
unsigned char turbo;
|
2012-12-27 15:39:35 +00:00
|
|
|
unsigned char turbo_state;
|
2013-01-16 20:07:44 +00:00
|
|
|
unsigned int keyboard_buffer[2][KB_BUFFER_LENGHT];
|
2012-04-15 18:16:37 +00:00
|
|
|
unsigned int kbd_buffer_pointer;
|
|
|
|
unsigned char *key;
|
2012-04-20 21:35:00 +00:00
|
|
|
unsigned char joystick_number;
|
2017-04-30 23:10:59 +02:00
|
|
|
SDL_Joystick *joystick_sdl[6];
|
|
|
|
unsigned char joy_axis_x_state[6];
|
|
|
|
unsigned char joy_axis_y_state[6];
|
|
|
|
unsigned int joybuttonkey[6][23];
|
|
|
|
unsigned char joypad_as_joystick[6];
|
|
|
|
unsigned char rumble[6];
|
2013-01-05 06:43:46 +00:00
|
|
|
unsigned char vk_auto;
|
2013-01-18 16:23:46 +00:00
|
|
|
unsigned char vk_rumble;
|
2013-01-16 20:07:44 +00:00
|
|
|
unsigned char vk_is_active;
|
2013-02-19 08:50:27 +00:00
|
|
|
unsigned char autoconf;
|
|
|
|
unsigned char ignore_z80_joy_conf;
|
2015-02-08 13:42:52 +00:00
|
|
|
unsigned char show_preview;
|
2013-02-19 08:50:27 +00:00
|
|
|
|
|
|
|
//Port variables
|
2012-08-27 09:49:49 +00:00
|
|
|
unsigned char port; //SD, USB, SMB or FTP
|
2012-05-12 12:39:49 +00:00
|
|
|
unsigned char smb_enable;
|
|
|
|
unsigned char SmbUser[32];
|
|
|
|
unsigned char SmbPwd[32];
|
|
|
|
unsigned char SmbShare[32];
|
|
|
|
unsigned char SmbIp[32];
|
2012-08-27 09:49:49 +00:00
|
|
|
unsigned char ftp_enable;
|
|
|
|
unsigned char FTPUser[32];
|
|
|
|
unsigned char FTPPwd[32];
|
2013-02-10 13:08:05 +00:00
|
|
|
unsigned char FTPPath[MAX_PATH_LENGTH];
|
2012-08-30 20:40:19 +00:00
|
|
|
unsigned char FTPIp[64];
|
2012-08-27 09:49:49 +00:00
|
|
|
unsigned char FTPPassive;
|
|
|
|
unsigned short FTPPort;
|
2013-02-19 08:50:27 +00:00
|
|
|
|
2012-04-15 18:16:37 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void computer_init();
|
|
|
|
void register_screen(SDL_Surface *);
|
2017-01-07 10:57:20 +01:00
|
|
|
void show_screen(int);
|
|
|
|
void show_screen_precision(int);
|
|
|
|
void paint_pixels(unsigned char, unsigned char, unsigned char, unsigned char draw);
|
|
|
|
void paint_pixels_precision(unsigned char, unsigned char, unsigned char,unsigned char draw);
|
|
|
|
void read_keyboard();
|
2012-04-15 18:16:37 +00:00
|
|
|
void fill_audio(void *udata,Uint8 *,int);
|
|
|
|
void set_volume(unsigned char);
|
2017-01-07 10:57:20 +01:00
|
|
|
void play_sound(unsigned int);
|
|
|
|
void emulate_screen(int);
|
|
|
|
void emulate(int);
|
2012-04-15 18:16:37 +00:00
|
|
|
void ResetComputer();
|
2017-01-07 10:57:20 +01:00
|
|
|
byte bus_empty();
|
2012-04-15 18:16:37 +00:00
|
|
|
void set_memory_pointers();
|
2017-01-07 10:57:20 +01:00
|
|
|
void play_ay();
|
|
|
|
void paint_one_pixel(unsigned char *colour,unsigned char *address);
|
2012-04-15 18:16:37 +00:00
|
|
|
void computer_set_palete();
|
|
|
|
void set_palete_entry(unsigned char entry, byte Value);
|
2012-07-29 08:39:21 +00:00
|
|
|
void restart_video();
|
2012-08-11 08:31:00 +00:00
|
|
|
void update_npixels();
|
2015-02-25 21:02:32 +00:00
|
|
|
void end_of_frame();
|
2012-04-15 18:16:37 +00:00
|
|
|
|
|
|
|
#endif
|