|
|
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: 11904 (0x2e80)
Types: TextFile
Names: »DRIVEXT.SA«
└─⟦909f4eb2b⟧ Bits:30009789/_.ft.Ibm2.50006622.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »DRIVEXT.SA«
└─⟦ddcd65152⟧ Bits:30009789/_.ft.Ibm2.50006617.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »DRIVEXT.SA«
***********************************************************************
* Copyright 1984 by *
* NCR Corporation *
* Dayton, Ohio U.S.A. *
* All Rights Reserved *
***********************************************************************
* EOS Software produced by: *
* NCR Systems Engineering - Copenhagen *
* Copenhagen *
* DENMARK *
***********************************************************************
DRIVEXT IDNT 1,0 EXTERNAL ROUTINES FOR THE IPC DRIVERS
NOFORMAT
SECTION 9
* MIK 83-04-28
LIST
INCLUDE EOSMAC.MACEOSM.SA
INCLUDE EOSMAC.STUBLOCS.SA
XDEF STARTIPC
XDEF INTMCCM
XDEF INTUDC
XDEF BYTEADDR
PAGE
*
* IPC CHANNEL
*
OFFSET 1
CHSEMS DS.B 12
CHINTRPT DS.B 2
CHRESET DS.B 242
* OUTPUT MESSAGE BUFFER
CHOPRES DS.B 2
CHOACKNAK DS.B 2
CHOPACK DS.B 124
* INPUT MESSAGE BUFFER
CHIPRES DS.B 2
CHIACKNAK DS.B 2
CHIPACK DS.B 4
CHISIZE DS.B 2
CHIDEVNO DS.B 4
CHITYPE DS.B 2
CHISTATUS DS.B 4
CHIDEVSTAT DS.B 107 ; BECAUSE OFFSET WAS 1
*
* ***DEFINITION OF IPC OBJECT***
*
*
* IPC_REQUEST RECORD
*
OFFSET 0
DS.B 2 ; KIND OF COMMAND
RQCOMM DS.B 2 ; COMMAND PACKET START
RQOSIZE DS.B 8 ; SIZE OF PACKET
DS.B 12 ; DMA_ADDRESS OF OUTPUT BUFFER
RQIKIND DS.B 2 ; KIND OF ANSWER
RQANSWER DS.B 21 ; ANSWER PACKET START
RQSTATE DS.B 2 ; REQUEST STATE
RQSIZE DS.W 0 ; VALUE=SIZE OF RECORD
*
* LOCAL DATA
*
OFFSET 0
LDATT DS.B 8 ; ARRAY Æ0..7Å OF BOOLEAN
LDRESERV DS.L 1 ; IPC_RESERVED
LDACK DS.B 8 ; ARRAY Æ0..7Å OF 0..7
LDACKFIRST DS.B 1 ; 0..7
LDACKLAST DS.B 1 ; 0..7
LDCHANADDR DS.L 1 ; CHANNEL ADDRESS
LDREQ DS.B 8*RQSIZE ; ARRAY Æ0..7Å OF IPC_REQUEST
SECTION 9
*
* LOCAL POINTERS
*
LOCALDATA DC.L LOC+3 ; SIMPLE COPY OF OLOCALDAT (FOR RESIDENCY)
CURRDRIV DC.L LOC+4 ; BASE IN ARRAY OF ENVELOPE PTR'S TO THE
* ; DRIVER OBJ'S WITH I/O-RESERSVATIONS
PAGE
*
* ***DEFINITION OF POINTERS IN DRIVER OBJECT***
*
COMPLETE DC.L LOC+4
ATTCOND DC.L LOC+5
*
* ***MISCELLANEOUS CONSTANTS ETC.***
*
SUPVMODE EQU 8 ; TRAP # FOR KERNEL'S SUPVBEGIN
READ EQU $10
WRITE EQU $20
FORMATTED EQU $01
IMAGE EQU $02
CHLENGTH EQU 512 ; LENGTH OF IPC-CHANNEL
MCCMVECT EQU 247
UDCVECT EQU 255
LDSIZE EQU 8+8*RQSIZE ; SIZE OF LOCALDATA TO TESTOUTPUT
*
* TESTOUTPUT
*
TESTFLAG EQU 1 ; 0=NO TESTOUTPUT
TKNELOUT EQU 7 ; TRAP # FOR KERNEL TESTOUTPUT
TKNELTXT EQU 1<<16+40 ; OP-CODE FOR TEXT OUTPUT
TKNELHEX EQU 2<<16+40 ; OP-CODE FOR HEX OUTPUT OF MEMORY AREA
PAGE
*
* *** M A C R O S ***
*
TESTOUT MACRO TEXT,FIRSTADDR,LENGTH
* PRODUCES TESTOUTPUT THROUGH THE KERNEL TESTOUTPUT FACILITIES
*
* PARAMETERS SUPPLIED:
* NONE: ONLY REGISTERS ARE OUTPUT
* TEXT: TEXT AND REGISTERS ARE OUTPUT
* ALL: TEXT, REGISTERS, AND INDICATED MEMORY AREA ARE OUTPUT
*
IFEQ TESTFLAG
MEXIT
ENDC
MOVEM.L D0-D7/A0-A7,-(A7) ; STORE REG'S ABOVE THE STACK
* OUTPUT TEXT
IFGT NARG ; OUTPUT TEXT
BRA.S Ø@ETXT
Ø@TXT DC.W 'Ø1'
Ø@ETXT EQU *
LEA Ø@TXT(PC),A0
MOVE.L A0,D4 ; D4:=&TEXT
MOVE.L #Ø@ETXT-Ø@TXT,D2 ; D2:=SIZE OF TEXT
MOVE.L #TKNELTXT,D5 ; D5:=OP-CODE
TRAP #TKNELOUT
ENDC
* OUTPUT REGISTERS
MOVE.L A7,D4 ; D4:=®'S ON STACK
MOVE.L #64,D2 ; D2:=SIZE OF REG'S
MOVE.L #TKNELHEX,D5 ; D5:=OP-CODE
TRAP #TKNELOUT
MOVEM.L (A7)+,D0-D7/A0-A7
* OUTPUT MEMORY AREA
IFGT NARG-1
PEA Ø2
MOVE.L Ø3,-(A7)
MOVEM.L D0-D7/A0-A6,-(A7)
MOVE.L 64(A7),D4 ; D4:=PUSHED ADDRESS OF MEM AREA
MOVE.L 60(A7),D2 ; D2:=PUSHED LENGTH
MOVE.L #TKNELHEX,D5 ; D5:=OPERATION
TRAP #TKNELOUT
MOVEM.L (A7)+,D0-D7/A0-A6
ADD.L #8,A7 ; 'POP' Ø2 AND Ø3
ENDC
ENDM
COPYMAC MACRO
* COPIES FROM IPC.LOCALDATA TO CHANNEL
* CALL RETURN
*-----------------------------------
*A0 REQUEST UNDEF.
*A1 CHANNEL SAME
*A3 UNDEF.
*D0 UNDEF.
*
LEA CHOPACK(A1),A3 ; A3:=&OUTMESS IN CHANNEL
MOVE.B RQOSIZE(A0),D0 ; D0:=REQUEST SIZE
ANDI #$FF,D0
LEA RQCOMM(A0),A0 ; A0:=&REQUEST.COMMAND
REPEAT
MOVE.B (A0)+,(A3) ; MOVE ONLY LOWER BYTES
ADD.L #2,A3
SUBQ.B #1,D0
UNTIL <EQ>
* SET 'OUTPUT MESS PRESENT' AND INTERRUPT IPC
MOVE.B #$80,CHOPRES(A1)
MOVE.B #$FF,CHINTRPT(A1)
ENDM
INTCHECK MACRO
* CHECKS A RESULT IN THE INTERRUPT PROCEDURE,
* IF NOT OK, JUST RETURN ORDERLY FROM INTERRUPT PROC
IF.W D7 <NE> #0 THEN.S
MOVEM.L (A7)+,D0-D7/A0-A6
TRAP #8
ENDI
ENDM
CHECK MACRO
* CHECKS RESULT OF KERNEL OPERATION (IN TESTSTUB)
* IF NOT OK, TESTOUPUT AND RETURN FROM TESTSTUB
IF.W D7 <NE> #0 THEN.S
OBJ_RETURN ; IGNORE STACK SITUATION
ENDI
ENDM
PAGE
STARTIPC DS.W 0 ; STARTIPC(VECTOR,DEVNO)
*
* CALLED FROM PASCAL
*
* ON STACK: VECTOR > DEVNO > RETURN ADDR
*
* A3, A5, A6 RESERVED BY PASCAL'S RUN TIME SYSTEM
*
MOVE.L (SP)+,A4 ; A4:=RETURN ADDR (A4 SURVIVES KERNEL)
MOVE.B (SP)+,D1 ; D1:=DEVNO
MOVE.B (SP)+,D0 ; D0:=VECTOR
MOVEM.L A3-A6,-(SP)
LEA COPYCHAN,A0
TRAP #SUPVMODE
MOVEM.L (SP)+,A3-A6
JMP (A4) ; RETURN TO PASCAL ROUTINE
COPYCHAN DS.W 0
*
* MOVE COMMAND FROM LOCALDATA TO CHANNEL AND INTERRUPT IPC
* D0: CALL=VECTOR#
* D1: CALL=DEVICE#
*
MOVEM.L D0-D7/A0-A6,-(A7)
MOVE.L D1,-(A7) ; STORE DEV#
ABS_ADDR LOCALDATA,D0
CHECK
MOVE.L A1,A0 ; A0:=ABSADDR(LOCALDATA)
MOVE.L LDCHANADDR(A0),A1 ; A1:=LOCALDATA.CHAN_ADDR
MOVE.L (A7)+,D1 ; GET DEV#
MULU #RQSIZE,D1
LEA LDREQ(A0,D1),A0 ; A0:=&REQUEST
COPYMAC
MOVEM.L (A7)+,D0-D7/A0-A6
RTE
PAGE
*
* *** I N T E R R U P T P R O C E D U R E S F O R I P C ***
*
INTMCCM DS.W 0 ; MCCM INTERRUPT PROCEDURE PROLOG
*
* INTERRUPT PROCEDURE FOR MCCM DEVICE CONTROLLER (THROUGH IPC)
* MIK 83-03-23
*
* SAVES REGISTERS, SETS VECTOR # IN A4, AND CALLS COMMON
* IPC-INTERRUPT PROCEDURE
*
MOVEM.L D0-D7/A0-A6,-(A7)
MOVE.L #MCCMVECT,A4 ; A4:=VECTOR#
BRA.S INTPROC
INTUDC DS.W 0 ; UDC INTERRUPT PROCEDURE PROLOG
*
* INTERRUPT PROCEDURE FOR UDC (UNIVERSAL DISK CONTROLLER)
* MIK 83-03-23
*
* SAVES REGISTERS, SETS VECTOR# IN A4, AND CALLS COMMON
* IPC-INTERRUPT PROCEDURE
*
MOVEM.L D0-D7/A0-A6,-(A7)
MOVE.L #UDCVECT,A4 ;A4:=VECTOR#
*** BRA.S INTPROC ; FALL THROUGH...
PAGE
INTPROC DS.W 0 ; INTERRUPT PROCEDURE (A4: VECTOR#)
*
* COMMON INTERRUPT PROCEDURE FOR IPC DEVICES
* MIK 83-03-23
*
* CALL RETURN
* --------------------------
* A4 VECTOR# UNDEF.
* STACK ALL REG'S SAVED RESTORED
*
ABS_ADDR LOCALDATA,A4
INTCHECK
MOVE.L A1,A5 ; A5:=ABS_ADDR(LOCALDATA)
MOVE.L LDCHANADDR(A5),A1 ; A1:=LOCALDATA.CHAN_ADDR
* EXAMINE CHANNEL MESSAGE (ACK/NAK, ANSWER/ATTENTION)
IF.B CHIACKNAK(A1) <NE> #0 THEN ; ACK OR NAK
IF.B CHIACKNAK(A1) <EQ> #$06 THEN.S ; ACK
MOVE.B #0,CHIACKNAK(A1) ; CLEAR ACK/NAK
ELSE.S ; NAK
TESTOUT <!!!!NOT ACKNOWLEDGE!!!!>
MOVE.L #$FF,D7
INTCHECK ; RETURN WITH ERROR $FF
ENDI
* START NEXT IN ACK-QUEUE
SUBQ.L #1,LDRESERV(A5) ; IPC_RESERVED:-1
IF.L LDRESERV(A5) <NE> #0 THEN
MOVEQ #0,D0
MOVE.B LDACKFIRST(A5),D0
MOVE.B LDACK(A5,D0),D0 ; D0:=NEXT DEV# IN ACK-FIFO
ADDQ.B #1,LDACKFIRST(A5)
IF.B LDACKFIRST(A5) <EQ> #8 THEN.S
MOVE.B #0,LDACKFIRST(A5) ; INCREMENT ACKFIRST (MODULUS 8)
ENDI
MULU #RQSIZE,D0
LEA LDREQ(A5,D0),A0 ; A0:=&REQUEST
COPYMAC
ENDI
ENDI
IF.B CHIPRES(A1) <NE> #0 THEN ; MESSAGE PRESENT IN CHANNEL
MOVE.B CHIDEVNO(A1),D0 ; D0.L:=DEVICE#
ANDI.L #$FF,D0
* CHECK MESSAGE FORMAT - POSSIBLY SEND NAK...
* NOT IMPLEMENTED
IF.B CHITYPE(A1) <LS> #$75 THEN ; SOLICITED MESSAGE
*
* WE HAVE AN ANSWER: STORE STATUS PACKET IN LOCALDATA.REQUESTSÆDEV#Å
*
MOVE.L D0,D1
MULU #RQSIZE,D1
LEA LDREQ+RQANSWER(A5,D1),A0 ; A0:=&LOCALDATA.REQUESTSÆDEV#Å.ANSWER
LEA CHIPACK(A1),A3 ; A3:=&ANSWER IN CHANNEL
MOVE.B CHISIZE(A1),D1 ; D1:=SIZE OF ANSWER
ANDI #$FF,D1
MOVE.L A0,-(A7) ; PUSH A0 FOR TESTOUTPUT
WHILE.B <NE> DO.S
MOVE.B (A3),(A0)+ ; LOWER (ODD) BYTES FROM CHANNEL
ADDQ.L #2,A3
SUBQ #1,D1
ENDW
MOVE.L (A7)+,A0 ; POP A0 FOR TESTOUTPUT
* CLEAR 'ANSWER_PRESENT' AND ACKNOWLEDGE
MOVE.B #0,CHIPRES(A1) ; CHANNEL.ANSWER_PRESENT:=0;
MOVE.B #$06,CHOACKNAK(A1) ; SET ACK
MOVE.B #$FF,CHINTRPT(A1) ; INTERRUPT IPC
* SIGNAL REQUESTOR
MOVE.L D0,D1
ADD.L CURRDRIV,D1 ; D1:=CURRDRIVÆDEVNOÅ
INT_SIGN <D1,COMPLETE>,A4
INTCHECK ; WHAT IF WAITING PROCESS HAVE BEEN ABORTED ??
ELSE ; UNSOLICITED MESSAGE
*
* WE HAVE AN ATTENTION: STORE STATUS IN LOCALDATA.ATT_STATUSÆDEV#Å,
* AND SIGNAL ATTENTION CONDITION FOR DEVICE
*
MOVE.B #$FF,LDATT(A5,D0) ; LDATTÆDEVNOÅ:=TRUE
MOVE.B #0,CHIPRES(A1) ; CHANNEL.ANSWER_PRESENT:=0
MOVE.B #$06,CHOACKNAK(A1) ; SET ACK IN CHANNEL
MOVE.B #$FF,CHINTRPT(A1) ; INTERRUPT IPC
MOVE.L D0,D1
ADD.L CURRDRIV,D1 ; D1:=CURRDRIVÆDEVNOÅ
INT_SIGN <D1,ATTCOND>,A4 ; INT_SIGNAL(DRIVERÆDEV#Å.ATTCOND,VECT#)
INTCHECK ; NOT NECESSARILY ANYONE WAITING?????
ENDI ; SOLICITED/UNSOLICITED
ENDI ; MESSAGE PRESENT
MOVEM.L (A7)+,D0-D7/A0-A6 ; RESTORE STACK AND REG'S
TRAP #8
BYTEADDR EQU * VIRS FUNC RETURNS THE ADDRESS OF ITS PARAMETER
MOVE.L (A7)+,A0 A0:= RETURN ADDRESS
MOVE.L (A7)+,D0 D0:= PARAMETER ADDRESS
MOVE.L D0,(A7) RESULT:= ADDRESS
JMP (A0) RETURN TO CALLER
END
«eof»