SUBTTL 'HIGH RAM ROUTINES' ; ********************************************************* ; * * ; * HIGH RAM ROUTINES * ; * * ; ********************************************************* ; ; MODULE 8 --ROM8-- ENTRY POINTS ; ; HIGH RAM ROUTINES ; ; INT_HL: INTERRUPT HANDELING (CHECK FOR INTERRUPTS) ; INT_HD: INTERRUPT HANDELING (SERVICE INTERRUPTS) ; DMARD: TRANSFER DATA FROM CONTROLLER TO MEMORY ; DMAWRT: TRANSFER DATA FROM MEMORY TO CONTROLLER ; BANKCALL: CALLS AN ADDRESS IN ANY BANK ; BANKJMP: JUMP TO AN ADDRESS IN ANY BANK ; BANKMOVE: MOVE A BLOCK FROM ONE BANK TO ANOTHER ; MOVE: PERFORM A BLOCK MOVE PAGE ; .Z80 ; .XLIST ; INCLUDE SYSS1.MAC ;SYSTEST FILE ; INCLUDE RAMSMON.MAC ;MONITOR RAM MEMORY LOCATIONS ; INCLUDE RAMS10.MAC ;RAM MEMORY LOCATIONS AND CONSTANTS ; .LIST ; ;SYSS1.MAC , RAMSMON.MAC AND RAMS10.MAC INCLUDED PUBLIC STINT,INT_HL,INT_HD,DMARD,DMAWRT,BANKCALL,BANKJMP,BANKMOVE PUBLIC LENINT PAGE ; +------------------------------------------+ ; | HIGH RAM ROUTINES | ; +------------------------------------------+ ;INTERRUPT HANDLING AND DMA ROUTINES TO BE MOVED TO HIGH RAM ; ; STINT: .PHASE HI_ROUT ; ORG HI_ROUT ;START LOCATION OF HIGH RAM ROUTINES TO BE MOVED TO HIGH RAM ;------------------------------------------------------------------------------ ; INTERRUPT HANDLING ROUTINE ;------------------------------------------------------------------------------ ; SAVES USER STATE, SETS INTERRUPT STATE, CALLS INTERRUPT POLLING ROUTINE ; TO HANDLE INTERRUPT, RESTORES USER STATE. ; ; ENTRY: ; NONE, ; EXIT: ; INTERRUPT HANDLED. ; INT_HL: DI ;PREVENT OTHER INTERRUPTS FROM OCCURRING ;SAVE USER'S STATE LD (USR_STK),SP ;SAVE USER STACK LD SP,ISTK ;SET INTERRUPT STACK ; EX AF,AF' ;SAVE REGISTERS IN ALTERNATES ; EXX PUSH AF PUSH BC PUSH DE PUSH HL PUSH IX ;SAVE IX REGISTER PUSH IY ;SAVE IY REGISTER IN A,(SYS_DTA) ;GET MEMORY BANK STATE LD (USR_BNK),A ;SAVE IT ;SERVICE INTERRUPT LD A,(I_POL_BANK) ;LOAD BANK MASK FOR INTERRUPT ;POLL ROUTINE OUT (SYS_DTA),A ;SEND TO PIA CONTROL A REG LD HL,(I_POL_ADR) ;LOAD ADDRESS OF INTERRUPT ;POLLING ROUTINE LD DE,XJ245 ;PUSH RETURN ADDRESS ON STACK PUSH DE JP (HL) ;CALL POLLING ROUTINE ;RESTORE USER'S STATE XJ245: LD A,(USR_BNK) ;GET USER BANK STATE OUT (SYS_DTA),A ;SEND IT TO PIA TO RESTORE USER BANK STATE POP IY ;RESTORE REGISTERS POP IX POP HL POP DE POP BC POP AF ; EXX ; EX AF,AF' LD SP,(USR_STK) ;RESTORE USER'S STACK EI ;RE-ENABLE INTERRUPTS RET ;AND RETURN PAGE INT_HD: ; THE INTERRUPT HANDLER ENTRY POINT. ; THE INPUT TO THIS ROUTINE IS A PTR TO A TABLE ENTRY ; INDICATING THE PIA MASK TO SWITCH IN THE BANK IN WHICH THE ; INTERRUPT HANDLER RESIDES AND THE ADDRESS OF THE HANDLER. ; ; THE CURRENT BANK STATE IS SAVED, THE INTERRUPT HANDLER'S ; BANK IS FLAGGED IN AND THE ROUTINE IS CALLED. ; ; SINCE THIS ROUTINE SWITCHES BANKS, IT MUST RESIDE IN HIGH MEMORY. ; ; ENTRY: ; HL ==> TABLE ENTRY ; ; EXIT: ; INTERRUPT HAS BEEN SERVICED. ; IN A,(SYS_DTA) PUSH AF ;SAVE CURRENT BANKS LD A,(HL) ;LOAD INTERRUPT HANDLER BANK STATE FROM TABLE INC HL LD E,(HL) ;LOAD INT. HDLR. ADDR FROM TABLE INC HL ; LD H,(HL) LD L,E ;HL = INTERRUPT HANDLER ADDRESS OUT (SYS_DTA),A ;SET INTERRUPT HANDLER BANK LD DE,XJ246 PUSH DE ;SET RETURN ADDRESS JP (HL) ;"CALL" ROUTINE XJ246: POP AF ;RESTORE CURRENT BANKS OUT (SYS_DTA),A RET PAGE DMARD: ;TRANSFER DATA FROM COMTROLLER TO MEMORY ;ENTRY ;BC = BYTES TO TRANSFER ;HL = FWA OF BUFFER ;DMABANK = BANK ;EXIT ;HL = NEXT ADDRESS ;SAVE CURRENT BANKS AND SWITCH TO DMA BANK IN A,(SYS_DTA) ;(13) GET CURRENT BANKS PUSH AF ;(11) SAVE LD A,(DMABANK) ;(13) OUT (SYS_DTA),A ;(13) SET DMA BANK ;DO DMA XJ247: IN A,(DSK_STS) ;(13) GET STATUS RRA ;(4) JR NC,XJ248 ;(7) RETURN IF NO BUSY RRA ;(4) JR NC,XJ247 ;(10) IF NO DRQ IN A,(DSK_DAT) ;(13) GET BYTE LD (HL),A ;(7) STORE BYTE INC HL ;(6) DEC BC ;(6) LD A,B ;(4) OR C ;(4) JR NZ,XJ247 ;(10) ;RESTORE BANKS XJ248: POP AF OUT (SYS_DTA),A RET PAGE DMAWRT: ;XFER DATA FROM MEMORY TO DISK ;ENTRY ;BC = BYTES TO TRANSFER ;HL = FWA OF BUFFER ;DMABANK = BANK ;EXIT ;HL = NEXT ADDRESS ;SAVE CURRENT BANKS AND SWITCH TO DMA BANK IN A,(SYS_DTA) ;(13) GET CURRENT BANKS PUSH AF ;(11) SAVE LD A,(DMABANK) ;(13) OUT (SYS_DTA),A ;(13) SET DMA BANK ;DO DMA XJ249: IN A,(DSK_STS) ;GET STATUS RRA JR NC,XJ250 ;RETURN IF NO BUSY RRA JR NC,XJ249 ;IF NO DRQ LD A,(HL) ;GET BYTE OUT (DSK_DAT),A ;STORE BYTE INC HL DEC BC LD A,B OR C JR NZ,XJ249 ;RESTORE BANKS XJ250: POP AF OUT (SYS_DTA),A RET PAGE BANKCALL: ;CALLS AN ADDRESS IN ANY BANK ; (SAVES ALL REGISTERS) ;ENTRY ;JMPBANK = BANK ;JMPADDR = ADDRESS ;EXIT ;NONE ;SAVE CURRENT BANKS LD (TEMP),A ;SAVE A IN A,(SYS_DTA) PUSH AF ;SAVE BANKS LD A,(TEMP) ;RESTORE A ;CALL THE ADDRESS CALL BANKJMP ;RESTORE BANKS EX (SP),HL ;SAVE HL ON STACK, GET BANKS IN HL PUSH AF ;SAVE AF PUSH HL ;PUT BANKS ON STACK POP AF ;GET A = BANKS OUT (SYS_DTA),A ;RESTORE BANKS POP AF ;RESTORE AF POP HL ;RESTORE HL RET PAGE BANKJMP: ;JUMP TO AN ADDRESS IN ANY BANK ; *NOTE -- USES A AND HL* ;ENTRY ;JMPBANK = BANK ;JMPADDR = ADDRESS ;EXIT ;ALL REGISTERS SAVED ;SWITCH BANKS LD (TEMSAV),A ;SAVE A LD A,(JMPBANK) OUT (SYS_DTA),A ;SWITCH BANKS ;JUMP TO ADDRESS LD A,0C3H LD (JMPSPOT),A ;SET UP TO JUMP LD A,(TEMSAV) ;RESTORE A JP JMPSPOT PAGE BANKMOVE: ;MOVE A BLOCK (1-10000H BYTES) FROM ONE BANK TO ANOTHER ; (IF BC = 0, 10000H BYTES ARE MOVED) ; THIS ROUTINE USE "5" LEVEL OWN STACK ;ENTRY ;BC = NUMBER OF BYTES TO TRANSFER (0 INDICATES 10000H) ;HL = SOURCE ADDRESS ;DE = DESTINATION ADDRESS ;SRCBANK = SOURCE BANK ;DESTBANK = DESTINATION BANK ;EXIT ;HL = NEXT SOURCE ADDRESS ;DE = NEXT DESTINATION ADDRESS ;SAVE CURRENT BANKS IN A,(SYS_DTA) PUSH AF ;MOVE BLOCK ;MOVE C BYTES LD A,C OR A JR Z,XJ251 ;IF C = 0, ONLY MOVE B * 100H PUSH BC ;SAVE B LD B,0 CALL MOVE ;MOVE C BYTES POP BC ;MOVE B * 100H BYTES LD A,B OR A JR Z,XJ252 ;IF B = 0 XJ251: PUSH BC LD BC,100H CALL MOVE ;MOVE 100H BYTES POP BC DJNZ XJ251 ;IF MORE XJ252: POP AF ;RESTORE ORIGINAL BANK OUT (SYS_DTA),A RET PAGE MOVE: ;MOVE A BLOCK FROM ONE BANK TO ANOTHER (1-256 BYTES) ;*NOTE -- NO ERROR CHECKING DONE AT THIS LEVEL, BC MUST BE BETWEEN 1 AND 256 ;ENTRY ;HL = SOURCE ADDRESS ;DE = DESTINATION ADDRESS ;BC = NUMBER OF BYTES PUSH BC ;SAVE COUNT PUSH DE ;SAVE DESTINATION ADDRESS ;MOVE SOURCE TO HIGH MEMORY LD A,(SRCBANK) OUT (SYS_DTA),A ;SET SOURCE BANK LD DE,HIBUFF ;HIGH RAM BUFFER LDIR ;MOVE BLOCK FROM HIGH MEMORY TO DESTINATION POP DE ;RESTORE DESTINATION POP BC ;RESTORE COUNT PUSH HL ;SAVE NEXT SOURCE ADDRESS LD A,(DESTBANK) OUT (SYS_DTA),A ;SET DESTINATION LD HL,HIBUFF LDIR POP HL ;RESTORE NEXT SOURCE ADDRESS RET IF $ GT 0FFDFH .PRINTX /SIO VECTOR INTERRUPT TABLE CLASHED/ ENDIF LENINT EQU $ - INT_HL ;LENGTH OF INTERRUPT ROUTINES TO BE MOVED TO HIGH RAM .DEPHASE