home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-02-03 | 12.4 KB | 1,059 lines |
- / machine language assist
- / for 11/45 or 11/70 CPUs
-
-
- / non-UNIX instructions
- mfpi = 6500^tst
- stst = 170300^tst
- mtpi = 6600^tst
- mfpd = 106500^tst
- mtpd = 106600^tst
- spl = 230
- ldfps = 170100^tst
- stfps = 170200^tst
- wait = 1
- rtt = 6
- reset = 5
-
- .PROFIL = 0
- HIPRI = 340
- HIGH = 7
- .if .PROFIL
- HIGH = 6
- HIPRI = 300
- .endif
-
- / Mag tape dump
- / save registers in low core and
- / write all core onto mag tape.
- / entry is thru 44 abs
-
- .data
- .globl dump
- dump:
-
- / save regs r0,r1,r2,r3,r4,r5,r6,KIA6
- / starting at abs location 4
-
- mov r0,4
- mov $6,r0
- mov r1,(r0)+
- mov r2,(r0)+
- mov r3,(r0)+
- mov r4,(r0)+
- mov r5,(r0)+
- mov sp,(r0)+
- mov KDSA6,(r0)+
-
- / dump all of core (ie to first mt error)
- / onto mag tape. (9 track or 7 track 'binary')
-
- .if HTDUMP
- mov $HTCS1,r0
- mov $40,*$HTCS2
- mov $2300,*$HTTC
- clr *$HTBA
- mov $1,(r0)
- 1:
- mov $-512.,*$HTFC
- mov $-256.,*$HTWC
- movb $61,(r0)
- 2:
- tstb (r0)
- bge 2b
- bit $1,(r0)
- bne 2b
- bit $40000,(r0)
- beq 1b
- mov $27,(r0)
- .endif
- HT = 0172440
- HTCS1 = HT+0
- HTWC = HT+2
- HTBA = HT+4
- HTFC = HT+6
- HTCS2 = HT+10
- HTTC = HT+32
-
- MTC = 172522
- .if TUDUMP
- mov $MTC,r0
- mov $60004,(r0)+
- clr 2(r0)
- 1:
- mov $-512.,(r0)
- inc -(r0)
- 2:
- tstb (r0)
- bge 2b
- tst (r0)+
- bge 1b
- reset
-
- / end of file and loop
-
- mov $60007,-(r0)
- .endif
- br .
-
- .text
- .globl start, _end, _edata, _etext, _main
-
- / 11/45 and 11/70 startup.
- / entry is thru 0 abs.
- / since core is shuffled,
- / this code can be executed but once
-
- start:
- bit $1,SSR0
- beq 1f
- mov $trap,34
- mov $trap,0
- mov $340+15.,2
- bit $20,SSR3
- beq 9f
- mov $70.,_cputype
- mov $3,*$MSCR
- 9:
- clr PS
- br 9f
- 1:
- inc $-1
- bne .
- reset
- / Set loc. 0 to trap to system, in case of
- / hardware glitch
- mov $trap,0 / in case of bad trap through 0
- mov $340+15.,2 / high pri, trap type 15
- clr PS
-
- / set KI0 to physical 0
-
- mov $77406,r3
- mov $KISA0,r0
- mov $KISD0,r1
- clr (r0)+
- mov r3,(r1)+
-
- / set KI1-6 to eventual text resting place
-
- mov $_end+63.,r2
- ash $-6,r2
- bic $!1777,r2
- 1:
- mov r2,(r0)+
- mov r3,(r1)+
- add $200,r2
- cmp r0,$KISA7
- blos 1b
-
- / set KI7 to IO seg for escape
-
- mov $IO,-(r0)
-
- / set KD0-7 to physical
-
- mov $KDSA0,r0
- mov $KDSD0,r1
- clr r2
- 1:
- mov r2,(r0)+
- mov r3,(r1)+
- add $200,r2
- cmp r0,$KDSA7
- blos 1b
-
- / initialization
- / get a temp (1-word) stack
- / turn on segmentation
- / copy text to I space
- / clear bss in D space
-
- mov $stk+2,sp
- mov $65,SSR3 / 22-bit, map, K+U sep
- bit $20,SSR3
- beq 1f
- mov $70.,_cputype
- mov $3,*$MSCR / Disable UNIBUS traps, non-fatal traps
- 1:
- inc SSR0
- mov $_etext+100,r2
- mov $_edata+100,r1
- add $_etext-8192.,r1
- 1:
- mov -(r1),-(sp)
- mtpi -(r2)
- cmp r1,$_edata
- bhi 1b
- 1:
- clr (r1)+
- cmp r1,$_end
- blo 1b
-
- / use KI escape to set KD7 to IO seg
- / set KD6 to first available core
- / If profiling, snag supervisor registers.
-
- mov $IO,-(sp)
- mtpi *$KDSA7
- 9:
- mov $_etext-8192.+63.,r2
- ash $-6,r2
- bic $!1777,r2
- add KISA1,r2
- .if .PROFIL
- mov r2,SISA2
- mov r2,_proloc
- mov $77406,SISD2
- add $200,r2
- mov r2,SISA2+2
- mov $77406,SISD2+2
- add $200,r2
- .endif
- mov r2,KDSA6
-
- / Turn off write permission on kernel text
- / Take stuff above data out of address space
-
- mov $KISD0,r0
- 1:
- mov $77402,(r0)+
- cmp r0,$KISD7
- blos 1b
-
- mov $_end+63.,r0
- ash $-6,r0
- bic $!1777,r0
- mov $KDSD0,r1
- 1:
- cmp r0,$200
- bge 2f
- dec r0
- bge 4f
- clr (r1)
- br 3f
- 4:
- movb r0,1(r1)
- br 3f
- 2:
- movb $177,1(r1)
- 3:
- tst (r1)+
- sub $200,r0
- cmp r1,$KDSD5
- blos 1b
-
- / set up supervisor D registers
-
- 9:
- mov $6,SISD0
- mov $6,SISD1
-
- / set up real sp
- / clear user block
- / test for floating point hardware
-
- mov $_u+[usize*64.],sp
- mov $1f,nofault
- setd / jump to 1f if this traps
- inc fpp
- 1:
- clr nofault
- mov $_u,r0
- 1:
- clr (r0)+
- cmp r0,sp
- blo 1b
- .if .PROFIL
- mov $40000,r0
- mov $10000,PS / prev = super
- 1:
- clr -(sp)
- mtpi (r0)+
- cmp r0,$100000
- blo 1b
- jsr pc,_isprof
- .endif
-
- / set up previous mode and call main
- / on return, enter user mode at 0R
-
- mov $30000,PS
- jsr pc,_main
- mov $170000,-(sp)
- clr -(sp)
- rtt
-
- .globl _rkboot, _rpboot
- _rkboot:
- jmp *$173000
-
- _rpboot:
- jmp *$173006
-
-
- .globl trap, call
- .globl _trap
-
- / all traps and interrupts are
- / vectored thru this routine.
-
- trap:
- mov PS,saveps
- tst nofault
- bne 1f
- mov SSR0,ssr
- mov SSR1,ssr+2
- mov SSR2,ssr+4
- mov $1,SSR0
- jsr r0,call1; jmp _trap
- / no return
- 1:
- mov $1,SSR0
- mov nofault,(sp)
- rtt
- .text
-
- .globl _runrun
- call1:
- mov saveps,-(sp)
- spl 0
- br 1f
-
- call:
- mov PS,-(sp)
- 1:
- mov r1,-(sp)
- mfpd sp
- mov 4(sp),-(sp)
- bic $!37,(sp)
- bit $30000,PS
- beq 1f
- jsr pc,(r0)+
- tstb _runrun
- beq 2f
- mov $12.,(sp) / trap 12 is give up cpu
- jsr pc,_trap
- 2:
- tst (sp)+
- mtpd sp
- br 2f
- 1:
- bis $30000,PS
- jsr pc,(r0)+
- cmp (sp)+,(sp)+
- 2:
- mov (sp)+,r1
- tst (sp)+
- mov (sp)+,r0
- rtt
-
- .globl _savfp
- _savfp:
- tst fpp
- beq 9f / No FP hardware
- mov 2(sp),r1
- stfps (r1)+
- setd
- movf fr0,(r1)+
- movf fr1,(r1)+
- movf fr2,(r1)+
- movf fr3,(r1)+
- movf fr4,fr0
- movf fr0,(r1)+
- movf fr5,fr0
- movf fr0,(r1)+
- 9:
- rts pc
-
- .globl _restfp
- _restfp:
- tst fpp
- beq 9f
- mov 2(sp),r1
- mov r1,r0
- setd
- add $8.+2.,r1
- movf (r1)+,fr1
- movf (r1)+,fr2
- movf (r1)+,fr3
- movf (r1)+,fr0
- movf fr0,fr4
- movf (r1)+,fr0
- movf fr0,fr5
- movf 2(r0),fr0
- ldfps (r0)
- 9:
- rts pc
-
- .globl _stst
- _stst:
- tst fpp
- beq 9f
- stst r0
- mov r0,*2(sp)
- 9:
- rts pc
-
- .globl _addupc
- _addupc:
- mov r2,-(sp)
- mov 6(sp),r2 / base of prof with base,leng,off,scale
- mov 4(sp),r0 / pc
- sub 4(r2),r0 / offset
- clc
- ror r0
- mov 6(r2),r1
- clc
- ror r1
- mul r1,r0 / scale
- ashc $-14.,r0
- inc r1
- bic $1,r1
- cmp r1,2(r2) / length
- bhis 1f
- add (r2),r1 / base
- mov nofault,-(sp)
- mov $2f,nofault
- mfpd (r1)
- add 12.(sp),(sp)
- mtpd (r1)
- br 3f
- 2:
- clr 6(r2)
- 3:
- mov (sp)+,nofault
- 1:
- mov (sp)+,r2
- rts pc
-
- .globl _display
- _display:
- dec dispdly
- bge 2f
- clr dispdly
- mov PS,-(sp)
- mov $HIPRI,PS
- mov CSW,r1
- bit $1,r1
- beq 1f
- bis $30000,PS
- dec r1
- 1:
- jsr pc,fuword
- mov r0,CSW
- mov (sp)+,PS
- cmp r0,$-1
- bne 2f
- mov $120.,dispdly / 2 sec delay after CSW fault
- 2:
- rts pc
-
- .globl _backup
- .globl _regloc
- _backup:
- mov 2(sp),r0
- movb ssr+2,r1
- jsr pc,1f
- movb ssr+3,r1
- jsr pc,1f
- movb _regloc+7,r1
- asl r1
- add r0,r1
- mov ssr+4,(r1)
- clr r0
- 2:
- rts pc
- 1:
- mov r1,-(sp)
- asr (sp)
- asr (sp)
- asr (sp)
- bic $!7,r1
- movb _regloc(r1),r1
- asl r1
- add r0,r1
- sub (sp)+,(r1)
- rts pc
-
-
- .globl _fubyte, _subyte
- .globl _fuword, _suword
- .globl _fuibyte, _suibyte
- .globl _fuiword, _suiword
- _fuibyte:
- mov 2(sp),r1
- bic $1,r1
- jsr pc,giword
- br 2f
-
- _fubyte:
- mov 2(sp),r1
- bic $1,r1
- jsr pc,gword
-
- 2:
- cmp r1,2(sp)
- beq 1f
- swab r0
- 1:
- bic $!377,r0
- rts pc
-
- _suibyte:
- mov 2(sp),r1
- bic $1,r1
- jsr pc,giword
- mov r0,-(sp)
- cmp r1,4(sp)
- beq 1f
- movb 6(sp),1(sp)
- br 2f
- 1:
- movb 6(sp),(sp)
- 2:
- mov (sp)+,r0
- jsr pc,piword
- clr r0
- rts pc
-
- _subyte:
- mov 2(sp),r1
- bic $1,r1
- jsr pc,gword
- mov r0,-(sp)
- cmp r1,4(sp)
- beq 1f
- movb 6(sp),1(sp)
- br 2f
- 1:
- movb 6(sp),(sp)
- 2:
- mov (sp)+,r0
- jsr pc,pword
- clr r0
- rts pc
-
- _fuiword:
- mov 2(sp),r1
- fuiword:
- jsr pc,giword
- rts pc
-
- _fuword:
- mov 2(sp),r1
- fuword:
- jsr pc,gword
- rts pc
-
- giword:
- mov PS,-(sp)
- spl HIGH
- mov nofault,-(sp)
- mov $err,nofault
- mfpi (r1)
- mov (sp)+,r0
- br 1f
-
- gword:
- mov PS,-(sp)
- spl HIGH
- mov nofault,-(sp)
- mov $err,nofault
- mfpd (r1)
- mov (sp)+,r0
- br 1f
-
- _suiword:
- mov 2(sp),r1
- mov 4(sp),r0
- suiword:
- jsr pc,piword
- rts pc
-
- _suword:
- mov 2(sp),r1
- mov 4(sp),r0
- suword:
- jsr pc,pword
- rts pc
-
- piword:
- mov PS,-(sp)
- spl HIGH
- mov nofault,-(sp)
- mov $err,nofault
- mov r0,-(sp)
- mtpi (r1)
- br 1f
-
- pword:
- mov PS,-(sp)
- spl HIGH
- mov nofault,-(sp)
- mov $err,nofault
- mov r0,-(sp)
- mtpd (r1)
- 1:
- mov (sp)+,nofault
- mov (sp)+,PS
- rts pc
-
- err:
- mov (sp)+,nofault
- mov (sp)+,PS
- tst (sp)+
- mov $-1,r0
- rts pc
-
- .globl _copyin, _copyout
- .globl _copyiin, _copyiout
- _copyiin:
- jsr pc,copsu
- 1:
- mfpi (r0)+
- mov (sp)+,(r1)+
- sob r2,1b
- br 2f
-
- _copyin:
- jsr pc,copsu
- 1:
- mfpd (r0)+
- mov (sp)+,(r1)+
- sob r2,1b
- br 2f
-
- _copyiout:
- jsr pc,copsu
- 1:
- mov (r0)+,-(sp)
- mtpi (r1)+
- sob r2,1b
- br 2f
-
- _copyout:
- jsr pc,copsu
- 1:
- mov (r0)+,-(sp)
- mtpd (r1)+
- sob r2,1b
- 2:
- mov (sp)+,nofault
- mov (sp)+,r2
- clr r0
- rts pc
-
- copsu:
- mov (sp)+,r0
- mov r2,-(sp)
- mov nofault,-(sp)
- mov r0,-(sp)
- mov 10(sp),r0
- mov 12(sp),r1
- mov 14(sp),r2
- asr r2
- mov $1f,nofault
- rts pc
-
- 1:
- mov (sp)+,nofault
- mov (sp)+,r2
- mov $-1,r0
- rts pc
-
- .globl _idle, _waitloc
- _idle:
- mov PS,-(sp)
- spl 0
- wait
- waitloc:
- mov (sp)+,PS
- rts pc
-
- .data
- _waitloc:
- waitloc
- .text
-
- .globl _save
- _save:
- mov (sp)+,r1
- mov (sp),r0
- mov r2,(r0)+
- mov r3,(r0)+
- mov r4,(r0)+
- mov r5,(r0)+
- mov sp,(r0)+
- mov r1,(r0)+
- clr r0
- jmp (r1)
-
- .globl _resume
- _resume:
- mov 2(sp),r0 / new process
- mov 4(sp),r1 / new stack
- spl 7
- mov r0,KDSA6 / In new process
- mov (r1)+,r2
- mov (r1)+,r3
- mov (r1)+,r4
- mov (r1)+,r5
- mov (r1)+,sp
- mov $1,r0
- spl 0
- jmp *(r1)+
-
- .globl _spl0, _spl1, _spl4, _spl5, _spl6, _spl7, _splx
- _spl0:
- mov PS,r0
- spl 0
- rts pc
-
- _spl1:
- mov PS,r0
- spl 1
- rts pc
-
- _spl4:
- mov PS,r0
- spl 4
- rts pc
-
- _spl5:
- mov PS,r0
- spl 5
- rts pc
-
- _spl6:
- mov PS,r0
- spl 6
- rts pc
-
- _spl7:
- mov PS,r0
- spl HIGH
- rts pc
-
- _splx:
- mov 2(sp),PS
- rts pc
-
- .globl _copyseg
- _copyseg:
- mov PS,-(sp)
- mov 4(sp),SISA0
- mov 6(sp),SISA1
- mov $10000+HIPRI,PS
- mov r2,-(sp)
- clr r0
- mov $8192.,r1
- mov $32.,r2
- 1:
- mfpd (r0)+
- mtpd (r1)+
- sob r2,1b
- mov (sp)+,r2
- mov (sp)+,PS
- rts pc
-
- .globl _clearseg
- _clearseg:
- mov PS,-(sp)
- mov 4(sp),SISA0
- mov $10000+HIPRI,PS
- clr r0
- mov $32.,r1
- 1:
- clr -(sp)
- mtpd (r0)+
- sob r1,1b
- mov (sp)+,PS
- rts pc
-
- / Long quotient
-
- .globl ldiv
- ldiv:
- jsr r5,csv
- mov 10.(r5),r3
- sxt r4
- bpl 1f
- neg r3
- 1:
- cmp r4,8.(r5)
- bne hardldiv
- mov 6.(r5),r2
- mov 4.(r5),r1
- bge 1f
- neg r1
- neg r2
- sbc r1
- com r4
- 1:
- mov r4,-(sp)
- clr r0
- div r3,r0
- mov r0,r4 /high quotient
- mov r1,r0
- mov r2,r1
- div r3,r0
- bvc 1f
- sub r3,r0 / this is the clever part
- div r3,r0
- tst r1
- sxt r1
- add r1,r0 / cannot overflow!
- 1:
- mov r0,r1
- mov r4,r0
- tst (sp)+
- bpl 9f
- neg r0
- neg r1
- sbc r0
- 9:
- jmp cret
-
- hardldiv:
- 4
-
- / Long remainder
-
- .globl lrem
- lrem:
- jsr r5,csv
- mov 10.(r5),r3
- sxt r4
- bpl 1f
- neg r3
- 1:
- cmp r4,8.(r5)
- bne hardlrem
- mov 6.(r5),r2
- mov 4.(r5),r1
- mov r1,r4
- bge 1f
- neg r1
- neg r2
- sbc r1
- 1:
- clr r0
- div r3,r0
- mov r1,r0
- mov r2,r1
- div r3,r0
- bvc 1f
- sub r3,r0
- div r3,r0
- tst r1
- beq 9f
- add r3,r1
- 1:
- tst r4
- bpl 9f
- neg r1
- 9:
- sxt r0
- jmp cret
-
- / The divisor is known to be >= 2^15. Only 16 cycles are
- / needed to get a remainder.
- hardlrem:
- 4
-
- /.globl lmul
- /lmul:
- / mov r2,-(sp)
- / mov r3,-(sp)
- / mov 8(sp),r2
- / sxt r1
- / sub 6(sp),r1
- / mov 12.(sp),r0
- / sxt r3
- / sub 10.(sp),r3
- / mul r0,r1
- / mul r2,r3
- / add r1,r3
- / mul r2,r0
- / sub r3,r0
- / mov (sp)+,r3
- / mov (sp)+,r2
- / rts pc
-
- .globl csv
- csv:
- mov r5,r0
- mov sp,r5
- mov r4,-(sp)
- mov r3,-(sp)
- mov r2,-(sp)
- jsr pc,(r0)
-
- .globl cret
- cret:
- mov r5,r2
- mov -(r2),r4
- mov -(r2),r3
- mov -(r2),r2
- mov r5,sp
- mov (sp)+,r5
- rts pc
-
- .globl _u
- _u = 140000
- usize = 16.
-
- CSW = 177570
- PS = 177776
- SSR0 = 177572
- SSR1 = 177574
- SSR2 = 177576
- SSR3 = 172516
- KISA0 = 172340
- KISA1 = 172342
- KISA7 = 172356
- KISD0 = 172300
- KISD7 = 172316
- KDSA0 = 172360
- KDSA6 = 172374
- KDSA7 = 172376
- KDSD0 = 172320
- KDSD5 = 172332
- SISA0 = 172240
- SISA1 = 172242
- SISA2 = 172244
- SISD0 = 172200
- SISD1 = 172202
- SISD2 = 172204
- MSCR = 017777746 / 11/70 memory control register
- IO = 177600
-
- SWR = 177570
- .data
- .globl _ka6
- .globl _cputype
-
- _ka6: KDSA6
- _cputype:45.
- stk: 0
-
- .bss
- nofault:.=.+2
- fpp: .=.+2
- ssr: .=.+6
- dispdly:.=.+2
- saveps: .=.+2
-
- .text
- / system profiler
- / Expects to have a KW11-P in addition to the line-frequency
- / clock, and it should be set to BR7.
- / Uses supervisor I space register 2&3 (40000-100000)
- / to maintain the profile.
-
- .if .PROFIL
- CCSB = 172542
- CCSR = 172540
-
- .globl _sprof, _xprobuf, _probsiz, _mode
- _probsiz = 37777
-
- _isprof:
- mov $1f,nofault
- mov $_sprof,104 / interrupt
- mov $340,106 / pri
- mov $100.,CCSB / count set = 100
- mov $113,CCSR / count down, 10kHz, repeat
- 1:
- clr nofault
- rts pc
-
- _sprof:
- mov r0,-(sp)
- mov PS,r0
- ash $-10.,r0
- bic $!14,r0
- add $1,_mode+2(r0)
- adc _mode(r0)
- cmp r0,$14 / user
- beq done
- mov 2(sp),r0 / pc
- asr r0
- asr r0
- bic $140001,r0
- cmp r0,$_probsiz
- blo 1f
- inc _outside
- br done
- 1:
- mov $10340,PS / prev = super
- mfpi 40000(r0)
- inc (sp)
- mtpi 40000(r0)
- bne done
- mov r1,-(sp)
- mov $_xprobuf,r1
- 2:
- cmp (r1)+,r0
- bne 3f
- inc (r1)
- br 4f
- 3:
- tst (r1)+
- bne 2b
- sub $4,r1
- mov r0,(r1)+
- mov $1,(r1)+
- 4:
- mov (sp)+,r1
- done:
- mov (sp)+,r0
- mov $113,CCSR
- rtt
-
- / count subroutine calls during profiling
- / of the system.
-
- .globl mcount, _profcnts, _profsize
-
- .bss
- _profcnts:
- .=.+[6*340.]
-
- .globl countbase
- .data
- countbase:
- _profcnts
- _profsize:
- 340.
- .text
-
- mcount:
- mov (r0),r1
- bne 1f
- mov countbase,r1
- beq 2f
- add $6,countbase
- cmp countbase,$_profcnts+[6*340.]
- blo 3f
- clr countbase
- rts pc
- 3:
- mov (sp),(r1)+
- mov r1,(r0)
- 1:
- inc 2(r1)
- bne 2f
- inc (r1)
- 2:
- rts pc
-
- .bss
- _xprobuf:.=.+512.
- _proloc:.=.+2
- _mode: .=.+16.
- _outside: .=.+2
-
- .endif
-