Page Index:
Ports (Model I)
EBH: Serial Port IN OUT (Input Data) (Output Data) B7: Data-7 Data-7 B6: Data-6 Data-6 B5: Data-5 Data-5 B4: Data-4 Data-4 B3: Data-3 Data-3 B2: Data-2 Data-2 B1: Data-1 Data-1 B0: Data-0 Data-0 EAH: Serial Port IN OUT (Uart Status bits) (Uart parameters set) B7: 1=Data Available 1=Even Parity B6: 0=Data sent (TBMT) WD Lngth 00=5 01=7 B5: 1=Overrun Error WD Lngth 10=6 11=8 B4: 1=Framing Error 0=1-Stop bit B3: 1=Parity Error 1=No Parity B2: unused 1=Transmit Enable B1: unused 0=DTR on B0: unused 0=RTS on E9H: Serial Port IN OUT (DIP Switches??) (Set speeds) B7: Parity 0=Odd Set Baud rate (all bits) B6: Wd Length 00=5 01=7 Bits 0-3 = Receive Speed B5: 10=6 11=8 Bits 4-7 = Transmit Speed B4: Stop bits 0=1 1=2 50 = 00H 75 = 11H B3: Parity 0=enable 100 = 22H 134.5 = 33H B2: unused 150 = 44H 300 = 55H B1: unused 600 = 66H 1,200 = 77H B0: unused 1,800 = 88H 2,000 = 99H 2,400 = AAH 3,600 = BBH 4,800 = CCH 7,200 = DDH 9,600 = EEH 19,200 = FFH E8H: Serial Port IN OUT (Signals Input) (Reset Uart) B7: CTS Any value will reset the B6: DSR Uart B5: 0=Carrier Detected B4: 1?=Ring Indicate B3: unused B2: unused B1: unused B0: Serial data input
Ports (Model III and Model 4)
Note: Tandy tended to allocate ports in groups of 4.
Graphics Board (Model 4 ONLY):
- Bits 0-1: Video memory, keyboard memory, and Model III ROM.
- 00: Model III ROMs Enabled, Video/Keyboard = Model 3
- 10: Model III ROMs Disabled, Video/Keyboard = Model 3
- 01: Model III ROMs Disabled, Video/Keyboard = Model 4 (In)
- 10: Model III ROMs Disabled, Video/Keyboard = Model 4 (Out)
- Bit 2: Video display mode (0 = 64×16, 1 = 80×24).
- Bit 3: Reverse Video.
- Bits 4-6: RAM bank select
- 000: Lower 32K Ram in Bank 0, Upper 32K RAM in Bank 1
- 010: Lower 32K Ram in Bank 0, Upper 32K RAM in Bank 2
- 011: Lower 32K Ram in Bank 2, Upper 32K RAM in Bank 1
- 110: Lower 32K Ram in Bank 0, Upper 32K RAM in Bank 3
- 111: Lower 32K Ram in Bank 3, Upper 32K RAM in Bank 1
- Bit 7: Video page select (64×16 mode): 0 = page 0, 1 = page 1.
Block 88/89/8A/8B – CRT Control
Block 8C/8D/8E/8F – Graphics Board:
Block 90/91/92/93 – Sound Port (Model 4 ONLY):
Reserved:
Model 4P Boot ROM (Model 4P Only):
Output:
- 0: Switch the Model 4P Boot ROM out
- 1: Switch the Model 4P Boot ROM in
ARCNET (Model 4P Only):
Hard Drive:
Write/Output: Reserved.
Read/Input: Hard disk write protect:
- Bit 0 (INTRQ): Interrupt Request
- Bit 1 (HWPL): If set, at least one hard drive is currently write protected
- Bit 4 (WPD4): If set, hard drive 4 is currently write protected
- Bit 5 (WPD3): If set, hard drive 3 is currently write protected
- Bit 6 (WPD2): If set, hard drive 2 is currently write protected
- Bit 7 (WPD1): If set, hard drive 1 is currently write protected
- Bit 2: RUMORED to enable wait state support on a 8X300 Controller Board
- Bit 3: If set, enable controller
- Bit 4: If set, reset controller
Output: Reserved.
Input: Hard disk device ID register.
Register 1 for WD1010 Winchester Disk Controller Chip.
Write/Output: The RWC start cylinder number = The value stored here divide by 4.
Read/Input: Error Register:
- Bit 0: Per the WD1010-00 Spec Sheet, this is DAM Not Found. The Radio Shack 15M HD Service Mauals says that this bit is reserved and forced to 0
- Bit 1: Track 0 Error (Restore Command)
- Bit 2: Aborted Command
- Bit 4: ID Not Found Error
- Bit 5: CRC Error – ID Field
- Bit 6: CRC Error – Data Field
- Bit 7: Bad Block Detected
Register 2 for WD1010 Winchester Disk Controller Chip. This is used only for multiple sector access. Internally decrements when used.
Register 5 for WD1010 Winchester Disk Controller Chip. Since the maximum number of cylinders is 1024, only Bits 0 and 1 are used (1023 = 0000 0011 + 1111 1111).
Register 6 for WD1010 Winchester Disk Controller Chip.
- Bits 0-2: Head Number (0-7)
- Bits 3-4: Drive Number (00=DSEL1, 01=DSEL2, 10=DSEL3, 11=DSEL 4)
- Bits 5-6: Sector Size (00=256, 01=512, 10=1024, 11=128)
- Bit 7: Extension (if this is set, Error Checking and Correction codes are in use and the R/W data [sector length + 7 bytes] do not check or generate CRC)
Register 7 for WD1010 Winchester Disk Controller Chip.
Read = Status Register:
- Bit 0: Error Exists (just an OR of Bits 1-7)
- Bit 1: Command in Progress
- Bit 2: Reserved (so forced to 0)
- Bit 3: Data Request
- Bit 4: Seek Complete
- Bit 5: Write Fault
- Bit 6: Drive Ready
- Bit 7: Busy
|--------------------------------------------------------------------------| |PORT CFH - WRITE - Command Register Instruction Set | | Bits: 7 6 5 4 3 2 1 0 | Bits: 7 6 5 4 3 2 1 0 | | Restore | 0 0 0 1 d c b a | Read Sector | 0 0 1 0 i m 0 0 | | Seek | 0 1 1 1 d c b a | Write Sector | 0 0 1 1 0 m 0 0 | | Scan ID | 0 1 0 0 0 0 0 0 | Write Format | 0 1 0 1 0 0 0 0 | | | | | "dcba" defines step rate field: | "i" defines interrupt enable status: | | 0000 = 35 us. | 0 = interrupt when data request | | 0001-1111 = 0.5-7.5 ms in | line (DRQ*) is enabled | | 0.5 ms steps | 1 = interrupt at end of command | | | | "m" defines multiple sector flag: 0 = one sector, 1 = multiple sectors | `--------------------------------------------------------------------------' * The 4P ROM is known to send three commands to this port: 16H-restore, 20H-read one sector, 70H-seek
Block D0/D1/D2/D3 – Network 4:
Interrupts:
- Bit 0 – 3365H (Cassette Routine with E set to HIGH)
- Bit 1 – 3669H (Cassette Routine with E set to LOW)
- Bit 2 – 4046H
- Bit 3 – 403DH
- Bit 4 – 4206H
- Bit 5 – 4209H
- Bit 6 – 4040H
- Bit 7 – 4043H
Input:
- Bit 5: Reset Status (0 = False, 1 = True)
- Bit 6: DRQ Status (0 = False, 1 = True)
- Bit 7: INTRQ Status (0 = False, 1 = True)
- Bit 6: Enable or Disable DRQ Interrupt (0 = Disable, 1 = Enable)
- Bit 7: Enable or Disable INTRQ Interrupt (0 = Disable, 1 = Enable)
Block E8/E9/EA/EB – RS-232:
Note: A Model I will set itself up based on the switches on the card. A Model III will default to 300 baud, 8 Bit Word, 1 Stop Bit, and No Parity.
Output: Any byte will reset the RS-232
Input:
- Bit 0 – Copy of serial input pin UART (Pin 20 of the DB-25)
- Bit 4 – Ring Indicator (Pin 22 of the DB-25)
- Bit 5 – Carrier Detect (Pin 8 of the DB-25)
- Bit 6 – Data Set Ready (Pin 6 of the DB-25)
- Bit 7 – Clear to Send (Pin 5 of the DB-25)
Output:
- 0000 0000 (00H) – Baud: 50
- 0001 0001 (11H) – Baud: 75
- 0010 0010 (22H) – Baud: 100
- 0011 0011 (33H) – Baud: 134.5
- 0100 0100 (44H) – Baud: 150
- 0101 0101 (55H) – Baud: 300
- 0110 0110 (66H) – Baud: 600
- 0111 0111 (77H) – Baud: 1,200
- 1000 1000 (88H) – Baud: 1,800
- 1001 1001 (99H) – Baud: 2,000
- 1010 1010 (AAH) – Baud: 2,400
- 1011 1011 (BBH) – Baud: 3,600
- 1100 1100 (CCH) – Baud: 4,800
- 1101 1101 (DDH) – Baud: 7,200
- 1110 1110 (EEH) – Baud: 9,600
- 1111 1111 (FFH) – Baud: 19,200
- Bit 0-2 = Baud Rate Select (50-1200; 5=300 Baud; 7=1200 Baud)
- Bit 4 = Parity (0 = Enabled, 1 = Disabled)
- Bits 5-6 = Word Length Select (00 = 5, 01=6, 10=7, 11=8)
- Bit 7 = Parity (0 = Odd, 1 = Even)
Input:
- Bits: 0-2 = Unused
- Bit 3: Parity Error (1=True)
- Bit 4: Framing Error (1=True)
- Bit 5: Overrun Error (1=True)
- Bit 6: Data Sent (1=True)
- Bit 7: Data Ready (1=True)
- Bit 0: Data Terminal Ready (1=DTR Off) (Pin 20 of the DB-25)
- Bit 1: Request to Send (1=RTS Off) (Pin 4 of the DB-25)
- Bit 2: Break (1=Send Break Signal)
- Bit 3: Parity Enable (0 = Enable Parity, 1 = Disable Parity)
- Bit 4: Stop Bits (0 = 1 Stop Bit, 1 = 2 Stop Bits
- Bits 5-6: Select Word Length (00 = 5, 01 = 7, 10 = 6, 11 = 8)
- Bit 7: Parity (0 = Odd, 1 = Even)
Port Add.! D7 ! D6 ! D5 ! D4 ! D3 ! D2 ! D1 ! D0 ! =========!=====!=====!=====!=====!=====!=====!=====!=====! E8 Write ! <---- UART RESET & INITIALIZATION ONLY ----->! ! NO DATA BITS REQUIRED ! T ---------!-----!-----!-----!-----!-----!-----!-----!-----! E8 Read ! cts ! dsr ! cd ! ri ! - ! - ! rec ! - ! ! ! ! ! ! ! ! i/p ! ! R =========!=====!=====!=====!=====!=====!=====!=====!=====! E9 Write ! Software Baud rate settings (see manual) ! ! ! ! ! ! ! ! ! ! S ---------!-----!-----!-----!-----!-----!-----!-----!-----! E9 Read !Parit! w/l ! w/l ! stop!Parit! Baud! Baud! Baud! switches !ev/od!slct1!slct2! 1or2!en/di! 1 ! 2 ! 3 ! =========!=====!=====!=====!=====!=====!=====!=====!=====! I EA Write !Parit! w/l ! w/l ! stop!Parit! TX ! DTR ! RTS ! control !ev/od!slct1!slct2! 1or2!en/di!en/di! ! ! ---------!-----!-----!-----!-----!-----!-----!-----!-----! EA Read ! DAV ! TBMT!o/run!frame!Parit! - ! - ! - ! 8 Uart ! ! !error!error!error! ! ! ! =========!=====!=====!=====!=====!=====!=====!=====!=====! EB Write ! <---------- 8 BIT DATA to UART -----------> ! 0 EB Read ! <---------- 8 BIT DATA from UART -----------> ! ========='====='====='====='====='====='====='====='====='--- D7 D6 D5 D4 D3 D2 D1 D0 =========v=====v=====v=====v=====v=====v=====v=====v=====v--- F8 Write ! - ! - ! - ! - ! - !Uart ! DTR ! RTS ! S ! ! ! ! ! !Reset! ! ! ---------!-----!-----!-----!-----!-----!-----!-----!-----! Y F8 Read ! <---------- 8 BIT DATA from UART -----------> ! ! ! ! ! ! ! ! ! ! S =========!=====!=====!=====!=====!=====!=====!=====!=====! F9 Write ! <---------- 8 BIT DATA to UART -----------> ! ! ! ! ! ! ! ! ! ! 8 ---------!-----!-----!-----!-----!-----!-----!-----!-----! F9 Read !TMBT ! CTS ! DSR ! CD ! PE ! FE ! OR ! DAV ! 0 ! ! ! ! ! ! ! ! ! ========='====='====='====='====='====='====='====='====='
Misc:
- Bit 0: Supposedly not used, but is on the Model III to test to see if the clock is on [0=off, 1=on].
- Bit 1: Cass motor [0 = on, 1 = off]
- Bit 2: Double width [0 = normal, 1 = double]
- Bit 3: Alt. char. [0 = Kana, 1 = Misc]
- Bit 4: I/O bus [0 = disable, 1 = enable]
- Bit 5: Video waits [0 = disable, 1 = enable]
- Bit 6: CPU clock speed [0 = 2 mhz, 1 = 4 mhz] – Model 4 ONLY
- Bit 7: not used
A quick note on Bit 5 (thanks to George Phillips). Bit 5 of Port ECH is supported on both the Model III and Model 4 and is set to ENABLE at 345CH. There is a latch connected to this bit that always has the current value. This latch has a wire connecting to both the Z-80 bus and the video circuitry which which mediates acccess to video RAM, so the processing of this bit is actually handled by separate hardware and not the ROM.
An example of this bit can be shown via the short program 10 CLS:FORI=0TO1023:POKE15360+I,191:NEXT. If run once with POKE 16912,0 and run again with POKE 16912,32, hash lines as the screen refreshes can be seen in one but not the other.
The Seatronics Super Speed-Up Board uses bits 6 and 7 of ECH to select the Z-80 Clock Rate:
Floppy Drive:
Input (depends on what the inquiry is in relation to: I=Restore, Seek, and Step, II = Read/Write Sector, III = Read/Write Track and Read Address:
- Bit 0:
- [I] BUSY = HIGH indicates command in progress
- [II/III] Busy = HIGH indicates command Is under execution.
- Bit 1:
- [I] INDEX = HIGH indicates index mark detected from drive
- [II/III] DATA REQUEST = HIGH indicates index mark detected from drive.
- Bit 2:
- [I] TRACK 0 = HIGH indicates Read/Write head is positioned to Track 0
- [II/III] LOST DATA = HIGH indicates the computer did not respond to DRQ in one byte time.
- Bit 3:
- [I] CRC ERROR = HIGH indicates a CRC error was found in the ID field
- [II/III] CRC ERROR = If BIT 4 is set, an error is found in one or more ID fields otherwise it indicates error in data field.
- Bit 4:
- [I] SEEK ERROR = HIGH indicates the desired track was not verified
- [II/III] RECORD NOT FOUND = HIGH indicates the desired track, sector, or side were not found.
- Bit 5:
- [I] HEAD LOADED = HIGH indicates the head is loaded and engaged
- [II/III] RECORD TYPE/WRITE FAULT = On Read Record, HIGH indicates the record-type code from data field address mark (1: Deleted Data Mark, 0: Data Mark). On any write, HIGH indicates a Write Fault.
- Bit 6:
- [I] PROTECTED = HIGH indicates Write Protect is activated
- [II/III] PROTECTED = On Read Record or Read Track, not used. On any write: it indicates a Write Protect.
- Bit 7: NOT READY = HIGH indicates the drive is not ready
- Bits 765 | 4 | 3 | 2 | 1 0
- 00-0F: 000 | 0 | h | V | R R = Restore
- 10-1F: 000 | 1 | h | V | R R = Seek
- 20-3F: 001 | T | h | V | R R = Step
- 40-5F: 010 | T | h | V | R R = Step In
- 60-7F: 011 | T | h | V | R R = Step Out
- 80-9E: 100 | m | S | E | C 0 = Read Sector
- A0-BF: 101 | m | S | E | C A = Write Sector
- C0,C4: 110 | 0 | 0 | E | 0 0 = Read Address
- D0-DF: 110 | 1 | x | x | x x = Force Interrupt
- E0,E4: 111 | 0 | 0 | E | 0 0 = Read Track
- F0,F4: 111 | 1 | 0 | E | 0 0 = Write Track
- RR = Stepping Motor Rate (00=6ms, 01=12ms, 10=20ms, 11=30ms)
- h = Head Load Flag (1: load head at beginning, 0: unload head)
- V = Track Number Verify Flag (0: no verify, 1: verify on dest track)
- T Track Update Flag (0: no update, 1: update Track Register)
- A Data Address Mark (0: FB, 1: F8 (deleted DAM))
- C Side Compare Flag (0: disable side compare, 1: enable side comp)
- E 15 ms delay (0: no 15ms delay, 1: 15 ms delay)
- S Side Compare Flag (0: compare for side 0, 1: compare for side 1)
- m Multiple Record Flag (0: single record, 1: multiple records)
- xxxx: Interrupt Condition Flags (1111 = Immediate interrupt, Index pulse, Ready to not ready transition, Not ready to ready transition)
- 00H: Restore
- 80H (1000 0000): Read single sided single sector
- A0H (1010 0000): Write single normal sector
- A1H (1010 0001): Write single sector read protect
- C0H (1100 0000): Read address, no delay
- D0H (1101 0000): Reset; puts FDC in mode 1 (INTRQ; “000” terminate command without interrupt)
- E0H (1110 0000): Read track, no delay
- F0H (1111 0000): Write track, no delay
Output:
- Bit 0: Drive 0 Select
- Bit 1: Drive 1 Select
- Bit 2: Drive 2 Select
- Bit 3: Drive 3 Select
- Bit 4: Side Select (0 = Select Side 0, 1 = Select Side 1)
- Bit 5: Write Precompensation (0 = Disable WP, 1 = Enable WP)
- Bit 6: Wait State Generation (0 = Disable WSG, 1 = Enable WSG)
- Bit 7: Density Select (0 = Single/FM, 1 = Double/MFM)
Block F8/F9/FA/FB – Printer:
Input:
- Bit 4: No Printer Fault
- Bit 5: Device Select
- Bit 6: Not Out of Paper
- Bit 7: Not Busy
Block FC/FD/FE/FF – Cassette:
Input: Bit 7: Data Bit (0 = Low, 1 = High)
Output: Bits 0-1: 00=0.85 Volts, 10=0.0 Volts, 01 = 0.46 Volts
Memory Mapped I/O Devices