sys: kernel comments

This commit is contained in:
Phil Budne
2016-03-11 16:01:01 -05:00
parent df1d8e29dd
commit 802ab257b9
8 changed files with 260 additions and 233 deletions
+8 -6
View File
@@ -9,7 +9,7 @@ orig:
. = orig+7 . = orig+7
-1 " only ever set (to -1): never read?! -1 " only ever set (to -1): never read?!
. = orig+020 " syscall (CAL) processing . = orig+020 " syscall (CAL) and user "interrupt" processing
1f " addr for "CAL I": store return here on "CAL" 1f " addr for "CAL I": store return here on "CAL"
iof " interrupts off iof " interrupts off
dac u.ac " save user AC dac u.ac " save user AC
@@ -19,8 +19,8 @@ orig:
dac 020 " restore location 20 dac 020 " restore location 20
lac u.ac " restore user AC lac u.ac " restore user AC
jmp 1f+1 " join "CAL I" processing jmp 1f+1 " join "CAL I" processing
1f 1f " literal to restore location 20
1: 0 1: 0 " "CAL I" PC stored here
iof " interrupts off iof " interrupts off
dac u.ac " save user AC dac u.ac " save user AC
lacq lacq
@@ -64,7 +64,7 @@ sysexit: " common system call exit code
jms dskio; 07000 " save to disk? jms dskio; 07000 " save to disk?
1: 1:
dzm .insys " clear "in system call" flag dzm .insys " clear "in system call" flag
jms chkint " pending interrupt? jms chkint " pending user interrupt?
skp " no skp " no
jmp .save " yes: dump core 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
@@ -169,12 +169,14 @@ locsw: " table of system addresses for sysloc
locn: locn:
.-locsw-1 .-locsw-1
" check if interrupt for user " check if "interrupt" for current process
" checks .int1 and .int2 (contain i-number of interrupt source) " checks .int1 and .int2 (contain i-number of interrupt source)
" compared against process stdin
"
" call: " call:
" .insys/ 0 " .insys/ 0
" jms chkint " jms chkint
" no: no interrupt, or intflg set (discards interupt) " no: no interrupt, or intflg set (discards interrupt)
" yes: PI off, .insys set " yes: PI off, .insys set
chkint: 0 chkint: 0
lac .insys lac .insys
+5 -5
View File
@@ -121,7 +121,7 @@
lac i.uniq lac i.uniq
dac d.uniq dac d.uniq
-1 -1
tad i.nlks tad i.nlks " decrement link count!
dac i.nlks dac i.nlks
"** 01-s1.pdf page 9 "** 01-s1.pdf page 9
jms iput jms iput
@@ -138,10 +138,10 @@
jms dput jms dput
lac u.base lac u.base
jms iget jms iget
isz i.nlks isz i.nlks " increment link count
jmp 1f jmp 1f " not zero
jms itrunc jms itrunc " zero links: free blocks
dzm i.flags dzm i.flags " clear status (free inode)
1: 1:
jms iput jms iput
jmp sysexit jmp sysexit
+4 -4
View File
@@ -231,7 +231,7 @@ sww:
" read routine for ttyin special file " read routine for ttyin special file
rttyi: rttyi:
jms chkint1 jms chkint1
lac d1 lac d1 " ** written d3 ttyin2
jms getchar jms getchar
jmp 1f jmp 1f
and o177 and o177
@@ -258,9 +258,9 @@ wttyo:
xor o400000 xor o400000
dac sfiles+1 dac sfiles+1
lacq lacq
tls tls " load output buffer
sad o12 sad o12 " newline?
jms putcr jms putcr " yes, put CR as well
jmp fallr jmp fallr
1: 1:
lacq lacq
+84 -75
View File
@@ -88,132 +88,141 @@ fput: 0
jmp fput i jmp fput i
t = t+1 t = t+1
" helper for special device write routines
" return to caller with next character to write:
" when done return character count to user.
forall: 0 forall: 0
lac u.base lac u.base
sad u.limit sad u.limit
jmp 1f jmp 1f " done
lac u.base lac u.base " get base pointer (again?)
ral ral " rotate MSB into LINK
lac u.base i lac u.base i " fetch word via base pointer
snl snl " link set?
lrs 9 lrs 9 " no: get low 9 bits
and o777 and o777 " mask to 9 bits
jmp forall i jmp forall i " return char
fallr: fallr: " jump here for subsequent characters
lac u.base lac u.base " get base
add o400000 add o400000 " advance pointer
dac u.base dac u.base " start from top
jmp forall+1 jmp forall+1
1: 1:
lac u.count lac u.count
dac u.ac dac u.ac
jmp sysexit jmp sysexit
" wait for a condition variable
" call:
" jmr sleep; sfiles+N
sleep: 0 sleep: 0
law ulist-1 law ulist-1 " pointer to process table
dac 8 dac 8 " in index register
lac o200000 lac o200000
lmq lmq " get 200000 in MQ
1: 1:
lac u.ulistp i lac u.ulistp i " get current process status word
sad 8 i sad 8 i " compare to next process table entry
jmp 1f jmp 1f " match
isz 8 " no match: skip other 3 words of process table
isz 8 isz 8
isz 8 isz 8
isz 8 cla; lrs 1 " shift MQ down one
cla; lrs 1 jmp 1b " loop
jmp 1b
1: 1:
tad o100000 tad o100000 " mark process not ready
dac u.ulistp i dac u.ulistp i
lac sleep i lac sleep i " get sleep variable pointer
dac 9f+t dac 9f+t
lac 9f+t i lac 9f+t i " get sleep variable contents
omq omq " or in MQ (bit vector of processes waiting)
dac 9f+t i dac 9f+t i " save
isz sleep isz sleep " skip sleep variable pointer
jmp sleep i jmp sleep i
t = t+1 t = t+1
"** 01-s1.pdf page 30 "** 01-s1.pdf page 30
" look for a free directory entry??
dslot: 0 dslot: 0
dzm di dzm di
skp skp
1: 1:
isz di isz di
lac di lac di
jms dget jms dget " get directory entry
lac d.i lac d.i " get i number
sza sza " zero (free)?
jmp 1b jmp 1b " no keep looking
jmp dslot i jmp dslot i " yes: return index
" called with: " called with:
" AC/ mode " AC/ mode
" name/ file name
icreat: 0 icreat: 0
dac 9f+t dac 9f+t " save mode in t0
jms dslot jms dslot
lac o20 lac o20 " look for a free inode starting at 17
dac ii dac ii
1: 1:
isz ii isz ii
lac ii lac ii
jms iget jms iget
lac i.flags lac i.flags
spa spa " "in use" bit bit clear?
jmp 1b jmp 1b " no, guess again
lac ii lac ii
dac d.i dac d.i
jms copy; name; d.name; 4 jms copy; name; d.name; 4
isz s.uniq isz s.uniq " get a new unique number
lac s.uniq lac s.uniq
dac d.uniq dac d.uniq " save in directory entry
dac i.uniq dac i.uniq " and inode
lac 9f+t lac 9f+t " get mode
xor o400000 xor o400000 " set "in use"
dac i.flags dac i.flags
lac u.uid lac u.uid " get user
dac i.uid dac i.uid " set owner
-1 -1
dac i.nlks dac i.nlks " -1 links?!
dzm i.size dzm i.size " empty
jms copyz; i.dskps; 7 jms copyz; i.dskps; 7 " clear disk block numbers
jms iput jms iput " write inode
jms dput jms dput " write directory entry
jmp icreat i jmp icreat i
t = t+1 t = t+1
" output character to display
dspput: 0 dspput: 0
and o177 and o177 " mask to 7 bits
sna sna
jmp i dspput jmp i dspput " discard NUL
sad o14 sad o14 " Form Feed?
jmp 1f jmp 1f " yes
lmq lmq " save char in MQ
sad o12 sad o12 " newline?
jms dspnl jms dspnl " yes
lac dsploc i lac dsploc i " get display word
sad o400000 sad o400000 " TRAP?
jmp dspleft jmp dspleft " yes
omq omq " no: get character back
dac dsploc i dac dsploc i " save as "character 2"
isz dsploc isz dsploc " advance display pointer
jmp i dspput jmp i dspput
"** 01-s1.pdf page 31 "** 01-s1.pdf page 31
1: 1: " here on form feed
jms dspinit jms dspinit " clear display
jmp dspput i jmp dspput i
dspleft: dspleft:
lac dsploc lac dsploc " get display pointer
sad edspbuf sad edspbuf " end of the buffer?
jmp 1f jmp 1f " yes
dac 8 dac 8
lac o400000 lac o400000 " get TRAP instruction
dac 8 i dac 8 i " store
cla; llss 18+7 cla; llss 18+7
dac dsploc i dac dsploc i
jmp dspput i jmp dspput i
@@ -225,17 +234,17 @@ dspnl: 0
isz dsplno isz dsplno
jmp dspnl i jmp dspnl i
1: 1:
lac o2000 lac o2000 " get bit for push button 7
wbl wbl " write button lights
isz dspput isz dspput
jmp dspput i jmp dspput i
dspinit: 0 dspinit: 0
lac dspbufp3 lac dspbufp3 " get pointer to dspbuf+3
dac dsploc dac dsploc " store location
lac o400000 lac o400000 " display "TRAP" instruction
dac dspbuf+3 dac dspbuf+3 " save in buffer
dzm dsplno dzm dsplno " clear display line number
jmp dspinit i jmp dspinit i
movdsp: 0 movdsp: 0
+9 -6
View File
@@ -151,12 +151,14 @@ iput: 0
jmp iput i jmp iput i
t = t+3 t = t+3
" allocate directory entry
" AC/ entry number
dget: 0 dget: 0
dac di dac di " save entry number
alss 3 alss 3 " get word number
dac 9f+t dac 9f+t " save in t0
jms pget jms pget " get free disk block
dac 9f+t+1 dac 9f+t+1 " save in t1
jms dskrd jms dskrd
lac 9f+t lac 9f+t
and o77 and o77
@@ -185,7 +187,8 @@ dput: 0
t = t+3 t = t+3
" allocate a block for a file, returns disk block number " get a block number for a file, returns disk block number
" allocates block if not allocated
" AC/ file offset " AC/ file offset
" jms pget " jms pget
" AC/ disk block number " AC/ disk block number
+108 -100
View File
@@ -38,18 +38,18 @@ pibreak: " priority interrupt break processing "chain"
"** written: ttydelay -> ttyd1 "** written: ttydelay -> ttyd1
"** written: ttyrestart -> ttyres1 "** written: ttyrestart -> ttyres1
" referenced in iread: cnop: " fetched as constant in iread
cnop:
nop nop
-1 -1
dac 7 " set location 7 to -1 dac 7 " set location 7 to -1 (nothing ever clears it)
clon " enable clock interrupts, reset flag clon " enable clock interrupts, reset flag
lac ttydelay lac ttydelay " tty delay positive?
spa spa " yes: skip to skp
isz ttydelay isz ttydelay " no: done delaying?
skp skp " not done
jms ttyrestart jms ttyrestart " yes: start output
lac .dspb "** START CROSSED OUT: written: lac tty "** START CROSSED OUT: written: lac tty
lac .dspb
sna sna
jmp piret jmp piret
isz .dsptm isz .dsptm
@@ -61,23 +61,24 @@ cnop:
jmp piret jmp piret
jmp dsprestart "** END CROSSED OUT jmp dsprestart "** END CROSSED OUT
1: dssf 1: dssf " disk flag set?
jmp 1f jmp 1f " no
-1 -1 " set .dskb = -1
dac .dskb dac .dskb
"** 01-s1.pdf page 42 "** 01-s1.pdf page 42
dsrs dsrs " get disk status in .dske
dac .dske dac .dske
dscs dscs " clear status register
jmp piret jmp piret
1: lds "** BEGIN CROSSED OUT "** BEGIN CROSSED OUT
sma ral 1: lds " load display status (see 03-scope.pdf pg 25)
jmp 1f sma ral " edges flag??
cdf jmp 1f " not set
cdf " clear display flags?
lac .dspb lac .dspb
sna sna
jmp piret jmp piret
@@ -88,29 +89,29 @@ cnop:
jmp piret jmp piret
dsprestart: dsprestart:
lac d1 lac d1
dac .dspb dac .dspb " set .dsbp = 1
lac dspbufp lac dspbufp " load display buf pointer
beg beg " start display processor
-10 -10
dac .dsptm dac .dsptm " set .dsptm = -10 (10 ticks)
jmp piret jmp piret
1: sna ral 1: sna ral " dataphone flag set (bit 7)??
jmp .+3 jmp .+3 " no
dpcf dpcf " clear dataphone flag
jmp piret jmp piret " return
sma sma " light pen flags (bit 2)
jmp 1f jmp 1f " no
lda lda " G-2: load display address
dac .lpba dac .lpba " save
rlpd rlpd " G-2: resume after light pen stop
jmp piret jmp piret
1: ksf " (TTY) keyboard flag set? 1: ksf " (TTY) keyboard flag set?
jmp 1f " no jmp 1f " no
lac ttydelay lac ttydelay " get TTY delay
sma sma "
isz ttydelay isz ttydelay
krb " read keyboard buffer krb " read keyboard buffer
dac char " save in char dac char " save in char
@@ -119,58 +120,58 @@ dsprestart:
lac d1 lac d1
jms putchar jms putchar
dzm char dzm char
lac sfiles+0 lac sfiles+0 " get sleep word for ttyin
jms wakeup jms wakeup " wake processes
dac sfiles+0 dac sfiles+0 " clear sleep word
lac char lac char " get character
sad o212 sad o212 " odd condition (break???)
skp skp " yes
jmp piret jmp piret " no: done
lac sfiles+1 lac sfiles+1 " get ttyout wait word
sma sma " bit for process 1 already set?
xor o400000 xor o400000 " no, make it so
dac sfiles+1 dac sfiles+1 " save back
"** 01-s1.pdf page 43 "** 01-s1.pdf page 43
jms putcr jms putcr " output CR next
jms ttyrestart jms ttyrestart " start output
jmp piret jmp piret
1: tsf 1: tsf " TTY output flag set?
jmp 1f jmp 1f " no
tcf tcf " yes: clear flag
jms ttyrestart jms ttyrestart " transmit next character
jmp piret jmp piret
ttyrestart: 0 ttyrestart: 0
lac ttydelay lac ttydelay " get tty delay
spa spa " positive?
jmp ttyrestart i jmp ttyrestart i " no: keep waiting
lac nttychar lac nttychar " get pending CR, if any
dzm nttychar dzm nttychar " clear it
sza sza " need to send CR?
jmp 3f jmp 3f " yes
isz ttydelay isz ttydelay " increment ttydelay (make more positive)
lac d2 lac d2
jms getchar jms getchar " get a character
jmp 2f jmp 2f " none found??
3: 3:
tls tls " start output
sad o12 sad o12 " newline?
jms putcr jms putcr " yes: put CR next
sad o15 sad o15 " CR?
skp skp " yes
jmp ttyrestart i jmp ttyrestart i " no: return
lac ttydelay lac ttydelay " get current tty delay
tad o20 tad o20 " bump by 16
rcr rcr " divide by two
cma cma " complement
dac ttydelay dac ttydelay " save
jmp ttyrestart i jmp ttyrestart i
2: 2:
lac sfiles+1 lac sfiles+1 " run out of characters to send: wake user(s)
jms wakeup jms wakeup
dac sfiles+1 dac sfiles+1
jmp ttyrestart i "** written arrow up 2 copies jmp ttyrestart i "** written arrow up 2 copies
@@ -270,7 +271,7 @@ ttyrestart: 0
lac sfiles+6 lac sfiles+6
jms wakeup jms wakeup
dac sfiles+6 dac sfiles+6
cla cla " clear button lights
wbl wbl
jmp piret "** END CROSSED OUT jmp piret "** END CROSSED OUT
@@ -292,35 +293,42 @@ piret: " return from priority interrupt
ion " reenable interrupts ion " reenable interrupts
jmp 0 i " return from interrupt jmp 0 i " return from interrupt
" wake sleeping processes
" NOTE!! Called from interrupt service, so avoids indirect!!!
" call:
" AC/ sfiles word (bit vector of processes to wake)
" jms wakeup
" AC/ 0 (to store in sfiles word)
wakeup: 0 wakeup: 0
dac 9f+t dac 9f+t " save vector in t0
-mnproc -mnproc
dac 9f+t+1 dac 9f+t+1 " loop count in t1
lac tadu lac tadu " get "tad ulist"
dac 2f dac 2f
lac dacu lac dacu " get "dac ulist"
dac 2f+1 dac 2f+1
1: 1:
lac 9f+t lac 9f+t
ral ral " rotate vector up one
dac 9f+t dac 9f+t
sma sma " high bit set?
jmp 2f+2 jmp 2f+2 " no: skip the fun
lac o700000 lac o700000 " yes: decrement process status (wake)
2: tad .. 2: tad .. " (avoiding indirect)
dac .. dac ..
lac 2b lac 2b " advance tad operand by 4 words
tad d4 tad d4
dac 2b dac 2b
lac 2b+1 lac 2b+1 " advance tad operand by 4 words
tad d4 tad d4
dac 2b+1 dac 2b+1
isz 9f+t+1 isz 9f+t+1 " done?
jmp 1b jmp 1b " no, keep going
cla cla " return zero in AC
jmp wakeup i jmp wakeup i
t = t+2 t = t+2
" call to output CR after LF (NL)
putcr: 0 putcr: 0
lac o15 lac o15
dac nttychar dac nttychar
@@ -347,26 +355,26 @@ intrp1: " here with TTY interrupt character
lac sfiles+1 lac sfiles+1
jms wakeup jms wakeup
dac sfiles+1 dac sfiles+1
jms chkint jms chkint " check if user interrupted
jmp piret jmp piret " no, return from PI
jmp 1f jmp 1f " yes: return from system call
intrp2: intrp2: " here with display interrupt character
lac d7 lac d7
dac .int2 dac .int2
lac d3 lac d3 " drain keyboard buffer?
jms getchar jms getchar
skp skp
jmp .-3 jmp .-3
lac sfiles+2 lac sfiles+2 " wake up any "keyboard" sleepers
jms wakeup jms wakeup
dac sfiles+2 dac sfiles+2
lac sfiles+6 lac sfiles+6 " wake up any "display" sleepers
jms wakeup jms wakeup
dac sfiles+6 dac sfiles+6
jms chkint jms chkint " check if user interrupted
jmp piret jmp piret " no, return from PI
1: 1:
lac 0 lac 0 " get interrupt PC
dac 020 dac 020 " save as system call return PC
lac .ac lac .ac " restore AC from interrupt
jmp 021 jmp 021 " join system call processing!!!
+21 -16
View File
@@ -8,11 +8,10 @@ dspbsz = 270
ndskbs = 4 ndskbs = 4
" flags " flags
" interupt flags
.insys: 0 " "in system" .insys: 0 " "in system"
.int1: 0 " inode for interrupt 1 .int1: 0 " inode for user interrupt 1
.int2: 0 " inode for interrupt 2 .int2: 0 " inode for user interrupt 2
.ac: 0 " saved AC from interrupt .ac: 0 " saved AC from Priotity Interrupt
.savblk: 0 " set by system call, cleared by disk i/o .savblk: 0 " set by system call, cleared by disk i/o
.dsptm: 0 " display restart countdown (10 ticks) .dsptm: 0 " display restart countdown (10 ticks)
.dskb: 0 " set on disk interrupt .dskb: 0 " set on disk interrupt
@@ -107,7 +106,10 @@ q2:
dsploc: .=.+1 dsploc: .=.+1
dsplno: .=.+1 dsplno: .=.+1
dspbuf: dspbuf:
0065057;0147740;0160000 0065057;0147740;0160000 " display commands: see 03-scope.pdf pg 20
" PARAM: clear blink, clear light pen, scale=1, intensity=3
" X-Y: invisible, no delay, Y=01740 (992)
" X-Y: invisible, settling delay, X=0
.=.+30 .=.+30
coldentry: coldentry:
dzm 0100 " not re-entrant dzm 0100 " not re-entrant
@@ -134,13 +136,13 @@ coldentry:
dskbuf = 07700 dskbuf = 07700
dskbs: .=.+65+65+65+65 dskbs: .=.+65+65+65+65
edskbsp: . edskbsp: .
uquant: .=.+1 uquant: .=.+1 " number of ticks user has been running
dspbufp: .=.+1 dspbufp: .=.+1 " pointer to display buffer
pbsflgs: .=.+2 pbsflgs: .=.+2 " buttons on last tick, last button interrupt
mode: .=.+1 mode: .=.+1
nttychar: .=.+1 nttychar: .=.+1 " CR to send next, or zero
npptchar: .=.+1 npptchar: .=.+1
ttydelay: .=.+1 ttydelay: .=.+1 " delay count for TTY output
name: .=.+4 name: .=.+4
lnkaddr: .=.+1 lnkaddr: .=.+1
char: .=.+1 char: .=.+1
@@ -148,6 +150,9 @@ dskaddr: .=.+1
uniqpid: 1 " pid generator uniqpid: 1 " pid generator
lu: .=.+4 " user (process) table entry copy lu: .=.+4 " user (process) table entry copy
sfiles: .=.+10 " wait addresses for special files sfiles: .=.+10 " wait addresses for special files
" (bit vector of waiting processes?)
" offsets: 0: ttyin, 1: ttyout, 2: keyboard,
" 3: ptr, 4: ptp, 6: display
dpdata: dpdata:
dpstat: .=.+1 dpstat: .=.+1
dpread: .=.+1 dpread: .=.+1
@@ -211,21 +216,21 @@ userdata: " "ustruct" (swappable)
ii: .=.+1 " number of i-node in inode: ii: .=.+1 " number of i-node in inode:
inode: " disk inode in memory: inode: " disk inode in memory:
i.flags: .=.+1 " inode flags i.flags: .=.+1 " inode flags
" 400000 free?? (checked/toggled by icreat) " 400000 in use
" 200000 large file " 200000 large file
" 000040 special device (indicated by inum)? " 000040 special device (indicated by inum)
" 000020 directory " 000020 directory
" 000010 owner read " 000010 owner read
" 000004 owner write " 000004 owner write
" 000002 world read " 000002 world read
" 000001 world write " 000001 world write
i.dskps: .=.+7 " disk block pointers (indirect if "large file") i.dskps: .=.+7 " disk block numbers (indirect if "large file")
i.uid: .=.+1 " owner i.uid: .=.+1 " owner
i.nlks: .=.+1 " link count i.nlks: .=.+1 " link count (negative)
i.size: .=.+1 i.size: .=.+1 " size (in words)
i.uniq: .=.+1 " unique number i.uniq: .=.+1 " unique number
.= inode+12 .= inode+12
di: .=.+1 di: .=.+1 " directory index
dnode: " directory entry: dnode: " directory entry:
d.i: .=.+1 " inode number d.i: .=.+1 " inode number
d.name: .=.+4 " name (space padded) d.name: .=.+4 " name (space padded)
+13 -13
View File
@@ -67,9 +67,9 @@ krb = 0700312 " KBD: read buffer
tsf = 0700401 " TTY: skip if flag set tsf = 0700401 " TTY: skip if flag set
tcf = 0700402 " TTY: clear flag tcf = 0700402 " TTY: clear flag
tls = 0700406 " TTY: load buffer, select tls = 0700406 " TTY: load buffer, select
sck = 0704301 " S-2: skip on console keyboard sck = 0704301 " G-2: skip on console keyboard
cck = 0704304 " S-2: clear console keyboard cck = 0704304 " G-2: clear console keyboard
lck = 0704312 " S-2: load console keyboard lck = 0704312 " G-2: load console keyboard
rsf = 0700101 " PTR: skip if flag set rsf = 0700101 " PTR: skip if flag set
rsa = 0700104 " PTR: select alphanumeric mode rsa = 0700104 " PTR: select alphanumeric mode
rrb = 0700112 " PTR: clear flag, or read buffer rrb = 0700112 " PTR: clear flag, or read buffer
@@ -77,16 +77,16 @@ psf = 0700201 " PTP: skip if flag set
pcf = 0700202 " PTP: clear flag pcf = 0700202 " PTP: clear flag
psa = 0700204 " PTP: alphanumeric mode psa = 0700204 " PTP: alphanumeric mode
cdf = 0700501 " ??? cdf = 0700501 " ???
lds = 0701052 " S-2: load display status lds = 0701052 " G-2: load display status
lda = 0701012 " S-2: load display address lda = 0701012 " G-2: load display address
wcga = 0704206 " S-2: ??? wcga = 0704206 " G-2: ???
raef = 0700742 " S-2: resume after edges flag raef = 0700742 " G-2: resume after edges flag
rlpd = 0700723 " S-2: resume after light pen stop, disabled rlpd = 0700723 " G-2: resume after light pen stop, disabled
beg = 0700547 " S-2: begin beg = 0700547 " G-2: begin
spb = 0704401 " S-2: skip on push button flag spb = 0704401 " G-2: skip on push button flag
cpb = 0704404 " S-2: clear push button flag cpb = 0704404 " G-2: clear push button flag
lpb = 0704412 " S-2: load push buttons lpb = 0704412 " G-2: load push buttons
wbl = 0704424 " S-2: write button lights wbl = 0704424 " G-2: write button lights
dprs = 0704752 " dataphone: read status dprs = 0704752 " dataphone: read status
dpsf = 0704741 " dataphone: skip on flag dpsf = 0704741 " dataphone: skip on flag
dpcf = 0704761 " dataphone: clear flag dpcf = 0704761 " dataphone: clear flag