DataMuseum.dk

Presents historical artifacts from the history of:

Bogika Butler

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Bogika Butler

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦b9bbaf7a5⟧ TextFile

    Length: 13184 (0x3380)
    Types: TextFile
    Names: »ENTER.S«, »ENTER.SA«

Derivation

└─⟦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« 

TextFile

 
***********************************************************************
*                       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»