?? m40.s
字號:
/ machine language assist/ for 11/40/ non-UNIX instructionsmfpi = 6500^tstmtpi = 6600^tsthalt = 0wait = 1reset = 5rtt = 6.globl start, _end, _edata, _main, dumpdump:start: mov $trap,34/ Set location 0 and 2 to catch traps and jumps to 0 mov $42,0 / illegal instruction if jump mov $777,2 / trace trap at high priority if trap/ initialize systems segments mov $KISA0,r0 mov $KISD0,r1 mov $200,r4 clr r2 mov $6,r31: mov r2,(r0)+ mov $77406,(r1)+ / 4k rw add r4,r2 sob r3,1b/ initialize user segment mov $_end+63.,r2 ash $-6,r2 bic $!1777,r2 mov r2,(r0)+ / ksr6 = sysu mov $usize-1\<8|6,(r1)+/ initialize io segment/ set up counts on supervisor segments mov $IO,(r0)+ mov $77406,(r1)+ / rw 4k/ get a sp and start segmentation mov $_u+[usize*64.],sp inc SSR0/ test for floating point mov $1f,nofault setd / jumps to 1f if no fpu inc fpp1: clr nofault/ clear bss mov $_edata,r01: clr (r0)+ cmp r0,$_end blo 1b/ clear user block mov $_u,r01: clr (r0)+ cmp r0,$_u+[usize*64.] blo 1b/ 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 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 SSR2,ssr+4 mov $1,SSR0 jsr r0,call1; jmp _trap / no return1: mov $1,SSR0 mov nofault,(sp) rtt.text.globl _runruncall1: mov saveps,-(sp) bic $HIPRI,PS br 1fcall: mov PS,-(sp)1: mov r1,-(sp) mfpi 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,_trap2: tst (sp)+ mtpi sp br 2f1: 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 8f 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)+8: rts pc.globl _restfp_restfp: tst fpp beq 8f 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)8: 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 mfpi (r1) add 12.(sp),(sp) mtpi (r1) br 3f2: clr 6(r2)3: mov (sp)+,nofault1: mov (sp)+,r2 rts pc.globl _display_display: rts pc/ Character list get/put/.globl _getc, _putc/.globl _cfreelist//_getc:/ mov 2(sp),r1/ mov PS,-(sp)/ mov r2,-(sp)/ bis $HIPRI,PS/ bic $40,PS/ mov 2(r1),r2 / first ptr/ beq 9f / empty/ movb (r2)+,r0 / character/ bic $!377,r0/ mov r2,2(r1)/ dec (r1)+ / count/ bne 1f/ clr (r1)+/ clr (r1)+ / last block/ br 2f/1:/ bit $7,r2/ bne 3f/ mov -10(r2),(r1) / next block/ add $2,(r1)/2:/ dec r2/ bic $7,r2/ mov _cfreelist,(r2)/ mov r2,_cfreelist/3:/ mov (sp)+,r2/ mov (sp)+,PS/ rts pc/9:/ clr 4(r1)/ mov $-1,r0/ mov (sp)+,r2/ mov (sp)+,PS/ rts pc//_putc:/ mov 2(sp),r0/ mov 4(sp),r1/ mov PS,-(sp)/ mov r2,-(sp)/ mov r3,-(sp)/ bis $HIPRI,PS/ bic $40,PS/ mov 4(r1),r2 / last ptr/ bne 1f/ mov _cfreelist,r2/ beq 9f/ mov (r2),_cfreelist/ clr (r2)+/ mov r2,2(r1) / first ptr/ br 2f/1:/ bit $7,r2/ bne 2f/ mov _cfreelist,r3/ beq 9f/ mov (r3),_cfreelist/ mov r3,-10(r2)/ mov r3,r2/ clr (r2)+/2:/ movb r0,(r2)+/ mov r2,4(r1)/ inc (r1) / count/ clr r0/ mov (sp)+,r3/ mov (sp)+,r2/ mov (sp)+,PS/ rts pc/9:/ mov pc,r0/ mov (sp)+,r3/ mov (sp)+,r2/ mov (sp)+,PS/ rts pc.globl _backup.globl _regloc_backup: mov 2(sp),ssr+2 mov r2,-(sp) jsr pc,backup mov r2,ssr+2 mov (sp)+,r2 movb jflg,r0 bne 2f 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 r02: rts pc1: 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/ hard part/ simulate the ssr2 register missing on 11/40backup: clr r2 / backup register ssr1 mov $1,bflg / clrs jflg mov ssr+4,r0 jsr pc,fetch mov r0,r1 ash $-11.,r0 bic $!36,r0 jmp *0f(r0)0: t00; t01; t02; t03; t04; t05; t06; t07 t10; t11; t12; t13; t14; t15; t16; t17t00: clrb bflgt10: mov r1,r0 swab r0 bic $!16,r0 jmp *0f(r0)0: u0; u1; u2; u3; u4; u5; u6; u7u6: / single op, m[tf]pi, sxt, illegal bit $400,r1 beq u5 / all but m[tf], sxt bit $200,r1 beq 1f / mfpi bit $100,r1 bne u5 / sxt/ simulate mtpi with double (sp)+,dd bic $4000,r1 / turn instr into (sp)+ br t01/ simulate mfpi with double ss,-(sp)1: ash $6,r1 bis $46,r1 / -(sp) br t01u4: / jsr mov r1,r0 jsr pc,setreg / assume no fault bis $173000,r2 / -2 from sp rts pct07: / EIS clrb bflgu0: / jmp, swabu5: / single opf5: / movei, movfiff1: / ldfpsff2: / stfpsff3: / stst mov r1,r0 br setregt01: / movt02: / cmpt03: / bitt04: / bict05: / bist06: / addt16: / sub clrb bflgt11: / movbt12: / cmpbt13: / bitbt14: / bicbt15: / bisb mov r1,r0 ash $-6,r0 jsr pc,setreg swab r2 mov r1,r0 jsr pc,setreg/ if delta(dest) is zero,/ no need to fetch source bit $370,r2 beq 1f/ if mode(source) is R,/ no fault is possible bit $7000,r1 beq 1f/ if reg(source) is reg(dest),/ too bad. mov r2,-(sp) bic $174370,(sp) cmpb 1(sp),(sp)+ beq u7/ start source cycle/ pick up value of reg mov r1,r0 ash $-6,r0 bic $!7,r0 movb _regloc(r0),r0 asl r0 add ssr+2,r0 mov (r0),r0/ if reg has been incremented,/ must decrement it before fetch bit $174000,r2 ble 2f dec r0 bit $10000,r2 beq 2f dec r02:/ if mode is 6,7 fetch and add X(R) to R bit $4000,r1 beq 2f bit $2000,r1 beq 2f mov r0,-(sp) mov ssr+4,r0 add $2,r0 jsr pc,fetch add (sp)+,r02:/ fetch operand/ if mode is 3,5,7 fetch * jsr pc,fetch bit $1000,r1 beq 1f bit $6000,r1 bne fetch1: rts pct17: / floating point instructions clrb bflg mov r1,r0 swab r0 bic $!16,r0 jmp *0f(r0)0: f0; f1; f2; f3; f4; f5; f6; f7f0: mov r1,r0 ash $-5,r0 bic $!16,r0 jmp *0f(r0)0: ff0; ff1; ff2; ff3; ff4; ff5; ff6; ff7f1: / mulf, modff2: / addf, movff3: / subf, cmpff4: / movf, divfff4: / clrfff5: / tstfff6: / absfff7: / negf inc fflg mov r1,r0 br setregf6: bit $400,r1 beq f1 / movfo br f5 / movief7: bit $400,r1 beq f5 / movif br f1 / movofff0: / cfcc, setf, setd, seti, setlu1: / bru2: / bru3: / bru7: / illegal incb jflg rts pcsetreg: mov r0,-(sp) bic $!7,r0 bis r0,r2 mov (sp)+,r0 ash $-3,r0 bic $!7,r0 movb 0f(r0),r0 tstb bflg beq 1f bit $2,r2 beq 2f bit $4,r2 beq 2f1: cmp r0,$20 beq 2f cmp r0,$-20 beq 2f asl r02: tstb fflg beq 3f asl r0 stfps r1 bit $200,r1 beq 3f asl r03: bisb r0,r2 rts pc0: .byte 0,0,10,20,-10,-20,0,0fetch: bic $1,r0 mov nofault,-(sp) mov $1f,nofault mfpi (r0) mov (sp)+,r0 mov (sp)+,nofault rts pc1: mov (sp)+,nofault clrb r2 / clear out dest on fault mov $-1,r0 rts pc.bssbflg: .=.+1jflg: .=.+1fflg: .=.+1.text.text.globl _fubyte, _subyte.globl _fuibyte, _suibyte.globl _fuword, _suword.globl _fuiword, _suiword_fuibyte:_fubyte: mov 2(sp),r1 bic $1,r1 jsr pc,gword cmp r1,2(sp) beq 1f swab r01: bic $!377,r0 rts pc_suibyte:_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 2f1: movb 6(sp),(sp)2: mov (sp)+,r0 jsr pc,pword clr r0 rts pc_fuiword:_fuword: mov 2(sp),r1fuword: jsr pc,gword rts pcgword: mov PS,-(sp) bis $HIPRI,PS mov nofault,-(sp) mov $err,nofault mfpi (r1) mov (sp)+,r0 br 1f_suiword:_suword: mov 2(sp),r1 mov 4(sp),r0suword: jsr pc,pword rts pcpword: mov PS,-(sp) bis $HIPRI,PS mov nofault,-(sp) mov $err,nofault mov r0,-(sp) mtpi (r1)1: mov (sp)+,nofault mov (sp)+,PS rts pcerr: mov (sp)+,nofault mov (sp)+,PS tst (sp)+ mov $-1,r0 rts pc rts pc.globl _copyin, _copyout.globl _copyiin, _copyiout_copyiin:_copyin: jsr pc,copsu1: mfpi (r0)+ mov (sp)+,(r1)+ sob r2,1b br 2f_copyiout:_copyout: jsr pc,copsu1: mov (r0)+,-(sp) mtpi (r1)+ sob r2,1b2: mov (sp)+,nofault mov (sp)+,r2 clr r0 rts pccopsu: 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 pc1: mov (sp)+,nofault mov (sp)+,r2 mov $-1,r0 rts pc.globl _idle, _waitloc_idle: mov PS,-(sp) bic $HIPRI,PS waitwaitloc: 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 bis $HIPRI,PS mov r0,KISA6 / In new process mov (r1)+,r2 mov (r1)+,r3 mov (r1)+,r4 mov (r1)+,r5 mov (r1)+,sp mov $1,r0 bic $HIPRI,PS jmp *(r1)+.globl _spl0, _spl1, _spl4, _spl5, _spl6, _spl7, _splx_spl0: mov PS,r0 bic $HIPRI,PS rts pc_spl1: mov PS,r0 bis $HIPRI,PS bic $300,PS rts pc_spl4: mov PS,r0 bis $HIPRI,PS bic $140,PS rts pc_spl5: mov PS,r0 bis $HIPRI,PS bic $100,PS rts pc_spl6: mov PS,r0 bis $HIPRI,PS bic $40,PS rts pc_spl7: mov PS,r0 bis $HIPRI,PS rts pc_splx: mov 2(sp),PS rts pc.globl _copyseg_copyseg: mov PS,-(sp) mov UISA0,-(sp) mov UISA1,-(sp) mov $30340,PS mov 10(sp),UISA0 mov 12(sp),UISA1 mov UISD0,-(sp) mov UISD1,-(sp) mov $6,UISD0 mov $6,UISD1 mov r2,-(sp) clr r0 mov $8192.,r1 mov $32.,r21: mfpi (r0)+ mtpi (r1)+ sob r2,1b mov (sp)+,r2 mov (sp)+,UISD1 mov (sp)+,UISD0 mov (sp)+,UISA1 mov (sp)+,UISA0 mov (sp)+,PS rts pc.globl _clearseg_clearseg: mov PS,-(sp) mov UISA0,-(sp) mov $30340,PS mov 6(sp),UISA0 mov UISD0,-(sp) mov $6,UISD0 clr r0 mov $32.,r11: clr -(sp) mtpi (r0)+ sob r1,1b mov (sp)+,UISD0 mov (sp)+,UISA0 mov (sp)+,PS rts pc.globl _piget, _piput_piget: mov PS,-(sp) jsr pc,2f mfpi (r0) mov (sp)+,r01: mov (sp)+,PS rts pc_piput: mov PS,-(sp) jsr pc,2f mov 10(sp),r1 mov r1,-(sp) mtpi (r0) br 1b2: mov 6(sp),r0 mov 10(sp),r1 ashc $-6,r0 mov HIPRI,PS mov r1,KISA7 mov 10(sp),r0 bic $!77,r0 bis $160000,r0 rts pc/ Long quotient .globl ldivldiv: jsr r5,csv mov 10.(r5),r3 sxt r4 bpl 1f neg r31: cmp r4,8.(r5) bne hardldiv mov 6.(r5),r2 mov 4.(r5),r1 bge 1f neg r1 neg r2 sbc r1 com r41: 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 r09: jmp crethardldiv: 4/ Long remainder .globl lremlrem: jsr r5,csv mov 10.(r5),r3 sxt r4 bpl 1f neg r31: cmp r4,8.(r5) bne hardlrem mov 6.(r5),r2 mov 4.(r5),r1 mov r1,r4 bge 1f neg r1 neg r2 sbc r11: 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,r11: tst r4 bpl 9f neg r19: sxt r0 jmp cret/ The divisor is known to be >= 2^15. Only 16 cycles are/ needed to get a remainder.hardlrem: 4.globl csvcsv: mov r5,r0 mov sp,r5 mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) jsr pc,(r0).globl cretcret: mov r5,r2 mov -(r2),r4 mov -(r2),r3 mov -(r2),r2 mov r5,sp mov (sp)+,r5 rts pc.globl _u_u = 140000usize = 16.HIPRI = 340PS = 177776SSR0 = 177572SSR2 = 177576KISA0 = 172340KISA6 = 172354KISA7 = 172356KISD0 = 172300MTC = 172522TUC = 172440UISA0 = 177640UISA1 = 177642UISD0 = 177600UISD1 = 177602IO = 7600.data.globl _ka6.globl _cputype_ka6: KISA6_cputype:40.stk: 0.bssnofault:.=.+2ssr: .=.+6saveps: .=.+2power: .=.+2fpp: .=.+2.globl _stst.text.globl _stststst = 170300^tst_stst: tst fpp beq 9f stst r0 mov r0,*2(sp)9: rts pc
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -