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

⟦10713c1b5⟧ TextFile

    Length: 11904 (0x2e80)
    Types: TextFile
    Names: »DRIVEXT.SA«

Derivation

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

TextFile

 
***********************************************************************
*                       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:=&REG'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»