From e1cb974e764a96ccad605aeb13c6e802defb65f9 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 27 Aug 2021 08:49:50 -0700 Subject: [PATCH] ROM Applications Document Phil's new ROM Applications document has been added to the documents generated and added to the /Doc directory. --- Doc/DDTZ.doc | 564 ------------------ Doc/FDU.txt | 535 ----------------- Doc/ROM Applications.pdf | Bin 0 -> 76199 bytes Doc/RomWBW Applications.pdf | Bin 142480 -> 142480 bytes Doc/RomWBW Architecture.pdf | Bin 440180 -> 440180 bytes Doc/RomWBW Disk Catalog.pdf | Bin 131009 -> 131009 bytes Doc/RomWBW Getting Started.pdf | Bin 181345 -> 181345 bytes ...OM Applications.md => ROM_Applications.md} | 63 +- Source/HBIOS/dsrtc.asm | 44 +- 9 files changed, 59 insertions(+), 1147 deletions(-) delete mode 100644 Doc/DDTZ.doc delete mode 100644 Doc/FDU.txt create mode 100644 Doc/ROM Applications.pdf rename Source/Doc/{ROM Applications.md => ROM_Applications.md} (83%) diff --git a/Doc/DDTZ.doc b/Doc/DDTZ.doc deleted file mode 100644 index 46da2d3b..00000000 --- a/Doc/DDTZ.doc +++ /dev/null @@ -1,564 +0,0 @@ - - DDTZ v2.7 - by C.B. Falconer - edited by George A. Havach - -Introduction: -============ -DDTZ v2.7 is a complete replacement for DDT, Digital Research's -famous Dynamic Debugging Tool, with improved functionality, bug -extermination, and full Z80 support. In general, DDTZ is fully -compatible with the original utility, but it has extra and -extended commands and many fewer quirks. All Z80-specific -instructions can be (dis)assembled, though in Intel rather then -Zilog format. Furthermore, DDTZ will correctly trace ('T' and 'U' -commands) both 8080 and Z80 instructions, depending on which CPU -is operating. On startup, the program announces which CPU it is -running on. - -DDTZ v2.7 now handles the 64180 added opcodes. It does NOT test -for a 64180 CPU, since this cannot be done without executing -illegal Z80 instructions, which in turn will crash some -simulators. However v2.7 does not execute any 64180 instructions -internally, only in the subject program. - -This issue supplies the "M" version assembled, to avoid errors -when switching between MSDOS and CPM systems. The command table -is updated accordingly. Most CPM users are also MSDOS users, but -not vice-versa. - -The program is invoked by typing - - ddtz -or - ddtz [d:]filespec - -In the second form, DDTZ will load the specified file into -memory starting at 0100H, unless it's a .HEX file that sets its -own load address. Besides reporting the NEXT free address and -the PC (program counter) after a successful load, DDTZ also shows -the number of memory pages needed for a SAVE. Instead of having -to write all this down, just use the 'X' command at any time to -redisplay these three values for the current application. - -NOTE: loading more code above the NEXT pointer revises these - values. - -As in DDT, when a program is loaded above the area holding the -'A' and 'U' (and now 'W') command code, these commands are -disabled, and the extra memory is released to the user. Thus, -DDTZ can occupy as little as 3K total memory space. Unlike DDT, -however, DDTZ will not overwrite itself or the system on program -loads (except .HEX files). - -At initialization, the stack pointer (SP) points to a return to -DDTZ, just like for the CCP. Thus, programs that normally return -to the CCP will be returned to DDTZ. The 'B' command -reinitializes this condition. - - -The intercept vector copies the BDOS version number, etc., so -an object program does not know that DDTZ is running (except -for BIOS-BDOS vector size). Thus, programs that check the version -number should execute correctly under DDTZ. - -All input parameters can now be entered in any of three formats: - - (1) hexadecimal (as in DDT), - (2) decimal, by adding a leading '#' character, - (3) ASCII, by enclosing between either single or double - quotes; either one or two characters are allowed. - -Leading blanks in command lines and parameters are absorbed. -Either a comma or a (single) space is a valid delimiter. -Either uppercase or lowercase input is accepted. - -The default command (for anything not otherwise recognizable) -is 'H'. This allows convenient calculation, along with the other -features described below. So, to convert a number, just enter -it! - -As in DDT, the prompt character is '-', and the only error -message is the query ('?'), which generally kicks you back to -command mode. - -New Commands (Over DDT): -======================= - -NOTE: letters in parenthesis, e.g. "(U)", show the equivalent - command for DDTZM version (compatible with MSDOS debug). - - @ Sets or shows (with no parameter) the internally stored - "base" value. Also used with the 'S' and 'D' commands as - an optional parameter (though without the '@') to display - memory from an arbitrary base marker (offset). When set to - zero (the default), it does not affect any screen displays. - - B B)egin: resets the USER stack pointer to its initial value, - such that any program that exits by an RET will return to - DDTZ. DDTZ provides a default stack space of - approximately 24 bytes for user programs. - - C C)ompare first_address,last_address,against_address: shows - all the byte differences between two memory areas, in the - format - - XXXX aa YYYY bb - - where XXXX and YYYY are the comparative memory addresses, - and aa and bb are the corresponding byte values. Can be - used to verify the identity of two files by first - loading them into different memory areas with the 'R' - command (see below). - - - W Write: stores the modified memory area to disk under the - (K) filename specified by the 'I' command, overwriting the - original file from which it was loaded (the user is queried - before doing so). By default, the image of memory from - 0100H through the "NEXT" value -1 is saved. "K first_addr, - last_address" overrides this and allows writing ANY memory - area to a file. Almost a necessity for CPM 3.0 (no SAVE!). - K)eep on DDTZ - - X eXamine: redisplays the "NEXT PC SAVE" report at any time. - (Q) Q)uery size on DDTZ. - - S S)earch first_address, last_addr, value: searches the - (W) specified memory area for the value (a 16-bit word, not a - byte) and shows the locations of all such. Very useful for - finding CALL's or JMP's to a particular address, etc. - W)here on DDTZ - - Y Y)our_option parm1,parm2,address: executes an arbitrary - routine at the specified address, with the BC and DE - registers set to parm1 and parm2, respectively. - - Z Displays (but does not alter) the Z80's alternate register - set, including the index registers (disabled if running on - an 8080). On Z80's, automatically included as the last - part of the display by the 'X' command. - - -Based (Offset) Displays: -======================= - -The 'D' and 'E' commands can use a stored base value (offset), -as set by the '@' command. The current @ value may be -overridden for a single execution of these commands by adding the -base as an extra parameter in the command line. The effect is -to add this value to the first/last address and display -accordingly. The address listing on the left becomes XXXX:YYYY, -where XXXX is the offset address and YYYY is the actual memory -address being displayed. For example, if you have a data area -located at 42B7H and wish to preserve easy access, just enter -"@42b7". Now, "d0,3f" will dump memory starting at 4237H. - - -Further Changes from DDT: -======================== - - A A)ssemble now accepts the full Z80 as well as 8080 - instruction set, although it expects them in Intel rather - than Zilog format (see notes below under the 'L' - command). When in doubt, see the mnemnonic list below. - - D D)isplay or D)ump will accept an optional third parameter - to set the base value for a single execution only. Format - has been cleaned up. - - H H)ex_arithmetic on two values also shows their - difference in decimal. With only one value, converts to - hexadecimal, decimal, and ASCII (low-order byte only). - - - N N)ame now allows drive specification (d:...) and sets up - (I) the complete command line, including both FCB's (at - addresses 005CH and 006CH). The tail (stored at 0081H up) - is NOT upshifted. - I)nput on DDTZ - - U U)nassemble now displays the raw hexcode, especially handy - (L) when examining non-code areas. Intel (8080 style) mnemonics - are used, so some disassembled instructions may look - strange. E.g., the Z80's 'IN B,(C)' and 'OUT (C),B' become - 'INP B' and 'OUTP B', respectively; 'LD (nnnn),BC' becomes - 'SBCD nnnn', 'ADD IX, BC' becomes 'DADX B', and 'JP (IX)' - becomes 'PCIX'. - L)ist on DDTZ - - L L)oad now permits loading a file into memory with an - (R) offset, which is added to the default load address of - 0100H. When reading in a .HEX file with a preset bias, - the 'R' command will not transfer control to an invalid - execution point. Another execution of the 'R' command will - reread the input file, e.g.: - - n blah - l - ...modify the code and generally mess about... - l - - The original file is reloaded, and the modifications are - removed. - R)ead on DDTZ - - E E)nter, like D)isplay, now accepts an optional second - (S) parameter to set the base value for a single execution - only. - S)ubstitute or S)et on DDTZ - - T T)rap/trace on termination now shows the complete CPU - state. Traps and traces no longer lock up when a user RST - 7 instruction is executed. Tracing of BDOS/BIOS calls is - heavily trun cated, avoiding clutter and preventing system - crashes. - -NOTE: Most of the UNDOCUMENTED Z80 op-codes are handled. Others - can crash the system. - - R R)egisters also shows what two-byte values the HL and SP - (X) registers are actually pointing to. On Z80's, displays the - alternate register set. - eX)amine on DDTZ - -NOTE: Any use of the 'W' or 'L' command resets the system DMA - transfer address to the standard default value of 0080H. - - -; This is the output of DDTZ when disassembling OPTYPE.TRY -NOP LDA 06A4 MOV M,H -LXI B,06A4 DCX SP MOV M,L -STAX B INR A HLT -INX B DCR A MOV M,A -INR B MVI A,20 MOV A,B -DCR B CMC MOV A,C -MVI B,20 MOV B,B MOV A,D -RLC MOV B,C MOV A,E -EXAF MOV B,D MOV A,H -DAD B MOV B,E MOV A,L -LDAX B MOV B,H MOV A,M -DCX B MOV B,L MOV A,A -INR C MOV B,M ADD B -DCR C MOV B,A ADD C -MVI C,20 MOV C,B ADD D -RRC MOV C,C ADD E -DJNZ 0134 MOV C,D ADD H -LXI D,06A4 MOV C,E ADD L -STAX D MOV C,H ADD M -INX D MOV C,L ADD A -INR D MOV C,M ADC B -DCR D MOV C,A ADC C -MVI D,20 MOV D,B ADC D -RAL MOV D,C ADC E -JR 0134 MOV D,D ADC H -DAD D MOV D,E ADC L -LDAX D MOV D,H ADC M -DCX D MOV D,L ADC A -INR E MOV D,M SUB B -DCR E MOV D,A SUB C -MVI E,20 MOV E,B SUB D -RAR MOV E,C SUB E -JRNZ 0134 MOV E,D SUB H -LXI H,06A4 MOV E,E SUB L -SHLD 06A4 MOV E,H SUB M -INX H MOV E,L SUB A -INR H MOV E,M SBB B -DCR H MOV E,A SBB C -MVI H,20 MOV H,B SBB D -DAA MOV H,C SBB E -JRZ 0134 MOV H,D SBB H -DAD H MOV H,E SBB L -LHLD 06A4 MOV H,H SBB M -DCX H MOV H,L SBB A -INR L MOV H,M ANA B -DCR L MOV H,A ANA C -MVI L,20 MOV L,B ANA D -CMA MOV L,C ANA E -JRNC 0134 MOV L,D ANA H -LXI SP,06A4 MOV L,E ANA L -STA 06A4 MOV L,H ANA M -INX SP MOV L,L ANA A -INR M MOV L,M XRA B -DCR M MOV L,A XRA C -MVI M,20 MOV M,B XRA D -STC MOV M,C XRA E -JRC 0134 MOV M,D XRA H -DAD SP MOV M,E XRA L - - -XRA M JPE 06A4 SLAR M -XRA A XCHG SLAR A -ORA B CPE 06A4 SRAR B -ORA C XRI 20 SRAR C -ORA D RST 5 SRAR D -ORA E RP SRAR E -ORA H POP PSW SRAR H -ORA L JP 06A4 SRAR L -ORA M DI SRAR M -ORA A CP 06A4 SRAR A -CMP B PUSH PSW SLLR B -CMP C ORI 20 SLLR C -CMP D RST 6 SLLR D -CMP E RM SLLR E -CMP H SPHL SLLR H -CMP L JM 06A4 SLLR L -CMP M EI SLLR M -CMP A CM 06A4 SLLR A -RNZ CPI 20 SRLR B -POP B RST 7 SRLR C -JNZ 06A4 RLCR B SRLR D -JMP 06A4 RLCR C SRLR E -CNZ 06A4 RLCR D SRLR H -PUSH B RLCR E SRLR L -ADI 20 RLCR H SRLR M -RST 0 RLCR L SRLR A -RZ RLCR M BIT 0,B -RET RLCR A BIT 0,C -JZ 06A4 RRCR B BIT 0,D -CZ 06A4 RRCR C BIT 0,E -CALL 06A4 RRCR D BIT 0,H -ACI 20 RRCR E BIT 0,L -RST 1 RRCR H BIT 0,M -RNC RRCR L BIT 0,A -POP D RRCR M BIT 1,B -JNC 06A4 RRCR A BIT 1,C -OUT 20 RALR B BIT 1,D -CNC 06A4 RALR C BIT 1,E -PUSH D RALR D BIT 1,H -SUI 20 RALR E BIT 1,L -RST 2 RALR H BIT 1,M -RC RALR L BIT 1,A -EXX RALR M BIT 2,B -JC 06A4 RALR A BIT 2,C -IN 20 RARR B BIT 2,D -CC 06A4 RARR C BIT 2,E -SBI 20 RARR D BIT 2,H -RST 3 RARR E BIT 2,L -RPO RARR H BIT 2,M -POP H RARR L BIT 2,A -JPO 06A4 RARR M BIT 3,B -XTHL RARR A BIT 3,C -CPO 06A4 SLAR B BIT 3,D -PUSH H SLAR C BIT 3,E -ANI 20 SLAR D BIT 3,H -RST 4 SLAR E BIT 3,L -RPE SLAR H BIT 3,M -PCHL SLAR L BIT 3,A - - -BIT 4,B RES 3,D SET 2,H -BIT 4,C RES 3,E SET 2,L -BIT 4,D RES 3,H SET 2,M -BIT 4,E RES 3,L SET 2,A -BIT 4,H RES 3,M SET 3,B -BIT 4,L RES 3,A SET 3,C -BIT 4,M RES 4,B SET 3,D -BIT 4,A RES 4,C SET 3,E -BIT 5,B RES 4,D SET 3,H -BIT 5,C RES 4,E SET 3,L -BIT 5,D RES 4,H SET 3,M -BIT 5,E RES 4,L SET 3,A -BIT 5,H RES 4,M SET 4,B -BIT 5,L RES 4,A SET 4,C -BIT 5,M RES 5,B SET 4,D -BIT 5,A RES 5,C SET 4,E -BIT 6,B RES 5,D SET 4,H -BIT 6,C RES 5,E SET 4,L -BIT 6,D RES 5,H SET 4,M -BIT 6,E RES 5,L SET 4,A -BIT 6,H RES 5,M SET 5,B -BIT 6,L RES 5,A SET 5,C -BIT 6,M RES 6,B SET 5,D -BIT 6,A RES 6,C SET 5,E -BIT 7,B RES 6,D SET 5,H -BIT 7,C RES 6,E SET 5,L -BIT 7,D RES 6,H SET 5,M -BIT 7,E RES 6,L SET 5,A -BIT 7,H RES 6,M SET 6,B -BIT 7,L RES 6,A SET 6,C -BIT 7,M RES 7,B SET 6,D -BIT 7,A RES 7,C SET 6,E -RES 0,B RES 7,D SET 6,H -RES 0,C RES 7,E SET 6,L -RES 0,D RES 7,H SET 6,M -RES 0,E RES 7,L SET 6,A -RES 0,H RES 7,M SET 7,B -RES 0,L RES 7,A SET 7,C -RES 0,M SET 0,B SET 7,D -RES 0,A SET 0,C SET 7,E -RES 1,B SET 0,D SET 7,H -RES 1,C SET 0,E SET 7,L -RES 1,D SET 0,H SET 7,M -RES 1,E SET 0,L SET 7,A -RES 1,H SET 0,M DADX B -RES 1,L SET 0,A DADX D -RES 1,M SET 1,B LXI X,06A4 -RES 1,A SET 1,C SIXD 06A4 -RES 2,B SET 1,D INX X -RES 2,C SET 1,E DADX X -RES 2,D SET 1,H LIXD 06A4 -RES 2,E SET 1,L DCX X -RES 2,H SET 1,M INR [X+05] -RES 2,L SET 1,A DCR [X+05] -RES 2,M SET 2,B MVI [X+05],20 -RES 2,A SET 2,C DADX SP -RES 3,B SET 2,D MOV B,[X+05] -RES 3,C SET 2,E MOV C,[X+05] - - -MOV D,[X+05] DSBC B DADY B -MOV E,[X+05] SBCD 06A4 DADY D -MOV H,[X+05] NEG LXI Y,06A4 -MOV L,[X+05] RETN SIYD 06A4 -MOV [X+05],B IM0 INX Y -MOV [X+05],C LDIA DADY Y -MOV [X+05],D INP C LIYD 06A4 -MOV [X+05],E OUTP C DCX Y -MOV [X+05],H DADC B INR [Y+05] -MOV [X+05],L LBCD 06A4 DCR [Y+05] -MOV [X+05],A RETI MVI [Y+05],2 -MOV A,[X+05] LDRA DADY SP -ADD [X+05] INP D MOV B,[Y+05] -ADC [X+05] OUTP D MOV C,[Y+05] -SUB [X+05] DSBC D MOV D,[Y+05] -SBB [X+05] SDED 06A4 MOV E,[Y+05] -ANA [X+05] IM1 MOV H,[Y+05] -XRA [X+05] LDAI MOV L,[Y+05] -ORA [X+05] INP E MOV [Y+05],B -CMP [X+05] OUTP E MOV [Y+05],C -POP X DADC D MOV [Y+05],D -XTIX LDED 06A4 MOV [Y+05],E -PUSH X IM2 MOV [Y+05],H -PCIX LDAR MOV [Y+05],L -SPIX INP H MOV [Y+05],A -RLCR [X+05] OUTP H MOV A,[Y+05] -RRCR [X+05] DSBC H ADD [Y+05] -RALR [X+05] shld 06A4 ADC [Y+05] -RARR [X+05] RRD SUB [Y+05] -SLAR [X+05] INP L SBB [Y+05] -SRAR [X+05] OUTP L ANA [Y+05] -SRLR [X+05] DADC H XRA [Y+05] -BIT 0,[X+05] lhld 06A4 ORA [Y+05] -BIT 1,[X+05] RLD CMP [Y+05] -BIT 2,[X+05] INP M POP Y -BIT 3,[X+05] OUTP M XTIY -BIT 4,[X+05] DSBC SP PUSH Y -BIT 5,[X+05] SSPD 06A4 PCIY -BIT 6,[X+05] INP A SPIY -BIT 7,[X+05] OUTP A RLCR [Y+05] -RES 0,[X+05] DADC SP RRCR [Y+05] -RES 1,[X+05] LSPD 06A4 RALR [Y+05] -RES 2,[X+05] LDI RARR [Y+05] -RES 3,[X+05] CCI SLAR [Y+05] -RES 4,[X+05] INI SRAR [Y+05] -RES 5,[X+05] OTI SRLR [Y+05] -RES 6,[X+05] LDD BIT 0,[Y+05] -RES 7,[X+05] CCD BIT 1,[Y+05] -SET 0,[X+05] IND BIT 2,[Y+05] -SET 1,[X+05] OTD BIT 3,[Y+05] -SET 2,[X+05] LDIR BIT 4,[Y+05] -SET 3,[X+05] CCIR BIT 5,[Y+05] -SET 4,[X+05] INIR BIT 6,[Y+05] -SET 5,[X+05] OTIR BIT 7,[Y+05] -SET 6,[X+05] LDDR RES 0,[Y+05] -SET 7,[X+05] CCDR RES 1,[Y+05] -INP B INDR RES 2,[Y+05] -OUTP B OTDR RES 3,[Y+05] - - -RES 4,[Y+05] SET 0,[Y+05] SET 4,[Y+05] -RES 5,[Y+05] SET 1,[Y+05] SET 5,[Y+05] -RES 6,[Y+05] SET 2,[Y+05] SET 6,[Y+05] -RES 7,[Y+05] SET 3,[Y+05] SET 7,[Y+05] - -; These are the result of disassembling 64180OPS.TRY -; These opcodes are available ONLY on the 64180 CPU -; DDTZ will both assemble and disassemble these. -IN0 B,20 TST E MLT B -OUT0 20,B IN0 H,20 MLT D -TST B OUT0 20,H TSTI 20 -IN0 C,20 TST H MLT H -OUT0 20,C IN0 L,20 TSIO 20 -TST C OUT0 20,L SLP -IN0 D,20 TST L MLT SP -OUT0 20,D TST M OTIM -TST D IN0 A,20 OTDM -IN0 E,20 OUT0 20,A OIMR -OUT0 20,E TST A ODMR - -; The following are UNDOCUMENTED z80 opcodes from XTDOPS.TRY. -; DDTZ will disassemble these, but will not assemble them. -; They use xh/xl (or yh/yl) as separate byte registers. -; Use these at your own risk. -INRX H ACXR H MOVY H,B -DCRX H ACXR L MOVY H,C -MVIX H,20 SUXR H MOVY H,D -INRX L SUXR L MOVY H,E -DCRX L SBXR H MOVY H,A -MVIX L,20 SBXR L MOVY L,B -MOVX B,H NDXR H MOVY L,C -MOVX B,L NDXR L MOVY L,D -MOVX C,H XRXR H MOVY L,E -MOVX C,L XRXR L MOVY L,A -MOVX D,H ORXR H MOVY A,H -MOVX D,L ORXR L MOVY A,L -MOVX E,H CPXR H ADYR H -MOVX E,L CPXR L ADYR L -MOVX H,B INRY H ACYR H -MOVX H,C DCRY H ACYR L -MOVX H,D MVIY H,20 SUYR H -MOVX H,E INRY L SUYR L -MOVX H,A DCRY L SBYR H -MOVX L,B MVIY L,20 SBYR L -MOVX L,C MOVY B,H NDYR H -MOVX L,D MOVY B,L NDYR L -MOVX L,E MOVY C,H XRYR H -MOVX L,A MOVY C,L XRYR L -MOVX A,H MOVY D,H ORYR H -MOVX A,L MOVY D,L ORYR L -ADXR H MOVY E,H CPYR H -ADXR L MOVY E,L CPYR L - - -Command Summary: -=============== - -DDTZM command DDTZ command -============= ============ -@ (base) -A)ssemble first_address A -B)egin {i.e., initialize stack and return} B -C)ompare first_address,last_address,against_address C -D)ump first_address[,last_address[,base]] D -E)nter_in_memory first_address[,base] S)ubstitute -F)ill first_address,last_address,value F -G)o_to [address][,trap1[,trap2]] G -H)ex_arithmetic value1(,value2) H -L)oad_file (offset) R)ead -M)ove first_address,last_address,destination M -N)nput FCBs_command_line I)nput -Q)uit (not avail) -R)egister examine/change [register|flag] X)amine -S)earch first_address,last_address,word W)hereis -T)race_execution [count] T - Untrace_execution [count] (i.e. do count instr) U)ntrace -U)nassemble_code first_address[,last_address] L)ist code -W)rite [first_address,last_address] K)eep -X)amine {i.e. display memory parameters for application} Q)uery -Y)our_option BC:=parm1,DE:=parm2,call_address Y -Z)80_register_display Z - - -If you find this program useful, contributions will be gratefully -accepted and will encourage further development and release of -useful CPM programs. My practice is to include source. - -C.B. Falconer -680 Hartford Turnpike, -Hamden, Conn. 06517 (203) 281-1438 - -DDTZ and its associated documentation and other files are -copyright (c) 1980-1988 by C.B. Falconer. They may be freely -copied and used for non-commercial purposes ONLY. -ôÙ \ No newline at end of file diff --git a/Doc/FDU.txt b/Doc/FDU.txt deleted file mode 100644 index 38adda12..00000000 --- a/Doc/FDU.txt +++ /dev/null @@ -1,535 +0,0 @@ -================================================================ -Floppy Disk Utility (FDU) v5.3 for RetroBrew Computers -Disk IO / Zeta / Dual-IDE / N8 / RC2014 / SmallZ80 / Dyno -================================================================ - -Updated January 5, 2020 -by Wayne Warthen (wwarthen@gmail.com) - -Application to test the hardware functionality of the Floppy -Disk Controller (FDC) on the ECB DISK I/O, DISK I/O V3, ZETA -SBC, Dual IDE w/ Floppy, or N8 board. - -The intent is to provide a testbed that allows direct testing -of all possible media types and modes of access. The -application supports read, write, and format by sector, track, -and disk as well as a random read/write test. - -The application supports access modes of polling, interrupt, -INT/WAIT, and DRQ/WAIT. At present, it supports 3.5" media at -DD (720KB) and HD (1.44MB) capacities. It also now supports -5.25" media (720KB and 1.2MB) and 8" media (1.11MB) as well. -Additional media will be added when I have time and access to -required hardware. Not all modes are supported on all -platforms and some modes are experimental in all cases. - -In many ways this application is merely reinventing the wheel -and performs functionality similar to existing applications, -but I have not seen any other applications for RetroBrew -Computers hardware that provide this range of functionality. - -While the application is now almost entirely new code, I would -like to acknowledge that much was derived from the previous -work of Andrew Lynch and Dan Werner. I also want to credit -Sergio Gimenez with testing the 5.25" drive support and Jim -Harre with testing the 8" drive support. Support for Zeta 2 -comes from Segey Kiselev. Thanks! - -General Usage -------------- - -In general, usage is self explanatory. At invocation, you -must select the floppy disk controller (FDC) that you are -using. Subsequently, the main menu allows you to set the -unit, media, and mode to test. These settings MUST match your -situation. Read, write, format, and verify functions are -provided. A sub-menu will allow you to choose sector, track, -disk, or random tests. - -The verify function requires a little explanation. It will -take the contents of the current in-memory disk buffer, save -it, and compare it to the selected sectors. So, you must -ensure that the sectors to be verified already have been -written with the same pattern as the buffer contains. I -typically init the buffer to a pattern, write the pattern to -the entire disk, then verify the entire disk. - -Another submenu is provided for FDC commands. This sub-menu -allows you to send low-level commands directly to FDC. You -*must* know what you are doing to use this sub-menu. For -example, in order to read a sector using this sub-menu, you -will need to perform specify, seek, sense int, and read -commands specifying correct values (nothing is value checked -in this menu). - -Required Hardware/BIOS ----------------------- - -Of course, the starting point is to have a supported hardware -configuration. The following Z80 / Z180 based CPU boards are -supported: - - - SBC V1/2 - - Zeta - - Zeta 2 - - N8 - - Mark IV - - RC2014 - - SmallZ80 - - Dyno - - MBC - -You must be using either a RomWBW or UBA based OS version. - -You must have one of the following floppy disk controllers: - - - Disk IO ECB Board FDC - - Disk IO 3 ECB Board FDC - - Dual-IDE ECB Board FDC - - Zeta SBC onboard FDC - - Zeta 2 SBC onboard FDC - - N8 SBC onboard FDC - - RC2014 Scott Baker SMC-based Floppy Module - - RC2014 Scott Baker WDC-based Floppy Module - - SmallZ80 FDC - - Dyno FDC - - MBC FDC - -Finally, you will need a floppy drive connected via an -appropriate cable: - -Disk IO - no twist in cable, drive unit 0/1 must be selected by jumper on drive -DISK IO 3, Zeta, Zeta 2, RC2014, Dyno - cable with twist, unit 0 after twist, unit 1 before twist -DIDE, N8, Mark IV, SmallZ80 - cable with twist, unit 0 before twist, unit 1 after twist - -Note that FDU does not utilize your systems ROM or OS to -access the floppy system. FDU interacts directly with -hardware. Upon exit, you may need to reset your OS to get the -floppy system back into a state that is expected. - -The Disk I/O should be jumpered as follows: - -J1: depends on use of interrupt modes (see interrupt modes below) -J2: pins 1-2, & 3-4 jumpered -J3: hardware dependent timing for DMA mode (see DMA modes below) -J4: pins 2-3 jumpered -J5: off -J6: pins 2-3 jumpered -J7: pins 2-3 jumpered -J8: off -J9: off -J10: off -J11: off -J12: off - -Note that J1 can be left on even when not using interrupt -modes. As long as the BIOS is OK with it, that is fine. Note -also that J3 is only relevant for DMA modes, but also can be -left in place when using other modes. - -The Disk I/O 3 board should be jumpered at the default settings: - -JP2: 3-4 -JP3: 1-2 for int mode support, otherwise no jumper -JP4: 1-2, 3-4 -JP5: 1-2 -JP6: 1-2 -JP7: 1-2, 3-4 - -Zeta & Zeta 2 do not have any relevant jumper settings. The -hardwired I/O ranges are assumed in the code. - -The Dual-IDE board should be jumpered as follows: - -K3 (DT/R or /RD): /RD -P5 (bd ID): 1-2, 3-4 (for $20-$3F port range) - -There are no specific N8 jumper settings, but the default -I/O range starting at $80 is assumed in the published code. - -The RC2014 Scott Baker SMC-based floppy module should be jumpered -for I/O base address 0x50 (SV1: 11-12), JP1 (TS) shorted, -JP2 (/FAULT) shorted, JP3 (MINI): 2-3, JP4 (/DC/RDY): 2-3. - -The RC2014 Scott Baker WDC-based floppy module should be jumpered -for I/O base address 0x50 (SV1: 11-12), JP1 (/DACK): 1-2, -JP2 (TC): 2-3. - -The RC2014 FDC by Alan Cox (Etched Pixels) needs to be strapped -for base I/O address 0x48. - -SmallZ80 does not have any relevant jumper settings. The -hardwired I/O ranges are assumed in the code. - -Dyno does not have any relevant jumper settings. The -hardwired I/O ranges are assumed in the code. - -The MBC FDC is expected to be strapped to use neither INT nor NMI. It -is also not expected to use DMA. - -Modes of Operation ------------------- - -You can select the following test modes. Please refer to the -chart that follows to determine which modes should work with -combinations of Z80 CPU speed and media format. - -WARNING: In general, only the polling mode is considered fully -reliable. The other modes are basically experimental and -should only be used if you know exactly what you are doing. - -Polling: Traditional polled input/output. Works well and very -reliable with robust timeouts and good error recovery. Also, -the slowest performance which precludes it from being used -with 1.44MB floppy on a 4MHz Z80. This is definitely the mode -you want to get working before any others. It does not require -J1 (interrupt enable) on DISK I/O and does not care about the -setting of J3. - -Interrupt: Relies on FDC interrupts to determine when a byte -is ready to be read/written. It does *not* implement a -timeout during disk operations. For example, if there is no -disk in the drive, this mode will just hang until a disk is -inserted. This mode *requires* that the host has interrupts -active using interrupt mode 1 (IM1) and interrupts attached to -the FDC controller. The BIOS must be configured to handle -these interrupts safely. - -Fast Interrupt: Same as above, but sacrifices additional -reliability for faster operation. This mode will allow a -1.44MB floppy to work with a 4MHz Z80 CPU. However, if any -errors occur (even a transient read error which is not -unusual), this mode will hang. The same FDC interrupt -requirements as above are required. - -INT/WAIT: Same as Fast Interrupt, but uses CPU wait instead of -actual interrupt. This mode is exclusive to the original Disk -IO board. It is subject to all the same issues as Fast -Interrupt, but does not need J1 shorted. J3 is irrelevant. - -DRQ/WAIT: Uses pseudo DMA to handle input/output. Does not -require that interrupts (J1) be enabled on the DISK I/O. -However, it is subject to all of the same reliability issues -as "Fast Interrupt". This mode is exclusive to the original -Disk IO board. At present, the mode is *not* implemented! - -The chart below attempts to describe the combinations that -work for me. By far, the most reliable mode is Polling, but -it requires 8MHz CPU for HD disks. - -DRQ/WAIT --------------------------------+ -INT/WAIT -----------------------------+ | -Fast Interrupt --------------------+ | | -Interrupt ----------------------+ | | | -Polling ---------------------+ | | | | - | | | | | -CPU Speed --------------+ | | | | | - | | | | | | - | | | | | | - -3.5" DD (720K) ------ 4MHz Y Y Y Y X - 8MHz+ Y Y Y Y X - -3.5" HD (1.44M) ----- 4MHz N N Y Y X - 8MHz+ Y Y Y Y X - -5.25" DD (360K) ----- 4MHz Y Y Y Y X - 8MHz+ Y Y Y Y X - -5.25" HD (1.2M) ----- 4MHz N N Y Y X - 8MHz+ Y Y Y Y X - -8" DD (1.11M) ------- 4MHz N N Y Y X - 8MHz+ Y Y Y Y X - -Y = Yes, works -N = No, does not work -X = Experimental, probably won't work - -Tracing -------- - -Command/result activity to/from the FDC will be written out if -the trace setting is changed from '00' to '01' in setup. -Additionally, if a command failure is detected on any command, -that specific comand and results are written regardless of the -trace setting. - -The format of the line written is: -: --> [] - -For example, this is the output of a normal read operation: -READ: 46 01 00 00 01 02 09 1B FF --> 01 00 00 00 00 02 02 [OK] - -Please refer to the i8272 data sheet for information on the -command and result bytes. - -Note that the sense interrupt command can return a non-OK -result. This is completely normal in some cases. It is -necessary to "poll" the drive for seek status using sense -interrupt. If there is nothing to report, then the result -will be INVALID COMMAND. Additionally, during a recalibrate -operation, it may be necessary to issue the command twice -because the command will only step the drive 77 times looking -for track 0, but the head may be up to 80 tracks away. In -this case, the first recalibrate fails, but the second should -succeed. Here is what this would look like if trace is turned -on: - -RECALIBRATE: 07 01 --> [OK] -SENSE INTERRUPT: 08 --> 80 [INVALID COMMAND] - ... - ... - ... -SENSE INTERRUPT: 08 --> 80 [INVALID COMMAND] -SENSE INTERRUPT: 08 --> 71 00 [ABNORMAL TERMINATION] -RECALIBRATE: 07 01 --> [OK] -SENSE INTERRUPT: 08 --> 21 00 [OK] - -Another example is when the FDC has just been reset. In this -case, you will see up to 4 disk change errors. Again these -are not a real problem and to be expected. - -When tracing is turned off, the application tries to be -intelligent about error reporting. The specific errors from -sense interrupt documented above will be suppressed because -they are not a real problem. All other errors will be -displayed. - -Error Handling --------------- - -There is no automated error retry logic. This is very -intentional since the point is to expose the controller and -drive activity. Any error detected will result in a prompt to -abort, retry, or continue. Note that some number of errors is -considered normal for this technology. An occasional error -would not necessarily be considered a problem. - -CPU Speed ---------- - -Starting with v5.0, the application adjusts it's timing loops -to the actual system CPU speed by querying the BIOS for the -current CPU speed. - -Interleave ----------- - -The format command now allows the specification of a sector -interleave. It is almost always the case that the optimal -interleave will be 2 (meaning 2:1). - -360K Media ----------- - -The 360K media definition should work well for true 360K -drives. However, it will generally not work with 1.2M -drives. This is because these drives spin at 360RPM instead -of the 300RPM speed of true 360K drives. Additionally, 1.2M -drives are 80 tracks and 360K drives are 40 tracks and, so -far, there is no mechanism in FD to "double step" as a way to -use 40 track media in 80 track drives. - -With this said, it is possible to configure some 1.2M 5.25" -drives to automatically spin down to 300RPM based on a density -select signal (DENSEL). This signal is asserted by FD for -360K media, so IF you have configured your drive to react to -this signal correctly, you will be able to use the 360K media -defintion. Most 1.2M 5.25" drives are NOT configured this way -by default. TEAC drives are generally easy to modify and have -been tested by the author and do work in this manner. Note -that this does not address the issue of double stepping above; -you will just be using the first 40 of 80 tracks. - -Support -------- - -I am happy to answer questions as fast and well as I am able. -Best contact is wwarthen@gmail.com or post something on the -RetroBrew Computers Forum -https://www.retrobrewcomputers.org/forum/. - -Changes -------- - -WW 8/12/2011 - -Removed call to pulse TC in the FDC initialization after -determining that it periodically caused the FDC to write bad -sectors. I am mystified by this, but definitely found it to -be true. Will revisit at some point -- probably a timing -issue between puslsing TC and whatever happens next. - -Non-DMA mode was being set incorrectly for FAST-DMA mode. It -was set for non-DMA even though we were doing DMA. It is -interesting that it worked fine anyway. Fixed it anyway. - -DIO_SETMEDIA was not clearing DCD_DSKRDY as it should. Fixed. - -WW 8/26/2011: v1.1 - -Added support for Zeta. Note that INT/WAIT and DRQ/WAIT are -not available on Zeta. Note that Zeta provides the ability to -perform a reset of the FDC independent of a full CPU reset. -This is VERY useful and the FDC is reset anytime a drive reset -is required. - -Added INT/WAIT support. - -WW 8/28/2011: V1.2 - -All changes in this version are Zeta specific. Fixed FDC -reset logic and motor status display for Zeta (code from -Sergey). - -Modified Zeta disk change display to include it in the command -output line. This makes more sense because a command must be -issued to select the desired drive first. You can use the -SENSE INT command id you want to check the disk change value -at any time. It will also be displayed with any other command -output display. - -WW 9/1/2011: V1.3 - -Added CPUFREQ configuration setting to tune delays based on -cpu speed. The build app is set for 8MHz which also seems to -work well for 4MHz CPU's. Faster CPU speeds will probably -require tuning this setting. - -WW 9/5/2011: V1.4 - -Changed the polling execution routines to utilize CPUFREQ -variable to optimize timeout counter. Most importantly, this -should allow the use of faster CPUs (like 20MHz). - -WW 9/19/2011: V1.5 - -Zeta changes only. Added a call to FDC RESET after any -command failure. This solves an issue where the drive remains -selected if a command error occurs. Also added FDC RESET to -FDC CONTROL menu. - -WW 10/7/2011: V2.0 - -Added support for DIDE. Only supports polling IO and it does -not appear any other modes are possible given the hardware -constraints. - -WW 10/13/2011: V2.1 - -Modified to support N8. N8 is essentially identical to Dual -IDE. The only real change is the IO addresses. In theory, I -should be able to support true DMA on N8 and will work on that. - -WW 10/20/2011: v2.2 - -I had some problems with the results being read were sometimes -missing a byte. Fixed this by taking a more strict approach -to watching the MSR for the exact bits that are expected. - -WW 10/22/2011: V2.3 - -After spending a few days trying to track down an intermittent -data corruption issue with my Dual IDE board, I added a verify -function. This helped me isolate the problem very nicely -(turned out to be interference from the bus monitor). - -WW 11/25/2011: V2.4 - -Preliminary support for DISKIO V3. Basically just assumed -that it operates just like the Zeta. Needs to be verified -with real hardware as soon as I can. - -WW 1/9/2012: V2.5 - -Modified program termination to use CP/M reset call so that a -warm start is done and all drives are logged out. This is -important because media may have been formatted during the -program execution. - -WW 2/6/2012: v2.6 - -Added support for 5.25" drives as tested by Sergio. - -WW 4/5/2012: v2.7 - -Added support for 8" drives as tested by Jim Harre. - -WW 4/6/2012: v2.7a - -Fixed issue with media selection menu to remove duplicate -entries. - -WW 4/8/2012: v2.7b - -Corrected the handling of the density select signal. - -WW 5/22/2012: v2.8 - -Added new media definitions (5.25", 320K). - -WW 6/1/2012: v2.9 - -Added interleave capability on format. - -WW 6/5/2012: v3.0 - -Documentation cleanup. - -WW 7/1/2012: v3.1 - -Modified head load time (HLT) for 8" media based on YD-180 -spec. Now set to 50ms. - -WW 6/17/2013: v3.2 - -Cleaned up SRT, HLT, and HUT values. - -SK 2/10/2015: v3.3 - -Added Zeta SBC v2 support (Sergey Kiselev) - -WW 3/25/2015: v4.0 - -Renamed from FDTST --> FD - -WW 9/2/2017: v5.0 - -Renamed from FD to FDU. -Added runtime selection of FDC hardware. -Added runtime timing adjustment. - -WW 12/16/2017: v5.1 - -Improved polling version of read/write to fix occasional overrun errors. - -WW 1/8/2018: v5.2 - -Added support for RC2014 hardware: - - Scott Baker SMC 9266 FDC module - - Scott Baker WDC 37C65 FDC module - -WW 9/5/2018: v5.3 - - Removed use of pulsing TC to end R/W operations after one sector and - instead set EOT = R (sector number) so that after desired sector is - read, R/W stops with end of cylinder error which is a documented - method for controling number of sectors R/W. This specific termination - condition is no longer considered an error, but a successful end of - operation. - - Added support for SmallZ80 - -WW 1/5/2020: v5.4 - - Added support for Dyno (based on work by Steve Garcia) - -WW 4/29/2020: v5.5 - - Added support for Etched Pixels FDC - -WW 12/12/2020: v5.6 - - Updated SmallZ80 support for new I/O map - -WW 3/24/2021: v5.7 - - Added support for a few single-sided formats - -WW 7/26/2021: v5.8 - - Added support for MBC FDC diff --git a/Doc/ROM Applications.pdf b/Doc/ROM Applications.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eb2867cb0890f6a382ee036c5d26f55c791ea8cd GIT binary patch literal 76199 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 literal 0 HcmV?d00001 diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 1c37b778fb539ac38a3521600c3ce8f874f5bdce..508c7329125ce7444c082a1e669209e2bcc0fd5a 100644 GIT binary patch delta 137 zcmbPmlVie7j)oS-Eli0_?B)g*CML$l(=(WuWMG`_-AqhNH4}_X%`BZPT+LmLEnH1q zObiU2%q@(aUEM5=EFE24EG_L6YzQieRj{+;DlSPZDyb++P2(~&HncFb;8Im}^>^a} E0GcEsbN~PV delta 137 zcmbPmlVie7j)oS-Eli0_>}H0hh8Cu#(=(WuWMG`_-AqhNH4}_2oLyYZ4Gf$eos3P* z%$qM7m=YG!!#7scU48$zk zx!<#%YiBn%urM((wwV5)j7qM7m=YG!!#7scU48$zk zx!<#%YiBnzG&Qs|FqrY~bu-U}5BHXkg-E WYUt`}ZtQAkr(i=!$@K8;Y_b3oAu?nD diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 10ade0276b87178f960fdd276fe983b4799ecd90..4c2421d140587fa8f7aeae351d9dbb8c3920d9db 100644 GIT binary patch delta 135 zcmX^3pZ(x}_J%Etk6yBy8(5eC!St6e8D(Ic?L4m-Lq!wZT+NLPEX>T!+zgzZElk{; zjLlqJTr7dY<_2yiCdPIOHUyQ#D%ja^6_+Fyl~fd^rg0e>nVOoIbE&Gj`nz!f00clK Ae*gdg delta 135 zcmX^3pZ(x}_J%Etk6yBy8JZee8kkLg`I1ov#@WvEiZN6)!NtkV&D`0@!p+&m+0D?| z(A>q@($&<|$=ub#&Dh-4%}&9FppsYxJ3Fr8lEk8tilWpsE<+5-F}WMG`_HItcI4HBG;9nD-VEX@oI49yLU zjLa-79gSTL%?vFqjol1fjZN$nYzQieRj{+;DlSPZDyb++P2(~I8e(M3rK;-c@5TiH D6KEqG delta 137 zcmaFZ!Tqp5-F}WMG`_HItcI4HC>uEuD-l4NWYKOpFcP zoQ%!f%$&_!9UTo#Ok53|T@CCMYzQieRj{+;DlSPZDyb++P2(~&v#>NW=2BI4^>^a} E03>1~fB*mh diff --git a/Source/Doc/ROM Applications.md b/Source/Doc/ROM_Applications.md similarity index 83% rename from Source/Doc/ROM Applications.md rename to Source/Doc/ROM_Applications.md index e01f9b2a..3a260183 100644 --- a/Source/Doc/ROM Applications.md +++ b/Source/Doc/ROM_Applications.md @@ -1,5 +1,6 @@ !include(Common.inc) !def(document)(ROM Applications) +!def(author)(Phillip Summers) --- title: !product !document author: !author (mailto:!authmail) @@ -37,7 +38,7 @@ programming languages. `\clearpage`{=latex} -#ROMWBW Monitor +# ROMWBW Monitor The Monitor program is a low level utility that can be used for testing and programming. It allows programs to be entered, @@ -48,30 +49,32 @@ It's key advantage is that is available at boot up. A quick guide to using the Monitor program follows: -##? - Displays a summary of available commands. - -`Monitor Commands (all values in hex):` -`B - Boot system` -`D xxxx yyyy - Dump memory from xxxx to yyyy` -`F xxxx yyyy zz - Fill memory from xxxx to yyyy with zz` -`H - Halt system` -`I xxxx - Input from port xxxx` -`K - Keyboard echo` -`L - Load Intel hex data` -`M xxxx yyyy zzzz - Move memory block xxxx-yyyy to zzzz` -`O xxxx yy - Output value yy to port xxxx` -`P xxxx - Program RAM at address xxxx` -`R xxxx - Run code at address xxxx` -`S xx - Set bank to xx` -`X - Exit monitor` - -##Cold Boot +## ? - Displays a summary of available commands. + +``` +Monitor Commands (all values in hex):` +B - Boot system` +D xxxx yyyy - Dump memory from xxxx to yyyy` +F xxxx yyyy zz - Fill memory from xxxx to yyyy with zz` +H - Halt system` +I xxxx - Input from port xxxx` +K - Keyboard echo` +L - Load Intel hex data` +M xxxx yyyy zzzz - Move memory block xxxx-yyyy to zzzz` +O xxxx yy - Output value yy to port xxxx` +P xxxx - Program RAM at address xxxx` +R xxxx - Run code at address xxxx` +S xx - Set bank to xx` +X - Exit monitor` +``` + +## Cold Boot B - Performs a cold boot of the ROMWBW system. A complete reinitialization of the system is performed and the system returns to the Boot Loader prompt. -##Dump Memory +## Dump Memory D xxxx yyyy - Dump memory from hex location xxxx to yyyy on the screen as lines of 16 hexadecimal bytes with their @@ -80,8 +83,9 @@ printed). A good tool to see where code is located, check for version id, obtain details for chip configurations and execution paths. -Examples: D 100 1FF +Examples: `D 100 1FF` +``` 0100: 10 0B 01 5A 33 45 4E 56 01 00 00 2A 06 00 F9 11 ...Z3ENV...*..ù. 0110: DE 38 37 ED 52 4D 44 0B 6B 62 13 36 00 ED B0 21 Þ87íRMD.kb.6.í°! 0120: 7D 32 E5 21 80 00 4E 23 06 00 09 36 00 21 81 00 }2Ã¥!..N#...6.!.. @@ -98,8 +102,9 @@ Examples: D 100 1FF 01D0: C9 3E FF 32 3C 00 3A 5D 00 FE 20 28 14 D6 30 32 É>ÿ2<.:].þ (.Ö02 01E0: AB 01 32 AD 01 3A 5E 00 FE 20 28 05 D6 30 32 AC «.2­.:^.þ (.Ö02¬ 01F0: 01 C5 01 F0 F8 CF E5 26 00 0E 0A CD 39 02 7D 3C .Ã….ðøÃÃ¥&...Ã9.}< +``` -##Fill Memory +## Fill Memory F xxxx yyyy zz - Fill memory from hex xxxx to yyyy with a single value of zz over the full range. The Dump command @@ -159,7 +164,7 @@ allow you to program a hexidecimal into memory starting at location xxxx. Press 'Enter' on a blank line to return to the Monitor prompt. -##NOTES: +## NOTES: The Monitor allows access to all memory locations. ROM and Flash memory cannot be written to. Memory outside the normal @@ -172,14 +177,14 @@ to manipulate the Real Time Clock non-volatile Memory. Use the C or Z option from the Boot Loader to load CP/M and then run RTC to see the options list. -#FORTH +# FORTH -#BASIC +# BASIC -#TastyBASIC +# TastyBASIC -#Play a Game +# Play a Game -#Network Boot +# Network Boot -#ZModem Flash Update \ No newline at end of file +# ZModem Flash Update \ No newline at end of file diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index 89a42b19..ded6c797 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -63,25 +63,31 @@ ; ; CONSTANTS ; -; RTC SBC SBC-004 MFPIC N8 N8-CSIO MK4 SC130 SC131 SC126 -; ----- ------- ------- ------- ------- ------- ------- ------- ------- ------- -; D7 WR RTC_OUT RTC_OUT -- RTC_OUT RTC_OUT RTC_OUT -- -- RTC_OUT, I2C_SDA -; D6 WR RTC_CLK RTC_CLK -- RTC_CLK RTC_CLK RTC_CLK -- -- RTC_CLK -; D5 WR /RTC_WE /RTC_WE -- /RTC_WE /RTC_WE /RTC_WE -- -- /RTC_WE -; D4 WR RTC_CE RTC_CE -- RTC_CE RTC_CE RTC_CE -- -- RTC_CE -; D3 WR NC SPK /RTC_CE NC NC NC -- -- /SPI_CS2 -; D2 WR NC CLKHI RTC_CLK SPI_CS SPI_CS NC /SPI_CS1/SPI_CS1/SPI_CS1 -; D1 WR -- -- RTC_WE SPI_CLK NC NC -- -- FS -; D0 WR -- -- RTC_OUT SPI_DI NC NC -- -- I2C_SCL -; -; D7 RD -- -- -- -- -- -- -- -- I2C_SDA -; D6 RD CFG CFG -- SPI_DO CFG -- -- -- -- -; D5 RD -- -- -- -- -- -- -- -- -- -; D4 RD -- -- -- -- -- -- -- -- -- -; D3 RD -- -- -- -- -- -- -- -- -- -; D2 RD -- -- -- -- -- -- -- -- -- -; D1 RD ---- -- -- -- -- -- -- -- -- -; D0 RD RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN -- -- RTC_IN +; RTC LATCH WRITE +; --------------- +; +; BIT SBC SBC-004 MFPIC N8 N8-CSIO MK4 SC130 SC131 SC126 MBC +; ----- ------- ------- ------- ------- ------- ------- ------- ------- --------------- ------- +; D7 RTC_OUT RTC_OUT -- RTC_OUT RTC_OUT RTC_OUT -- -- RTC_OUT,I2C_SDA RTC_OUT +; D6 RTC_CLK RTC_CLK -- RTC_CLK RTC_CLK RTC_CLK -- -- RTC_CLK RTC_CLK +; D5 /RTC_WE /RTC_WE -- /RTC_WE /RTC_WE /RTC_WE -- -- /RTC_WE /RTC_WE +; D4 RTC_CE RTC_CE -- RTC_CE RTC_CE RTC_CE -- -- RTC_CE RTC_CE +; D3 NC CLKSEL /RTC_CE NC NC NC -- -- /SPI_CS2 CLKSEL +; D2 NC SPK RTC_CLK SPI_CS SPI_CS NC /SPI_CS1/SPI_CS1/SPI_CS1 SPK +; D1 -- -- RTC_WE SPI_CLK NC NC -- -- FS LED1 +; D0 -- -- RTC_OUT SPI_DI NC NC -- -- I2C_SCL LED0 +; +; RTC LATCH READ +; -------------- +; +; D7 -- -- -- -- -- -- -- -- I2C_SDA -- +; D6 CFG CFG -- SPI_DO CFG -- -- -- -- CFG +; D5 -- -- -- -- -- -- -- -- -- -- +; D4 -- -- -- -- -- -- -- -- -- -- +; D3 -- -- -- -- -- -- -- -- -- -- +; D2 -- -- -- -- -- -- -- -- -- -- +; D1 ---- -- -- -- -- -- -- -- -- CLKSEL +; D0 RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN -- -- RTC_IN RTC_IN ; #IF (DSRTCMODE == DSRTCMODE_STD) ;