mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-29 07:29:15 +00:00
5b0f0cc134
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
940 lines
24 KiB
Plaintext
940 lines
24 KiB
Plaintext
;__________________________________________________________________________________________________
|
|
;
|
|
; File: SCCIOPSysEqu.aii
|
|
;
|
|
; Contains: IOP System Equates include file
|
|
;
|
|
; Written by: Bill O'Connor
|
|
;
|
|
; Copyright: © 1988-1991 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <4> 8/26/91 JSM Remove equates of TRUE and FALSE, now done in build script.
|
|
; <3> 1/14/90 SWC Fixed a comment in the header that wasn't a comment because the
|
|
; semicolon was missing.
|
|
; <2> 1/12/90 WTO Change the value of IO_Cntl_Int to improve SCC access times.
|
|
; <1.2> 11/2/89 WTO Updated to handle DMA Lap
|
|
; <1.1> 7/8/89 CCH Added EASE comments to file.
|
|
; <1.0> 2/8/89 SGS Initial release
|
|
;__________________________________________________________________________________________________
|
|
|
|
|
|
DriverA Equ 2
|
|
DriverB Equ 3
|
|
|
|
Clock Equ $02 ; 2 MHZ CPU clock
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* Hardware equates
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
IOBase Equ $f000 ; IOP I/O base address
|
|
|
|
TmCnt_Lo Equ IOBase+$10 ; Timer low count address
|
|
TmCnt_Hi Equ IOBase+$11 ; Timer high count address
|
|
TmLatch_Lo Equ IOBase+$12 ; Timer latch low address
|
|
TmLatch_Hi Equ IOBase+$13 ; Timer latch high address
|
|
DMA1_Cntl Equ IOBase+$20 ; DMA channel 1 control
|
|
DMA1_AddrLo Equ IOBase+$21 ; DMA channel 1 low address
|
|
DMA1_AddrHi Equ IOBase+$22 ; DMA channel 1 high address
|
|
DMA1_CntLo Equ IOBase+$23 ; DMA channel 1 transfer count low
|
|
DMA1_CntHi Equ IOBase+$24 ; DMA channel 1 transfer count high
|
|
|
|
DMA2_Cntl Equ IOBase+$28 ; DMA channel 2 control
|
|
DMA2_AddrLo Equ IOBase+$29 ; DMA channel 2 low address
|
|
DMA2_AddrHi Equ IOBase+$2a ; DMA channel 2 high address
|
|
DMA2_CntLo Equ IOBase+$2b ; DMA channel 2 transfer count low
|
|
DMA2_CntHi Equ IOBase+$2c ; DMA channel 2 transfer count high
|
|
|
|
SCC_Cntl Equ IOBase+$30 ; SCC control register
|
|
IO_Cntl Equ IOBase+$31 ; I/O control register
|
|
TD_Cntl Equ IOBase+$32 ; Timer/DPLL control register
|
|
Int_Mask Equ IOBase+$33 ; Interrupt Mask register
|
|
Int_Reg Equ IOBase+$34 ; IOP interrupt register address
|
|
Int_Host Equ IOBase+$35 ; Interrupt host register
|
|
|
|
|
|
SCC_BCntl Equ IOBase+$40 ; IOP SCC control register channel B
|
|
SCC_BStat Equ IOBase+$40 ; IOP SCC status register channel B
|
|
SCC_ACntl Equ IOBase+$41 ; IOP SCC control register channel A
|
|
SCC_AStat Equ IOBase+$41 ; IOP SCC status register channel A
|
|
SCC_BData Equ IOBase+$42 ; IOP SCC data register channel B
|
|
SCC_AData Equ IOBase+$43 ; IOP SCC data register channel A
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* Software equates
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
SCC_Cntl_Init Equ $00 ; Initial value for SCC control register
|
|
IO_Cntl_Init Equ $23 ; Initial value for I/O control register
|
|
Int0 Equ %00000100 ; Host interrupt 0
|
|
Int1 Equ %00001000 ; Host interrupt 1
|
|
|
|
*
|
|
* SCC control register equates
|
|
*
|
|
|
|
ByPass_Bit Equ %00000001 ; ByPass mode bit mask
|
|
SCC_Port Equ %00000000 ; Make IOP SCC
|
|
ISM_Port Equ %00000010 ; Make IOP ISM
|
|
PClk39 Equ %00000000 ; P Clock is 3.9 MHZ
|
|
PClk78 Equ %00000100 ; P Clock is 7.8 MHZ
|
|
RTXCA_36 Equ %00000000 ; RTXCA source is 3.6864 MHZ
|
|
RTXCA_DPClk Equ %00001000 ; RTXCA source is DPCLK/16
|
|
RTXCA_DPLL Equ %00010000 ; RTXCA source is DPLL
|
|
RTXCA_GPIA Equ %00011000 ; RTXCA source is GPIA
|
|
RTXCB_36 Equ %00000000 ; RTXCB source is 3.6864 MHZ
|
|
RTXCB_DPClk Equ %00100000 ; RTXCB source is DPCLK/16
|
|
RTXCB_DPLL Equ %01000000 ; RTXCB source is DPLL
|
|
RTXCB_GPIA Equ %01100000 ; RTXCA source is GPIA
|
|
DeBugg Equ %10000000
|
|
|
|
*
|
|
* Interrupt Mask register equates
|
|
*
|
|
|
|
DMA1_Msk Equ %00000010
|
|
DMA2_Msk Equ %00000100
|
|
SCC_Msk Equ %00001000
|
|
Host_Msk Equ %00010000 ;
|
|
Timer_Msk Equ %00100000
|
|
|
|
*
|
|
* Timer DPLL control register equates
|
|
*
|
|
|
|
One_Shot Equ %00000001 ;
|
|
Continuous Equ %00000001
|
|
DPLLA_En Equ %00010000 ; Enable DPLL for channel A
|
|
RxCDA_Msk Equ %00100000 ; Receive carrier detected mask
|
|
DPLLB_En Equ %01000000 ; Enable DPLL for channel B
|
|
RxCDB_Msk Equ %10000000 ; Receive carrier detected mask
|
|
|
|
StackPage Equ $0100 ; Stack page
|
|
|
|
pswB Equ %00010000 ; Processor status word decode for BRK
|
|
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* Interrupt priority type equates.
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
UnKnwn Equ $00
|
|
SCC Equ $02 ; SCC interrupt
|
|
DMA2 Equ $04 ; DMA2 interrupt
|
|
DMA1 Equ $06 ; DMA1 interrupt
|
|
TIMER Equ $08 ; Timer interrupt
|
|
HOST Equ $0a ; Host interrupt
|
|
|
|
B_BufEmp Equ $00 ; Channel B transmit buffer empty
|
|
B_EXT Equ $02 ; Channel B external status change
|
|
B_RX Equ $04 ; Channel B receive character available
|
|
B_SpecRx Equ $06 ; Channel B special receive condition
|
|
|
|
A_BufEmp Equ $08 ; Channle A transmit buffer empty
|
|
A_EXT Equ $0a ; Channel A external status change
|
|
A_RX Equ $0c ; Channel A receive character available
|
|
A_SpecRx Equ $0e ; Channel A special receive condition
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* SCC register constants
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Wr_reg0 Equ $00
|
|
Wr_reg1 Equ $01
|
|
Wr_reg2 Equ $02
|
|
Wr_reg3 Equ $03
|
|
Wr_reg4 Equ $04
|
|
Wr_reg5 Equ $05
|
|
Wr_reg6 Equ $06
|
|
Wr_reg7 Equ $07
|
|
Wr_reg8 Equ $08
|
|
Wr_reg9 Equ $09
|
|
Wr_reg10 Equ $0a
|
|
Wr_reg11 Equ $0b
|
|
Wr_reg12 Equ $0c
|
|
Wr_reg13 Equ $0d
|
|
Wr_reg14 Equ $0e
|
|
Wr_reg15 Equ $0f
|
|
|
|
Rd_reg0 Equ $00
|
|
Rd_reg1 Equ $01
|
|
Rd_reg2 Equ $02
|
|
Rd_reg3 Equ $03
|
|
Rd_reg8 Equ $08
|
|
Rd_reg10 Equ $0a
|
|
Rd_reg12 Equ $0c
|
|
Rd_reg13 Equ $0d
|
|
Rd_reg15 Equ $0f
|
|
|
|
*
|
|
* Software Equates
|
|
*
|
|
* Register bit masks
|
|
*
|
|
*
|
|
* Write register 0
|
|
*
|
|
|
|
Reset_ExtInt Equ %00010000 ; $10 Reset external status interrupts
|
|
RxInt_Enable Equ %00100000 ; $20 Enable interrupt on next recieved char
|
|
Reset_TxPend Equ %00101000 ; $28 Reset Tx interrupt pending
|
|
Err_Reset Equ %00110000 ; $30 Error reset
|
|
Reset_IUS Equ %00111000 ; $38 Reset highest IUS
|
|
Reset_TxCRC Equ %10000000 ; $80 Reset Tx CRC latch
|
|
Reset_TxUnRun Equ %11000000 ; $C0 Reset Tx underrun/EOM
|
|
|
|
*
|
|
* Write register 1
|
|
*
|
|
|
|
Ext_IntEnable Equ %00000001 ; $01 External interrupt enable
|
|
Tx_IntEnable Equ %00000010 ; $02 Tx interrupt enable
|
|
Par_SpcCnd Equ %00000100 ; $04 Parity is special condition
|
|
Rx_IntDisable Equ %00000000 ; $00 Rx interrupt disable
|
|
Int_1RxChar Equ %00001000 ; $08 Interrupt on first received character
|
|
Int_RxChar Equ %00010000 ; $10 Interrupt on all received characters
|
|
Int_SpcCnd Equ %00011000 ; $18 Interrupt special condition only
|
|
DMA_Rx Equ %00100000 ; $20 DMA active for Rx
|
|
DMA_Tx Equ %00000000 ; $00 DMA active for Tx
|
|
DMA_Req Equ %01000000 ; DMA request funtion = request
|
|
DMA_Enable Equ %10000000 ; DMA enable
|
|
|
|
*
|
|
* Write register 3
|
|
*
|
|
|
|
Rx_Enable Equ %00000001 ; $01 Receive enable
|
|
Sync_Inhibit Equ %00000010 ; $02 Sync char load inhibit
|
|
Addr_Srch Equ %00000100 ; $04 Address search enable
|
|
Rx_CRC Equ %00001000 ; $08 Receive CRC enable
|
|
Hunt_Enable Equ %00010000 ; $10 Enable Hunt/Sync
|
|
Auto_Eanable Equ %00100000 ; $20 Programs func of DCD and CTS pins
|
|
Rx_5Bits Equ %00000000 ; $00 Set Rx to 5 bits per char
|
|
Rx_7Bits Equ %01000000 ; $40 Set Rx to 7 bits per char
|
|
Rx_6Bits Equ %10000000 ; $80 Set Rx to 6 bits per char
|
|
Rx_8Bits Equ %11000000 ; $c0 Set Rx to 8 bits per char
|
|
|
|
*
|
|
* Write register 4
|
|
*
|
|
|
|
Par_Enable Equ %00000001 ; $01 Parity Enable
|
|
Par_Even Equ %00000010 ; $02 Parity Even
|
|
Par_Odd Equ %00000000 ; $00 Parity Odd
|
|
Sync_Enable Equ %00000000 ; $00 Sync modes enable
|
|
StopBit1 Equ %00000100 ; $04 1 stop bits/char
|
|
StopBit15 Equ %00001000 ; $80 1.5 stop bits/char
|
|
StopBit2 Equ %00001100 ; $C0 2 stop bits/char
|
|
Sync8 Equ %00000000 ; $00 8 bit sync char
|
|
Sync16 Equ %00010000 ; $10 16 bit sync char
|
|
SDLC_Mode Equ %00100000 ; $20 Set SDLC mode
|
|
Ext_Sync Equ %00110000 ; $30 External sync mode
|
|
X1Clk Equ %00000000 ; $00 X 1 clock
|
|
X16Clk Equ %01000000 ; $40 X 16 clock
|
|
X32Clk Equ %10000000 ; $80 X 32 clock
|
|
X64Clk Equ %11000000 ; $C0 X 64 clock
|
|
|
|
*
|
|
* Write register 5
|
|
*
|
|
|
|
Tx_CRC Equ %00000001 ; $01 Enable Tx CRCs
|
|
Dvr_Enable Equ %00000010 ; $02 Enable output driver
|
|
CRC16Poly Equ %00000100 ; $04 CRC 16 polynomial
|
|
SDLCPoly Equ %00000000 ; $00 SDLC CRC polynomial
|
|
Tx_Enable Equ %00001000 ; $08 Enable Tx
|
|
SndBreak Equ %00010000 ; $10 Send break
|
|
Tx_5Bits Equ %00000000 ; $00 Set Tx to 5 bits per char
|
|
Tx_7Bits Equ %00100000 ; $20 Set Tx to 7 bits per char
|
|
Tx_6Bits Equ %01000000 ; $40 Set Tx to 6 bits per char
|
|
Tx_8Bits Equ %01100000 ; $60 Set Tx to 8 bits per char
|
|
DTRSet Equ %10000000 ; $80 trun DTR on
|
|
|
|
*
|
|
* Write register 7
|
|
*
|
|
|
|
SDLC_Flag Equ $7e ; SDLC flag
|
|
|
|
*
|
|
* Write register 9
|
|
*
|
|
|
|
No_Vec Equ %00000010 ; $02 No vector
|
|
MIE Equ %00001000 ; $08 Master Interrupt enable
|
|
NoReset Equ %00000000 ; $00 NoReset
|
|
ChanB_Reset Equ %01000000 ; $40 Reset channel B
|
|
ChanA_Reset Equ %10000000 ; $80 Reset channel A
|
|
SCC_Reset Equ %11000000 ; $C0 Force SCC Reset
|
|
|
|
*
|
|
* Write register 10
|
|
*
|
|
|
|
Bit8Sync Equ %00000000 ; $00 8 bit sync
|
|
Bit6Sync Equ %00000001 ; $01 6 bit sync
|
|
Loop Equ %00000010 ; $02 loop
|
|
CRC_UnRun Equ %00000000 ; $00 send CRC on transmit underrun
|
|
Abort_UnRun Equ %00000100 ; $04 send Abort on transmit underrun
|
|
Flg_Idle Equ %00000000 ; $00 send flag on idle
|
|
Mark_Idle Equ %00001000 ; $08 send mark on idle
|
|
ActivePoll Equ %00010000 ; $10 go active on poll
|
|
NRZ Equ %00000000 ; $00 Set NRZ mode
|
|
NRZI Equ %00100000 ; $20 Set NRZI mode
|
|
FM1 Equ %01000000 ; $40 Set FM1 mode
|
|
FM0 Equ %01100000 ; $60 Set FM0 mode
|
|
CRC_Preset Equ %10000000 ; $80 CRC Preset
|
|
|
|
*
|
|
* Write register 11
|
|
*
|
|
|
|
TRxC_XTAL Equ %00000000 ; $00 TRxC = XTAL
|
|
TRxC_TxClk Equ %00000001 ; $01 TRxC = Transmit clock
|
|
TRxC_BR Equ %00000010 ; $02 TRxC = Baud Rate generator
|
|
TRxC_DPLL Equ %00000011 ; $03 TRxC = DPLL
|
|
TxClk_RTxC Equ %00000000 ; $00 Transmit clock = ~RTxC pin
|
|
TxClk_TRXC Equ %00001000 ; $08 Transmit clock = ~TRxC
|
|
TxClk_BR Equ %00010000 ; $10 Transmit clock = Baud rate generator output
|
|
TxClk_DPLL Equ %00011000 ; $18 Transmit clock = DPLL
|
|
RxClk_RTxC Equ %00000000 ; $00 Receive clock = ~RTxC pin
|
|
RxClk_TRxC Equ %00100000 ; $20 Receive clock = ~TRxC pin
|
|
RxClk_BR Equ %01000000 ; $40 Receive clock = Br generator
|
|
RxClk_DPLL Equ %01100000 ; $60 Receive clock = DPLL output
|
|
|
|
*
|
|
* Write register 12
|
|
*
|
|
|
|
Baud_Lo Equ $06 ; Low value for baud rate generator
|
|
|
|
*
|
|
* Write register 13
|
|
*
|
|
|
|
Baud_Hi Equ $00 ; High value for buad rate generator
|
|
|
|
*
|
|
* Write register 14
|
|
*
|
|
|
|
BR_Enable Equ %00000001 ; $01 Enable baud rate generator
|
|
BR_SrcRTxC Equ %00000010 ; $02 BR source is RTxC pin
|
|
ReqFunc Equ %00000100 ; $04 Request Function
|
|
AutoEcho Equ %00001000 ; $08 Auto enable mode of operation
|
|
LoopBck Equ %00010000 ; $10 Local loop back mode
|
|
Srch_Mode Equ %00100000 ; $20 Enter search mode
|
|
Reset_MCLock Equ %01000000 ; $40 Reset missing clock latch
|
|
Disable_DPLL Equ %01100000 ; $60 Disable DPLL
|
|
DPLL_BR Equ %10000000 ; $80 DPLL source is Baud Rate generator
|
|
DPLL_RTxC Equ %10100000 ; $A0 DPLL source is RTxC pin
|
|
DPLL_FM Equ %11000000 ; $C0 Set DPLL to FM mode
|
|
DPLL_NRZI Equ %11100000 ; $E0 Set DPLL to NRZI mode
|
|
|
|
*
|
|
* Write register 15
|
|
*
|
|
|
|
ZeroCount_IE Equ %00000010 ; $01 Zero count IE
|
|
DCD_IE Equ %00001000 ; $08 DCD IE
|
|
SyncHunt_IE Equ %00010000 ; $10 Sync/Hunt IE
|
|
CTS_IE Equ %00100000 ; $20 CTS IE
|
|
TxUnRun_IE Equ %01000000 ; $40 Tx UnderRun IE
|
|
BrkAbort_IE Equ %10000000 ; $80 Break Abort IE
|
|
|
|
*
|
|
* Read register 0
|
|
*
|
|
|
|
Rx_CharAvail Equ %00000001 ; $01 Rx character available
|
|
ZeroCount Equ %00000010 ; $02 BR zero count
|
|
Tx_BufEmpty Equ %00000100 ; $04 Transmit buffer empty mask
|
|
DCD_Msk Equ %00001000 ; $08 DCD
|
|
SyncHunt Equ %00010000 ; $10 Sync Hunt
|
|
CTS_Msk Equ %00100000 ; $20 CTS
|
|
Tx_UnRun Equ %01000000 ; $40 Tx underrun/EOM
|
|
BreakAbort Equ %10000000 ; $80 Break abort
|
|
|
|
*
|
|
* Read register 1
|
|
*
|
|
|
|
AllSent Equ %00000001 ; $01 All sent
|
|
Par_Err Equ %00010000 ; $10 Parity Error
|
|
Rx_OvRun Equ %00100000 ; $20 Receive buffer overrun
|
|
CRC_Err Equ %01000000 ; $40 CRC error
|
|
End_Frame Equ %10000000 ; $80 End of frame
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* Diagnostic and Error Equates
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
NonMask Equ $00
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* Message Passing Equates
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
TxMsgCnt Equ $0300 ; Address of Transmit max message count
|
|
RxMsgCnt Equ $0200 ; Address of Receive max message count
|
|
TxMsgPage Equ $0300 ; Transmit message page
|
|
RxMsgPage Equ $0200 ; Receive message page
|
|
TxMsgState Equ TxMsgPage ; Beginning address of state variables - 1
|
|
RxMsgState Equ RXMsgPage ; Beginning address of state variables -1
|
|
MaxTxMsg Equ $07 ; Maximum number of Transmit messages
|
|
MaxRxMsg Equ $07 ; Maximum number of receive messages
|
|
|
|
Idle Equ $00 ; Message Idle
|
|
NewMsgSent Equ $01 ; New message sent
|
|
MsgRcv Equ $02 ; Message received
|
|
MsgCmplt Equ $03 ; Message complete
|
|
|
|
*
|
|
* Kernel Error Messages
|
|
*
|
|
|
|
NoErr Equ 0
|
|
Error Equ -1 ; Didn' like sumthin (Unable to write packet etc.)
|
|
UnKnwnMsg Equ -2 ; Received an unsupported message
|
|
DvrInUse Equ -3 ; Driver is already in use
|
|
InByPass Equ -4 ; IOP is in bypass mode
|
|
NotAlloc Equ -5 ; Driver has not been allocated
|
|
BadID Equ -6 ; The wrong ID was used to turn off ByPass
|
|
|
|
*
|
|
* ALap Error Messages
|
|
*
|
|
|
|
ENQFailed Equ -1 ; ACK was received during ENQ attempt
|
|
|
|
DvrA Equ $00
|
|
DvrB Equ $01
|
|
Kern Equ $02
|
|
MaxDvr Equ DvrB
|
|
|
|
*
|
|
* Kernel Equates
|
|
*
|
|
|
|
Krn_CmdBase Equ $0000 ; Base address of kernel command table
|
|
KCmd_Table_size Equ $28 ; Size of Kernel command table in bytes
|
|
|
|
InstRxMsg Equ $00 ; Install receive message signaller
|
|
RemvRxMsg Equ $00 ; Remove receive message signaller
|
|
InstTxCmpl Equ $01 ; Install transmit completion routine
|
|
RemvTxCmpl Equ $01 ; Remove transmit completion routine
|
|
InstISR Equ $02 ; Install an interrupt service routine handler
|
|
RemvISR Equ $02 ; Remove an interrupt service routine
|
|
SCCISR Equ $03 ; Install SCC interrupt handler
|
|
RemvSCCISR Equ $03 ; Remove an interrupt service routine
|
|
InstTask Equ $04 ; Install a task into event loop
|
|
KillTask Equ $04 ; Deinstall a task from the loop
|
|
RelTask Equ $05 ; Release a task for one cycle
|
|
WaitEvent Equ $06 ; Wait for an event
|
|
SignalTask Equ $07 ; Signal a task that an event has occurred
|
|
ResetEvent Equ $08 ; Reset the event flag after the event is handled
|
|
ResetChan Equ $09 ; Reset SCC channel
|
|
GetTMPB Equ $0a ; Get a timer parameter block index
|
|
InstTmTask Equ $0b ; Install a timer task
|
|
RegVer Equ $0c ; Register version info
|
|
|
|
*
|
|
* Kernel Signals
|
|
*
|
|
|
|
InitFin Equ $02 ; Signal to Kernel that driver has initialized
|
|
|
|
*
|
|
* Task ID's
|
|
*
|
|
|
|
TCBSize Equ $05
|
|
Kern_ID Equ $00
|
|
DvrA_ID Equ TCBSize
|
|
DvrB_ID Equ (2*TCBSize)
|
|
|
|
*
|
|
* TMPB Time constants (1 tick = 256 clocks @1.9584MHz = 130.71895 uSec)
|
|
*
|
|
|
|
TMPB1second Equ 7650 ; 1 second
|
|
TMPB100ms Equ TMPB1second/10 ; 100 milliseconds
|
|
TMPB10ms Equ TMPB1second/100 ; 10 milliseconds
|
|
TMPB1ms Equ TMPB1second/1000 ; 1 millisecond
|
|
|
|
*
|
|
* Task Stack Pointers
|
|
*
|
|
|
|
Kern_Sp Equ $1FF
|
|
DvrA_Sp Equ $1A9 ; Driver A stack bottom
|
|
DvrB_Sp Equ $154 ; Driver B stack bottom
|
|
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
*
|
|
* IOP Zero Page Memory Map
|
|
*
|
|
* The IOP has three things going on:
|
|
* i. kernel/operating system/host interface
|
|
* ii. driver for channel A
|
|
* iii. driver for channel B
|
|
*
|
|
* The Zero page will be divided equally among the three.
|
|
* This gives 85 bytes per process.
|
|
*
|
|
* ____________________
|
|
* | Driver B Zp | $AA-$FF
|
|
* ___________________
|
|
* | Driver A Zp | $55-$A9
|
|
* ___________________
|
|
* | Kernel Zp | $00-$54
|
|
* ___________________
|
|
*
|
|
* Zero Page Variables
|
|
*
|
|
*
|
|
* Memory Map
|
|
*
|
|
* ____________________
|
|
* | Driver B | $56AA-$7fef
|
|
* ___________________
|
|
* | Driver A | $2d55-$56a9
|
|
* ___________________
|
|
* | Kernel | $400-$2d54
|
|
* ___________________
|
|
*
|
|
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Kernel_ZP Equ KCmd_Table_size+1
|
|
DvrA_Zp Equ $55
|
|
DvrB_Zp Equ $aa
|
|
|
|
Kern_Base Equ $400
|
|
|
|
DvrA_Base Equ $2d55
|
|
DvrB_Base Equ $56aa
|
|
DvrA_Top Equ DvrB_Base-1
|
|
DvrB_Top Equ $7fef-1
|
|
DvrA_Close Equ DvrA_Base+3
|
|
DvrB_Close Equ DvrB_Base+3
|
|
|
|
*
|
|
* Kernel Macros
|
|
*
|
|
* The 65C02 does not has a JSR (Address) instruction.
|
|
* To emulate this instruction your code should contain a table
|
|
* like this. Each procedure using these macros must then import
|
|
* this table address.
|
|
*
|
|
* Cmd_JmpTable Jmp (Krn_CmdBase+(RemvRxMsg*2))
|
|
* Jmp (Krn_CmdBase+(RemvTxCmpl*2))
|
|
* Jmp (Krn_CmdBase+(RemvISR*2))
|
|
* Jmp (Krn_CmdBase+(RemvSCCISR*2))
|
|
* Jmp (Krn_CmdBase+(InstTask*2))
|
|
* Jmp (Krn_CmdBase+(RelTask*2))
|
|
* Jmp (Krn_CmdBase+(WaitEvent*2))
|
|
* Jmp (Krn_CmdBase+(SignalTask*2))
|
|
* Jmp (Krn_CmdBase+(ResetEvent*2))
|
|
* Jmp (Krn_CmdBase+(ResetChan*2))
|
|
* Jmp (Krn_CmdBase+(GetTMPB*2))
|
|
* Jmp (Krn_CmdBase+(InstTmTask*2))
|
|
* Jmp (Krn_CmdBase+(RegVer*2))
|
|
*
|
|
|
|
*
|
|
* Install Receive message signaller macro
|
|
*
|
|
* Arguments
|
|
*
|
|
* &MsgNum - number of the message box that uses this handler
|
|
* &HndleAddr - the handler address
|
|
*
|
|
|
|
|
|
MACRO
|
|
_Inst_RxMsgSgn &MsgNum, &SgnAddr
|
|
|
|
Ldy #>&SgnAddr ; Push the handler address
|
|
Lda #<&SgnAddr
|
|
Ldx #&MsgNum*2 ; Put the message number in register A
|
|
Sec ; Set carry to message install signaller
|
|
Jsr Cmd_JmpTable+(InstRxMsg*3)
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Remove Receive message signaller macro
|
|
*
|
|
* Arguments
|
|
*
|
|
* &MsgNum - number of the message box that uses this handler
|
|
*
|
|
|
|
|
|
MACRO
|
|
_Remv_RxMsgSgn &MsgNum
|
|
|
|
Ldx #&MsgNum*2 ; Put the message number in register A
|
|
Clc ; Clear carry to do remove message signaller
|
|
Jsr Cmd_JmpTable+(InstRxMsg*3)
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Install Transmit completion signaller macro
|
|
*
|
|
* Arguments
|
|
*
|
|
* &MsgNum - number of the message box that uses this handler
|
|
* &HndleAddr - the handler address
|
|
*
|
|
|
|
MACRO
|
|
_Inst_TxCmplSgn &MsgNum, &SgnAddr
|
|
|
|
Ldy #>&SgnAddr ; Push the handler address
|
|
Lda #<&SgnAddr
|
|
Ldx #&MsgNum*2 ; Load the msg number in register A
|
|
Sec ; Set carry to install message signaller
|
|
Jsr Cmd_JmpTable+(InstTxCmpl*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Remove Transmit completion signaller macro
|
|
*
|
|
* Arguments
|
|
*
|
|
* &MsgNum - number of the message box that uses this handler
|
|
*
|
|
|
|
MACRO
|
|
_Remv_TxCmplSgn &MsgNum
|
|
|
|
Ldx #&MsgNum*2 ; Load the msg number in register A
|
|
Clc ; Clear carry to do remove signaller
|
|
Jsr Cmd_JmpTable+(InstTxCmpl*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
|
|
*
|
|
* Assign an interrupt routine
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Type - The type of interrupt
|
|
* &HndlAddr - The interrupt handler address
|
|
*
|
|
|
|
MACRO
|
|
_Inst_ISR &Type, &HndlAddr
|
|
|
|
Ldy #>&HndlAddr ; Push the handler address
|
|
Lda #<&HndlAddr
|
|
Ldx #&Type
|
|
Sec ; Set carry for install ISR
|
|
Jsr Cmd_JmpTable+(InstISR*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Remove an interrupt service routine routine
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Type - The type of interrupt
|
|
*
|
|
|
|
MACRO
|
|
_Remv_ISR &Type
|
|
|
|
Ldx #&Type
|
|
Clc ; Clear carry for remove ISR
|
|
Jsr Cmd_JmpTable+(RemvISR*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Assign an SCC interrupt routine
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Type - The type of interrupt
|
|
* &HndlAddr - The interrupt handler address
|
|
*
|
|
|
|
MACRO
|
|
_Inst_SCC_ISR &Type, &HndlAddr
|
|
|
|
Ldy #>&HndlAddr ; Push the handler address
|
|
Lda #<&HndlAddr
|
|
Ldx #&Type
|
|
Sec ; Set carry for install SCC ISR
|
|
Jsr Cmd_JmpTable+(SCCISR*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Remove an SCC interrupt routine
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Type - The type of interrupt
|
|
*
|
|
|
|
MACRO
|
|
_Remv_SCC_ISR &Type
|
|
|
|
Ldx #&Type
|
|
Clc ; Clear carry for remove SCC ISR
|
|
Jsr Cmd_JmpTable+(RemvSCCISR*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Install a Task
|
|
*
|
|
* Arguments
|
|
*
|
|
* &ID - the task ID
|
|
* &TaskAddr - the task address
|
|
*
|
|
|
|
MACRO
|
|
_Inst_Task &ID, &TaskAddr
|
|
|
|
Ldy #>&TaskAddr ; Push the handler address
|
|
Lda #<&TaskAddr
|
|
Ldx #&ID
|
|
Sec ; Set the Carry install task
|
|
Jsr Cmd_JmpTable+(InstTask*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Kill a task
|
|
*
|
|
* Argument
|
|
*
|
|
* &ID - the task ID
|
|
*
|
|
|
|
MACRO
|
|
_Kill_Task &ID
|
|
|
|
Ldx #&ID
|
|
Clc ; Clear Carry for kill task
|
|
Jsr Cmd_JmpTable+(KillTask*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
|
|
*
|
|
* Wait for an event to occur
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Type - the event type or types we are waiting for
|
|
*
|
|
|
|
MACRO
|
|
_Wait_Event &Type
|
|
|
|
Lda #&Type
|
|
Jsr Cmd_JmpTable+(WaitEvent*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Signal Task that an event has occurred
|
|
*
|
|
* Arguments
|
|
*
|
|
* &ID - ID of task you wish to signal
|
|
* &Sgn - mask you wish placed in tasks tEvent
|
|
*
|
|
|
|
MACRO
|
|
_Signal_Task &ID, &Sgn
|
|
|
|
Ldx #&ID
|
|
Lda #&Sgn
|
|
Jsr Cmd_JmpTable+(SignalTask*3)
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Reset the event after it has occurred.
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Type - the event type or types we are reseting.
|
|
* (Actually the complement of the Flags we use for _Wait_Event)
|
|
*
|
|
|
|
MACRO
|
|
_Reset_Event &Type
|
|
|
|
Lda #Å&Type
|
|
Jsr Cmd_JmpTable+(ResetEvent*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Relase this task for one Tasking cycle
|
|
*
|
|
* Arguments
|
|
*
|
|
*
|
|
|
|
MACRO
|
|
_Release_Task
|
|
|
|
Jsr Cmd_JmpTable+(RelTask*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Reset Channel
|
|
*
|
|
* Arguments
|
|
*
|
|
* &Chan - channel A or channel B
|
|
*
|
|
|
|
MACRO
|
|
_Reset_Chan &Chan
|
|
|
|
If &Chan='A' then
|
|
Sec
|
|
ElseIf &Chan='B' then
|
|
Clc
|
|
Else
|
|
AERROR 'Must specify A or B channel
|
|
EndIf
|
|
|
|
Jsr Cmd_JmpTable+(ResetChan*3)
|
|
|
|
ENDM
|
|
|
|
*
|
|
* _Get_TMPB - get a timer parameter block.
|
|
*
|
|
* Arguments
|
|
*
|
|
* none
|
|
*
|
|
* Returns parameter block index in register Y
|
|
*
|
|
|
|
MACRO
|
|
_Get_TMPB
|
|
|
|
Clc
|
|
Jsr Cmd_JmpTable+(GetTMPB*3)
|
|
|
|
ENDM
|
|
|
|
*
|
|
* _Free_TMPB - free a timer parameter block.
|
|
*
|
|
* Arguments
|
|
*
|
|
* If &Param is equal to the null string then it is assumed
|
|
* the index is already in register Y. Else register Y is
|
|
* loaded with &Param.
|
|
*
|
|
|
|
MACRO
|
|
_Free_TMPB &Param
|
|
|
|
Sec
|
|
IF &PARAM='' THEN
|
|
Jsr Cmd_JmpTable+(GetTMPB*3)
|
|
ELSE
|
|
Ldy &Param
|
|
Jsr Cmd_JmpTable+(GetTMPB*3)
|
|
ENDIF
|
|
|
|
ENDM
|
|
|
|
*
|
|
* _Inst_TmTask - install a timer task.
|
|
*
|
|
* Arguments
|
|
*
|
|
* If &Param is equal to the null string then it is assumed
|
|
* the index is already in register Y. Else register Y is
|
|
* loaded with &Param.
|
|
*
|
|
* &Addr - address of the time and completion routine paramaters
|
|
*
|
|
|
|
MACRO
|
|
_Inst_TmTask &Addr
|
|
|
|
Clc
|
|
Lda #<&Addr
|
|
Ldx #>&Addr
|
|
Jsr Cmd_JmpTable+(InstTmTask*3)
|
|
|
|
ENDM
|
|
|
|
*
|
|
* _Cancel_TmTask - cancel a timer task.
|
|
*
|
|
* Arguments
|
|
*
|
|
* If &Param is equal to the null string then it is assumed
|
|
* the index is already in register Y. Else register Y is
|
|
* loaded with &Param.
|
|
*
|
|
|
|
MACRO
|
|
_Cancel_TmTask &Param
|
|
|
|
Sec
|
|
IF &PARAM='' THEN
|
|
Jsr Cmd_JmpTable+(InstTmTask*3)
|
|
ELSE
|
|
Ldy &Param
|
|
Jsr Cmd_JmpTable+(InstTmTask*3)
|
|
ENDIF
|
|
|
|
ENDM
|
|
|
|
*
|
|
* Register Version info
|
|
*
|
|
* Arguments
|
|
*
|
|
* &ID - the Driver ID
|
|
* &InfoAddr - the task address
|
|
*
|
|
|
|
MACRO
|
|
_Reg_Ver &ID, &InfoAddr
|
|
|
|
Ldy #>&InfoAddr ; Push the handler address
|
|
Ldx #<&InfoAddr
|
|
Lda #&ID
|
|
Jsr Cmd_JmpTable+(RegVer*3) ; Do the indirect jump
|
|
|
|
ENDM
|
|
|