mirror of
https://github.com/elliotnunn/sys7.1-doc-wip.git
synced 2024-12-13 11:29:15 +00:00
542 lines
17 KiB
Plaintext
542 lines
17 KiB
Plaintext
;
|
||
; File: HALc96Init.a
|
||
;
|
||
; Contains: initialization routines
|
||
;
|
||
; Written by: Paul Wolf
|
||
;
|
||
; Copyright: © 1992-1994 by Apple Computer, Inc., All rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <SM30> 1/25/94 DCB Initialize our null deferred task which we use to make sure that
|
||
; jDisptch gets called in order to run our own DT Manager
|
||
; <SM29> 12/19/93 DCB Clear our deferred task flags field before using it.
|
||
; <SM28> 11/22/93 pdw Rolling in from <MCxx>.
|
||
; <MC10> 11/8/93 pdw Fixed the bug that Craig reported but I didn't understand until
|
||
; now.
|
||
; <MC8> 10/29/93 pdw Added initialization of dmaAlignMask from dmaAlignmentSize.
|
||
; <SM27> 11/19/93 chp Beautify some conditional code that sometimes needs to branch
|
||
; around TNT code.
|
||
; <SM26> 11/17/93 KW changed forSTP601 to forSTP601v1
|
||
; <SMG3> 9/29/93 chp Add Grand Central DMA sub-transfer routine initialization.
|
||
; <SM24> 11/9/93 KW for the CygnusX1 ROM, use SlowRead96 instead of FastRead_96_BIOS
|
||
; until we get our new BTU chip
|
||
; <SM23> 10/29/93 DCB Initializing our Deferred Task queue element which is used in
|
||
; the pseudo-DMA data transfer routines to lower the interrupt
|
||
; level.
|
||
; <MC7> 10/28/93 pdw Rearranged some vectors, fixed up the forPDMProto stuff again.
|
||
; <SM22> 10/14/93 pdw <MC> roll-in.
|
||
; <MC6> 10/12/93 pdw Changed a .s to a .w to fix another build problem.
|
||
; <MC5> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
|
||
; Machine, message handling etc.
|
||
; <MC4> 10/6/93 pdw Fixed forPDMProto stuff.
|
||
; <MC3> 10/4/93 RC Put forPDMProto around AMIC3/2 special code
|
||
; <MC2> 9/17/93 pdw Removed exception for Cold Fusion in PRAM check for disabling
|
||
; DMA read.
|
||
; <SM21> 9/12/93 pdw Got rid of vector for HALtransfer since the routine is gone.
|
||
; <SM20> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
|
||
; stuff.
|
||
; <SM19> 7/20/93 pdw Changed DMA-disabling/enabling PRAM interpretation. Now it
|
||
; defaults to (in zero case) the fastest, safe means. For EVT3s
|
||
; this means DMA for all others (including Cold Fusion), this
|
||
; means pseudo-DMA.
|
||
; <SM18> 7/17/93 pdw Lots of little things.
|
||
; <SM17> 7/8/93 pdw Replaced slow DMA routines with SlowRead96 until I fix the
|
||
; residual length problems with the DMA routines.
|
||
; <SM16> 6/29/93 pdw Massive checkins: Change asynchronicity mechanism to CallMachine
|
||
; stack switching mechanism. Adding support for Cold Fusion.
|
||
; Rearranging HW/SW Init code. Some code optimizations.
|
||
; <SM15> 5/25/93 DCB Rollin from Ludwig. (The next item below)
|
||
; <LW10> 5/21/93 PW Adding PRAM selectable Initiator ID stuff.
|
||
; <SM14> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
|
||
; from Ludwig stuff.
|
||
; <SM13> 4/8/93 DCB Added Initialization code for Wombat class machines.
|
||
; <LW9> 5/1/93 PW Put IF RECORD_ON around the initial RecordEvent call.
|
||
; <LW8> 4/30/93 DCB Getting rid of Info HalAction vector. It is getting its own
|
||
; entry point into the HAL to prevent deadlocks.
|
||
; <LW7> 4/30/93 PW Added some extra fields in jump table for future use.
|
||
; <LW5> 4/14/93 DCB Added jump table vector for SetParity
|
||
; <SM12> 3/29/93 PW Added PDM test code to turn on real DMA reads and/or real DMA
|
||
; writes if certain PRAM bits are set.
|
||
; <LW4> 3/26/93 PW Added code to initialize new DMA vectors.
|
||
; <SM10> 3/23/93 DCB Removed a reference to the old SCSI Globals which aren't
|
||
; supported anymore.
|
||
; <SM9> 3/23/93 PW Removing RejectMsg stuff.
|
||
; <SM8> 3/20/93 PW Unknown changes.
|
||
; <LW3> 2/17/93 PW For PDM: replaces Fast with Slow routines since they have
|
||
; trouble with DREQ.
|
||
; <SM7> 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM
|
||
; (will update Ludwig with these as needed myself).
|
||
; <LW2> 1/27/93 PW Added dispatch tables for InitDataPointer and DoData routines.
|
||
; <SM6> 10/30/92 DCB Added Setup and Teardown routines to support Direct DMA into a
|
||
; user buffer
|
||
; <SM5> 10/8/92 PW Got rid of unused third Read and Write transfer routine vectors.
|
||
; <SM4> 8/30/92 PW Added kAssertATN to dispatch list.
|
||
; <SM3> 8/20/92 DCB Fixed SCSI Bus Reset
|
||
; <SM2> 7/27/92 PW Virtually initial check-in.
|
||
;
|
||
;==========================================================================
|
||
|
||
BLANKS ON ; assembler accepts spaces & tabs in operand field
|
||
PRINT OFF ; do not send subsequent lines to the listing file
|
||
; don't print includes
|
||
|
||
CACHEBUG EQU 0 ;••••••••••••••••••••••••••••••••••••••
|
||
|
||
LOAD 'StandardEqu.d'
|
||
INCLUDE 'HardwarePrivateEqu.a'
|
||
INCLUDE 'UniversalEqu.a' ; for TestFor
|
||
INCLUDE 'DeferredTaskEqu.a'
|
||
|
||
INCLUDE 'Debug.a' ; for NAME macro
|
||
|
||
INCLUDE 'SCSI.a'
|
||
INCLUDE 'SCSIEqu53c96.a'
|
||
|
||
INCLUDE 'HALc96equ.a'
|
||
INCLUDE 'ACAM.a'
|
||
INCLUDE 'XPTEqu.a'
|
||
|
||
PRINT ON ; do send subsequent lines to the listing files
|
||
CASE OBJECT
|
||
|
||
HALc96Init PROC EXPORT ;
|
||
|
||
EXPORT Initc96Asm
|
||
|
||
; From SCSIMgr96.a ---
|
||
IMPORT CyclePhase ;
|
||
IMPORT DoSCSIMsgIn
|
||
; From SCSIMgrHW96.a ---
|
||
IMPORT BusErrHandler96, Install_ISR
|
||
|
||
|
||
IMPORT DoInitiate
|
||
IMPORT DoBitBucket
|
||
IMPORT DoDataIn
|
||
IMPORT DoDataOut
|
||
IMPORT DoAcceptMsg
|
||
IMPORT DoMsgOut
|
||
IMPORT DoStatus
|
||
IMPORT DoComplete
|
||
IMPORT DoSaveDataPointer
|
||
IMPORT DoModifyDataPointer
|
||
IMPORT DoRestorePointers
|
||
IMPORT GetReconnectInfo
|
||
IMPORT GetSelectInfo
|
||
IMPORT DoSelect
|
||
IMPORT DoCommand
|
||
IMPORT DoHalInfo
|
||
IMPORT DoReset
|
||
IMPORT DoAssertATN
|
||
IMPORT SlowRead96
|
||
IMPORT SlowWrite96
|
||
IMPORT FastRead96
|
||
IMPORT FastWrite96
|
||
IMPORT TeardownIO ; <SM6> DCB
|
||
IMPORT SetParity ; <LW5> DCB
|
||
IMPORT InitDataTIB
|
||
IMPORT InitDataBuffer
|
||
IMPORT InitDataSG
|
||
IMPORT DoDataTIB
|
||
IMPORT DoDataBuffer
|
||
IMPORT DoDataSG
|
||
IMPORT StartPSC, StopPSCRead, StopPSCWrite, Wt4PSCComplete
|
||
IMPORT StartAMIC, StopAMICRead, StopAMICWrite, Wt4AMICComplete
|
||
IMPORT StartGC, StopGCRead, StopGCWrite, Wt4GCComplete
|
||
IMPORT FastRead_96_BIOS,FastWrite_96_BIOS
|
||
IMPORT DataIn_DMA, DataIn_DMA1x1, DataOut_DMA
|
||
|
||
IMPORT SetupIOPSC, TeardownIOPSC
|
||
IMPORT SetupIOAMIC, TeardownIOAMIC
|
||
IMPORT SetupIOGC, TeardownIOGC
|
||
IMPORT SetupIONoDMA, TeardownIONoDMA
|
||
|
||
IMPORT AutoMsgIn, HandleSelected
|
||
IMPORT Wt4SelectComplete
|
||
IMPORT HandleBusInt
|
||
IMPORT RecordEvent
|
||
IMPORT DataDTask,ci_jDisptch_Vers,ci_jDisptch
|
||
IMPORT oldjDisptch
|
||
|
||
WITH HALc96GlobalRecord
|
||
|
||
|
||
;-------------------------------------------------------------
|
||
;
|
||
Macro
|
||
DispatchVector &ROMAddress
|
||
IF forC96Init OR forROM THEN ;
|
||
dc.l &ROMAddress-Initc96Asm
|
||
ELSE
|
||
dcImportResident &ROMAddress
|
||
ENDIF
|
||
EndM
|
||
|
||
OffsetTbl96
|
||
;——— Externals (Entry points)
|
||
DispatchVector DoInitiate
|
||
DispatchVector DoBitBucket
|
||
DispatchVector DoDataIn
|
||
DispatchVector DoDataOut
|
||
DispatchVector DoAcceptMsg
|
||
DispatchVector unusedVector
|
||
DispatchVector unusedVector
|
||
DispatchVector DoMsgOut
|
||
DispatchVector DoStatus
|
||
DispatchVector DoComplete
|
||
DispatchVector DoSaveDataPointer
|
||
DispatchVector DoModifyDataPointer
|
||
DispatchVector DoRestorePointers
|
||
DispatchVector GetReconnectInfo
|
||
DispatchVector GetSelectInfo
|
||
DispatchVector DoSelect
|
||
DispatchVector unusedVector
|
||
DispatchVector DoCommand
|
||
DispatchVector SetParity ; <LW5> DCB
|
||
DispatchVector HandleSelected
|
||
|
||
DispatchVector SetupIONoDMA
|
||
DispatchVector DoReset
|
||
DispatchVector DoAssertATN ; <SM4> pdw
|
||
DispatchVector TeardownIONoDMA
|
||
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
DispatchVector unusedVector ; unused for now
|
||
|
||
;——— Internals (Non-entry points)
|
||
; Init Data Pointer routines
|
||
DispatchVector InitDataBuffer
|
||
DispatchVector InitDataTIB
|
||
DispatchVector InitDataSG
|
||
DispatchVector unusedVector
|
||
; Data routines
|
||
DispatchVector DoDataBuffer
|
||
DispatchVector DoDataTIB
|
||
DispatchVector DoDataSG
|
||
DispatchVector unusedVector
|
||
; Xfer routines
|
||
DispatchVector DataIn_DMA
|
||
DispatchVector DataIn_DMA
|
||
DispatchVector DataOut_DMA ; <SM5> pdw
|
||
DispatchVector DataOut_DMA ; <SM5> pdw
|
||
|
||
DispatchVector unusedVector
|
||
DispatchVector CyclePhase
|
||
DispatchVector BusErrHandler96
|
||
DispatchVector unusedVector
|
||
|
||
DispatchVector unusedVector ; jvStartDMA - fill it in below
|
||
DispatchVector unusedVector ; jvStopReadDMA - fill it in below
|
||
DispatchVector unusedVector ; jvStopWriteDMA - fill it in below
|
||
DispatchVector unusedVector ; jvWt4DMAComplete - fill it in below
|
||
|
||
DispatchVector AutoMsgIn ;
|
||
DispatchVector Wt4SelectComplete ;
|
||
DispatchVector HandleBusInt ;
|
||
DispatchVector unusedVector ; unused
|
||
|
||
DispatchVector unusedVector ;
|
||
DispatchVector unusedVector ;
|
||
DispatchVector unusedVector ;
|
||
DispatchVector unusedVector ;
|
||
|
||
DispatchVector unusedVector ;
|
||
DispatchVector unusedVector ;
|
||
DispatchVector unusedVector ;
|
||
DispatchVector unusedVector ;
|
||
|
||
tblEntries equ (*-OffsetTbl96)/4
|
||
|
||
|
||
;==========================================================================
|
||
|
||
unusedVector
|
||
DebugStr 'HAL unusedVector'
|
||
rts
|
||
|
||
;-------------------------------------------------------------
|
||
;
|
||
; Initialization code for the SCSI Manager 5394/5396
|
||
|
||
Initc96Asm
|
||
link a6, #0
|
||
|
||
movem.l intrRegs, -(sp) ; save all registers, for convenience
|
||
movea.l 8(a6), A5 ; get ptr to HAL globals
|
||
move.l baseRegAddr(A5), A3 ; load A3 with base addr of 53c96
|
||
|
||
;———————————————————————————————————————
|
||
;
|
||
; Set up jump table - go through DispatchVectors above and copy them into the HALglobals
|
||
;
|
||
IF (numSelectors<>tblEntries) THEN
|
||
xxx TABLES DO NOT MATCH
|
||
ENDIF
|
||
moveq.l #numSelectors-1, d1 ; loop count
|
||
IF forC96Init OR forROM THEN ; if not a linked patch, make addrs relative
|
||
lea.l Initc96Asm, a1 ; get start of SCSI Mgr code
|
||
move.l a1, d0 ; remember base address
|
||
ELSE
|
||
moveq.l #0, D0 ; if linked patch, make addrs absolute
|
||
ENDIF
|
||
lea OffsetTbl96, a1 ; address of offset table
|
||
lea G_JmpTbl(A5), a0 ; point to base of jump table
|
||
@MakeJmpTbl
|
||
move.l (a1)+, d2 ; get the next offset
|
||
beq.s @skipEntry ; if zero, skip this entry
|
||
add.l d0, d2 ; compute the address
|
||
move.l d2, (a0) ; install it in the jump table
|
||
@skipEntry
|
||
adda.l #4, a0
|
||
dbra d1, @MakeJmpTbl ; loop for all vectors
|
||
|
||
;———————————————————————————————————————
|
||
;
|
||
; Replace standard vectors (just loaded) with those for specific hardware
|
||
;
|
||
IF forPDMProto THEN
|
||
bset #doRealDMARead, dmaFlags(A5)
|
||
bset #doRealDMAWrite, dmaFlags(A5)
|
||
ENDIF
|
||
|
||
tst.b HBAhasDMA(A5) ; does HBA have real DMA?
|
||
beq.w @hasNoDMA ; no-> install psuedo-DMA routines
|
||
@hasDMA
|
||
move.b dmaAlignmentSize(A5), D0 ; 8 or 16 (or whatever)
|
||
ext.w D0
|
||
ext.l D0
|
||
subq.l #1, D0
|
||
move.l D0, dmaAlignMask(A5)
|
||
|
||
cmp.b #dmaTypePSC, dmaType(A5) ; is it a PSC-type DMA?
|
||
beq.s @hasPSC ; -> yes
|
||
cmp.b #dmaTypeAMIC, dmaType(A5) ; is it an AMIC-type DMA?
|
||
beq.s @hasAMIC ; -> yes
|
||
cmp.b #dmaTypeGC, dmaType(A5) ; is it a Grand Central-type DMA?
|
||
beq.w @hasGC
|
||
|
||
DebugStr 'Bad hwDesc - dmaType unknown'
|
||
|
||
;
|
||
; CYCLONE ——————————————————————
|
||
;
|
||
@hasPSC
|
||
lea StartPSC, A0
|
||
move.l A0, jvStartDMA(A5)
|
||
|
||
lea StopPSCRead, A0
|
||
move.l A0, jvStopReadDMA(A5)
|
||
|
||
lea StopPSCWrite, A0
|
||
move.l A0, jvStopWriteDMA(A5)
|
||
|
||
lea Wt4PSCComplete, A0
|
||
move.l A0, jvWt4DMAComplete(A5)
|
||
|
||
lea SetupIOPSC, A0
|
||
move.l A0, jvSetupIO(A5)
|
||
|
||
lea TeardownIOPSC, A0
|
||
move.l A0, jvTeardownIO(A5)
|
||
|
||
bra.w @endDMAstuff
|
||
|
||
;
|
||
; PDM ——————————————————————
|
||
;
|
||
@hasAMIC ; first do DMA sub-transfer routines
|
||
lea StartAMIC, A0
|
||
move.l A0, jvStartDMA(A5)
|
||
|
||
lea StopAMICRead, A0
|
||
move.l A0, jvStopReadDMA(A5)
|
||
|
||
lea StopAMICWrite, A0
|
||
move.l A0, jvStopWriteDMA(A5)
|
||
|
||
lea Wt4AMICComplete, A0
|
||
move.l A0, jvWt4DMAComplete(A5)
|
||
|
||
lea SetupIOAMIC, A0
|
||
move.l A0, jvSetupIO(A5)
|
||
|
||
lea TeardownIOAMIC, A0
|
||
move.l A0, jvTeardownIO(A5)
|
||
|
||
|
||
lea SlowRead96, A0 ; LET'S FIGURE OUT WHAT'S WRONG WITH LITTLE DMAs!!!
|
||
move.l A0, jvReadSlow(A5)
|
||
|
||
IF forPDMProto THEN
|
||
|
||
IMPORT DoWeHaveAMIC3B
|
||
bsr DoWeHaveAMIC3B ; If we don’t have AMIC3B then
|
||
beq.s @hasNoDMA ; use pseudo-DMA routines.
|
||
|
||
ENDIF
|
||
|
||
bra.w @endDMAstuff
|
||
|
||
;
|
||
; TNT ——————————————————————
|
||
;
|
||
@hasGC
|
||
lea StartGC, A0
|
||
move.l A0, jvStartDMA(A5)
|
||
|
||
lea StopGCRead, A0
|
||
move.l A0, jvStopReadDMA(A5)
|
||
|
||
lea StopGCWrite, A0
|
||
move.l A0, jvStopWriteDMA(A5)
|
||
|
||
lea Wt4GCComplete, A0
|
||
move.l A0, jvWt4DMAComplete(A5)
|
||
|
||
lea SetupIOGC, A0
|
||
move.l A0, jvSetupIO(A5)
|
||
|
||
lea TeardownIOGC, A0
|
||
move.l A0, jvTeardownIO(A5)
|
||
|
||
bra.s @endDMAstuff
|
||
|
||
;
|
||
; QUADRAs and CENTRISes ——————————————————————
|
||
;
|
||
@hasNoDMA
|
||
lea FastRead96, A0 ; assume FastRead96
|
||
move.l A0, jvReadFast(A5) ; put this into transfer routine vector
|
||
|
||
lea FastWrite96, A0 ; assume FastWrite96
|
||
move.l A0, jvWriteFast(A5) ; put this into transfer routine vector
|
||
|
||
lea SlowRead96, A0 ; always SlowRead96
|
||
move.l A0, jvReadSlow(A5)
|
||
|
||
lea SlowWrite96, A0 ; always SlowWrite96
|
||
move.l A0, jvWriteSlow(A5)
|
||
|
||
|
||
cmp.b #pdmaTypeBIOS, dmaType(a5) ; Is this a BIOS equipped Machine?
|
||
bne.s @endDMAstuff ; if not -> assumptions correct
|
||
|
||
|
||
IF forSTP601v1 THEN
|
||
lea SlowRead96, A0 ; •••• if so, replace routines with BIOS versions
|
||
ELSE
|
||
lea FastRead_96_BIOS, A0 ; if so, replace routines with BIOS versions
|
||
ENDIF
|
||
|
||
move.l A0, jvReadFast(A5)
|
||
|
||
lea FastWrite_96_BIOS, A0
|
||
move.l A0, jvWriteFast(A5)
|
||
|
||
@endDMAstuff
|
||
|
||
|
||
;———————————————————————————————————————
|
||
;
|
||
; Configure rCF3NormalVal and rCF3DMAVal according to our hardware
|
||
;
|
||
|
||
move.b #mCF3_SaveResidual, rCF3NormalVal(A5) ; assume NOT T8
|
||
move.b #mCF3_SaveResidual, rCF3DMAVal(A5) ; assume NOT T8
|
||
|
||
tst.b usesThreshold8(A5) ; is T8 used for DMA?
|
||
beq.s @endThresholdStuff ; no -> skip this all
|
||
|
||
move.b #mCF3_SaveResidual + mCF3_Threshold8 + mCF3_AltDMAMode, rCF3DMAVal(A5)
|
||
; do not assert DREQ on residual byte at end of xfer
|
||
; enable alternate DMA mode
|
||
; enable threshold 8 mode
|
||
|
||
tst.b HBAhasPseudoDMA(A5) ; does HBA have pseudo DMA?
|
||
bne.s @endThresholdStuff ; -> if so, switch back and forth
|
||
|
||
move.b rCF3DMAVal(A5), rCF3NormalVal(A5) ; if not, always use T8
|
||
|
||
@endThresholdStuff
|
||
move.b rCF3NormalVal(A5), rCF3(A3) ; configure for normal operation
|
||
|
||
|
||
;———————————————————————————————————————
|
||
;
|
||
; Assorted stuff
|
||
;
|
||
bsr Install_ISR
|
||
|
||
WITH DeferredTask
|
||
WITH SCSIGlobalsRec
|
||
|
||
; Setup the real deferred task
|
||
lea dataDT(a5),a0 ; our deferred task record
|
||
lea DataDTask,a1 ; the deferred task
|
||
clr.l qLink(a0) ; reserved on entry
|
||
move.w #dtQType, qType(a0) ; The queue type
|
||
move.l a1, dtAddr(a0) ; fill in PB
|
||
move.l a5, dtParm(a0) ; Save globals do DT can restore a5
|
||
clr.l dtReserved(a0) ; reserved
|
||
clr.w dtFlags(a0) ; reserved
|
||
|
||
; Setup the dummy deferred task
|
||
lea dataDT_Null(a5),a0 ; our deferred task record
|
||
lea @bogusDefer,a1 ; the deferred task (!)
|
||
clr.l qLink(a0) ; reserved on entry
|
||
move.w #dtQType, qType(a0) ; The queue type
|
||
move.l a1, dtAddr(a0) ; fill in PB
|
||
move.l a5, dtParm(a0) ; parameter is our globals
|
||
clr.l dtReserved(a0) ; reserved
|
||
clr.w dtFlags(a0) ; reserved
|
||
|
||
move.l SCSIGlobals, A0 ;
|
||
move.l ci_jDisptch_Vers, D0 ; our version number
|
||
cmp.l ci_jDisptchVers(A0), D0 ; already installed?
|
||
beq.b @alreadyInstalled ; yep
|
||
move.l D0, ci_jDisptchVers(A0) ; remember our version number
|
||
move.l jDisptch, oldjDisptch(A0) ; remember the old routine
|
||
clr.w privDTQFlags(A0) ; clear out the qFlags field
|
||
clr.l privDTQHead(A0) ; and the qHead
|
||
clr.l privDTQTail(A0) ; and the qTail
|
||
lea ci_jDisptch, A1 ; get our patch
|
||
move.l A1, jDisptch ; and install it in the jVector
|
||
@alreadyInstalled
|
||
|
||
clr.b dataDTFlags(a5) ; clear our flags field
|
||
|
||
move.b #SCSIPhase.kBusFreePhase, currentPhase(A5)
|
||
|
||
IF RECORD_ON THEN
|
||
pea $00000000
|
||
pea '===='
|
||
bsr RecordEvent
|
||
addq.l #8, sp
|
||
ENDIF
|
||
|
||
movem.l (sp)+, intrRegs ; restore registers
|
||
|
||
unlk A6
|
||
rts
|
||
@bogusDefer
|
||
rts
|
||
|
||
NAME 'Initc96Asm'
|
||
|
||
ENDWITH
|
||
ENDWITH
|
||
ENDWITH
|
||
|
||
ENDP
|
||
|
||
END
|
||
|