sys7.1-doc-wip/Drivers/IOP/SCCIOPSysEqu.aii
2019-07-27 22:37:48 +08:00

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