Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* +-------------------------------------------------------------+
- | This code is my own work, it was written without consulting |
- | a tutor or code written by other students - Nikhil Murthy |
- +-------------------------------------------------------------+ */
- #include "../../h/const.h"
- #include "../../h/types.h"
- #include "../../h/procq.e"
- #include "../../h/asl.e"
- /************************************************
- Global Variables
- ************************************************/
- devreg_t *devregs = (devreg_t*)0x1400;
- /***************************************************************************
- * FUNCTION PROTOTYPES *
- ***************************************************************************/
- /* main functions */
- void readfromterminal();
- void writetoterminal();
- void delay();
- void gettimeofday();
- void terminate();
- /* utility functions*/
- int vir2real_add(vad_t *vadd);
- /* trap locations */
- state_t *sys_old = (state_t *) 0x930;
- state_t *sys_new = sys_old + 1;
- /* Read_from_Terminal (SYS9) */
- void
- readfromterminal()
- {
- char *data;
- int *cnt;
- int term;
- int done = 0;
- /* d3 = virtual address of buffer for data read */
- data = (char*)vir2real_add((vad_t*)sys_old->s_r[3]);
- /* d2 = return number of characters read */
- cnt = &(sys_old->s_r[2]);
- term = sys_old->s_tmp.tmp_sys.term_no;
- /* do the term i/o */
- devregs[term].d_stat = NULL;
- devregs[term].d_badd = data;
- devregs[term].d_op = IOREAD;
- while (!done)
- switch (devregs[term].d_stat) {
- case NULL:
- break;
- case NORMAL:
- *cnt = devregs[term].d_amnt;
- done = 1;
- break;
- case ENDOFINPUT:
- *cnt = -ENDOFINPUT;
- done = 1;
- break;
- default:
- *cnt = -devregs[term].d_stat;
- done = 1;
- break;
- }
- /* start the t-proc again */
- LDST(sys_old);
- }
- /* Write_to_Terminal (SYS10) */
- void
- writetoterminal()
- {
- /* d3 = virtual address of data buffer to write */
- char *data = (char*)vir2real_add((vad_t*)sys_old->s_r[3]);
- /* d4 = count of number of characters to be written */
- int *cnt = &(sys_old->s_r[4]);
- int term = sys_old->s_tmp.tmp_sys.term_no;
- int done = 0;
- /* do the i/o */
- devregs[term].d_stat = NULL;
- devregs[term].d_badd = data;
- devregs[term].d_op = IOWRITE;
- while (!done)
- switch(devregs[term].d_stat) {
- case NULL:
- break;
- case NORMAL:
- *cnt = devregs[term].d_amnt;
- done = 1;
- break;
- default:
- *cnt = -devregs[term].d_stat;
- done = 1;
- break;
- }
- /* start up the t-proc again */
- LDST(sys_old);
- }
- /* Delay (SYS13) */
- void
- delay()
- {
- }
- /* Get_Time_of_Day (SYS16) */
- void
- gettimeofday()
- {
- /* d2 = time of day clock */
- STCK(&(sys_old->s_r[2]));
- /* start the process back up */
- LDST(sys_old);
- }
- /* Terminate (SYS17) */
- void
- terminate()
- {
- }
- /************************************************
- Utility Functions
- ************************************************/
- int
- vir2real_add(vad_t *vadd)
- {
- int segnum, pagenum, offset;
- sd_t seg;
- pd_t page;
- int ret;
- segnum = vadd.v_seg; pagenum = vadd.v_page; offset = vadd.v_offset;
- seg = sys_old->s_crp + segnum;
- page = seg.sd_pta + pagenum;
- if (page.pd_p == 1)
- /* page is present */
- ret = ((int)page.pd_frame)*512 + offset;
- else ret = -1;
- return ret;
- }
Add Comment
Please, Sign In to add comment