Вы находитесь на странице: 1из 33

SENSOR IDNT 1,0

NOFORMAT
*******************************************************************************
* *
* This code derived from CSOS v1.13 SENSOR.DRV from IBM Instruments, *
* Inc., which holds the original copyright. SENSOR.DRV is supplied as *
* part of CSOS v1.13 Operating System Extensions or as part of CSOS v2.0 *
* as licensed material, all rights reserved by IBM Instruments, Inc. *
* *
* THIS SHOULD BE DISTRIBUTED ONLY TO LICENSEES OF CSOS, IBM INSTRUMENTS. *
* *
BRA.L ATSENS
HI1: DC.B 'Most of this code derives from SENSOR.DRV '
DC.B 'which is owned by IBM Instruments, Inc.',$0D
HI2: DC.B 'Copyright (c) IBM Instruments, Inc.',$0D
HI3: DC.B 'Additional code has been added and some modifications '
DC.B 'made, these are:',$0D
HI4: DC.B 'Copyright (c) 1986 Kevin G. Rhoads ',$0D
HI5: DC.B 'Permission to use, copy and distribute '
DC.B 'new & modified code is granted ',$0D
HI6: DC.B 'to IBM Instruments, Inc.'
LF: DC.B $0D
DC.W 0
*******************************************************************************
*
* CSOS convention passes return codes in D7, FORTRAN DIES if D7 smashed
* FORTRAN expects function return values in D0, this is written to be
* callable from FORTRAN - all registers but D0 saved, internally error
* codes are passed via D7, & moved to D0 prior to register restores.
* Any error codes returned by IOMGR8 or INTMGR are passed along.
*
* 0 return = success, any other means error
*
*
* ENTRY POINT DETAILS:
* All entry points test for sensor i/o board present & return -1.W if not
* and also test if attachment of the device in question is already done.
* All driver attach routines test to see if driver already present, &
* return with no error (but does generate on screen message) if already
* attached. The resident driver code portions are designed to be moved
* into memory acquired from the system memory pool (SYSM), attachment
* will fail if this pool is insufficiently large.
*
* entry points are:
*
* ATSENS - attaches all sensor i/o devices - at beginning, this is used
* as entry to entire code block if executed as a program & not called
* as subroutine - DOES CSOS v1.13 STYLE ATTACHment - code relocates
* resident portions of driver to memory acquired from SYSM memory pool
*
* QPIC5 - init sensor interrupt controller & attaches it to CSOS
*
* ATCHPP - does QPIC5 then PPATCH
* PPATCH - attaches parallel ports: #PPA00, #PPA01, #PPB00, #PPB01
*
* ATCHAD - does QPIC5 then ADATCH
* ADATCH - attaches ADC, LEDs, SWItches: #ADC0n, #LED0n, #SWI0n
*
* ATCHCT - does QPIC5 then CTATCH
* CTATCH - attaches counter timer channels: #CTC0n
*
* ATCHS0 - does QPIC5 then S0ATCH
* S0ATCH - attaches sensor serial port 0: #SER10
* ATCHS1 - does QPIC5 then S1ATCH
* S1ATCH - attaches sensor serial port 1: #SER11
* ATCHS2 - does QPIC5 then S2ATCH
* S2ATCH - attaches sensor serial port 2: #SER12
* ATCHS3 - does QPIC5 then S3ATCH
* S3ATCH - attaches sensor serial port 3: #SER13
*----------------------------------------------------------------------
ATSENS EQU *
ENTRY ATSENS
JSR HI_FOLKS(PC)
MOVEQ.L #0,D0
MOVE.L D0,RET_CODE_SAV ZERO OUT MERGED RETURN CODE
JSR QPIC5(PC) IS there PIC5 - or can we make it?
OR.L D0,RET_CODE_SAV
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.S NOT_IN_KANSAS initalize a non-existant board, but ...
JSR PPATCH(PC) OK - try attaching parallel ports
OR.L D0,RET_CODE_SAV
JSR ADATCH(PC)
OR.L D0,RET_CODE_SAV
JSR CTATCH(PC)
OR.L D0,RET_CODE_SAV
JSR S0ATCH(PC)
OR.L D0,RET_CODE_SAV
JSR S1ATCH(PC)
OR.L D0,RET_CODE_SAV
JSR S2ATCH(PC)
OR.L D0,RET_CODE_SAV
JSR S3ATCH(PC)
NOT_IN_KANSAS EQU *
OR.L RET_CODE_SAV(PC),D0
RTS
RET_CODE_SAVE DC.L 0
*
*----------------------------------------------------------------------
HI_FOLKS EQU *
MOVEM.L D0-D7/A0-A6,-(A7)
LEA.L LF(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L HI1(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L LF(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L HI2(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L LF(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L HI3(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L HI4(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L LF(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L HI5(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L HI6(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
LEA.L LF(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018
MOVEM.L (A7)+,D0-D7/A0-A6
RTS
*
*
SENBASE EQU $0F80500 SENSOR I/O board base address
PPJT_OFFSET EQU 532 $0214 these are offsets from beginning of
ADCJT_OFFSET EQU 4942 $134E driver RAM areas at which the jump
CTCJT_OFFSET EQU 254 $00FE tables are constructed
*
*----------------------------------------------------------------------
* The SENSOR I/O board has all interrupts vectored through VERSABUS/PLANAR
* BOARD interrupt level 5 (PIC5). In order to ATTACH DRIVERs for SENSOR
* board I/O devices, the sensor board must have had it's local interrupt
* controller chip initialized and made known to the resident CSOS
* INTerrupt manager. QPIC5 checks for presence of SENSOR I/O board
* and attaches PIC5 if necessary.
*
*
QPIC5 EQU *
ENTRY QPIC5
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0 INTO SUPERVISOR MODE
TRAP #05
DC.W $40E7 MOVE SR,-(A7) SAVE OLD SR
DC.L $007C0700 ORI.W $0700,SR MASK OFF INTERRUPTS
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S HAVE_IT
BRA.S EXIT
HAVE_IT EQU *
MOVEQ #032,D0 $20 bytes needed
BSR.L CHECK_GET_MEM SIZE NEEDED IN D0, ADDRESS RETURNED IN A0
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
MOVE.L A0,PIC5_CDB_ADDR USED FOR INTER. CONTROL
BSR.L PREP_PIC5
LEA.L IC_DONE,A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg*
CLR.W D7
*----------------------------------------------------------------------
* GENERALIZED EXIT - restore SR, copy return code (D7) to D0, restore
* registers and return
EXIT: DC.W $46DF MOVE (A7)+,SR restore old SR
MOVEQ.L #0,D0 clear all of D0
MOVE.W D7,D0 and load return word into D0.W
MOVEA.L #$FEDCBA,A0 BACK TO USER MODE
TRAP #5
SO_EXIT EQU *
MOVEM.L (A7)+,D1-D7/A0-A6 restore all registers (except D0)
RTS QPIC5 exit
*----------------------------------------------------------------------
INTCERR EQU *
CMPI.W #$5006,D7
BNE.S OK_DIE
LEA.L IC_ALREADY,A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg*
MOVEQ.L #0,D7
BRA.S RLSE_MEM
OK_DIE EQU *
MOVE.W D7,-(A7)
LEA IC_INIT_ERR_MES,A6 error initializing interrupt controller
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg*
MOVE.W (A7)+,D7
RLSE_MEM EQU *
MOVE.W D7,-(A7)
MOVEQ #006,D4 RELEASE MEM IF ERROR
MOVE.L #'SYSM',D5
LEA MEM_R_B,A6
TRAP #00 $0 SYSCALL MEM_MGR
DC.W +00057 MEM_MGR $0039
NOP DO NOT NEED ERROR BRANCH - INSERT TWO WORDS (NOP) INSTEAD
NOP
MOVE.W (A7)+,D7
MOVE.L (A7)+,D0 we were called by JSR - pop return addr. off stack
BRA.S EXIT
MEMERR: LEA ERRMESMEM,A6 NOT ABLE TO ACQUIRE MEMORY
MOVE.W D7,-(A7)
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg*
MOVE.W (A7)+,D7
BRA.S EXIT
*----------------------------------------------------------------------
* initialize sontrol block for PIC5 interrupt, make it known to the CSOS
* interrupt manager, if not already attached then do initialization of
* interrupt controller chip else release memory acquired for control block
*
PREP_PIC5: MOVEA.L PIC5_CDB_ADDR,A6
MOVE.L #'PIC5',+00004(A6) LOAD CDBCID
MOVE.L #$00000140,+00008(A6) LOAD EXCEPTION VECTOR BASE ADDR
MOVE.L #PIC5_INIT,+00012(A6) ADDR OF UIC INITIALIZATION ROUTINE
MOVE.L #$00F80503,+00016(A6) SENSOR INT CONT. COMMAND ADDRESS
MOVE.B #$05,+00030(A6) UIC HARDWARE INTERRUPT LEVEL
TRAP #07 $7 INTMGR OPNCTRLR
DC.W $8002
BRA.L INTCERR
MOVEA.L PIC5_CDB_ADDR,A1
BSR.L PIC5_INIT
MOVEA.L PIC5_CDB_ADDR,A0
MOVEA.L +00016(A0),A0
MOVE.B #$A5,(A0) SEND $A5 TO SENSOR INT. CONT. COMMAND REG.
RTS PREP_PIC5
*----------------------------------------------------------------------
* initialize interrupt controller chip and load vector address numbers
*
PIC5_INIT: MOVEA.L +00016(A1),A0
MOVE.B #$00,(A0) SEND 0 TO SENSOR INT. CONT. COMMAND REG.
MOVEA.L +00008(A1),A2 GET VECTOR ADDRESS INTO A2
MOVE.L A2,D0 GET VECTOR ADDRESS INTO D0
LSR.L #2,D0 SHIFT IT OVER TO VECTOR NUMBER
ADDQ.L #7,D0 actually eight contiguous vector numbers
CLR.L D2
MOVE.W #$0007,D2 move 7 into D2 (this is which vector number)
H_E2B4: MOVE.B #$E0,D1 $En where n = 7 downto 0 (load vector num
OR.B D2,D1 command for interrupt controller)
MOVE.B D1,(A0) SEND $En TO SENSOR INT. CONT. COMMAND REG.
MOVE.B D0,-00002(A0) SEND VECTOR NUMBER to INT. CONT. DATA REG.
SUBQ.B #1,D0 DECREMENT VECTOR NUMBER
DBF D2,H_E2B4 decr. until -1 (do 7 downto 0)
MOVE.B #$40,(A0) SEND $40 TO SENSOR INT. CONT. COMMAND REG.
MOVE.B #$B0,(A0) SEND $B0 TO SENSOR INT. CONT. COMMAND REG.
MOVE.B +00031(A1),-00002(A0) ?send hardware inter. level
RTS PIC5_INIT
*----------------------------------------------------------------------
* try to GETMEM from system memory pool (SYSM), length to get in D0
*
* if not enough memory - try to add memory to system memory pool (which
* won't work under CSOS 2.0, or if called from within a program - but
* will work if used as stand-alone program under CSOS v1.13)
*
* return length of acquired memory in D1 (0 if couldn't get)
* return address of acquired memory in A0
*
CHECK_GET_MEM EQU *
MOVE.L D0,NEWMEMSIZ
MOVEQ #007,D4 setup for INQMEM
MOVE.L #'SYSM',D5
LEA MIB,A6
TRAP #00 $0 SYSCALL MEM_MGR
DC.W +00057 MEM_MGR $0039
BRA.L MEMERR
MOVE.L NEWMEMSIZ,D0
MOVE.L MIBLCM,D1 LARGEST CONTIGUOUS FREE SIZE
CMP.L D0,D1
BHI.S ENOUGH_MEM
*
* not enough memory - tell system to get more! (1024 BYTE BLOCKS)
* NB. MODSYSM will not work under CSOS v2.0 - & it is unclear what
* will occur under CSOS v1.13 if this call is executed as part of
* a subroutine call from a program linked with the +M=0 option
*
ADDI.L #1024,D0
SUB.L D1,D0
LSR.L #8,D0
LSR.L #2,D0
TRAP #00 $0 SYSCALL MODSYSM
DC.W +00053 MODSYSM $0035
ENOUGH_MEM: MOVEQ #005,D4 setup for GETMEM
MOVE.L #'SYSM',D5
LEA MEM_R_B,A6
TRAP #00 $0 SYSCALL MEM_MGR
DC.W +00057 MEM_MGR $0039
BRA.L NO_MEM
MOVEA.L NEWMEMADR,A0
MOVE.L NEWMEMSIZ,D1
BSR.S CLEARMEM
RTS normal return from CHECK_GET_MEM
NO_MEM MOVEQ.L #0,D1
MOVEA.L D1,A0
RTS error return from CHECK_GET_MEM
*----------------------------------------------------------------------
* EXPECTS TARGET ADDRESS IN A0, BYTE COUNT IN D1 - PRESERVES BOTH
* fills memory with 0's
*
CLEARMEM EQU *
MOVEM.L D1/A0,-(A7)
SUBQ.L #1,D1
CLR_MEM_LOOP: CLR.B (A0)+
DBRA D1,CLR_MEM_LOOP
MOVEM.L (A7)+,D1/A0
RTS CLEARMEM
*#######################################################################
* storage and control blocks used by driver initialization code
*
DC.W +00008
DC.W $0004
PIC5_CDB_ADDR DC.L 0 (INT. CONTR. $20 LONG)
SER_INIT_EP_ADDR DC.L 0
SER_RAM_REQ DC.L 0
*SER10MPTR DC.L 0 PTR TO resident driver data & code
*SER11MPTR DC.L 0 PTR TO resident driver data & code
*SER12MPTR DC.L 0 PTR TO resident driver data & code
*SER13MPTR DC.L 0 PTR TO resident driver data & code
PP_CODEADR DC.L 0 stores address of relocated #PPxnn driver code
CTC_CODEADR DC.L 0 stores address of relocated #CTC0n driver code
ADC_CODEADR DC.L 0 stores address of relocated #ADC0n, #LED0n, #SWI0n code
MEM_R_B EQU * BEGIN MEMORY REQUEST BLOCK
DC.L $0 RESERVED
NEWMEMSIZ DC.L $0 SIZE GOES HERE
DC.L 0 ATTRIBUTES GO HERE: BIT0 =1 must be in 64k bound
NEWMEMADR DC.L $0 START ADDRESS GOES HERE
DC.L $317C2020 RESERVED
* END OF MEMORY REQUEST BLOCK
MIB EQU * BEGIN MEMORY INFORMATION BLOCK
DC.L 0 RESERVED
DC.L 3 MEM POOL ATTRIBUTES
* ATTRIBUTES BIT0=1-PROTECTED, BIT1=1 ALLOC HIGH TO LOW
DC.L 0 TOTAL MEMORY IN POOL
DC.L 0 TOTAL FREE
MIBLCM DC.L 0 LARGEST CONTIGUOUS FREE
* END OF MEMORY INFORMATION BLOCK
* Device Initialization Block for SYSIO OPEN calls - used by routine
* which tests for devices being already attached
DIB EQU *
DIBVOL DC.B '#PPA00'
DIBDTD DC.B 1
DIBTRN DC.B 0
DIBRSO DC.L 0,0
DIBOPT DC.W 0
DIBFCN DC.L 0
DIBBIO DC.L 0
* end of the DIB
* error and informative messages
IC_INIT_ERR_MES DC.B 'PIC5: ERROR initializing interrupt controller',$0D
IC_ALREADY DC.B 'PIC5: interrupt controller already attached',$0D
IC_DONE DC.B 'PIC5: interrupt controller successfully attached',$0D
ERRMESMEM DC.B 'ERROR: not able to acquire memory',$0D
ERRMESPAR DC.B 'ERROR ATTACHING PARALLEL PORT DRIVER',$0D
ERRMESADC DC.B 'ERROR ATTACHING A/D, SW, OR LED DRIVER',$0D
ERRMESCTC DC.B 'ERROR ATTACHING COUNTER/TIMER DRIVER',$0D
ERRSER10 DC.B 'ERROR ATTACHING #SER10',$0D
ERRSER11 DC.B 'ERROR ATTACHING #SER11',$0D
ERRSER12 DC.B 'ERROR ATTACHING #SER12',$0D
ERRSER13 DC.B 'ERROR ATTACHING #SER13',$0D
PP_DONEMESS DC.B 'SENSOR PARALLEL PORTS ARE NOW ATTACHED',$0D
PP_ALREADY DC.B 'SENSOR PARALLEL PORTS ALREADY ATTACHED',$0D
CT_DONEMESS DC.B 'SENSOR COUNTER TIMERS ARE NOW ATTACHED',$0D
CT_ALREADY DC.B 'SENSOR COUNTER TIMERS ALREADY ATTACHED',$0D
AD_DONEMESS DC.B 'SENSOR A/D CONVERTERS, LEDs & SWItches ATTACHED',$0D
AD_ALREADY DC.B 'SENSOR A/D CONVERTERS ALREADY ATTACHED',$0D
S0_DONEMESS DC.B 'SENSOR #SER10 PORT IS NOW ATTACHED',$0D
S0_ALREADY DC.B 'SENSOR #SER10 PORT ALREADY ATTACHED',$0D
S1_DONEMESS DC.B 'SENSOR #SER11 PORT IS NOW ATTACHED',$0D
S1_ALREADY DC.B 'SENSOR #SER11 PORT ALREADY ATTACHED',$0D
S2_DONEMESS DC.B 'SENSOR #SER12 PORT IS NOW ATTACHED',$0D
S2_ALREADY DC.B 'SENSOR #SER12 PORT ALREADY ATTACHED',$0D
S3_DONEMESS DC.B 'SENSOR #SER13 PORT IS NOW ATTACHED',$0D
S3_ALREADY DC.B 'SENSOR #SER13 PORT ALREADY ATTACHED',$0D
NO_SENS_ERR_MES DC.B 'THIS MACHINE DOES NOT HAVE ANY SENSOR I/O BOARDS.',$0D
DONEMESS DC.B 'ATTACH OF SENSOR I/O BOARD COMPLETE',$0D
*
*----------------------------------------------------------------------
* Is there a sensor board present? - IF NOT say so and leave!
* first save the BUS ERR vector and replace it, then try reading sensor
* parallel status/handshake registers (will cause bus err trap if no
* sensor board) adjust D7 and restore bus err vector
BUS_ERR_V DC.L 0
IS_SENSOR EQU *
MOVE.L $08,BUS_ERR_V SAVE BUS ERROR VECTOR
LEA.L NO_SENSOR(PC),A0
MOVE.L A0,$08
MOVEQ.L #0,D7 IF NO BUS ERROR TRAP - HAVE SENSOR
MOVE.B $0F80544,D6 ?READ SENSOR PARALLEL PORT's status
BRA.S IS_S_EXIT
NO_SENSOR EQU * GET HERE VIA BUS ERROR TRAP
ADDA.L #2,A7 first word is special data (p45 68000 man.)
MOVEA.L (A7)+,A0 next lword is address accessed when BUS ERR
CMPA.L #$0F80544,A0 is it sensor board address?
BEQ.S IS_COOL_ Yes, we have NO SENSOR BOARDs
* instruction execution should NEVER get here! - real bus error while testing
SUBA.L #6,A7 restore stack pointer to original position
MOVEA.L BUS_ERR_V,A0 get the address of CSOS bus error handler
JMP (A0) BYE!
IS_COOL_: MOVEQ.L #-1,D7 => NO SENSOR BOARD
ADDA.L #2,A7 skip stacked instruction register
LEA.L NEXT_(PC),A0 CHANGE STACKED PC to
MOVE.L A0,2(A7) now point to NEXT_
RTE continue processing from before
NEXT_: LEA.L NO_SENS_ERR_MES,A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg*
IS_S_EXIT EQU *
MOVE.L BUS_ERR_V,$08 RESTORE BUS ERROR VECTOR
RTS
*----------------------------------------------------------------------
* TRY OPENING - IF OK THEN DON'T LOAD DRIVER
* this routine expects the name of a device in D0.L and D1.W (6 chars)
* it will try to open it several times with a variety of logical unit
* numbers (LUNs) certain errors imply the presence of the device, as
* does a successful open - note and return; other errors or continued
* failure can indicate or suggest the device's absence - note and
* return
TRY_OPEN EQU *
MOVE.L D0,DIBVOL LOAD NAME
MOVE.W D1,DIBVOL+4
MOVE.L #142,D5 START WITH LUN 143
TRY__OPEN_AGAIN EQU *
CMPI.W #199,D5 UP TO LUN 199 - THEN TRY LOADING
BEQ.S NO_SO_LOAD_IT
LEA.L DIB(PC),A6 LOAD DIB ADDR FOR OPEN
EORI.W #$0040,DIBOPT-DIB(A6) ALTERNATE v1.0 & v1.1 STYLE OPENs
ADDQ.L #1,D5 INCREMENT LUN
TRAP #6 SYSIO
DC.W 1 OPEN
BRA.L OPEN_ERROR ? ERROR
BRA.S IS_SO_EXIT NO ERROR - IT EXISTS
OPEN_ERROR: CMPI.W #$8600,D7 device not found - go load it
BEQ.S NO_SO_LOAD_IT
CMPI.W #$8500,D7 duplicate LUN - try again
BEQ.S TRY__OPEN_AGAIN
CMPI.W #$8700,D7 not device owner => it exists
BEQ.S IS_SO_EXIT
CMPI.W #$8800,D7 already open => it exists
BEQ.S IS_SO_EXIT
CMPI.W #$8900,D7 device doesn't DO byte i/o => it exists
BEQ.S IS_SO_EXIT
CMPI.W #$8C00,D7 bad DIB field - fix & try again
BNE.S TRY__OPEN_AGAIN other error - try again
MOVE.W #0,DIBDTD-DIB(A6)
MOVE.L #0,DIBRSO-DIB(A6)
MOVE.L #0,DIBRSO-DIB+4(A6)
BRA.S TRY__OPEN_AGAIN
IS_SO_EXIT EQU *
MOVEA.L #0,A6 NO FUNC ON CLOSE
TRAP #6 SYSIO
DC.W 2 CLOSE LUN
NOP TWO NOPs IN PLACE OF BRA.L TO ERROR HANDLER
NOP
MOVEQ.L #0,D7 NO ERROR CODE FOR RETURN
BRA.S OK_EXIT BYE!
NO_SO_LOAD_IT EQU *
MOVEQ.L #1,D7
OK_EXIT RTS
*----------------------------------------------------------------------
* sensor parallel port attach routines
*
ATCHPP EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
PPATCH EQU *
ENTRY ATCHPP,PPATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#PPA',D0
MOVE.W #'00',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_PP
LEA.L PP_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVEQ.L #0,D7
BRA.L EXIT
NO_PP EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S PP_HAVE_IT
BRA.L EXIT
PP_HAVE_IT EQU *
* COMPUTE MEMORY REQUIREMENTS FOR PP
MOVE.L #(PP_END_DRIVER_CODE-PP_RELOC_BASE),D0 RESIDENT CODE REQs
ADDI.L #$2DA,D0 DRIVER STORAGE REQs (PP-2DA)
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
MOVE.L D1,PARLENMEM
MOVE.L A0,PARMEMPTR USED BY PARALLEL
ADDA.L #$000002DA,A0
MOVE.L A0,PP_CODEADR WHERE RESIDENT CODE GETS MOVED TO
MOVEM.L D0/A0-A1,-(A7)
MOVEA.L #PP_RELOC_BASE,A0
MOVEA.L PP_CODEADR,A1
MOVE.L #(END_PP_DRIVER_CODE-PP_RELOC_BASE),D0 CODElen $1582
PP_CODE_MOVE_LOOP: MOVE.W (A0)+,(A1)+ COPY THE RESIDENT CODE
SUBQ.L #2,D0
BNE.S PP_CODE_MOVE_LOOP
MOVEM.L (A7)+,D0/A0-A1
*DOES PARALLEL PORT ATTACH
ATCHPAR: CLR.W D7
MOVEA.L PARMEMPTR,A0
MOVEA.L PP_CODEADR,A5 ESTABLISH ADDRESSING FOR RELOCATED CODE
JSR PAR_INIT-PP_RELOC_BASE(A5)
TST.B D7
BEQ.S PP_ALLDONE
LEA ERRMESPAR,A6 ERROR ATTACHING PARALLEL PORT DRIVER
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
PP_ALLDONE: LEA PP_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD PAR PORTS DONE
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
CLR.W D7
BRA.L EXIT
*----------------------------------------------------------------------
* sensor counter timer attach routines
*
ATCHCT EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
CTATCH EQU *
ENTRY ATCHCT,CTATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#CTC',D0
MOVE.W #'00',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_CTC
LEA.L CT_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVEQ.L #0,D7
BRA.L EXIT
NO_CTC EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S CTC_HAVE_IT
BRA.L EXIT
CTC_HAVE_IT EQU *
MOVE.L #(CTC_END_DRIVER_CODE-CTC_RELOC_BASE),D0 RESIDENT CODE REQs
ADDI.L #$1C4,D0 DRIVER STORAGE REQs (CTC-1C4)
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
MOVE.L A0,CTCMEMPTR USED BY COUNTER TIMERS
MOVE.L D1,CTCLENMEM USED BY COUNTER TIMERS
ADDA.L #$000001C4,A0
MOVE.L A0,CTC_CODEADR WHERE RESIDENT CODE GETS MOVED TO
MOVEM.L D0/A0-A1,-(A7)
MOVEA.L #CTC_RELOC_BASE,A0
MOVEA.L CTC_CODEADR,A1
MOVE.L #(END_CTC_DRIVER_CODE-CTC_RELOC_BASE),D0 CODElen
CTC_MOVE_CODE_LOOP: MOVE.W (A0)+,(A1)+ COPY THE RESIDENT CODE
SUBQ.L #2,D0
BNE.S CTC_MOVE_CODE_LOOP
MOVEM.L (A7)+,D0/A0-A1
* DOES CTC ATTACH
CLR.W D7
MOVEA.L CTCMEMPTR,A0
MOVEA.L CTC_CODEADR,A5 ESTABLISH ADDRESSING FOR RELOCATED CODE
JSR CTC_INIT-CTC_RELOC_BASE(A5)
TST.B D7
BEQ.S CTC_ALLDONE
LEA ERRMESCTC,A6 ERROR ATTACHING COUNTER/TIMER DRIVER
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
CTC_ALLDONE: LEA CT_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD CTC DONE
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
CLR.W D7
BRA.L EXIT
*----------------------------------------------------------------------
* sensor a/d converter, led and switch driver attach routines
*
ATCHAD EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
ADATCH EQU *
ENTRY ATCHAD,ADATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#ADC',D0
MOVE.W #'00',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_ADC
LEA.L AD_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVEQ.L #0,D7
BRA.L EXIT
NO_ADC EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S ADC_HAVE_IT
BRA.L EXIT
ADC_HAVE_IT EQU *
MOVE.L #(ADC_END_DRIVER_CODE-ADC_RELOC_BASE),D0 RESIDENT CODE REQs
ADDI.L #$1474,D0 DRIVER STORAGE REQs (ADC-1C4)
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
MOVE.L A0,ADCMEMPTR USED BY A/D, LED, SWI
MOVE.L D1,ADCLENMEM USED BY A/D, LED, SWI
ADDA.L #$00001474,A0
MOVE.L A0,ADC_CODEADR WHERE RESIDENT CODE GETS MOVED TO
MOVEM.L D0/A0-A1,-(A7)
MOVEA.L #ADC_RELOC_BASE,A0
MOVEA.L ADC_CODEADR,A1
MOVE.L #(END_ADC_DRIVER_CODE-ADC_RELOC_BASE),D0 CODElen
ADC_MOVE_CODE_LOOP: MOVE.W (A0)+,(A1)+ COPY THE RESIDENT CODE
SUBQ.L #2,D0
BNE.S ADC_MOVE_CODE_LOOP
MOVEM.L (A7)+,D0/A0-A1
* DOES ADC ATTACH
CLR.W D7
MOVEA.L ADCMEMPTR,A0
MOVEA.L ADC_CODEADR,A5 ESTABLISH ADDRESSING FOR RELOCATED CODE
JSR ADC_INIT-ADC_RELOC_BASE(A5)
TST.B D7
BEQ.S ADC_ALLDONE
LEA ERRMESADC,A6 ERROR ATTACHING ADC/LED/SWI DRIVER
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
ADC_ALLDONE: LEA AD_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD ADC DONE
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
CLR.W D7
BRA.L EXIT
*----------------------------------------------------------------------
* sensor serial port 0 (#SER10) attach routines
*
ATCHS0 EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
S0ATCH EQU *
ENTRY ATCHS0,S0ATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#SER',D0
MOVE.W #'10',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_S0
LEA.L S0_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVEQ.L #0,D7
BRA.L EXIT
NO_S0 EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S S0_HAVE_IT
BRA.L EXIT
S0_HAVE_IT EQU *
* COMPUTE MEMORY REQUIREMENTS FOR S0
TRAP #00 $0 SYSCALL GETSENS
DC.W +00067 GETSENS $0043
* D3.L = RS-232 RAM REQUIREMENT A3.L = RS-232 DRIVER INITIALIZATION CODE
MOVE.L A3,SER_INIT_EP_ADDR
MOVE.L D3,SER_RAM_REQ
MOVE.L SER_RAM_REQ,D0
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
* MOVE.L A0,SER10MPTR
*DOES SER10 ATTACH
CLR.W D7
* MOVEA.L SER10MPTR,A0
MOVEA.L SER_INIT_EP_ADDR,A5 ESTABLISH ADDRESSING
MOVE.W #'10',D1
JSR (A5)
TST.B D7
BEQ.S S0_ALLDONE
LEA ERRSER10,A6 ERROR ATTACHING SENSOR #SER10
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
S0_ALLDONE: LEA S0_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD #SER10
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
CLR.W D7
BRA.L EXIT
*----------------------------------------------------------------------
* sensor serial port 1 (#SER11) attach routines
*
ATCHS1 EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
S1ATCH EQU *
ENTRY ATCHS1,S1ATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#SER',D0
MOVE.W #'11',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_S1
LEA.L S1_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVEQ.L #0,D7
BRA.L EXIT
NO_S1 EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S S1_HAVE_IT
BRA.L EXIT
S1_HAVE_IT EQU *
* COMPUTE MEMORY REQUIREMENTS FOR S1
TRAP #00 $0 SYSCALL GETSENS
DC.W +00067 GETSENS $0043
* D3.L = RS-232 RAM REQUIREMENT A3.L = RS-232 DRIVER INITIALIZATION CODE
MOVE.L A3,SER_INIT_EP_ADDR
MOVE.L D3,SER_RAM_REQ
MOVE.L SER_RAM_REQ,D0
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
* MOVE.L A0,SER11MPTR
*DOES SER11 ATTACH
CLR.W D7
* MOVEA.L SER11MPTR,A0
MOVEA.L SER_INIT_EP_ADDR,A5 ESTABLISH ADDRESSING
MOVE.W #'11',D1
JSR (A5)
TST.B D7
BEQ.S S1_ALLDONE
LEA ERRSER11,A6 ERROR ATTACHING SENSOR #SER11
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
S1_ALLDONE: LEA S1_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD #SER11
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
CLR.W D7
BRA.L EXIT
*----------------------------------------------------------------------
* sensor serial port 2 (#SER12) attach routines
*
ATCHS2 EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
S2ATCH EQU *
ENTRY ATCHS2,S2ATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#SER',D0
MOVE.W #'12',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_S2
LEA.L S2_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVEQ.L #0,D7
BRA.L EXIT
NO_S2 EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S S2_HAVE_IT
BRA.L EXIT
S2_HAVE_IT EQU *
* COMPUTE MEMORY REQUIREMENTS FOR S2
TRAP #00 $0 SYSCALL GETSENS
DC.W +00067 GETSENS $0043
* D3.L = RS-232 RAM REQUIREMENT A3.L = RS-232 DRIVER INITIALIZATION CODE
MOVE.L A3,SER_INIT_EP_ADDR
MOVE.L D3,SER_RAM_REQ
MOVE.L SER_RAM_REQ,D0
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
* MOVE.L A0,SER12MPTR
*DOES SER12 ATTACH
CLR.W D7
* MOVEA.L SER12MPTR,A0
MOVEA.L SER_INIT_EP_ADDR,A5 ESTABLISH ADDRESSING
MOVE.W #'12',D1
JSR (A5)
TST.B D7
BEQ.S S2_ALLDONE
LEA ERRSER12,A6 ERROR ATTACHING SENSOR #SER12
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $012
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
S2_ALLDONE: LEA S2_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD #SER12
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0012
CLR.W D7
BRA.L EXIT
*----------------------------------------------------------------------
* sensor serial port 3 (#SER13) attach routines
*
ATCHS3 EQU *
JSR QPIC5(PC)
CMPI.W #$FFFF,D0 NO sensor board! Maybe Glinda can
BEQ.L NOT_IN_KANSAS initalize a non-existant board, but ...
S3ATCH EQU *
ENTRY ATCHS3,S3ATCH
MOVEM.L D1-D7/A0-A6,-(A7)
MOVEA.L #$00ABCDEF,A0
TRAP #05
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W $0700,SR
MOVE.L #'#SER',D0
MOVE.W #'13',D1
JSR TRY_OPEN(PC)
TST.W D7
BNE.S NO_S3
LEA.L S3_ALREADY(PC),A6
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $013
MOVEQ.L #0,D7
BRA.L EXIT
NO_S3 EQU *
JSR IS_SENSOR ? is there a SENSOR board in the house ?
TST.W D7
BEQ.S S3_HAVE_IT
BRA.L EXIT
S3_HAVE_IT EQU *
* COMPUTE MEMORY REQUIREMENTS FOR S3
TRAP #00 $0 SYSCALL GETSENS
DC.W +00067 GETSENS $0043
* D3.L = RS-232 RAM REQUIREMENT A3.L = RS-232 DRIVER INITIALIZATION CODE
MOVE.L A3,SER_INIT_EP_ADDR
MOVE.L D3,SER_RAM_REQ
MOVE.L SER_RAM_REQ,D0
JSR CHECK_GET_MEM
CMP.L #0,D1 SIZE GOTTEN IN D1 -> 0 = couldn't get mem
BEQ.L MEMERR
* MOVE.L A0,SER13MPTR
*DOES SER13 ATTACH
CLR.W D7
* MOVEA.L SER13MPTR,A0
MOVEA.L SER_INIT_EP_ADDR,A5 ESTABLISH ADDRESSING
MOVE.W #'13',D1
JSR (A5)
TST.B D7
BEQ.S S3_ALLDONE
LEA ERRSER13,A6 ERROR ATTACHING SENSOR #SER13
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $013
MOVE.W #-1,D7
JSR RLSE_MEM(PC)
BRA.L EXIT
S3_ALLDONE: LEA S3_DONEMESS,A6 ATTACH OF SENSOR I/O BOARD #SER13
TRAP #00 $0 SYSCALL PrtMsg*
DC.W +00018 PrtMsg* $0013
CLR.W D7
BRA.L EXIT
************************************************************************
PP_RELOC_BASE EQU *
* STUFF FROM HERE TO END_DRIVER_CODE IS COPIED TO ACQUIRED MEMORY & IS
* RESIDENT PORTION OF DRIVER
DC.W $0000
PPERR_MES_TABLE DC.B $10,'DEVICE LOCKED',$0D
DC.B $11,'DEVICE ALREADY SHARED OPENED',$0D
DC.B $12,'A/D OVERRANGE',$0D
DC.B $13,'TIMER OVERRUN',$0D
DC.B $14,'ILLEGAL OPEN MODE',$0D
DC.W $0000
PARMEMPTR DC.L 0 PTR TO resident driver data & code (PAR $2DA LONG)
PARLENMEM DC.L 0 LEN OF resident driver data & code (PAR $2DA LONG)
PP_JT_OFFSETS EQU * OFFSETS FOR CONSTRUCTING PP DRIVER JUMP TABLE
DC.W PP_OPEN-PPJT_LOOP $01A0 OPEN
DC.W PP_CANCEL-PPJT_LOOP $05B6 CANCEL
DC.W PP_READ-PPJT_LOOP $02FC READ
DC.W PP_WRITE-PPJT_LOOP $0376 WRITE
DC.W PP_FUNC-PPJT_LOOP $0626 FUNC
DC.W PP_BWRITE-PPJT_LOOP $0428 BWRITE
DC.W PP_BREAD-PPJT_LOOP $03EE BREAD
DC.W PP_CLOSE-PPJT_LOOP $05F4 CLOSE
DC.W PP_BTEST-PPJT_LOOP $06C8 BTEST
DC.W PP_DT_DRV-PPJT_LOOP DTACHDRV
DC.W PP_AT_DEV-PPJT_LOOP ATACHDEV
DC.W PP_DT_DEV-PPJT_LOOP DTACHDEV
PP_DAT DC.B '#PPA00'
DCB.W 00005,+00000 $0000
DC.W $00B8,0
DC.W $012C,$0400
DC.W $0000,-1 $0000 FFFF
DC.W -00100 $FF9C
DC.W $0406,$0507 $0406 0507
DC.L $0F80546
DC.L $0F80540
DC.B '#PPB00'
DCB.W 00005,+00000 $0000
DC.W $0044,0 $0044 0000
DC.W $01A0,$0400 $01A0
DC.W $0000,-1 $0000 FFFF
DC.W -00094 $FFA2
DC.W $0202,$0101 $0202 0101
DC.L $0F80546
DC.L $0F80542
DC.B '#PPA01'
DCB.W 00005,+00000 $0000
DC.W $01A0,0 $01A0 0000
DC.W $0044,$0400 $0044 0400
DC.W $0000,-1 $0000 FFFF
DC.W -00100 $FF9C
DC.W $0406,$0507 $0406 0507
DC.L $0F80547
DC.L $0F80541
DC.B '#PPB01'
DCB.W 00005,+00000 $0000
DC.W $012C,$0000 $012C 0000
DC.W $00B8,$0400
DC.W $0000,-1
DC.W -00094 $FFA2
DC.W $0202,$0101 $0202 0101
DC.L $0F80547
DC.L $0F80543
OR.L D4,(A1)+ $8999 $00EEB4
ORI.L #$B9C9898B,+00141(A1) $00A9 $00EEB6
SBCD D0,D7 $8F00 $00EEBE
PAR_INIT: MOVEM.L D0-D6/A0-A6,-(A7)
LEA +00068(A0),A6
LEA PP_JT_OFFSETS(PC),A2
LEA PPJT_OFFSET(A0),A1 532 $214
MOVE.W #$000B,D0 11 ITEMS IN JUMP TABLE
PPJT_LOOP: MOVE.W (A2)+,D1 CONSTRUCT JUMP TABLE
LEA PPJT_LOOP(PC,D1.W),A3
MOVE.L A3,(A1)+
DBF D0,PPJT_LOOP
LEA -00068(A6),A3 A3 = PP IBD ADDRESS
LEA PPJT_OFFSET(A0),A4 A4 = PP JUMP TABLE ADDRESS 532 $214
LEA +00026(A0),A1
LEA PP_DAT(PC),A2 @EE0C
MOVEQ #003,D1 $03
PP_PDB_INIT_LOOP: MOVE.L (A2)+,+00004(A6) PDBNAM
MOVE.W (A2)+,+00008(A6)
MOVE.L A1,+00112(A6)
MOVE.L A4,+00034(A6) PDBMGR
LEA PPERR_MES_TABLE(PC),A5
MOVE.L A5,+00010(A6) PDBMSG
MOVE.B #$20,+00047(A6) PDBATT
MOVE.W #$0023,D0
LEA +00076(A6),A5
PP_F18: MOVE.B (A2)+,(A5)+
DBF D0,PP_F18
LEA PP_F18(PC),A5
MOVE.L A5,D0
ADD.L D0,+00096(A6)
MOVE.L A0,D0
ADD.L D0,+00084(A6)
ADD.L D0,+00088(A6)
BTST #00,D1
BNE.S PP_F40
EXG A1,A6
BSR.L SUB_F03C
EXG A1,A6
PP_F40: TRAP #08 $8 IOMGR8 ATACHPDB
DC.W +00001 ATCHPBD
BRA.L PP_SYS_INIT_ERR
ADDA.W #$0074,A6 increment to beginning of next PDB
DBF D1,PP_PDB_INIT_LOOP
MOVE.W #$2500,+00004(A3) IDBHIL IDB FOR PP PORTS
MOVE.B #$00,+00007(A3) IDBDVM
LEA +00730(A0),A6
MOVE.L A6,+00022(A3) IDBSTK
LEA PP_INT_SERV(PC),A6
MOVE.L A6,+00008(A3) IDBSRA
MOVE.B #$03,+00012(A3) IDBLIL
MOVE.L #'PP00',+00014(A3) IDBDID
MOVE.L #'PIC5',+00018(A3) IDBCID
MOVEA.L A3,A6
TRAP #07 $7 INTMGR OPNDEVI
DC.W $8000 -32768
BRA.L PP_SYS_INIT_ERR
CLR.B D7
PP_INIT_EXIT: MOVEM.L (A7)+,D0-D6/A0-A6
RTS
PP_SYS_INIT_ERR EQU *
DC.W $1E3C,$FFFF ?MOVE.B #$FF,D7
BRA.S PP_INIT_EXIT
SUB_EF9A: MOVE.B #$09,D7
MOVE.W +00010(A2),D1
CMPI.W #+036,+00014(A3)
BLT.S PP_FC4
BTST #00,+00007(A2)
BNE.S PP_FCC
BTST #00,D1
BNE.S PP_FCC
ADDQ.W #2,D1
BCS.S PP_FCC
PP_FBC: CMP.W +00008(A2),D1
BHI.S PP_FCC
BRA.S PP_FCA
PP_FC4: ADDQ.W #1,D1
BCS.S PP_FCC
BRA.S PP_FBC
PP_FCA: CLR.B D7
PP_FCC: RTS
SUB_EFCE EQU *
PP_FCE: MOVE.W D0,-(A7)
CMPI.W #+032,D0
BGE.S PP_FDC
MOVEQ #001,D3
PP_FD8: LSL.L D0,D3
BRA.S PP_FFE
PP_FDC: CMPI.W #+036,D0
BGE.S PP_FF0
MOVE.L #$000000FF,D3
SUBI.W #+032,D0
LSL.W #3,D0
BRA.S PP_FD8
PP_FF0: MOVE.L #$0000FFFF,D3
CMPI.W #+036,D0
BEQ.S PP_FFE
SWAP D3
PP_FFE: MOVE.W (A7)+,D0
RTS
SUB_F002: MOVEM.L D0/A0,-(A7)
MOVE.B +00100(A1),D0
PP_00A: ADD.B D0,D0
ORI.B #+001,D0
PP_010: MOVEA.L +00104(A1),A0
MOVE.B D0,(A0)
MOVEM.L (A7)+,D0/A0
RTS SUB_F002
SUB_F01C: MOVEM.L D0/A0,-(A7)
MOVE.B +00101(A1),D0
BRA.S PP_00A
SUB_F026: MOVEM.L D0/A0,-(A7)
MOVE.B +00100(A1),D0
PP_02E: ADD.B D0,D0
BRA.S PP_010
SUB_F032: MOVEM.L D0/A0,-(A7)
MOVE.B +00101(A1),D0
BRA.S PP_02E
SUB_F03C: MOVEM.L D0-D2/A0-A2,-(A7)
MOVE.B +00092(A1),D0
EXT.W D0
MOVEA.L +00096(A1),A0
MOVE.B +000(A0,D0.W),D1
BEQ.S PP_06A
MOVEA.L +00084(A1),A0
MOVE.B +00092(A0),D0
EXT.W D0
MOVEA.L +00096(A0),A2
OR.B +000(A2,D0.W),D1
MOVEA.L +00104(A1),A2
MOVE.B D1,(A2)
BRA.S PP_06E
PP_06A: DC.L $003C0001 ORI #1,CCR
PP_06E: MOVEM.L (A7)+,D0-D2/A0-A2
RTS
F074 EQU *
PP_OPEN: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
CLR.W +00016(A3)
TST.L +00018(A2)
BEQ.S PP_090
MOVEA.L +00018(A2),A6 LOAD FUNPKT LIST ADDR IN A6
BSR.L SUB_PP_FUNC
TST.B D7
BNE.L PP_O_RET FUNC CODE ERROR - RETURN
PP_090: BTST #07,+00016(A2)
BEQ.S PP_09E
MOVE.W +00016(A2),+00016(A3)
PP_09E: BCLR #00,+00017(A3)
BTST #00,+00007(A2)
BEQ.S PP_0B2
BSET #00,+00017(A3)
PP_0B2: BTST #01,+00016(A3)
BEQ.S PP_0E6
BTST #06,+00016(A3)
BEQ.L PP_ILL_O ILLEGAL OPEN MODE
MOVE.B +00016(A3),D0
ANDI.W #+056,D0
LSR.W #3,D0
CMPI.B #+065,+00007(A1)
BEQ.S PP_0DA
ADDI.W #+016,D0
PP_0DA: CMPI.B #+048,+00009(A1)
BEQ.S PP_11C
ADDQ.W #8,D0
BRA.S PP_11C
PP_0E6: BTST #02,+00016(A3)
BEQ.S PP_106
MOVEQ #036,D0
CMPI.B #+065,+00007(A1)
BEQ.S PP_0FA
ADDQ.W #1,D0
PP_0FA: CMPI.B #+048,+00009(A1)
BNE.L PP_ILL_O ILLEGAL OPEN MODE
BRA.S PP_11C
PP_106: MOVEQ #032,D0
CMPI.B #'A',+00007(A1)
BEQ.S PP_112
ADDQ.W #2,D0 NOT PORT A - ADD 2 TO BASE ADDR
PP_112: CMPI.B #'0',+00009(A1)
BEQ.S PP_11C
ADDQ.W #1,D0 NOT SUBPORT 0 ADD 1 TO BASE ADDR
PP_11C: MOVE.W D0,+00014(A3)
CLR.W D1
BTST #06,+00016(A3)
BNE.S PP_12C
MOVEQ #003,D1
PP_12C: ADD.B +00006(A2),D1
BSR.L SUB_EFCE
MOVEA.L +00112(A1),A5
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W #+01792,SR
TST.B +000(A5,D0.W)
* 0(A5,D0.W) contains open count -- NEG VALUE = NON-SHARE OPEN
BEQ.S PP_160
BLT.L PP_LCKED DEVICE LOCKED
BTST #00,+00016(A3)
BEQ.L PP_AL_O_POP_SR ALREADY OPEN
CMP.W +00092(A1),D1
BNE.L PP_IL_O_POP_SR ILLEGAL OPEN
PP_15A: ADDQ.B #1,+000(A5,D0.W)
* 0(A5,D0.W) contains open count -- NEG VALUE = NON-SHARE OPEN
BRA.S PP_O_POP_SR_RET RETURN & POP SR
PP_160: MOVE.L +00038(A5),D5
AND.L D3,D5
BNE.L PP_ALR_O ALREADY OPEN
CMP.B +00092(A1),D1
BEQ.S PP_19C
MOVE.B D1,+00092(A1)
BSR.L SUB_F03C
BCC.L PP_186
MOVE.B #$01,+00092(A1)
BRA.L PP_IL_O_POP_SR ILLEGAL OPEN
PP_186: CMPI.W #+036,D0
BLT.S PP_19C
MOVE.L A1,-(A7)
MOVEA.L +00088(A1),A1
MOVE.B D1,+00092(A1)
BSR.L SUB_F03C
MOVEA.L (A7)+,A1
PP_19C: OR.L D3,+00038(A5)
BTST #00,+00016(A3)
BNE.S PP_15A
DC.W $1BBC,-1,0000 ?MOVE.B #$FF,0(A5,D0.W)
* 0(A5,D0.W) contains open count -- NEG VALUE = NON-SHARE OPEN
PP_O_POP_SR_RET EQU *
DC.W $46DF MOVE (A7)+,SR
PP_O_RET: RTS
PP_ILL_O: MOVE.B #$14,D7 ERROR CODE: ILLEGAL OPEN MODE
BRA.S PP_O_RET
PP_ALR_O: MOVE.B #$11,D7 ERROR CODE: DEVICE ALREADY OPEN
BRA.S PP_O_POP_SR_RET
PP_IL_O_POP_SR: MOVE.B #$14,D7 ERROR CODE: ILLEGAL OPEN MODE
BRA.S PP_O_POP_SR_RET
PP_LCKED: MOVE.B #$10,D7 ERROR CODE: DEVICE LOCKED
BRA.S PP_O_POP_SR_RET
PP_AL_O_POP_SR: MOVE.B #$11,D7 ERROR CODE: DEVICE ALREADY OPEN
BRA.S PP_O_POP_SR_RET
PP_READ: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
BSR.L SUB_EF9A
TST.B D7
BNE.S PP_248
MOVE.B +00092(A1),D0
CMPI.B #+005,D0
BEQ.S PP_21A
CMPI.B #+004,D0
BEQ.S PP_21A
CMPI.B #+001,D0
BNE.S PP_244
CLR.L D1
MOVE.W +00010(A2),D1
ADD.L +00004(A2),D1
MOVEA.L D1,A6
MOVEA.L +00108(A1),A5
CMPI.W #+036,+00014(A3)
BLT.S PP_212
MOVE.W (A5),(A6)
ADDQ.W #2,+00010(A2)
BRA.S PP_248
PP_212: MOVE.B (A5),(A6)
ADDQ.W #1,+00010(A2)
BRA.S PP_248
PP_21A: DC.W $46FC,$2500 MOVE #$2500,SR
BCLR #00,+00094(A1)
BNE.S PP_23E
MOVE.L A4,+00076(A1)
BSR.L SUB_F002
TRAP #08 $8 IOMGR8 ?WAIT
DC.W +00004 ?WAIT
BRA.L PP_2C0
PP_236: BCLR #00,+00094(A1)
BEQ.S PP_248
PP_23E: MOVE.W #$000D,D7 ERROR CODE: REQUEST CANCELLED
BRA.S PP_248
PP_244: MOVE.B #$60,D7 ERROR CODE: CANNOT READ - DIBDTD SPECIFIED OUTPUT
PP_248: RTS
PP_WRITE: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
BSR.L SUB_EF9A
TST.B D7
BNE.S PP_2C0
MOVE.B +00092(A1),D0
CMPI.B #+003,D0
BEQ.S PP_292
CMPI.B #+005,D0
BEQ.S PP_292
TST.B D0
BNE.S PP_2BC
CLR.L D1
MOVE.W +00010(A2),D1
ADD.L +00004(A2),D1
MOVEA.L D1,A6
MOVEA.L +00108(A1),A5
CMPI.W #+036,+00014(A3)
BLT.S PP_28A
MOVE.W (A6),(A5)
ADDQ.W #2,+00010(A2)
BRA.S PP_2C0
PP_28A: MOVE.B (A6),(A5)
ADDQ.W #1,+00010(A2)
BRA.S PP_2C0
PP_292: DC.W $46FC,$2500 MOVE #$2500,SR
BCLR #01,+00094(A1)
BNE.S PP_2B6
MOVE.L A4,+00080(A1)
BSR.L SUB_F01C
TRAP #08 $8 IOMGR8 +00004
DC.W +00004 ?SIGNAL
BRA.L PP_2C0
BCLR #01,+00094(A1)
BEQ.S PP_2C0
PP_2B6: MOVE.W #$000D,D7 ERROR CODE: REQUEST CANCELLED
BRA.S PP_2C0
PP_2BC: MOVE.B #$67,D7 ERROR CODE: CANNOT WRITE DIBDTD SPECIFIED INPUT
PP_2C0: RTS
PP_BREAD: MOVE.W D2,-(A7)
MOVEA.L +00108(A1),A0
MOVE.B +00092(A1),D1
CMPI.B #+003,D1
BGE.S PP_2F4
ANDI.B #+003,D1
BEQ.S PP_2F4
MOVE.B (A0),D0
MOVE.W +00014(A3),D1
CMPI.W #+032,D1
BGE.S PP_2F8
PP_2E4: MOVE.W D1,D2
SUBI.W #+008,D1
BPL.S PP_2E4
ROR.B D2,D0
ANDI.B #+001,D0
BRA.S PP_2F8
PP_2F4: MOVE.B #$66,D7 ERROR CODE: BREAD NOT SUPPORTED BY DRIVER
PP_2F8 MOVE.W (A7)+,D2
RTS
PP_BWRITE: MOVE.W D2,-(A7)
MOVEA.L +00108(A1),A0
MOVE.B +00092(A1),D1
CMPI.B #+003,D1
BGE.S PP_33C
BTST #00,D1
BNE.S PP_33C
MOVE.W +00014(A3),D1
CMPI.W #+032,D1
BLT.S PP_322
MOVE.B D0,+00093(A1)
BRA.S PP_336
PP_322: MOVE.W D1,D2
SUBI.W #+008,D1
BPL.S PP_322
BSET D2,+00093(A1)
TST.B D0
BNE.S PP_336
BCLR D2,+00093(A1)
PP_336: MOVE.B +00093(A1),(A0)
BRA.S PP_340
PP_33C: MOVE.B #$65,D7 ERROR CODE: BWRITE NOT SUPPORTED BY DRIVER
PP_340: MOVE.W (A7)+,D2
RTS
PP_INT_SERV: MOVEM.L D0-D7/A0-A6,-(A7)
LEA +00068(A1),A1
LEA +00464(A1),A0
PP_350: TST.L +00076(A1)
BEQ.S PP_35E
BSR.L SUB_F026
BSR.L SUB_F39A
PP_35E: TST.L +00080(A1)
BEQ.S PP_36C
BSR.L SUB_F032
BSR.L SUB_F418
PP_36C: ADDA.W #$0074,A1
CMPA.L A0,A1
BNE.S PP_350 ABS:$00F350
LEA -00464(A1),A1
PP_378: TST.L +00076(A1)
BEQ.S PP_382
BSR.L SUB_F002
PP_382: TST.L +00080(A1)
BEQ.S PP_38C
BSR.L SUB_F01C
PP_38C: ADDA.W #$0074,A1
CMPA.L A0,A1
BNE.S PP_378
MOVEM.L (A7)+,D0-D7/A0-A6
DC.W +20083 RTE
SUB_F39A: MOVEA.L +00104(A1),A6
MOVE.B +00102(A1),D0
BTST D0,-00002(A6)
BEQ.S PP_416
MOVEA.L +00076(A1),A4
MOVEA.L +00012(A4),A3
MOVEA.L +00018(A4),A2
CLR.L D0
MOVE.W +00010(A2),D0
ADD.L +00004(A2),D0
MOVEA.L D0,A5
MOVEA.L +00108(A1),A6
CMPI.W #+036,+00014(A3)
BGE.S PP_3D2
MOVE.B (A6),D0
MOVE.B D0,(A5)+
BRA.S PP_3D8
PP_3D2: MOVE.W (A6),D0
MOVE.W D0,(A5)+
BRA.S PP_3F6
PP_3D8: BTST #00,+00017(A3)
BEQ.S PP_3F6
CMP.B +00001(A2),D0
BHI.S PP_3F6
CMP.B +00002(A2),D0
BCS.S PP_3F6
SUBA.L +00004(A2),A5
MOVE.W A5,+00010(A2)
BRA.S PP_406
PP_3F6: SUBA.L +00004(A2),A5
MOVE.W A5,D0
MOVE.W D0,+00010(A2)
CMP.W +00008(A2),D0
BCS.S PP_416
PP_406: CLR.L +00076(A1)
PP_40A: MOVE.L A1,-(A7)
TRAP #08 $8 IOMGR8 +00003
DC.W +00003 ?SIGNAL
NOP
NOP
MOVEA.L (A7)+,A1
PP_416: RTS
SUB_F418: MOVEA.L +00104(A1),A6
MOVE.B +00103(A1),D0
BTST D0,-00002(A6)
BEQ.S PP_416
MOVEA.L +00080(A1),A4
MOVEA.L +00012(A4),A3
MOVEA.L +00018(A4),A2
CLR.L D0
MOVE.W +00010(A2),D0
ADD.L +00004(A2),D0
MOVEA.L D0,A5
MOVEA.L +00108(A1),A6
CMPI.W #+036,+00014(A3)
BGE.S PP_450
MOVE.B (A5)+,D0
MOVE.B D0,(A6)
BRA.S PP_456
PP_450: MOVE.W (A5)+,D0
MOVE.W D0,(A6)
BRA.S PP_474
PP_456: BTST #00,+00017(A3)
BEQ.S PP_474
CMP.B +00001(A2),D0
BHI.S PP_474
CMP.B +00002(A2),D0
BCS.S PP_474
SUBA.L +00004(A2),A5
MOVE.W A5,+00010(A2)
BRA.S PP_484
PP_474: SUBA.L +00004(A2),A5
MOVE.W A5,D0
MOVE.W D0,+00010(A2)
CMP.W +00008(A2),D0
BCS.S PP_416
PP_484 CLR.L +00080(A1)
BRA.S PP_40A
PP_CANCEL: DC.W $46FC,$2500 MOVE #$2500,SR
MOVE.W #$0061,D7 ERROR CODE: CANCEL FAILED
CMPA.L +00076(A1),A4
BNE.S PP_4A8
CLR.L +00076(A1)
BSET #00,+00094(A1)
BSR.L SUB_F026
BRA.S PP_4BC
PP_4A8: CMPA.L +00080(A1),A4
BNE.S PP_4C6
CLR.L +00080(A1)
BSET #01,+00094(A1)
BSR.L SUB_F032
PP_4BC: CLR.W D7
TRAP #08 $8 IOMGR8 +00003
DC.W +00003 ?SIGNAL
NOP
NOP
PP_4C6: RTS
PP_CLOSE: MOVEA.L +00112(A1),A5
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
MOVE.W +00014(A3),D0
BSR.L SUB_EFCE
NOT.L D3
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W #+01792,SR
AND.L D3,+00038(A5)
SUBQ.B #1,+000(A5,D0.W)
BPL.S PP_4EA
CLR.B +000(A5,D0.W)
PP_4EA: DC.W $46DF MOVE (A7)+,SR
RTS
PP_FUN_OFF_TBL EQU * PP FUNC DISPATCH TABLE CODE OFFSETS
DC.W PP_F_0-PP_FUNCS $0080 $F59A FUNC0 ENDLIST
DC.W PP_F_1-PP_FUNCS $0000 $F51A FUNC1
DC.W PP_F_2-PP_FUNCS $001C $F536 FUNC2
DC.W PP_F_3-PP_FUNCS $0030 $F54A FUNC3
DC.W PP_F_4-PP_FUNCS $0042 $F55C FUNC4
DC.W PP_F_5-PP_FUNCS $0054 $F56E FUNC5
PP_FUNC: MOVEA.L +00018(A4),A6
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
SUB_PP_FUNC: MOVE.L A6,D4
PP_F_MORE: MOVE.W (A6)+,D3
BEQ.L PP_F_0
*** PATCH 0A - 1/7/86 -- correct func. code limit checking
CMPI.W #+05,D3 was 15, should have been 5
*** PATCH 0A - 1/7/86 -- correct func. code limit checking
BHI.L PP_F_BAD
LSL.W #1,D3
MOVEA.W PP_FUN_OFF_TBL(PC,D3.W),A5
JSR PP_FUNCS(PC,A5.W)
BRA.S PP_F_MORE
PP_FUNCS EQU *
PP_F_1: MOVE.W (A6)+,D1 PPs FUNC 1 =
BCLR #00,+00017(A3)
CMPI.W #+000,D1
BEQ.S PP_F1_ZERO
BSET #00,+00017(A3)
CMPI.W #+001,D1
BNE.S PP_BAD_F
PP_F1_ZERO: RTS
PP_F_2: MOVE.W (A6)+,D1 PPs FUNC 2 =
CMPI.B #+001,D1
BHI.S PP_BAD_F
ANDI.B #+254,+00016(A3)
PP_544: OR.B D1,+00016(A3)
RTS
PP_F_3: MOVE.W (A6)+,D1 PPs FUNC 3 =
CMPI.B #+002,D1
BHI.S PP_BAD_F
LSL.B #1,D1
ANDI.B #+249,+00016(A3)
BRA.S PP_544
PP_F_4: MOVE.W (A6)+,D1 PPs FUNC 4 =
CMPI.B #+007,D1
BHI.S PP_BAD_F
LSL.B #3,D1
ANDI.B #+199,+00016(A3)
BRA.S PP_544
PP_F_5: MOVE.W (A6)+,D1 PPs FUNC 5 =
CMPI.B #+001,D1
BHI.S PP_BAD_F
LSL.B #3,D1
ANDI.B #+191,+00016(A3)
BRA.S PP_544
PP_F_BAD: MOVE.B #$0E,D7 ERROR CODE: INVALID FUNCTION PACKET CODE AT
* OFFSET ????
SUBQ.L #2,A6
BRA.S IN_PPFBAD
PP_BAD_F: SUBQ.L #2,A6
ADDQ.L #4,A7
LSR.W #1,D3
ADDI.B #+032,D3
MOVE.B D3,D7
IN_PPFBAD: SUBA.L D4,A6
MOVE.L A6,+00014(A1)
PP_F_0: RTS PP FUNC 0 = ENDLIST
PP_BTEST: MOVE.B #$68,D7 ERROR CODE: BTEST NOT SUPPORTED BY DRIVER
BRA.S PP_UNIMP
PP_DT_DRV: MOVE.B $69,D7 ERROR CODE: DTACHDRV NOT SUPPORTED BY DRIVER
BRA.S PP_UNIMP
PP_AT_DEV: MOVE.B $6A,D7 ERROR CODE: ATACHDEV NOT SUPPORTED BY DRIVER
BRA.S PP_UNIMP
PP_DT_DEV: MOVE.B $6B,D7 ERROR CODE: DTACHDEV NOT SUPPORTED BY DRIVER
PP_UNIMP: RTS
END_PP_DRIVER_CODE EQU *
PP_END_DRIVER_CODE EQU *
PP_REQ_CODE EQU END_PP_DRIVER_CODE-PP_RELOC_BASE
************************************************************************
* STUFF FROM HERE TO END_DRIVER_CODE IS COPIED TO ACQUIRED MEMORY & IS
* RESIDENT PORTION OF DRIVER
*
CTC_RELOC_BASE EQU *
CTC_JT_OFF EQU *
** compute offset offset sysio function
DC.W CTC_OPEN-CTC_BASE $01A4 OPEN
DC.W CTC_CANCEL-CTC_BASE $03F8 CANCEL
DC.W CTC_READ-CTC_BASE $030A READ
DC.W CTC_WRITE-CTC_BASE $0366 WRITE
DC.W CTC_FUNC-CTC_BASE $028C FUNC
DC.W CTC_BWRITE-CTC_BASE $03E6 BWRITE
DC.W CTC_BREAD-CTC_BASE $03EC BREAD
DC.W CTC_CLOSE-CTC_BASE $0256 CLOSE
DC.W CTC_BTEST-CTC_BASE $03F2 BTEST
DC.W CTC_DTDRV-CTC_BASE $03F6 DTACHDRV
DC.W CTC_ATDEV-CTC_BASE $03F6 ATACHDEV
DC.W CTC_DTDEV-CTC_BASE $03F6 DTACHDEV
CTERR_MES_TABLE DC.B $10,'DEVICE LOCKED',$0D
DC.B $11,'DEVICE ALREADY SHARED OPENED',$0D
DC.B $12,'A/D OVERRANGE',$0D
DC.B $13,'TIMER OVERRUN',$0D
DC.B $14,'ILLEGAL OPEN MODE',$0D
DC.W $0000
CTCMEMPTR DC.L 0 PTR TO resident driver data & code (CTC $1C4 LONG)
CTCLENMEM DC.L 0 LEN OF resident driver data & code (CTC $1C4 LONG)
CTC_INIT: MOVEM.L D0-D6/A0-A6,-(A7)
LEA +00036(A0),A6
* SENBASE: I/O address $00F80500 is Sensor I/O Board A SENBASE
LEA SENBASE,A1
LEA +00030(A0),A2
LEA CTC_JT_OFF(PC),A3
LEA CTCJT_OFFSET(A0),A4 254 = $FE
MOVE.W #$000B,D0 DO 11 ITEMS
CTC_BASE: MOVE.W (A3)+,D1 CONSTRUCT JUMP TABLE
LEA CTC_BASE(PC,D1.W),A5
MOVE.L A5,(A4)+
DBF D0,CTC_BASE
CLR.W D0
CTC_PDB_INIT_LOOP: MOVE.L #'#CTC',+00004(A6) PDBNAM for CTCs
MOVE.W #'00',+00008(A6)
ADD.W D0,+00008(A6)
MOVE.L A1,+00084(A6)
MOVE.L A2,+00088(A6)
LEA CTERR_MES_TABLE(PC),A5
MOVE.L A5,+00010(A6) PDBMSG
CLR.W D1
EXG A6,A1
BSR.L SUB_F6EE
EXG A6,A1
LEA CTCJT_OFFSET(A0),A4 254 = $FE
MOVE.L A4,+00034(A6) PDBMGR
MOVE.B #$00,+00047(A6) PDBATT
LEA +00094(A6),A5
TST.W D0
BEQ.S CTC_62C
SUBA.W #$00BC,A5
CTC_62C: MOVE.L A5,+00080(A6) PDBTCW
ADDQ.W #1,D0
TRAP #08 $8 IOMGR8 ATCHPDB
DC.W +00001
BRA.L CTC_SYS_INIT_ERR
MOVEA.L A5,A6
CMPI.W #+002,D0
BNE.S CTC_PDB_INIT_LOOP
LEA +00036(A0),A4
MOVE.L A4,+00026(A0)
MOVE.W #$2500,+00004(A0) IDBHIL - #CTC00
MOVE.B #$00,+00007(A0) IDBDVM
LEA +00452(A0),A4
MOVE.L A4,+00022(A0) IDBSTK
LEA CTC_INT_SERV(PC),A4
MOVE.L A4,+00008(A0) IDBSRA
MOVE.B #$02,+00012(A0) IDBLIL
MOVE.L #'CT00',+00014(A0) IDBDID
MOVE.L #'PIC5',+00018(A0) IDBCID
LEA +00130(A0),A4
MOVE.L A4,+00250(A0)
MOVE.W #$2500,+00228(A0) IDBHIL - #CTC01
MOVE.B #$00,+00231(A0) IDBDVM
LEA +00452(A0),A4
MOVE.L A4,+00246(A0) IDBSTK
LEA CTC_INT_SERV(PC),A4
MOVE.L A4,+00232(A0) IDBSRA
MOVE.B #$04,+00236(A0) IDBLIL
MOVE.L #'CT01',+00238(A0) IDBDID
MOVE.L #'PIC5',+00242(A0) IDBCID
LEA (A0),A6 CTC00 IDB
TRAP #07 $7 INTMGR OPNDEVI
DC.W $8000 OPNDEVI
BRA.L CTC_SYS_INIT_ERR
LEA +00224(A0),A6 CTC01 IDB
TRAP #07 $7 INTMGR OPNDEVI
DC.W $8000 OPNDEVI
BRA.L CTC_SYS_INIT_ERR
CLR.B D7
CTC_INI_EXIT: MOVEM.L (A7)+,D0-D6/A0-A6
RTS
CTC_SYS_INIT_ERR EQU *
DC.W $1E3C,-1 ?MOVE.B #$FF,D7 $1E3C FFFF
BRA.S CTC_INI_EXIT
SUB_F6DA: MOVE.B +00018(A3),D1
MOVE.L A1,-(A7)
MOVEA.L +00080(A1),A1
BSR.S SUB_F6EE
MOVEA.L (A7)+,A1
RTS
SUB_F6EA: MOVE.B +00019(A3),D1
SUB_F6EE: ADD.B D1,D1
ORI.B #+112,D1
CTC_6F4: MOVEA.L +00084(A1),A5
CMPI.B #+048,+00009(A1)
BEQ.S CTC_704
EORI.B #+192,D1
CTC_704: MOVE.B D1,+00103(A5)
RTS
SUB_F70A: MOVE.B +00018(A3),D1
MOVE.L A1,-(A7)
MOVEA.L +00080(A1),A1
BSR.S CTC_71E
MOVEA.L (A7)+,A1
RTS
SUB_F71A: MOVE.B +00019(A1),D1
CTC_71E: ADD.B D1,D1
ORI.B #+064,D1
BRA.S CTC_6F4
SUB_F726: MOVE.W +00014(A3),D1
MOVE.L A1,-(A7)
MOVEA.L +00080(A1),A1
BSR.S SUB_F73A
MOVEA.L (A7)+,A1
RTS
SUB_F736: MOVE.W +00016(A3),D1
SUB_F73A: MOVEA.L +00084(A1),A5
CMPI.B #'0',+00009(A1)
BEQ.S CTC_748
ADDQ.L #2,A5 IS NOT DEVICE 0 SO ADD 2 TO BASE
CTC_748: MOVE.B D1,+00099(A5)
ROL.W #8,D1
MOVE.B D1,+00099(A5)
RTS
SUB_F754: BSR.S SUB_F70A
MOVE.L A1,-(A7)
MOVEA.L +00080(A1),A1
BSR.S SUB_F764
MOVEA.L (A7)+,A1
RTS
SUB_F762: BSR.S SUB_F71A
SUB_F764: CMPI.B #'0',+00009(A1)
BEQ.S CTC_76E
ADDQ.L #2,A5 NOT DEVICE 0 SO ADD 2 TO BASE
CTC_76E: MOVE.B +00099(A5),D1
ROL.W #8,D1
MOVE.B +00099(A5),D1
ROL.W #8,D1
RTS
CTC_OPEN: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
MOVEA.L +00088(A1),A5
CLR.W +00022(A3)
BTST #07,+00016(A2)
BEQ.S CTC_796
MOVE.W +00016(A2),+00022(A3)
CTC_796: MOVE.B +00009(A1),D0
SUBI.B #+048,D0
EXT.W D0
ADD.W D0,D0
BTST #01,+00022(A3)
BEQ.S CTC_7AC
ADDQ.W #1,D0
CTC_7AC: MOVE.W D0,+00020(A3)
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W #+01792,SR
TST.B +000(A5,D0.W)
* 0(A5,D0.W) is open count -- NEGATIVE MEANS NON-SHARED OPEN (LOCKED)
BLT.L CTC_DEV_LOCKED
BEQ.S CTC_7D0
BTST #00,+00022(A3)
BEQ.L CTC_ALREADY_OPEN
CTC_7CA: ADDQ.B #1,+000(A5,D0.W)
* 0(A5,D0.W) is open count -- NEGATIVE MEANS NON-SHARED OPEN (LOCKED)
BRA.S CTC_7F0
CTC_7D0: MOVE.B F82A(PC,D0.W),D1 rF82A
MOVE.B +00004(A5),D2
AND.B D1,D2
BNE.L CTC_ILL_OPEN
OR.B D1,+00004(A5)
BTST #00,+00022(A3)
BNE.S CTC_7CA
DC.W $1BBC,-1,0000 ?MOVE.B #$FF,0(A5,D0.W)
* 0(A5,D0.W) is open count -- NEGATIVE MEANS NON-SHARED OPEN (LOCKED)
CTC_7F0: DC.W $46DF MOVE (A7)+,SR
CLR.W +00018(A3)
CLR.L +00014(A3)
CLR.B +00092(A1)
TST.L +00018(A2)
BEQ.S CTC_814
MOVEA.L +00018(A2),A6
BSR.L SUB_CTC_FUNC
TST.B D7
BEQ.S CTC_814
CLOSE_CTC_AND_EXIT: BSR.L CTC_CLOSE
CTC_814: RTS
CTC_DEV_LOCKED: MOVE.B #$10,D7 ERROR CODE: DEVICE LOCKED
BRA.S CTC_826
CTC_ILL_OPEN: MOVE.B #$14,D7 ERROR CODE: ILLEGAL OPEN MODE
BRA.S CTC_826
CTC_ALREADY_OPEN: MOVE.B #$11,D7 ERROR CODE: DEVICE ALREADY OPEN
CTC_826: DC.W $46DF MOVE (A7)+,SR
BRA.S CLOSE_CTC_AND_EXIT
F82A: DC.B $1,$F,$4,$F $010F 040F
CTC_CLOSE: MOVE.W +00020(A3),D0
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
MOVEA.L +00088(A1),A5
DC.W $40E7 MOVE SR,-(A7)
DC.L $007C0700 ORI.W #$007C,SR
TST.B +000(A5,D0.W)
BLT.S CTC_848
SUBQ.B #1,+000(A5,D0.W)
* 0(A5,D0.W) is open count -- NEGATIVE MEANS NON-SHARED OPEN (LOCKED)
BNE.S CTC_858
CTC_848: CLR.B +000(A5,D0.W)
MOVE.B F82A(PC,D0.W),D1 rF82A
EORI.B #+015,D1
AND.B D1,+00004(A5)
CTC_858 DC.W $46DF MOVE (A7)+,SR
RTS
CTC_FUN_OFF_TBL EQU *
DC.W $0000 F8A8 FUNC0 = ENDLIST
DC.W $FFDE F886 FUNC1 = SET COUNT
DC.W $FFE4 F88C FUNC2 = SET MODE
DC.W $FFF4 F89C FUNC3 = START COUNT
CTC_FUNC: MOVEA.L +00018(A4),A6
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
SUB_CTC_FUNC EQU *
MOVE.L A6,D4
CLR.L D1
CTC_F_MORE: MOVE.W (A6)+,D3
BEQ.L CTC_F_0
*** PATCH 0B - 1/7/86 -- correct func. code limit checking
CMPI.W #+03,D3 was 15 should have been 3
*** PATCH 0B - 1/7/86 -- correct func. code limit checking
BHI.L CTC_F_BAD
LSL.W #1,D3
MOVEA.W CTC_FUN_OFF_TBL(PC,D3.W),A5
JSR FUNCS_CTC(PC,A5.W)
BRA.S CTC_F_MORE
CTC_F_1: MOVE.L (A6)+,+00014(A3) CTC FUNC 1 = SET COUNT
RTS
CTC_F_2: MOVE.W (A6)+,D2 CTC FUNC 2 = SET MODE
CMPI.W #+01285,D2
BHI.L CTC_BAD_F
MOVE.W D2,+00018(A3)
RTS
CTC_F_3: MOVE.W (A6)+,D1 CTC FUNC 3 = START COUNT
CMPI.W #+001,D1
BHI.L CTC_BAD_F
RTS
FUNCS_CTC EQU *
CTC_F_0: TST.W D1
BEQ.S CTC_8C4
BSR.L SUB_F6EA
BSR.L SUB_F736
BTST #00,+00021(A3)
BEQ.S CTC_8C4
BSR.L SUB_F6DA
BSR.L SUB_F726
CTC_8C4: RTS
CTC_F_BAD: MOVE.B #$0E,D7 ERROR CODE: INVALID FUNCTION NUMBER
SUBQ.L #2,A6
BRA.S CTC_INFBAD
CTC_BAD_F: SUBQ.L #2,A6
ADDQ.L #4,A7
LSR.W #1,D3
ADDI.B #+032,D3
MOVE.B D3,D7
CTC_INFBAD: SUBA.L D4,A6
MOVE.L A6,+00014(A1)
RTS
CTC_READ: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
CMPI.B #+000,+00011(A3)
BEQ.S CTC_938
MOVE.B #$09,D7
MOVE.W +00010(A2),D0
ADDQ.W #2,D0
CMP.W +00008(A2),D0
BHI.S CTC_936
BTST #00,+00007(A2)
BNE.S CTC_936
MOVEA.L +00004(A2),A6
ADDA.L +00010(A2),A6
BSR.L SUB_F762
MOVE.W D1,(A6)+
BTST #00,+00021(A3)
BEQ.S CTC_92A
ADDQ.W #2,D0
CMP.W +00008(A2),D0
BHI.S CTC_936
BSR.L SUB_F754
MOVE.W D1,(A6)+
CTC_92A: MOVE.B +00092(A1),D7
MOVE.W D0,+00010(A2)
CLR.B +00092(A1)
CTC_936: RTS
CTC_938: MOVE.W #$0060,D7
BRA.S CTC_936
CTC_WRITE: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
CMPI.B #+001,+00011(A3)
BEQ.S CTC_98A
BSR.L SUB_F6EA
BSR.L SUB_F736
BTST #00,+00021(A3)
BEQ.S CTC_962
BSR.L SUB_F6DA
BSR.L SUB_F726
CTC_962 EQU *
DC.W $46FC,$2500 MOVE #$2500,SR
BCLR #02,+00093(A1)
BNE.S CTC_984
MOVE.L A4,+00076(A1)
TRAP #08 $8 IOMGR8 ?WAIT
DC.W +00004 ?WAIT
BRA.L CTC_982
BCLR #02,+00093(A1)
BNE.S CTC_984
CTC_982: RTS
CTC_984: MOVE.W #$000D,D7
BRA.S CTC_982
CTC_98A: MOVE.W #$0067,D7
BRA.S CTC_982
CTC_INT_SERV: MOVEM.L D0-D7/A0-A6,-(A7)
MOVEA.L +00026(A1),A1
TST.L +00076(A1)
BNE.S CTC_9A6
MOVE.B #$13,+00092(A1)
BRA.S CTC_9B8
CTC_9A6: CLR.B D7
MOVEA.L +00076(A1),A4
CLR.L +00076(A1)
TRAP #08 $8 IOMGR8 ?SIGNAL
DC.W +00003 ?SIGNAL
BRA.L CTC_9B8
CTC_9B8: MOVEM.L (A7)+,D0-D7/A0-A6
DC.W +20083 RTE
CTC_BWRITE: MOVE.B #$65,D7 ERROR CODE: BWRITE NOT SUPPORTED BY DRIVER
BRA.S CTC_UNIMP
CTC_BREAD: MOVE.B #$66,D7 ERROR CODE: BREAD NOT SUPPORTED BY DRIVER
BRA.S CTC_UNIMP
CTC_BTEST: MOVE.B #$68,D7 ERROR CODE: BTEST NOT SUPPORTED BY DRIVER
BRA.S CTC_UNIMP
CTC_DTDRV: MOVE.B #$69,D7 ERROR CODE: DTACHDRV NOT SUPPORTED BY DRIVER
BRA.S CTC_UNIMP
CTC_ATDEV: MOVE.B #$6A,D7 ERROR CODE: ATACHDEV NOT SUPPORTED BY DRIVER
BRA.S CTC_UNIMP
CTC_DTDEV: MOVE.B #$6B,D7 ERROR CODE: DTACHDEV NOT SUPPORTED BY DRIVER
CTC_UNIMP: RTS
CTC_CANCEL: DC.W $46FC,$2500 MOVE #$2500,SR
MOVE.W #$0061,D7 ERROR CODE: CANCEL FAILED
CMPA.L +00076(A1),A4
BNE.S CTC_9F2
CLR.W D7
CLR.L +00076(A1)
BSET #02,+00093(A1)
TRAP #08 $8 IOMGR8 +00003
DC.W +00003 +00003
BRA.L CTC_9F2
CTC_9F2: RTS
END_CTC_DRIVER_CODE EQU *
CTC_END_DRIVER_CODE EQU *
************************************************************************
ADC_RELOC_BASE EQU *
* STUFF FROM HERE TO END_DRIVER_CODE IS COPIED TO ACQUIRED MEMORY & IS
* RESIDENT PORTION OF DRIVER
DC.W $0000 $0000 $00E472
ADC_JT_INIT EQU * OFFSETS FOR CONSTRUCTING ADC JUMP TABLE rel H_E54C
** compute offset offset sysio fn
DC.W ADC_OPEN-H_E54C $0306 OPEN
DC.W ADC_CANCEL-H_E54C $0262 CANCEL
DC.W ADC_READ-H_E54C $0298 READ
DC.W ADC_WRITE-H_E54C $07A0 WRITE
DC.W ADC_FUNC-H_E54C $05C2 FUNC
DC.W ADC_BWRITE-H_E54C $0286 BWRITE
DC.W ADC_BREAD-H_E54C $028C BREAD
DC.W ADC_CLOSE-H_E54C $0766 CLOSE
DC.W ADC_BTEST-H_E54C $0292 BTEST
DC.W ADC_DTDRV-H_E54C DTACHDRV
DC.W ADC_ATDEV-H_E54C ATACHDEV
DC.W ADC_DTDEV-H_E54C DTACHDEV
* LED DRIVER OFFSETS FOR CONSTRUCTING JUMP TABLE
** compute offset offset sysio fn
DC.W ADC_OPEN-H_E54C $0306 OPEN
DC.W ADC_CANCEL-H_E54C $0262 CANCEL
DC.W LED_READ-H_E54C $07A6 READ
DC.W ADC_WRITE-H_E54C $07A0 WRITE
DC.W SWI_LED_FUNC-H_E54C $07B0 FUNC
DC.W LED_BWRITE-H_E54C $076E BWRITE
DC.W ADC_BREAD-H_E54C $028C BREAD
DC.W ADC_CLOSE-H_E54C $0766 CLOSE
DC.W ADC_BTEST-H_E54C $0292 BTEST
DC.W ADC_DTDRV-H_E54C DTACHDRV
DC.W ADC_ATDEV-H_E54C ATACHDEV
DC.W ADC_DTDEV-H_E54C DTACHDEV
* SWITCH DRIVER OFFSETS FOR CONSTRUCTING JUMP TABLE
** compute offset offset sysio fn
DC.W ADC_OPEN-H_E54C $0306 OPEN
DC.W ADC_CANCEL-H_E54C $0262 CANCEL
DC.W SWI_READ-H_E54C $07B6 READ
DC.W ADC_WRITE-H_E54C $07A0 WRITE
DC.W SWI_LED_FUNC-H_E54C $07B0 FUNC
DC.W ADC_BWRITE-H_E54C $0286 BWRITE
DC.W SWI_BREAD-H_E54C $07F6 BREAD
DC.W ADC_CLOSE-H_E54C $0766 CLOSE
DC.W ADC_BTEST-H_E54C $0292 BTEST
DC.W ADC_DTDRV-H_E54C DTACHDRV
DC.W ADC_ATDEV-H_E54C ATACHDEV
DC.W ADC_DTDEV-H_E54C DTACHDEV
*
E4BC: DC.W $0100,$0020
DC.W $0004,$0001
DC.W $0000
ADERR_MES_TABLE DC.B $10,'DEVICE LOCKED',$0D
DC.B $11,'DEVICE ALREADY SHARED OPENED',$0D
DC.B $12,'A/D OVERRANGE',$0D
DC.B $13,'TIMER OVERRUN',$0D
DC.B $14,'ILLEGAL OPEN MODE',$0D
DC.B $15,'A/D TIME-OVERRUN',$0D
DC.W $0000
ADCMEMPTR DC.L 0 PTR TO resident driver data & code (ADC/SWI/LED $1474)
ADCLENMEM DC.L 0 LEN OF resident driver data & code (ADC/SWI/LED $1474)
ADC_INIT: MOVEM.L D0-D6/A0-A6,-(A7)
* A0 has BASE addr of A/D mem - A5 contains addr of relocated RELOC_BASE
LEA +00074(A0),A6 +74 = $4A A6 = QUEUE PDB @ $4A(AD_MEM)
LEA ADCJT_OFFSET(A0),A2 +4942 = $134E A2 = ADC JUMP TABLE ADDR
LEA ADC_JT_INIT(PC),A1
MOVE.W #$0023,D0 35 ITEMS
H_E54C: MOVE.W (A1)+,D1 CONSTRUCT JUMP TABLE
LEA H_E54C(PC,D1.W),A3 rE54C (E852) $00E54E
MOVE.L A3,(A2)+
DBF D0,H_E54C
LEA +02624(A0),A5 $0A40(A0) A5 = SURROGATE TASK PCB ADDR
CLR.W D0
ADC_ATACH_PBD_LOOP: MOVE.L #'#ADC',+00004(A6) PDBNAM
MOVE.W #'00',+00008(A6) PDBNAM continued
ADD.W D0,+00008(A6)
MOVE.L #'TK#A',(A5) PCBNAM
MOVE.L #'DC00',+00004(A5) PCBNAM continued
ADD.W D0,+00006(A5)
MOVE.L A5,+00086(A5)
ADDI.L #+00526,+00086(A5)
MOVE.L A5,+00048(A6) PDBTCW surrogate task PCB addr
ADDA.L #$00000212,A5
MOVE.W D0,+00082(A6)
MOVE.L #SENBASE,+00084(A6) SENBASE = F80500
LEA ADERR_MES_TABLE(PC),A3
MOVE.L A3,+00010(A6) PDBMSG ptr to err mes table
LEA +00074(A0),A4
MOVE.L A4,+00120(A6)
MOVE.B #$03,+00081(A6)
LEA ADCJT_OFFSET(A0),A4 134E(A0) IS ADC JUMP TABLE ADDR
MOVE.L A4,+00034(A6) PDBMGR ptr to jump table
MOVE.B #$10,+00047(A6) PDBATT driver logical attribute
ADDQ.W #1,D0 increment for next adc channel
TRAP #08 $8 IOMGR8 ATACHPDB
DC.W +00001 +00001
BRA.L AD_SYS_INIT_ERR jump taken only if error occurs
ADDA.W #$0082,A6 increment for subsidiary PDBs
CMPI.W #+004,D0 adc channels are 0 to 3
BLT.S ADC_ATACH_PBD_LOOP do next
* ADC IDB INITIALIZATION
LEA +00074(A0),A4
MOVE.L A4,+00026(A0)
MOVE.W #$2500,+00004(A0) IDBHIL ATOD
MOVE.B #$00,+00007(A0) IDBDVM
LEA +05236(A0),A4 1474(A0) = INT SERVICE STACK POINTER
MOVE.L A4,+00022(A0) IDBSTK
LEA AD_INT_SERV(PC),A4 GET ADDRESS OF A/D INTER. SERVICE ROUTINE
MOVE.L A4,+00008(A0) IDBSRA
MOVE.B #$05,+00012(A0) IDBLIL
MOVE.L #'ATOD',+00014(A0) IDBDID
MOVE.L #'PIC5',+00018(A0) IDBCID
LEA SENBASE,A1 @F80500 SENSOR I/O BOARD BASE ADDRESS
MOVEQ #006,D0
AD_CONT_REG_INIT_LOOP: MOVE.B #$03,+033(A1,D0.W) load ADC control registers
SUBQ.B #2,D0
BPL.S AD_CONT_REG_INIT_LOOP
MOVE.B #$36,+00103(A1) $36 - mode word (CTC) counters
MOVE.B #$35,+00097(A1) $35 -> counter #0 data
MOVE.B #$82,+00097(A1) $82 -> counter #0 data
LEA +00594(A0),A6 BASE ADDR FOR LED PDBs
LEA +01266(A0),A5 BASE ADDR FOR SWI PDBS
LEA +02094(A0),A3 SURROGATE PCB FOR SWI DRIVER
LEA +00736(A5),A4
LEA +00074(A0),A2
MOVEA.L A2,A1
CLR.W D0
LED_ATACH_PDB_LOOP: CMPI.W #+008,D0
BEQ.S SKIP_LED_8
MOVE.L #'#LED',+00004(A6) PDBNAM
MOVE.W #'00',+00008(A6)
ADD.W D0,+00008(A6)
MOVE.W D0,+00082(A6)
MOVE.B #$20,+00047(A6) PDBATT
MOVE.L A3,-(A7)
LEA ADERR_MES_TABLE(PC),A3
MOVE.L A3,+00010(A6) PDBMSG
MOVEA.L (A7)+,A3
MOVE.L A0,D3
LEA +04990(A0),A0 137E(A0) IS LED JUMP TABLE ADDR
MOVE.L A0,+00034(A6) PDBMGR
MOVEA.L D3,A0
MOVE.L A2,+00076(A6)
TRAP #08 $8 IOMGR8 ATACHPDB
DC.W +00001 +00001
BRA.L AD_SYS_INIT_ERR jump taken only if error occurs
SKIP_LED_8: MOVE.L #'#SWI',+00004(A5) PDBNAM
MOVE.W #'00',+00008(A5)
ADD.W D0,+00008(A5)
MOVE.W D0,+00082(A5)
MOVE.B #$20,+00047(A5) PDBATT
LEA +05038(A0),A0 13AE(A0) IS SWI JUMP TABLE ADDR
MOVE.L A0,+00034(A5) PDBMGR
MOVEA.L D3,A0
MOVE.L A3,-(A7)
LEA ADERR_MES_TABLE(PC),A3
MOVE.L A3,+00010(A5) PDBMSG
MOVEA.L (A7)+,A3
MOVE.L A4,+00088(A5)
CMPA.L A4,A5
BNE.S SKIP_SWI_PCB
MOVE.B #$30,+00047(A5) PDBATT
MOVE.L #'TK#S',(A3) PCBNAM surrogate PCB for SWI
MOVE.L #'WI00',+00004(A3)
ADD.W D0,+00006(A3)
MOVE.L A3,+00086(A3)
ADDI.L #+00526,+00086(A3)
MOVE.L A3,+00048(A5) PDBTCW
SKIP_SWI_PCB: MOVE.L A1,+00084(A5)
EXG A5,A6
TRAP #08 $8 IOMGR8 ATACHPDB
DC.W +00001 +00001
BRA.L AD_SYS_INIT_ERR jump taken only if error occurs
EXG A5,A6
ADDQ.W #1,D0
ADDA.W #$0054,A6 84 BYTES FOR EACH LED PCB
ADDA.W #$005C,A5 92 BYTES FOR EACH SWI PDB
BTST #00,D0
BNE.S H_E71E ABS:$00E71E $00E718
ADDA.W #$0082,A2
H_E71E: CMPI.W #+009,D0
BLT.L LED_ATACH_PDB_LOOP
LEA +04744(A0),A6
MOVEQ #008,D0
H_E72C: MOVE.L #'SW00',+00004(A6)
ADD.W D0,+00006(A6)
TRAP #08 $8 IOMGR8 +00009
DC.W +00009 +00009
BRA.L AD_SYS_INIT_ERR jump taken only if error occurs
ADDA.W #$0016,A6
DBF D0,H_E72C
LEA +01266(A0),A4
MOVE.L A4,+00056(A0)
LEA +04744(A0),A4
MOVE.L A4,+00060(A0)
MOVE.W #$2500,+00034(A0) IDBHIL FOR SWTC (SWITCH DRIVER)
MOVE.B #$00,+00037(A0) IDBDVM
LEA +05236(A0),A4
MOVE.L A4,+00052(A0) IDBSTK
LEA SWTC_INT_SERV(PC),A4
MOVE.L A4,+00038(A0) IDBSRA
MOVE.B #$01,+00042(A0) IDBLIL
MOVE.L #'SWTC',+00044(A0) IDBDID
MOVE.L #'PIC5',+00048(A0) IDBCID
LEA (A0),A6 (A0) IS A/D IDB ADDRESS
TRAP #07 $7 INTMGR OPNDEVI
DC.W $8000
BRA.L AD_SYS_INIT_ERR jump taken only if error occurs
LEA +00030(A0),A6 30(A0) IS SWTC IDB ADDRESS
TRAP #07 $7 INTMGR OPNDEVI
DC.W $8000
BRA.L AD_SYS_INIT_ERR jump taken only if error occurs
CLR.B D7
AD_INIT_EXIT: MOVEM.L (A7)+,D0-D6/A0-A6
RTS
AD_SYS_INIT_ERR EQU *
DC.W $1E3C,$FFFF ?MOVE.B #$FF,D7
BRA.S AD_INIT_EXIT
ADC_CANCEL: DC.W $46FC,$2500 MOVE #$2500,SR
MOVE.W #$0061,D7 ERROR CODE: CANCEL FAILED
CMPA.L +00076(A1),A4
BNE.S H_E7D0
CLR.W D7
CLR.L +00076(A1)
BSET #02,+00080(A1)
TRAP #08 $8 IOMGR8 ?SIGNAL
DC.W +00003 +00003
BRA.L H_E7D0
H_E7D0: RTS
ADC_BWRITE: MOVE.B #$65,D7 ERROR CODE: BWRITE NOT SUPPORTED BY DRIVER
BRA.S H_E7E2
ADC_BREAD: MOVE.B #$66,D7 ERROR CODE: BREAD NOT SUPPORTED BY DRIVER
BRA.S H_E7E2
ADC_BTEST: MOVE.B #$68,D7 ERROR CODE: BTEST NOT SUPPORTED BY DRIVER
BRA.S H_E7E2
ADC_DTDRV: MOVE.B #$69,D7 ERROR CODE: DTACHDRV NOT SUPPORTED BY DRIVER
BRA.S H_E7E2
ADC_ATDEV: MOVE.B #$6A,D7 ERROR CODE: ATACHDEV NOT SUPPORTED BY DRIVER
BRA.S H_E7E2
ADC_DTDEV: MOVE.B #$6B,D7 ERROR CODE: DTACHDEV NOT SUPPORTED BY DRIVER
ADC_UNIMP EQU *
H_E7E2: RTS
ADC_READ: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
MOVE.B #$09,D7
BTST #00,+00007(A2)
BNE.S H_E84A
BTST #00,+00011(A2)
BNE.S H_E84A
MOVE.B +00019(A3),D0
MOVE.W +00010(A2),D1
H_E804: ROR.B #1,D0
BCC.L H_E80C
ADDQ.W #4,D1
H_E80C: ANDI.B #+007,D0
BNE.S H_E804
CMP.W +00008(A2),D1
BHI.S H_E84A
MOVE.W +00014(A3),+00016(A3)
CLR.B +00020(A3)
CLR.W +00094(A1)
DC.W $46FC,$2500 MOVE #$2500,SR
BCLR #02,+00080(A1)
BNE.S H_E84C
MOVE.L A4,+00076(A1)
TRAP #08 $8 IOMGR8 ?WAIT
DC.W +00004 +00004
BRA.L H_E84A
BCLR #02,+00080(A1)
BNE.S H_E84C
MOVE.B +00020(A3),D7
H_E84A: RTS
H_E84C: MOVE.W #$000D,D7 RETURN CODE: SYSIO REQUEST CANCELLED
BRA.S H_E84A
ADC_OPEN: MOVEA.L +00018(A4),A2
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
CMPI.L #'#ADC',+00004(A1)
BNE.S H_E86C
CMPI.B #+001,+00006(A2)
BEQ.S H_E86C
MOVEQ #006,D7
BRA.S H_E896
H_E86C: CMPI.L #'#LED',+00004(A1)
BNE.S H_E882
CMPI.B #+000,+00006(A2)
BEQ.S H_E882
MOVEQ #006,D7
BRA.S H_E896
H_E882: CMPI.L #'#SWI',+00004(A1)
BNE.S H_E896
CMPI.B #+001,+00006(A2)
BEQ.S H_E896
MOVEQ #006,D7
H_E896: TST.W D7
BNE.L H_E952
CMPI.B #+001,+00046(A1)
BEQ.S H_E8B0
BTST #00,+00080(A1)
BNE.L H_E954
BRA.S H_E8B6
H_E8B0: BSET #00,+00080(A1)
H_E8B6: BTST #07,+00016(A2)
BEQ.S H_E8E2
BCLR #01,+00080(A1)
BTST #01,+00016(A2)
BEQ.S H_E8D2
BSET #01,+00080(A1)
H_E8D2: BTST #00,+00016(A2)
BEQ.S H_E8E2
BCLR #00,+00080(A1)
BRA.S H_E8F2
H_E8E2: BTST #00,+00080(A1)
BEQ.L H_E95A
BSET #00,+00080(A1)
H_E8F2: CMPI.W #'#A',+00004(A1)
BNE.S H_E92C
MOVE.W #$0001,+00014(A3)
CLR.B +00018(A3)
CLR.L +00124(A1)
MOVE.W +00082(A1),D0
MOVE.W D0,D3
ADD.W D3,D3
MOVEA.L +00084(A1),A0
ANDI.B #+052,+00081(A1)
ORI.B #+015,+00081(A1)
CLR.B +00019(A3)
BSET D0,+00019(A3)
CMR.W +00128(A1)
H_E92C: TST.L +00018(A2)
BEQ.S H_E944
MOVEA.L +00018(A2),A6
BSR.L SUB_AD_FUNC
TST.B D7
BEQ.S H_E944
BSR.L ADC_CLOSE
BRA.S H_E952
H_E944: CMPI.W #'#A',+00004(A1)
BNE.S H_E952
MOVE.B +00081(A1),+033(A0,D3.W)
H_E952: RTS
H_E954: MOVE.B #$10,D7 ERROR CODE: DEVICE LOCKED
BRA.S H_E952
H_E95A: MOVE.B #$11,D7 ERROR CODE: DEVICE ALREADY OPEN
BRA.S H_E952
AD_INT_SERV: MOVEM.L D0-D7/A0-A6,-(A7)
MOVEA.L +00026(A1),A1
LEA +00520(A1),A0
LEA -00010(A1),A5
MOVEA.L +00084(A1),A3
MOVE.B +00063(A3),+00009(A5)
MOVEQ #006,D0
H_E97C: MOVE.W +032(A3,D0.W),+000(A5,D0.W)
SUBQ.W #2,D0
BPL.S H_E97C
H_E986: TST.L +00076(A1)
BEQ.L H_EADC
MOVEA.L +00076(A1),A4
MOVEA.L +00012(A4),A3
MOVEA.L +00018(A4),A2
MOVE.L +00004(A2),D0
ADD.W +00010(A2),D0
MOVEA.L D0,A6
MOVE.B +00019(A3),D0
MOVE.W +00016(A3),D5
CLR.W D1
H_E9AE: ROR.B #1,D0
BCC.L H_EAA2
MOVE.W D1,D6
LSL.W #2,D6
MOVE.W D1,D2
ROR.W #1,D2
SUBQ.W #3,D2
NEG.W D2
BTST D2,+00009(A5)
BEQ.S H_E9CC
MOVE.B #$15,+00020(A3)
H_E9CC: MOVE.W +000(A5,D1.W),D2
OR.W D2,+094(A1,D6.W)
MOVE.W D2,D3
ANDI.W #+04095,D3
EXT.L D3
MOVEQ #014,D4
LSR.W D4,D2
BEQ.S H_E9EE
MOVE.B E9EA(PC,D2.W),D2
ASL.L D2,D3
BRA.S H_E9EE
E9EA: DC.B 0,02,05,08
H_E9EE: BTST #04,0(A5,D1.W)
BNE.S H_E9F8
NEG.L D3
H_E9F8: BTST #01,+00018(A3)
BNE.S H_EA06
ADDI.L #$000FFF00,D3
H_EA06: BTST #00,+00018(A3)
BEQ.S H_EA5C
CMP.W +00014(A3),D5
BNE.S H_EA1C
CLR.L +090(A1,D6.W)
CLR.W +088(A1,D6.W)
H_EA1C: ADD.L D3,+090(A1,D6.W)
BCC.S H_EA26
ADDQ.W #1,+088(A1,D6.W)
H_EA26: CMPI.W #+001,D5
BNE.S H_EAA2
BTST #01,+00018(A3)
BEQ.S H_EA46
MOVE.L +090(A1,D6.W),D3
TST.W +088(A1,D6.W)
BEQ.S H_EA44
BSET #05,+094(A1,D6.W)
H_EA44: BRA.S H_EA5C
H_EA46: MOVE.L +088(A1,D6.W),D3
DIVU +00014(A3),D3
MOVE.L D3,D4
SWAP D3
MOVE.W +092(A1,D6.W),D4
DIVU +00014(A3),D4
MOVE.W D4,D3
H_EA5C: BTST #01,+00018(A3)
BNE.S H_EA6A
SUBI.L #$000FFF00,D3
H_EA6A: BTST #01,+00080(A1)
BEQ.S H_EA7A
MOVE.L D3,D4
ASL.L #2,D3
ADD.L D4,D3
ASL.L #1,D3
H_EA7A: ADD.L +00124(A1),D3
BCLR #05,+094(A1,D6.W)
BEQ.S H_EA9C
MOVE.B #$12,+00020(A3)
MOVE.L #$7FFFFFFF,D3
BCLR #04,+094(A1,D6.W)
BNE.S H_EA9C
NEG.L D3
H_EA9C: CLR.W +094(A1,D6.W)
MOVE.L D3,(A6)+
H_EAA2: ADDQ.W #2,D1
ANDI.B #+007,D0
BNE.L H_E9AE
SUBQ.W #1,+00016(A3)
BNE.S H_EADC
MOVE.W +00014(A3),+00016(A3)
SUBA.L +00004(A2),A6
MOVE.W A6,+00010(A2)
MOVE.W A6,D0
CMP.W +00008(A2),D0
BCS.S H_EADC
CLR.L +00076(A1)
MOVEM.L A1/A5,-(A7)
TRAP #08 $8 IOMGR8 ?SIGNAL
DC.W +00003 +00003
BRA.L H_EAD8
H_EAD8: MOVEM.L (A7)+,A1/A5
H_EADC: ADDA.W #$0082,A1
CMPA.L A0,A1
BNE.L H_E986
MOVEM.L (A7)+,D0-D7/A0-A6
DC.W +20083 RTE
AD_FUN_OFF_TBL EQU * ADC FUNC DISPATCH TABLE - CODE OFFSETS
** compute offset fn # fn name offset
DC.W AD_F_0-AD_FUNCS FUNC0 ENDLIST $0170
DC.W AD_F_1-AD_FUNCS FUNC1 SET GAIN $0000
DC.W AD_F_2-AD_FUNCS FUNC2 SET SAMPLE RATE $003A
DC.W AD_F_3-AD_FUNCS FUNC3 AVERAGING $004E
DC.W AD_F_4-AD_FUNCS FUNC4 ALTERNATE CHANNELS $0060
DC.W AD_F_5-AD_FUNCS FUNC5 PASS SUM $00A8
DC.W AD_F_6-AD_FUNCS FUNC6 SET BIAS $00BC
DC.W AD_F_7-AD_FUNCS FUNC7 SET UNDOC1 $00C2
DC.W AD_F_8-AD_FUNCS FUNC8 SET UNDOC2 $00D6
DC.W AD_F_9-AD_FUNCS FUNC9 GET GAIN $00F2
DC.W AD_F_10-AD_FUNCS FUNC10 GET SAMPLE RATE $00F8
DC.W AD_F_11-AD_FUNCS FUNC11 GET SUM MODE $0104
DC.W AD_F_12-AD_FUNCS FUNC12 GET ALTERNATE CHANNEL $0114
DC.W AD_F_13-AD_FUNCS FUNC13 GET AVERAGING $012E
DC.W AD_F_14-AD_FUNCS FUNC14 GET BIAS $013E
DC.W AD_F_15-AD_FUNCS FUNC15 GET UNDOC1 $0144
*END OF FUNC OFFSETS
AD_F_DATA_WORD: DC.W $0101
ADC_FUNC: MOVEA.L +00018(A4),A6
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
SUB_AD_FUNC: MOVE.L A6,D4
AD_F_MORE: MOVE.W (A6)+,D3 GET FUNC NUMBER FROM LIST
BEQ.L AD_F_0
CMPI.W #+015,D3
BHI.L AD_F_BAD
MOVE.W AD_F_DATA_WORD(PC),D1
BTST D3,D1 IS IT FUNCTION (?0 ?8) ?
BNE.S AD_F_DOIT
CMPI.W #'#A',+00004(A1) OTHER FUNCTIONS - CHECK THAT IT IS A/D
BNE.L AD_F_BAD
AD_F_DOIT: LSL.W #1,D3
MOVEA.W AD_FUN_OFF_TBL(PC,D3.W),A5 GET FUNC CODE OFFSET
JSR AD_FUNCS(PC,A5.W)
BRA.S AD_F_MORE
AD_FUNCS EQU *
AD_F_1: MOVE.W (A6)+,D1 ADC FUNC 1 = SET GAIN
BNE.S AD_F1_NONZERO_GAIN
BSET #03,+00081(A1)
H_EB4A: MOVE.W D1,+00128(A1)
MOVE.W +00082(A1),D1
ADD.W D1,D1
MOVEA.L +00084(A1),A5
MOVE.B +00081(A1),+033(A5,D1.W)
RTS AD_FUNC
AD_F1_NONZERO_GAIN: LEA E4BC(PC),A5
ANDI.B #+052,+00081(A1)
H_EB6A: CMP.W (A5)+,D1
BEQ.S H_EB4A
ADDQ.B #1,+00081(A1)
TST.W (A5)
BNE.S H_EB6A
BRA.L H_EC9E
AD_F_2: MOVE.L (A6)+,D1 ADC FUNC 2 = SET SAMPLE RATE
DIVU #$8235,D1
BVS.L H_EC9C
BEQ.L H_EC9C
MOVE.W D1,+00014(A3)
RTS
AD_F_3: BCLR #00,+00018(A3) ADC FUNC 3 = AVERAGING
MOVE.W (A6)+,D1
BEQ.S H_EB9E
BSET #00,+00018(A3)
H_EB9E: RTS
AD_F_4: CLR.B +00019(A3) ADC FUNC 4 - ALTERNATE CHANNELS
H_EBA4: MOVE.W (A6)+,D1
CMPI.W #+65535,D1
BNE.S H_EBB6
TST.B +00019(A3)
BEQ.L H_EC9E
RTS
H_EBB6: CMPI.W #+003,D1
BHI.L H_EC9E
BSET D1,+00019(A3)
MOVEA.L +00120(A1),A5
MOVE.W D1,D2
MULU #$0082,D2
LEA +000(A5,D2.W),A5
BSET #02,+00081(A5)
ADD.W D1,D1
MOVE.L A0,-(A7)
MOVEA.L +00084(A5),A0
MOVE.B +00081(A5),+033(A0,D1.W)
MOVEA.L (A7)+,A0
BRA.S H_EBA4
AD_F_5: BCLR #01,+00018(A3) ADC FUNC 5 = PASS SUM
MOVE.W (A6)+,D1
BEQ.L H_EBFA
BSET #01,+00018(A3)
H_EBFA: RTS
AD_F_6: MOVE.L (A6)+,+00124(A1) ADC FUNC 6 = BIAS
RTS
AD_F_7: BCLR #01,+00080(A1) ADC FUNC 7 = UNDOCUMENTED
MOVE.W (A6)+,D1
BEQ.L H_EC14
BSET #01,+00080(A1)
H_EC14: RTS
AD_F_8: BCLR #00,+00080(A1) ADC FUNC 8 = UNDOCUMENTED
MOVE.W (A6)+,D1
BNE.L H_EC30
CMPI.B #+001,+00046(A1)
BNE.S H_EC9E
BSET #00,+00080(A1)
H_EC30: RTS
AD_F_9: MOVE.W +00128(A1),(A6)+ ADC FUNC 9 = GET GAIN
RTS
AD_F_10: MOVE.W +00014(A3),D1 ADC FUNC 10 = GET SAMPLE RATE
MULU #$8235,D1
MOVE.L D1,(A6)+
RTS
AD_F_11: CLR.W D1 ADC FUNC 11 = GET SUM MODE
BTST #00,+00018(A3)
BEQ.S H_EC50
MOVEQ #001,D1
H_EC50: MOVE.W D1,(A6)+
RTS
AD_F_12: MOVE.B +00019(A3),D1 ADC FUNC 12 = GET ALT. WORD
MOVEA.L (A6)+,A5
CLR.W D2
H_EC5C: LSR.B #1,D1
BCC.S H_EC62
MOVE.W D2,(A5)+
H_EC62: ADDQ.W #1,D2
TST.B D1
BNE.S H_EC5C
MOVE.W #$FFFF,(A5)+
RTS
AD_F_13: CLR.W D1 ADC FUNC 13 = GET AVERAGING
BTST #01,+00018(A3)
BEQ.S H_EC7A
MOVEQ #001,D1
H_EC7A: MOVE.W D1,(A6)+
RTS
AD_F_14: MOVE.L +00124(A1),(A6)+ ADC FUNC 14 = GET BIAS
RTS
AD_F_15: CLR.W D1 ADC FUNC 15 = GET STATUS of UNDOC set by FUNC 7
BTST #01,+00080(A1)
BEQ.S H_EC90
MOVEQ #001,D1
H_EC90: MOVE.W D1,(A6)+
RTS
AD_F_BAD: MOVE.B #$0E,D7 ERROR CODE: INVALID TRANSFER MODE
SUBQ.L #2,A6
BRA.S H_ECAA
H_EC9C: SUBQ.L #2,A6
H_EC9E: SUBQ.L #2,A6
ADDQ.L #4,A7
LSR.W #1,D3
ADDI.B #+032,D3
MOVE.B D3,D7
H_ECAA: SUBA.L D4,A6
MOVE.L A6,+00014(A1)
AD_F_0: RTS ADC FUNC 0 = ENDLIST
ADC_CLOSE: BCLR #00,+00080(A1)
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
RTS
LED_BWRITE: MOVEM.L D2-D3,-(A7)
MOVEA.L +00076(A1),A5
MOVE.W +00082(A1),D3
MOVEQ #004,D2
BCLR #00,D3
BEQ.S H_ECD0
MOVEQ #005,D2
H_ECD0: BSET D2,+00081(A5)
TST.B D0
BNE.S H_ECDC
BCLR D2,+00081(A5)
H_ECDC: MOVEA.L +00084(A5),A6
MOVE.B +00081(A5),+033(A6,D3.W)
MOVEM.L (A7)+,D2-D3
RTS
ADC_WRITE: MOVE.B #$63,D7 ERROR CODE: WRITE NOT SUPPORTED BY THIS DRIVER
BRA.S H_ECF6
LED_READ: MOVE.B #$62,D7 ERROR CODE: READ NOT SUPPORTED BY THIS DRIVER
H_ECF6: MOVEA.L +00018(A4),A2
BRA.S H_ED00
SWI_LED_FUNC: MOVE.B #$64,D7 ERROR CODE: FUNCTION NOT SUPPORTER BY THIS DRIVER
H_ED00 RTS
SWI_READ: BSR.L SWI_BREAD
* on entry for OPEN,CLOSE,READ,WRITE,FUNC: A1 -> PDB, A3 -> DCB, A4 -> RPK
MOVEA.L +00018(A4),A2
MOVE.B #$09,D7 ERROR CODE: INPUT RECORD LARGER THEN BUFFER LENGTH; TRUNCATED
MOVE.W +00010(A2),D0
CMP.W +00008(A2),D0
BCC.S SW_ED3A
DC.W $46FC,$2500 MOVE #$2500,SR $00ED18
BCLR #02,+00080(A1)
BNE.S SW_ED3C
MOVE.L A4,+00076(A1)
TRAP #08 $8 IOMGR ?WAIT
DC.W +00004 ?WAIT
BRA.L SW_ED3A
BCLR #02,+00080(A1)
BNE.S SW_ED3C
CLR.W D7 SUCCESSFULL I/O OPERATION
SW_ED3A: RTS
SW_ED3C: MOVE.W #$000D,D7 ERROR CODE: REQUEST CANCELLED $00ED3C
BRA.S SW_ED3A
SWI_BREAD: MOVE.W +00082(A1),D1
MOVEA.L +00084(A1),A5
CMPA.L +00088(A1),A1
BNE.S SW_ED5A
MOVE.B -00002(A5),D0
CLR.B -00002(A5)
BRA.S SW_ED66
SW_ED5A: CLR.B D0
BCLR D1,-00002(A5)
BEQ.S SW_ED66
MOVE.B #$01,D0
SW_ED66: RTS SWI_BREAD
SWTC_INT_SERV: MOVEM.L D0-D7/A0-A6,-(A7)
MOVEA.L +00030(A1),A6
MOVEA.L +00026(A1),A1
LEA +00828(A1),A0
MOVEA.L +00084(A1),A5
MOVEA.L +00084(A5),A4
CLR.L D0
MOVE.B +00062(A4),D0
NOT.B D0
OR.B D0,-00002(A5)
BSR.S SW_EDD4
SW_ED8E: TST.L +00076(A1)
BEQ.S SW_EDC6
BSR.S SWI_BREAD
TST.B D0
BEQ.S SW_EDC6
MOVEA.L +00076(A1),A4
MOVEA.L +00018(A4),A2
MOVE.L +00004(A2),D1
ADD.W +00010(A2),D1
MOVEA.L D1,A6
MOVE.B D0,(A6)
ADDQ.W #1,+00010(A2)
MOVEM.L A0-A1,-(A7)
CLR.L +00076(A1)
TRAP #08 $8 IOMGR8 ?SIGNAL
DC.W +00003 ?SIGNAL
BRA.L SW_EDC2
SW_EDC2: MOVEM.L (A7)+,A0-A1
SW_EDC6: ADDA.W #$005C,A1
CMPA.L A0,A1
BNE.S SW_ED8E
MOVEM.L (A7)+,D0-D7/A0-A6
DC.W +20083 RTE
SW_EDD4: TRAP #08 $8 IOMGR8 +00011
DC.W +00011 +00011
BRA.L SW_EDF2
MOVEQ #007,D1
SW_EDDE: BTST D1,D0
BEQ.S SW_EDEA
TRAP #08 $8 IOMGR8 +00011
DC.W +00011 +00011
BRA.L SW_EDF2
SW_EDEA: ADDA.W #$0016,A6
DBF D1,SW_EDDE
SW_EDF2: RTS
END_ADC_DRIVER_CODE EQU *
ADC_END_DRIVER_CODE EQU *
END

Вам также может понравиться