{ File: SmallDominoBuffer.asm
Modification History:
DEG .PA: 6-Oct-84 0:15:06: Add 1984 to the copyright notice
DEG .PA: 1-Sep-84 18:45:55: Add copyright notice
JMM .PA: 26-Oct-83 10:16:16: release some space for burdock version of SmallDomino.bin
DEG .PA: 9-Oct-83 13:28:03: Fix up kludges.
DEG .PA: 26-Sep-83 22:54:07: Fold in Hals changes for Burdock.
DEG .PA: 12-Apr-83 20:08:14: Overlay the voice and RS232C Buffers.
Jim JXF : September 15, 1982 4:53 PM: Initialize KeyMap in the IO Page.
Jim JXF : August 9, 1982 4:15 PM: Add BlockBuffer for Processor ReadBlock and WriteBlock commands. Put initial code and Burdock code in the Floppy buffer.
Jim JXF : April 22, 1982 1:05 PM: Rewrite RS232C
}
{ Copyright (C) 1982, 1983 by Xerox Corporation. All rights reserved.}
{ This file contains the allocation of the large buffer areas for Domino. The buffers are allocated at the end of the code, so that they do not take up room during the loading of Domino during booting. This module should always be the LAST module in the Domino
configuration. }
GET "RS232CDefs.asm"
GET "SysDefs.asm"
GET "CommonDefs.asm"
IMP ClearMiscControl1Bit ;Common
IMP DisableRST ;Common
IMP GetTOD ;BookKeepingTask
IMP MainLoop ;BookKeepingTask
IMP ProcData0 ;BookKeepingTask
IMP ProcData1 ;BookKeepingTask
IMP ProcData2 ;BookKeepingTask
IMP PutMPanel ;Common
IMP ReadKeyboard ;BookKeepingTask
IMP SetMiscControl1Bit ;Common
IMP TransferProcessorCSB ;BookKeepingTask
IMP Wait ;Common
EXP EndFDBuffer ; FloppyTask buffer
EXP FDBuffer0 ; FloppyTask buffer
EXP FDBuffer1 ; FloppyTask buffer
EXP RxFIFO ; For RS232CTask
EXP Start
EXP StartFDBuffer ; FloppyTask buffer
{ EXP SpeechOutBuffer0 ; From Buffer
EXP SpeechOutBuffer1 ; From Buffer
EXP SpeechInBuffer0 ; From Buffer
EXP SpeechInBuffer1 ; From Buffer
}
EXP TxBuffer
; Burdock
IMP BurdockIOCB ;CPSubs
IMP ReadCPBuffer ;CPSubs
IMP WriteCPBuffer ;CPSubs
IMP StartCPReadDma ;CPSubs
IMP StartCPWriteDma ;CPSubs
IMP CheckCPDmaComplete ;CPSubs
IMP DoNakedNotify ;CPSubs
IMP ZeroCommand ;From Common
EXP OldReadUmbilical
EXP OldWriteUmbilical
EXP DoBurdockCmd
; Voice equates to eventually go into SysDefs.asm
VoiceBufferSize EQU 512
TxRemBufferSize EQU TxBufferSize-(2*VoiceBufferSize)
VBSMinusTxRBS EQU VoiceBufferSize-TxRemBufferSize
RxRemBufferSize EQU RxFifoSize-VoiceBufferSize-VBSMinusTxRBS
; RS232C Task Buffers
TxBuffer:
{ DS RxFifoSize+TxBufferSize jmm° 13-Oct-83 16:21:14
}
; DS 4*VoiceBufferSize (whichever is greater)
SpeechOutBuffer0 EQU TxBuffer
SpeechOutBuffer1 EQU SpeechOutBuffer0+VoiceBufferSize
SpeechInBuffer0 EQU SpeechOutBuffer1+VoiceBufferSize
SpeechInBuffer1 EQU SpeechInBuffer0+VoiceBufferSize
RxFIFO EQU TxBuffer+TxBufferSize
;
{ Floppy Task buffers:
Note that the Start code and the Burdock code is in the Floppy buffers. This means that the Burdock code cannot be used if the Floppy has been used.
(Each buffer is large enough to hold a one page sector):
(The area from StartFDBuffer to EndFDBuffer can hold 4 standard Sectors)}
;
StartFDBuffer:
BurdockDataBuffer:
ds 0
FDBuffer0:
ds 0
Start:
DI ;For Initializing
LXI SP,UserStkStart ;Initialize user stack pointer
MVI A,ResetRst75+Rst75DisableMsk+Rst65DisableMsk
CALL DisableRST ;Disable RST 6.5 and 7.5, clear 7.5 FF (RS232C, Floppy)
MVI A,DisableFDC ;Disable floppy controller, Enable Waits
OUT FDCState
IN DmaStatus ;Clear the DMA status register
XRA A ;Clear A
OUT DmaMode ;Disable controller
EI ;For mouse halting
CMA ;Set all clock bits high
OUT MiscClocks1
LXI H,MPStartDomino ;Initialize the Maintenance Panel
CALL PutMPanel ;MP ← StartDomino (500)
OUT MouseClr ;Clear hardware counters
MVI A,KBDiag ;Set KB diag mode
CALL SetMiscControl1Bit
LXI H,KBDiagWait ;Initialize delay for KBDiag signal
CALL Wait ;Wait 15 msec
MVI A,nKBDiag ;Clear KB diag mode
CALL ClearMiscControl1Bit ;clear bit in register
{Initialize the TOD state.}
LXI H,MPInitTOD
CALL PutMPanel ;MP ← InitTOD (501)
CALL GetTOD
LXI H,MPInitTODDone
CALL PutMPanel ;MP ← InitTODDone (502) and RET
CALL ReadKeyboard ;Initialize KeyMap in IO Page
JMP MainLoop
LastStartInstruction DS 0
StartCodeCount EQU LastStartInstruction-Start
ds 512-StartCodeCount
FD1BufferSize EQU 1024
FDBuffer1:
{For the copyright notice to be readable in the microcode file every other character has to be switched. It is important that the copyright notice be placed on an even boundary}
CopyrightNotice:
DB "oCypirhg tC( )9108 ,9118 ,9128 ,9138 ,9148b yeXor xoCprrotaoi.n lA lirhgstr sereev.d"
EndOfCopyrightNotice:
CopyrightNoticeLength EQU EndOfCopyrightNotice-CopyrightNotice
ds FD1BufferSize-CopyrightNoticeLength
;
StartBurdockCode:
TimeOutConst equ 0A000H ; Approx. .25 sec
OldReadUmbilical:
{Processor Command 7: Read a Block of Data from the other IOP via the Umbilical box
ProcData2 contains the number of bytes to transfer. ProcData1 and ProcData0 contain a Long Pointer to the user's buffer area. This area must be resident.}
CALL SetupOldDataPCB
LXI D,BurdockDataBuffer ;DE ← IOP Buffer address
ReadBlockLoop:
{Wait for a byte from (other) IOP Kernel. The inner loop is approximately 49 cycles (~= 17 usec). The delay is approximately 17 * TimeOutConst usec.}
LXI H,TimeOutConst
WaitToReadByte:
IN AltoPPIC
ANI IntBMask ;[7]
JNZ ReadByte ;[7] nz => Byte is ready
DCX H ;[6]
MOV A,H ;[4]
ORA L ;[4]
JNZ WaitToReadByte ;[10]
JMP SetUmbilicalReturnCode
ReadByte:
IN AltoPPIB
STAX D ;Store byte in buffer
INX D ;Increment buffer address
LHLD BlockCopyCount
DCX H
SHLD BlockCopyCount
MOV A,H
ORA L
JNZ ReadBlockLoop
CALL WriteDataBuffer ; Send block to CP
JMP SetUmbilicalReturnCode
OldWriteUmbilical:
{Processor Command 8: Do Write Umbilical Block Command.
ProcData2 contains the number of bytes to write in the high order byte. ProcData1 and ProcData0 contain a Long Pointer to the user's buffer area. This area must be resident.}
; Set up the PCB to transfer the data between CP virtual memory and BurdockDataBuffer.
CALL SetupOldDataPCB
CALL ReadDataBuffer ; Read block from CP
LXI D,BurdockDataBuffer ;DE ← IOP Buffer address
WriteBlockLoop:
LDAX D ;A ← next byte from buffer
OUT AltoPPIA ;Write data
{Now wait for the (other) IOP Kernel to grab the byte. The inner loop is approximately 49 cycles (~= 17 usec). The delay is approximately 17 * TimeOutConst usec.}
LXI H,TimeOutConst
WaitAckLoop:
IN AltoPPIC ;[11]
ANI IntAMask ;[7]
JNZ NextByte ;[7] nz => IOP Kernel took byte
DCX H ;[6]
MOV A,H ;[4]
ORA L ;[4]
JNZ WaitAckLoop ;[10]
SetUmbilicalReturnCode:
LHLD BlockCopyCount ;Will be zero if
SHLD ProcData0 ;all bytes transferred
JMP TransferProcessorCSB
NextByte:
INX D ;Increment buffer address
DB opLXIH ;HL ← BlockCopyCount
BlockCopyCount:
DW 0
DCX H
SHLD BlockCopyCount
MOV A,H
ORA L
JNZ WriteBlockLoop
JMP SetUmbilicalReturnCode
SetupOldDataPCB:
; Set up the PCB to transfer the data between CP virtual memory and BurdockDataBuffer.
LHLD ProcData1
SHLD BurdockDataLo
LHLD ProcData0
SHLD BurdockDataHi
LHLD ProcData2
SHLD BlockCopyCount
INX H ; Make the count even
MOV A,L
ANI 0FEH
MOV L,A
SHLD BurdockByteCnt
RET
;
BaseAddress EQU AltoPPI ; For IN and OUT
Status EQU BaseAddress+0
BufferFrmCPFull EQU 8H
BufferToCPFull EQU 10H
CPData EQU BaseAddress+1
Finger EQU BaseAddress+2
Contents EQU BaseAddress+3
{Beware of byte order: the bytes within a word get swapped}
BurdockInfo: DS 0
BurRegister: DS 1 ; Register to use for DebuggerBoard operations
BurCommand: DS 1 ; Command byte
BurNotifyBits: DS 2 ; Naked Notify bits
BurDataLow: DS 2 ; CP buffer pointer (low)
BurDataHigh: DS 2 ; CP buffer pointer (high)
BurByteCount: DS 2
BurdockInfoEnd: DS 0
BurdockInfoSize EQU BurdockInfoEnd-BurdockInfo
CopyBurdockIocb:
DS 2 ; CP buffer pointer (low)
DW 0 ; CP buffer pointer (high)
DW BurdockInfoSize ; CP buffer count (bytes)
DW BurdockInfo ; Pointer to IOP buffer
ZeroBurdockIocb:
DW BurdockIocbLoc ; CP buffer pointer (low)
DW CPIOPageHi ; CP buffer pointer (high)
DW 2 ; CP buffer count (bytes)
DW ZeroCommand ; Pointer to IOP buffer
BurdockDataPCB: ; PortControlBlock for sloshing Burdock data
BurdockDataLo: DW 0
BurdockDataHi: DW 0
BurdockByteCnt: DW 0
DW BurdockDataBuffer
DoBurdockCmd:
LHLD BurdockIOCB
SHLD CopyBurdockIocb
LXI H,CopyBurdockIocb
CALL ReadCPBuffer ; Copy over IOCB
LHLD BurDataLow; ; Setup data PCB
SHLD BurdockDataLo
LHLD BurDataHigh
SHLD BurdockDataHi
LHLD BurByteCount
INX H ; Make the count even
MOV A,L
ANI 0FEH
MOV L,A
SHLD BurdockByteCnt
LDA BurCommand
CPI 1
JZ ReadUmbilicalBlock
CPI 2
JZ WriteUmbilicalBlock
CPI 3
JZ ReadDebuggerBlock
CPI 4
JZ WriteDebuggerBlock
CPI 5
JZ ReadCPBlock
CPI 6
JZ WriteCPBlock
JMP UnknownBurdockCommand
ReadUmbilicalBlock:
CALL WriteDataBuffer
JMP UnknownBurdockCommand
WriteUmbilicalBlock:
CALL ReadDataBuffer
JMP UnknownBurdockCommand
ReadDebuggerBlock:
LDA BurRegister
OUT Finger
LXI D,BurdockDataBuffer ;DE ← IOP Buffer address
ReadDebuggerBlockLoop:
IN Contents
STAX D ; Store byte in buffer
INX D ; Increment buffer address
LHLD BurByteCount
DCX H
SHLD BurByteCount
MOV A,H
ORA L
JNZ ReadDebuggerBlockLoop
CALL WriteDataBuffer
JMP FinishBurdockCommand
WriteDebuggerBlock:
CALL ReadDataBuffer
LDA BurRegister
OUT Finger
LXI D,BurdockDataBuffer ; DE ← IOP Buffer address
WriteDebuggerBlockLoop:
LDAX D ; Load byte from buffer
OUT Contents
INX D ; Increment buffer address
LHLD BurByteCount
DCX H
SHLD BurByteCount
MOV A,H
ORA L
JNZ WriteDebuggerBlockLoop
JMP FinishBurdockCommand
ReadCPBlock:
LXI D,BurdockDataBuffer
ReadCPBlockLoop:
LXI H,TimeOutConst
ReadCPBlockWait:
DCX H
MOV A,H
ORA L
JZ Timeout
IN Status
ANI BufferFrmCPFull
JZ ReadCPBlockWait
IN CPData
STAX D
INX D
LHLD BurByteCount
DCX H
SHLD BurByteCount
MOV A,H
ORA L
JNZ ReadCPBlockLoop
CALL WriteDataBuffer
JMP FinishBurdockCommand
WriteCPBlock:
CALL ReadDataBuffer
LXI D,BurdockDataBuffer
WriteCPBlockLoop:
LDAX D ; A ← next byte from buffer
OUT CPData
LXI H,TimeOutConst
WriteCPBlockWait:
DCX H
MOV A,H
ORA L
JZ Timeout
IN Status
ANI BufferToCPFull
JNZ WriteCPBlockWait
INX D
LHLD BurByteCount
DCX H
SHLD BurByteCount
MOV A,H
ORA L
JNZ WriteCPBlockLoop
JMP FinishBurdockCommand
UnknownBurdockCommand:
XRA A
STA BurCommand ; Smash command byte for error marker
Timeout:
FinishBurdockCommand:
LXI H,CopyBurdockIocb ; Write back updated byte count
CALL WriteCPBuffer
LXI H,ZeroBurdockIocb
CALL WriteCPBuffer
LHLD BurNotifyBits
JMP DoNakedNotify ; and RET
ReadDataBuffer:
LXI H,BurdockDataPCB
CALL StartCPReadDma
JMP WaitForTransfer
WriteDataBuffer:
LXI H,BurdockDataPCB
CALL StartCPWriteDma
WaitForTransfer:
CALL CheckCPDmaComplete
JZ WaitForTransfer
RET
LastBurdockInstruction: DS 0
BurdockInstructionCount EQU LastBurdockInstruction-StartBurdockCode
ds 512-BurdockInstructionCount
;
EndFDBuffer:
ds 0
;-----------------------------------------------------
NextLoc:
ds 1 ; Next free location
END Buffer