// nos-z nut operating system in Rz // model after nos2 in ecse\src 22 Aug 2011 // for s23 embed sys demo 20 Jan 2013 // s23 trap for nos // 20 enable interrupt // 21 disable interrupt // 22 block // 23 get event // 24 stop simulation asm(x) // dummy for compiler use new(n) // alloc n asm("trap r1 #14") blockp() asm("trap r0 #22") getEvent() asm("trap r0 #23") // global activep // current active process sseg // stack segment pid // unique process id // process descriptor // 0 next, 1 prev // 2 id, 3 value // 4 fp, 5 sp, 6 pc, // 7 inbox, 8 awaitbox, 9 msg, 10 timer // process state // READY, RUNNING, WAIT, DEAD, SEND, RECEIVE // process descriptor access function getNext(a) return a[0] getPrev(a) return a[1] setNext(a,v) a[0] = v setPrev(a,v) a[1] = v getId(p) return p[2] getValue(p) return p[3] setId(p,id) p[2] = id setValue(p, v) p[3] = v // ---- process list functions -------- // append a2 to the end of a1 appendDL(a1,a2) if(a1 == 0) setNext(a2,a2) // only one item setPrev(a2,a2) return a2 else b = getPrev(a1) setNext(a2,a1) setPrev(a1,a2) setNext(b,a2) setPrev(a2,b) return a1 deleteDL(b) print(" del ") if(getNext(b) == b) return 0 // delete singleton else a = getPrev(b) c = getNext(b) setNext(a,c) setPrev(c,a) setNext(b,0) // make b singleton return c newp() // new process p = new(11) // new pdes setNext(p,0) setPrev(p,0) p[4] = sseg p[5] = sseg + 500 p[6] = 0 sseg = sseg + 1000 p[7] = 0 p[8] = 0 return p // -------nos functions -------- init() pid = 1 sseg = 4000 activep = 0 run(ads) // return p p = newp() setId(p,pid) pid = pid + 1 p[6] = ads activep = appendDL(activep, p) return p bootnos() // setup interrupt asm("mov r1 #interrupt") asm("st r1 1000") asm("mov r1 #3") asm("trap r1 #10 ; set timer1 = 3") asm("mov r1 #100") asm("trap r1 #11 ; set div = 100") asm("trap r0 #20 ; enable int") // boot nos // restore fp,sp,pc from activep asm("ld r1 activep") asm("ld fp @4 r1") asm("ld sp @5 r1") asm("ld r2 @6 r1") asm("ret r2") interrupt() // switchp() asm("ld r21 activep") // save activep asm("st fp @4 r21") asm("st sp @5 r21") asm("st r31 @6 r21") print(" * save",activep) event = getEvent() if(event == 10) // 10 STOP activep = deleteDL(activep) else // 11 TIMEOUT, 12 BLOCK activep = getNext(activep) // switch next if(activep == 0) asm("trap r0 #24") // stop simulation print(" res",activep) // restore activep asm("ld r21 activep") asm("ld fp @4 r21") asm("ld sp @5 r21") asm("ld r31 @6 r21") // -------- user program ------ count1() i = 10 while(i < 300) print(i," ") i = i + 2 count2() i = 3 while(i < 300) print(i," ") i = i + 2 // --- applications ---------- p1, p2 // user process main() init() p1 = run(count1()) p2 = run(count2()) bootnos() // end