'CUSTOM_XMM.inc 'Last Revision On 20 Jul 19 '=============================================================================== { ' The XMM functions included are controlled via Catalina symbols defined ' internally as required within various Catalina files: ' ' CACHED : defined if CACHE in use (any size) ' ' NEED_FLASH : defined if FLASH support required ' ' NEED_XMM_READLONG : defined if XMM_ReadLong (and XMM_ReadMult) required ' ' NEED_XMM_WRITELONG : defined if XMM_WriteLong (and XMM_WriteMult) required ' ' NEED_XMM_READPAGE : defined if XMM_ReadPage required ' ' NEED_XMM_WRITEPAGE : defined if XMM_WritePage required } '=============================== CACHE CHECK =================================== ' ' If this platform does not need the cache enabled, delete the following: ' '#ifndef CACHED '#error : PLATFORM REQUIRES CACHE OPTION (CACHED_1K .. CACHED_8K or CACHED) '#endif ' '====================================== FLASH CHECK ========================================== ' ' If this platform has FLASH RAM, delete the following: ' '#ifdef NEED_FLASH '#error : FLASH NOT SUPPORTED ON THIS PLATFORM '#endif ' '=============================CONSTANTS FOR THIS CONFIGURATION================================ CON Ram_Clk_Pin = 6 Ram_Cs_Pin = 5 Ram_Bus_D3 = 3 Ram_Bus_D2 = 2 Ram_Bus_D1 = 1 Ram_Bus_D0 = 0 Ram_Clk = (|< Ram_Clk_Pin) Ram_Sel = (|< Ram_Cs_Pin) SPI_Hold = (|< Ram_Bus_D3) SPI_DNU = (|< Ram_Bus_D2) SPI_SO = (|< Ram_Bus_D1) SPI_SI = (|< Ram_Bus_D0) SPI_Hi = SPI_SI | SPI_Hold SPI_Lo = SPI_SI | Ram_Clk Ram_Bus = SPI_Hold | SPI_DNU | SPI_SO | SPI_SI Ram_Sigs = Ram_Clk | Ram_Sel | SPI_Hi Ram_Bus_Loc = Ram_Bus_D0 MQM = $38 WDR = $02 RDR = $03 DAT '================================== MINIMAL API FUNCTIONS ==================================== '==================================XMM_ACTIVATE FUNCTION====================================== XMM_Activate or dira,RamSigs 'Enable RamClk,RamSel,D3,D0 or outa,RamSigs 'Set RamClk=1,RamSel=1,D3=1,D0=1 call #MakeQuadMode 'Switch To Quad Mode XMM_Activate_ret '===================================XMM_TRISTATE FUNCTION===================================== XMM_Tristate XMM_Tristate_ret ret '============================XMM_WRITEPAGE FUNCTION (HubRam -> XMM)=========================== #ifdef NEED_XMM_WRITEPAGE { 'This Version Transfers Bytes XMM_WritePage andn outa,RamSel 'RamSel=Lo (SRAM Active) call #SendWriteCmd 'Configure SRAM For Writing :GrabHubData rdbyte RamData,Hub_Addr 'HubRam -> RamData (This Is A Byte) mov RamLoop,#02 'RamLoop=2 (Send 2 Nibbles To SRAM) call #SendRamData 'RamData -> SRAM add Hub_Addr,#01 'Hub_Addr=Hub_Addr + 1 add XMM_Addr,#01 'XMM_Addr=XMM_Addr + 1 djnz XMM_Len,#:GrabHubData 'if(--XMM_Len > 0) goto GrabHubData or outa,RamSel 'RamSel=Hi (SRAM Inactive) XMM_WritePage_ret ret 'Return } 'This Version Transfers Longs XMM_WritePage andn outa,RamSel 'RamSel=Lo (SRAM Active) call #SendWriteCmd 'Configure SRAM For Writing add XMM_Addr,XMM_Len 'XMM_Addr=XMM_Addr + XMM_Len shr XMM_Len,#02 'XMM_Len (Bytes) -> XMM_Len (Longs) :GrabHubData rdlong RamData,Hub_Addr 'HubRam -> RamData (This Is A Long) mov RamLoop,#08 'RamLoop=8 call #SendRamData 'Send HubRam Data To XMM add Hub_Addr,#04 'Hub_Addr=Hub_Addr + 4 djnz XMM_Len,#:GrabHubData 'if(--XMM_Len > 0) goto GrabHubData or outa,RamSel 'RamSel=Hi (SRAM Inactive) XMM_WritePage_ret ret 'Return #endif '============================XMM_READPAGE FUNCTION (XMM -> HubRam)============================== #ifdef NEED_XMM_READPAGE { 'This Version Transfers Bytes XMM_ReadPage andn outa,RamSel 'RamSel=Lo (SRAM Active) call #SendReadCmd 'Configure SRAM For Reading :GrabXmmData mov RamLoop,#02 'RamLoop=2 (Grab 2 Nibbles From SRAM) call #GetRamData 'SRAM -> RamData wrbyte RamData,Hub_Addr 'RamData -> HubRam add Hub_Addr,#01 'Hub_Addr=Hub_Addr + 1 add XMM_Addr,#01 'XMM_Addr=XMM_Addr + 1 djnz XMM_Len,#:GrabXmmData 'if(--XMM_Len > 0) goto GrabXmmData or outa,RamSel 'RamSel=Hi (SRAM Inactive) XMM_ReadPage_ret ret 'Return } 'This Version Transfers Longs XMM_ReadPage andn outa,RamSel 'RamSel=Lo (SRAM Active) call #SendReadCmd 'Configure SRAM For Reading add XMM_Addr,XMM_Len 'XMM_Addr=XMM_Addr + XMM_Len shr XMM_Len,#02 'XMM_Len (Bytes) -> XMM_Len (Longs) :GrabXmmData mov RamLoop,#08 'RamLoop=8 call #GetRamData 'SRAM -> RamData wrlong RamData,Hub_Addr 'RamData -> HubRam add Hub_Addr,#04 'Hub_Addr=Hub_Addr + 4 djnz XMM_Len,#:GrabXmmData 'if(--XMM_Len > 0) goto GrabXmmData or outa,RamSel 'RamSel=Hi (SRAM Inactive) XMM_ReadPage_ret ret #endif '==================================== DIRECT API FUNCTIONS ===================================== '===========================XMM_ReadLong & XMM_ReadMult (XMM -> Cog)============================ #ifdef NEED_XMM_READLONG XMM_ReadLong mov XMM_Len,#04 'XMM_Len=4 (Read A Long) XMM_ReadMult andn outa,RamSel 'RamSel=Lo (SRAM Active) call #SendReadCmd 'Configure SRAM For Reading add XMM_Addr,XMM_Len 'XMM_Addr=XMM_Addr + XMM_Len shl XMM_Len,#01 'XMM_Len (Bytes) -> XMM_Len (Nibbles) mov RamLoop,XMM_Len 'RamLoop=XMM_Len (Read RamLoop Nibbles) call #GetRamData 'SRAM -> RamData XMM_Dst mov 0-0,RamData 'RamData -> Cog or outa,RamSel 'RamSel=Hi (SRAM Inactive) XMM_ReadMult_ret XMM_ReadLong_ret ret 'Return #endif '==========================XMM_WriteLong & XMM_WriteMult (Cog -> XMM)=========================== #ifdef NEED_XMM_WRITELONG XMM_WriteLong mov XMM_Len,#04 'XMM_Len=4 (Write Long) XMM_WriteMult andn outa,RamSel 'RamSel=Lo (SRAM Active) call #SendWriteCmd 'Configure SRAM For Writing add XMM_Addr,XMM_Len 'XMM_Addr=XMM_Addr + XMM_Len XMM_Src mov RamData,0-0 'Cog -> RamData shl XMM_Len,#01 'XMM_Len (Bytes) -> XMM_Len (Nibbles) mov RamLoop,XMM_Len 'RamLoop=XMM_Len (Write RamLoop Nibbles) call #SendRamData 'RamData -> SRAM or outa,RamSel 'RamSel=Hi (SRAM Inactive) XMM_WriteMult_ret XMM_WriteLong_ret ret 'Return #endif '==================================== FLASH API FUNCTIONS ==================================== DAT #ifdef NEED_FLASH XMM_FlashActivate nop ' <== INSERT CODE HERE XMM_FlashActivate_ret ret XMM_FlashTristate nop ' <== INSERT CODE HERE XMM_FlashTristate_ret ret XMM_FlashWritePage nop ' <== INSERT CODE HERE XMM_FlashWritePage_ret ret XMM_FlashReadPage nop ' <== INSERT CODE HERE XMM_FlashReadPage_ret ret XMM_FlashCheckEmpty nop ' <== INSERT CODE HERE XMM_FlashCheckEmpty_ret ret XMM_FlashComparePage nop ' <== INSERT CODE HERE XMM_FlashComparePage_ret ret XMM_FlashEraseChip nop ' <== INSERT CODE HERE XMM_FlashEraseChip_ret ret XMM_FlashEraseBlock nop ' <== INSERT CODE HERE XMM_FlashEraseBlock_ret ret XMM_FlashUnprotect nop ' <== INSERT CODE HERE XMM_FlashUnprotect_ret ret XMM_FlashWriteEnable nop ' <== INSERT CODE HERE XMM_FlashWriteEnable_ret ret XMM_FlashWaitUntilDone nop ' <== INSERT CODE HERE XMM_FlashWaitUntilDone_ret ret #endif '=====================Common Required Functions For SRAM Read/Write=========================== '--------------------------------Force Quad Mode Operation------------------------------------- MakeQuadMode mov RamSlide,#$80 'RamSlide=0x80 :QuadModeLoop andn outa,SPILo 'Set RamClk=0,D3=1,D0=1 andn outa,RamSel 'RamSel=Lo (SRAM Active) mov RamData,#MQM 'RamData=0x38 and RamData,RamSlide 'RamData=RamData & RamSlide tjz RamData,#:SendClk 'if(RamData == 0) goto SendClk or outa,SPIHi 'Set RamClk=0,D3=1,D0=1 :SendClk or outa,RamClk 'RamClk=Hi andn outa,RamClk 'RamClk=Lo shr RamSlide,#01 'RamSlide=RamSlide >> 1 tjnz RamSlide,#:QuadModeLoop 'if(RamSlide != 0) goto QuadModeLoop or outa,RamSel 'RamSel=Hi (SRAM Inactive) MakeQuadMode_ret ret 'Return '------------------------Send ReadCmd OR WriteCmd OR Data To SRAM------------------------------ SendWriteCmd mov RamCmd,#WDR 'RamCmd=WDR SendRamCmd mov RamData,RamCmd 'RamData=RamCmd shl RamData,#24 'RamData=RamData << 24 or RamData,XMM_Addr 'RamData=RamData | XMM_Addr mov RamLoop,#08 'RamLoop=8 (Send 8 Nibbles) SendRamData or dira,RamBus 'Set RamBus As Output :SendLoop andn outa,RamBus 'Clear RamBus tjz RamCmd,#:NotACmd 'if(RamCmd == 0) goto NotACmd rol RamData,#04 'RamData <-= 4 :NotACmd mov RamCopy,RamData 'RamCopy=RamData and RamCopy,#$0F 'RamCopy=RamCopy & 0x0F shl RamCopy,#Ram_Bus_Loc 'RamCopy=RamCopy << Ram_Bus_Loc or outa,RamCopy 'OUTA=RamCopy or outa,RamClk 'RamClk=Hi (Latch Data) andn outa,RamClk 'RamClk=Lo tjnz RamCmd,#:NextLoop 'if(RamCmd != 0) goto NextLoop shr RamData,#04 'RamData=RamData >> 4 :NextLoop djnz RamLoop,#:SendLoop 'if(--RamLoop > 0) goto SendLoop xor RamCmd,RamCmd 'RamCmd=0 SendRamData_ret SendRamCmd_ret SendWriteCmd_ret ret 'Return '-----------------------------------SendReadCmd To SRAM------------------------------------------- SendReadCmd mov RamCmd,#RDR 'RamCmd=RDR call #SendRamCmd 'Send Read Command To SRAM or outa,RamClk 'RamClk=Hi (First Dummy Clock) andn outa,RamClk 'RamClk=Lo andn dira,RamBus 'Set RamBus As Input or outa,RamClk 'RamClk=Hi (Second Dummy Clock) andn outa,RamClk 'RamClk=Lo SendReadCmd_ret ret 'Return '--------------Get A Long,Word,or Byte Value From SRAM (Depends Upon RamLoop Value)---------------- GetRamData xor RamData,RamData 'RamData=0 xor RamSlide,RamSlide 'RamSlide=0 :GetDataLoop mov RamCopy,ina 'RamCopy=INA or outa,RamClk 'RamClk=Hi (ACK Data) andn outa,RamClk 'RamClk=Lo shr RamCopy,#Ram_Bus_Loc 'RamCopy=RamCopy >> Ram_Bus_Loc and RamCopy,#$0F 'RamCopy=RamCopy & 0x0F shl RamCopy,RamSlide 'RamCopy=RamCopy << RamSlide or RamData,RamCopy 'RamData=RamData | RamCopy add RamSlide,#04 'RamSlide=RamSlide + 4 djnz RamLoop,#:GetDataLoop 'if(--RamLoop > 0) goto GetDataLoop GetRamData_ret ret 'Return '------------------------------------------------------------------------------------------------- '====================================SRAM Control Signals======================================= RamClk long Ram_Clk RamSel long Ram_Sel RamSigs long Ram_Sigs RamBus long Ram_Bus SPIHi long SPI_Hi SPILo long SPI_Lo '---------------------------------------RAM Variables--------------------------------------------- RamCmd long 0 RamData long 0 RamCopy long 0 RamLoop long 0 RamSlide long 0 FIT