ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Mattel Electronics Intellivision ³ ³ Intelligent Television ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÛÛ Û "Mattel Electronics Presents" ÛÛÛÛÛÛ Û ÛÛÛ Û ÛÛÛÛÛ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÛÛ ³De Re Intellivision³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÛÛ ÛÛÛÛÛÛ (In Latin "All About Intellivision") ÛÛÛÛÛÛ Û Û ÛÛ Û Compilation By William M. Moeller ÛÛ Û ÛÛ Û ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Last Modified November 28, 1997 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Chapter VI "IBM PC Intellivision ROM Dumper" Copyright 1997 Division Software Dumping GI ROMS - Cart, Exec and Grom. ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ The GI-ROMs used in the Intellivision are very different from the standard ROMS used in most other computers. This means that common ROM readers can not be used to dump the content of these ROMS. One approach to getting at the content of the ROMS is to build some hardware to accomplish the task. GI-ROMs interface to the 1610 bus directly, they do not require additional external circuitry for address decoding or determining the bus phase. They take the 16 address lines and 3 bus control lines, (and a reset line) raw, exactly as presented by the CPU, and where appropriate return a 8, 10 or 16 bit value back out onto the multiplexed data/address bus. Reading GI-ROM's requires hardware capable of simulating the address lines and bus control signals of a 1610 CPU, as well as capturing the data that is presented on the address/data bus by the ROM. The hardware requirements for such a circuit are at a minimum 20 output lines. 16 of these lines that will be used to form the bi-directional data/address bus must be able to be "tristated" - disconnected - so that they do not interfere with the data emitted by the ROM. In addition, circuitry must be provided to latch the state of the data/address bus so that it can be displayed or otherwise manipulated. The circuit shown later in this section performs these functions, and is designed to connect to a standard PC parallel port. This in itself requires some explanation. Interfacing to the PC parallel port ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ The PC parallel port provides 8 bits of parallel output, as well as 4 additional output lines intended for printer control. 4 inputs are also provided for returning various printer states. The 20 output lines required for the cart reader are obtained by expanding the PC's 8 bit parallel printer (data output) port to 24 bits through the use of 3 octal latches. Two of these latches are used to generate the 16 bit address and the third is used to create the various bus control signals. The 16 bits of data emitted by the ROM are read back into the PC by latching the data into two 8 bit parallel-to-serial shift registers and shifting the data one bit at a time into the PC through two of the 4 input bits on the printer port. 2-153 ÚÄ´Cart PortÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ SN74ALS166 ³ _____ Q aL aH ³ Shift Register ³ MSYNC ÚÄ¿ ÚÄÄÄÄÄ¿ ÚÄÄÄÄÄ¿ ³ ÚÄÄÄÄ¿ ÀÄÄÄÄÅÄÄÅÅÅÄÄÄÁÄÄ×ÄÄÁÄÄÄÄÁÄÄ×ÄÄÁÄÄÄÄÄÙ ÚÄ Gnd Ä´8 ÆÍÍÍÍÍÍÍÍÍÍÍØÍÍØØØÍÍÍÍÍ͹ º à Clki Ä´6 ³ ³ ³³³ º º ÀÄ Ser Ä´1 ³ ³ ³³³ º º ÚÄ Vcc Ä´16 7ÃÄÄÄ¿ Clk ³ ³³³ º º ÀÄ Clr Ä´9 15ÃÄ¿ ³sh/-ld ³ ³³³ º º ÚÄÄÄÄÄÄÄÄ´13 ³ ³ ³ ³ ³³³ º º ³ ÀÄÄÄÄÙ ³ ³ ³ ³³³ º º ³ ÚÄÄÄÄ¿ ³ ³ ³ ³³³ º º ³ÚÄ Gnd Ä´8 ÆÍØÍØÍÍÍÍÍÍÍØÍÍØØØÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍ͹ ³Ã Clki Ä´6 ³ ³ ³ ³ ³³³ º º ³ÀÄ Ser Ä´1 ³ ³ ³ ³ ³³³ º º ³ÚÄ Vcc Ä´16 7ÃÄÅÄ´ Clk ³ ³³³ º 2-397 º ³ÀÄ Clr Ä´9 15ÃÄ´ ³sh/-ld ³ ³³³ º SN74AS573º ³ ³13 ³ ³ ³ ³ ³³³ º Octal º ³ QhÀÂÄÄÄÙ ³ ³ ³ 17³19 º Latch º Output 12-19 ³ ³ ÚÄÄÄÁÄÁÄÄÄÄÄÄÄÁÄÄÁÁÁ¿ÚÄÄÄÄÐÄÄÄÄ¿ÚÄÄÄÄÐÄÄÄÄ¿ ÀÄÄÄÄÄÄ¿ ³ ³ 14 15 -oc C 13 18 ³³-oc C ³³-oc C 20 ÃÄ Vcc ³ ³ ³ 1 11 16 ³³ 1 11 ³³ 1 11 10 ÃÄ Gnd ³ ³ ÀÄÄÄÄÄÄÄÄÂÄÂÄÒÄÂÄÄÄÄÙÀÄÂÄÂÄÄÄÒÄÙÀÄÂÄÂÄÄÄÒÄÙ ³ ³ Gnd³ º ÀÄÄÄÄÄÄÄÁÄÅÄÄÄ×ÄÄÄÄÙ ³ º Input 2-9 ³ ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÊÍÍÍÍÍÍØÍÍ͹ ³ ³ ÀÄÄ¿ ÚÄÄÄÙ ³ º ³ ³ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÙ º ³ ³ ÚÄÁÄÄÄÄÄÄÁÄÄÄÁÄÄÄÄ¿ º ³ ³ 2-3 ³ 6 8 11 14 ÃÄ Vcc º ³ ³ 74LS00 ³ 4 5 9 10 1213 7 ÃÄ Gnd º ³ ³ Quad Nand ÀÄÂÄÂÄÂÄÂÄÄÂÄÂÄÄÄÄÙ º ³ ³ ÃÄÙ ÃÄÙ ÃÄÙ º ³ ³ ÚÄÁÄÄÄÁÄÄÄÄÁÄÄÄÄ¿ º ³ ³ 2-117 ³ 4 5 6 16 ÃÄ Vcc º ³ ³ SN74ALS139 ³ 2 3 1 8 ÃÄ Gnd º ³ ³ 2*4 decoder ÀÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÙ º ³ ³ ³ Auto ³ º Ack ³ ³Busy Strobe³ ³ ³Init º ÚÄ10Ä11ÄÄÄÄÄÄ¿ ÚÄÄ1ÄÄ14 Ä16Ä¿ ÚÄÄÄÄÄÄÐÄÄÄÄÄ¿ ³ b6 b7 ³ ³ b0 b1 b2 ³ ³ Data ³ ³ P379 ³ ³ P37A ³ ³ P378 all ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ Parts List 74LS573/574/580 + 20 pin socket * 3 74LS165 + 16 pin socket * 2 74LS139/138 + 16 pin socket * 1 74LS00 14 pin socket * 1 44 pin board edge connecter, (female) board mounted Prototype board of sufficient size Wire wrap wire Power connector + Batteries. Construction layout ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ D8 D9 D10 D11 D12 D2 D1 D15 -MSYNC ÄÄ¿ D7 D6 D5 D4 D3 D13 D14 D0 Vcc ³ 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 1 3 5 7 9 1 3 5 7 9 1 3 5 7 9 1 3 5 7 9 1 3 GNDÚÄÄ . . . . . . . . . . . . . . . . . . . . . Bottom ³ . . . . . Ä¿. Ä¿Ä¿Ä¿Ä¿Ä¿Ä¿Ä¿. . . . . . . Ä¿ Top ³ 2 4 6 8 1 1³1 1³1³2³2³2³2³2³3 3 3 3 3 4 4 4³ ³ 0 2³4 6³8³0³2³4³6³8³0 2 4 6 8 0 2 4³ ³ ³ ³ ³ ³ ³ ³ ³ ³ Bc1 BDir ³ U1,2,3 ³ ³ ³ ³ ³GND³ ³ ³ Bc2 ³ SN74AS573 ÚÄÄ1ÄÁÂÄÄÄ2ÄÄÂÄÄÄ3ÀÄÂÄÁÄÁÄÁÂÁÄÙ5ÀÄÅÄÄÄ6ÄÄÂÄÄÄ7ÄÄÂÄÁÄ8ÄÄ¿ Octal latch ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÚÄÄÄÄÄÄÄ¿ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ -oc Ä´ 1 20ÃÄ Vcc ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d0 Ä´ 2 19ÃÄ q0 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d1 Ä´ 3 18ÃÄ q1 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d2 Ä´ 4 17ÃÄ q2 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d3 Ä´ 5 16ÃÄ q3 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d4 Ä´ 6 15ÃÄ q4 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d5 Ä´ 7 14ÃÄ q5 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d6 Ä´ 8 13ÃÄ q6 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d7 Ä´ 9 12ÃÄ q7 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ GND Ä´10 11ÃÄ c ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÀÄÄÄÄÄÄÄÙ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ SN74ALS166 U4,5 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ Shift Register ³ ... ³³ ... ³³ ... ³³ .B. ³³ ... ³³ ... ³³ ... ³³ ... ³ ÚÄÄÄÄÄÄÄ¿ ³ ... ³³ ... ³³ ... ³³ .A. ³³ ... ³³ ... ³³ ... ³³ ... ³ Ser Ä´ 1 16ÃÄ Vcc ³ ... ³³ ... ³³ ... ³³ .C. ³³ ... ³³ ... ³³ ... ³³ ... ³ a Ä´ 2 15ÃÄ sh/ld ³ ... ³³ ... ³³ ... ³³ .K. ³³ ... ³³ ... ³³ ... ³³ ... ³ b Ä´ 3 14ÃÄ h ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ c Ä´ 4 13ÃÄ q ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ d Ä´ 5 12ÃÄ g ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ Cl Ä´ 6 11ÃÄ r ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ Cli Ä´ 7 10ÃÄ e ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ GND Ä´ 8 9ÃÄ Clr ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÀÄÄÄÄÄÄÄÙ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ SN74ALS139 U7 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ 2*4 decoder ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÚÄÄÄÄÄÄÄ¿ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ g Ä´ 1 16ÃÄ Vcc ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ a Ä´ 2 15ÃÄ g' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ b Ä´ 3 14ÃÄ a' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ y0 Ä´ 4 13ÃÄ b' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ y1 Ä´ 5 12ÃÄ y0' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ y2 Ä´ 6 11ÃÄ y1' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ y3 Ä´ 7 10ÃÄ y2' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ Gnd Ä´ 8 9ÃÄ y3' ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÀÄÄÄÄÄÄÄÙ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ 74LS00 U6 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ Quad Nand ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÚÄÄÄÄÄÄÄ¿ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ a1 Ä´ 1 14ÃÄ Vcc ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ b1 Ä´ 2 13ÃÄ a4 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ y1 Ä´ 3 12ÃÄ b4 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ a2 Ä´ 4 11ÃÄ y4 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ b2 Ä´ 5 10ÃÄ a3 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ y2 Ä´ 6 9ÃÄ b3 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ GND Ä´ 7 8ÃÄ y3 ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ÀÄÄÄÄÄÄÄÙ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³³ ... ³ ³ Ä1ÄÄÄÁÄÄ2ÄÄÄÁÄÄ3ÄÄÄÁÄÄ4ÄÄÄÁÄÄ5ÄÄÄÁÄÄ6ÄÄÄÁÄÄ7ÄÄÄ´ Ä8ÄÄÙ ÀÄ Gnd . . . . . . ÀÄ Vcc ³ ³ ³ ³ ³ ³ O O O O O O As seen from underside of project board ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ x = NO CONNECTION ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ U1 ³ ÚÄÄÄÄÂÄÄÄÄxÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ÚÄ¿ÚÂÂÅ¿ÚÄ¿ ³ U2 ³ÚÂÂÂÅ¿ÚÄ¿ U3 ³ÚÂÂÂÅ¿ÚÄ¿ ³ ³ÚÁÁÁÁÁÁÁÁÁÁ¿³ ³ ÚÁÁÁÁÁÁÁÁÁÁ¿³ ÚÁÁÁÁÁÁÁÁÁÁ¿³ ÄxÄÄÄÁ³123456789AÃÁÄÄxÄÄij123456789AÃÁÄÄÄÄÄ´123456789AÃÁÄÄÄ Gnd ³ ÃÄ ³ ³ ÃÄ ³ ÃÄ ³ ÄxÄÄÄ´KJIHGFEDCBÃÄÄÄxÄÄ´KJIHGFEDCBÃÄÄÄÄÄ´KJIHGFEDCBÃÄÄÄÄ Vcc ³ ³ÀÂÂÂÂÂÂÂÂÂÂÙ ³ ³ÀÂÂÂÂÂÂÂÂÂÂÙ ³ÀÂÂÂÂÂÂÂÂÂÂÙ ÚÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ÀÄÙ³³³³³³DE³ ³ ÀÄÙ³³³³³³³³³ Ä¿ ÀÄÙ³³³³³³³³³ Ä¿ ³ Cart Port ³ ³ ABCÀxxÄÄxÄÄÄÄÙ ³³³³abcd³ ÄÁ X ³³³³efgh³ ÄÁ Y ÃÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ÀÄÄxÄ¿ ÚÄÄÄÄÄÄxxxxÄÄÄÄÙ ³³³³ ³ ³A=BC1 ³ ³ ÀÄÄÄxÄx¿³ ÚÄÄÄÄxxxxÄÄÄÄÄÄÄÄÄÄÄÄÄÄxxxxÄÄÄÄÙ ³B=BC2 ³ ³ ÚÄÄÄÄÄ¿ ÚÄÄÄÙ ³ÀxÄxÄÄÄÄxxxxÂÄÄÄÄÄÄÄÄÄÄÄÄÄxxxx¿ ³C=BDIR ³ ³ ³ FGHÿ³ÚÄ¿ ³ ³ ³ ÚÄ¿³³³³³ÚÂÄ¿ U5 ÚÄ¿³³³³³ÚÂÄ¿ U4 ³D=-MSYNC ³ ³ ³ ÚÁÁÁÁÁÁÁ¿³ ³ ³ ³ ³ÚÁÁÁÁÁÁÁÁ¿³ ³ÚÁÁÁÁÁÁÁÁ¿³ ³E=>H = NC ³ ÄxÄÄxij1234567ÃÁÄÄxÄxÄxÄÙ³12345678ÃÁÄÄÄÄÄÄÁ´12345678ÃÁÄÄÄ Gnd ³X= A/D 0-7 ³ ³ ³ ÃÄ ³ ³ ³ ³ ÃÄ ³ ÃÄ ³ ³ J=A/D 0 ³ ÄxÄÄx´EDCBA98ÃÄÄÄxÄxÄxÄ´GFEDCBA9ÃÂÄÄÄÄÄÄ´GFEDCBA9ÃÂÄÄÄ Vcc ³Y= A/D 8-15 ³ ³ ³³À´ ³ ³ ³ ³ÀÂÂÂÂÂÂÂÂÙ³ ³ÀÂÂÂÂÂÂÂÂÙ³ ³ J=A/D 8 ³ ³ ³ÀÄÙÀ´³À´ÀÁÄÄÄxÄÙ ³ ÀÄÙ³³³³³³ÀÄÙ ÀÄÙ³³³³³³ÀÄÙ ³X/Y=Internal³ ³ ³U6 ³ÀÄxÄÄÄÄÄxÄÄÄÙ ³d³cba ³h³gfe ³ Bus ³ ³ ³ ÀÄ¿³ ÀÄÄÄÄÄÄÄÄÁÄxÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ÀÄÄÄÄÄ¿³³ ³ ³ ³ÚÄÄÄÄÄÄ¿³³³ ³ ³ ³³ÚÄÄÄÄ¿³³³³Únc ³ ³ ³³³ÚÄÄ¿³³³³³³ÚÄ¿ U7 ³ ³ ³³³³ ÚÁÁÁÁÁÁÁÁ¿³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÄxxxxÄ´12345678ÃÁÄÄÄÄÄÄÄÄÄÄÄÄÅÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Gnd ³³³³ ÃÄ ³ ³ ³ Äxxxx´KJIHGFEDÃÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Vcc ³³³³³ÀÂÂÄÄÄÄÄÂÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³³³³ÀÄÙÀÄÄÂÄÄÙ ³ ³ ³ Parallel Port ³ ³³³³ nc ³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³³³³ ³ ³ ³ L = data lines ³ ³³³³ ³ ³ ³ M = Auto ³ LMNO P Q ³ N = Strobe ³ ³ O = INIT ³ ³ P = ACK ³ ³ Q = Busy ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ In order to dump 40 pin ROMS (EXEC and GROM), a 40 pin socket can be wired to the construction board, and wired directly to the cart port. The 40 pin socket should have its pins connected to the corresponding pins on the cart port. Once a 40 pin ROM has been installed, it is dumped in exactly the same manner as a cart ROM, although the address range for the 40 pin ROM will generally be different. GI-ROMS do their own address decoding. 40 pin ROM (EXEC) ÚÄÄÄÄÄÄÄÄÂÂÄÄÄÄÄÄÄÄ¿ VCC ÄÄÄ´ 1 ÀÙ 40 ÃÄÄÄ BC1 |nc| ÄÄÄ´ 2 39 ÃÄÄÄ BC2 |nc| ÄÄÄ´ 3 38 ÃÄÄÄ BDIR |nc| ÄÄÄ´ 4 37 ÃÄÄÄ D0 D15 ÄÄÄ´ 5 36 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 6 35 ÃÄÄÄ D1 D14 ÄÄÄ´ 7 34 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 8 33 ÃÄÄÄ D2 D13 ÄÄÄ´ 9 32 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 10 31 ÃÄÄÄ D3 D12 ÄÄÄ´ 11 30 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 12 RO-3-9502 29 ÃÄÄÄ D4 D11 ÄÄÄ´ 13 -011 ROM 28 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 14 27 ÃÄÄÄ D5 D10 ÄÄÄ´ 15 26 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 16 25 ÃÄÄÄ D6 D9 ÄÄÄ´ 17 24 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 18 23 ÃÄÄÄ D7 D8 ÄÄÄ´ 19 22 ÃÄÄÄ |nc| -MSYNC ÄÄÄ´ 20 21 ÃÄÄÄ GND ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Mattel Intellivision Cartridge Port ³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Motherboard CART ROM TOP BOTTOM CART ROM Motherboard # # ?? NC ?? - 2 1-GND GND GND STIC Pin 19 NC ?? - 4 3--MSYNC Pin 14 CPU pin 2 Matl Pin 7 NC ?? - 6 5-D7 Pin 16 CPU pin 16 STIC Pin 9 GND ?? - 8 7-D8 Pin 13 CPU pin 13 STIC Pin 15* GND ?? -10 9-D6 Pin 17 CPU pin 17 Supply ?? GND ?? -12 11-D9 Pin 12 CPU pin 12 CPU INTRM NC INT -14 13-D5 Pin 19 CPU pin 18 GND -16 Ä¿M 15-D10 Pin 10 CPU pin 11 GND -18 Ä´T 17-D4 Pin 20 CPU pin 19 GND -20 Ä´H 19-D11 Pin 9 CPU pin 10 GND -22 Ä´R 21-D3 Pin 21 CPU pin 20 GND -24 Ä´B 23-D12 Pin 8 CPU pin 9 GND -26 Ä´R 25-D13 Pin 7 CPU pin 8 GND -28 ÄÙD 27-D2 Pin 23 CPU pin 11 CPU BUSAK NC ?? -30 29-D14 Pin 6 CPU pin 7 ÚÄSTIC BC1 ÄÄÄÄ ÚÄÄÄ *1 -32 31-D1 Pin 24 CPU pin 15 ³ STIC BC2 ÄÄÄÄ C³ÚÄÄ *2 -34 33-D0 Pin 25 CPU pin 14 ³ STIC BDIR ÄÄÄÄ A³³ÚÄ *3 -36 SLOT 35-D15 Pin 4 CPU pin 6 ³ Mattel Pin 10 R³³ÀÄ *3 -38 ÄÄÄÄÄ37-*3 Pin 26 STIC Pin 8 ³ Mattel Pin 12 T³ÀÄÄ *2 -40 ÄÄÄÄ-39-*2 Pin 27 STIC Pin 6 ÃÄMattel Pin 14 ÀÄÄÄ *1 -42 ÄÄÄÄÄ41-*1 Pin 28 STIC Pin 7 ³ GND GND GND-44 43-VCC PIN VCC ³ ÀÄTiming Read/Write etc. * STIC pin 15 tied to connector through resistor? Pullup? *1 ............ STIC pin 7 BC1 *2 ............ STIC pin 6 BC2 *3 ............ STIC pin 8 BDIR In order to dump the GROM, the 40 pin socket must be rewired. For the program supplied below, D0-D13, -BUSAK, -Msync, Vcc and GND should be connected to their corresponding pins on the cartridge connector. SR1 should be connected to BDIR, DTB, and BAR, BC1 and BC2 respectively. 2048 bytes 8 bytes per tile, 8 bits wide tile number comes from backram ÚÄÄÄÄÄÄÄÄÂÂÄÄÄÄÄÄÄÄ¿ VCC ÄÄÄ´ 1 ÀÙ 40 ÃÄÄÄ |nc| SR1 ÄÄÄ´ 2 39 ÃÄÄÄ |nc| -BUSAK ÄÄÄ´ 3 38 ÃÄÄÄ |nc| |nc| ÄÄÄ´ 4 GROM 37 ÃÄÄÄ DTB |nc| ÄÄÄ´ 5 36 ÃÄÄÄ BAR |nc| ÄÄÄ´ 6 35 ÃÄÄÄ |nc| D13 ÄÄÄ´ 7 34 ÃÄÄÄ D0 D12 ÄÄÄ´ 8 33 ÃÄÄÄ |nc| D11 ÄÄÄ´ 9 32 ÃÄÄÄ D1 |nc| ÄÄÄ´ 10 31 ÃÄÄÄ |nc| D10 ÄÄÄ´ 11 30 ÃÄÄÄ D2 |nc| ÄÄÄ´ 12 29 ÃÄÄÄ |nc| D9 ÄÄÄ´ 13 28 ÃÄÄÄ D3 |nc| ÄÄÄ´ 14 27 ÃÄÄÄ |nc| D8 ÄÄÄ´ 15 26 ÃÄÄÄ |nc| -MSYNC ÄÄÄ´ 16 25 ÃÄÄÄ D4 |nc| ÄÄÄ´ 17 24 ÃÄÄÄ |nc| D7 ÄÄÄ´ 18 23 ÃÄÄÄ D5 |nc| ÄÄÄ´ 19 22 ÃÄÄÄ |nc| D6 ÄÄÄ´ 20 21 ÃÄÄÄ GND ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Programming ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÙ Parallel Port registers ³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Base address of port will depend on which parallel port the card is plugged into. Ports shown below are for parallel port address 0378H. Port 037AH - Subregister select ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ÀÄÁÄÅÄÁÄÙ ³ ÀÂÙ ³ ³ ÀÄÄÄÄ xx Subregister ³ ³ 11 Bus control register ³ ³ 01 High address ³ ³ 10 Low address ³ ³ 00 Unused ³ ÀÄÄÄÄÄÄÄ Select gate ³ 0 = enable ³ 1 = disable ÀÄÄÄÄÄÄÄÄÄÄÄÄÄ Unused (keep 0) Port selection is accomplished through a 2-4 decoder that whose decoding requires settling time. As a result, selection should be gated (turned off (1) ) before a subregister is selected. Proper port selection is as follows... OUT 037AH,(subregister #) or 4 < select port, or 4 for settling time write data to port (if any) < output data to 8 bit input bus OUT 037AH,(subregister #) < select port data copied from input bus Port 0378H - Bus control port ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ Subregister 01 = Address latch ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ÀÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÄÄ ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ Subregister 10 = Address latch ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ÀÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÄÄ ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ Subregister 11 = Bus Control register ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ³ ³ ³ ³ ³ ³ ³ ÀÄÄ BC1 ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ BC2 ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄ BDIR ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄ Internal bus enable ³ ³ ³ ³ 0 = bus enabled ³ ³ ³ ³ 1 = bus disabled ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄ Shift Clock ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄ Shift/Load ³ ³ 0 = Parallel load from bus ³ ³ 1 = Serial output on clock = 0 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄ -MSYNC ³ 0 = Reset condition active 10ms MINIMUM ³ 1 = Normal operation ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Reserved (0) To load data from the parallel bus into the shift registers, ; 76543210 OUT 037AH, 000000111B < select Bus Control port, + 4 for settling time OUT 037AH, 000000011B < select Bus Control port OUT 0378H, 000011000B < clock high + bus disabled + parallel load OUT 0378H, 000001000B < clock low + bus disabled (data latched) OUT 0378H, 000111000B < clock high + bus disabled + shift mode Port 0379H - Data input port ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ³ ³ ÀÄÁÄÁÂÁÄÁÄÙ ³ ³ ÀÄÄÄÄÄ Unused (ignore) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄ Low data out ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄ High data out (inverted) When in serial output mode, bits 7 and 6 become valid on a high to low transition of the shift clock. 8 bits are available in the shift registers, representing the high and low data present on the parallel bus. DRIVER SOFTWARE ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ The programs that drive the above hardware are provided below. The address range of the data that will be read are contained in the constants SADRS (Start address) and EADRS (End address). With the range read being SADRS to (EADRS -1). The address of the parallel port used is contained in the variable PPORT. Once a cart has been read and verified it is dumped to STDIO in hex format. Conversion to binary is a simple matter of redirecting the output to a file, and converting the file to binary with the TOBIN.BAS program (also provided below). The dump procedure is a two step process so that the data from the cart can be visually inspected for splits before conversion to a binary image. Note: GI-ROMS can map into more than one address range, with different data in each address. Selftest ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÙ ' THE CART SUCKER PROVIDED ABOVE IS TO SOME EXTENT CAPABLE OF TESTING ITSELF. ' THE SELF TEST IS PERFORMED BY OUTPUTTING AN ADDRESS OVER THE PARALLEL BUS ' AND READING IT BACK THROUGH THE SHIFT REGISTERS. IF EVERYTHING IS WORKING ' CORRECTLY, THE DATA OUT SHOULD BE THE SAME AS THE DATA IN. DEFINT A-Z PORT = &H378 ' printer base port address CLS ' clear screen PRINT "VERIFYING" ' print title FOR OH = 0 TO 255 ' test all 256 * 256 values FOR OL = 0 TO 255 GOSUB TESTPORT ' test one value NEXT NEXT END TESTPORT: OUT PORT + 2, 4 + 3 ' disable decoder OUT PORT, 32 + 16 + 8 ' clock 1 + serial mode + bus disable +NACT OUT PORT + 2, 3 ' select control port OUT PORT + 2, 4 + 2 ' disable decoder OUT PORT, OL ' output low address OUT PORT + 2, 2 ' select low address port OUT PORT + 2, 4 + 1 ' disable decoder OUT PORT, OH ' output high address OUT PORT + 2, 1 ' select high address port OUT PORT + 2, 4 + 3 ' disable decoder OUT PORT, 0 ' clock load + parallel load + bus enable OUT PORT + 2, 3 ' select control port IL = 0: IH = 0 ' input high/low = 0 FOR a = 0 TO 7 ' loop for 8 bits OUT PORT, 16 + 32 + 8 ' toggle clock low OUT PORT, 0 + 32 + 8 ' toggle clock high B = INP(PORT + 1) XOR 128 ' read port and invert high bit IL = IL + IL ' IL * 2 IH = IH + IH ' IH * 2 IF (B AND 128) > 0 THEN IL = IL + 1 ' Move bit to IL IF (B AND 64) > 0 THEN IH = IH + 1 ' Move bit to IH NEXT IF (IH <> OH) OR (IL <> OL) THEN ' error if input <> output BEEP PRINT PRINT "PATTERN NOT VERIFIED" PRINT "OUTPUT"; HEX$(OH); HEX$(OL) PRINT "INPUT"; HEX$(IH); HEX$(IL) ELSE LOCATE 2, 1: PRINT HEX$(IH); HEX$(IL) ' matched so print value END IF RETURN Cart Sucker ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÙ ;---------------------------------------------------------------- ; Program Name DUMP_C.ASM ; ; NOTE THAT SOFTWARE TIMING LOOPS ARE USED ; THE VALUES USED WERE A COMPLETE GUESS. DIFFERENT SPEED PC'S ; MAY NEED TO USE DIFFERENT VALUES. ; ; THE RATE AT WHICH THE CART IS DUMPED IS NOT AN ISSUE. ; ; THIS PROGRAM USES STDIO, - PIPE THE OUTPUT TO A FILE. ; ; TO ASSEMBLE USE... MASM DUMP_C; ; LINK DUMP_C; ; EXE2COM DUMP_C ; ;ÚÄÄÄÂÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³BC1³BC2³BDIR³ ³ ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 0 ³ 0 ³ 0 ³NACT ³ CPU inactive, and disconnected from bus ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 0 ³ 0 ³ 1 ³BAR ³ A memory address is being presented on the BUS ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 0 ³ 1 ³ 0 ³IAB ³ CPU is acknowledging an interrupt request ³ ;³ ³ ³ ³ ³ External logic must place the starting address ³ ;³ ³ ³ ³ ³ for the interrupt service routine on the bus. ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 0 ³ 1 ³ 1 ³DWS ³ Data write strobe to memory. ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 1 ³ 0 ³ 0 ³ADAR ³ This signal identifies a time interval during ³ ;³ ³ ³ ³ ³ which the Data/Address bus is floated, while ³ ;³ ³ ³ ³ ³ data input on the Data Bus is being interpreted ³ ;³ ³ ³ ³ ³ as the effecitve memory address during a direct ³ ;³ ³ ³ ³ ³ memory addressing operation. ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 1 ³ 0 ³ 1 ³DW ³ Data is being written to memory. ³ ;³ ³ ³ ³ ³ Preceeds DWS by one cycle. ³ ;ÃÄÄÄÅÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ 1 ³ 1 ³ 0 ³DTB ³ Read strobe (external device is to place data ³ ;³ ³ ³ ³ ³ on the bus. ³ ;³ 1 ³ 1 ³ 1 ³INTAK ³ Interrupt acknnowledge. Followed by IAD. ³ ;ÀÄÄÄÁÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; ; ³ BAR MC1 ³ NACT MC2 ³ DTB MC3 ³ CP-1600 ; ³t1³t2³t3³t4³ ³ ³ ³ ³t1³t2³t3³t4³ Instruction Fetch timing ; ³ ³ ³ ³ ³t1³t2³t3³t4³ ³ ³ ³ ³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ; ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄÄ O1 ;ÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ;Ä¿| ÚÄ¿| ÚÄ¿| ÚÄ¿ ÚÄ¿| ÚÄ¿ ÚÄ¿| ÚÄ¿ ; ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄ O2 ; | | | | ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄ BC1 ; | | | | ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄ BC2 ; ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ;ÄÄÙ | | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ BDIR ; | ÚÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄ¿ ;ÄÄÄÄÄxxx³ ÃÄÄÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄÄ Address ; ÀÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÙ ; Address out Data in ; SADRS EQU 04700H ; DUMP START ADDRESS (CARTS GENERALLY START AT EADRS EQU 06900H ; DUMP END ADDRESS 05000H AND END AT 06000H) RSTDLY EQU 5000 ; RESET DELAY BUSTIM EQU 50 ; BUS INTERVAL IOTIM EQU 5 ; I/O DELAY PPORT EQU 0378H ; PARALLEL PORT BASE ADDRESS DATREG EQU PPORT ; PARALLEL PORT DATA REGISTER INREG EQU PPORT+1 ; PARALLEL PORT STATUS REGISTER SELREG EQU PPORT+2 ; PARALLEL PORT CONTROL REGISTER NACT EQU 00000000B ; BITS USED TO SELECT EACH BUS PHASE BAR EQU 00000100B DTB EQU 00000011B ;-------------------------------------------------- ; OUTPUT DATA MACRO ; NOT EFFICIENT BUT SUITABLE FOR DEBUGGING ; ; OUTDAT MACRO LATCH,XDATA MOV AH,LATCH MOV AL,XDATA ; GET DATA TO OUTPUT CALL RAWOUT ENDM INCLUDE C:\MASM\MYDEFS.INC ; 0 JNE NOTADR MOV AX,BX ; AX = ADDRESS OMOV DI,HEXBUF1 ; POINT TO OUTPUT BUFFER CALL TOHEX ; GO CONVERT TO HEX NOTADR: CALL GETBYT ; READ WORD FROM CART CALL DISPLY ; GO CONVERT TO HEX POP BX ; RESTORE ADDRESS INC BX ; BUMP TO NEXT ADDRESS CMP BX,EADRS ; LOOP IF MORE TO DUMP JNE MORLOK CALL DONACT ; GO PERFORM NACT BUS CYCLE (IDLE) CMPTW COUNTER,0 ; AVOID IF BUFFER IS EMPTY JE EMPTY CALL SHOBUF ; GO DISPLAY BUFFER EMPTY: MOV AX,04C00H ; RETURN TO DOS WITHOUT ERROR INT DOS COUNTER DW 0 ;---------------------------- ; READ BYTE FROM CART PORT ; ; CALL WITH BX = ADDRESS ; RETURN WITH BX = VALUE RETURNED ; GETBYT: CALL DONACT ; GO PERFORM NACT BUS CYCLE (IDLE) CALL DOBAR ; GO PERFORM BAR+NACT BUS CYCLE (ADDRESS OUT) CALL DONACT ; GO PERFORM NACT BUS CYCLE (IDLE) CALL DODTB ; GO PERFORM DTE BUS CYCLE AND LATCH INPUT GETIN: XOR BX,BX ; ZERO HOLDING REGISTER MOV CX,8 ; 8 BITS IN A BYTE INMOR: PUSH CX ; PRESERVE COUNT ROL BX,1 ; SHIFT RESULT MOV DX,INREG ; DX = SERIAL INPUT PORT IN AL,DX ; READ SERIAL INPUT PORT AND AL,011000000B ; KEEP MS2Bits XOR AL,010000000B ; INVERT BIT (CORRECT FOR PARALLEL PORT) XOR AH,AH ; READY FOR SHIFT SHL AX,1 ; AH(BIT 0) = BIT 7, AL(BIT 7) = BIT 6 ROL AL,1 ; AL(BIT 0) = BIT 6 OR BX,AX ; BITS TO RESULT OUTDAT 3,<01101000B + NACT> ; SHIFT + CLOCK 0 + BUS DISABLE + NACT OUTDAT 3,<01111000B + NACT> ; SHIFT + CLOCK 1 + BUS DISABLE + NACT POP CX ; RESTORE COUNT LOOP INMOR ; LOOP IF MORE TO DO RET ;---------------------------------------- ; SELECT LATCH AND OUTPUT DATA TO LATCH ; ; CALL WITH AL = DATA TO OUTPUT ; AH = LATCH # ; RAWOUT: MOV DX,DATREG ; DX = DATA REGISTER OUT DX,AL ; OUTPUT DATA CALL IODLY ;< WAIT FOR DATA TO SETTLE MOV DX,SELREG ; GET LATCH SELCTION REGISTER MOV AL,AH ; AL = LATCH OR AL,4 ; PRESENT LATCH # (BLOCK OUTPUT) OUT DX,AL ; SELECT LATCH (DISABLE SELECTION) CALL IODLY ;< WAIT FOR LATCH TO SETTLE MOV AL,AH ; AL = LATCH OUT DX,AL ; PRESETNT LATCH # (OUTPUT ENABLED) CALL IODLY ;< WAIT FOR LATCH TO ACCEPT DATA OR AL,4 ; PRESENT LATCH # (BLOCK OUTPUT) OUT DX,AL RET ;------------------------------------------------------------- ; PERFORM DTE BUS CYCLE AND LATCH DATA INTO SHIFT REGISTERS ; DODTB: OUTDAT 3,<01111000B + DTB> ; SHIFT + CLOCK 1 + BUS DISABLE + DTB CALL HLFDLY ; WAIT FOR DATA TO BECOME VALID OUTDAT 3,<01001000B + DTB> ; LOAD + CLOCK 0 + BUS DISABLE + DTB OUTDAT 3,<01011000B + DTB> ; LOAD + CLOCK 1 + BUS DISABLE + DTB HLFDLY: MOV CX,BUSTIM/2 ; PERFORM BUS CYCLE DELAY LOOP $ RET ;------------------------------------------- ; PERFORM BAR BUS CYCLE (OUTPUT ADDRESS) ; DOBAR: OUTDAT 3,<01111000B + BAR> ; SHIFT + CLOCK 1 + BUS DISABLE + BAR OUTDAT 1,BL ; DATA LOW OUT OUTDAT 2,BH ; DATA HIGH OUT CALL HLFDLY OUTDAT 3,<01110000B + BAR> ; SHIFT + CLOCK 1 + BUS ENABLE + BAR CALL HLFDLY ; GO PERFORM HALF BUS CYCLE DELAY OUTDAT 3,<01110000B + NACT> ; SHIFT + CLOCK 1 + BUS ENABLE + NACT CALL HLFDLY ; GO PERFORM HALF BUS CYCLE DELAY OUTDAT 3,<01111000B + NACT> ; SHIFT + CLOCK 1 + BUS DISABLE + NACT RET ;----------------------------------------- ; PERFORM NACT BUS CYCLE (IDLE) ; INIT: MOV AL,4 ; DISABLE PORT SELECTION MOV DX,SELREG OUT DX,AL OUTDAT 3,<00111000B + NACT> ; SHIFT + CLOCK 1 + BUS DISABLE + NACT MOV CX,RSTDLY LOOP $ RET DONACT: OUTDAT 3,<01111000B + NACT> ; SHIFT + CLOCK 1 + BUS DISABLE + NACT BUSDLY: MOV CX,BUSTIM ; PERFORM BUS CYCLE DELAY LOOP $ RET ;------------------- ; PERFORM I/O DELAY ; IODLY: MOV CX,IOTIM ; PERFORM I/O DELAY LOOP $ RET ;------------------------ ; CONVERT AX TO HEX ; ; CALL WITH AX = NUMBER TO CONVERT ; DI = PTR TO OUTPUT BUFFER ; DISPLY: MOV DI,COUNTER ; GET SLOT # MSHL DI,2 ; * 4 BYTES PER SLOT ADD DI,COUNTER ; * 5 BYTES PER SLOT OADD DI,HEXBUF2 ; DI = PTR TO SLOT MOV AX,BX ; AX = VALUE TO CONVERT CALL TOHEX ; GO CONVERT AX TO HEX INC COUNTER ; BUMP COUNTER CMP COUNTER,8 ; AVOID IF NO COUNTER OVERFLOW JNE NOTZRO SHOBUF: OMOV DX,HEXBUF1 ; POINT TO BUFFER FOR PRINT MOV AH,9 ; WILL PRINT BUFFER VIA DOS INT DOS CLRBUF: MOV COUNTER,0 ; RESET COUNTER OMOV DI,HEXBUF2 ; POINT TO CONVERSION BUFFER OMOV CX,CRLF ; GET PTR TO BOTTOM OF BUFFER SUB CX,DI ; COMPUTE LENGTH OF BUFFER MOV AL,' ' ; CLEAR WITH SPACES CLD ; DIRECTION POSITIVE REP STOSB ; CLEAR BUFFER AND END NOTZRO: RET TOHEX: CLD ; DIRECTION POSITIVE PUSH AX ; PRESERVE AL MOV AL,AH CALL OVER ; GO CONVERT BYTE POP AX ; RESTORE AL MOV AH,AL ; AH = AL OVER: MSHR AH,4 ; AL = LSNibble AND AL,00FH ; AH = MSNibble CMP AL,10 ; CONVERT LSNibble SBB AL,069H DAS XCHG AH,AL ; AL = MSnIBBLE CMP AL,10 ; CONVERT MSNibble SBB AL,069H DAS STOSW ; OUTPUT VAL AND RETURN RET ;------------------------- ; HEX CONVERSION BUFFER ; HEXBUF1 DB 'xxxx : ' HEXBUF2 DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' CRLF DB CR,LF,'$' COMBOT CSEG GROM Sucker ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÙ ;---------------------------------------------------------------- ; Program Name DUMP_G.ASM ; ; NOTE THAT SOFTWARE TIMING LOOPS ARE USED ; THE VALUES USED WERE A COMPLETE GUESS. DIFFERENT SPEED PC'S ; MAY NEED TO USE DIFFERENT VALUES. ; ; THIS PROGRAM WORKS CORRECTLY ON A CYRIX 5X86 120, AND ; SHOULD RUN CORRECTLY ON ANY SLOWER MACHINE. ; ; THE RATE AT WHICH THE CART IS DUMPED IS NOT AN ISSUE. ; ; THIS PROGRAM IS SIMILAR TO DUMP_C, ALTHOUGH THE GROM BUS PHASES HAVE ; BEEN CHANGED. ; ; THIS PROGRAM USES STDIO, - PIPE THE OUTPUT TO A FILE. ; ; TO ASSEMBLE USE... MASM DUMP_G; ; LINK DUMP_G; ; EXE2COM DUMP_G ; ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Bus timing ³ ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ;³ ÚÄÄÄÄÄ¿ ÚÄÄÄÄÄ¿ ³ ;³ BAR ÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³ ;³ ÚÄÄÄÄÄ¿ ÚÄÄÄÄÄ¿ ³ ;³ DTB ÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄ ³ ;³ ÚÄÄÄÄÄ¿ ³ ;³ DWS ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄ ³ ;³ ÚÄÄÄÄÄ¿ ÚÄÄÄÄÄ¿ ÚÄÄÄÄÄ¿ ÄÄ¿ ³ ;³ DATA IN ÄÄÄÄÁadrsÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁadrsÄÁÄÄÄÄÄÁdataÄÁÄÄÄÄ ³ D0-D15 ³ ;³ ÚÄÄÄÄÄ¿ ³ ³ ;³ DATA OUT ÄÄÄÄÄÄÄÄÄÄÄÁdataÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³ ³ ;³ ÄÄÙ ³ ;³ -Enable ÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄ ³ ;³ ÀÄÄÄÄÄÙ ÀÄÄÄÄÄÙ ³ ;³ -Write ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄ ³ ;³ ÀÄÄÄÄÄÙ ÄÄ¿ ³ ;³ ExternalÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³ A0-A10 ³ ;³ Address ÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ³ ³ ;³ Output ÄÄÙ ³ ;³ ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SADRS EQU 03000H ; DUMP START ADDRESS EADRS EQU 04000H ; DUMP END ADDRESS RSTDLY EQU 5000 ; RESET DELAY BUSTIM EQU 50 ; BUS INTERVAL IOTIM EQU 5 ; I/O DELAY PPORT EQU 0378H ; PARALLEL PORT BASE ADDRESS DATREG EQU PPORT ; PARALLEL PORT DATA REGISTER INREG EQU PPORT+1 ; PARALLEL PORT STATUS REGISTER SELREG EQU PPORT+2 ; PARALLEL PORT CONTROL REGISTER BCLR EQU 00000000B ; BITS USED TO SELECT EACH BUS PHASE BAR EQU 00000001B DTB EQU 00000010B ;-------------------------------------------------- ; OUTPUT DATA MACRO ; NOT EFFICIENT BUT SUITABLE FOR DEBUGGING ; ; OUTDAT MACRO LATCH,XDATA MOV AH,LATCH MOV AL,XDATA ; GET DATA TO OUTPUT CALL RAWOUT ENDM INCLUDE C:\MASM\MYDEFS.INC ; ; PRESERVE REGS CALL GETBYT ; READ WORD FROM CART POP DI ; RESTORE TABLE PTR MOV ES:[DI],BX ; MOVE VALUE TO TABLE POP BX ; RESTORE ADDRESS ADD DI,2 ; MOVE TO NEXT POSITION IN TABLE JNC AVD3 MOV AX,ES ; ES = ES + 64K ADD AX,01000H MOV ES,AX AVD3: INC BX ; BUMP TO NEXT ADDRESS CMP BX,EADRS ; LOOP IF MORE TO DUMP JNE MORLOK JMP DOBUSCLR ; GO PERFORM BUSCLR BUS CYCLE (IDLE) ;---------------------------- ; CHECK CART ; CARTCHK: LES DI,CBPTR ; START AT TOP OF BUFFER MOV BX,SADRS ; BX = START ADDRESS MORLOK1: MPUSH ; PRESERVE REGS CALL GETBYT ; READ WORD FROM CART POP DI ; RESTORE TABLE PTR CMP ES:[DI],BX ; MOVE VALUE TO TABLE POP BX ; RESTORE ADDRES JNE BADVAL ; GO IF VALUE DOES NOT MATCH ADD DI,2 ; MOVE TO NEXT POSITION IN TABLE JNC AVD1 MOV AX,ES ; ES = ES + 64K ADD AX,01000H MOV ES,AX AVD1: INC BX ; BUMP TO NEXT ADDRESS CMP BX,EADRS ; LOOP IF MORE TO DUMP JNE MORLOK1 CALL DOBUSCLR CLC RET BADVAL: CALL DOBUSCLR STC RET ;------------------------------ ; CHECK FOR STUCK BITS ; CHKSTK: MOV CX,EADRS ; GET END OF CART SUB CX,SADRS ; COMPUTE LENGTH OF CART LES SI,CBPTR ; START AT TOP OF BUFFER MOV BX,-1 ; ALL BITS ON XOR DX,DX ; ALL BITS OFF STKMOR: MOV AX,ES:[SI] ; GET DATA FROM BUFFER AND BX,AX ; COLLECT OFF BITS OR DX,AX ; COLLECT ON BITS ADD SI,2 ; MOVE TO NEXT POSITION IN TABLE JNC AVD4 MOV AX,ES ; ES = ES + 64K ADD AX,01000H MOV ES,AX AVD4: LOOP STKMOR ; LOOP IF MORE TO CHECK NOT DX ; INVERT ON BITS OR BX,DX ; COLLECT STUCK BITS AND BX,03FFH ; IGNORE NON-INSTRUCTION BITS JNE FNDSTK ; GO IF FOUND STUCK BITS CLC ; SIGNIFY NO STUCK BITS AND END RET FNDSTK: STC ; SIGNFIY STUCK BITS AND END RET ;------------------------------ ; OUTPUT CART TO STDIO ; CARTOUT: CALL CLRBUF ; GO CLEAR OUTPUT BUFFER LES SI,CBPTR ; START AT TOP OF BUFFER MOV BX,SADRS ; BX = START ADDRESS MORLOK2: CMPTW COUNTER,0 ; AVOID PRINT IF COUNTER <> 0 JNE NOTADR CALL ADROUT ; GO PRINT ADDRESS NOTADR: MOV AX,ES:[SI] ; GET VAL FROM TABLE CALL DISPLY ; GO CONVERT TO HEX ADD SI,2 ; MOVE TO NEXT POSITION IN TABLE JNC AVD2 MOV AX,ES ; ES = ES + 64K ADD AX,01000H MOV ES,AX AVD2: INC BX ; BUMP TO NEXT ADDRESS CMP BX,EADRS ; LOOP IF MORE TO DUMP JNE MORLOK2 CALL DOBUSCLR ; GO PERFORM BUSCLR CYCLE (IDLE) CMPTW COUNTER,0 ; AVOID IF BUFFER IS EMPTY JE EMPTY CALL SHOBUF ; GO DISPLAY BUFFER EMPTY: RET ;---------------------------- ; READ BYTE FROM CART PORT ; ; CALL WITH BX = ADDRESS ; RETURN WITH BX = VALUE RETURNED ; GETBYT: CALL DOBUSCLR ;< ; GO PERFORM BUSCLR BUS CYCLE (IDLE) CALL GETDATA ;< ; GO PERFORM BAR+BUSCLR BUS CYCLE (ADDRESS OUT) GETIN: XOR BX,BX ; ZERO HOLDING REGISTER MOV CX,8 ; 8 BITS IN A BYTE INMOR: PUSH CX ; PRESERVE COUNT ROL BX,1 ; SHIFT RESULT MOV DX,INREG ; DX = SERIAL INPUT PORT IN AL,DX ; READ SERIAL INPUT PORT AND AL,011000000B ; KEEP MS2Bits XOR AL,010000000B ; INVERT BIT (CORRECT FOR PARALLEL PORT) XOR AH,AH ; READY FOR SHIFT SHL AX,1 ; AH(BIT 0) = BIT 7, AL(BIT 7) = BIT 6 ROL AL,1 ; AL(BIT 0) = BIT 6 OR BX,AX ; BITS TO RESULT OUTDAT 3,<01101100B + BCLR> ; SHIFT + CLOCK 0 + BUS DISABLE + BCLR OUTDAT 3,<01111100B + BCLR> ; SHIFT + CLOCK 1 + BUS DISABLE + BCLR POP CX ; RESTORE COUNT LOOP INMOR ; LOOP IF MORE TO DO RET ;---------------------------------------- ; SELECT LATCH AND OUTPUT DATA TO LATCH ; ; CALL WITH AL = DATA TO OUTPUT ; AH = LATCH # ; RAWOUT: MOV DX,DATREG ; DX = DATA REGISTER OUT DX,AL ; OUTPUT DATA CALL IODLY ;< WAIT FOR DATA TO SETTLE MOV DX,SELREG ; GET LATCH SELCTION REGISTER MOV AL,AH ; AL = LATCH OR AL,4 ; PRESENT LATCH # (BLOCK OUTPUT) OUT DX,AL ; SELECT LATCH (DISABLE SELECTION) CALL IODLY ;< WAIT FOR LATCH TO SETTLE MOV AL,AH ; AL = LATCH OUT DX,AL ; PRESETNT LATCH # (OUTPUT ENABLED) CALL IODLY ;< WAIT FOR LATCH TO ACCEPT DATA OR AL,4 ; PRESENT LATCH # (BLOCK OUTPUT) OUT DX,AL RET ;------------------------------------------- ; PERFORM BAR BUS CYCLE (OUTPUT ADDRESS) ; GETDATA: OUTDAT 3,<01111100B + BAR> ; SHIFT + CLOCK 1 + BUS DISABLE + BAR OUTDAT 1,BL ; DATA LOW OUT OUTDAT 2,BH ; DATA HIGH OUT OUTDAT 3,<01110100B + BAR> ; SHIFT + CLOCK 1 + BUS ENABLE + BAR CALL HLFDLY OUTDAT 3,<01111100B + DTB> ; SHIFT + CLOCK 1 + BUS DISABLE + DTB CALL HLFDLY ; WAIT FOR DATA TO BECOME VALID OUTDAT 3,<01001100B + DTB> ; LOAD + CLOCK 0 + BUS DISABLE + DTB OUTDAT 3,<01011100B + BCLR> ; LOAD + CLOCK 1 + BUS DISABLE OUTDAT 3,<01111100B + BCLR> ; SHIFT + CLOCK 1 + BUS DISABLE HLFDLY: MOV CX,BUSTIM/2 ; PERFORM BUS CYCLE DELAY LOOP $ RET DOBUSCLR: OUTDAT 3,<01111100B + BCLR> ; SHIFT + CLOCK 1 + BUS DISABLE + BCLR BUSDLY: MOV CX,BUSTIM ; PERFORM BUS CYCLE DELAY LOOP $ RET ;----------------------------------------- ; PERFORM BUSCLR BUS CYCLE (IDLE) ; INIT: MOV AL,4 ; DISABLE PORT SELECTION MOV DX,SELREG OUT DX,AL OUTDAT 3,<00111100B + BCLR> ; MSYNC=0, SHIFT + CLOCK 1 + ; BUS DISABLE + SR1=1 + BCLR CALL BUSDLY OUTDAT 3,<01111000B + BCLR> ; MSYNC=1, SHIFT + CLOCK 1 + ; BUS DISABLE + SR1=0 + BCLR CALL BUSDLY OUTDAT 3,<01111100B + BCLR> ; MSYNC=1, SHIFT + CLOCK 1 + ; BUS DISABLE + SR1=1 + BCLR JMP BUSDLY ;------------------- ; PERFORM I/O DELAY ; IODLY: MOV CX,IOTIM ; PERFORM I/O DELAY LOOP $ RET ;------------------------ ; CONVERT AX TO HEX ; ; CALL WITH AX = NUMBER TO CONVERT ; DI = PTR TO OUTPUT BUFFER ; DISPLY: PUSH ES ; PRESERVE SEG MOV CX,DS ; ES = DS MOV ES,CX MOV DI,COUNTER ; GET SLOT # MSHL DI,2 ; * 4 BYTES PER SLOT ADD DI,COUNTER ; * 5 BYTES PER SLOT OADD DI,HEXBUF2 ; DI = PTR TO SLOT CALL TOHEX ; GO CONVERT AX TO HEX INC COUNTER ; BUMP COUNTER CMP COUNTER,8 ; AVOID IF NO COUNTER OVERFLOW JNE NOTZRO SHOBUF: OMOV DX,HEXBUF1 ; POINT TO BUFFER FOR PRINT MOV AH,9 ; WILL PRINT BUFFER VIA DOS INT DOS JMPS OVERX CLRBUF: PUSH ES ; PRESERVE SEG MOV CX,DS ; ES = DS MOV ES,CX OVERX: MOV COUNTER,0 ; RESET COUNTER OMOV DI,HEXBUF2 ; POINT TO CONVERSION BUFFER OMOV CX,CRLF ; GET PTR TO BOTTOM OF BUFFER SUB CX,DI ; COMPUTE LENGTH OF BUFFER MOV AL,' ' ; CLEAR WITH SPACES CLD ; DIRECTION POSITIVE REP STOSB ; CLEAR BUFFER AND END NOTZRO: POP ES ; RESTORE SEG RET ADROUT: PUSH ES ; PRESERVE SEG MOV AX,DS ; ES = DS MOV ES,AX MOV AX,BX ; AX = ADDRESS OMOV DI,HEXBUF1 ; POINT TO OUTPUT BUFFER CALL TOHEX ; GO CONVERT TO HEX POP ES RET TOHEX: CLD ; DIRECTION POSITIVE PUSH AX ; PRESERVE AL MOV AL,AH CALL OVER ; GO CONVERT BYTE POP AX ; RESTORE AL MOV AH,AL ; AH = AL OVER: MSHR AH,4 ; AL = LSNibble AND AL,00FH ; AH = MSNibble CMP AL,10 ; CONVERT LSNibble SBB AL,069H DAS XCHG AH,AL ; AL = MSnIBBLE CMP AL,10 ; CONVERT MSNibble SBB AL,069H DAS STOSW ; OUTPUT VAL AND RETURN RET DW 128 DUP(0) STACK DW 00 ;------------------------- ; HEX CONVERSION BUFFER ; HEXBUF1 DB 'xxxx : ' HEXBUF2 DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' DB 'xxxx ' CRLF DB CR,LF,'$' TOPARA CSEG CARTBUF EQU $ COMBOT CSEG Macros used by above programs ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; ; ** CAUTION ** macros do not allow numeric operations within the brackets ; ; eg. MOV AX,OFFSET FOO+10 can not be replaced with ; OMOV AX,FOO+10 ; ; FB = FROM BYTE replaces ??,BYTE PTR ; TB = FROM BYTE replaces BYTE PTR,?? ; ; FW = FROM WORD replaces ??,WORD PTR ; TW = FROM WORD replaces WORD PTR,?? ; ; PUTTING AN 'O' IN FRONT OF A WORD INDICATES AN OFFSET IN THE SECOND OPERAND ; ; ie OMOV = MOV ??,OFFSET ?? ; ; MPUSH, MPOP ARE MULTIPLE PUSH AND POPS (PUT PARAMS IN ANGLE BRACKETS> ; ; ie MPUSH <----- DON'T FORGET TO USE REVERSE ORDERS ; MPOP ; ; For instructions involving one operand (inc, dec, or, and, mul etc.) ; these operands followed by B = Byte or W = word indicates the desired size ; ; ie INCB FOO ; ; This list is not complete, but covers 99.9% of all of the cases ! ; BREAK_ MACRO INT 3 ENDM ;*** HEADER MACROS *** COMTOP MACRO A &A SEGMENT PARA PUBLIC 'CODE' ASSUME CS:A,DS:A,SS:A,ES:A ORG 02CH ; ADDRESS OF ENVIROMENT SEGMENT ENVSEG LABEL WORD ORG 0100H ; SKIP TO END OF THE PSP START PROC NEAR ENDM COMBOT MACRO A START ENDP &A ENDS END START ENDM ; COMMON ASCI CHARACTERS BELL EQU 007H BCKSPC EQU 008H TAB EQU 009H LF EQU 00AH CR EQU 00DH ESCAPE EQU 01BH EOF EQU 01AH DELETE EQU 07FH ; COMMON INTERRUPT NAMES VBIOS EQU 010H DISKBIOS EQU 013H UARTBIOS EQU 014H KEYBIOS EQU 016H PRNBIOS EQU 017H TIMEBIOS EQU 01AH DOS EQU 021H TSRINT EQU 027H MULTIPLEX EQU 02FH MOUSE EQU 033H SEG_CS MACRO DB 02EH ENDM SEG_DS MACRO DB 03EH ENDM SEG_ES MACRO DB 026H ENDM ; 386+ ONLY SEG_FS MACRO DB 064H ENDM ; 386+ ONLY SEG_GS MACRO DB 065H ENDM SEG_SS MACRO DB 036H ENDM JMPS MACRO X JMP SHORT X ENDM JMPF MACRO X,Y DB 0EAH DW Y,X ENDM JMPW MACRO X JMP WORD PTR X ENDM JMPDW MACRO X JMP DWORD PTR X ENDM JMPW MACRO X JMP WORD PTR X ENDM CALLW MACRO X CALL WORD PTR X ENDM CALLDW MACRO X CALL DWORD PTR X ENDM RET_F MACRO DB 0CBH ENDM RET_N MACRO DB 0C3H ENDM RET_FP MACRO X DB 0CAH DW X ENDM RET_NP MACRO X DB 0C2H DW X ENDM MPUSH MACRO Y IRP X,< Y > PUSH X ENDM ENDM MPOP MACRO Y IRP X,< Y > POP X ENDM ENDM CHIPDELAY MACRO X REPT X JMPS $+2 ENDM ENDM LESFD MACRO X,Y LES X, DWORD PTR Y ENDM LDSFD MACRO X,Y LDS X, DWORD PTR Y ENDM OMOV MACRO X,Y MOV X,OFFSET Y ENDM MOVTB MACRO X,Y MOV BYTE PTR X,Y ENDM MOVFB MACRO X,Y MOV X, BYTE PTR Y ENDM MOVTW MACRO X,Y MOV WORD PTR X,Y ENDM MOVFW MACRO X,Y MOV X, WORD PTR Y ENDM OSUB MACRO X,Y SUB X,OFFSET Y ENDM SUBTB MACRO X,Y SUB BYTE PTR X,Y ENDM SUBFB MACRO X,Y SUB X, BYTE PTR Y ENDM SUBTW MACRO X,Y SUB WORD PTR X,Y ENDM SUBFW MACRO X,Y SUB X, WORD PTR Y ENDM OADD MACRO X,Y ADD X,OFFSET Y ENDM ADDTB MACRO X,Y ADD BYTE PTR X,Y ENDM ADDFB MACRO X,Y ADD X, BYTE PTR Y ENDM ADDTW MACRO X,Y ADD WORD PTR X,Y ENDM ADDFW MACRO X,Y ADD X, WORD PTR Y ENDM OADC MACRO X,Y ADC X,OFFSET Y ENDM ADCTB MACRO X,Y ADC BYTE PTR X,Y ENDM ADCFB MACRO X,Y ADC X, BYTE PTR Y ENDM ADCTW MACRO X,Y ADC WORD PTR X,Y ENDM ADCFW MACRO X,Y ADC X, WORD PTR Y ENDM OSBB MACRO X,Y SBB X,OFFSET Y ENDM SBBTB MACRO X,Y SBB BYTE PTR X,Y ENDM SBBFB MACRO X,Y SBB X, BYTE PTR Y ENDM SBBTW MACRO X,Y SBB WORD PTR X,Y ENDM SBBFW MACRO X,Y SBB X, WORD PTR Y ENDM OCMP MACRO X,Y CMP X,OFFSET Y ENDM CMPTB MACRO X,Y CMP BYTE PTR X,Y ENDM CMPFB MACRO X,Y CMP X, BYTE PTR Y ENDM CMPTW MACRO X,Y CMP WORD PTR X,Y ENDM CMPFW MACRO X,Y CMP X, WORD PTR Y ENDM TESTTB MACRO X,Y TEST BYTE PTR X,Y ENDM TESTFB MACRO X,Y TEST X, BYTE PTR Y ENDM TESTTW MACRO X,Y TEST WORD PTR X,Y ENDM TESTFW MACRO X,Y TEST X, WORD PTR Y ENDM ANDTB MACRO X,Y AND BYTE PTR X,Y ENDM ANDFB MACRO X,Y AND X, BYTE PTR Y ENDM ANDTW MACRO X,Y AND WORD PTR X,Y ENDM ANDFW MACRO X,Y AND X, WORD PTR Y ENDM ORTB MACRO X,Y OR BYTE PTR X,Y ENDM ORFB MACRO X,Y OR X, BYTE PTR Y ENDM ORTW MACRO X,Y OR WORD PTR X,Y ENDM ORFW MACRO X,Y OR X, WORD PTR Y ENDM XORTB MACRO X,Y XOR BYTE PTR X,Y ENDM XORFB MACRO X,Y XOR X, BYTE PTR Y ENDM XORTW MACRO X,Y XOR WORD PTR X,Y ENDM XORFW MACRO X,Y XOR X, WORD PTR Y ENDM SARB MACRO X,Y SAR BYTE PTR X,Y ENDM SARW MACRO X,Y SAR WORD PTR X,Y ENDM RCRB MACRO X,Y RCR BYTE PTR X,Y ENDM RCRW MACRO X,Y RCR WORD PTR X,Y ENDM RCLB MACRO X,Y RCL BYTE PTR X,Y ENDM RCLW MACRO X,Y RCL WORD PTR X,Y ENDM RORB MACRO X,Y ROR BYTE PTR X,Y ENDM RORW MACRO X,Y ROR WORD PTR X,Y ENDM ROLB MACRO X,Y ROL BYTE PTR X,Y ENDM ROLW MACRO X,Y ROL WORD PTR X,Y ENDM SHRB MACRO X,Y SHR BYTE PTR X,Y ENDM SHRW MACRO X,Y SHR WORD PTR X,Y ENDM SHLB MACRO X,Y SHL BYTE PTR X,Y ENDM SHLW MACRO X,Y SHL WORD PTR X,Y ENDM MULB MACRO X MUL BYTE PTR X ENDM MULW MACRO X MUL WORD PTR X ENDM IMULB MACRO X IMUL BYTE PTR X ENDM IMULW MACRO X IMUL WORD PTR X ENDM DIVB MACRO X DIV BYTE PTR X ENDM DIVW MACRO X DIV WORD PTR X ENDM INCB MACRO X INC BYTE PTR X ENDM INCW MACRO X INC WORD PTR X ENDM DECB MACRO X DEC BYTE PTR X ENDM DECW MACRO X DEC WORD PTR X ENDM NOTB MACRO X NOT BYTE PTR X ENDM NOTW MACRO X NOT WORD PTR X ENDM NEGB MACRO X NEG BYTE PTR X ENDM NEGW MACRO X NEG WORD PTR X ENDM MSAR MACRO A,N REPT N SAR A,1 ENDM ENDM MSHL MACRO A,N REPT N SHL A,1 ENDM ENDM MSHR MACRO A,N REPT N SHR A,1 ENDM ENDM MRCL MACRO A,N REPT N RCL A,1 ENDM ENDM MRCR MACRO A,N REPT N RCR A,1 ENDM ENDM MROL MACRO A,N REPT N ROL A,1 ENDM ENDM MROR MACRO A,N REPT N ROR A,1 ENDM ENDM POPMOV MACRO A,Y PUSH Y POP A ENDM POPSWAP MACRO X,Y PUSH X PUSH Y POP X POP Y ENDM DWSAVE MACRO A,L,H MOV WORD PTR A,L MOV WORD PTR A+2,H ENDM DWLOAD MACRO A,L,H MOV L, WORD PTR A MOV H, WORD PTR A+2 ENDM CLEAR MACRO A XOR A,A ENDM DOSPRINT MACRO A IFNB MOV DX,OFFSET A ENDIF MOV AH,09 INT DOS ENDM DOSEXIT MACRO A IFNB MOV AX,04C00H + A ELSE MOV AX,04C00H ENDIF INT DOS ENDM FMOVS MACRO LOCAL WASEVN SHR CX,1 REP MOVSW JNC WASEVN MOVSB WASEVN = $ ENDM TOPARA MACRO X REPT 16 IF ($ - X) MOD 16 EQ 0 EXITM ENDIF DB 00 ENDM ENDM DBW MACRO X,Y DB X DW Y ENDM DWB MACRO X,Y DW X DB Y ENDM TOBIN.BAS Conversion utility ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' The following program converts the data file created by the above ML ' program into a raw binary image. DEFINT A-Z ' list of file names to convert ' Structure = Source Name, Destination Name DATA "name1.hex" ,"name1.BIN" ' example source and destination names DATA "name2.hex" ,"name2.BIN" DATA "end","end" ' signify end of table. DO READ in$, out$ ' read names IF in$ = "end" THEN EXIT DO ' if have "end" then end program GOSUB convert ' else go convert file LOOP END convert: OPEN "i", #1, in$ ' open input file OPEN "b", #2, out$ ' open output fle FLAG = 0 ' clear flag DO INPUT #1, A$ ' get string to convert A$ = LTRIM$(RTRIM$(A$)) ' no spaces from start and end IF A$ <> "" THEN ' ignore if empty ' FFFF generally means start/end of ROM. IF RIGHT$(A$, 39) <> "FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" THEN IF FLAG = 0 THEN ' if start not found yet say found PRINT "CART APPEARS TO START AT "; LEFT$(A$, 7) FLAG = 1 ' remember start found END IF l = 8 ' move to first numeric field FOR A = 1 TO 8 ' for all entries b$ = "&H" + MID$(A$, l + 2, 2) + MID$(A$, l, 2) c = VAL(b$) ' PRINT b$, HEX$(c) PUT #2, , c ' write word to file l = l + 5 ' move to next numeric field NEXT ' do for all 8 words ELSE IF FLAG = 1 THEN EXIT DO ' end if found ffff and had start END IF END IF LOOP WHILE NOT (EOF(1)) ' loop for all lines in file IF A$ = "" THEN PRINT "CAUTION - END OF CART NOT DETECTED" ELSE PRINT "CART APPEARS TO END AT "; LEFT$(A$, 5); "-1" PRINT "" END IF CLOSE ' close files and return RETURN STRIP FOR MULTI BLOCK CARTS ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' The following program converts multi-block cart images as created by the ' above BASIC program into a raw binary image suitable for loading ' into the Intellivision emulator. ' ' The config ".CFG" file generated by this program contains the address ' mapping information needed by the intellivision emulator, although ' in a form not immediately usable by the emulator. ' DEFLNG A-Z CLS start = &H5000 '<< default cart start address. ' must be changed to reflect the cart starting address. ' Most split carts start at this address = &H5000 addr = 0 word% = 0 OPEN "b", #1, "a.bin" ' Source file (binary) OPEN "b", #2, "a.bin" ' Destination file (binary) OPEN "o", #3, "a.cfg" ' New config file name flag% = 1 ' flag block end has been found DO GET #1, , word% ' Get word from binary image IF word% = -1 THEN ' if ffff then possible unused block IF flag% = 0 THEN ' if previous was unused then PRINT #3, "end", HEX$(addr - 1) ' print end of block to config file END IF flag% = 1 ' flag end of block found ELSE PUT #2, , word% ' output word to file IF flag% = 1 THEN ' if last byte was end of block PRINT #3, "start", HEX$(addr), HEX$(start) ' say start of block END IF flag% = 0 ' signify in block addr = addr + 1 ' move to next address END IF start = start + 1 ' bump code origin address LOOP WHILE NOT (EOF(1)) ' loop for all data PRINT #3, "end", HEX$(addr - 1) ' print adderess of end of file CLOSE ' close all files and end END Background Info ³ PC parallel port ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ From ASM-101 PC programmers reference ³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ 25 pin Parallel port (female): 36 pin Parallel Centronics (male): Pin 13 1 Pin 1 18 _____________________________ ___________________________________________ \ . . . . . . . . . . . . . / \                   / \ . . . . . . . . . . . . / \                   / \_______________________/ \_____________________________________/ Pin 25 14 Pin 19 36 pins 19-30 and 33 are twisted pair grounds. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Parallel Port pin assignments ³ ³ Centronics Connector is standard but PC's usually ³ ³ use a female DB25. Amiga's use a male DB25 ³ ³ ** device may ignore MSB ³ ÃÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³Pin # ³ ³ ³Pin # ³ ³ ³ ³DB 25 ³ Dir ³ Signal Name ³Cent ³ Dir ³ Signal Name ³ ÃÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄij ³ 1 ³ O ³ -Strobe (STB) ³ 1 ³ I ³ -Strobe (STB) ³ ³ 2 ³ I/O ³ Data Bit 0 ³ 2 ³ I ³ Data Bit 0 ³ ³ 3 ³ I/O ³ Data Bit 1 ³ 3 ³ I ³ Data Bit 1 ³ ³ 4 ³ I/O ³ Data Bit 2 ³ 4 ³ I ³ Data Bit 2 ³ ³ 5 ³ I/O ³ Data Bit 3 ³ 5 ³ I ³ Data Bit 3 ³ ³ 6 ³ I/O ³ Data Bit 4 ³ 6 ³ I ³ Data Bit 4 ³ ³ 7 ³ I/O ³ Data Bit 5 ³ 7 ³ I ³ Data Bit 5 ³ ³ 8 ³ I/O ³ Data Bit 6 ³ 8 ³ I ³ Data Bit 6 ³ ³ 9 ³ I/O ³ Data Bit 7 ³ 9 ³ I ³ Data Bit 7 ** ³ ³ 10 ³ I ³ -Acknowledge (ACK) ³ 10 ³ O ³ -Acknowledge (ACK) ³ ³ 11 ³ I ³ BUSY ³ 11 ³ O ³ BUSY ³ ³ 12 ³ I ³ Paper End (PE) ³ 12 ³ O ³ Paper End (PE) ³ ³ 13 ³ I ³ Selected (SLCT) ³ 13 ³ O ³ Selected (SLCT) ³ ³ 14 ³ O ³ Automate Feed (AUTO FD) ³ 14 ³ I ³ -Auto Feed (AUTO FD) ³ ³ 15 ³ I ³ -Error (FAULT) ³ 15* ³ N/A ³ N/C Not defined ³ ³ 16 ³ O ³ -Initialize (IP) ³ 16 ³ N/A ³ Signal Ground (SG) ³ ³ 17 ³ O ³ -Select In (SLCT IN) ³ 17 ³ N/A ³ Chassis Ground (CG) ³ ³18-25 ³ N/A ³ Grounds ³ 18 ³ N/A ³ +5 Volts or NC ³ ³ ³ ³ ³19-30 ³ N/A ³ Grounds ³ ³ ³ ³ ³ 31 ³ I ³ -Initialize (IP) ³ ³ ³ ³ ³ 32 ³ O ³ -ERROR (FAULT) ³ ³ ³ ³ ³ 33 ³ N/A ³ Signal Ground (SG) ³ ³ ³ ³ ³ 34* ³ N/A ³ N/C Not Defined ³ ³ ³ ³ ³ 35 ³ N/A ³ +5 Volts through 4.7 Ohms³ ³ ³ ³ ³ 36 ³ I ³ Select (Slct) ³ ÀÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Parallel Port register set overview ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Address ³ ³ ³ ³ ³ ³ Offset ³ R/W ³ Port ³ Bits ³ Function ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ 0 ³ W ³ Data Out ³ 0-7 ³ All LS TTL outputs ³ ³ 2 ³ W ³ Control Out ³ 0-3 ³ All TTL Open Collector outputs ³ ³ 2 ³ W ³ Control Out ³ 4 ³ IRQ enable ³ ³ 2 ³ W ³ Control Out ³ 5 ³ Tristate data (PS/2 for input) ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ 0 ³ R ³ Data Feedback ³ 0-7 ³ Matches Data Out (or input) ³ ³ 1 ³ R ³ Status In ³ 3-7 ³ 5 LS TTL inputs ³ ³ 2 ³ R ³ Control Feedback ³ 0-3 ³ Matches Control Out ³ ³ 2 ³ R ³ Control Feedback ³ 4 ³ IRQ enable status ³ ÀÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Parallel Port register set detail ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ 0278H, 0378H, 03BCH R/W Parallel port data output latch ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ Pin 2 The data written to this latch ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄ Pin 3 will appear as output on the ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ Pin 4 parallel port data lines. ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄ Pin 5 ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄ Pin 6 ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄ Pin 7 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Pin 8 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Pin 9 Electrically this port consists of an inverting Octal latch (74LS374), (74ACT374) tied directly to pins 2-9 of the DB25. Any data written to this port is latched and provides a constant output to the printer. These output lines are also tied to a 74LS244 input latch (non inverted), so that they can be made available to the CPU. The input latch was intended to allow software to perform a diagnostic check on the integrity of the data path to the printer, but can be exploited for bi-directional communication. If at any time, the content of the input latch does not match the data written to the output latch, an error exists in the data path. Some printer ports can tristate their output buffer (74LS374 or equivalent). When this is done, the input latch can be used as a legitimate input port. Reading from the parallel port returns data present on the parallel port address lines. In the original series of PC parallel ports Data output latch is comprised of a 74LS374 octal latch. This chip could could source a maximum of 2.6 mA and sink a maximum of 24 mA. Noise is reduced by connecting each data output line to ground through a 0.0022uF capacitor. 0279H, 0379H, 03BDH Printer status register ÚÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄ¿ ³7³6³5³4³3³2³1³0³ ÀÂÁÂÁÂÁÂÁÂÁÂÁÂÁÂÙ ³ ³ ³ ³ ³ ³ ÀÂÙ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ 0 = Reserved ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄ 0 = IRQ has occurred ³ ³ ³ ³ ³ 1 = IRQ has not occurred ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄ 1 = -ERROR - pin 15 O ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄ 1 = +Auto Auto line feed - pin 14 >O ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄ 0 = -Init Printer Reset - pin 16 >O ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 1 = +Select In Selects the printer - pin 17 >O ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 0 = +IRQ IRQ disable ³ ³ ³ 1 = IRQ enable for ACK ³ ³ ³ LPT1 should map to IRQ 7 (INT 0FH) ³ ³ ³ LPT2 should map to IRQ 5 (INT 0DH) ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 0 = Direction is port write ÄÂÄ OS/2 ?? ³ ³ 1 = Direction is port read ÄÙ ³ ³ Note: The state of bit may be "locked" ³ ³ on some I/O chipsets. (NS Super I/O ?) ÀÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Not used