|
|
DataMuseum.dkPresents historical artifacts from the history of: Bogika Butler |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Bogika Butler Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13184 (0x3380)
Types: TextFile
Names: »ENTER.S«, »ENTER.SA«
└─⟦08e5746f0⟧ Bits:30009789/_.ft.Ibm2.50007359.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »ENTER.S«
└─⟦1ed910a99⟧ Bits:30009789/_.ft.Ibm2.50006596.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »ENTER.SA«
└─⟦798d317aa⟧ Bits:30009789/_.ft.Ibm2.50006626.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦798d317aa⟧ Bits:30009789/_.ft.Ibm2.50006628.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »ENTER.SA«
└─⟦8592db80f⟧ Bits:30009789/_.ft.Ibm2.50007350.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »ENTER.S«
***********************************************************************
* Copyright 1984 by *
* NCR Corporation *
* Dayton, Ohio U.S.A. *
* All Rights Reserved *
***********************************************************************
* EOS Software produced by: *
* NCR Systems Engineering - Copenhagen *
* Copenhagen *
* DENMARK *
***********************************************************************
ENTER IDNT 1,0 KERNEL "BACKEND"
OPT FRS
NOLIST
INCLUDE COMDEF.SA
LIST
* WRITTEN BY VILHELM ROSENQVIST
*
* CONTAINS THE LAST PART OF THE INITIALIZATION;
*
* USED FOR COMPUTING FREE MEMORY:
XREF.S KV_FRMEM,F_ALLOC,L_ALLOC VARIABLES OF MMPROC
XREF MR_FRE,MR_SIZ OFFSETS DEFINED IN MMPROC
* USED FOR SETTING UP THE BOOT PROCESS:
XREF I_CONFIG PARAMETER IN THE INITIAL CALL OF THE STUB
XREF MM_CRE,DECLBOOT,INT_CTX,START_PROC,STOP_PROC,EOSBEGIN
XREF GETSTUBO,CRE_CTX,SET_FP,RUNNING,GETSTUBE,CHAINOWN
XREF TINTRUPT INTERRUPT PROCEDURE FOR TIMER CHIP
XREF KV_INVEC,STAK_TAB,DRIV_TAB
XDEF TOP_KNEL,FIRST_OS,I_ENTER,TOP_RUNK
SECTION.S 7 = KERNEL VARIABLES
* NO KERNEL VARIABLES ARE DEFINED BY "ENTER"
DS.W 1 DUMMY, TO AVOID EMPTY SECTION
TOP_VAR EQU * TOP OF RAM AREA HOLDING KERNEL VARIABLES.
DS.W 1 DUMMY
*
SECTION 11 = INITIALIZE
I_ENTER EQU *
*
*
* 1) CREATE THE BOOT PROCESS AND AN INITIAL CONTEXT IN THE STUB OBJECT
* 2) START THE CLOCK
* 3) COMPUTE FREE MEMORY
* 4) ENTER THE STUB CONTEXT
* 5) ENSURE PROPER FORMAT OF BOOT FILE (ASSEMBLER DIRECTIVES)
PAGE
* CREATE THE BOOT PROCESS AND ENTER THE STUB.
* THE CALL STACK REQUIREMENT OF THE STUB IS PRESENT ON THE STACK.
* ROOM FOR THE PROCESS DESCRIPTION AND THE INITIAL CONTEXT MUST BE ADDED
* TEMP POINTERS AND TEMP DATA IS PART OF THE INITIAL CONTEXT
* NO FORMAL POINTERS ARE PRESENT
BSR.L GETSTUBO A0:= STUB OBJECT
MOVEM.L (A7)+,D0/D1 D0:=KNEL BYTES, D1:=USER_BYTES
ADD.L GE_TEMD(A0),D1 USER_BYTES:=...+ #BYTES IN TEMP STACK;
ADD.L #255,D1 D1:=ROUND UP
CLR.B D1 THE USER BYTES
ADD.L #(PR_SIZ+SP_SIZ+CT_SIZ+SE_SIZ+1),D0 ROUND UP D0
BCLR.L #0,D0 D0:=EVEN D0
ADD.L #255,D0 ROUND UP TO INTEGRAL #PAGES
CLR.B D0 NICE DURING RELOCATION TEST
MOVEQ.L #PT_SIZ,D3 D3.L:= POINTER SPACE:= POINTER_SIZE
MULU.W GE_TEMP(A0),D3 * #TEMP_POINTER IN CTX;
ADD.L D3,D0 KNEL BYTES:=...+ POINTER SPACE;
LSL.L #2,D0 BOOTPROCSIZE:= (CTX_STK+CALL_STK)*4;
LSL.L #2,D1 "TO BE CHANGED WHEN WE KNOW BETTER"
PRT_REG BOOT_SIZ_D0/D1 ********
BSR.L MM_CRE CREATE OPEN (A0:=OBJECT,A1:=USER PART,..
IF <EQ> THEN.S IF NO RESOURCES THEN
ERROR 31 ERROR(31)
ENDI ENDI;
*
* THE BOOTPROC IS OWNED BY LOCAL-10 OF THE STUB OBJECT
BSR.L GETSTUBE A3:=STUB ENVELOPE
MOVE.W #EN_SIZ+9*PT_SIZ,D3 D3:=OFFSET TO LOCAL-10 OF THE ENVELOPE
BSR.L CHAINOWN (A3,D3) OWNS OBJECT OF A0; A2:=(A3,D3)
MOVE.L A0,A3 A3:=OBJECT;
BSR.L DECLBOOT DECLBOOT(A3=DORMANT PROCESS,....
* CREATE INITIAL CONTEXT EXECUTING THE STUB OBJECT
* NO FORMAL POINTERS ARE PRESENT
* THE VALUE OF I_CONFIG (DEFINED IN THE PREFACE) IS AN
* INTEGER VALUE PARAMETER TO THE STUB CONTEXT.
* IT IS STORED INSIDE THE USER STACK TO SIMULATE A VALUE DATA SEGMENT.
*
LEA INT_CTX,A2 A2:=PSEUDO CTX HOLDING SPEEDUP INF
BSR.L GETSTUBO A0:=STUB OBJECT
PRT_MEM FINAL_STUB,(A0),GE_SIZ+EN_SIZ+10*PT_SIZ+SP_SIZ ********
MOVE.L A0,A5 A5:=STUB OBJECT
MOVE.L A3,A0 A0:=PROCESS
MOVE.B #OB_PROB,OB_KIN(A0) PROC.KIND:=RUNNING PROCESS
CLR.L D3 D3:=EXTRA FORMALS:=0;
LEA VOIDARG,A4 A4:=
MOVE.L A4,D4 D4:=LOW_ARG:=
SUB.L #AR_SIZ,D4 VOIDARG-ARG_SIZE;
BSR.L CRE_CTX CREATE_CTX(A3:=CTX,D4:=ENTRY ADDRESS,...)
MOVE.L D4,CT_WRK-4(A3) PUSH ENTRY ADDR AS PC OF NEW CTX
LEA -12(A7),A7 PUSH ROOM FOR RETURN VALUES FROM SET_FP
BSR.L SET_FP SET_FP(....
PAGE
* USP=A7 OF CONTEXT, A5/A6 OF CTX IS IN 4(A7)/8(A7)
* INITIALIZE THE REST OF THE SAVE_STACK IN THE CONTEXT
MOVEQ.L #1,D0 D0:=FUNCTION:=INIT:=1;
MOVEM.L D0-D3,PR_D0.A3(A0) PROC.D0-D3:=D0-D3; "FUNC AND #FORMALS"
LEA CT_WRK-4(A3),A6 A6:=ADDR OF SAVED PC IN CTX.SAVE_STACK;
CLR.W -(A6) PUSH SR
MOVE.L 8(A7),-(A6) PUSH FUTURE A6
MOVE.L 4(A7),-(A6) PUSH FUTURE A5
SUBQ.L #4,A6 PUSH UNDEFINED A4
MOVE.W #-2,CT_COUNT(A3) -#EXTRA_WORDS_IN_SAVE_STK:=-2;"RESUME_PC"
MOVE.L #START_PROC,-(A6) PUSH RESUME ADDRESS OF INITIAL CTX
LEA 12(A7),A7 POP RETURN VALUES FROM SET_FP.
* PLACE THE I_CONFIG INTEGER IN THE STACK OF THE CONTEXT
* AND ADJUST A7 OF THE CONTEXT
*
MOVE.L A3,A2 A2:=
ADD.W CT_FIR(A2),A2 FIRST (AND ONLY) SEGMENT;
* DESCRIPTOR OF CONTEXT(=STACK SEGMENT)
MOVE.L SE_FIR(A2),A1 A1:=FIRST BYTE OF STACK DATA
ADD.L SE_LEN(A2),A1 A1:=TOP_BYTE:=FIRST_BYTE+LENGTH;
MOVE.W #4,-(A1) PUSH "INTEGER TYPE" ON STACK
MOVE.L #I_CONFIG,-(A1) PUSH I_CONFIG ON STACK
MOVE.L USP,A1 A1:=USP
SUBQ.L #6,A1 A1:=USP:=...-6 "ROOM FOR I_CONFIG PARAM;"
MOVE.L A1,CT_USP(A3) CTX.USP:=USP;
* PUT THE PROCESS INTO RUNNING QUEUE
*
LEA PR_AUX(A0),A0 A0:=AUX_QUEUE OF PROCESS
LEA RUNNING,A1 A1:=RUNNING QUEUE
INS_ELEM A1,A0,A6,A1/A6 CHAIN PROCESS TO RUNNING QUEUE;
MOVE.L #STOP_PROC,CT_CON(A3) CTX.CONTINUE_AT_RETURN:= STOP_PROC;
PAGE
* THE PTMCHIP CONSISTS OF THREE 16-BIT TIMERS
* TIMERS 1 AND 3 MAY BE COMBINED TO A 32 BIT TIMER. THIS FACILITY IS
* NOT USED
* TIMER-2 IS USED WHEN A SINGLE TIME-OUT INTERRUPT IS NEEDED
* TIMER-3 IS USED TO GENERATE INTERRUPT AT A FIXED FREQUENCE
* TIMER-1 IS NOT USED
*
*
LEA PTMCHIP,A0 A0:=ADDRESS OF TIMER CHIP
MOVE.B #$01,STATCON2(A0) SELECT CONTROL REGISTER 1
MOVE.B #$01,CONTRL13(A0) STOP ALL TIMERS VIA CONTROL-1
* SET UP ADDRESS ETC. FOR THE TIMER INTERRUPT PROCEDURE
LEA DRIV_TAB,A1 A1:= DRIVER TABLE
LEA STAK_TAB,A2 A2:= STACK TABLE
LEA KV_INVEC,A3 A3:= INTERRUPT VECTOR
MOVEQ.L #-1,D0 D0:= RESERVED:= -1;
MOVE.W #PTM_VEC,D1 D1:= ADDRESS OF TIMER'S ENTRY IN TABLES
MOVE.L D0,(A1,D1.W) CHANNEL(PTM_VEC)
MOVE.L D0,(A2,D1.W) := RESERVED;
MOVE.L #TINTRUPT,(A3,D1.W) INTRPT PROC(PTM_VEC):= SCHEDULER'S PROC.
MOVE.B #$00,STATCON2(A0) SELECT CONTROL REGISTER-3
MOVE.W #$FFFF,D0 D0:=INTERRUPT PERIOD-1:=2**16-1;
MOVEP.W D0,TIMER_3(A0) ASSIGN INTERRUPT PERIOD-1 TO TIMER 3
MOVE.B #$42,CONTRL13(A0) ASSIGN $42 AS CONTROL VALUE FOR TIMER 3
* $42 = 01000010
* B7 = 0: DON'T GENERATE OUTPUT PULSES
* B6 = 1: GENERATE INTERRUPTS (B6=0: JUST RAISE A STATUS BIT)
* B5,4,3 = 000: CONTINUOUS MODE OF OPERATION I.E. FIXED INTERRUPT FREQUENCE
* B2 = 0: THE INTERRUPT PERIOD IS ONE 16 BIT VALUE (NOT TWO 8-BIT VALUES)
* B1 = 1: USE ENABLE PULSE (1 MHZ) AS CLOCK PULS
* B0 = 0: ONE (INSTEAD OF 8) CLOCK PULSES) => COUNT DOWN BY ONE
*
MOVE.B #$63,STATCON2(A0) ASSIGN $63 AS CONTROL VALUE FOR TIMER 1
* $63 = 01100011
* B7,6 = 01: AS ABOVE
* B5,4,3 = 100: SINGLE SHOT MODE, COUNT DOWN BEGINS WHEN TIMER2 IS ASSIGNED
* B2,1 = 01: AS ABOVE
* B0 = 1: SELECT CONTROL REGISTER-1 (WHEN CONTRL13 IS WRITTEN)
*
*
*
* MOVE.B #$00,CONTRL13(A0) ASSIGN ZERO TO CONTROL-1 ****OBS***OBS****
*
* B0 = 0: ALLOW ALL TIMERS TO OPERATE AS PROGRAMMED
* B1-7 = 0: NO INTERRUPTS FROM TIMER-1
*
* THE SCHEDULER WILL UPDATE THE REAL TIME COUNTER WHEN INTERRUPTS
* ARE RECEIVED
* TIMER-2 WILL BE USED WHEN TIME-OUT SIGNALS ARE REQUIRED
* BY THE KERNEL. (E.G. TO IMPLEMENT TIME_OUT ON CONDITION OBJECTS)
PAGE
* THE RAM AREA OCCUPIED BY THE INITIALIZATION CODE MAY BE
* INCLUDED IN THE FREE MEMORY POOL: ADJUST F_ALLOC, AND
* CREATE A NEW FIXED MEM_REC DESCRIBING THE RAM AREA
* HOLDING THE INITIALIZATION SECTION AND THE HEAD OF THE "OLD FIRST
* MEM_REC" AS A FREE AREA. CHAIN THE RECORD TO THE MEM_REC
* FOLLOWING THE "OLD FIRST MEM_REC"
* DISCIPLIN:
* NOTE THAT NO SYMBOL IN THE INITIALIZE SECTION MUST
* BE REFERENCED FROM THE RUN_TIME SECTION, AND NOTE THAT
* PROCEDURE THAT ARE ONLY USED DURING INITIALIZATION SHOULD
* BE PLACED IN THE INITIALIZE SECTION.
* UNTIL THIS HAS BEEN "PROVED", STARS SHOULD REMAIN ON THE
* FOLLOWING LINES
*
*
*
* LEA TOP_RUNK,A0 A0:=TOP_RUNTIME=FIRST OF INITIALIZE;
* LEA MR_SIZ(A0),A1 A1:=FIRST FREE BYTE;
* MOVE.L F_ALLOC,A2 A2:=FIRST MEM_REC
* MOVE.L (A2),A3 A3:=MEM_REC NEXT TO FIRST
* MOVE.L A1,D0 D0:=FIRST FREE; "AFTER THE MEM_REC_HEAD"
* LEA MR_SIZ(A2),A2 A2:=FIRST FREE OF FIRST MEM_REC
* SUB.L D0,A2 D2:=BYTES_FREE PROVIDED BY INIT SECTION
* CREATE THE NEW FIRST MEM_REC HEAD
* MOVE.L A3,(A0) FIRST.NEXT:=NEXT TO FIRST;
* MOVE.L #$4711,MR_PRV(A0) FIRST.PREV:=4711; "NO PREV"
* MOVE.L A1,MR_FST(A0) FIRST.FIRST_FREE:=FIRST FREE BYTE;
* MOVE.L A2,MR_FRE(A0) FIRST.BYTES_FREE:=BYTES_FREE;
* MOVE.B #1,MR_FIX(A0) FIRST.FIXED:=FIXED MEM_REC_HEAD;
* MOVE.B #1,MR_TYP(A0) FIRST.TYPE:=KNEL_MEM_REC;
* MOVE.L A0,F_ALLOC F_ALLOC:=FIRST;
* COMPUTE BYTES AVAILABLE FOR ALLOCATION
*
MOVE.L F_ALLOC,A0 A0:=FIRST MEM_REC;
MOVE.L L_ALLOC,A1 A1:=LAST MEM_REC; "DUMMY"
CLR.L D0 D0:=AVAILABLE:=0
REPEAT REPEAT
PRT_MEM FREE_MEM,(A0),MR_SIZ ********
ADD.L MR_FRE(A0),D0 D0=AVAILABLE:=...+MEM_REC.BYTES_FREE;
MOVE.L (A0),A0 MEM_REC:=NEXT MEM_REC;
UNTIL.L A0 <EQ> A1 UNTIL MEM_REC=LAST MEM_REC
SUB.L #DONT_USE,D0 D0=AVALIABLE:=...-DONT_USE
MOVE.L D0,KV_FRMEM KV_FRMEM:=AVAILABLE;
PRT_MEM KV_FRMEM,KV_FRMEM,4 ********
PAGE
* ENTER THE STUB
PRT_MEM KERNEL_VARIABLES_AFTER_INIT,KV_INVEC,TOP_VAR ********
MOVEQ.L #-1,D0 D0:=PREVPRIO:=-1;
BRA.L EOSBEGIN GOTO ACTIVATE_BOTTOM_LEVEL_SCHEDULER;
* THE BOOT PROCESS WILL BE SCHEDULED, IT IS THE ONLY PROC IN RUNNING QUEUE;
* VOID_ARGUMENT USED WHEN THE STUB CONTEXT IS "CALLED"
DCB.B AR_SIZ,0 VOID VALUE DATA SEGMENT
VOIDARG EQU * TOPADDRESS OF VOID ARGUMENT;
PAGE
* TOP PART OF KERNEL
*
* THIS PART IS USED TO ENSURE A PROPER "POSITION" OF THE BOOT
* LOADED OS-MODULES. A RAM KERNEL IS LINKED AS ONE SEGMENT
* STARTING IN ADDRESS ZERO. OS-MODULES MAY FOLLOW THIS SEGMENT
* IN THE BOOT FILE. IN THE RAM-VERSION OF "ENTER" THE FOLLOWING
* DIRECTIVES ARE ASSEMBLED IN SECTION INITIALIZE. IN A ROM-VERSION
* SECTION KNEL_VAR SHOULD BE USED INSTEAD.
*
TOP_KNEL EQU * ADDRESS OF FIRST FREE RAM AREA
DS.B ($400*1) 1 K-BYTES, DELAYS THE NEED FOR MEMORY COMPRESSION
FIRST_OS EQU * OS_MODULES WILL BE BOOTED AT THE NEXT PAGE BOUNDARY.
* THE ADDRESS IS ROUNDED UP BY THE PREFACE.
* END OF INIT SECTION
PAGE
SECTION 9 = RUN_TIME
*
NOP DUMMY , TO AVOID EMPTY SECTION
TOP_RUNK EQU * ADDRESS OF FIRST BYTE OF INITIALIZATION PART
NOP DUMMY
* END OF RUN_TIME SECTION.
END ! END OF ENTER SOURCE.
«eof»