diff --git a/src/sys/s1.s b/src/sys/s1.s index ce56239..a1ee29d 100644 --- a/src/sys/s1.s +++ b/src/sys/s1.s @@ -71,7 +71,7 @@ sysexit: " common system call exit code jms chkint " pending user interrupt? skp " no, return to user jmp .save " yes: dump core - jms copy; u.rq+2; 10; 6 " restore auto-index locations 10-15 + jms copy; u.rq+2; 10; 6 " restore auto-index locations 10-15 (use 8/9) lac u.rq+1 " restore auto-index location 9 dac 9 lac u.rq " restore auto-index location 8 @@ -122,14 +122,14 @@ swap: 0 jms dskswap; 06000 " read process in? lac u.swapret " set our return addr dac swap " to saved return addr - lac o20 " reset maxquant to 16 ticks + lac o20 " reset maxquant to 16 ticks (149.333ms) dac maxquant lac u.dspbuf sza " using display? "** 01-s1.pdf page 4 jms movdsp " yes. switch to user display bufferx 3: - dzm uquant " no. reset process tick count + dzm uquant " reset process tick count iof jmp swap i " return t = t+1 diff --git a/src/sys/s2.s b/src/sys/s2.s index c430198..5d60a05 100644 --- a/src/sys/s2.s +++ b/src/sys/s2.s @@ -300,7 +300,7 @@ open1: " common exit for open/creat jmp 1f " no iof " yes: disable interrupts lac ii " get i number - tad swr " add to base instruction + tad swr " add to base (indirect jmp) dac .+1 jmp .. i " dispatch to read routine 1: @@ -339,14 +339,14 @@ open1: " common exit for open/creat jmp 1f " no iof " yes, special: turn interrupts off lac ii " get i number - tad sww " get write routine entry addr + tad sww " add to indirect jmp dac .+1 jmp .. i " dispatch to write routine 1: " here with regular file lac u.base " get base dac 1f+1 " save as iwrite arg 1 lac u.count " get count - dac 1f+2 " save as iwrite 2 + dac 1f+2 " save as iwrite arg 2 lac f.badd " get fd offset 1: jms iwrite; ..; .. " write to file diff --git a/src/sys/s3.s b/src/sys/s3.s index 1584ca5..8fce5e0 100644 --- a/src/sys/s3.s +++ b/src/sys/s3.s @@ -93,7 +93,7 @@ badcal: " bad (unimplemented) system call " fall into "save" system call " Ken says save files could be resumed, and used for checkpointing! .save: " "sys save" system call - lac d1 " get inode 1 (core file?) + lac d1 " get inode 1 (core file) jms iget " load inode cla jms iwrite; 4096; 4096 " dump core @@ -160,15 +160,15 @@ t = t+1 dac 9f+t dzm 9f+t i " clear ulist 3rd word (not waiting) jms error -1: 0 " worker for searchu +1: 0 " worker routine for searchu lac lu+1 " get process pid sad u.ac " match? skp " yes - jmp 1b i " no: return - lac lu+2 " get mailbox status + jmp 1b i " no: return to searchu + lac lu+2 " get dest process mailbox status sad dm1 " -1? jmp 1f " yes: process in rmes: ok to send - lac o100000 " no: bump our process status (to notready?) + lac o100000 " no: bump our process status (to notready) tad u.ulistp i dac u.ulistp i law 2 @@ -176,31 +176,33 @@ t = t+1 dac 9f+t lac u.ac " get dest pid dac 9f+t i " save in 3rd word of our ulist entry - jms swap - law 2 " where when swapped ready + jms swap " go to sleep + law 2 " here when ready (swapped back in) tad u.ulistp dac 9f+t - dzm 9f+t i " clear 3rd word of ulist entry - jmp .smes " restart smes -1: + dzm 9f+t i " clear 3rd word of our ulist entry + jmp .smes " restart smes (will fail if process gone) + +1: " dest process found, and in rmes call -3 tad 8 dac 9f+t " pointer to dest process ulist entry word 0 - lac o700000 " decrement process status: marks ready + lac o700000 " decrement dest process status: marks ready tad 9f+t i dac 9f+t i isz 9f+t isz 9f+t " point to message status lac u.pid " get our pid cma " complement - dac 9f+t i " store in status + dac 9f+t i " store in dest process status isz 9f+t " advance to next word lac u.mq " get user MQ - dac 9f+t i " save as message + dac 9f+t i " save as dest process message jmp okexit t = t+1 " wake up all processes hanging on smes to current process + " called on process exit and rmes system call awake: 0 jms searchu; 1f jmp awake i @@ -208,7 +210,7 @@ awake: 0 lac u.pid " get caller pid sad lu+2 " waiting to send to us? skp " yes - jmp 1b i " no, return + jmp 1b i " no, return to searchu -3 tad 8 " get pointer to process table entry dac 9f+t " save in t0 @@ -222,7 +224,7 @@ t = t+1 " device read/write switch swr: sww: - jmp .-4 i + jmp .-4 i " added to special device i-number .halt; rttyi; rkbdi; rppti; .halt .halt; wttyo; wdspo; wppto @@ -249,7 +251,7 @@ rttyi: wttyo: jms chkint1 jms forall - sna + sna " jmp fallr "returns" here jmp fallr lmq " save char in MQ lac sfiles+1 " get sleep word @@ -317,7 +319,7 @@ rkbdi: wdspo: jms chkint1 jms forall - jms dspput " put char (fallr "returns" here) + jms dspput " put char (jmp fallr "returns" here) jmp fallr " go back for next (continuation!) jms sleep; sfiles+6 jms swap @@ -343,7 +345,7 @@ rppti: " write routine (upper half) for paper tape punch special file wppto: jms forall - sna + sna " jmp fallr "returns" here jmp fallr lmq lac sfiles+4 " get sleepers @@ -374,16 +376,21 @@ passone: dac u.ac jmp sysexit + " error return from a system call + " return address @error never used + " (perhaps saved as a kind of "errno"?) error: 0 -1 dac u.ac jmp sysexit + " here on tty & kbd/display read/write calls + " check for pending "interrupt" and terminate process chkint1: 0 dzm .insys jms chkint skp - jmp .save + jmp .save " save core and exit -1 dac .insys jmp chkint1 i diff --git a/src/sys/s5.s b/src/sys/s5.s index 55f242c..c13058d 100644 --- a/src/sys/s5.s +++ b/src/sys/s5.s @@ -88,40 +88,44 @@ fput: 0 jmp fput i t = t+1 - " helper for special device write routines - " return to caller with next character to write: - " when done return character count to user. + " helper for special device write routines to fetch + " returns next character from user buffer + " when done returns from system call w/ character count in AC. forall: 0 lac u.base sad u.limit jmp 1f " done - lac u.base " get base pointer (again?) + lac u.base " get base pointer (again?? already in AC?!) ral " rotate MSB into LINK lac u.base i " fetch word via base pointer - snl " link set? - lrs 9 " no: get low 9 bits + snl " LINK set? + lrs 9 " no: shift high character down and o777 " mask to 9 bits jmp forall i " return char -fallr: " jump here for subsequent characters +fallr: " original caller jumps to here for subsequent characters lac u.base " get base - add o400000 " advance pointer - dac u.base " start from top - jmp forall+1 + add o400000 " advance character pointer + dac u.base + jmp forall+1 " start from top 1: lac u.count dac u.ac jmp sysexit - " wait for a condition variable + " prepare to sleep on a (character) device + " word after call is pointer to per-device sleepers word + " (bit vector indexed by ulist entry number) + " bit zero (MSB) of sleepers word is special (device busy?) " call: - " jmr sleep; sfiles+N + " jms sleep; sfiles+N + " jms swap sleep: 0 law ulist-1 " pointer to process table dac 8 " in index register lac o200000 - lmq " get 200000 in MQ -1: - lac u.ulistp i " get current process status word + lmq " get bit for process slot zero in MQ +1: " loop to get mask bit for our process in MQ + lac u.ulistp i " get our process status word (contains swap addr) sad 8 i " compare to next process table entry jmp 1f " match isz 8 " no match: skip other 3 words of process table @@ -130,13 +134,13 @@ sleep: 0 cla; lrs 1 " shift MQ down one jmp 1b " loop 1: - tad o100000 " mark process not ready + tad o100000 " increment our status to mark process not ready dac u.ulistp i lac sleep i " get sleep variable pointer dac 9f+t lac 9f+t i " get sleep variable contents - omq " or in MQ (bit vector of processes waiting) - dac 9f+t i " save + omq " or in MQ (set bit for our process) + dac 9f+t i " write sleep variable isz sleep " skip sleep variable pointer jmp sleep i t = t+1