📄 l.s
字号:
/* * Memory and machine-specific definitions. Used in C and assembler. *//* * Sizes */#define BI2BY 8 /* bits per byte */#define BI2WD 32 /* bits per word */#define BY2WD 4 /* bytes per word */#define BY2PG 8192 /* bytes per page */#define WD2PG (BY2PG/BY2WD) /* words per page */#define PGSHIFT 13 /* log(BY2PG) */#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1))#define ICACHESIZE 0#define MB4 (4*1024*1024) /* Lots of things are 4Mb in size */#define MAXMACH 1 /* max # cpus system can run *//* * Time */#define HZ (60) /* clock frequency */#define MS2HZ (1000/HZ) /* millisec per clock tick */#define TK2SEC(t) ((t)/HZ) /* ticks to seconds */#define TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */#define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks *//* * SR bits */#define SUPER 0x2000#define SPL(n) (n<<8)/* * CACR */#define CCLEAR 0x08#define CENABLE 0x01/* * Magic registers (unused in current system) */#define MACH A5 /* A5 is m-> */#define USER A4 /* A4 is u-> *//* * Fundamental addresses */#define USERADDR 0x80000000/* assuming we're in a syscall, this is the address of the Ureg structure */#define UREGVARSZ (23*BY2WD) /* size of variable part of Ureg */#define UREGADDR (USERADDR+BY2PG-(UREGVARSZ+2+4+2+(8+8+1+1)*BY2WD))/* * Devices poked during bootstrap */#define TACADDR 0x40600000#define MOUSE 0x40200000/* * MMU */#define VAMASK 0xCFFFFFFF /* clear balu bits in address */#define KUSEG 0x00000000#define KSEG 0x80000000/* * MMU entries */#define PTEVALID (1<<13)#define PTEWRITE 0#define PTERONLY (1<<14)#define PTEKERNEL (1<<15)#define PTEUNCACHED 0#define INVALIDPTE 0#define PTEMAPMEM (1024*1024) #define PTEPERTAB (PTEMAPMEM/BY2PG)#define SEGMAPSIZE 16#define PPN(pa) ((pa>>13)&0x1FFF)#define KMAP ((unsigned long *)0xD0000000)#define UMAP ((unsigned long *)0x50000000)/* * Virtual addresses */#define VTAG(va) ((va>>22)&0x03F)#define VPN(va) ((va>>13)&0x1FF)#define PARAM ((char*)0x40500000)#define TLBFLUSH_ 0x01/* * Address spaces */#define UZERO KUSEG /* base of user address space */#define UTZERO (UZERO+BY2PG) /* first address in user text */#define TSTKTOP 0x10000000 /* end of new stack in sysexec */#define TSTKSIZ 100#define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */#define KZERO KSEG /* base of kernel address space */#define KTZERO (KZERO+BY2PG) /* first address in kernel text */#define USTKSIZE (4*1024*1024) /* size of user stack */#define MACHSIZE 4096#define isphys(p) ((((ulong)(p))&0xF0000000) == KSEG)#define DBMAGIC 0xBADC0C0A/* * Boot first processor */TEXT start(SB), $-4 MOVW $(SUPER|SPL(7)), SR MOVL $a6base(SB), A6 MOVL $0, R0 MOVL R0, CACR MOVL R0, TACADDR /* zero tac counter (cause an intr?) */ MOVL $mach0(SB), A0 MOVL A0, m(SB) MOVL $0, 0(A0) MOVL A0, A7 ADDL $(MACHSIZE-4), A7 /* start stack under machine struct */ MOVL $0, u(SB) MOVL $vectors(SB), A0 MOVL A0, VBR BSR main(SB) /* never returns */dead: BRA dead/* * Take first processor into user mode. Leave enough room on the stack * for a full-sized Ureg (including long bus error format) to fit */TEXT touser(SB), $-4 MOVL $(USERADDR+BY2PG-UREGVARSZ), A7 MOVW $0, -(A7) MOVL $(UTZERO+32), -(A7) /* header is in text */ MOVW $0, -(A7) MOVL $(USTKTOP-6*BY2WD), A0 /* MAXSYSARG=6 */ MOVL A0, USP MOVW $(SUPER|SPL(0)), SR MOVL $8, R0 MOVL R0, CACR RTETEXT firmware(SB), $0 MOVL $0x40000090, A0 JMP (A0)TEXT splhi(SB), $0 MOVL m(SB), A0 MOVL (A7), 4(A0) MOVL $0, R0 MOVW SR, R0 MOVW $(SUPER|SPL(7)), SR RTSTEXT splduart(SB), $0 MOVL $0, R0 MOVW SR, R0 MOVW $(SUPER|SPL(5)), SR RTSTEXT spllo(SB), $0 MOVL $0, R0 MOVW SR, R0 MOVW $(SUPER|SPL(0)), SR RTSTEXT splx(SB), $0 MOVL sr+0(FP), R0 MOVW R0, SR RTSTEXT spldone(SB), $0 RTSTEXT spl1(SB), $0 MOVL $0, R0 MOVW SR, R0 MOVW $(SUPER|SPL(1)), SR RTSTEXT flushcpucache(SB), $0 MOVL $(CCLEAR|CENABLE), R0 MOVL R0, CACR RTSTEXT cacrtrap(SB), $0 /* user entry point to control cache, e.g. flush */ MOVL R0, CACR RTETEXT setlabel(SB), $0 MOVL sr+0(FP), A0 MOVL A7, (A0)+ /* stack pointer */ MOVL (A7), (A0)+ /* pc of caller */ MOVW SR, (A0)+ /* status register */ CLRL R0 /* ret 0 => not returning */ RTSTEXT gotolabel(SB), $0 MOVL p+0(FP), A0 MOVW $(SUPER|SPL(7)), SR MOVL (A0)+, A7 /* stack pointer */ MOVL (A0)+, (A7) /* pc; stuff into stack frame */ MOVW (A0)+, R0 /* status register */ MOVW R0, SR MOVL $1, R0 /* ret 1 => returning */ RTS/* * Test and set, as a subroutine */TEXT tas(SB), $0 MOVL $0, R0 MOVL a+0(FP), A0 TAS (A0) BEQ tas_1 MOVL $1, R0tas_1: RTS/* * Floating point */TEXT fpsave(SB), $0 FSAVE (fp+0(FP)) RTSTEXT fprestore(SB), $0 FRESTORE (fp+0(FP)) RTSTEXT fpregsave(SB), $0 FMOVEM $0xFF, (3*4)(fr+0(FP)) FMOVEMC $0x7, (fr+0(FP)) RTSTEXT fpregrestore(SB), $0 FMOVEMC (fr+0(FP)), $0x7 FMOVEM (3*4)(fr+0(FP)), $0xFF RTSTEXT fpcr(SB), $0 MOVL new+0(FP), R1 MOVL FPCR, R0 MOVL R1, FPCR RTSTEXT rfnote(SB), $0 MOVL uregp+0(FP), A7 MOVL ((8+8)*BY2WD)(A7), A0 MOVL A0, USP MOVEM (A7), $0x7FFF ADDL $((8+8+1+1)*BY2WD), A7 RTETEXT illegal(SB), $0 MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVEM $0x7FFF, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) MOVL A7, -(A7) BSR trap(SB) ADDL $4, A7 MOVL ((8+8)*BY2WD)(A7), A0 MOVL A0, USP MOVEM (A7), $0x7FFF ADDL $((8+8+1)*BY2WD+BY2WD), A7 RTETEXT systrap(SB), $0 MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVL A6, ((8+6)*BY2WD)(A7) MOVL R0, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) MOVL A7, -(A7) BSR syscall(SB) MOVL ((1+8+8)*BY2WD)(A7), A0 MOVL A0, USP MOVL ((1+8+6)*BY2WD)(A7), A6 ADDL $((1+8+8+1)*BY2WD+BY2WD), A7 RTETEXT buserror(SB), $0 MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVEM $0x7FFF, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) PEA ((8+8+1+3)*BY2WD)(A7) PEA 4(A7) BSR fault68020(SB) ADDL $8, A7 MOVL ((8+8)*BY2WD)(A7), A0 MOVL A0, USP MOVEM (A7), $0x7FFF ADDL $((8+8+1)*BY2WD+BY2WD), A7 RTETEXT tacintr(SB), $0 /* level 1 */ MOVL R0, -(A7) MOVL TACADDR, R0 MOVL (A7)+, R0 RTETEXT portintr(SB), $0 /* level 2 */ MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVEM $0x7FFF, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) MOVL A7, -(A7) BSR devportintr(SB) BRA retintrTEXT dkintr(SB), $0 /* level 3 */ MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVEM $0x7FFF, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) MOVL A7, -(A7) BSR inconintr(SB) BRA retintrTEXT mouseintr(SB), $0 /* level 4 */ MOVEM $0x80C2, -(A7) /* D0, A0, A1, A6 */ MOVL $a6base(SB), A6 MOVL $15, R0 /* mask off hex switch */ ANDB MOUSE,R0 /* clears quadrature interrupt */ LEA mousetab(SB)(R0.W*8), A0 LEA mouse(SB), A1 MOVL (A0)+, R0 ADDL R0, (A1)+ /* dx */ MOVL (A0), R0 ADDL R0, (A1)+ /* dy */ ADDL $1, (A1) /* track */ MOVEM (A7)+, $0x4301 RTETEXT uartintr(SB), $0 /* level 5 */ MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVEM $0x7FFF, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) MOVL A7, -(A7) BSR duartintr(SB) BRA retintrTEXT syncintr(SB), $0 /* level 6 */ MOVL $DBMAGIC, -(A7) SUBL $((8+8+1)*BY2WD), A7 MOVEM $0x7FFF, (A7) MOVL $a6base(SB), A6 MOVL USP, A0 MOVL A0, ((8+8)*BY2WD)(A7) MOVL A7, -(A7) BSR clock(SB) /* fall through */retintr: BSR mousetry(SB) ADDL $4, A7 MOVL ((8+8)*BY2WD)(A7), A0 MOVL A0, USP MOVEM (A7), $0x7FFF ADDL $((8+8+1)*BY2WD+BY2WD), A7 RTEGLOBL duarttimer+0(SB),$4TEXT duartreadtimer+0(SB), $0 MOVW SR, R1 /* spl7() */ MOVW $0x2700, SR MOVL $0x40100000, A0 CLRL R0 TSTB 15(A0) /* stop timer */ MOVW 6(A0), R0 /* read hi,lo */ TSTB 14(A0) /* restart timer */ NOTW R0 /* timer counts down from 0xffff */ ADDL duarttimer(SB), R0 MOVL R0, duarttimer(SB) MOVW R1, SR RTSGLOBL mousetab(SB), $128DATA mousetab+ 0(SB)/4, -1 /* x down, */DATA mousetab+ 4(SB)/4, 1 /* y up */DATA mousetab+ 8(SB)/4, 0 /* x - */DATA mousetab+ 12(SB)/4, 1 /* y up */DATA mousetab+ 16(SB)/4, 1 /* x up */DATA mousetab+ 20(SB)/4, 1 /* y up */DATA mousetab+ 24(SB)/4, 0 /* x - */DATA mousetab+ 28(SB)/4, 1 /* y up */DATA mousetab+ 32(SB)/4, -1 /* x down */DATA mousetab+ 36(SB)/4, 0 /* y - */DATA mousetab+ 40(SB)/4, 0 /* x - */DATA mousetab+ 44(SB)/4, 0 /* y - */DATA mousetab+ 48(SB)/4, 1 /* x up, */DATA mousetab+ 52(SB)/4, 0 /* y - */DATA mousetab+ 56(SB)/4, 0 /* x - */DATA mousetab+ 60(SB)/4, 0 /* y - */DATA mousetab+ 64(SB)/4, -1 /* x down */DATA mousetab+ 68(SB)/4, -1 /* y down */DATA mousetab+ 72(SB)/4, 0 /* x - */DATA mousetab+ 76(SB)/4, -1 /* y down */DATA mousetab+ 80(SB)/4, 1 /* x up */DATA mousetab+ 84(SB)/4, -1 /* y down */DATA mousetab+ 88(SB)/4, 0 /* x - */DATA mousetab+ 92(SB)/4, -1 /* y down */DATA mousetab+ 96(SB)/4, -1 /* x down */DATA mousetab+100(SB)/4, 0 /* y - */DATA mousetab+104(SB)/4, 0 /* x - */DATA mousetab+108(SB)/4, 0 /* y - */DATA mousetab+112(SB)/4, 1 /* x up */DATA mousetab+116(SB)/4, 0 /* y - */DATA mousetab+120(SB)/4, 0 /* x - */DATA mousetab+124(SB)/4, 0 /* y - */GLOBL mach0+0(SB), $MACHSIZEGLOBL u(SB), $4GLOBL m(SB), $4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -