diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 76854aa0..ae48766a 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -193,4 +193,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index d5c05616..1cf8073f 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -228,4 +228,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 9aa9f50d..e0571ca0 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -300,4 +300,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index c5d10367..7fcd75b5 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -232,4 +232,4 @@ SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_MBC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 2561adfb..17a76d84 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -233,4 +233,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 596e65a1..0f57a588 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -231,4 +231,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 8ba39dbb..27f08b6f 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -241,4 +241,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 0f212d6b..89d8b440 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -257,4 +257,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z280 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z280 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 0498e4f2..ee362ff8 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -246,4 +246,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 5e21ac26..83d5b9cc 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -232,4 +232,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 72c20acc..ebcb045a 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -236,4 +236,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 8b1aa2af..7a84a8e9 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -168,4 +168,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 7f71ec8a..c595edff 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -180,4 +180,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index be3d5ca6..af3f28aa 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -33,6 +33,9 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH ; #IF DSKYENABLE #DEFINE USEDELAY +ENA_XM .SET FALSE ; NO ROOM FOR BOTH DSKY+XMODEM +#ELSE +ENA_XM .EQU TRUE ; INCLUDE XMODEM IF SPACE AVAILABLE #ENDIF ; #INCLUDE "util.asm" @@ -65,6 +68,7 @@ UART_ENTRY: ; P XXXX - PROGRAM RAM STARTING AT XXXX, PROMPT FOR VALUES ; R XXXX - RUN A PROGRAM AT ADDRESS XXXX ; S XX - SET ACTIVE BANK TO XX +; T xxxx - X-MODEM TRANSFER TO MEMORY LOCATION XXXX ; X - EXIT MONITOR ; ;__COMMAND_PARSE______________________________________________________________ @@ -99,6 +103,10 @@ SERIALCMDLOOP: JP Z,PROGRM ; IF YES GO PROGRAM ROUTINE CP 'O' ; IS IT AN "O" (Y/N) JP Z,POUT ; PORT OUTPUT +#IF (ENA_XM) + CP 'T' ; IS IT A "T" (Y/N) + JP Z,XMLOAD ; XMODEM TRANSFER +#ENDIF CP 'L' ; IS IT A "L" (Y/N) JP Z,HXLOAD ; INTEL HEX FORMAT LOAD DATA CP 'I' ; IS IT AN "I" (Y/N) @@ -317,6 +325,183 @@ KLOP1: CALL COUT ; OUTPUT KEY TO SCREEN JR KLOP1 ; LOOP ; +#IF (ENA_XM) +; +;__XMLOAD_____________________________________________________________________ +; +; LOAD A FILE INTO MEMORY FROM THE SERIAL PORT USING X-MODEM PROTOCOL +; +SOH: .EQU 'A'-40h ; ^A CTRL-A +EOT: .EQU 'D'-40h ; ^D = End of Transmission +ACK: .EQU 'F'-40h ; ^F = Positive Acknowledgement +NAK: .EQU 'U'-40h ; ^U = Negative Acknowledgement +CAN: .EQU 'X'-40h ; ^X = Cancel +; +CPKTN .DB 0 ; CALCULATED PACKET NUMBER +CPKTN1C .DB 0 ; CALCULATED PACKET NUMBER COMPLEMENT +RETRYC .DB 0 ; RETRY COUNT +RPKTN: .DB 0 ; RECEIVED PACKET NUMBER +RPKTN1C:.DB 0 ; RECEIVED PACKET NUMBER COMPLEMENT +PKTCS .DB 0 ; CHECKSUM +; +PSADDR: .DW 0 ; START OF PACKET ADDR +; +XMLOAD: CALL WORDPARM ; GET STARTING LOCATION + JP C,ERR ; HANDLE SYNTAX ERRORS + PUSH DE ; SAVE VALUE + CALL NONBLANK ; LOOK FOR EXTRANEOUS PARAMETERS + CP 0 ; TEST FOR TERMINATING NULL + JP NZ,ERR ; ERROR IF NOT TERMINATING NULL +; + LD HL,TXT_READY ; READY FOR + CALL PRTSTR ; TRANSFER + CALL NEWLINE +; + LD BC,$F8F0 ; GET CPU SPEED + RST 08 ; AND MULTIPLY + LD A,L ; BY 4 + PUSH AF + ADD A,A ; TO CREATE + ADD A,A ; TIMEOUT DELAY + LD (TMOFCT),A ; FACTOR + POP AF +; + LD BC,$FE01 ; SET FIRST NUMBER TO 1 + LD (CPKTN),BC ; ALSO STORE THE 1-COMPLEMENT +; + POP DE ; POINT TO WHERE TO SAVE THE PACKET + LD (PSADDR),DE ; SAVE IF FOR THE CHECKSUM CALCULATION +; +GETNP: LD HL,RETRYC ; WE RETRY 20 TIMES BEFORE GIVING UP + LD (HL),20 +; +NPLOOP: LD B,6 ; 6 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK + CALL GCTO + JP NC,NOTOUT ; NO TIMEOUT ? +; + DEC (HL) ; REACHED MAX NUMBER OF RETRIES? + JP Z,FAILRT ; YES, PRINT MESSAGE AND EXIT +; + LD A,NAK ; SEND A NAK TO THE UPLOADER + CALL COUT + JR NPLOOP ; LOOP UNTIL WE GET A GET A CHARACTOR OR TIMEOUT +; +NOTOUT: CP EOT ; DID UPLOADER SAY WE'RE FINISHED? + JP Z,XMDONE ; YES, THEN WE'RE DONE + CP CAN ; UPLOADER WANTS TO FAIL TRANSFER? + JP Z,FAILCN ; YES, THEN WE'RE ALSO DONE + CP SOH ; DID WE GET A START-OF-NEW-PACKET? + JR NZ,NPLOOP ; NO, GO BACK AND TRY AGAIN +; + LD HL,RPKTN ; WE SAVE PACKET NUMBER HERE +; + CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER + LD (HL),A ; SHOULD BE PACKET NUMBER + INC HL + JR C,FAILTO ; TIMOUT ERROR? +; + CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER + LD (HL),A ; SHOULD BE PACKET NUMBER COMPLEMENT + JR C,FAILTO ; TIMOUT ERROR? + + LD C,128 ; GET 128 MORE CHARACTERS FOR A FULL PACKET +PCKRCV: CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER + JR C,FAILTO ; TIMOUT ERROR? + LD (DE),A ; SAVE THE RECEIVED CHAR + INC DE + DEC C + JP NZ,PCKRCV +; + CALL GCTO1 ; WAIT ONE SECOND FOR A CHARACTER + JR C,FAILTO ; TIMOUT ERROR? + LD (PKTCS),A ; SHOULD BE CHECKSUM +; + LD HL,(PSADDR) ; CALCULATE CHECKSUM FROM 128 BYTES OF DATA + LD B,128 + XOR A +CSLOOP: ADD A,(HL) ; JUST ADD UP THE BYTES + INC HL + DJNZ CSLOOP +; + LD (PSADDR),DE ; SAVE THE NEW PACKET START ADDRESS +; + LD HL,PKTCS + XOR (HL) ; HL POINTS TO THE RECEIVED CHECKSUM SO + JR NZ,FAILCS ; BY XORING IT TO OUR SUM WE CHECK FOR EQUALITY +; + LD HL,(CPKTN) ; CHECK + LD BC,(RPKTN) ; AGREEMENT +; XOR A ; PACKET + SBC HL,BC ; NUMBERS + JR NZ,FAILPN +; + LD HL,CPKTN ; UPDATE THE PACKET COUNTERS + INC (HL) + INC HL + DEC (HL) +; + LD A,ACK ; TELL UPLOADER THAT WE'RE HAPPY WITH WITH + CALL COUT ; PACKET AND GO BACK AND FETCH SOME MORE + JP GETNP +; +FAILRT: LD HL,TXT_RETRYERR ; FAILED ON RETRY + JR XMERR +FAILCN: LD HL,TXT_CANCLERR ; TRANSFER CANCELLED + JR XMERR +FAILCS: LD HL,TXT_CKSUMERR ; CHECKSUM ERROR + JR XMERR +FAILPN: LD HL,TXT_PKNUMERR ; PACKET NUMBER ERROR + JR XMERR +FAILTO: LD HL,TXT_TMOUTERR ; TIMEOUT ERROR + JR XMERR +; +XMDONE: LD A,ACK ; TELL REMOTE + CALL COUT ; WE'RE DONE + LD HL,TXT_LOADED ; TELL USER +XMERR: CALL PRTSTR ; WE'RE DONE + JP SERIALCMDLOOP ; BACK TO MENU +; +; WAITS FOR UP TO B SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND +; RETURNS IT IN A WITHOUT ECHO AND CARRY CLEAR. IF TIMEOUT THEN CARRY +; IT SET. +; +; 4MHZ 20 SECONDS TMOFCT = 16 +; 10MHZ 20 SECONDS TMOFCT = 39 +; +GCTO1: LD B,1 ; WAIT 1 SECOND FOR SERIAL INPUT +GCTO: CALL CST ; IF THERE IS A + OR A ; CHARACTER AVAILABLE + JR NZ,GETCHRX ; EXIT NOW OTHERWISE POLL +GCTOA: PUSH BC + LD BC,255 ; C=CONSTANT (255) FOR INNER TIMING LOOP +TMOFCT: .EQU $-1 ; B=SPEED FACTOR WHICH GETS UPDATED AT START +GCTOB: PUSH BC + LD B,C +GCTOC: PUSH BC + CALL CST + OR A ; A CHAR AVAILABLE? + JR NZ,GETCHR ; YES, GET OUT OF LOOP + POP BC + DJNZ GCTOC + POP BC + DJNZ GCTOB + POP BC + DJNZ GCTO + SCF ; SET CARRY SIGNALS + RET ; TIMEOUT OCCURRED +GETCHR: POP BC + POP BC + POP BC +GETCHRX:CALL CIN ; GET THE CHARACTER + OR A ; CLEAR CARRY + RET ; SIGNALS SUCCESS + +TXT_PKNUMERR .TEXT "\r\nPacket Number Error$" +TXT_TMOUTERR .TEXT "\r\nTimeout Error$" +TXT_RETRYERR .TEXT "\r\nRetry Error$" +TXT_CANCLERR .TEXT "\r\nTransfer Cancelled$" +#ENDIF +; ;__HXLOAD_____________________________________________________________________ ; ; LOAD INTEL HEX FORMAT FILE FROM THE SERIAL PORT, USER OPTION "H" @@ -426,7 +611,8 @@ PIN: ;__DUMPMEM____________________________________________________________________ ; ; PRINT A MEMORY DUMP, USER OPTION "D" -; SYNTAX: D +; SYNTAX: D [END ADR] +; IF NO END ADDRESS, DUMP 100H BYTES ;_____________________________________________________________________________ ; DUMPMEM: @@ -434,12 +620,14 @@ DUMPMEM: JP C,ERR ; HANDLE ERRORS PUSH DE ; SAVE IT CALL WORDPARM ; GET END ADDRESS - JP C,ERR ; HANDLE ERRORS - PUSH DE ; SAVE IT - - POP DE ; DE := END ADDRESS - POP HL ; HL := START ADDRESS - + POP HL ; RECOVER START + JR NC,GDATA ; +; + LD D,H ; DEFAULT TO 100H + LD E,L ; BYTES IF NO + INC D ; END ADDRESS + DEC DE ; IS GIVEN +; GDATA: INC DE ; BUMP DE FOR LATER COMPARE CALL NEWLINE ; @@ -1006,7 +1194,7 @@ TXT_BADNUM .TEXT " *Invalid Hex Byte Value*$" TXT_MINIHELP .TEXT " (? for Help)$" TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" .TEXT "\r\nB - Boot system" - .TEXT "\r\nD xxxx yyyy - Dump memory from xxxx to yyyy" + .TEXT "\r\nD xxxx [yyyy] - Dump memory from xxxx to yyyy" .TEXT "\r\nF xxxx yyyy zz - Fill memory from xxxx to yyyy with zz" .TEXT "\r\nH - Halt system" .TEXT "\r\nI xxxx - Input from port xxxx" @@ -1018,6 +1206,9 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" .TEXT "\r\nR xxxx [[yy] [zzzz]] - Run code at address xxxx" .TEXT "\r\n Pass yy and zzzz to register A and BC" .TEXT "\r\nS xx - Set bank to xx" +#IF (ENA_XM) + .TEXT "\r\nT xxxx - X-modem transfer to memory location xxxx" +#ENDIF .TEXT "\r\nX - Exit monitor" .TEXT "$" ; @@ -1592,6 +1783,7 @@ DSKY_ENTRY: #ENDIF ; ; + .FILL 16,0 ; SET MINIMUM STACK DEPTH SLACK .EQU (MON_END - $) .FILL SLACK,00H ; diff --git a/Source/HBIOS/dma.asm b/Source/HBIOS/dma.asm index df255434..e8cf8153 100644 --- a/Source/HBIOS/dma.asm +++ b/Source/HBIOS/dma.asm @@ -1,11 +1,7 @@ ;================================================================================================== -; Z80 DMA DRIVER FOR ECB-DMA +; Z80 DMA DRIVER ;================================================================================================== ; -; DUE TO LOW CLOCK SPEED CONTRAINTS OF Z80 DMA CHIP, THE HALF CLOCK FACILITY -; IS USED DURING DMA PROGRAMMING AND CONTINUOUS BLOCK TRANSFERS. -; TESTING CONDUCTED ON A SBC-V2-005 @ 10Mhz -; DMA_CONTINUOUS .equ %10111101 ; + Pulse DMA_BYTE .equ %10011101 ; + Pulse DMA_BURST .equ %11011101 ; + Pulse @@ -26,7 +22,19 @@ DMA_RESET .equ $c3 ;DMA_ENABLE_AFTER_RETI .equ $b7 ;DMA_REINIT_STATUS_BYTE .equ $8b ; -DMA_FBACK .equ TRUE +DMA_FBACK .equ TRUE ; ALLOW FALLBACK TO SOFTWARE +DMA_USEHS .equ TRUE ; USE CLOCK DIVIDER +; +#IF (DMAMODE=DMAMODE_MBC) +DMA_RDY .EQU %00000000 +DMA_FORCE .EQU 1 +;DMA_USEHS .SET FALSE +#ENDIF +#IF (DMAMODE=DMAMODE_ECB) +DMA_RDY .EQU %00001000 +DMA_FORCE .EQU 0 +DMA_USEHS .SET TRUE +#ENDIF ; ;================================================================================================== ; DMA INITIALIZATION CODE @@ -38,12 +46,14 @@ DMA_INIT: LD A, DMABASE CALL PRTHEXBYTE ; - xor a + LD A,DMA_FORCE out (DMABASE+1),a ; force ready off ; +#IF (DMA_USEHS) ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock +#ENDIF ; call DMAProbe ; do we have a dma? jr nz,DMA_NOTFOUND @@ -58,11 +68,13 @@ DMA_INIT: xor a ; set status ; DMA_EXIT: +#IF (DMA_USEHS) push af ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af +#ENDIF ret ; DMA_NOTFOUND: @@ -132,7 +144,7 @@ DMACode ;.db DMA_DISABLE ; R6-Command Disable DMA .dw 0 ; R4-Port B, Destination address .db %00001100 ; R4-Pulse byte follows, Pulse generated .db 0 ; R4-Pulse offset - .db %10011010 ; R5-Stop on end of block, ce/wait multiplexed, READY active HIGH + .db %10010010+DMA_RDY; R5-Stop on end of block, ce/wait multiplexed, READY active config .db DMA_LOAD ; R6-Command Load ; .db DMA_FORCE_READY ; R6-Command Force ready ; .db DMA_ENABLE ; R6-Command Enable DMA @@ -151,9 +163,11 @@ DMALDIR: ld b,DMACopy_Len ; dma command ld c,DMABASE ; block ; +#IF (DMA_USEHS) ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock +#ENDIF di otir ; load and execute dma ei @@ -163,12 +177,13 @@ DMALDIR: in a,(DMABASE) ; set non-zero and %00111011 ; if failed sub %00011011 - +#IF (DMA_USEHS) push af ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af +#ENDIF ret ; DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA @@ -182,7 +197,7 @@ DMALength .dw 0 ; R0-Block length DMADest .dw 0 ; R4-Port B, Destination address .db %00001100 ; R4-Pulse byte follows, Pulse generated .db 0 ; R4-Pulse offset -; .db %10011010 ; R5-Stop on end of block, ce/wait multiplexed, READY active HIGH +; .db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config .db DMA_LOAD ; R6-Command Load .db DMA_FORCE_READY ; R6-Command Force ready .db DMA_ENABLE ; R6-Command Enable DMA @@ -201,9 +216,11 @@ DMAOTIR: ld b,DMAOut_Len ; dma command ld c,DMABASE ; block ; +#IF (DMA_USEHS) ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock +#ENDIF di otir ; load and execute dma ei @@ -214,11 +231,13 @@ DMAOTIR: and %00111011 ; if failed sub %00011011 ; +#IF (DMA_USEHS) push af ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af +#ENDIF ret ; DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA @@ -235,7 +254,7 @@ DMAOutDest .db 0 ; R4-Port B, Destination port ; .db %00001100 ; R4-Pulse byte follows, Pulse generated ; .db 0 ; R4-Pulse offset - .db %10011010 ; R5-Stop on end of block, ce/wait multiplexed, READY active HIGH + .db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config .db DMA_LOAD ; R6-Command Load .db %00000101 ; R0-Port A is Source .db DMA_LOAD ; R6-Command Load @@ -256,9 +275,11 @@ DMAINIR: ld b,DMAIn_Len ; dma command ld c,DMABASE ; block ; +#IF (DMA_USEHS) ld a,(HB_RTCVAL) or %00001000 ; half out (RTCIO),a ; clock +#ENDIF di otir ; load and execute dma ei @@ -269,11 +290,13 @@ DMAINIR: and %00111011 ; if failed sub %00011011 ; +#IF (DMA_USEHS) push af ld a,(HB_RTCVAL) and %11110111 ; full out (RTCIO),a ; clock pop af +#ENDIF ret ; DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA @@ -287,7 +310,7 @@ DMAInLength .dw 0 ; R0-Block length DMAInSource .db 0 ; R4-Port B, Destination port ; .db %00001100 ; R4-Pulse byte follows, Pulse generated ; .db 0 ; R4-Pulse offset - .db %10011010 ; R5-Stop on end of block, ce/wait multiplexed, READY active HIGH + .db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config .db DMA_LOAD ; R6-Command Load .db DMA_FORCE_READY ; R6-Command Force ready .db DMA_ENABLE ; R6-Command Enable DMA @@ -295,7 +318,7 @@ DMAInSource .db 0 ; R4-Port B, Destination port DMAIn_Len .equ $-DMAInCode ; ;================================================================================================== -; DEBUG - READ START, DESTINATION AN COUNT REGISTERS +; DEBUG - READ START, DESTINATION AND COUNT REGISTERS ;================================================================================================== ; #IF (0) diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 5c2ab4f7..c40f87de 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -225,6 +225,7 @@ DMAMODE_ECB .EQU 1 ; ECB-DMA WOLFGANG KABATZKE'S Z80 DMA ECB BOARD DMAMODE_Z180 .EQU 2 ; Z180 INTEGRATED DMA DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA DMAMODE_RC .EQU 4 ; RC2014 Z80 DMA +DMAMODE_MBC .EQU 5 ; MBC ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; diff --git a/Source/HBIOS/uf.asm b/Source/HBIOS/uf.asm index c0f04c63..049167c0 100644 --- a/Source/HBIOS/uf.asm +++ b/Source/HBIOS/uf.asm @@ -64,7 +64,7 @@ UF_INIT: OR A ; REQUIRES TERMINAL PROGRAM RET NZ ; TO HAVE INITIALIZED PORT CALL PRTSTRD ; ON PC SIDE. - .TEXT " No connection$" + .TEXT " NO CONNECTION$" RET ; ; INPUT A CHARACTER AND RETURN IT IN E