|
|
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: 16256 (0x3f80)
Types: TextFile
Names: »PREFACE.S«, »PREFACE.SA«
└─⟦08e5746f0⟧ Bits:30009789/_.ft.Ibm2.50007359.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »PREFACE.S«
└─⟦1ed910a99⟧ Bits:30009789/_.ft.Ibm2.50006596.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »PREFACE.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⟧ »PREFACE.SA«
└─⟦8592db80f⟧ Bits:30009789/_.ft.Ibm2.50007350.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »PREFACE.S«
***********************************************************************
* Copyright 1984 by *
* NCR Corporation *
* Dayton, Ohio U.S.A. *
* All Rights Reserved *
***********************************************************************
* EOS Software produced by: *
* NCR Systems Engineering - Copenhagen *
* Copenhagen *
* DENMARK *
***********************************************************************
PREFACE IDNT 1,0 KERNEL PREFACE
OPT FRS
NOLIST
INCLUDE COMDEF.SA
LIST
*
* WRITTEN BY VILHELM ROSENQVIST
*
* THE PURPOSE OF THE PREFACE IS TO ASSIGN SOME KEY VARIABLES
* OF THE RUNNING SYSTEM. SOME VALUES MUST BE CHANGED IN
* COMDEF OR IN PREFACE WHEN THE SYSTEM CONFIGURATION CHANGES.
* --------------------
I_CONFIG EQU -1 ADDRESS OF FIRST ROM-OS_MODULE TO BE BOOTED BY THE STUB
XDEF I_CONFIG -1 SIGNALS THAT THE FIRST MODULE IS IN THE BOOT OWNER SET
SECTION.S 7 = KNEL_VAR (NORMALLY LOADED FROM ADDR 0 AND ON)
KV_INVEC DC.L INIT_SSP INITIAL SSP
DC.L INIT_PC INITIAL PC (SECTION INITIALIZE)
DS.L 254 INTERRUPT VECTORS.
KV_FRMEM DC.L MEM_LIST INITIALLY: MEM_LIST; LATER: FREE_BYTES
KV_BOTLD DC.L FIRST_OS FIRST_OS IS DEFINED IN INIT SECTION OF
* 'ENTER'. ROUNDED UP IN INIT SECTION BELOW
KV_STUB DC.L -1 STUB IS BOOTED INTO RAM
MEM_LIST DC.W 1 ONE PAIR IN THE MEM_LIST
DC.L TOP_KNEL DEFINED IN INIT SECTION OF "ENTER"
DC.L $60000 SIZE OF RAM ON EXORMACS (=384 K,= 6*64K)
INIT_SSP EQU $60000 USE TOP RAM AS INITIAL STACK POINTER
* 384K=$6*64K,512K=$8*64K,640K=$A*64K,768K=$C*64K
XREF.S 7:DRIV_TAB,STAK_TAB,KV_CTX,RTCNT,SUPV_STK
XREF TOP_KNEL,FIRST_OS,I_MMPROC,INT_EXC
XDEF KV_FRMEM,KV_BOTLD,KV_STUB,RTEDUMMY,KV_INVEC,PRINTA02,TEXTLINE
XDEF TSTSTATU
* VARIABLES USED BY TEST PRINT PROCEDURES BELOW
TSTCOUNT DS.W 1 COUNTS DOWN FROM 50 THE #OUTPUT_LINES
TSTSTATU DS.W 1 STATE OF TESTOUTPUT
PAGE
SECTION 11 = INITIALIZE
* THE INITIALIZATION OF THE PREFACE GETS CONTROL RIGHT AFTER THE
* "HARDWARE" BOOT.
* 0) ROUND UP FIRST_OS IN KV_BOTLD.
* 1) "CLEAR" THE VECTOR_TABLE, DRIVER_TABLE AND STACK_TABLE
* 2) RESERVE TRAP #9 FOR TEST OUTPUT AND INITIALIZE TEST PRINTER
* 3) INITIALIZE ENTRY 0 AND 1 OF THE TABLES
INIT_PC EQU * EXECUTION STARTS HERE:
* ADJUST FIRST_OS IN KV_BOTLD.
MOVE.L KV_BOTLD,D0 D0:=FIRST_OS FROM KV_BOTLD;
ADD.L #255,D0 ROUND UP FIRST_OS
CLR.B D0 .
MOVE.L D0,KV_BOTLD ASSIGN FIRST_OS TO KV_BOTLD;
* SET UP VECTOR TABLE ETC. DOES THIS MATCH THE INITIALIZATION IN KNELOP???
MOVEQ.L #-1,D1 D1:=RESERVED:=-1
LEA KV_INVEC,A0 A0:=INT_VECTOR
LEA DRIV_TAB,A2 A2:=DRIVER_TABLE
LEA RTEDUMMY,A1 A1:<DUMMY INTERRUPT
LEA STAK_TAB,A3 A3:=STACK_TABLE
FOR.W D0 = #8 TO #255*4 BY #4 DO.S FOR NEARLY ALL CHANNELS DO
CLR.L (A2,D0.W) CHANNEL:=FREE;
MOVE.L A1,(A0,D0.W) INTERRUPT ADDRESS:=DUMMY INTERRUPT;
CLR.L (A3,D0.W) CHANNEL:=FREE;
ENDF ENDF;
MOVE.W #(32+9)<<2,D0 D0:=EXCEPTION ENTRY FOR TRAP #9:=(32+9)
LEA TEST_PRT,A1 A1:=PRINT REGISTER PROCEDURE
MOVE.L D1,(A2,D0.W) CHANNEL (32+9):=RESERVED;
MOVE.L A1,(A0,D0.W) ASSIGN TESTPRINT PROCEDURE TO TRAP #9
MOVE.L D1,(A3,D0.W) CHANNEL (32+9):=RESERVED;
* INITIALIZE TEST PRINT
CLR.W TSTCOUNT
CLR.W TSTSTATU
* INITIALIZE PRINTER
MOVE.B #$00,PRTCONTA SELECT DATA DIRECTION REGISTER FOR A-PART
MOVE.B #$FF,PRTBUF ALL LINES USED FOR OUTPUT
MOVE.B #$3C,PRTCONTA ASSIGN CONTROLBITS TO OUTPUT PART
MOVE.B #$00,PRTCONTB SELECT DATA DIRECTION REGISTER FOR B-PART
MOVE.B #$08,PRTSTATU ALL LINES USED FOR INPUT BUT BIT 3 ?
MOVE.B #$3C,PRTCONTB ASSIGN CONTROLBITS TO INPUT PART
BSR.L NEWLINE
MOVE.B #'E',D0
BSR.L PRTCHAR
MOVE.B #'O',D0
BSR.L PRTCHAR
MOVE.B #'S',D0
BSR.L PRTCHAR
BSR.L NEWLINE
* PREPARE THE STACK SPACE COMPUTATION ALGORITHM.
MOVE.W #TRP7STAK,D3 ENSURE THAT TRAP7STACK IS INCLUDED
SWAP D3 IN THE SUPERVISOR STACK SPACE COMPUTATION
CLR.W D3 D3:=
MOVE.L D3,(A3) STACK_TABLE(0):=TRP7STAK<<16+0;
MOVE.L D3,(A2) DRIVER_TABLE(0):=USED:=DUMMY_VALUE>0;
MOVE.L D1,4(A3) ENTRY(1) CANNOT BE USED
MOVE.L D1,4(A2) CHANNEL(1):=RESERVED;
PRT_MEM END_OF_PREFACE,KV_INVEC,TSTSTATU+2-KV_INVEC ********
BRA.L I_MMPROC CONTINUE IN INIT MMPROCS.
PAGE
SECTION 9 = RUN_TIME
* THE TEST OUTPUT PROCEDURE BELOW SHOULD BE CALLED
* FROM SUPERVISOR MODE THROUGH
* THE MACRO "PRT_REG" OR "PRT_MEM".
TEST_PRT EQU * TEST OUTPUT
* CALLED VIA TRAP #9.
*
* WHEN USED FROM SUPERVISOR MODE
* THE STACK CONTAINS SR,PC,ADDR OF DATA TO BE PRINTED,
* (PC..PC+X) CONTAINS AN IDENTIFICATION TEXT TERMINATED BY A ZERO CHAR, AND
* (PC+X+2) CONTAINES THE LENGTH OF THE DATA TO BE PRINTED.
* RTE IS MADE TO PC+X+4.
*
* WHEN USED FROM USER MODE
* THE STACK CONTAINS ONLY SR,PC. THE REGISTERS AND THE USED PART OF THE STACK
* OF CALLING CONTEXT WILL BE PRINTED. IT IS EXPECTED THAT THE STACK SEGMENT
* OF THE CONTEXT EQUALS THE OLDEST EMBEDDED SEGMENT OF THE CONTEXT. IT IS ALSO
* ASSUMED THAT THE EMBEDDED SEGMENT CAN BE FOUND IMMEDIATLY BEFORE THE
* CONTEXT ITEM. THE LATTER IS NOT TRUE WHILE THE CONTEXT IS BEING MOVED.
* A7 MUST POINT TO THE TOP OF THE STACK. A7 IS FOUND IN THE USP REGISTER.
BTST.B #5,(A7) TEST SUPERVISOR BIT OF CALLER
IF <EQ> THEN.S IF SUPERVISOR BIT = 0 THEN "CALLED FROM USER MODE"
MOVE #$2700,SR PREVENT INTERRUPTS;
SUBQ.L #4,A7 PUSH ROOM FOR USP;
MOVEM.L D0-D7/A0-A6,-(A7) SAVE USER REGS;
MOVE.L USP,A0 A0:= USP;
MOVE.L A0,60(A7) SAVE USP IN STACK;
PRT_MEM USER_REGISTERS_FOLLOWS:,(A7),70 PRINT REGS,SR,PC FROM STACK
MOVE.L KV_CTX,A1 A1:= CALLING CTX;
MOVE.L SE_LEN-SE_SIZ(A1),A2 A2:= LENGTH OF STACK;
MOVE.L SE_FIR-SE_SIZ(A1),A3 A3:= FIRST PHYS. OF STACK;
SUB.L #$200000,A0 A0:= USP AS OFFSET INTO STACK:= USP-FIRST LOGIC.
IF.L A0 <LT> #0 OR.L A0 <GT> A2 THEN.S IF ILLEGAL USP THEN
MOVE.L A2,A0 A0:=A2; ==> NO TEST OUTPUT
ENDI ENDI;
ADD.L A3,A0 A0:=FIRST PHYS. ADDR OF USED STACK;
ADD.L A3,A2 A2:=TOP PHYS. ADDR OF USED STACK
BTST.B #1,TSTPANEL+1 TEST POSITION OF KEY SWITCH;
IF <EQ> THEN.S IF KEY POSITION = ENABLED THEN "PRINT OUT"
BSR.L PRINTA02 PRINT USED PART OF STACK;
ENDI ENDI;
MOVEM.L (A7)+,D0-D7/A0-A6 RESTORE USER REGS;
ADDQ.L #4,A7 POP USP;
RTE
* THE FOLLOWING INSTRUCTIONS GENERATES AN INTERNAL EXCEPTION IN CALLING CTX
* MOVEQ.L #41,D3 D3:= INDEX:= 41;
* BRA.L INT_EXT GOTO INTERNAL EXCEPTION;
ENDI ENDI;
PAGE
* TRAP #9 CALLED FROM SUPERVISOR MODE.
MOVE #$2700,SR PREVENT INTERRUPTS;
BTST.B #1,TSTPANEL+1 TEST POSITION OF THE PANEL SWITCH KEY;
IF <NE> THEN.S IF KEY POSITION = DISABLED THEN "NO PRINTOUT"
TST.W TSTSTATU
IF <GT> THEN.S IF TEST STATUS = TEST ON THEN
NEG.W TSTSTATU TEST STATUS := TEST OFF
ENDI ENDI;
MOVE.L A0,-(A7) SAVE A0
MOVE.L 6(A7),A0 A0:= PC;
REPEAT
TST.B (A0)+ SKIP TEST TEXT, INCREASE PC
UNTIL <EQ> STOP AT ZERO CHAR
MOVE.L A0,6(A7) PC:= INCREASED PC
ADDQ.L #3,6(A7) PC:= PC + 2 "SKIP INLINE PARAMETER" +1 "ROUND UP";
BCLR.B #0,9(A7) PC:= EVEN PC
MOVE.L (A7)+,A0 RESTORE A0
MOVE.W 4(A7),8(A7) MOVE PC AND SR DOWN, AND IN-
MOVE.L (A7)+,(A7) CREASE A7 TO POP THE ADDR_PARAM;
RTE RETURN;
ENDI ENDI;
PAGE
* TEST OUTPUT SHOULD BE GENERATED.
MOVEM.L D0-D7/A0-A7,-(A7) SAVE REGS ON STACK
TST.W TSTSTATU
IF <LE> THEN.S IF TEST OUTPUT WAS NOT ON THEN "PRINT FIRST LINE"
BSR.L NEWLINE
LEA FIRSTTEX,A0
BSR.S PRTTEXT
NEG.W TSTSTATU
ADDQ.W #1,TSTSTATU TEST STATUS := ... + 1; "COUNT KEY SWITCES"
MOVE.W TSTSTATU,D0 D0:= POSITIV TESTSTATUS;
BSR.L PRTBYTE PRINT TEST STATUS MODULO 256;
BSR.L NEWLINE
ENDI ENDI;
BSR.S TESTTSTC TEST TSTCOUNT AND MAYBE PRINT LAYOUT;
MOVEM.L 62(A7),D7/A0/A1 D7.W:=SR; A0:=PC; A1:=ADDR;
BSR.L NEWLINE PRINT NEWLINE IN FRONT OF TEST OUTPUT
BSR.S PRTTEXT PRTTEXT(A0=TEXT);A0:= INCREASED PC;
MOVE.L A0,D0 DO:=
ADDQ.L #1,D0 ROUND PC TO NEXT
BCLR.L #0,D0 EVEN ADDRESS
MOVE.L D0,A0 A0:= INCREASED PC;
SWAP D7 SAVE SR IN D7.HIGH_BITS
MOVE.W (A0)+,D7 D7.LOW_BITS:= LENGTH; A0:= INCREASED PC;
IF <LT> THEN.S IF LENGTH < 0 THEN "PRT_REG" MACRO"
LEA 64(A1),A3 A3:= TOP_ADDR:= FIRST_ADDR + 64;
ELSE.S ELSE
LEA (A1,D7.W),A3 A3:= TOP_ADDR:= FIRST_ADDR + LENGTH;
ENDI ENDI;
SWAP D7 D7:= LENGTH << 16 + SR;
MOVEM.L D7/A0,66(A7) MOVE SR,PC 4 BYTES DOWN;
MOVE.L A1,D6 D6:= ADDR_PARAM;
MOVEM.L RTCNT,D4/D5 D4/D5:= TIME COUNTER;
* D4/D5/D6/D7/A0/A1 CONTAINS VAUES (D6=A1).
BRA.S TESTTSTE BRANCH OVER THE TEST PROCEDURE BELOW
PAGE
TESTTSTC EQU * TEST TSTCOUNT AND MAYBE PRINT LAYOUT.
* A0=TEXT; A0:=TOP OF TEXT; D0:=UNDEF;
TST.W TSTCOUNT TEST LINE COUNT;
IF <LE> THEN.S IF LINE COUNT <= 0 THEN "PRINT LAYOUT LINE"
MOVE.W #50,TSTCOUNT LINE COUNT := 50;
LEA PTLAYOUT,A0 A0:= LAYOUT;
PRTTEXT EQU * PRINT TEXT ADDRESSED BY A0; A0:=TOP OF TEXT; D0:=UNDEF;
MOVE.B (A0)+,D0 D0:=CHAR := FIRST CHAR FROM LAYOUT;
REPEAT REPEAT
BSR.L PRTCHAR PRINT CHAR
MOVE.B (A0)+,D0 D0:=CHAR := NEXT CHAR FROM LAYOUT;
UNTIL <EQ> UNTIL CHAR = END_MARK(=ZERO CHAR)
ENDI ENDI;
RTS RETURN;
TESTTSTE EQU * END OF PROC ABOVE
MOVE.L A7,A2 A2:= TOP_AREA:= STACK;
MOVEM.L D4/D5/D6/D7/A0,-(A7) SAVE FIVE VALUES ON STACK;
MOVE.L A7,A0 A0:= FIRST_AREA:= STACK;
BSR.L PRINTA02 PRINT(A0=FIR,A2=TOP,D0/D1/A0:=??);
MOVE.L A2,A7 POP THE SAVED VALUES;
MOVE.L A1,A0 A0:= FIRST_AREA:= ADDR_PARAM;
MOVE.L A3,A2 A2:= TOP_AREA:= TOP_ADDR;
BSR.L PRINTA02 PRINT(A0=FIR,A2=TOP,D0/D1/A0:=??);
MOVEM.L (A7)+,D0-D7/A0-A6 RESTORE REGS, EXCEPT A7
ADDQ.L #8,A7 POP 8 BYTES FROM STACK; "A7 AND THE ADDR_PARAM"
RTE RETURN;
PTLAYOUT EQU *
****DC.B 'D0...ID!!.ADDR.!!SZ!!SR!!..PC..!4......45......56......67......7'
****DC.B 'A0.....01......12......23......34......45......56......67......7'
DC.B '!0. .. .. .0!1. .. .. .1!2. .. .. .2!3. .. .. .3!'
DC.B '4. .. .. .4!5. .. .. .5!6. .. .. .6!7. .. .. .7!'
NLSTRING EQU *
DC.B 32,13,0 NEW_LINE + END_MARK WHAT IS REQUIRED BY OKI PRINTER
FIRSTTEX EQU *
DC.B '***** TEST OUTPUT:'
DC.B 0 END_MARK
DS.W 0 FORCE EVEN ADDR.
TEXTLINE EQU * PRINT AREA BETWEEN A3/A4 AND ASSIGN D0
BSR.L NEWLINE
WHILE.L A3 <NE> A4 DO.S
MOVE.B (A3)+,D0
BSR.L PRTCHAR
ENDW
BSR.L NEWLINE
BTST.B #1,TSTPANEL+1
IF <NE> THEN.S
MOVEQ.L #2,D0 SWITCH = DISABLE
ELSE.S
MOVEQ.L #0,D0 SWITCH = ENABLE
ENDI
RTS
PAGE
PRINTA02 EQU * PRINT AREA FROM A0 TO A2
* CALL: RETURN:
*A0 FIRST BYTE UNDEF
*A2 TOP BYTE SAME
*D0/D1 ANY UNDEF
*
MOVEQ.L #32,D1 D1:= POSITION TO PRINT NEW_LINE CHAR
ADD.L A0,D1 := FIRST BYTE + 64;
WHILE.L A0 <LT> A2 DO.S WHILE MORE BYTES DO
IF.L A0 <EQ> D1 THEN.S IF NEW_LINE CHAR SHOULD BE PRINTED THEN
BSR.S NEWLINE PRINT NEW_LINE;
ADD.L #32,D1 D1:= NEXT POSITION := ... + 64;
SUBQ.W #1,TSTCOUNT LINE_COUNT := ... -1;
ENDI ENDI;
MOVEQ #32,D0 D0:= SPACE;
BSR.S PRTCHAR PRINT SPACE;
MOVE.B (A0)+,D0 D0:= NEXT BYTE TO PRINT;
BSR.S PRTBYTE PRINT BYTE(D0=BYTE,D0:=??);
ENDW ENDW;
BSR.S NEWLINE PRINT NEW_LINE;
SUBQ.W #1,TSTCOUNT LINE_COUNT := ... -1;
RTS RETURN;
* PRINT CHAR RUTINE
PRTERROR EQU * PRINTER ERROR:
SWAP D0 RESTORE CHAR IN D0
*
PRTCHAR EQU * PRINT THE CHAR IN D0 ON THE DEBUG PRINTER
* CALL: RETURN:
* D0.B CHAR D0.W=SAME
*
MOVE.B D0,PRTBUF MOVE CHAR TO OUTPUT BUFFER
SWAP D0 SAVE CHAR IN D0.HIGH_BITS
TST.B PRTBUF CLEAR OLD INTERRUPT
MOVE.B #$34,PRTCONTA PULL CA2 LOW
MOVE.B #$3C,PRTCONTA PULL CA2 HIGH
PRTWAIT EQU *
MOVE.B PRTSTATU,D0 D0.B:= PRINTER STATUS;
AND.B #3,D0
SUB.B #1,D0
BNE.S PRTERROR WHEN STATUS <> ......01 GOTO PRINTER ERROR;
TST.B PRTCONTA
BPL.S PRTWAIT WHEN PRINTER BUSY GOTO PRINTER WAIT
TST.B PRTBUF CLEAR INTERRUPT
SWAP D0 RESTORE D0;
RTS
PAGE
NEWLINE EQU * PRINT NEW LINE ON THE PRINTER. D0:= ??;
MOVE.L A0,-(A7) SAVE A0
LEA NLSTRING,A0
BSR.L PRTTEXT
MOVE.L (A7)+,A0
RTS
PRTBYTE EQU * PRINT BYTE AS TWO HEX DIGITS
* CALL: RETURN:
*D0.B BYTE UNDEF
*
BSR.S BYTECONV D0.W:= TWO ASCII CHARS (HEX DIGITS);
ROR.W #8,D0
BSR.S PRTCHAR PRINT FIRST CHAR
LSR.W #8,D0
BSR.S PRTCHAR PRINT SECOND CHAR
RTS RETURN;
BYTECONV EQU * D0.W := ASCII VALUES FOR THE BYTE IN D0.B
LSL.W #4,D0 SAVE HIGH BITS;
LSR.B #4,D0 D0.B:= LOW BITS;
BSR.S HEXTOASC D0:= ASCII CHAR;
ROR.W #8,D0 SAVE LOW CHAR; D0.B:=
AND.B #$F,D0 SAVED HIGN BITS;
BSR.S HEXTOASC D0.B:= ASCII CHAR;
ROR.W #8,D0 D0.W:= ASCII CHARS IN THE RIGHT ORDER.
RTS RETURN;
HEXTOASC EQU * D0.B := ASCII VALUE FOR THE HEX VALUE IN DO.B ( <16 )
IF.B D0 <GT> #9 THEN.S IF HEX_VALUE > 9 THEN "A-F DIGIT"
ADDQ.B #7,D0 D0:=D0+7;
ENDI ENDI;
ADD.B #$30,D0 D0:=D0+$30;
RTS RETURN;
RTEDUMMY EQU * UNKNOWN INTERRUPTS
PRT_REG UNKNOWN_REGS_=
PRT_MEM UNKNOWN_STACK=,(A7),128
* PRINT ADDITIONAL SUPERVISOR STACK
MOVE.L A0,-(A7)
LEA 128+4(A7),A0
WHILE.L A0 <LT> SUPV_STK DO.S
PRT_MEM REST_OF_STACK=,(A0),128
LEA 128(A0),A0
ENDW
MOVE.L (A7)+,A0
RTE
END ! END OF PREFACE SOURCE
«eof»