/*
        Simulator Project for COP4600
        Original Design:  Dr. David Workman, 1990

        Revised (1993)
                Tim Hughey
                Mark Stephens

        EXTERNS.H

	This file contains the external data & functions defined in
        simulator.c 
*/

extern int OBJECTIVE;
extern FILE   *simout,
              *scriptfp,
              *logonfp,
              *PROGM_FILE[];
extern int    CPU_SW;      /* control switch for the CPU */
extern int    SCHED_SW;    /* control switch for the scheduler */
extern int    AGENT;
extern int    EVENT;
extern char  *opidtab[];
extern char  *eventidtab[];
extern char  *pgmidtab[];
extern int    DEVSIZE;
extern int    TRMSIZE;
extern int    SCHED;
extern int    NJOBS;                 /* total jobs processed     */
extern int    MAXSCRIPT;             /* max of ten programs      */
extern int    MAXSEGMENTS;           /* max. no. program segments*/
extern          int   MEMSIZE;       /* memory size              */
extern unsigned long  ONEOVRBETA;    /* expected service time    */
extern unsigned long  LOGON_T;       /* external time units for events */
extern double         RHO;           /* SJN Smoothing factor     */
extern struct simtime      CLOCK;    /* System Hardware Clock    */
extern struct timer_type   TIMER;    /* System Interval Timer    */
extern struct cpu_type     CPU;      /* Central Processor        */
extern struct state_type   OldState; /* Old State of Interrupt   */
extern struct state_type   NewState; /* New State of Interrupt   */
extern struct instr_type  *MEM;      /* Memory Storage Array     */
extern struct addr_type    MAR;      /* Memory Address Register  */
extern struct segment_type *MEMMAP;   /* Memory Address Map Array */
extern struct device_type  *devtable;   /* Device table               */
extern struct pcb_type     **termtable; /* terminal table (pcb pointers) */
extern struct event_type   *new_events; /* event list pointer */
extern struct instr_type   *prog_buff;  /* loader instruction buffer     */
extern struct seg_list     *FreeMem;   /* list of free memory segments   */
extern unsigned int        TotalFree;  /* Total Free Memory              */
extern struct simtime TOTLOGON;      /* total job  processing time       */
extern struct simtime TOTWAIT;       /* total job  wait       time       */
extern struct simtime TOTBLKED ;     /* total job  blocked    time       */
extern struct simtime TOTRUN   ;     /* total job  execution  time       */
extern struct simtime AVERUN   ;     /* Average user execution time      */
extern struct simtime AVEWAIT  ;     /* Average user wait      time      */
extern struct simtime AVEBLKED ;     /* Average user blocked   time      */
extern struct simtime AVELOGON ;     /* Average user logon     time      */
extern char           Lname[9] ;     /* last name of programmer          */
extern char           Outfile[14];   /* Name of output file              */

/* Debugging flags.  Use them! */
extern int  DEBUG_MEM;          /* flag that controls MEMORY DEBUG OUTPUT    */
extern int  DEBUG_EVTQ;         /* flag that controls EVENT_Q DEBUG OUTPUT   */
extern int  DEBUG_PCB;          /* flag that controls PCB DEBUG OUTPUT       */
extern int  DEBUG_RBLIST;       /* flag that controls RBLIST DEBUG OUTPUT    */
extern int  DEBUG_RBQ;          /* flag that controls RB_Q DEBUG OUTPUT      */
extern int  DEBUG_CPUQ;         /* flag that controls CPUQ DEBUG OUTPUT      */

/* given functions */
extern int    Interrupt_Handler(void);
extern void   Init(void);
extern void   Wrapup(void);
extern void   Write_stats(void);
extern void   Open_output(char *);
extern void   Event_hdr(void);
extern void   Convrt_time(struct simtime*, unsigned long);
extern int    Cmpr_time(struct simtime *, struct simtime *);
extern void   Add_time(struct simtime *, struct simtime *);
extern void   Diff_time(struct simtime*, struct simtime *);
extern double Divd_time(struct simtime *, struct simtime *);
extern void   Ave_time(struct simtime *, struct simtime *, int);
extern void   Burst_time(struct simtime *, unsigned long);
//extern void   strlwr(char *);
//extern void   strupr(char *);

/* debug functions */
extern void Dump_rblist();
extern void Dump_devq();
extern void Dump_cpuq();
extern void Dump_eventq();
extern void pcbdump();
extern void Dump_mem(struct segment_type *segtab);

/* Objective 1 functions */
extern void Add_event(struct simtime *, int, int);
extern void Load_events(void);
extern void Write_event(int, int, struct simtime *);
extern void Interrupt(void);

/* Objective 2 functions */
extern void Cpu(void);
extern  int Mu(void);
extern void XPGM(struct state_type *addr);
extern  int Fetch(struct instr_type *instr);
extern  int Read (struct instr_type *instr);
extern  int Write(struct instr_type *instr);
extern void Boot(void);
extern void Get_Instr(int pgmid, struct instr_type *instr);
extern void Display_pgm( struct segment_type *segtab, int numseg, struct pcb_type *pcb);
extern void SetMAR(struct addr_type *addr);

/* Objective 3 functions */
extern void Get_Script( struct pcb_type * );
extern void Logon_Service(void);
extern int  Next_pgm(struct pcb_type *); 
extern void Get_memory( struct pcb_type *);   
extern int  Alloc_Seg(int);
extern void Loader(struct pcb_type *);
extern void Dealloc_pgm(struct pcb_type *);
extern void Dealloc_seg( int base, int len );
extern void Merge_seg(void);
extern void End_Service(void);
extern void Abend_Service(void);

/* Objective 4 functions */
extern void             Add_cpuq(struct pcb_type *);
extern struct pcb_type *Scheduler(void);
extern void             Sio_Service(void);
extern void             Start_IO(int);
extern void             Add_devq(int, struct rb_type *);
extern void             Add_rblist(struct pcb_type *, struct rb_type *);
extern void             Wio_Service(void);
extern struct rb_type  *Find_rb(struct pcb_type *, struct addr_type *);
extern void             Delete_rb(struct rb_type *, struct pcb_type *);
extern void             Eio_Service(void);
extern void             Purge_rb(struct pcb_type *);
extern void             LoadMap(struct segment_type *, int);
extern void             Dispatcher(void);
/* Objective 5 functions */
extern void Calc_stats(void);

/* Objective 6 functions */
extern void Compact_mem(void);
double SimTimeToDouble();


