============================================================================ TI Hardware Manual. This document started life as a compendium of information on different memory acess methods for memory cards on the TI-99/4a home computer. Different pieces of good technical messages and articles have been sewn together that were sitting around on my hard drive. My hope is that this information will be of use to other remaining TI Hobbyist. This compendium of information is copyrighted material of Dan Eicher, and my not be edited, changed or redistributed. All articles and message, individually remain the exclusive property of their authors. As time permits I will add more information to this document. If you have anything you wouldn't mind contributing, I will be pleased to add it. If you find information that is in error, please send me an update and that will also be added. If you have comments like, gee... can you add this that or the other, or I would have done it this way ect... Please send all of these comments to NoOneCares@Null.Com. Thanks to the following TI Enthusist for their contributions: Paolo Bagnaresi Jerry Coffey Bruce Harrison Beery Miller Jim Ness David Nieters Thierry Nouspikel Don O'Neil David Ormand Jeff H. White Dan H. Eicher Eicher@Delphi.Com www.delphi.com/people/eicher L.D.O.M. 12.29.96 ========================================================================== INDEX Myarc 512K Memory Card. From Myarc Documentation....................................DTIHM001 Foundation 128K Memory Card. From Foundation Documentation...............................DTIHM002 Rambo. Excerpt from the Horizon Manual.............................DTIHM003 AMS Memory Expansion Card. by Bruce Harrison...........................................DTIHM004 Corcomp Memory Expansion Card. by Jeff White...............................................DTIHM005 Western Horizon Technology AT Keyboard Interface. by Don O'Neil...............................................DTIHM006 by David Nieters............................................DTIHM007 MBP - Clock A/D&D/A. by Dan H. Eicher............................................DTIHM008 Super Space. from Information found in Micropendium......................DTIHM009 Super Space II Cartridge. from Original Documentation - Thanks to David Ormand........DTIHM010 Internals of the DEC command. by Jeff White...............................................DTIHM011 99/4a clock speeds and assembly timing. by Jeff White...............................................DTIHM012 The TMS9985. by Dan Eicher...............................................DTIHM013 The TMS99105A. by Dan Eicher...............................................DTIHM014 Bugs in the console interupt routine. by Jeff White...............................................DTIHM015 Setting up user interupt routines. by Jeff White...............................................DTIHM016 Interupts by Jim Ness.................................................DTIHM017 RS232 Circular Interupt Buffer. by Texas Instruments........................................DTIHM018 Corcomp RS232 & PIO internals. by Jeff White...............................................DTIHM019 Bringing your Myarc RS232 into the 90's by Jeff White and Dan Eicher................................DTIHM020 A definition of skew. by Jeff White...............................................DTIHM021 3.5" Drives and the Geneve. by Jeff White...............................................DTIHM022 Disk Controllers -- an Addendum March, 1987 by Jerry Coffey.............................................DTIHM023 A Hard Drive Odessey (Oddity) By Dan H. Eicher and Jeffrey H. White.......................DTIHM024 The 9224: A failed experiment or an educational experience? by Dan H. Eicher and Jeffrey H. White.......................DTIHM025 Fixing Blown Bit Maps on the HFDC by Edward Hallett...........................................DTIHM026 VDPID & CPUID by Jeff White...............................................DTIHM027 An Explination of Bit Map Mode by Jeff White...............................................DTIHM028 Graphics 4 Mode Tutorial by David Nieters............................................DTIHM029 In search of.... Leading Edge Connectors. by Dan H. Eicher............................................DTIHM030 Modify the Rave Speech Card and MBP Card for use with the Geneve. by Beery Miller.............................................DTIHM031 Pin definition for the new Rave expansion box. re-typed by Dan Eicher......................................DTIHM032 TI-99/4 - THE EARLY DAYS by Herbert H. Taylor.......................................DTIHM033 9900,9901,9902,9904 by Definitions by Dan Eicher...............................................DTIHM034 Console Connectors by Thierry Norspikel........................................DTIHM035 How to adapt Atari joystick to work on the TI. Author Unknown..............................................DTIHM036 Grand Ram Technical Manual by DataBioTics & SofMachine Inc.............................DTIHM037 Myarc FDC Technical Information/Manual by Paolo Bagnaresi..........................................DTIHM038 DX-10 OPCODES AND MNEMONICS by Texas Instruments Inc....................................DTIHM039 ============================================================================= DTIHM001 Accessing Extra Memory on the Myarc Memory Expansion Card. From the Myarc Memory Expansion Manual.... To access the additional 96K or RAM (in addition to the standard 32K) with assembly language, the following is a useful discussion on its operation. The 128K RAM is divided into 4 banks of 32K each. When enabled, each bank occupies memory locations >2000->3FFF and >A000-FFFF. The mechanism to select a particular memory bank is determined by CRU bits >1002 and >1004. When these bits are zero, the normal 32K memory expansion is enabled. The other 3 banks are selected by setting the proper combination of bits. The following examples show how to select each of the four memory banks from assembly language excuting from "PAD" RAM: Select Bank 2 Select Bank 4 LI R12,>1000 LI R12,>1000 SBO 1 SBO 1 SBZ 2 SBO 2 Select Bank 3 Select "Standard 32K Ram" LI R12,>1000 LI R12,>1000 SBZ 1 SBZ 1 SBO 2 SBZ 2 Note: 512K card uses the additional CRU bits >1006 and >1008 to access the additional banks. LI R12,>1000 SBZ 1 \ SBZ 2 \ This would select the Standard 32K Ram Memory. SBZ 3 / SBZ 4 / Note: These cards respond at >1000 + >1900! A simpler way to page the Myarc memory cards is with LDCR instructions. Here are a few examples: BANK1 BYTE 0 BANK2 BYTE 1 BANK3 BYTE 2 BANK4 BYTE 3 BANK5 BYTE 4 ... (assign byte values 5 thru 12 to BANK6 thru BANK13) BANK14 BYTE 13 BANK15 BYTE 14 BANK16 BYTE 15 Select Bank 1 Select Bank 13 Page through banks LI R12,>1000 LI R12,>1000 LI R12,>1000 LDCR @BANK1,4 MOVB @BANK13,R1 LI R1,BANK1 LDCR R1,4 LI R2,16 NB LDCR *R1+,4 Page backward all banks DEC R2 LI R12,>1000 JNE NB LI R1,BANK15 PB LDCR R1,4 JEQ FI DEC R1 JMP PB FI ... (next instruction) ============================================================================= DTIHM002 Foundation 128K Card The Myarc Memory Expansion card is almost identical to the Foundation card, the only real difference is the CRU address for banking. These two cards are so close that Travis Watford produced an article on how you could upgrade a Foundation 128K Card to 512K and make it so that it could accept a Myarc 512K DSR eprom. It should be noted, orginally the Foundation came with NO DSR eprom and was strictly usable as memory expansion. CRU ADDRESS Select Bank 2 Select Bank 4 LI R12,>1E00 LI R12,>1E00 SBO 1 SBO 1 SBZ 2 SBO 2 Select Bank 3 Select "Standard 32K Ram" LI R12,>1E00 LI R12,>1E00 SBZ 1 SBZ 1 SBO 2 SBZ 2 ============================================================================== DTIHM003 From the Rambo/Horizon User Operating Manual Rambo This section of the manual will try to explain the memory managment sub-program called >B0 and how to interface with it using assembly code. This low-level sub-program will only work on Horizon cards with the RAMBO hardware installed. If you need more help on using the sub-program see section 5.6 of this manual. The orginal Horizon hardware only allowed the Horizon memory to be accessed in 2K blocks at the DSR space from >5800 thru >5fff. The rest of the DSR space from >4000 thru >57ff was reserved for the Horizon ROS. This limited access to the memory on the Horizon card was fine for uses like a ramdisk, but to write a program which really executed from and used the Horizon memory was almost impossible. There needed to be a new way of accessing the Horizon memory, but without losing the wonderful and powerful ramdisk features and functions. With this in mine, we decided to design a simple upgrade kit for all Horizon cards which would allow the upgraded Horizon to work the same in the original Horizon mode; but when accessed thru a new mode it would switch to a whole new paging system which would be better designed for writing large programs, etc. The ROS would also have to be upgraded to support the new mode by adding a super memory management sub-program to ease in the writing of large programs as well as allowing both ramdisk files and program space to share the same memory. Finally, with the RAMBO hardware and the SERIES 8 software, it was now possible to write large programs or programs which used the RAMBO program space for DATA storage very easily. The SERIES 8 software added a sub-program called >B0 to handle the complex memory management needed to make sure all programs run perfectly without destroying any files or other programs which may be sharing the memory on-board the Horizon card. All the values for the sub-program >B0 are transfered thru CPU PAD addresses, which will be explained later on. Access to the sub-program >B0 is similar to the normal DSRLNK type >8 which is for DSR devices like "DSK1.", and "RS232."; except the DSR only needs a 2 byte VDP PAB of >01B0, the first byte being the length, and the second byte being the sub-program name >B0. The following section is divided into five different parts, the first two explaining the CRU interface bits, and the last three explaining the three different ways to access the sub-program >B0. ORIGINAL HORIZON CRU INTERFACE ACCESS: The orginal Horizon interface has a CRU address range from >1000 thru >1700, and the 8 or 16 CRU bits are defined as follows: CRU BITS | Definition fo the CRU interface bits (15=MSBit / 0=LSBit) ----------------------------------------------------------------------- 0 = 6K >4000 OFF/ON (0=ROS OFF, 1=ROS ON) Ised by ROS and DSRLNK 1 thru 7 = 2K >5800 Page number 0 thru 127. (Max. of 256K for 8K*8 cards). 8 thru 9 = Select one of four banks of 256K of memory. (Max. of 1024 for 32K*8 cards). 10 thru 11 = Select one of four banks of 1024 of memory. (Max. of 4096K for 128K*8 cards). 12 thru 14 = Undefined, may be used on a future series of Horizon cards. 15 = Reset to 0: Used to change to RAMBO mode, on original Horizons it was undefined. RAMBO CRU INTERFACE ACCESS: A Horizon card with RAMBO installed can work the same as an original Horizon as detailed above or when bit 15 or the CRU interface is set to 1, it can be accessed as follows: CRU BITS | Definition fo the CRU interface bits (15=MSBit / 0=LSBit) ----------------------------------------------------------------------- 0 = 6K >4000 OFF/ON (0=ROS OFF, 1=ROS ON) Ised by ROS and DSRLNK 1 thru 2 = Not used when in RAMBO mode, recommended both be reset to 0. 3 thru 7 = 8K >6000 Page number 0 thru 31. (Max. of 256K for 8K*8 cards). 8 thru 9 = Select one of four banks of 256K of memory. (Max. of 1024K for 32K*8 cards). 10 thru 11 = Select one of four banks of 1024K of memory. (Max. of 4096K for 128K*8 cards). 12 thru 14 = Undefined, may be used on a future series of Horizon cards. 15 = Set to 1: Used to change to original Horizon mode. ACCESS MODE #1 FOR SUB-PROGRAMS >B0 (Gets Max. number of free 8K pages): >834A IN Must be cleared before access to get true number of free pages. OUT Max. number of free 8K pages for all RAMBO's in the TI system. >834C IN >0000 = Gets the Max. number of free 8K pages in the system. OUT Not changed, will be the same value as IN. >8350 IN Not used for input to the sub-program >B0. OUT >0000 if no errors, or >FFFF if errors where detected. Accessing >B0 with >834A and > 834C cleared will, upon exit, return to the program in >834A the max. number of free 8K pages for all RAMBO's in the system. This access causes all cards to be switched to orginal Horizon mode, and being so can't be accessed from within the >6000 thru >7FFF space. The following is an assembly example which is accessed like: BL @GETMAX REF VMBW,DSRLNK Normal VMBW and DSRLNK E/A BLWP's. GETMAX CLR @>834A Clear Max. number of pages. CLR @>834C Ask for max. number of free 8K pages. LI R0,VDPPAB Address of the PAB in VDP memory. LI R1,CALLBO Address of the PAB in CPU memory. LI R2,2 Length of the PAB to be written to VDP memory. BLWP @VMBW Write the PAB (>01B0) to VDP memory. MOV R0,@>8356 Make >8356 point to the length byte of the PAB in VDP ram. BLWP @DSRLNK Execute the sub-program >B0. DATA >A MOV @>8350,R0 Check for errors. EQUAL BIT IS SET IF NO ERR! RT Return to program. CALLBO DATA >01B0 PAB data for sub-program >B0. ACCESS MODE #2 FOR SUB-PROGRAM >B0 (Selects an 8K page and turns on RAMBO): >834A IN Not used for input to the sub-program >B0. OUT CRU address of the RAMBO/HORIZON card that is currently on. >834C IN A page number from 1 to max. number of free 8K pages. OUT The 16 bit CRU value used to select the page and turn RAMBO on. >8350 IN Not used for input to the sub-program >B0. OUT >0000 if no errors, or >FFFF if errors where detected. Accessing >B0 with >834C containing the number of the page you want will turn on the correct RAMBO/HORIZON card and then select the page you specified, and upon exit will return the CRU address and CRU value used to select the page in >834A and >834C. This command also overrides any cartridge which may be plugged into the module port, and will also turn off the P-Gram card if it was on. This function makes sure no other device is responding at the same >6000 space of memory. The following is an assembly example which is accessed like: BL @SETPAG with the next line containing a line of DATA with the number of the page you want. REF VMBW,DSKLNK Normal VMBW and DSRLNK E/A BLWP's SETPAG MOV *R11+,@>834C Get number of the page to select. LI R0,VDPPAB Address of the PAB in VDP memory. LI R1,CALLBO Address of the PAB in CPU memory. LI R2,2 Length of the PAB to be written to VDP memory. BLWP @VMBW Write the PAB (>01B0) to VDP memory. MOV R0,@>8356 Make >8356 point to the length byte of the PAB in VDP. BLWP @DSRLNK Execute the sub-program >B0. DATA >A MOV @>8350,R0 Check for errors. EQUAL BIT IS SET IF NO ERR! RT CALLBO DATA >01B0 PAB data for sub-program >B0. ACCESS MODE #3 FOR SUB-PROGRAM >B0 (Turns off all RAMBO/HORIZON cards): >834A IN Not used for input to the sub-program >B0. OUT Not changed will be the same value as IN. >834C IN >FFFF = Tell all cards to switch back to original Horizon mode. OUT Not changed, will be the same value as IN. >8350 IN Not used for input to the sub-program >B0. OUT >0000 if no errors, or >FFFF if errors where detected. Accessing >B0 with >834C containing >FFFF will tell all the Horizon cards in your computer system to switch back to original Horizon mode. This call, since it will remove any page at >6000, can't be accessed from the >6000 space. If for some reason a RAMBO program doesn't switch all the cards back to original Horizon mode, the ROS will do a complete reset any time the TI Title Screen appears. The previous assembly examples should be enough to firure out how to use this mode of sub-program >B0. ============================================================================== DTIHM004 The AMS Memory Expansion Card. AN ADVENTURE WITH AMS FROM TWO VIEWPOINTS By Bruce Harrison & Lew King People are buying the Advanced Memory System (AMS) now that it's being produced and sold by the SW99ers of Tucson, AZ. One of those customers is Lew King, from Industry PA, who's co-authoring this article. His perspective as an owner will follow, but for the moment it's the viewpoint of an experienced Assembly programmer. There are two potential kinds of applications for the AMS memory card. One is the creation of massive programs, in which the code to operate the program needs more than 32K of RAM. That's not the forte of this particular Assembly programmer. The second kind of application is one in which the program itself occupies only part of the 32K memory, but the program needs large blocks of memory to handle data. For example, you might have a word processor like Funnelweb where the text buffer could be expanded to perhaps 16 times what Funnelweb could normally handle. Now that's the kind of application that gets Bruce Harrison's attention. At the M.U.G. in Cleveland, Lew King bought his AMS card, with 256K capacity. When I asked what he'd do with all that memory, he quickly came up with an idea for me to pursue. Some time back, I produced my Video Titler program, which uses Bit Map images. Just one such image (for example a TI-Artist picture with color included) occupies 12K bytes of memory. Two such images completely fill the high portion of the 32K memory. Thus in the original Video Titler, the program code and internal data had to fit entirely in low memory, starting at >2678, so that all of high memory from >A000 thru >FFFF could be used to store two complete bit-map color pictures. That meant that after just one "wipe" transition, the user would have to pause the VCR, load the next frame from disk, then proceed to the next transition. That works, but it's labor intensive and slow work for the user. Lew immediately saw the possibility for pre-loading many frames into the AMS, so that pauses for re-load from disk would be minimized. Having this idea to work with was of course just the start. To make a working program, we had to have some definitive words on how to take advantage of the AMS in terms of Assembly Source. Nobody at the Cleveland gathering had that kind of information at his fingertips. There is no published source (until now) for that kind of information. After a couple of unsuccessful attempts to get the needed information, I asked Lew to print out and send me the "docs" that were delivered on disk with his AMS card. Lew complied, and within two days I had printed docs plus several disks. As it turned out, it was fortunate indeed that Lew included those disks, because one of them contained a source file called AMSINI. That sounded like it could be important, and it was. AMSINI contained the key source code segments to make use of the card. There was still a problem, however, in that some of the material in the printed docs contradicted parts of the AMSINI source file. After working through a chain of informants, I got in touch with Rich Gilbertson, who was making a version of his RXB product for the AMS card. Rich filled in the gaps, telling me that the printed docs were wrong and the AMSINI file correct. He pointed out all the non-obvious things, like the fact that in its power-up condition certain pages of the AMS are pre-assigned to the low and high portions of 32K memory. Pages 2 and 3 are the low memory, and pages 10 (>A) through 15 (>F) are assigned as the high memory. In other words, if your program loads in low memory, it will reside in pages 2 and 3 of the AMS, and if it writes to or reads from high memory, that will go into and come from pages >A through >F of the AMS. (One page is 4K of memory. Pages >A through >F will hold 24K bytes.) Among other things, this means that pages 0 and 1 and the group of pages from 4 through 9 are unused in the power-up configuration. Pages beyond 16 (>10) are also unfilled on power-up. Some programmers (including Rich Gilbertson) prefer to leave pages below 16 (>10) unused, reserving them for future use with an alternate operating system. Being an old curmudgeon who doesn't believe any such operating system will ever emerge, I decided that pages below 16 would not be left alone by my Video Titler program. But first, since AMS cards come in various configurations, with capacities of 128K, 256K, and even 512K, I had to have a way for my program to measure the amount of memory that was present, and adapt its operation accordingly. Fortunately, that AMSINI file on the disk contained just such a program segment. I adapted that slightly, so it would measure page by page starting at 16 and going to whatever was the highest page available. Since pictures occupy three pages each, I divide the number found by three to find the number of "frames" that can be stored in the memory above page 15. In the Video Titler case, we can use pages 10 thru 15 to store two more frames, since the entire program remains in low memory, pages 2 and 3. Now let's suppose we've got a card with only 128K memory. There will be only 16 pages above 15, and using them in groups of 3 will mean only 5 frames there. Adding the two frames in pages 10 thru 15 means seven frames can be stored. If we use that unused space from page 4 thru 9, two more frames can be stowed, for a total of nine. Thus in the program we take the number of pages beyond 15, divide that by three (ignoring any remainder) and add 4 to come up with the total number of frames we can keep in memory. For Lew King's card, with 256K capacity, there are 48 pages past 15, so a total of 20 frames can be stored. For 512K capacity, a whopping 41 frames could be put into memory. In the sidebar for this article are a couple of "snippets" of source code that may be helpful to anyone trying to make use of the AMS card for data-intensive applications. First in that is a "complete program" section called AMST. This was the first thing I sent to Lew King for testing. This little program, if run on my own machine, which has no AMS card, will simply report that fact. On Lew's machine, it reports 48 Pages and 20 Frames as the capacity of his AMS card. This source can be modified easily to report in different ways. For example, you could take the number of pages above 15, add 12 for the pages from 4 thru 15, then multiply by 4 to indicate available capacity in KiloBytes. ACCESS and MAPPING To use other than the default setup, you have to do two things. First, you have to "turn on" the card's memory in the >4000 block and write to the mapping registers there. Second, you have to "turn on" the mapper function to make what you've written into the >4000 block take effect. The first step in all this is to set Register 12 to the value >1E00, which is the CRU address of the AMS card. Now doing a SBO 0 instruction will enable the >4000 memory block for reading and writing. In that block, each word starting with >4000 and ending with >401E acts to control what page maps into what memory location. The subroutine AMSINI (see sidebar) initializes all the mapping registers to power-up condition. Thus, for example, >4004 is set for page 2, >4006 to page 3, etc. In our own program, we're mapping things into the >A000 through >F000 blocks. Thus the registers we write to in >4000 are at >4014 thru >401E. To make a mapping selection, we write the desired page number to the high order byte of the control register. Let's take a concrete example. Suppose we want pages 4, 5 and 6 of the AMS to behave as if they were at >A000, >B000, and >C000. It's this easy: LI R12,>1E00 CRU ADDRESS SBO 0 TURN ON CARD'S >4000 BLOCK LI R1,>0400 PAGE NUMBER IN LEFT BYTE LI R3,>4014 MAPPING REGISTER FOR >A000 BLOCK MOV R1,*R3+ WRITE TO >4014 AND ADD 2 TO R3 AI R1,>100 LEFT BYTE OF R1=5 MOV R1,*R3+ WRITE 5 TO >4016 AND ADD 2 TO R3 AI R1,>100 LEFT BYTE OF R1=6 MOV R1,*R3 WRITE 6 TO LEFT BYTE AT >4018 This sets the registers, but does not actually start the mapper working. To put the mapping in effect, we have to perform one more operation: SBO 1 TURN ON THE MAPPER Now that the mapper is turned on, anything written to >A000 thru >CFFF will actually be written into pages 4 thru 6 of the AMS memory instead of into pages >A thru >C. Similarly, any memory reading from >A000 thru >CFFF will actually read the contents of pages 4 thru 6 of the AMS memory. Thus your program can write and read as if to >A000 thru >CFFF, but the mapper will make things actually access the pages 4 thru 6 in the AMS card. You can turn off access to the card's >4000 block and still leave the mapper in effect by the instruction SBZ 0. (Provided R12 still contains >1E00.) You can turn off the mapper by SBZ 1, and then the areas >A000 thru >CFFF will revert to "normal", reading and writing to pages >A thru >C of the AMS card. In the finished AMS version of Video Titler, the program works by frames, where each frame accounts for three pages of the AMS memory. We use an odd-even scheme, so that odd numbered frames (1,3,5,...19) go into pages mapped to >A000 thru >CFFF, and even numbered ones go into pages mapped to >D000 thru >FFFF. This way the program always has immediate access to two frames at any given time. Let's say for example that the user asks to load a TI-Artist picture (with color) into Frame 1. We take the desired frame number, multiply that by three, add one, then put that in the left byte of a workspace register. Since this is an odd frame, we use the mapping registers at >4014 thru >4018, and put 4, 5, and 6 into the left bytes of those mapping registers, respectively. (For an even page, we'd use >401A thru >401E.) Now when the program reads the file, it dumps the contents of the pattern and color parts into >A000 thru >CFFF, which really goes into pages 4 thru 6 of the AMS memory. In similar fashion, frame 2 goes into pages 7 thru 9, frame 3 into pages 10 thru 12, frame 4 goes to pages 13 thru 15, and so on until frame 20, which goes into pages 61 thru 63. Clear as mud? Look at Part Two of the Sidebar, which may help. Meanwhile, how about a little different perspective? The AMS Owner's Viewpoint The Super AMS card is a most welcome and needed addition to the TI 99/4A. The physical aspects are a well-made, high-quality card which inserts in place of the 32K card. In normal use, it duplicates the 32K card exactly, except for the absence of an indicator light. In expanded mode, the card provides from 128K to 1 meg of paged memory, depending on the chips installed. There are three disks of software provided with the card, of which two are archived. Included is an excellent memory tester that writes and reads to every bit. This assures the user that everything is functioning properly. Also included is an excellent disk copy program, AMS Copy. The program reads an entire 720 sector disk into memory, then writes to the copy disk in one pass. Contents of the master disk remain in memory, allowing as many copies to be made as needed without re-reading. Also there were two games, which I could not get to run. The remainder of the software is mainly for programmers and of little consequence for the end user. So, aside from testing the memory and copying disks, what can be done with the Super AMS card? Well, prior to the middle of July, the answer was "not too much." Enter Bruce Harrison. When I first purchased the Super AMS card back in May at Cleveland, Bruce rather poo-pooed it, saying that he could write any program for the TI and keep it well within the 32K space. No argument here. Then I posed the hypothetical question....how many titles could the Video Titler program hold in 256K of memory? To which Bruce answered, "I'll think about it." Well, Bruce did a lot of thinking and a lot of programming. The result.... the Video Titler can now hold up to twenty color graphic files in memory on a 256K card. Super. They are instantly available using any of the many different wipes in the program. If you make a mistake, or change your mind, any frame can be reloaded without changing the others. The sequence can also be started at any frame. Anyone who has previously used the Video Titler will most certainly appreciate the new features, added versatility, speed, and power of the new AMS Video Titler. The entire operation of paging twenty titles into memory, then using them is totally seamless and transparent to the user. It is as though the TMS9900 had twenty address lines. Substantial documentation is included with the program, but I dare say that most folks won't read them. Aside from possibly looking up which keys to use for what wipes, the Titler is that easy to use. When you are ready to quit, the Titler returns nicely to the E/A menu screen. It's rather ironic.... To the best of my knowledge, Bruce Harrison is the first programmer outside of the SAMS development team to make any real productive software for the Super AMS card. Yet, he is the one programmer that never received a card to use. The AMS Video Titler beta copy worked flawlessly the very first time. This is a real tribute to outstanding programming ability. Programmer's Update Since the above was written, I have received a set of the AMS documentation and an offer of a card from David Ormand of the SW99ers. David has been sent a copy of the AMS Video Titler and a letter accepting the offer of a card to use for programming and testing my new products designed for use with AMS. * SIDEBAR PART ONE - A TEST PROGRAM * COMPLETE AS SHOWN * * TEST PROGRAM FOR AMS CARD * SPECIAL BY B. HARRISON * FOR TITLER AMS VERSION * AMST/S REF KSCAN,VMBW DEF START KEYADR EQU >8374 Key-unit address KEYVAL EQU >8375 Reported keystroke STATUS EQU >837C GPL STATUS BYTE GPLWS EQU >83E0 GPL workspace GR4 EQU GPLWS+8 GPL Reg 4 GR6 EQU GPLWS+12 GPL Reg 6 STKPNT EQU >8373 stack pointer LDGADD EQU >60 load grom address address XTAB27 EQU >200E a storage location GETSTK EQU >166C get stack START LWPI WS LOAD OUR WORKSPACE BL @AMSINI USE AMS INITIALIZE SUBROUTINE (BELOW) C R1,@>401E AMS CARD PRESENT? 0=NO 401E=0F0F=YES JNE NOAMS IF NO AMS CARD, JUMP AHEAD SBO 1 TURN ON MAPPER CLR R1 R1=0 CLR R4 R4=0 MOV R1,@>401E SET >F000 TO PAGE >00 MOV R1,@>F000 SET FIRST WORD PAGE 0 TO 0 LI R3,>8000 R3 TO PAGE >80 MOV R3,@>401A SET >D000 TO PAGE >80 LI R1,>0F00 START AT PAGE 15 AMSLP1 AI R1,>100 ADD ONE PAGE INC R4 INC NUMBER FOUND MOV R1,@>401C SET >E000 TO PAGE 16, 17, 18, ETC. MOV R1,@>E000 LOAD >E000 WITH PAGE # C R1,@>E000 DID IT LOAD? JNE AMSDO IF NOT, WE'RE BEYOND LAST PAGE C @>F000,@>E000 CHECK PAGE 0 FOR CHANGE JEQ AMSDO IF EQUAL, JUMP CI R1,>9000 LIMIT NUMBER? JL AMSLP1 IF LESS, REPEAT C @>D000,@>E000 CHECK PAGE 80 FOR CHANGE JNE AMSLP1 IF NOT EQUAL, REPEAT AMSDO DEC R4 ONE LESS (R4 EQUALLED PAGE NOT FOUND) MOV R4,@AMS SAVE NUMBER OF PAGES ABOVE 15 BL @AMSINI AMS INITIALIZE (BACK TO "NORMAL") SBZ 0 TURN OFF CARD - MAPPER STILL ON SBZ 1 TURN OFF MAPPER JMP REPORT JUMP TO REPORT SECTION NOAMS LI R0,11*32+3 ROW 12, COL 4 LI R1,NOSTR NO AMS MESSAGE BL @DISSTR DISPLAY THAT JMP KEYEX JUMP TO EXIT ROUTINE REPORT LI R0,10*32+3 ROW 11, COL 4 LI R1,PGSTR PAGES STRING BL @DISSTR DISPLAY THAT A R2,R0 ADD LENGTH TO POINTER MOV @AMS,R3 GET NUMBER OF PAGES PAST 15 MOV R3,@>835E PUT AT >835E BL @SHWINT SHOW NUMBER ON SCREEN LI R0,12*32+3 ROW 13, COL 4 LI R1,FRMSTR FRAMES STRING BL @DISSTR SHOW THAT A R2,R0 ADD LENGTH CLR R2 CLEAR R2 LI R1,3 SET R1 TO 3 DIV R1,R2 DIVIDE R2-R3 BY 3 AI R2,4 ADD 4 FOR PAGES 4 THRU 15 MOV R2,@>835E QUOTIENT PLUS 4 (FRAMES) TO >835E BL @SHWINT SHOW THAT NUMBER (1/3 OF PAGES NUM + 4= FRAMES) KEYEX BLWP @KSCAN SCAN KEYBOARD LIMI 2 ALLOW INTS LIMI 0 STOP INTS CB @ANYKEY,@STATUS KEY STRUCK? JNE KEYEX IF NOT, REPEAT LWPI GPLWS LOAD GPL WORKSPACE B @>6A BACK TO GPL INTERPRETER * * SUBROUTINES SECTION * * AMSINI SETS AMS CARD TO "POWER-UP" CONDITION * AMSINI LI R12,>1E00 AMS CRU BASE SBO 0 TURN ON AMS LI R1,>FEFF (THIS IS ->0101) LI R0,>4000 START OF MEMORY AMSLP AI R1,>0101 ADD 1 PAGE MOV R1,*R0+ MOVE 2 BYTES TO MEM-MAPPER CI R0,>4020 ALL DONE? JLT AMSLP NO, INIT MORE RT RETURN * * DISSTR DISPLAYS STRING POINTED BY R1 AT SCREEN * LOCATION POINTED TO BY R0 * DISSTR MOVB *R1+,R2 LENGTH BYTE TO R2 JEQ DISX IF ZERO, SKIPIT SRL R2,8 RT JUST BLWP @VMBW WRITE STRING TO SCREEN A R2,R1 ADD LENGTH TO POINTER DISX RT * * FOR SHWINT, FIRST PUT INTEGER AT >835E, * AND POINT R0 AT DESIRED LOCATION * THEN BL @SHWINT * SHWINT BLWP @GPLLNK USE GPLLNK VECTOR DATA >2F7C DATA FOR INT TO STRING MOVB @>8361,R2 LENGTH TO R2 SRL R2,8 RT JUST. MOVB @>8367,R1 ADDR TO R1 SRL R1,8 RT JUST AI R1,>8300 ADD OFFSET BLWP @VMBW WRITE STRING RT * GENERAL PURPOSE GPL LINK * by Doug Warren/Craig Miller * GPLLNK DATA GLNKWS DATA GLINK1 RTNAD DATA XMLRTN GXMLAD DATA >176C DATA >50 GLNKWS EQU $->18 BSS >08 GLINK1 MOV *R11,@GR4 MOV *R14+,@GR6 MOV @XTAB27,R12 MOV R9,@XTAB27 LWPI GPLWS BL *R4 MOV @GXMLAD,@>8302(R4) INCT @STKPNT B @LDGADD XMLRTN MOV @GETSTK,R4 BL *R4 LWPI GLNKWS MOV R12,@XTAB27 RTWP * * DATA SECTION * WS BSS 32 OUR REGISTERS AMS DATA 0 PAGES BEYOND 15 NOSTR BYTE 19 TEXT 'NO AMS CARD PRESENT' PGSTR BYTE 14 TEXT 'PAGES FOUND = ' FRMSTR BYTE 9 TEXT 'FRAMES = ' ANYKEY BYTE >20 END * * END OF COMPLETE PROGRAM * * PART TWO OF SIDEBAR - A "SNIPPET" * * SUBROUTINE SETFRM (FROM AMS VIDEO TITLER) * ON ENTRY, R3 CONTAINS THE CURRENT FRAME NUMBER (1 THRU XX) * WHERE XX CAN BE 9 (128K CARD), 20 (256K CARD), OR 41 (512K CARD) * PAGE NUMBERS START WITH 0, SO FOR EXAMPLE ON A 256K CARD, PAGES * ARE NUMBERS 0 THRU 63, FOR A TOTAL OF 64 PAGES * * THE PROGRAM "KNOWS" HOW MANY FRAMES ARE AVAILABLE, AND * WON'T USE THIS SUBROUTINE BEYOND THE AVAILABLE FRAMES. * SETFRM MOV R3,R1 COPY CURRENT FRAME # TO R1 MPY @THREE,R3 MULTIPLY R3 BY 3 INC R4 ADD 1 TO PRODUCT IN R4 (PAGE NUMBER ON AMS = 4 THRU YY) * YY IS THE HIGHEST PAGE -2 SWPB R4 SWAP TO LEFT BYTE COC @ONEWD,R1 CHECK CURRENT FRAME FOR ODD/EVEN JNE SETEVN IF NOT 1 IN LSB, EVEN SETODD LI R8,>4014 MAP FOR >A000 LI R1,>A000 SET R1=>A000 JMP SETPGS JUMP SETEVN LI R8,>401A MAP FOR >D000 LI R1,>D000 SET R1=>D000 SETPGS LI R12,>1E00 AMS CRU ADDR SBO 0 TURN ON CARD SBO 1 TURN ON MAPPER LI R5,3 THREE WRITES TO MAKE (3 PAGES PER FRAME) SETLP MOV R4,*R8+ SET CURRENT PAGE AND INCT R8 AI R4,>100 NEXT PAGE DEC R5 DEC COUNT JNE SETLP RPT IF NOT 0 SBZ 0 TURN OFF CARD MEMORY (>4000) * THE MAPPER STAYS ON RT RETURN * UPON RETURN, R1 IS USED TO DETERMINE WHERE THE FRAME IS SENT OR GOTTEN FROM * DEPENDING WHETHER WE'RE WRITING OR READING A FRAME * * END OF PART 2 OF SIDEBAR ============================================================================ DTIHM005 Corcomp Memory Expansion Unit. This device uses a TMS4500 for Memory Refresh. (There is no 9901 on the card as a previous version of this documented stated.) CRU Bit Purpose 0 DSR Rom Enable 1 Ram Disable 2 Bank 0 3 Second 256K 4 Rom Page 6 Bank 1 \ 10 Bank 2 \ 14 Bank 3 \ Pages 18 Bank 4 / 22 Bank 5 / 26 Bank 6 / 30 Bank 7 / 32 Reset=1 Each bank fills the entire 32K area (>2000-3FFF,>A000-FFFF). Only one of the CRU bank bits should be active (=1) at any given time. CRU bit 1 will disable all the RAM on the memory card. By disabling the RAM, Corcomp was able to support a second memory card. The design of the Corcomp memory prevents most track copiers from working. This is undoubtedly because the Corcomp memory affects the bus timing. ========================================================================== DTIHM006 WHT Keyboard Interface Specifications for TI 99/4a AT Keyboard interface and ROM upgrade Copyright 1993-96 Western Horizon Technologies CRU DEFINITIONS: CRU Base: >0400 System Occupies >0000 to >03FF due to partial decode of 9901. Output Bits: 0 1=Turn On 8251A USART at base address >4000 1 1=Disable ROM/RAM on card, 0=ENABLE (enabled at power up) 2 1=RAM in >0000 to >2000 space, 0=EPROM (EPROM on power up) 3 spare - NOT Connected 4 Enable 8251A character in receive buffer interrupt to system 5 8251A RESET 6 1=Set system RESET line* (Causes a hardware reset to occur, should be activated by a CTL-ALT-DEL) 7 1=Cause a NMI* (LOAD Interrupt, should be activated by a SHIFT-PRINT SCREEN) 8 EPROM Extended address bit 0 (LSB) 9 EPROM Extended address bit 1 10 EPROM Extended address bit 2 (MSB) 11 EPROM Extended address bit 3 (Spare) 12 SRAM Extended address bit 0 (LSB) 13 SRAM Extended address bit 1 14 SRAM Extended address bit 2 (MSB) 15 SRAM Extended address bit 3 (Spare) Input Bits: Bit 0-3 Dip Switch Positions 1-4 If switch is OFF, Bit=1 Bit 4 8251A Sync/Break detect Bit 5 8251A Transmitter ready, 8251A is ready to accept data Bit 6 8251A Transmitter empty, 8251A Has sent data if=1 Bit 7 Character in 8251A receive buffer REGISTER DEFINITIONS: Registers at >4000 and >4002 only available when CRU BIT 0 is TRUE Registers at >8000 and >8002 are always available. This is the location of the memory mapper registers on the Myarc Geneve 9640. Registers are only partially decoded to a 128 word block. They physically occupy the >4000->4100 and >8000->8100 areas. PAD RAM begins at >8300 Read Registers >4000 OR 8251A Data from serial bus >8000 >4002 OR 8251A Status Register >8002 Write Registers >4000 OR 8251A Send data >8000 >4002 OR 8251A Control Register >8002 * Not supported on initial board revision =========================================================================== DTIHM007 More on the WHT Keyboard Interface: I can get you the information on accessing the memory in the WHT keyboard. It is all done with CRU instructions. The base CRU address for the AT keyboard interface is located at >400. The memory is banked in at addresses 0000-1FFF (8K) and replaces the console ROM. You can swap between EPROM and optional RAM on the interface by setting bit 2. Setting this bit to 0 selects the EPROM. Setting this bit to 1 selects the optional RAM. There are 8 banks of ROM and 8 banks of RAM. The bank selection is controlled by bits 12-15 for RAM and 8-11 for ROM. You may notice that there are more bits than are needed to select 8 banks. Don O'Neil left room for future expansion to double the amount of memory on the card. Anyway, lets say you want to select bank 2 of the RAM. Your code would look something like this - LI R12,>400 SBZ 2 Turn on the RAM LI R12,>400+24 LI R1,>0200 Select RAM bank LDCR R1,4 When you are done, you want to enable bank 0 of the EPROM again LI R12,>400 SBO 2 Turn on EPROM LI R12,>400+16 CLR R1 Select ROM bank 0 LDCR R1,4 -- David Nieters Dave.Nieters@dtc.fingerhut.com Fingerhut Companies ============================================================================== DTIHM008 Using the MBP This MBP is a memory mapped device. It maps into the 1K Block that is reserved for sound >8400->87FF. It uses National Semiconductor ADC&Real Time clock. ONLY EVEN NUMBERED ADDRESSES ARE USED!! The clock and date Function. Basic Address Assembler EQU Definition -31168 >8640 Thousands Sec - 66 >8642 Tens & Hund Sec. - 64 >8644 Seconds - 62 >8646 Minutes - 60 >8648 Hours - 58 >864A Day of Week - 56 >864C Date - 54 >864E Month With a Geneve in GPL mode you can access the clock and date function at the same addresses. In either GPL or MDOS mode, you can map physical page >BC to any logical page and access the clock and date function at offset >0640 in the 8K page. ============================================================================== DTIHM009 Super Cartridge: This was the name of the orginal project published in Micropendium. It consisted of an E/A module, modified to add 8K of ram to the cartridge port - this RAM was backed up. In addition to giving programmers 8K of additional RAM for assembly code, for the first time programmers could actually create their own cartridges - so that with the cartridge inserted and the machine powered on, their software would now appear as a menu option under 1. Basic. Here is a snippet of code by David R. Romer from his July '85 article in Micropendium. *************************** * Super Cart Test Program * *************************** DEF TEST Define label TEST as program name AORG >6000 absolute code starting at >6000 DATA >AA01 start of CARTRIDGE HEADER, value >AA01 DATA >0 must be at address >6000 DATA >0 DATA >MNULNK pointer to first menu table entry DATA >0 DATA >0 MNULNK DATA >0 2st menu table entry, DATA 0=single entry. DATA ENTRY pointer to start of program BYTE >09 length of text to be displayed on menu scrn TEXT 'MENU TEST' actual menu text to be displayed ENTRY B @TEST branch to start of program **************************** WS BSS 32 MASK DATA >4000 MSG TEXT 'MENU TEST PROGRAM' TEST LWPI WS LI R0,263 scrn location for display LI R1,MSG pointer to text to be displayed LI R2,17 length of text BL @VMBW ***************************** LI R1,>0A delay loop while text is on screen LOOP LI R0,>FFFF LOOP1 DEC R0 JNE LOOP1 DEC R1 JNE LOOP ***************************** LWPI >83E0 load GPL workspace BLWP @>0000 brach to color bar screen ***************************** VMBW SOC @MASK,R0 stand alone VDP multiple byte write routine SWPB R0 MOVB R0,@>8C02 SWPB R0 MOVB R0,@>8C02 NOP WLP MOVB *R1+,@>8C00 DEC R2 JNE WLP B *R11 END ========================================================================== DTIHM010 DataBioTics Super Space II. The Super Space II takes the design of the orginal Super Cart much further by giving the program 32K that can be banked in 8K pages at the >6000 address space. I have a DataBioTics Super Space II! Two, actually! Love 'em! Banks are selected by writing a bit pattern to CRU address >0800: Bank # Value 0 2 1 8 2 >20 3 >80 I don't know why this has to be a 16-bit transfer, but that's what the books says. The example is the following subroutine, with the bank number (0, 1, 2, or 3) in R0: BNKSW LI R12,>0800 Set CRU address LI R1,2 Load Shift Bit SLA R0,1 Align Bank Number JEQ BNKS1 Skip shift if Bank 0 SLA R1,0 Align Shift Bit BNKS1 LDCR R1,0 Switch Banks SRL R0,1 Restore Bank Number (optional) RT (I'm not sure they're quite correct. I thought you couldn't shift R0!) But there you go! Regards, -- *** David Ormand ************ Southwest 99ers *** *** dlormand@aztec.asu.edu ** Tucson, Arizona *** ***************************** TMS9900 Lives! **** ============================================================================- DTIHM011 33210 17JUL92-1918 General Information RE: TI CPU bug??? (Re: Msg 33209) From: JHWHITE To: JPLESLIE David: The DECrement instruction actually adds ">FFFF" to the value being decremented. The carry is set whenever the resulting value would be greater than >FFFF. The only time the resulting value is not greater than >FFFF is when the value being decremented is >0000. Some bitwise arithmetic shows what happens: DEC >8000 = b1000 0000 0000 0000 + b1111 1111 1111 1111 = >FFFF -------------------- C=1 b0111 1111 1111 1111 = >7FFF DEC >FFFF = b1111 1111 1111 1111 + b1111 1111 1111 1111 = >FFFF -------------------- C=1 b1111 1111 1111 1110 = >FFFE DEC >0000 = b0000 0000 0000 0000 + b1111 1111 1111 1111 = >FFFF -------------------- C=0 b1111 1111 1111 1111 = >FFFF Adding >FFFF, which can be thought of as -1 in two-complement form, is what the 9900 does when it DECrements. Jeff White p.s.: That rule for carry does not mean when the value of bit 0 changes, but when the addition of >FFFF to the value results in a carry value of 1 out of bit 0. If the value in bit 0 changing caused a status bit to change, it would be the OVerflow bit, not the carry bit. -*- ============================================================================= DTIHM012 35301 22OCT92-0313 TI ECHO RE: clock speed? (Re: Msg 35287) From: JHWHITE To: ILLUSIONIST The 99/4A runs at 3 MHz with 8192 bytes ROM and 256 bytes RAM at 0 wait state, and the rest of memory or memory-mapped devices at 4 wait states. At 0 wait state, a full (16-bit) word is moved across the CPU data bus in two clock cycles, which makes a theoretical maximum through-put of 1.5 Mwords/sec. Of course, with 4 wait state memory, that takes the theoretical maximum through-put down to 0.5 Mwords/sec. Then take into account that the 9900 bus is only active about 25% of the time (because it is not pipelined like the 9995 or 99000). Jeff White -*- ============================================================================= DTIHM013 What's wrong with the TI-99/4(a)? It can be summed up in four words - "ninety-nine eighty five." No, this is not the price your local discount store "blew" them out at in 1984.....or maybe it was, but. I am referring to the TMS9985. This was the CPU that TI originally planned to have in the 99/4. Due to technical difficulties, the TMS9985 was never produced. That forced TI to use the more expensive 9900 in the 99/4, instead of the less expensive 9985. The TMS9985 is the father of the 9995, just as the 99000 is the son of the 9900. Let's review some of the highlights of the 9995. o Has an onboard cache of 256 bytes. o Has an 8-bit data bus. o Utilizes only one dedicated external interrupt level besides Reset. These are all "features" that the 9995 and 9985 share. Highlights of the 9900. o Has a 16-bit data bus to all memory. o Has 15 external prioritized interrupts levels besides Reset. Now, let's say for a minute you had a system designed for a TMS9985 but you where suddenly forced to use a 9900. Most of us would go back to the drawing board and create a vastly more powerful computer, but the engineers at TI were under presure to get something done quickly with out re-engineering the entire computer system.... What would you do? o Tie interrupt pins such that only one external interrupt level was possible. o You would probably implement the 256 bytes of onboard ram as 256 bytes of static ram on the 16-bit bus to simulate the on board cache, but would leave the rest of the system access as 8-bit reads ( done twice ). Does all of this sound familiar? These considerations have had one major impact. If TI had implemented the 9900 like it had been designed, anyone building a 4(a) compatible would have been forced to use the 99000 as an upgrade processor. Had to redesign the 99/4(a) to utilize the 9900 to it full capabilities, we would have had a vastly superior computer. Minicomputer class capabilities! While you can cripple a 9900 or a 99000 to act like a 9985 or 9995, you can not make the reverse happen..... The End L.D.O.M. 12.6.96 =========================================================================== DTIHM014 Highlights of the 99105A By Dan H. Eicher As you all know the 99/4(A) uses the 9900 CPU. The Geneve use the 9995. Well in the not to distance future you may have a new choice of what CPU you want to use in your 99/4(A). Don O'Neil and Gary Bowser are working on a new product called the "Accelerator" for the 99/4(A) community! Rather than just bring the 4(A) up to the same microprocessor that the Geneve uses they decided to surpass it. The 99105A is a third generation 9900 CPU. The first generation consisted of the 99xx's (used in the 99/4(a), the second generation consisted of the 9995 (used in the geneve) and the third generation consists of the 99105A and 99110 (The 99110 is no longer produced by TI). Below shows the pin assignments and definitions of the 99105A. ___ ___ WE/IOCLK =1 U = MEM As you can see the TMS99105A is a RD = = BST1 40 pin dip package, unlike the 9900 RESET = = BST2 which is a 64 pin wide body dip chip. APP = = BST3 HOLD = = XTAL1/CLKIN The 99105A is only sold in high VSS = = XTAL2 reliability specifications. Which READY = = CLKOUT means it comes in a ceramic package INTREQ = = Vss and the leads of the chip are gold NMI = = ALATCH plated. IC0 = = PSEL/D15/OUT IC1 = = A14/D14 For further specifications you can IC2 = = A13/D13 order TI part #MP009, from 1-800- IC3 = = A12/D12 123-1234. This data book is called R/W = = A11/D11 the TMS99015A and TMS99110A Vcc = = A10/D10 Preliminary Data Manual. You may have A0/D0/IN = = A9/D9 to be persistant that you know the A1/D1 = = A8/D8 data books is available and the TI A2/D2 = = A7/D7 still makes the chip, because TI A3/D3 = = A6/D6 doesn't like to discuss 99xx based A4/D4 = 21= A5/D5 chips anymore. ------- Whats new in the 99105A? * Pipe Line Architecture * Directly accessable 256K bytes of memory * 84-Instruction superset of the TMS9900 - Signed multiply and divide - Long word (32-bit) shift, add, subtract - Load status register, load workspace pointer - Stack support - branch and push link, branch indirect - Multiprocessor support - test, test and clear, test and set * Privileged mode * Macrostore(1) emulation of user-defined instructions * Arithmetic falut interrupt * Illegal instruction interrupt * Multiprocessor system interlock signal * Attached processor interface * N-channel silicon-gate SMOS technology Lets look at some of these new features: 1. Pipe Line Architecture. If this chip had nothing more new to add to the 4(A) environment then this, this would be enough. Heres how pipe lining works. This example is from the book "The 99000 Microprocessor" by Avtar Singh. Lets take the assember instructions: A R0,R1. Step Function Type 1 Fetch instruction Memory 2 Decode instruction Internal 3 Fetch source operand Memory 4 Fetch destination operand Memory 5 Add operands Internal 6 Write resule to destination Memory ( Register to register addition sequence ) Instruction fetch Decode Source fetch Destination fetch Process Instruction fetch Write Decode Source Fetch Destination fetch Proces Instruction Fetch Write Decode Source Fetch \_____________________________ _____________________________________/ V Prefetch Mechanism " Looking at the instruction sequence, we see that during the two internal operations the system bus to external memory is not busy. To make more efficient use of the system bus, the 99000 is implemented with an intelligent instruction prefetch mechanism. With the mechanism, the execution of consecutive instructions is overlappped. This feature is also known as pipelining. Notice that while the first instruction is being processed, the 99000 initiates an instruction acquisition memroy bus cycle to fetch the next instruction. This second instruction is decoded while the results from the first instruction are being written to memory. In this way, we see that during each of the six steps of the addition instruction, the system bus is always in use." As you can imagine this improves system through put dramatically with out running the system any faster. The 99000 prefetch is intellegent. On the 99xx your program counter gets an instruction and increments the program counter (PC), well if the instruction that was just fetched happens to be a jump or branch instruction then the microprocessor just turns around and updates the program counter. With an intellegent prefetch the system "knows" if the instruction just fetched is a jump or branch if it is the system updates the PC with the next memory location to be used, NOT the next seqentail address. 2. More memory (up to 256K bytes). Heres what the memory map looks like in extended mode. The way this is done is by using PSEL and (BST1- BST3) to provide extended address lines. MAIN MEMORY SPACE | ------------------------------- | | INSTRUCTION DATA SEGMENT SEGMENT (64K) (64K) | | ------------ ------------ | | | | PAGE 0 PAGE 1 PAGE 0 PAGE 1 (64K) (64K) (64K) (64K) \_____________________ ________________________/ V 256K BYTES Of course on a standard 4(A) you would need a special memory board to take advantage of this much memory. (Don is working on a way to fix you up with a new memory board also). 3. Macrostore An entire book could be deducated to the subject of Macrostore alone. In brief, macrostore is a way to add to the native instruction set of the 99000. Lets say you need an op-code that will give you the square root of a number. Define it! Then in your source code you can have an instruction like SQRT R1 or SQRT R1,R2! TI had one version of the 99000 that had the entire UCSD pascal kernal all in Macrostore code. The 99110A had floating point instructions built into its macrostore. This eliminated the need to have a seperate numeric coprocessor. 4. Privileged Mode. When privileged mode of operation is selected two levels of operators are created, one designated the user and the other the supervisor. Certain instructions are then barred for use from the users programs. These operations include SBO, SBZ, LDCR, LIMI, RSET, LST, RTWP, IDLE, CKON, CKOF, LREX LDS, LDD. All of these op codes modify settings that could disturb the running of other programs in a multiuser/multitasking environment. So in short this mode of operation was designed to facilitate the development of multiuser/multitasking system software. 5. Attached processor interface + Attached computer interface. The 99xxx family has the capability to "attach" either another computer or processor to its self. This is similar to the 8086 family of processors ability to use an 8087. Although with the ability to have special floating point opcodes in macro store a numeric co-processor is not need. (For detailed information on a 99110 V.S. an 8086 with a co-processor see..... Here is the evaluation sequence that the 99xxx goes through when it goes to execute the next op code from a program: If it is a stndard op code then "Execute standard MicroCode" Else If (*) an attached computer then "Invoke and continue" Else If (*) an attached computer then "Invoke and wait" Else If it is an opcode defined in Macrostore then "Invoke emulation" Else If it is an opcode defined in main memory the "Invoke emulation" Else Handle as an illegal opcode. * it is an opcode recognised by.. 6. Op Code Compression While not highlighted as a feature 99xxx family another interesting aspect to its design is the way op-codes are scrunched in memory. This allows much more efficient use of the pipeline fetches. Who to contact about availability: Bud Mills 166 Dartmouth Drive Toledo, OH 43614-2911 (419)-385-5946 Tenative price is two hundred and fifty US dollars. References: Singh, Avtar, "The 99000 Microprocessor". Englewood Cliffs, N.J.: Prentice-Hall, Inc, 1984. ISBN 0-13-622846-1 Texas Instruments Incorporated, TMS 99105A and TMS99110A 16-Bit Microprocessors Preliminary Data Manual. Houston:Texas Instruments INC, Nov. 1982 L.D.O.M. 12.6.96 ========================================================================== DTIHM015 #1 5-JUL-1992 18:59:42.60 MAIL From: BOS::JHWHITE To: EICHER CC: Subj: bugs, bugs, and more bugs Dan: I've been looking over the console ROM source code and have located the main problem with the interrupt routine. Two instructions are reversed. The console ROM has the following: 0918 020C LI R12,>0F00 loads CRU base with >0F00 091A 0F00 to start CRU scan of DSR peripherals 091C 1D01 SBO 1 enables meaningless bit >0F02 The above can be seen (in slightly different fashion) on page 29 of TI Intern. What should be there is the reverse, which could solve lots of trouble: 0918 1D01 SBO 1 clears External Interrupt and re-enables 091A 020C LI R12,>0F00 loads CRU base with >0F00 091C 0F00 to start CRU scan of DSR peripherals So just dump a working console ROM, search for 020F1D in the even bank, and replace with 1D020F. Replace 0C0001 in the odd bank with 010C00. If you want, I can send you fixed ROM files with correct CRC values at the end. With the TI RS232 DSR, TI compounded the interrupt problem by (re-)enabling the RS232 interrupt even if the the RS232 was not the initiating peripheral. The fix is a one byte change. An excerpt from TECHNICAL DRIVE (pp32,33) shows the problem code: 40EA 1F10 TB >10 ** Test for character received 40EC 1310 JEQ $+>22 >410E ** Yes?, then jump 40EE 1F1F TB >1F ** Data set change, timer interrupt ** transmitter interrupt? 40F0 1632 JNE $+>66 >4156 ** No?, then jump 40F2 C306 MOV R6,R12 ** Restore CRU address .... 4156 1D12 SBO >12 ** Set receiver interrupt enable 4158 C306 MOV R6,R12 ** Restore CRU 415A 1E07 SBZ >07 ** Turn off LED 415C 0455 B *R5 ** Return Any interrupt that is not cleared before the CRU peripheral scan gets to the RS232 will cause the RS232 interrupt to turn on. The console ROM interrupt bug (for which I gave the fix) causes ALL peripherals to be checked for interrupts unless a DSR clears the External Interrupt with the equilavent of: CLR R12; SBO 1. An example of the problem is the Digit AVPC and the TI RS232, which share the External Interrupt line. The RS232 is normally at CRU>1300 and the AVPC is at CRU>1400. The VDP interrupt is active on the External Interrupt line. The console CRU peripheral scan finds the RS232 interrupt routine first, which we'll assume is supposed to be inactive. The RS232 interrupt routine tests the CRU bits on the UART's (9902A's), and falls through to the instruction at >40F0, which determines that there is no active RS232 interrupt. Then it jumps to the instruction at >4156 which turns ON the RS232 interrupt (BAD MOVE) and is followed by the exit back to the CRU peripheral scan. No more RS232 interrupt routines are available, so the CRU peripheral scan goes to the next peripheral, at CRU>1400 -- the Digit AVPC. The AVPC interrupt routine should then execute properly (though Digit and OPA DSR's are somewhat lacking, either failing to test conditions or leaving the interrupt hanging). For the sake of this attack on TI code, I'll leave Digit and OPA out of it. Just assume that the AVPC DSR does everything it should as if the TI code was not buggy. The first VDP interrupt goes as planned. However, now the RS232 port 2 interrupt is enabled whether it was supposed to be or not. And the console ROM did not clear the External Interrupt (the bigger problem). Consider the failure to clear the External Interrupt again. If that line is never reset, the first VDP interrupt causes the interrupt routine to be active each time interrupts are turned on whether an actual interrupt occurs or not. The RS232 mis-activated interrupt only becomes a problem when the RS232 port 2 receive buffer gets filled. Normally, RS232 interrupts are only activated by the RS232 Circular Buffer routine used by TE's. This too can cause trouble if the AVPC is installed without a circumventing DSR. But the bug in the RS232 DSR also means that TE's that do polling rather than use interrupts will cause problems with the AVPC installed. Now to the RS232 fix. If no RS232 interrupt is active, the RS232 interrupt routine should not turn them on. This means that the instruction at >40F0 should be changed to jump to >4158 instead of >4156: 40F0 1633 JNE $+>68 >4158 40F2 C306 MOV R6,R12 ... 4156 1D12 SBO >12 4158 C306 MOV R6,R12 415A 1E07 SBZ >07 415C 0455 B *R5 Thus, if you dump your RS232 EPROM and find >32 at byte offset >00F1, replace it with >33. I'll hold off on sending you a workable AVPC DSR until you tell me which of the above fixes you implement. Fixing both the console ROM and RS232 DSR is the best alternative. Jeff White ============================================================================ DTIHM016 Setting up user interupt routines. by Jeff White 37476 13FEB93-2100 General Information RE: CLIPBOARD99 (Re: Msg 37475) From: JHWHITE To: EICHER Dan: Simply daisy-chain your interrupt routine over any already loaded at address >83C4. Check the value at >83C4 upon loading your interrupt routine. Whatever its value, you should save it in your routine. Now copy the start address of your interrupt routine to >83C4. At the end of your interrupt routine, check the address you saved. If not zero, branch to it. Otherwise return. Jeff p.s.: This is the correct procedure for any VDP interrupt driven routine. You save the address at >83C4 into the new interrupt routine before putting the start address of the new routine at >83C4. Then you check the value you saved at the end of your interrupt routine, and if equal, return, else branch to the previous interrupt in the chain. -*- 37495 14FEB93-2009 General Information RE: CLIPBOARD99 (Re: Msg 37484) From: JHWHITE To: JDELEKTO Joe, you are quite right that daisy-chaining interrupt routines slows things down. I am aware of means to speed things up. Console sprite motion, sound, and quit key interrupts can be disabled by simply make bit 0 (MSbit) of the interrupt flag byte at >83C2 equal to 1. The user interrupt routine can still be active, and it can use the interrupt flag byte to flag various interrupt routines. In fact, the byte at >83C3 is NEVER used by the console (though some Dijit AVPC systems use it), so you can have an interrupt flag word. The user interrupt routine(s) can control sprite motion any way you wish, and the motion information can be in CPU memory instead of VDP memory if the routine is written to handle it. Sounds lists are not limited to VDP or GROM memory either. Even a fast keyscan can run off the interrupt if you desire. If you decide to use the the console interrupt routines (bit 0 of byte >83C2 equal to 0), there are still the 12 lsbits of the WORD at >83C2 to flag user interrupt routines. You can have more than 12 if you are content to let the 4 msbits of byte >83C2 serve dual purpose (no console ROM-driven sprite motion if byte >837A is >00, no console ROM-driven sound if byte >83CE is >00, no quit key if not pressed). Or if you are really clever, you can use all 16 bits of the word at >83C2 to flag user interrupt routines by reversing polarity. I.e., if any of the 4 msbits of word >83C2 is 1, then the related user interrupt routine is executed while the related console ROM-driven interrupts are not. The 12 lsbits of word >83C2 can flag up to 24 interrupt routines (if both bit values enable). Of course, you could redefine the word at >83C2 to work differently than the console usage. When bit 0 is 0, the 12 lsbits can mark 4096 locations in an interrupt vector table. When bit 0 is 1, the 15 lsbits can mark 32768 locations in an interrupt vector table. With the AMS/AEMS or 4A Memex systems, you are only limited by your imagination (and how much of a slowdown you can stand). If you want to execute 32768 interrupt routines in rote, make bit 1 of >83C2 equal to 1 and load user-interrupt vector >83C4 with the address of the user-interrupt handler. Use the 5 msbits of the 15 lsbits of >83C2 to mark a page of AMS memory, and the 10 lsbits of the 15 lsbits of >83C2 to mark an offset in that page. If you want BLWP vectors, two words will have to be marked by each of the 10 lsbits, or the entire 4K of each of the low 32 pages could be used. However, the two words could be used as a pseudo-BLWP vector. The 5 msbits of each word in the pseudo-BLWP vector could be used to mark which pages of the next 32 pages (eg, 32-63) the routine and its workspace use. The 11 lsbits of each vector address would mark the word offset. If you wanted, the workspace pointer of the pseudo-BLWP vector could point to a page in 32-63, and the program counter of the pseudo-BLWP vector could point to a page in 64-95. Of course, each time the user-interrupt handler is called, the value in the word at >83C2 is incremented and the msbit is set to 1 to prevent console ROM-driven interrupts from taking place. Though if console ROM-driven interrupts are needed, the use-interrupt handler can still have up to 4096 interrupt routines handled in rote. Just use bits 4 and 5 of word >83C2 to mark 4 pages of AMS memory for the 4096 pseudo-BLWP vectors. The 10 lsbits of >83C2 would be the vector offset in the page. This all seems quite ridiculously esoteric, doesn't it? However, you may now be thinking about what I am about to describe. A VDP-interrupt-driven OS -- VIDOS for short -- that puts the OS opcode number in the up to 15 (12 if you want to use console sprite motion, sound lists, and quit) lsbits of >83C2. The user-interrupt handler now becomes the VIDOS opcode handler with a few simple modifications. Say we use only the 12 lsbits of >83C2. A value of >000 tells the VIDOS to run its interrupt service routine. Values >001-FFF can be opcodes that do something. The 4 pages marked by the 2 msbits would contain the pseudo-BLWP vectors just as I described above. Parameters can be passed to the VIDOS opcode in CPU PAD, VDP PAD, or some page mappable to the 32K memory. In fact, you could even do a GPL interpreter with this VIDOS. Say that GPL opcodes >00-FF are passed to VIDOS as >C00-CFF. This would put the pseudo-BLWP vectors in the 4th page (11b), and the opcode marks the right vector. That should be enough food for thought right now. Sure, the interrupt routine of the console ROM is not that great. But some great things can be done with it and enough memory. Jeff White p.s.: I had another message describing another method to handle user interrupts, but I accidentally deleted it. -*- ============================================================================ DTIHM17 Interupts by Jim Ness INTERRUPT ME! ------------- How to use (and abuse) your computer's interrupt capabilities. -By Jim Ness ---------------------------------------- October, 1984 ************* Whether you program in assembly language on a TI99/4A computer, or most any other, you probably have come across a few references to "Interrupt Handling." If you react to the unknown the way I do, you probably skipped it, because you didn't need to know what it was all about. Once I had some of the basics of assembly language programming down, I came back to it. I had just seen an int- errupt driven clock/timer program, and decided it was time to see what made it tick (sorry, it was irresistable). In this first chapter, we'll see what interrupts are all about. Why are they necessary, when do they come in handy, and a beginning on the do's and dont's of programming with interrupts. ***** The beast we all call "Computer" is a narrow minded individual. It does what you tell it and does not pay attention to anything else. From the time you turn the power on, it is performing a task. In the case of the TI99/4A, a "power- up" routine is run, checking all the closets and corners to see what periph- erals are connected, and then displaying the color bar screen, and waiting for you to press any key. The problem with single-mindedness is that there are always a couple of things you would like to be able to do at any point in a program. For instance, you would like to be able to "QUIT" at any time. But if your program is busy adding numbers or printing text or displaying graphics, it doesn't care about your de- sire to "QUIT." It's busy. The solution is to have a timer stop the program on a regular schedule, and check to see if there are alternate tasks to perform, such as paying atten- tion to the goof trying to "QUIT." The TI99/4A, and all other modern computers have that capability built in to the operating system. Traditionally it is used to implement internal functions such as system reset or peripheral data transfers (disk or cassette). You don't want your program to move along before your disk drive is finished transferring data, for instance. But in the case of the ole TI99/4A, there is provision made for the user to add his/her own interrupt. There is an address located in the onboard CPU RAM which is checked 60 times per second. If there is a memory address "poked" in- to here, the program will branch to that address and perform what ever task is placed there. So, you could have a keyboard scan routine there to check for a "QUIT" command. Or a screen color or character change command. Or any pro- gram your little heart desires. ******** If you have read up on interrupts in the TI99/4A Editor/Assembler manual, you will have seen their mention of using up all the processor's time handling the interrupts. THIS is the big pitfall. Suppose you design a little routine to re-define each of the characters and the screen color, but you don't pay too much attention to the efficiency of your program. You may end up with quite a long routine. Say your routine takes 150 ms to perform, more than a tenth of a sec- ond. Remember that an interrupt routine will be called each time 1/60th of a second has passed. So here is the resulting time-frame: - 17 ms - The program - 150 ms - The interrupt - 17 ms - The program - 150 ms - The interrupt - 17 ms - The program (**etc**) You can see that the interrupt routine will run in its entirety each time, but the main program runs in tiny jerks and has to keep stopping for the interrupt routine. The result is that the main program ends up running very sllooowwww. And you have slowed it down just so you could have your favorite characters and screen color. The point is that if you want to use an interrupt routine, it must be very short and efficient. It must do one very important thing and quickly go back to the main program. The ideal interrupt would finish up in the 1/60 second time slot that the clock allows. If it took exactly 1/60 (17ms) it would share time on a 50/50 basis with the main program,so even that is a little too long. It is hard to figure if your interrupt program will be too long, but here is a rule of thumb to follow: Make yoursource listing no more than 20 lines long. The resulting program, after assembly, regardless of what it is, will be short enough. Your homework question: Which method of file access would be acceptable for use in an interrupt rou- tine? (A) Disk Drive (B) Cassette (C) 128k card (D) Minimemory Well, if you have been paying attention, you know that none of the above is usable. Because of the time restrictions that must be followed, you just can't wait for data to be transferred, even at the speed that the MMM and 128k 'ram disk provides. One question that has come up is where can we 'poke' the starting address of our routine so that it will run. Per the Editor/Assembler manual, the address of the user defined interrupt routine must be put into >83C4. The simplest way to do this is to use an 'AORG' statement near the end of the program, to force the loader to move to that memory address, and then use a 'DATA' statement to fill that address with the beginning address of your routine. Check the ex- amples below to see what I mean. Through the magic of TI-EXTENDED BASIC file handling routines, I am appending my DV80 source code files to this text, so you can see the examples. If you do not wish to take the time to go through them, just key "A" to abort this section on the BBS, and check back later, if you want. The source codes shown are in DV80 format and sometimes exceed the 40 col- umns on your screen, so you will see a few wraparounds. One way to solve the problem is to save what appears and reread it with the Editor/Assembler in edit mode, or with TI-Writer. The two programs shown are SETCOLOR & SETCHAR, both of which appeared in the D/L section of this BBS. Setcolor will change the color of screen and chars in Xbasic, and Setchar adds a real lower case charset. Each of them override the Xbasic interpreter's defaults. --------- *************************** * * * ASSEMBLY LANGUAGE * * ROUTINE TO CHANGE * * THE TEXT AND SCREEN * * COLORS IN X-BASIC * * FOR PROGRAMMING * * * * BY LARRY BENTLEY * * 9/29/84 * * * *************************** DEF COLOR * * SET EQUATES FOR XBASIC VMBW EQU >2024 VWTR EQU >2030 C DATA >F4F4,>F4F4,>F4F4,>F4F4 * SET 8 BYTES ASIDE TO LOAD COLOR LI R0,>07F4 * CHAR COLORS. ALSO LOAD VDP BLWP @VWTR * R1 WITH SCREEN BKGRD COLOR LI R0,2048 * START LOADING CHARSET COL- LI R1,C * ORS LI R2,8 BLWP @VMBW LI R0,2056 BLWP @VMBW LI R0,2064 BLWP @VMBW LI R0,2072 BLWP @VMBW B *R11 * RETURN TO MAIN ROUTINE AORG >83C4 * DURING LOADING, MOVE TO >83C4 DATA COLOR * PUT THE ADDRESS REPRESENTED BY END * COLOR INTO >83C4 *--------------------------------------------------* ********************************** * THIS ASSEMBLY LANGUAGE ROUTINE * * CHANGES THE DEFAULT LOWER CASE * * CHARACTERS TO TRUE LOWER CASE, * * INSTEAD OF JUST SMALL CAPS. * * -BY JIM NESS, OCT. '84 * ********************************** DEF LOWCAS VMBW EQU >2024 CHARS DATA >0000,>0070,>0838,>4874 ; a DATA >0040,>4078,>4444,>4478 ; b DATA >0000,>0038,>4440,>4438 ; c DATA >0004,>043C,>4444,>443C ; d DATA >0000,>0038,>447C,>403C ; e DATA >0018,>2420,>7020,>2020 ; f DATA >0000,>0438,>4438,>047C ; g DATA >0040,>4078,>4444,>4444 ; h DATA >0010,>0030,>1010,>1038 ; i DATA >0008,>0018,>0808,>4830 ; j DATA >0040,>4048,>5070,>4844 ; k DATA >0030,>1010,>1010,>1038 ; l DATA >0000,>0078,>5454,>5454 ; m DATA >0000,>0058,>2424,>2424 ; n DATA >0000,>0038,>4444,>4438 ; o DATA >0000,>0078,>4478,>4040 ; p DATA >0000,>0038,>4454,>4834 ; q DATA >0000,>0058,>6440,>4040 ; r DATA >0000,>003C,>4038,>0478 ; s DATA >0010,>1038,>1010,>1408 ; t DATA >0000,>0048,>4848,>4824 ; u DATA >0000,>0044,>4428,>2810 ; v DATA >0000,>0044,>5454,>5424 ; w DATA >0000,>0044,>2810,>2844 ; x DATA >0000,>0044,>2418,>1060 ; y DATA >0000,>007C,>0810,>207C ; z LOWCAS LI R0,>0608 * START AT CHR 97, VDP ADDR >0608 LI R1,CHARS * REFER TO ABOVE NEW CHARS LI R2,208 * 208 NEW BYTES BLWP @VMBW * LOAD THEM RT * RETURN TO XBASIC AORG >83C4 * DURING LOADING, GO TO >83C4 DATA LOWCAS * STICK THE ADDR OF THIS ROUTINE THERE END ----------------------------------------------------------------- So that is the end of my article on the use of interrupts in assemble language programs. Hopefully you have some new info now that you can use in future programs. ============================================================================ DTIHM018 40849 28OCT93-2315 Communications Circular Interrupt Input Buffer Operatio From: JHWHITE To: BRADSNYDER Here it is, the complete TI description of the circular interrupt input buffer operation. Home Computer EIA RS232C Peripheral Specification 08MAR 82 7.0 CIRCULAR INTERRUPT INPUT BUFFER OPERATION THIS FEATURE CANNOT BE USED IN A BASIC LANGUAGE PROGRAM BECAUSE OF THE COMMON CPU RAM USAGE, LOCATIONS 0-5. This option is enabled by calling the RS232 peripheral DSR with an operation code of HEX 80, most siginificant bit set plus an OPEN operation code in, the I/O opcode (byte 0) of the PAB. The normal processing for an OPEN command is executed but the receive interrupt is enabled as part of the OPEN. The CPU RAM usage is as follows: LOCATION MEANING 0-1 (2 byte) address of start of buffer area 2 (1 byte) length of buffer (1-255 bytes) 3 (1 byte) callers read offset value 4 (1 byte) RS232 DSR write offset value 5 1 byte NOT DEFINED When the RS232 get an interrupt it attempts to store the the input data byte to VDP memory address (word 0 + byte 4 offset + 1) address. When (byte 3 offset)=(byte 4 offet +1) an overrun error is declared and the data byte at address (word 0 + byte 4 offset) is overwritten with a HEX FE as long as this condition is present. If an input hardware framing, overrun, or parity error occurs and there is not an overrun condition a HEX FF is returned as the character code. When (word 0 + byte 4 offset + 1) > (byte 2) the write offset (byte 4) is set to zero and (word 0 + byte 4 offset) is used as the write address. This functions as a circular interrupt buffer. A user of this feature should read data whenever (byte 3) <> (byte 4). each time a data byte is read (byte 3) should be incremented by one. Inorder to read data increment (byte 3) to the next offset and then use the address (word 0 + byte 3). When (word 0 + byte 3 offset + 1) > (byte 2) the read offset (byte 3) is set to zero and (word 0 + byte 3 offset) is used as the read address. When input is done in this manner the software switch options described in the GENERAL SPECIFICATION SECTION 3.1 have no effect. However the hardware switch options control the input TMS9902. The output section of the port that is OPENed in this manner may still be used so long as the hardware switch options are the same. One OPEN statement can OPEN input for interrupt mode and output with switch options because the interrupt input ignores the software switch options. PAGE 8 ** TI Internal Data ** p.s.: It is typed exactly as it was printed. -*- =========================================================================== DTIHM019 Corcomp RS232 and PIO Internals by Jeff White. 33837 25AUG92-2240 General Information RE: TI FAIR (Re: Msg 33834) From: JHWHITE To: LEIGHTYM Michael: The following is part of a message I sent Email to Dan Eicher and/or Don O'Neil in regards to the Corcomp RS232. Unfortunately, I cannot find the rest of it. Maybe Dan or Don can provide the "rest of the story" if they have filed the message better than I did. "Here are the CorComp PIO port definitions: Pin(s) Function ------ -------- 1 Strobe 2-9 D7-D0 10 Busy 11 Ground 12 10 Ohm PU to +5V 13 Spare Busy 14 Spare Strobe 15 1K PU to +5V 16 GND Here are the CorComp CRU bit definitions and 9901 connections. A10 is inverted to swap P0-P15 to the lower bits: CRU I/O Function 9901 ------- -------- ---- 0 ROM enable P0 1 Spare flag P1 2 Strobe P2 3 Spare strobe P3 4 Flag bit P4 5 RS232/1 CTS- P5 6 RS232/2 CTS- P6 7 LED P7 8-15 D0-D7 P8-15 CRU Input Function 9901 --------- -------- ---- 21 Spare Busy !INT5 22 Busy !INT6 The 9901 interrupt line is not connected to the bus. Bits 0-15 of the CC are really outputs, though their states can be read. P1 and P4 are unconnected, so they act as "flag" bits. P8-P15 can be used as PIO Inputs if the 9901 is programmed properly. !INT1 to !INT4 are unconnected, so they have little functionality. However, the 9901 Clock on an internal !INT3 can be used for timing purposes. !INT7 to !INT15 are shared by P15 to P7, respectively. The card has no buffer chips (244 or 245) on it, which means the 9901 and 9902 chips are not isolated from the backplane bus. Also, applying inputs to the PIO port while the the 9901 is programmed to Output mode on just one of the data or strobe pins can destroy the 9901. It would have been better had bit 1 of the CRU been designated the I/O select bit (as it is on the TI card) such that it could control a bidirectional bus. Software that put the bus into..." I lost a very important part of that message. Note how the data lines (D0-D7) are attached to the 9901 and PIO port -- BACKWARDS! This means that sending out the Corcomp PIO port requires the bits of the data byte to be reversed with a standard cable (and in the standard DSR). Reversing the data bits means program overhead -- an algorithm to reverse them, a lookup table, or some combination of the two. IMHO, it is a colossal waste of a 9901 to use it as it was on the Corcomp RS232 card. 259's and 251's are cheaper, and easier to get, if you want to put the _parallel PIO_ (redundancy for effect) on the _serial_ CRU bus. Sure, if CC had hooked the 9901 up correctly, a simple "LDCR Rx,8" would have worked. Instead, it requires a "LDCR @revbit(Rx),8" or some algorithm before the "LDCR Rx,8" (see source code to Fast Term or Mass Transfer for PaulC's kludge code). On the TI, MYARC, and Ultracomp, you can "MOVB Rx,@PIO" to send out the PIO port. The Axiom interface will use the "LDCR Rx,8" without reversing the data bits -- i.e., Axiom has the data lines hooked INTELLIGENTLY. My recommendation for anyone designing a new RS232 card with PIO port is to simply put the PIO port at byte >5FFE (the top of DSR space). It's quite silly to limit the DSR to only 4K, when 8K EPROM's are not much more expensive. Sure, a new DSR would be needed, but only for the PIO part. The serial ports should still left as is for compatibility reasons. Jeff White (c) Copyright 1992 33855 27AUG92-0119 General Information RE: TI FAIR (Re: Msg 33853) From: JHWHITE To: LEIGHTYM Michael: I never said the bits weren't right on the PIO port. They are attached incorrectly to the 9901. Need an example, huh? Say that you load the value for 'A' into R2 and put it on the CC PIO port: CCPIO EQU >1310 A TEXT 'A' EVEN START LI R12,CCPIO MOVB @A,R2 LDCR R2,8 ... The ASCII value for 'A' is 65 or >41 or b01000001. Now look what that LDCR instruction does. It starts at CRU>1310, puts bit 7 of R2 there, goes to CRU>1312, puts bit 6 there, etc. I.e., the following is what you get: CRU bit Value PIO data line >1310 1 D0 >1312 0 D1 >1314 0 D2 >1316 0 D3 >1318 0 D4 >131A 0 D5 >131C 1 D6 >131E 0 D7 Note that in TMS 9900 lexicon, bit 0 is the MSbit and bit 7 is the 8th MSbit. Thus, what the Corcomp did was put the 8th MSbit of R2 (in the example) at the MSbit position of the PIO port, the 7th MSbit at the 2nd Msbit, or to wit: PIO data line R2 MSbyte MSbit 8th MSbit 2nd MSbit 7th MSbit 3rd MSbit 6th MSbit 4th MSbit 5th MSbit 5th MSbit 4th MSbit 6th MSbit 3rd MSbit 7th MSbit 2nd MSbit 8th MSbit MSbit Now you should see that rather than get 'A' on the port, you get character 130 (b10000010 or >82) on the port. Therefore, to put 'A' on the CC PIO port, you could put the value >82 in R2 and do the LDCR R2,8. In any event, the bits must be reversed in the data byte before being sent out the CC PIO port, or you would rewrite the DSR and swap the data lines on the PIO cable. I've got two MYARC, one Corcomp, one Ultracomp, and used to some TI RS232 cards here. They are all quirky, but by far the Corcomp is the biggest kludge. However, without the '244 on the CC PIO port, it CAN be bidirectional. You must be VERY careful though when hooking an input device to the CC PIO per this version of the card, as it CAN and WILL destroy the 9901 if inputs are allowed while the 9901 data lines are in output mode. It might not do the external device any good either. Now what exactly is wrong with the MYARC PIO? I guess you are referring to the missing CTS lines. Jeff White p.s.: How much does the 9901 cost? How about the 259? I expect on a bad day, you could buy twenty 74LS259's for the price of one 9901 (if you can find it). p.p.s.: If you do copy Corcomp's PIO design, I hope these messages haunt you for the rest of your life. :-) -*- ============================================================================= DTIHM20 Bring your Myarc RS232 into the nineties! By Jeffrey H. White and Dan H. Eicher When the Myarc RS232 card first came out, people were impressed by the fact that this card could be opened at 19,200 bps! TI and Corcomp had only listed open statement up 9,600 bps in their manuals. It was only later ( after we had become much more sophisticated, right? ) that we came to realize that the RS232's manufactured by the big three ( TI, Corcomp and Myarc ) were all capable of very fast speeds. In the cases of Corcomp and TI cards, 19.2 ( as it is commonly called ) was not coded into the DSR bit rate tables, but they are actually capable of these speeds and more, if you are working in assembly. What follows below is two modifications that can be made to the Myarc RS232 card. The first is a simple fix that will make the second serial port function. The other is an upgrade/enhancement to the abilities of your card! Some people ( myself included ) have had difficulties using the second RS232 port on Myarc cards. This is because of a design screw-up. The orginal board layout did not properly implement the RS232 port. The DTR line from pins 18 and 19 was hooked up to an output of the quad line receiver (1489), and the corresponding input was then connected to the !CTS (pin 6) and !DSR (pin 7) inputs of the 2nd UART (9902A). It only takes three jumpers to fix this, but some times these jumpers were installed wrong or not at all by Myarc when shipping RS232 cards. Here is what you need to do to ensure your card is modified to function properly with its second port: The trace from pin 4 of the 1489 must be cut so there is no continuity with pins 6 and 7 of the closer 9902A. Still on the front of the card is a trace from pin 6 of the 1489 to a solder pad between pins 4 and 5 of the quad line driver (1488) that must be cut. On the back of the card, the trace from pin 6 of the 1489 to the leg of a 2.2k resistor must be cut. On the back, run a jumper from the solder pad between pins 4 and 5 of the 1488 ( trace from pin 19 of the D-sub ) to pin 4 of the 1489, then from that pin 4 to the leg of the 2.2k resistor. Jumper from pin 6 of the 1489 to either pin 6 or 7 of the closer 9902A. If this is done correctly, your second RS232 port should work, given no bad solder joints or chips. The quickest and easiest way to check this modification out is to use a TI built Y-splitter cable for the RS232 and hook a modem with status lights up to the second port. If everything seems to work, you are set. Alternatively, if you have a Y-splitter cable and a breakout box, you can now use the breakout box to test functionality of the second port. On to the enhancement: As high speed modems have become more commonplace, a few transitions in the typical use of RS232 have occurred. The first being in the area of speed. When the TI RS232 card was originally designed, one of its primary purposes was to interface to a printer -- in fact, TI's impact printer ( an Epson with the TI logo ) was designed for serial usage. The maximum bit rate for the typical printer of that time was around 120 CPS ( Characters Per Second ), with each character requiring around 9 bits, so it was no real challenge for the RS232 port to keep up with the printer. Very quickly, with the rise of the TIBBS BBS by Ralph Fowler, hooking up a modem became the thing to do..... We have all seen the gradual increase in modem speeds occur. First 300, then 1200, followed shortly by 2400. But, only within the past year have 9600 and 14.4 modems become affordable to us common users. While 300/1200/2400 bps modems present computers and serial ports with little challenge, the same can not be said for speeds over 9600 ( actually a 9600 bps modem runs even faster, if you consider modems implementing MNP5 and 42 bis utilize 'on the fly' data compression ). The first change that must occur to accomodate faster communication speeds is your communication software. There are two primary methods of handling flow control. Flow control refers to the agreed upon way of deciding if the computer or the device it is talking to ( a modem perhaps ) is ready to send or receive. At low transmission speeds ( under 9600 baud ) the most common form of flow control is called XON/XOFF. This can be accomplished using only 2 wires ( Transmit and Receive ). This works based upon the practice that both devices have agreed upon characters they will both utilize for "OK to send" (XON) and "Whoah, hold on a sec!" (XOFF). This method does not work very well at high speeds. The problem is, in between the time it takes for one system to say, "Whoah, hold on a sec!" and the other system actually "Whoahs," an awful lot of data can pass under the bridge. So, what do you do? You use some more of the pre-defined control wires in the RS232C definition. The wires most commonly used for this function are DTR and RTS. However, the current RS232 cards are wired like a modem, so the wires that we will use are properly called DSR and CTS. You need not understand this peculiarity of the RS232 cards. In order to fully explain the modification we are about to make to your card, a little hardware detail will be presented. In the TI RS232, TI used certain Communication Register Bits to control the functionality of their card. Here are the TI definitions as compared to current and added definitions on the Myarc: Bit # Function Myarc 0 DSR ROM page Bit, 1=active Same 1 PIO Port Mode Control, 1=Input STROBE 2 PIO Output "STROBE" bit Mode Control 3 Spare PIO output strobe LED, 0=On 4 Flag Bit, 1=Set DSR (*) 5 CTS - control, Primary RS232 port, 0=Active CTS 1 (+) 6 CTS - control, Secondary RS232 port CTS 2 (+) 7 LED Control, 1=ON spare (*) - This pin's usage is NEW to all three cards, and it can be used to hang up a modem by toggling the modem DTR line. Some terminal emulators and some BBS software packages connect the secondary CTS line to the modem DTR line to implement this function. (+) - These are the flow control lines new to the Myarc card. Those terminal emulators and BBS software packages that connect the secondary CTS line to the modem DTR line, do not work with Myarc cards, because the CTS line is in-operative as supplied by Myarc. We will fix that. ENHANCEMENT ( Working Directions! ) The first thing you will need to do is run down to your local Radio Shack and pick up part number 276-2520, its a MC1488. ( FYI - its mate, the MC1489, is also available as part number 276-2521. They are both listed as costing $1.29 a piece in the '94 catalog.) While you are there you may want to pickup some wire-wrap wire (278-501,502 or 503 ) and a wire-wrap wrapper/stripper (276-1570) -- the stripper part is hidden in the handle! In fact, you can pull the wrapper portion out of the handle and stick it on cordless screw driver and make an auto-wrap tool! Ok, if you have a soldering iron and solder we are good to go..... Step 1. Take the cover off. Step 2. Orient the board so that you are looking down at the chips and the edge connector is facing you. Now remove the 3 resistors in the top right-hand corner. You now have six holes where the resistors use to be, fill the three on the left-hand side with solder. Make sure the holes on the right-hand side are clear, because you will be sliding jumper wires through them. It will look something like this.... 1 * * 4 2 * * 5 3 * * 6 ___ ___ 1 =| U |= 14 2 =| |= 13 3 =| 1 |= 12 4 =| 4 |= 11 5 =| 8 |= 10 6 =| 8 |= 09 7 =|_____|= 08 Step 3. Take out your new 1488 and piggy-back it to the existing 1488 by soldering pins 1, 7 and 14 together ( if this chip is socketed, please remove it from the socket before piggy backing it ). Next bend up the unsoldered pins. Step 4. You will need three short and three long jumper wires. Solder a short jumper wire from solder hole 4 to pin 11 of the piggy-backed 1488. Solder another short jumper wire from solder hole 5 to pin 6 of the piggy-backed 1488. Solder the final short jumper wire from solder hole 6 to pin 8 of the piggy-backed 1488. Now for the long jumpers. Solder pins 4 & 5 of the piggy backed 1488 together. Run a jumper wire from that connection through solder hole 2. On the back side connect this to pin 11 of the 74LS259 ( which is the farthest chip away from the 1488 on the top row). Note: Since you are now working on the backside of the board, pin numbering is reversed, so the 259 we are talking about is numbered like this: ___ ___ 16 =| U |= 1 15 =| |= 2 14 =| 7 |= 3 13 =| 4 |= 4 12 =| 2 |= 5 11 =| 5 |= 6 10 =| 9 |= 7 09 =|_____|= 8 Solder pins 9 & 10 of the piggy-backed 1488 together. Run a jumper wire from that connection through solder hole 3, on the back side connect this to 09 of the 74259. Solder pins 12 & 13 of the piggy-backed 1488 together. Run a jumper wire from that connection through solder hole 1 ( now the only one remaining ). On the backside connect this to pin 10 of the 74259. OK, that's it for the hardware mods. Double-check everything. Tape down the three long jumper wires on the back and put the case on. You have now added three more control lines to the RS232 port that you can use to implement hardware flow control in your software. Here are the assembler instructions to manipulate these three lines: LI R12,>1300 CRU base of RS232 card 1 SBZ 4 activate DSR SBZ 5 activate primary CTS SBZ 6 activate secondary CTS SBO 4 de-activate DSR SBO 5 de-activate primary CTS SBO 6 de-activate secondary CTS CRU bit 7 is left as a spare. There is also a spare line driver on the MC1488. We could attach pin 12 of the 74LS259 to pin 2 of the MC1488, then run a wire from pin 3 of the 1488 to an otherwise unused pin on the 25-pin RS232 connector. Another option would be to use CRU bit 7 for another control signal out the parallel port (without using the 1488). Right now we are happy to have "fixed" the MYARC RS232. About the only thing we have not discussed in this article is how to change the Myarc card from RS232/1&2 to RS232/3&4. This will be explained later in a user note. Many people have asked us where can they buy hard to come by 99XX chips ( such as the 9902A's used in the RS232). There are two routes to go. One not so sure, but very cheap, the other guaranteed to have what you need, but a little on the pricey side. The cheap route: look in your local phone book for computer scrap or salvage people. They usually have tons of 99XX chips that they will be glad to part with at a fair price. The more expensive route is to call Newark Electronics at 1.312.784.5100. These people should be able to tell you the number for your local Newark office ( or just look in the phone book under electronics ). They have 9901's, 9902's, and a few others. L.D.O.M. 03.26.94 ============================================================================ DTIHM021 39139 8JUN93-2122 General Information RE: SKEW (Re: Msg 39135) From: JHWHITE To: JERRYC Jerry, I still think this needs to be clarified a bit further, especially your definition of rotational delay. I can live with the definition of skew, since it is rather simple to visualize and is what HyperCopy reports. What bothers me about the definition of rotational delay is that it assumes the disk will rotate past the index hole after stepping from any track to the next. Assume the following is the logical sector pattern for two tracks of a disk: 0 1 2 3 4 5 6 7 8 <-- physical sectors o 8 4 0 5 1 6 2 7 3 o 5 1 6 2 7 3 8 4 0 The interlace is 2, and the skew is 6. The rotational delay stepping from the first track after reading its last LOGICAL sector to the next track and the availability of its logical zero sector is the time it takes to pass over physical sectors 1 through 7. This is 7 sectors. A single density TI disk can have approximately 25,000 bits of information, or 3,125 bytes per track. Seven 256-byte sectors is 1,792 bytes plus the gap bytes. The rotational delay takes over 100ms during the step. Therefore, if 35ms is the optimum rotational delay for this disk, there should be over 60ms for the disk controller to re-synchronize to the second track without passing the last physical sector or the gap information preceding and following the index pulse. Jeff -*- ============================================================================= DTIHM022 46809 7JUN95-2243 9640 GENEVE RE: Three and a half inch drives (Re: Msg 46798) From: JHWHITE To: JCARVER John, maybe I can explain it simply. The Geneve will boot from an 80-track disk in an 80-track drive with any controller. This includes the TI floppy controller, but you are limited to single density. Once MDOS is loaded, it defaults to how the controller would work on the 99/4A. In most cases, this would make MDOS treat the drives as 40-track. Unfortunately, in sector 0 of the disk, it is marked as being 80-track. This is not so bad, I suppose, if the OS -- that is, MDOS -- can be set to treat the drive as 80-track. It just so happens that if MDOS ignores the tracks-per-side value stored on the disk except when the drive is considered 80-track, the first 40 tracks on side 0 of the disk can be treated as the entire side of the "imagined" 40-track disk. Sector 1 of the disk holds the file descriptor index records, and these are actual sector number values. Therefore, read operations of files that completely fit within the first 40 tracks of side 0 are accessible (I think) just as if they were on a 40-track disk. So AUTOEXEC and SETDSK can be at the beginning of the disk to force MDOS to 80-track drive operation. If SETDSK is not used, the 80-track disk would be corrupted by writing to it. This is because the bitmap in sector 0 -- not used during most read operations -- for a 720K disk marks allocation units consisting of 2 sectors each. Each time an 80-track disk bitmap were updated as if it were 40-track, additional sectors would be marked as used. If we compare the logical sector layout of a 40-track disk to an 80-track disk, we can see the logical overlap: 40-track 80-track Side 0 0-719 0-719 ----- 720-1439 Side 1 ----- 1440-2159 720-1439 2160-2879 Getting less murky now. Whether MDOS thinks the drive is 80-track or not, it will translate sectors 0-719 as an access to side 0 of the disk in the first 40 tracks. Sectors 720-1439 would not be found, because MDOS would look on the wrong side of the disk for them -- in the area reserved for sectors 2160-2879. This is because sectors count up on side 0 as the read/write heads move toward the hub, and ALSO count up on side 1 as the read/write heads move away from the hub. Looking at the physical overlap of the sectors, we have the following: 40-track 80-track Side 0 0-359 0-719 360-719 720-1439 Side 1 720-1079 1440-2159 1080-1440 2160-2879 The drive logic always treats the outer (largest concentric) track as track 0. On a 40-track disk, side 1, moving the head to track 39 (the 40th track) finds sector 720. On an 80-track disk, side 1, moving the head to track 39 finds sector 2160. If this has not made your head spin faster than your floppies (300rpm in most cases, 360rpm for 1.2 Meg 5.25" and single density 77 track 8"), what happens when you format a disk in an 80-track drive when your software treats it as 40-trac? It makes it logically look like a 40-track disk (whilst in an 80-track drive running 40-track software). In this case, the physical overlap is: 40-track 80-track Side 0 0-359 0-719 360-719 ----- Side 1 720-1079 ----- 1080-1440 720-1440 Now I am beginning to think of onion slices and at least 4 food colorings to bring this discussion to yet another level.... Thankfully, I was taught not to play with my food. And disk formats are certainly nothing to cry over -- unless of course it is an accidental format of the disk holding valuable data. Jeff White -*- ========================================================================== DTIHM023 Disk Controllers -- an Addendum March, 1987 By Jerry Coffey I mentioned a "turbo" modification to lock out the "read after write" (write verify) routine usually performed by the controller. Here are the details: Find the 74LS251 chip at the top center of the controller board, above the DIP switches and beside the large FDC chip (marked WD1770). Solder a wire from the number 2 pin of the 74LS251 through a switch to ground (e.g. the wide trace of the DIP switches or any trace connected to that wide trace). It looks about like this from the bottom (non- component side) of the board. | ______________________ _______ | / Switch to ground | .|...... top | -------- ---- ^ of | | | |DIP | | Myarc | > | |swch| Location of the contrlr | |74LS251 | | | switch is up to you board-->| -------- ---- | | ----------------- | | | | | | | | | | > WD 1770 | | | | | | (or 1772) | | | | | ----------------- | As always you proceed at your own risk. (One person has told me this did not work om his 40 track system, but I haven't verified that.) You can tell it is working if your controller writes as fast as it reads (normally the write takes twice as long). Since I wrote the article on disk controllers, I have discovered some surprising facts about my own system. All of the Myarc timings in the article were done on an 80 track system with the fast WD1772 controller chip (stepping at 2ms). With some help from Paul Charlton and Richard Roseen, I recently customized Paul's Eprom to step at 3ms using the WD1772. (Richard's drives were making errors at the faster speed.) I used a Mechatronics Eprom programmer to download the Eprom code to disk, changed the FDC commands with a sector editor, and wrote the altered code back to a fresh Eprom. The process is simple (and cheap) once you decide what code you need in the Eprom. The slower step speed made it possible to notice some slight differences in the performance of the WD1772. The first thing I noticed was that interlace 4 on 18 sector tracks was no longer smooth -- it was missing the first sector after a track seek and forcing an extra revolution of the disk. This was the first clear indication of how close this format is to the "ragged edge". The reaction to the small change in step speed implies that this interlace comes within 5% of the minimum time required to step and settle the head. Thus the likelihood of read/write errors is relatively high with this interlace. It will occasionally detect the sector ID and begin to read or write before the head has completely settled. This interlace should definitely be avoided -- 18/3 is both faster and more reliable. The Eprom modification itself was an interesting experience. I patched the new FDC commands into some unused text bytes and patched addresses into the code to point to the new locations. The Mechatronics Eprom Programmer is an excellent piece of equipment. It will burn (program) a 2764 (8k) in about 90 seconds using the fast algorithm. I have talked to Jim Horn and Jeff Guide about offering an Eprom service to the customers of Disk Only Software. There are many possibilities this technique opens up. There is the 80 track modification for the TI controller worked out by Andy Cooper. And many Myarc owners are still using old Eproms that have never been upgraded (though this situation has improved since Lou Phillips increased his production capacity). The fix we developed for Richard's controller can provide the optimum step speed (3ms or 5ms) for different disk drives using the WD1772 FDC chip. And any enterprising programmer can get his tailor-made code installed in nonvolatile memory. Jerry Coffey [74716,3525] ============================================================================ DTIHM24 A Hard Drive Odessey (Oddity) By Dan H. Eicher & Jeffrey H. White Recently I put a one gigabyte SCSI drive on my pc. (A personal note: if you are going to use SCSI on a PC, buy an Adaptec brand controller.) This left me with two Seagate ST277R hard drives that had performed five years of great service. About this time, Jeff and I were assembling a system to work on the GenMod Geneve / WHT SCSI compatibility problem. Of course I needed two external cases to hold these drives. The best place I found for getting external cases with power supplies is Mendelson's Electronics: 1-800-344-4465. Their supply is hit and miss, but they usually have something usable at a very reasonable price. I got my cases in and built the cables. While you can still buy RLL controller cables - which are usable with the Myarc HFDC - usually the length is wrong so you will need to build your own. You can buy the parts you need to build the cables from JDR Micro Devices: IDE34 - 1 to hook to the HFDC plus an additional connector for each HD. IDE20 -\ These are the data cable. 1 each for every hard drive. IDS20 -/ IDS16 - This is the TI side of a printer cable. IDCEN36 - This is the Printer side of a printer cable. To crimp these cables you will need a vice ( if you go this route, you need to be very careful ) or buy a cable crimper. JDR's part number is HT-214 and is well worth the money. We got the hardware assembled and now it was time to reformat the hard drives to work on the TI. We dug out our specifications on the drive ( I still have my orginal owners manual ) and put the values into MDMV. We had to guess at the interlace value for the HFDC/Seagate 277R drives and GenMod geneve combination. After the formatting was finished, the drives could be read, but not written to. We tried over and over with different MDMV settings. None of them seemed to work. In a moment of desperation I tried using CFORM; I had the same luck as MDMV. In order to save myself some time, I decided to try only formatting the first 10 cylinders in my quest for a working (not optimal, but working) interleave. Well after trying this little stunt, CFORM came back and told us that track 0 or media on this device was BAD! Yegads! After this error message we could not coax another complete format out of either MDMV or CFORM. Our last resort, and it was a last resort, was to put together a PC system with an RLL controller. Fortunately, Jeff owns an original Seagate brand RLL controller. Immediately, the Seagate controller recognized the drive and type. It made quick work of the formatting of these drives. We moved the drives back over to the GenMod Geneve system and this time the reformatting went without a hitch. I could read and write data with no problems. In fact, the drives seemed to work much quicker than similar drives we have in house. Later we went up to Chicago and asked Mike Maksimik what he thought my have went wrong. He told us that probably the gap value between sectors was too small for the drive - that is, a bug in CForm. He knew how to fix the problem, but apparently there is a disagreement between Mike and Don Walden regarding royalty payments, so no fix will be forthcoming from Mike. We asked Mike why CForm could not just go in and redo the gap values, like the Seagate controller did. Mike says that this a bug in the 9234 controller chip used in the HFDC. In simplistic terms, the chip must read this value before changing it. If the value is wrong an error is returned. The chip should then disregard the error, and reformat with the correct value. The 9234 has a fatal bug, that if an error occurs during this process the chip locks up. There unfortunately is no way to work around this problem in software. This is the reason why occasionally a hard drive will become so messed up on a TI, the only recourse is to take it to a PC and do a low level format with an RLL or MFM controller card. A few notes: We have found that RLL drives seems to work fine with the Myarc HFDC. You should always attempt to use the buffered head step (0) in the MDMV menu. You should avoid using CForm, and only use MDMV on the Geneve to format drives. Of course to load MDMV and use the format routine on a Geneve you must page in the ROM. Using RomPage means that the Geneve's Master DSR is paged out, so the only devices you have access to are drives connected to the HFDC and/or those connected to a Myarc floppy controller. It is much easier just to hook up a TI and format the hard drives and then use them on the Geneve. If you want to load MDMV on a Geneve to format with and you need the Rom Paged in the easiest way is to go into TI BASIC, issue a CALL INIT, CALL LOAD(-32766,186), NEW, and then do a CALL MDM. Also when purchasing connectors to build your cables, always buy high quality, gold-plated, double-leafed connectors. While moving MDOS source code around and testing the GenMod Geneve and WHT SCSI card we have found the Syquest EZ135 to be very reliable. It works as fast as all but the fastest SCSI hard drives on the Geneve, offers removable media of 135 Megs and can be set at any SCSI ID. The Syquest drive is the perfect companion for a WHT SCSI card. We have also played a bit with the Iomega SCSI Zip drive. It is a MUCH less reliable unit, it is locked into SCSI ID's 5 and 6 which are incompatable with MDOS. MDOS wants to see all hard drives at ID's 0, 1 and 2. Global Computer Products has a sale on SyQuest EZ135 for 179 dollars, part number GDC92225E, the phone number is 1-800-845-6225. L.D.O.M. 05.01.96 ============================================================================ DTIHM25 The 9224: A failed experiment or an educational experience? by Dan H. Eicher, eicher@delphi.com and Jeffrey H. White, jhwhite@delphi.com About three years ago Beery Miller was working full bore on trying to implement the level 2 routines for the Myarc Hard Floppy Disk Controller (HFDC) in MDOS. He was having some problems so he called Standard Microsystems, the people that make the disk controller chip in the Myarc HFDC. At that time the support engineer he was talking to told him that the 9234 was a buggy chip - somewhat experimental. He recommended a complete redesign of the controller board to use a then newer chip that would support the then current RLL hard drives. This not being possible, he recommended the possible retro-fitting of the Standard Microsystems 9224 disk controller chip which appeared to be pin for pin and register level compatible with the currently in-use 9234. Beery said the only difference mentioned to him by the support engineer was that the 9224 and the 9234 computed their ECC value differently. Meaning that a hard drive used on one chip could not be used on the other with out reformatting. Beery got in a couple of the 9224 chips to test. He tried one of the chips in his HFDC. At that time he didn't have a spare hard drive and no easy way to back up his system. After placing a 9224 in his HFDC he found that he could no longer read his hard drive. His experimentation with the 9224 stopped there. About two years latter, Jeff and I got a couple of 9224 from Standard Mircosystems. It says in their component catalog (1988 version) that these chips were designed to be used in Vaxes and Microvaxes, sometimes called Vaxen. Another year or so went by until we got a spare HFDC and hard drives to try some experimentation. Neither of us were willing to risk doing experiments on our only HFDC, they being very temperamental and all. Jerry Coffey was kind enough to loan us an HFDC to do some testing with. Now, with all that preamble, we finally got around to doing the experiments. I set the HFDC at CRU >1000 thinking that that would be a good CRU setting, allowing us to use DSK1 emulation even if, later on, we decided to add floppy-only controller. We hooked everything up and the floppy drives were chattering and doing all sorts of weird things... This, the first of a long series of problems, was caused by a CRU conflict between the HFDC and the Myarc 512K card we were using. The Myarc 512K card responds at CRU >1000 (and >1900). LESSON: Make sure your HFDC is not set at a CRU-base that conflicts with another expansion card in your system. To solve this problem, I needed to change the HFDC's CRU address to >1100 so that there would be no conflict with the Myarc 512K card. To verify that the card was set to the correct CRU I used the Minimem module. Here is the procedure I used to verify that the HFDC was showing up at the CRU >1100 space. I selected Minimem, then I selected Easy Bug. I typed C1100 then 1, hit , then the period key. This activated the card. Now its DSR memory should show up starting at >4000. So I typed M4000 and hit . Easy Bug then responded back with the hex values held at the address starting at >4000. These values should be: >4000 AA >4001 OB The >AA means that this is a valid DSR. The >0B is the revision of the DSR. The current working revision is 11. A version 12 DSR was distributed, but it was found to be more buggy then version 11! With the HFDC's CRU set up correctly, it was time to hook the hard drives back up and see what would happen. Still the same problem...floppy drive chatter... argh... OK. Next step was to make another quick visual inspection of the card. Quickly I noticed a problem. The part of the card that sticks out past the end of the P-box did not have any electrical tape. Myarc made an engineering blunder. They had ran control lines from the AM26LS32x chip to the hard drives on a portion of the card that is scraped by the metal clips of the P-box. LESSON: Make sure the neck of the HFDC is protected with tape. This was easy to fix with a little electrical tape around the neck, and we were ready to go again. We tried again. Same Result. Jeff noticed that the card had an AM26LS32PC. He has had some problems with this chip in the past. This version of the chip is a marginal component. The recommended replacement is a AM26LS32AC. We didn't have one of those so we tried omething else. Note: the AM in the part number signifies an AMD part number. LESSON: If your system is acting quirky - replace the AM26LS32PC with an AM26LS32AC. We disconnected the hard drives from the HFDC. The system powered up but wouldn't access floppy drives. Oops! I had forgotten about the 45 second delay, while the HFDC repeadedly waits for a hard drive to activate its ready line. After waiting for the controller to time out, I could access the floppy drives fine. To defeat this power-up timer you must take pin 1 of the inner most LS251 (U21) to ground, pin 8 works well for this, and you may want to put this on a toggle switch. - This information courtesy of Tim A. Tesch. LESSON: Either jumper your card to bypass the hard drive power-up wait timer or wait 45 seconds. All we had to do now was hook up the hard drives and test things out. More floppy drive chattering and then no access to the floppy or the hard drives. At this point, I was nagging Jeff to come up with more ideas. He decided to offer his HFDC for sacrifice. No, he did not torch it -- it does a good enough job toasting itself while in the P-box. Jeff swapped his with the HFDC from our test system -- the HFDC Jerry had sent us. The alternative was to take the hard drives from his Geneve and try them with Jerry's HFDC. Too risky. The data on the hard drives is worth more than the controller. Same symptoms. Had Jeff's HFDC been fried? Jeff then decided to bring his hard drive to the test system with his HFDC. With Jeff's HFDC and hard drive, the system worked fine. Jeff then tried his hard drive with the HFDC Jerry had sent. This combination worked as well. Using Jeff's known working set of cables, we were able to format one of the hard drives we had for testing. We decided to try something new. We swapped our test cables one at a time with Jeff's known working cables until we determined the original problem was with the control cable - the cable with 34 pins. ( The other cable is called the data cable. ) I checked out this cable with a voltmeter and everything appeared fine. Theorizing that it might be a problem with the length - it was about 6 feet long - I cut the cable in half and applied another connector (Radio Shack part number 276-1564). We tried it with this now shortened cable with a new connector and we still had the same problems! We then sat down and checked each pin on the cable for continuity - the size had been reduced to half the previous length and the pins rechecked. But STILL no difference. Then, Jeff got a bright idea. He reversed the cable, not just rotating the cable 180 degrees on one end or the other, but a 180 degree turn on both end! What we were using as pin 1, now become pin 34 and what was pin 34 became pin 1. This time the system fired up without any drive chattering. How could reversing the cable make a difference on a cable with straight through connections? Well on the connector - all odd number pins are used for ground and all even numbered pins are used for controller signals. Our theory is that one of the strands in the ribbon cable had a crack in it, causing high impedence, but only when it was twisted a certain way. This strand when connected the orginal way was on an EVEN-numbered pin (i.e., a control signal), when the cable was reversed it placed the bad strand on a ground line. Having one bad ground out of 17 ommon grounds didn't cause a problem. LESSON: Always suspect cables. Always have a spare set of known good working cables on hand. With the system working we formatted both hard and floppy drives without problems. We pulled the HFDC and put in the 9224. The first thing we noticed was terrible drive chattering. We thought this might be because of the slower step rates of the 9224 as compared to those of the 9234. We tried various dip switch settings on the HFDC, but were not able to get the floppies working. We changed the HFDC's CRU setting to 1200, inserted a Corcomp disk controller and went on. The next test was to try to access a hard drive previously formatted with the 9234. Neither hard drive could be read. We (and Beery) expected that this would happen since the two controller chips compute their ECC codes differently. We had also hoped that Beery's theory was correct that if you reformatted a hard drive with the 9224 that it would be usable. Well, despite many attempts (including upgrading the static memory on the HFDC from its factory default of 8K (6264) to the full 32K (62256)) we were never able to format a hard drive with the 9224 controller chip. LESSON: Always have the full 32K of memory on your HFDC. After exhausting all possible hardware options, it would appear that without modification to the existing Device Service Routine software, that the 9224 Hard Floppy Disk Controller Chip is not usable on the HFDC. Other things that you can do to help make this temperamental piece of equipment more robust is to make sure the 26LS32 is an AM26LS32AC. You should also verify that the 9216 chip is a 9216B - this chip is the data separator. The 9216B is specified for faster data throughput. The 9216 is overclocked at 8 MHz, but it may work fine for double density disks. In order to use high density floppies or tape backup devices, you must use the 9216B. I have a hand full available for five dollars each ( includes shipping ). You should also add heat sinks to the two 7805 voltage regulators. A good cleaning with an eraser tip should also be done, if you notice any dirt on either the P-Box edge connector or hard drive control cable connector - the silver looking connector. This silver connector is coated with a tin-lead compond and does not provide a real good connection - like gold platting would. L.D.O.M. 12.19.95 ============================================================================= DTIHM26 Fixing Blown Bit Maps on the HFDC by Edward Hallett From: The Catus Patch BBS 11/10/90 By: TOM WILLS 1 (TUCSON AZ) To: ALL Sb: HD DIRECTORY FIX I was asked if I knew of a way to copy all the files off an HD on the TI which has bad directories. The directories are not totally blown, just a few entries. And, of course, MDM will not read those directories. Any ideas on this one? Also, not all directories are bad, just some. The MDM backup will not work because of this, nor can he copy the files from the subdirectories which have bad pointers in them. In other words, HELP! By: EDWARD HALLETT 6 (TUCSON AZ) To: TOM WILLS 1 (TUCSON AZ) Sb: HD DIRECTORY FIX Tom, I have had to deal with blown diries and or blown file headers on both Ida's and my harddisks on several different occasions. The vast majority of the files can be salvaged in most cases. The range of difficulty will depend upon th number of blown sectors, their location and the size of the hard disk. Files for which a backup copy exists on floppy do not need to be recovered but only need to have their blown pointers removed so that the other files can be copied off the hard disk. Files that do not have a backup on floppy need to have their headers, pointers, directories etc. repaired so that they can be salvaged by copying them off the hard disk. I use a program called Hard Master by Asgard Software I think, when I need to fix a hard disk. The Hard Master program is similar to the SectorOne program but I like Hard Master better. It is a hard and floppy sector editor with a Tree function, Map function, and much more. Its docs also explain alot about the hard disk sector mapping etc. As far as procedure to fix the hard disk I would suggest the following as a general procedure. 1. Run the hard disk test with MDM5. this will mark any bad sectors. Note the number of bad sectors found and their approximate location on the hard disk. Are they all at the begining of the disk, some in the middle etc.? 2. If any bad sectors were identified during the test try to identify the exact sector numbers by using Hard Master to step thru the sectors in the suspected area with its sector read function. 3. Using Hard Masters Tree function print out a tree listing of the directories only. If a bad sector is a directory sector you will have to remove the pointer to that directory to get to the rest of the directories. 4. Using the Tree Function after removing any pointers that were causing trouble print out a tree listing of both directories and files. These tree listings tell you what sors the headers are in and what sectors the file act- ually occupies. You may hit some bad pointers during the file tree listing and they will have to be removed before you can get the listing to complete as in the directory tree listing. 5. At this point you should have a detailed tree listing of both directories and files and a list of bad sector numbers. You would also have recorded any information about the pointers you may have removed. With the bad pointers removed and the bad sectors marked you should now be able to copy the remaining files from the hard disk to floppies. I would recommend doing this file by file rather than with the back up routine. Of course you only need to copy the files that you don't already have backup copies. 6. At this point you are ready to rebuild the pointers for the directories and or files that you had to remove to get the other files off the hard disk. If the directory or file header was located in what is now a bad sector just pick an unused sector at the top of the hard disk and write your new header block there. then put the pointer in any good directory or the root to point to the new header. Once this is done you can simply copy the file otire directory off to floppy. If the directory or file header was just scrambled and not in a now bad sector you can rebuild it where it is. 7. Using this procedure you can recover all the files from the hard disk with the exception of a file that now has a bad sector in the middle of the file. In that case you must change the header to skip that sector. Sort of like fracturing your own file. Then you will have recovered the file minus one sector. Reconstructing that sector may or may not be possible depending on the file, (data, text, program etc.). Now that is the basic procedure and it has worked very well for me. The specifics of removing pointers, rebuilding headers etc. is similar to those on floppies. The information needed to do this is available in the HFDC manual and in the Hard Master manual. The specifics also depend upon the actual problems with the specific hard disk. The persons' experience with working with floppy headers, their ability to work with hexadecimal math and their ability to multiply alot of the hexidecimal pointers by an offset constant to get the actual sector number (this can be confusing). If you try to read a bad sector and get a device error you will probably have to rerun the Hard Master program in order to continue reading sectors. (Does not recover well from device error ie bad sector). I had to tell if to switch from HD#1 to HD#2 and then back to HD#1 to recover from error and continue. You may also experience similar problems with other sector programs and MDM5. So it is iportant to identify those bad sectors and make sure your software is functioning correctly after a device error before attempting to write to the hard disk (sector write or file copy) or yould just make things worse! When in doubt reboot or rerun before writing. You didn't say if this hard disk was on a 4A or a 9640 but the procedure is the same. Give me a call land line if you need more info. I would be glad to help. I'd be glad to tell you about some of the specific problems that I have had to repair on hard disks. Once the hard disk is restored to normal ie fixed the bad directory and files, copied everything off, reformatted, copy everything back on, you can make it easier for future recoveries by copying sectors 0 thru 1 to sectors 20 thru 39 (HEX of course). This gives you a copy of all the directory information and can be used to restore the directories to the state they were in at the time this info was copied. Also helpful is to print out a tree listing of all directories and files showing their sector locations etc. And of course doing regular backups of the hard disk would be very useful! I think that almost any hard disk could be recovered with theurse) and start rebuilding directory headers! Well give me a call if I can be of any additional help. Or if you need more info about Hard disks. If I can make it to the SIG I'll try to remember to bring Hard Master also for a little demo and we can print out a Tree listing for your hard disk just in case you ever need it. ============================================================================= DTIHM027 CPUID & VDPID by Jeff White 40176 2SEP93-2117 Communications RE: PC99 and TELCO (Re: Msg 40175) From: JHWHITE To: MARKVC To clarify that a bit, V14 is used to change the 16K page of VRAM used by the V9938/V9958. If data is written to page 0, which is all that exists on the stock 99/4A, and the page is changed (only possible with V9938/V9958), the data will not be there. However, since the page does not change on the 9918A, the data will be found. The 9918A may mask V14 to V6, and V6 sets the sprite generator table base address. Because sprites are inactive in the text modes which Telco uses, changes to V6 do not affect the video display. I have a more innocuous routine, called VDPID, that works on a different principle. The only side-effect is that the text mode and background colors are changed, but the routine does change them to what the programmer gives the routine. Jeff -*- --------------------------------------------------------------------------- * * * * CPU identification routine by Jeffrey H. White * (c) Copyright 1991 * * Usage: BLWP @CPUID * * Returned values in R1: if 9900, = 1 * if 9995, = 2 * if 99000, = 3 (Privileged Mode) * = 4 (User Mode) * CPUID DATA $-16 R8 location DATA CPUPC R9 location CPUPC BES 12 skip over R10-R15 LIMI 0 try to turn off interrupts LWPI CPUID-16-6 to preserve R13-R15, new Rx = old R(x-3) STST R15 store status SLA R15,12 are interrupts off JNE C99000 no, then definitely in 99000 User Mode STWP R13 store current WP LI R14,CONTIN trick with PC required by LST-less 9900 LI R15,>0020 after RTWP, ST10 will be 1 only on 9995/99000 RTWP load ST, keep current WP, and execute next CONTIN LI R14,>0001 load value to return if 9900 STST R15 ST10 was not affected by previous instruction SLA R15,7 check ST7 for Privileged (Supervisor) Mode JLT C99000 ST7=1 always on 99000 in User Mode JEQ C9900 ST10=0 always on 9900 MOV @>FFFA,R15 9995 on-chip decrementer location AI R15,>8000 most distant value from decrementer MOVB R15,@>FFFB byte writes to 9995 decrementer mess up both AI R15,>8000 restore register to previous decrementer value CB R15,@>FFFA decrementing is not fast enough for bytes to equal JNE C9995 on 99000, memory or not, >FFFA will not change INC R14 only executes if 99000 is found C9995 INC R14 only incremented once if 9995 MOV R15,@>FFFA restore the value C9900 LWPI CPUID-16 restore entry WP MOV R11,@>0002(R13) put at caller R1 RTWP finished C99000 LI R14,>0004 value returned if 99000 User Mode JMP C9900 go exit ------------------------------------------------------------------------------ * * VDP identification routine by Jeffrey H. White * (c) Copyright 1991 * * Usage: BLWP @VDPID * * Returned values in R1: if 9918A, = 1 * if V9938, = 2 * if V9958, = 3 * VDPWS BSS 32 VDPID DATA VDPWS DATA VDPPC VDPPC LI R10,1 LI R0,>0F04 BLWP @VWTR VDPST MOVB @VDPSTA,R12 JGT VDPST JEQ V9918A MOVB @VDPSTA,R12 JLT V99X8 JMP V9918A V99X8 LI R0,>0F01 BLWP @VWTR MOVB @VDPSTA,R12 SLA R12,5 JLT V9958 JMP V9938 V9958 INC R10 V9938 INC R10 V9918A LI R0,>0F00 BLWP @VWTR LI R0,>07F4 BLWP @VWTR MOV R10,@>0002(R13) RTWP * * =========================================================================== DTIHM028 40312 10SEP93-1251 Graphics bitmap mode explained again From: JHWHITE To: ALL In article <1993Sep8.013025.4524@ultb.isc.rit.edu>, digger@ritcsh.csh.rit.edu (Sean McGranaghan) writes: > > VDP Register Value Result > ------------- ----- ------------------------------------- > r0 >02 Set Mode bit 3 for bitmaped mode > > r1 >E0 default value > > r2 >06 Screen image table base address > >06 * >400 = >1800 > > r3 >80 Color table base address > >80 * >40 = >2000 > > r4 >00 Pattern descriptor table base address > >00 * >800 = >0000 > > r5 >36 Sprite attribute list base address > >36 * >80 = >1B00 > > r6 >07 Sprite descriptor table base address > >07 * >800 = >3800 > > r7 >07 default value > > > All of this should lead to VDP memory set up as follows: > > VDP Address Table Name Length > ----------- ---------- ------ > >0000 - >17FF Pattern descriptor table >1800 bytes > >1800 - >1AFF Screen image table >300 bytes > >1B00 - >1B7F Sprite attribute list >80 bytes > >1B80 - >1FFF free space >480 bytes > >2000 - >37FF Color table >1800 bytes > >3800 - >3BFF Sprite descriptor table >400 bytes > >3C00 - >3FFF free space >400 bytes Sean, the E/A manual is wrong, but the 1 page addendum explains many errors in it. Included is the correction for bit-map mode register settings. Pattern descriptor table: at >0000-17FF, r4 = >03 at >2000-37FF, r4 = >07 Color table: at >0000-17FF, r3 = >7F at >2000-37FF, r3 = >FF "Now why did TI do this?" you may ask. The simple explanation is that the bits in the registers correspond to video RAM address bits. Bit 2 (bit 5 in TI's big-endian numbering scheme) of r4 corresponds to the most significant bit of the video RAM address. Bit 7 (or TI's bit 0) of r3 corresponds to the most significant bit of the video RAM address as well. The value of the pattern descriptor table base address is the value in r4 of the meaningful bits shifted by 11 (or multiplied by 2048). The color table base address is the value in r3 of the meaningful bits shifted by 6 (or multiplied by 64). For bitmap mode, the meaningful bit of r4 gives a value of 0 or 4. Multiply by 2048 and you get 0 or 8192 (>0000 or >2000), respectively. The meaningful bit of r3 gives a value of 0 or 128. Multiply by 64 and you get 0 or 8192 (>0000 or >2000), respectively. Designing the TMS9918A (and V9938/V9958) this way simplifies the routing of the register values to address lines on the die. The other option would require routing different bits of r3 and r4 as the most significant bit of the video RAM address. The "unused" bits of r3 and r4 less significant than the used bits should be set to 1. This is so that the address lines these less significant bits correspond to do not have their values masked to 0. When you put >00 into r4, you were making A13, A12, and A11 of the pattern descriptor address always 0. This meant when the VDP was fetching >0000-07FF, it fetched the first 2048 bytes. Also, when the VDP was fetching >0800-0FFF, it was fetching >0000-07FF. Likewise with >1000-17FF. For the 9918A, the video address bits correspond to register bits as follows: r3 = A13 A12 A11 A10 A9 A8 A7 A6 r4 = 0 0 0 0 0 A13 A12 A11 Now you can do some weird things if you know that when you set one of the "unmeaningful" bits of r3 or r4 during bitmap mode to 0 you are in fact ANDing the corresponding address lines when said registers are used for a display fetch with 0, or effectively masking them to 0. So, you can cut the color table to 2048 bytes by setting A12 and A11 of r3 to 0, or putting the values >1F or >9F into it depending on where you want the base address to be. Using this undocumented functionality is what our good friend Eric Lafortune did in "Rock Runner" to get great graphic effects. I have also used this functionality to write a 64-column terminal emulator. With a full 6K pattern descriptor table, and 2K color table, there is 8K of video RAM left. This is enough to hold 8 screen image tables which can be quickly flipped for a scroll effect, with only the patterns for lines 7, 15, and 23 (new line) needing to be re-drawn in the pattern descriptor table. Of course, I could cut the color table down to 1K by masking an additional address bit (A10) to 0. In fact, I can cut it down to 64 bytes by making all of A12 to A6 bits in r3 to 0. Load all 64 bytes with the same two color code, such as >1F, and the entire screen will be black and white. However, just defining those 64 bytes is actually just defining the colors for 8 pixel lines of each 8 characters. Isn't this all very interesting? You can have a complete monochrome bitmap display with 6K for patterns, 64 bytes for colors, and 768 bytes for pattern position (screen image table). With the fast scroll, I was using in my 64x24 column terminal emulator eight separate screen image tables which must be put on 1K boundaries non-conflicting with pattern descriptor table or color table. The pattern descriptor table is put at >0000-17FF by loading r4 with >03. The color table is put at >2000-203F by loading r3 with >80. Two screen image tables are located at >1800-1AFF (r2=>06) and >1C00-1EFF (r2=>07). Six more can be located at >2400-26FF (r2=>09), >2800-2AFF (r2=>0A), >2C00-2EFF (r2=>0B), >3000-32FF (r2=>0C), >3400-36FF (r2=>0D), and >3800-3AFF (r2=>0E). To do the scroll takes some fairly complex programming, but setting up the eight screen image tables is a big and easy part of it. The first screen image table has >00-FF repeated three times. The second screen image table has >20-FF,>00-1F repeated three times. The third screen image table has >40-FF,>00-3F repeated three times. See the pattern? The eighth and last screen image table has >E0-FF,>00-DF repeated three times. The tricky part, and the part that slows the code down, is re-drawing the 8th, 16th, and 24th lines after a screen image table page flip. This is because the first line in the middle third of the screen must be scrolled to the last line of the top third of the screen. The first line of the last third of the screen must be scrolled to the last line middle third of the screen. The last line of the last third of the screen must be drawn over with the new line. Of course, I have written complex code to handle all this special scrolling. The 64 columns looks quite good with the right font. There is sufficient memory left of the 16K video RAM for disk I/O buffers and limited sprites. A TE can do without sprites (none in text mode TE's). There would be 256 bytes after each of the first seven alternate screen image tables. After the color table would be 960 contiguous bytes. After the eighth alternate screen image table would be 1280 contiguous bytes. A CALL FILES(2) equivalent would have room in that 1280 bytes to handle disk I/O. Jeff White p.s.: I typed this online in the VAX/VMS line editor, so any mistakes are not my fault. :^) -*- ============================================================================= DTIHM029 From: daven@vx.cis.umn.edu (David Nieters) Subject:v9938 Graphics 4 mode tutorial Part 1 Date: Fri, 2 Apr 1993 21:23:00 GMT Message-ID:<2APR199316233934@vx.cis.umn.edu> This is a tutorial for those of you with Geneves or 99/4A's with an 80 column (i.e. 9938) device attached to it. It is written for those who want to begin to learn how to use the more advanced featues of the V9938 that the 9918A does not offer. This is a tutorial on using the V9938 in Graphics 4 mode. In part 1, I will be explaining a program called LINES that was written for the 9918A processor to demonstrate it's graphic mode. This program came from TI with the Mini-Memory module. I will extend this program to use Graphics 4 mode. In later tutorials, we will try to increase the performance of this program using the V9938's build in commands. If there is sufficient interest, I will write parts two and three and post them as well. OVERVIEW OF GRAPHICS 4 MODE --------------------------- In Graphics 4 mode, there is no Pattern Generator Table like we have been used to in the 9918A. Instead, each pixel on the screen is controlled by a 4-bit color assignment in the Pattern Name Table. Therefore, each pixel can be one of 16 colors and each byte in the Pattern Name Table describes two pixels on the screen. The screen size is either 256 X 192 or 256 X 212 pixels depending on the LN bit of VDP register 9. Therefore, the Pattern Name Table will be 24,576 or 27,136 bytes respectively. The Pattern Name Table can be located in only four areas of memory. They are 0, >08000, >10000, >18000. The location is determined by Register #2. For this program, the Pattern Name Table will start at 0. OVERVIEW OF THE LINES PROGRAM ----------------------------- The lines program is in basically three parts. One part determines where the end points of each line will be. It then calls another part which draws a line between the end points. That part then calls another routine to plot each individual point. One pitfall that I encountered early on is addressing the VDP memory. The 9918A had a maximum of 16KB and therefore used only 14 bits to address all of it's memory. The 9918A has 128KB of memory, thus needing 17 bits to address all of its memory. When using the standard VDP memory routines (e.g. VSBW,VSBR,VMBW,VMBR), you can only access 16KB of memory. As we saw earlier, Graphics 4 mode uses over 24KB of memory. Before using the routines VSBW,VSBR,VMBW, and VMBR, you must make sure the three high order bits of the address are set in VDP register 14 first. Another problem I had was when writing repeatedly to VDPWD. Each time you write a byte of data, the VDP address gets incremented automatically. If you continually write past a 16KB boundry, R14 will get incremented so that the next time you make a call ro VSBW,VSBR,VMBW, or VMBR, it is acting on a different location in memory. Therefore, it is important to always write to VDP Register 14 before reading and writing VDP memory. Finally, it is important to set VDP Register 14 back to zero before exiting. If not, when the system is reset, it will begin to write in high areas of VDP memory and your title screen will not appear right without another reset. Now, on with the source code. If there are parts that are not clear, make a comment to me and I will try to clear it up in my next tutorial. REF VWTR,VSBW,VMBW,KSCAN,VSBR REF VDPWD,VDPWA,VDPSTA HEIGHT EQU 212 NUMBER OF LINES NUMLIN EQU 100 NUMBER OF LINES WE DRAW BEFORE ERASING SCREEN * CLEAR THE SCREEN * * THIS ROUTINE CLEARS THE SCREEN BY WRITING ZEROS IN THE * PATTERN NAME TABLE. WHEN DEALING WITH THE LARGER MEMORY * SPACE OF THE V9938, WE HAVE TO BE SURE THAT REGISTER #14 * IS CLEARED BEFORE WE START. OTHERWISE WE MIGHT BY ZEROING * OUT HIGHER AREAS OF MEMORY THAN WE WANT TO. * CLEAR LI R0,>0E00 RESET OUR VDP ADDRESS BLWP @VWTR LI R0,>0040 MOVB R0,@VDPWA SWPB R0 MOVB R0,@VDPWA LI R2,HEIGHT*128 WE WILL WRITE 24,576 ZEROS CLR R0 CLEAR1 MOVB R0,@VDPWD DEC R2 JNE CLEAR1 RT * RANDOM NUMBER GENERATOR * * THIS PROCEDURE RETURNS A (NOT SO) RANDOM NUMBER IN R1. * IT ENSURES THE RANDOM NUMBER WILL NOT BE 0. * RAND MOV @SEED,R1 RAND1 AI R1,>1D6B JEQ RAND1 MOV R1,@SEED RT SEED DATA >690A DX1 DATA 0 THESE LOCATIONS ARE USED TO STORE DX2 DATA 0 HOW FAR THE ENDPOINTS MOVE EACH DY1 DATA 0 TIME A LINE IS DRAWN DY2 DATA 0 * COLOR FLAG * * WHEN COLOR FLAG IS ZERO, THE LINES WILL APPEAR IN * DIFFERENT COLORS. WHEN IT IS NOT SET TO ZERO, ALL * LINES WILL BR DRAWN IN THE SAME COLOR. IT'S TOGGLED * BY PRESSING THE 'C' WHILE LINES ARE BEING DRAWN. * CFLAG DATA 0 * POINT * * POINT WILL TAKE AN X COORDINATE IN R0 AND A Y * COORDINATE IN R1 AND A COLOR IN R2 AND PLOT THAT * POINT ON THE SCREEN * POINT SLA R1,8 COMPUTE OFFSET IN PATTERN NAME TABLE A R1,R0 SRL R0,1 JOC POINT1 SEE IF LEFT HAND OR RIGHT HAND LI R3,>F000 MOV R2,R4 SLA R4,12 JMP POINT2 POINT1 LI R3,>0F00 MOV R2,R4 SLA R4,8 POINT2 MOV R0,R2 ANDI R0,>C000 WRITE UPPER 2 BITS OF ADDRESS SRL R0,14 TO VDP REGISTER 14 ORI R0,>0E00 BLWP @VWTR MOV R2,R0 ANDI R0,>3FFF BLWP @VSBR READ BYTE ALREADY THERE SZCB R3,R1 CLEAR OUT OLD COLOR SOCB R4,R1 PUT IN NEW COLOR BLWP @VSBW REWRITE OUT TO THE SCREEN RT * PLOT * * THIS ROUTINE PLOTS A LINE FROM (X1,Y1) TO (X2,Y2) * THESE COORDINATES ARE LOCATED IN THE CALLERS * REGISTERS R6,R7,R8 AND R9. THE COLOR IS * SPECIFIED IN THE CALLER'S R10. * PLOT DATA >8300 DATA PLOT1 PLOT1 CLR R12 LI R5,1 LI R6,1 MOV @16(R13),R7 MOV @12(R13),R9 S R9,R7 JLT PLOT11 JMP PLOT2 PLOT11 NEG R7 NEG R5 PLOT2 MOV R7,R7 JNE PLOT3 SETO R12 PLOT3 MOV @18(R13),R8 MOV @14(R13),R10 S R10,R8 JLT PLOT4 JMP PLOT5 PLOT4 NEG R6 NEG R8 PLOT5 MOV R9,R0 MOV R10,R1 MOV @10(R13),R2 GET COLOR BL @POINT C R9,@16(R13) JNE PLOT6 C R10,@18(R13) JNE PLOT6 RTWP PLOT6 MOV R12,R12 JLT PLOT7 A R5,R9 S R8,R12 JMP PLOT5 PLOT7 A R6,R10 A R7,R12 JMP PLOT5 * MAIN PROGRAM * START LWPI >8320 LI R2,VDPREG SET VDP REGISTERS L1 MOV *R2+,R0 JLT L2 BLWP @VWTR JMP L1 BL @CLEAR CLEAR THE SCREEN CLR @CFLAG CLR R3 R3 COUNTS THE NUMBER OF LINES WE HAVE DRAWN LI R6,>80 SET THE ENDPOINTS FOR OUR FIRST LINE LI R7,>60 LI R8,>D3 LI R9,>13 CLR R0 SET THE INITIAL AMOUNTS THE ENDPOINTS INCT R0 MOVE BY MOV R0,@DX1 INCT R0 MOV R0,@DY1 INCT R0 MOV R0,@DX2 INCT R0 MOV R0,@DY2 LOOP MOV @CFLAG,R0 JNE L5 BL @RAND PICK A RANDOM COLOR ANDI R1,>F MOV R1,R5 CI R5,2 MAKE SURE WE DON'T HAVE BLACK JHE L5 ORI R5,2 L5 A @DX1,R6 MOVE THE ENDPOINTS A @DY1,R7 A @DX2,R8 A @DY2,R9 * CHECK TO MAKE SURE THAT NO ENDPOINTS HAVE MOVED OFF * THE SCREEN. IF SO, REVERSE ITS DIRECTION. * MOV R6,R6 JLT L6 CI R6,>100 JLT L7 L6 NEG @DX1 A @DX1,R6 L7 MOV R8,R8 JLT L8 CI R8,>100 JLT L9 L8 NEG @DX2 A @DX2,R8 L9 MOV R7,R7 JLT L10 CI R7,HEIGHT JLT L11 L10 NEG @DY1 A @DY1,R7 L11 MOV R9,R9 JLT L12 CI R9,HEIGHT JLT L13 L12 NEG @DY2 A @DY2,R9 L13 BLWP @PLOT L14 CLR R0 CHECK TO SEE IF A KEY IS PRESSED MOVB R0,@>8374 BLWP @KSCAN MOVB @>8375,R0 MOVB @>837C,R1 JEQ L16 CI R0,>0500 CHECK FOR QUIT KEY JNE L15 B @QUIT L15 CI R0,>4300 CHECK FOR "C" KEY PRESSED JNE L14 INV @CFLAG TOGGLE THE COLOR FLAG L16 CI R0,>FF00 JNE L14 INC R3 CI R3,NUMLIN SEE IF WE HAVE MORE LINES TO DRAW JNE LOOP IF SO, GO BACK AND DRAW THEM CLR R3 LI R2,10 LI R4,>FFFF DLY DEC R4 WAIT A LITTLE BEFORE CLEARING THE SCREEN JNE DLY DEC R2 JNE DLY BL @RAND COMPUTE NEW RANDOM MOVEMENTS MOV R1,R1 JLT L17 ANDI R1,7 JMP L18 L17 ORI R1,>FFF8 L18 MOV R1,@DX2 BL @RAND MOV R1,R1 JLT L19 ANDI R1,7 JMP L20 L19 ORI R1,>FFF8 L20 MOV R1,@DY1 BL @RAND MOV R1,R1 JLT L21 ANDI R1,7 JMP L22 L21 ORI R1,>FFF8 L22 MOV R1,@DX1 BL @RAND MOV R1,R1 JLT L23 ANDI R1,7 JMP L24 L23 ORI R1,>FFF8 L24 MOV R1,@DY2 BL @CLEAR CLEAR SCREEN B @LOOP START OVER QUIT LI R2,REG2 RESTORE VDP REGISTERS BACK TO NORMAL QUIT1 MOV *R2+,R0 JLT QUIT2 BLWP @VWTR JMP QUIT1 QUIT2 LIMI 2 BLWP @0 * VDP REGISTERS TO SET VDP TO GRAPHICS 4 MODE * VDPREG DATA >0006 DATA >0160 DATA >021F LOCATE NAME TABLE AT ADDRESS 0 DATA >0711 SET BACKGROUND TO BLACK DATA >080A INHIBIT SPRITES DATA >0980 212 LINES DATA >FFFF * VDP REGISTERS WHEN WE EXIT * REG2 DATA >0000 DATA >0F00 DATA >01F0 DATA >0200 DATA >03FF DATA >0401 DATA >0560 DATA >0E00 DATA >FFFF END START ============================================================================= DTIHM030 In search of.... Leading Edge Connectors. by Dan H. Eicher A while back I was sourcing parts to finish a 99/8 P-Box interface card. For those of you who have looked at your cards, you may have noticed at one point or another certain cards having a black plastic edge connector. These are sort of rare. These connectors are called TI Leading Edge Connectors. They provide an alternative to just making and edge connector by printing traces on the bottom of the PCB. For a while TI was pushing these connectors on the electronics industry, of course these connectors never gained much popularity in the consumer market, because no one wanted to spend the few extra cents for quality goods. Note: These connectors are built to very high standards, they will survive many insert/extraction cycles and are designed to give maximum conductivity in a variety of situations. These connectors are also gold plated, as all good connectors should be. **** End of editorial **** Well I needed to buy one of these to finish my 99/8 interface card. Well after some calls to my local suppliers, Newark, Jameco ect... I came up empty..... Well after many MANY phone calls I got a hold of the TI division that makes these connectors. When I called six months ago, they were on the list to be obsoleted, but were still available. So if you want any of these connectors to repairs boards or place in your stock, you had better call now.... TI Part # L2111121-30 and the person to call is: Sue Rodgers 508.236.5375 Hope that this can save someone sometime! Dano L.D.O.M. 06.27.95 =========================================================================== DTIHM031 Modify the Rave Speech Card and MBP Card for use with the Geneve. by Beery Miller Item 7747642 94/05/05 23:20 From: BW.MILLER Beery W. Miller To: BW.MILLER Beery W. Miller COMP.SYS.TI.USENET@GATEKEEPER.DEC.COM@INET# Sub: To: Markus Kraemer Markus, here are the mods to the Rave Speech card and the MBP that permits full decoding of those cards to work with the Geneve. Any Geneve using one of those cards without these mods are subject to PROBLEMS, PROBLEMS, PROBLEMS. The mods for the Geneve compatibility is as follows: Solder pins 8 and pins 16 of a 74LS138 to pins 8 and 16 of 74LS138 on the card (this is for +5 volts and ground only, you may use another source if available), i.e. piggyback the chips. Now for the decoding mod that properly decodes the Rave Speech card and the MBP card for full Geneve Compatibility (these devices will only respond at page >BC) Cut the trace of pin 56 on the card near the bus connector Pins of 74LS138 _____________________________________________________________- 1 Connect to bus pin 46 2 Connect to bus pin 45 3 Connect to bus pin 48 4 Connect to bus side of bus pin 56 5 Connect to bus pin 8 6 Connect to bus pin 9 7 Connect to component side of bus pin 56 8 Connect to pin 8 of 74LS138 16 Connect to pin 16 of 74LS138 (pins 9 through 15 are left disconnected) These modifications are done at your own risk. You assume all responsibilty for performing these modifications. ========================================================================== DTIHM032 Here is the pin definition for the new Rave expansion box. For further information you can contact: RAVE 99 Co. Attn: John McDevitt 112 Rambling Road Vernon, CT 06066 (203)-871-7824 I have "transcribed" this information from the manual that comes with the Rave p-box. Any errors are my own. Hope this information helps. Dan H. Eicher Delphi: EICHER Looking into connector from the component side - pin 1 towards rear of chassis. ____ Plus 12 Volts Reg. +12V 2 = = 1 +12V Plus 12 Volts Reg. Ready A READY A 4 = = 3 GND Logic Ground Computer Reset RESET 6 = = 5 GND Logic Ground System Clock SCLK 8 = = 7 GND Logic Ground Audio AUDIO 10 = = 9 LCP CPU Indicator PCB Enable PCBEN 12 = = 11 RBDENA Remote Data Bus Control IAQ Hold A IAQHA 14 = = 13 HOLD CPU Hold Request Inter. Level B SENILB 16 = = 15 SENILA Inter. Level A Sense Enabl Load Interrupt LOAD 18 = = 17 INTA Inter. Level A Logic Ground GND 20 = = 19 D7 System Data Bit 7 System Data Bit 6 D6 22 = = 21 D5 System Data Bit 5 System Data Bit 4 D4 24 = = 23 D3 System Data Bit 3 System Data Bit 2 D2 26 = = 25 D1 System Data Bit 1 System Data Bit 0 D0 28 = = 27 GND Logic Ground System Address Bit 15 A15/CRU 30 = = 29 A14 System Address Bit 14 System Address Bit 13 A13 32 = = 31 A12 System Address Bit 12 System Address Bit 11 A11 34 = = 33 A10 System Address Bit 10 System Address Bit 09 A09 36 = = 35 A08 System Address Bit 08 System Address Bit 07 A07 38 = = 37 A06 System Address Bit 06 System Address Bit 05 A05 40 = = 39 A04 System Address Bit 04 System Address Bit 03 A03 42 = = 41 A02 System Address Bit 02 System Address Bit 01 A01 44 = = 43 A00 System Address Bit 00 System Address Bit A AMA 46 = = 45 AMB System Address Bit B System Address Bit C AMC 48 = = 47 GND Logic Ground CPU Clock CLKOUT 50 = = 49 GND Logic Ground DATA Bus Direction DBIN 52 = = 51 CRUCLK CRU Clock CPU Write Enable WE 54 = = 53 GND Logic Ground Memory Request MEMEN 56 = = 55 CRUIN CRU Input Data Minus 12 Volts Reg. -12V 58 = = 57 -12V Minus 12 Volts Reg. Plus 12 Volts Reg. +12V 60 = = 59 +12V Plus 12 Volts Reg. ---- ____ Plus 5 Volts Reg. +5v 2 = = 1 +5V Plus 5 Volts Reg. Minus 12 Volts Reg. -12v 4 = = 3 -12V Minus 12 Volts Reg. Sound Out Geneve SNDOUTG 6 = = 5 GENSEL Geneve/4A Select Line Key Lock Switch KEYLSW 8 = = 7 VIDOUTG Video Out Geneve Extra Bit #10 XB10 10 = = 9 XB9 Extra Bit #9 System Address Bit G AMG 12 = = 11 AMF System Address Bit F System Address Bit I AMI 14 = = 13 AMH System Address Bit H System Address Bit K AMK 16 = = 15 AMJ System Address Bit J System Address Bit M AMM 18 = = 17 AML System Address Bit L Logic Ground GND 20 = = 19 D15 System Data Bit 15 System Data Bit 14 D14 22 = = 21 D13 System Data Bit 13 System Data Bit 12 D12 24 = = 23 D11 System Data Bit 11 System Data Bit 10 D10 26 = = 25 D9 System Data Bit 09 System Data Bit 08 D8 28 = = 27 GND Logic Ground Keyboard Data Geneve KBDAT 30 = = 29 KBCLK Keyboard Clock Geneve Turbo Switch TURBO/SW32 = = 31 RESETSW Reset Switch Minus 5 Volts Reg. -5V 34 = = 33 -5V Minus 5 Volts Reg. Plus 12 Volts Reg. +12V 36 = = 35 +12V Plus 12 Volts Reg. ---- The following is an editors note: For comparision the max for the different voltage lines on a "typical" IBM type 200 watt switching power supply is: +5V 20A -5V 0.5A +12V 8A -12V 0.5A The "Standard" TI power supply has the following ratings (per the Bunyard Manual): .5 Amps per card slot is available from the +5V .25 " " " " " " " " +12V 50 ma " " " " " " " -12V These calculations include a debit for the internal disk drive from the power supplies total capability. ============================================================================== DTIHM033 TI-99/4 - THE EARLY DAYS by Chuck Neal Portland Users Ninety Niners Here is an interesting bit of TI history that came over the UNIX user net at work. I rearranged some of the material for clarity. The contributor of this article was Herbert H. Taylor of the David Sarnoff Research Center. It appears that he worked at Texas Instruments back in the late 1970's when the TI-99 "Was Happening." First you will find out what the "pack-man door" on your speech synthesizer is for (was for!). Next he talks about some mysterious "wireless peripherals" that the TI 99/4 almost had. Then the replacement of the 9985 microprocessor by the 9900 and the suggestion that there are a lot more intersting stories waiting to be told! The last part of the article goes into the history of the RF modulator. In the early days you had to hook your TI into a television set, and television sets don't have audio and video inputs - they have radio frequency inputs. (Except for some of the new ones). So the RF modulator is like a miniature TV broadcasting station, broadcasting on channel 3. SPEECH SYNTHESIZER The plug-in port on the speech module was intended to expand the number of permanent words of vocabulary as in Speak-N-Spell. When TE-II worked better than expected, TI lost interest in expansion modules. It is possible that only the first few thousand speech modules have the "hooks" for those modules. I own several vintage speech modules and they all have the hooks, but I never got any plug-in modules and I designed the interface...(Please, no questions, it's been 11 years!) WIRELESS PERIPHERALS Another historical note: the first few thousand orginal 99/4's had a hidden plug in slot on the top flat surface ( under the metal overlay) for an IR ( Infer-Red ) remote control transmitter/receiver about the size of a Kodak Instamatic. This device supported a number of never introduced wireless peripherals - including a wireless "super" keyboard and joystick. The wireless peripherals were supported on the systems shown at the June 1979 CES show in Chicago. Ten minutes before the introductory press conference, we were told "...not to show the peripherals..." In any event I am fairly certain the software support for these peripherals was left in GROM - at least until the switch to the 99/4A, which included the new (actually the "original") keyboard. These peripherals were never introduced because TI thought that they were too expensive for a Home Computer with an intended 1979 price of uner $100. (When Apple was $2000) When the price "skyrocketed" to $1000, it was supposedly "too late" to bring out the wireless peripherals. The price increase was due to the complete failure of the cheap TMS9985 microprocessor orginally designed into the 99/4. This resulted in changing over to a very expensive goldlead ceramic packaged TMS9900, a TTL clock driver, a 256 byte static RAM, and a ton of TTL glue logic. (The true story of how the 9900 ended up in the 99/4 would rival General Hospital!) VIDEO MODULATOR Also the first few hundred units had the "hooks" to bring in external video and genlock the TMS9918 - a capability which even today is not generally found in personal computers. This was removed from the connector (despite its less than $1.00 cost in parts) because at the time of the 99/4 introduction, the interface had not been tested sufficiently and there was still too much unvertainty about the FCC implications of genlocking a class 1 TV device. Remember at the time (1979), any TV game or computer that had an RF modulator had to pass very strict FCC testing. The 99/4 orginally had a built-in RF modulator, which was removed shortly before the June 1979 CES show when the decision was made to package the 99/4 with the Zenith color monitor. In 1978 we built 200 prototype 99/4's with built-in RF modulators and a 9900 "emulation" of the 9985 on a 9"x4" board sandwhiched onto the original PWB and crammed into the orginal 99/4 tooled case. These 200 units were given to TI executives and board members to play with for six months. I have a wire-wrapped proto type with one of the few 9985's ever produced, but I would be interested in acquiring any of the 200 prototypes which might be existant. Everyone was quite shocked when the FCC ruled in TI's favor. That ruling distinguished personal computers from video games. The decision to remove the RF modulator from the console was initiated when the FCC agreed to test a fiber optic interface we had developed. This optically coupled the computer console with a standalone RF modulator. This interface was dubbed the "video light pipe". After the system was sent to the FCC they returned in UNTESTED, stating that they could not accept petitions for rule making to modify existing rules. The rest is history. L.D.O.M. 11.25.94 ============================================================================== DTIHM034 9900,9901,9902,9904 by Definitions by Dan Eicher ___ ___ VBB 01 =| U |= 64 HOLD - * Note Pins with a - before or VCC 02 =| |= 63 MEMEN - after them represent active WAIT 03 =| T |= 62 READY lows. -LOAD 04 =| M |= 61 WE HOLDA 05 =| S |= 60 CRUCLK -RESET 06 =| |= 59 VCC IAQ 07 =| 9 |= 58 NC u1 08 =| 9 |= 57 NC u2 09 =| 0 |= 56 D15 A14 10 =| 0 |= 55 D14 A13 11 =| |= 54 D13 A12 12 =| |= 53 D12 A11 13 =| |= 52 D11 A10 14 =| |= 51 D10 A09 15 =| |= 50 D09 A08 16 =| |= 49 D08 A07 17 =| |= 48 D07 A06 18 =| |= 47 D06 A05 19 =| |= 46 D05 A04 20 =| |= 45 D04 A03 21 =| |= 44 D03 A02 22 =| |= 43 D02 A01 23 =| |= 42 D01 A00 24 =| |= 41 D00 u4 25 =| |= 40 VSS VSS 26 =| |= 39 NC VDD 27 =| |= 38 NC u3 28 =| |= 37 NC DBIN 29 =| |= 36 IC0 CRUOUT 30 =| |= 35 IC1 CRUIN 31 =| |= 34 IC2 -INTREQ 32 =|_____|= 33 IC3 ___ ___ RST1 01 =| U |= 40 VCC CRUOUT 02 =| |= 39 S0 CRUCLK 03 =| T |= 38 P0 CRUIN 04 =| M |= 37 P1 -CE 05 =| S |= 36 S1 -INT6 06 =| |= 35 S2 -INT5 07 =| 9 |= 34 -INT7/+P15 -INT4 08 =| 9 |= 33 -INT8/+P14 -INT3 09 =| 0 |= 32 -INT9/+P13 -u 10 =| 1 |= 31 -INT10/+P12 INTREQ 11 =| |= 30 -INT11/+P11 IC3 12 =| |= 29 -INT10/+P10 IC2 13 =| |= 28 -INT09/+P09 IC1 14 =| |= 27 -INT08/+P08 IC0 15 =| |= 26 P2 VSS 16 =| |= 25 S3 -INT1 17 =| |= 24 S4 -INT2 18 =| |= 23 -INT15/+P7 P6 19 =| |= 22 P3 P5 20 =| |= 21 P4 ------- ___ ___ -INT 01 =| U |= 18 VCC Note: This chip can be replaced with XOUT 02 =| T |= 17 -CE a 9903. The 9903 is identical RIN 03 =| M |= 16 -u except it also includes the CRUIN 04 =| S |= 15 CRUCLK ability to handle sync. commun- -RTS 05 =| |= 14 S0 ication. -CTS 06 =| 9 |= 13 S1 -DSR 07 =| 9 |= 12 S2 CRUOUT 08 =| 0 |= 11 S3 VSS 09 =| 2 |= 10 S4 ------- ___ ___ TANK1 01 =| U |= 20 VCC Note: This chip is also called a TANK2 02 =| T |= 19 XTAL2 74LS GND1 03 =| M |= 18 XTAL1 FFQ 04 =| S |= 17 OSCIN FFD 05 =| |= 16 OSCOUT u4 TTL 06 =| 9 |= 15 TTL u2 u3 TTL 07 =| 9 |= 14 TTL u3 u3 08 =| 0 |= 13 VDD u4 09 =| 4 |= 12 u1 GND 10 =| |= 11 u2 ------- ============================================================================= DTIHM035 Console Connectors by Thierry Norspikel From: Thierry Nouspikel Subject: Re: Article. In-reply-to: <01ICOTL7T8WY973IFF@delphi.com> CASSETTE TAPE FORMAT Name # of bytes Content ---------------------------- File sync 768 >00 Data mark 1 >FF Size 1 # of records Repeat size 1 dito Rec sync 8 >00 } Data mark 1 >FF } Rec 1 Data 64 data bytes } Checksum 1 sum of the 64 data bytes } Repeat rec 1 Rec 2 Repeat rec 2 etc. Bits are encoded by output level CHANGES. With a 3 MHz console, clock ticks toggle output every 725.3 microseconds. To encode a 1 invert the output in the middle of this time period. This results in frequencies of 689.37 Hz for a space (0) and 1379 Hz for a mark (1) which is well within the audio range, thus suitable for a tape player. 0 _1 _0_ 1_ Bits to encode !___! !_! !_! !_ Output (low/high) c c c c c Clock intervals NB: Upon writing, the timing is ensured by loading >0011 into the clock register of the TMS9901 chip. The resulting delay is 17 / (3MHz/64)=363.6 usec Upon reading, the stretches of zeros are used to time the tape recorder and this value is fed into the TMS9901 for further reading. ------------------------------------------------------------------------------- WHAT'S THE PINOUT OF THE ..... CONNECTOR ? Replace the ..... with: Joystick port, Cassette port, Main power port, Monitor port, Cartridge port, Peripheral port, Keyboard connector (internal) or Card slots (in PE box). These informations have been extracted from: TI-99/4A Console and Peripheral Expansion System Technical Data a very usefull handbook published by TI in 1983, with many informations, timing diagrams, console schematics, etc. ___________ Joystick port: ( 1 2 3 4 5 ) ============= \ 6 7 8 9 / # I/O Use \_______/ ----------- 1 not used 2 > Test joystick 2 3 < Up 4 < Fire button pressed 5 < Left 6 not used 7 > Test joystick 1 8 < Down 9 < Right ___________ cassette port: ( 1 2 3 4 5 ) ============== \ 6 7 8 9 / # I/O Use \_______/ ----------- 1 > Cass 1 motor control (CRU bit 22) 2 > Dito (neg) 3 > Output to tape 2 (CRU bit 25) 4 > Audio gate (CRU bit 24) 5 > Output to tape 2 (neg) 6 > Cass 2 motor control (CRU bit 23) 7 > Dito (neg) 8 < Input from tape 1 or 2 (CRU bit 27) 9 < Dito (neg) N.B. Cassette 1 can't be written to. Power port: =========== _________ Inside console (regulated) : < 1 2 3 4 | --------- # Volts -------- 1 -5 2 +12 3 GND 4 +5 The pinouts for the external plug look like this: >___ ___> >--1 (red) )!( 2 )!( 2 )!( 0 )!(---> >--2 (white) V )!( ~ )!( >___)!(___> >--4 (black) transformer >--3 (nc) NB: for US users replace 220V with 110V The AC values on pins 1, 2 and 4 appear to vary according to the model of transformer. Thus I did not idicate them here. Monitor port: 3 U 1 (This is a round plug, with a notch U at top) ============= 5 4 # Use 2 ------ 1 12V vid 2 R-Y (color burst clock) 3 Sound output 4 Y 5 B-Y (external video input?) U GND Cartridge port: =============== ______________________________________________________________ | 2 36 | | [====================] | |_______________________________________1__________________35__| |___|___|___|___|___|___|___|___|___|_| | |_____|___|___|___|___|___|___|___|___| | |___|___|___|___|___|___|___|___|_____| | |_____|___|___|___|___|___|___|___|___| | |___|___|__________________|___|______|________________________| # Name I/O Use - ---- --- ----------- 1 RESET < Resets the system (active high) 2 GND Signal groud 3 D7 <> Data bus, bit 7 (least significant) 4 CRUCLK* > Inversion of TMS9900 CRUCLOCK pin 5 D6 <> 6 CRUIN < CRU input to TMS9900 7 D5 <> 8 A15 > Address bus, bit 15 / also CRU output bit 9 D4 <> 10 A13 > 11 D3 <> 12 A12 > 13 D2 <> 14 A11 > 15 D1 <> 16 A10 > 17 D0 <> Data bus, bit 0 (most significant) 18 A9 > 19 VCC +5 Volts power supply 20 A8 > 21 GS* > Grom select. Active low is addr in >9800-9FFF 22 A7 > 23 A14 > Address bus, bit 14. Select mode: low=data / high=addr 24 A3 > 25 DBIN > Active high = read memory 26 A6 > 27 GRC > GROM clock: color burst of VDP 9918A 28 A5 > 29 VDD -5 Volts power supply 30 A4 > 31 GR < Active high = GROM ready 32 WE* > Active low = write enable (derived from TMS9900 WE*) 33 VSS 34 ROMG* > Active low if addr in >6000-7FFF 35 GND 36 GND Side port: (peripheral connector) ========== __________________________ / | / | ____________________________/ 2 44 | / [================] | / 1 43 | |__________________________________________________________| # Name I/O Use - ---- --- ----------- 1 VCC +5 Volts power supply 2 SBE > Low if addr in >9000-94xx (sound port) 3 RESET* > System reset (active low) 4 EXTINT* < External interrupt (active low) 5 A5 > Address bus, bit 5 6 A10 > 7 A4 > 8 A11 > 9 DBIN > Active high = read memory 10 A3 > 11 A12 > 12 READY < Active high = memory is ready 13 LOAD* < Unmaskable interrupt (=> BLWP @>FFFC) 14 A8 > 15 A13 > 16 A14 > 17 A7 > 18 A9 > 19 A15 > Address bus, lsb. Also CRU output bit. 20 A2 > 21 GND 22 CRUCLK* > Inversion of TMS9900 CRUCLOCK pin 23 GND 24 PHI3* > Inversion of phase 3 clock 25 GND 26 WE* > Write Enable (derived from TMS9900 WE* pin) 27 GND 28 MBE* > Active low if addr in >4000-5FFF (card ROMs) 29 A6 > 30 A1 > 31 A0 > Address bus, bit 0 (most significant) 32 MEMEN* > Memory access enable (active low) 33 CRUIN < CRU input bit to TMS9900 34 D7 <> Data bus, bit 7 (least significant) 35 D4 <> 36 D6 <> 37 D0 <> Data bus, bit 0 (most significant) 38 D5 <> 39 D2 <> 40 D1 <> 41 IAQ > Interrupt acknowledged by TMS9900 42 D3 <> 43 VDD -5 Volts power supply 44 AUDIOIN < To sound generator AUDIO IN pin Keyboard connector: (inside the console) Red wire is #15 =================== pin| 12 13 14 15 9 8 6 ---+------------------------------------------------------------- 5 | = . , M N / 4 | space L K J H ; 1 | enter O I U Y P 2 | 9 8 7 6 0 7 | fctn 2 3 4 5 1 lock 3 | shift S D F G A 10 | ctrl W E R T Q 11 | X C V B Z Note: pressing a key closes the contact between corresponding row + column. Since there are no diodes to prevent current going backwards, pressing 3 keys at a time often results in appearance of a "phantom" key at the 4th corner of the square formed by these keys (e.g 8+7+3=phantom 4: current goes pin15-7-8-3-pin7 as if 4 were pressed) Card slots: (inside the PE box) =========== 59 Left 1 Front ===================== Rear 60 Right 2 # Name I/O Use - ---- --- ----------- 1 +5V 3-T regulator voltage supply (about +8V) 2 Dito 3 GND 4 READYA System ready (10K pull-up to +5V) 5 GND 6 RESET* > System reset (active low) 7 GND 8 SCLK nc System clock (not connected) 9 LCP* nc CPU indicator 1=TI99 0=2nd generation (not connected) 10 AUDIO < Input audio (=AUDIOIN) 11 RDBENA* < Active low: enable flex cable data bus drivers (1K pull-up) 12 PCBEN H PCB enable for burn-in (always High) 13 HOLD* H Active low CPU hold request (always High) 14 IAQHA nc IAQ [or] HOLDA (logical or) 15 SENILA* H Interrupt level A sense enable (always High) 16 SENILB* H Interrupt level B sense enable (always High) 17 INTA* < Active low interrupt level A (=EXTINT*) 18 LOAD* nc Unmaskable interrupt (not connected) 19 D7 <> Data bus, bit 7 (least significant) 20 GND 21 D5 <> 22 D6 <> 23 D3 <> 24 D4 <> 25 D1 <> 26 D2 <> 27 GND 28 D0 <> Data bus, bit 0 (most significant) 29 A14 > 30 A15 > Address bus, lsb. Also CRU output bit. 31 A12 > 32 A13 > 33 A10 > 34 A11 > 35 A8 > 36 A9 > 37 A6 > 38 A7 > 39 A4 > 40 A5 > 41 A2 > 42 A3 > 43 A0 > Address but, bit 0 (most significant) 44 A1 > 45 AMB H Extra address bit. Always High. 46 AMA H Extra address bit. Always High. 47 GND 48 AMC H Extra address bit. Always High. 49 GND 50 CLKOUT* > Inversion of phase 3 clock (=PHI3*) 51 CRUCLK* > Inversion of TMS9900 CRUCLOCK pin 52 DBIN > Active high = read memory 53 GND 54 WE* > Write Enable (derived from TMS9900 WE* pin) 55 CRUIN < CRU input bit to TMS9900 56 MEMEN* > Memory access enable (active low) 57 -12 Volts 3-T regulator supply voltage (about -16V) 58 Dito 59 +12 Volts 3-T regulator supply voltage (about +16V) 60 Dito Notes: o Signals buffered by 74LS244 in connection card: A0-A15, DBIN, MEMEN*, WE*, CLRCLK*, RESET*, CLKOUT. o Unbuffered signals: CRUIN, INTA*, AUDIOIN, READY o Data bus is buffered by two 74LS245 (one at each end of the cable), driven by RDBENA (direction set by DBIN). o All signals must be re-buffered on each card. o Always High lines (AMA, AMB, AMC, SENILA*, SENILB*, PCBEN, HOLD*) are pulled up to +5 Volts by 47 Ohms resistors. o Connection card light is turned on by DBIN (High = on). Thierry Nouspikel, MD, PhD | "Un technocrate c'est un mec, Department of Biological Sciences | tu lui poses une question, Stanford University | quand il a fini de repondre Phone: 1 415 723 2425 | tu comprends plus ta question". Fax: 1 415 725 1848 | Michel Colucci, dit "Coluche" Email: thierry.nouspikel@stanford.edu | ============================================================================ DTIHM036 How to adapt Atari joystick to work on the TI. Author Unknown TI Joystick pins Atari Joystick Pins -- -------- ---- ----- -------- ---- 1) N.C. ------------1) Up S 2) Stick B--| | ----------2) Down t Ground | | | --------3) Left i 3) Up-----------+ | | --4) Right c 4) Fire---------|-|-|-| | 5) N.C. k Button | | | | +-----6) Fire btn 5) Left---------|-|-+ | | 7) N.C. B 6) N.C. |---|-|-|-|---|-8) Ground 7) Stick A--------------- | 9) N.C. Ground | | | | | | 8) Down-------- --|-|-|-|-|-1) Up S More? 9) Right---| |---+-|-|-|-|-2) Down t ---------+-------3) Left i [Female] | | --4) Right c | | 5) N.C. k --|---6) Fire btn | 7) N.C. A ----8) Ground 9) N.C. ============================================================================ DTIHM037 GRAND RAM Technical Specifications Last Update: August 14, 1987 GRAND RAM TECHNICAL DATA INTRODUCTION SECTION 1 The GRAND RAM card is designed to provide as many features as possible, while still keeping the cost reasonable. GRAND RAM provides the following features: 1. 512K bytes of battery-backed CMOS memory for RAM Disk, print spooling, text editing. The memory is expandable in increments of 32K bytes, using 256K bit static RAM chips (32K X 8 ). All memories are socketed, so no soldering is required for the full 512K capability. 2. Optional real-time clock allows time-stamping of files, clock access from BASIC, X-BASIC, assembly. 3. Two expansion ports, each with different capabilities: a. The Cartridge Emulator Port (CEP) provides all the signals required to support an add-on board which will emulate 99% of the cartridges in existence. The add-on board plugs into the 46 pin, dual-row, .025" square post header mounted on the GRAND RAM card. b. The Device Expansion Port (DEP) provides all the signals required to implement a variety of novel peripherals for the 99/4A, including: multiple channel music boards, A/D D/A capability with digital echo and reverberation, temperature logging, home control, etc. The device port add-on boards will plug into a 38 pin, dual-row, .025" square post header on the GRAND RAM card. 4. The technical specifications for these expansion ports are provided. GRAND RAM provides a great opportunity for hobbyists to do their own hardware projects. Most of the bus interface and decode circuitry is already provided by GRAND RAM, which makes device interfacing very simple. 5. A Programmable Interrupt Timer, which provides the capability for print spooling, hot keys (with the proper software), as well as providing programmable timing pulses to the Device Expansion Port. 6. Hardware Write Protect feature reduces the chances of a runaway program trashing the DSR. Designed by Sofmachine Inc. 1-1 Copyright 1987 DataBioTics GRAND RAM TECHNICAL DATA GRAND RAM Architecture SECTION 2 All memories and devices are accessed through the DSR address space of the 99/4A, which is the 8K block from >4000 to >5FFF, and the CRU space. The CRU base address is dependent upon some DIP switch settings. Some of the CRU bits are used to control access to the memory and memory-mapped I/O devices. The 512K RAM memory is accessed in 2K pages. 1. CRU Base Address for GRAND RAM - Setting the DIP Switches Switches 1, 2, and 3 of the 4-section DIP switch are used to determine the CRU address at which GRAND RAM responds. Any one of seven CRU addresses may be selected. Since the disk controller card uses the CRU slot at >1100 and the RS232 card uses the slot at >1300, these addresses are not available for GRAND RAM. The following table details the CRU addresses for all switch settings. DIP Switch/CRU Address Chart --------------------------------------------- | SW1 SW2 SW3 | CRU Address | --------------------------------------------- | ON ON ON | >1000 | | ON ON OFF | >1200 | | ON OFF ON | >1400 | | ON OFF OFF | >1500 | | OFF ON ON | >1600 | | OFF ON OFF | >1700 | | OFF OFF ON | >1800 | | OFF OFF OFF | GRAND RAM DISABLED | --------------------------------------------- 2. CRU Bits for Memory Control In order to access the DSR memory address space, the first CRU bit (CRUBIT0) in the GRAND RAM's CRU space must be set to a 1. The second CRU bit (CRUBIT1) is the Write Protect bit (1=Write Protected), which dissallows all writes to the memory space of GRAND RAM. The memory- mapped I/O devices are accessed at locations >4F00 - >4FFF. In order to access these mem-mapped I/O devices, the third CRU bit (CRUBIT2) must set to zero. If CRUBIT2 = 1, then memory is present at >4F00 - >4FFF. Designed by Sofmachine Inc. 2-1 Copyright 1987 DataBioTics GRAND RAM TECHNICAL DATA GRAND RAM Architecture 3. RAM Memory Access Mapping The first two 2K blocks of GRAND RAM memory (4K total) are permanently mapped into the first 4K bytes of the DSR space (>4000 - >4FFF). However, the 256-byte RAM block from >4F00 to >4FFF and the I/O devices are swapped in and out using CRUBIT2 as described above. The second 4K bytes of DSR memory space (>5000 - >5FFF) are used to access selected blocks of GRAND RAM memory. This second 4K space is split in half: the first memory space starts at >5000 and the second at >5800. The specific blocks of GRAND RAM memory which are mapped into these two address spaces are defined by two 8-bit, write-only, page registers. This "dual-window" architecture allows two different blocks of GRAND RAM memory to be accessed without banking. 4. Onboard I/O Device Mapping There are only four active I/O device locations on the GRAND RAM board. Two are the write-only memory page registers (discussed above) and the remaining two are the read and write locations for the real-time clock. The address and function of each device location is described below, as well as the required value of CRUBIT0 thru CRUBIT2 when accessing these devices. CRU I/O Map Address CRUBIT0 CRUBIT1 CRUBIT2 Function ----------------------------------------------------------------------- >4FE0 1 0 0 Selects which 2K page of GRAND RAM memory is mapped into the address space from >5000 to >57FF. >4FE2 1 0 0 Selects which 2K page of GRAND RAM memory is mapped into the address space from >5800 to >5fFF. >4FE4 1 0 0 Write to the Real-time Clock >4FE6 1 0 X Read from the Real-time Clock 5. TMS9901 Interval Timer I/O Peripheral The TMS9901 is a peripheral designed specifically for the 9900 family of microprocessors, and contains: 16 general-purpose I/O lines, 6 interrupt lines (also usable simply as input lines), a timer with 21.3 uS resolution and interrupt capability. The 9901 occupies 32 bits of CRU space, starting at the CRU base selected by the GRAND RAM DIP switches. IMPORTANT NOTE TO ALL PROGRAMMERS AND DEVELOPERS: the CRU bit addresses have been modified slightly such that the top and bottom halves of the 9901 CRU bit mappings have been swapped. This means that the I/O bits start at CRU bit 0 and the clock/interrupt bits start at CRU bit 16. This was done so that the first I/O bit could be used to enable/disable GRAND RAM and still be compatible with the 99/4A DSR lookup protocol, which uses CRU bit 0 to enable or disable a given DSR memory space. Due to the sophisticated nature of the 9901, a full discussion of it's capabilities is beyond the scope of this document. The reader desiring this information should refer to the TMS9901 Programmable Systems Interface booklet, or the 9900 Family Systems Design handbook, both published by Texas Instruments. Designed by Sofmachine Inc. 2-2 Copyright 1987 DataBioTics GRAND RAM TECHNICAL DATA GRAND RAM Architecture 6. Real-time Clock Access The clock chip which is compatible with GRAND RAM is the Dallas Semiconductor DS1215. Access to the chip is through the clock read and write addresses, specified above. The clock is accessed through a 1-bit interface which is connected to the most significant bit, DB7, of the buffered P-box data bus. Timekeeping features include: time resolution of timekeeping. For complete programming information, consult the DS1215 data sheet. 7. Interrupts GRAND RAM provides full interrupt capability, controlled by the TMS9901. There are two possible sources of interrupts: a. The 9901 Interval Timer can be programmed to interrupt on level 3. If the interval Timer interrupt is enabled, the INT3 line is disabled. b. The six external interrupt pins which are connected to the Device Expansion Port may cause an interrupt if the proper option board is attached. The interrupt 1 input (-INT1) has an onboard pullup resistor. All interrupt control is as described in the TMS9901 manual, with the exception of one extra level of hardware masking. No interrupts will occur on the 99/4A PEB bus unless CRUBIT3 is set to a zero. This allows the interval timer to be used as a precisely controlled hardware strobe for option boards connected to the Device Expansion Port, without actually generating an interrupt to the CPU. After power-up CRUBIT3 is set high, thus disabling 9901 interrupts to the CPU until explicitly enabled by the software. Designed by Sofmachine Inc. 2-3 Copyright 1987 DataBioTics GRAND RAM TECHNICAL DATA Hardware Design SECTION 3 The hardware to implement GRAND RAM is very modular. All IC's perform one or memory, multiplexer, register, miscellaneous logic. 1. Buffering Initially, the address, control, and data lines from the peripheral bus are buffered by 74LS244 (Address Control) and 74LS245 (Data) bus driver chips. 2. Miscellaneous Logic To ensure that addresses are stable when MEMEN is asserted, the leading edge of MEMEN is synchronously delayed for approximately 135 nS. This is accopmplished with an inverter (74LS05), and a D flip-flop (74LS74) which is clocked by the phase 3- bus clock. 3. Decoding/PALs A delayed version of MEMEN (described earlier) and the buffered control and address lines are the inputs to the two PALS. These PALs provide the signals required for controlling GRAND RAM. The following signals and functions are provided by the PALs: a. Clock strobes for the two 8-bit memory page registers. b. Output enable strobes for the two 8-bit memory page registers. c. Enable strobe for the two 74LS138 memory chip select decoders. d. Chip select for RAM chip #0. e. Chip select for the Real-time clock chip. f. Chip select for the TMS9901 peripheral chip. g. Multiplex control for >4000 - >4FFF RAM access. h. Protected Write Enable for RAMs. i. Local data bus enable control. j. Buffered tri-state remote data bus enable. k. Pre-decoded GRAM signal for future cartridge emulation. l. Pre-decoded Expansion I/O strobe (-EXPIO). 4. Page Registers The two page registers are implemented with octal, edge-clocked latches with tri-state outputs (74LS374). The register output enable controls are used to select which page register is addressing the GRAND RAM memory, thus providing a zero-chip multiplexing function. 5. Special Functions The TMS9901 peripheral interface is straitforward, except for the transposed top and bottom internal mapping. This is implemented by inverting the most significant address line (BA10) to the 9901. The real-time clock chip is mapped so that no unprogrammed accesses can occur, which is a hazard due to the 9900 read-before-write bus timing. Designed by Sofmachine Inc. 3-1 Copyright 1987 DataBioTics GRAND RAM TECHNICAL DATA Hardware Design 6. Memory The memory chips are 32K X 8 SRAMs, and are connected to a fully buffered bus. Also, the chip select and write enable lines are pulled up during power down to minimize standby power consumption. Chip select decoding is provided by two 74LS138 decoders. During any accesses to GRAND RAM at addresses >4000->4FFF, the first 4K of RAM chip #0 will always be selected. Half of a 74LS244 buffer is used to force the address to the first 4K of a memory chip, and the PAL always selects RAM chip #0 during accesses to >4000->4FFFF. During accesses to >5000-57FF, page register #0 addresses both the RAMs and chip select decoders, causing the appropriate 2K page to be selected. Accesses to >5800->5FFF cause page register #1 to select a 2K page, in the same manner as page register #0. 7. Power Supply Grand Ram contains two seperate power busses. The first, the logic power bus, supplies power to all the TTL and PAL chips. The RAMs and clock chip recieve power from the memory power bus. The memory power bus must supply power when the P-box is turned off. Diode D3 disconnects the memory power bus from the rest of the system during power-down, assuring minimal current drain from the battery. When the P-box is powered up, D3 and R4 provide a trickle charging network for the battery. The three regulator shunt resistors, R5-R7, supply some of the regulated 5 volt logic current, thereby reducing the power (heat) dissipated in the regulator. A voltage divider, composed of R2, R3, and C2, supplies the appropriate backup voltage to the clock chip. 8. Cartridge Emulator Port The design goal for the Cartridge Emulator Port (CEP) is to provide all the signals required to operate a cartridge. The Cartridge Emulator, an optional daughterboard which plugs into the CEP, will function as a loadable cartridge port. With the proper software installed in GRAND RAM, cartridges could be loaded from RAMdisk or floppy disk into the Cartridge Emulator and executed, without ever having a cartridge plugged into the console! A menu of the user's favorite cartridges could be displayed automatically after the TI99/4A is turned on. This would allow the user to select a particular cartridge with a single keypress. The Cartridge Emulator Port provides the following support: a. Four 8K-blocks of memory, which are banked into the cartridge CPU address space from >6000->7fff. Some of the TMS9901 I/O lines are used for controlling the which 8K block is selected. The banking architecture supports ame 99% of the existing cartridges. b. 64K of GRAM, partitioned at the console/cartridge address boundary. This allows for independent control of both console and cartridge grom emulation. Designed by Sofmachine Inc. 3-2 Copyright 1987 DataBioTics GRAND RAM TECHNICAL DATA Hardware Design Cartridge Emulator Port (CEP ) Connector Definition Pin # Name Type Function/Definition --------------------------------------------------------------- 1,2 +U8V PWR Unregulated 8 volt power input 3-10 BD7-BD0 I/O Buffered Data bus. DB7 is Least sig bit 11-26 BA15-BA0 Out Buffered Address Bus. BA15 is least sig bit 27 -BMEMEN Out Buffered and reclocked P-box -MEMEN (active low) 28 -BWE Out Buffered P-box -WE (active low write enable) 29 -LCLDBEN In LoCaL Data Bus ENable (active low). When active, this causes the data bus drivers to be turned on. Drive this line with an open-collecter source. 30 -BDBIN Out Buffered, active low, version of P-box DBIN 31 -ABC Out Active (low) when P-box extended memory bits A, B, and C are all equal to 1. 32 -GRAMSEL Out Active (low) whenever an access occurs in the grom space (>9800->9FFF). 34 CRUBIT4 Out =0 enable gram emulation for console groms (>0000->5FFF) =1 disable emulation for console groms 33 CRUBIT5 Out =0 enable gram emulation for cartridge groms (>6000->FFFF) =1 disable emulation for cartridge groms 36 CRUBIT6 Out =0 enable writes to emulation gram =1 disable writes to emulation gram 35 CRUBIT7 Out =0 enable emulation of cartidge rom/ram memory from >6000->7FFF. =1 disable emulation of cartridge rom/ram memory 38 CRUBIT8 Out =0 CRUBIT9 pages in the upper or lower 8K block for emulation of cartridge rom/ram. Used when loading up a cartridge, or developing new applications. =1 the value of Address bit 14 during the last write to cartridge ram/rom selects the upper or lower 8K block of emulation rom/ram. This maintains compatibility with existing cartridges. 37 CRUBIT9 Out =0 selects the lower 8K block (out of 16K) =1 selects the upper 8K block (out of 16K) 40 CRUBIT10 Out =0 selects the lower 16K block (out of 32K) =1 selects the upper 16K block (out of 32K) This bit, along with either CRUBIT9 or the latched value of BA14, form a page address, which selects of the four 8K blocks from the available 32K of emulation ram. 39 CRUBIT11 Out =0 enable writes to cartridge emulation ram/rom at addresses >6000 - >6FFF. (for ram emulation) =1 disable writes to cartridge emulation ram/rom at addresses >6000 - >6FFF. (for rom emulation) 42 CRUBIT12 Out =0 enable writes to cartridge emulation ram/rom Sofmachine, Inc. 3-4 GRAND RAM TECHNICAL DATA Hardware Design at addresses >7000 - >7FFF. (for ram emulation) =1 disable writes to cartridge emulation ram/rom at addresses >7000 - >7FFF. (for rom emulation) 41 N/C No connection 43,44 GROUND PWR Ground for power and signals 45,45 N/C No connection 9. Device Expansion Port The design goal for the Device Expansion Port (DEP) is to provide all the signals required for a general purpose I/O expansion capability. The DEP provides the following features: a. 224 bytes of predecoded memory-mapped I/O space with an active low polarity. b. Three CRU single bit I/O ports. c. Five interrupt inputs, which are also usable as single CRU inputs bits/ d. Access to the audio input of the 99/4A sound chip. This allows add-on boards to output their sound through the normal 99/4A audio channel, in the same fashion as the speech peripheral. Sofmachine, Inc. 3-5 GRAND RAM TECHNICAL DATA Hardware Design Device Expansion Port (DEP ) Connector Definition Pin # Name Type Function/Definition --------------------------------------------------------------- 1,2 +U8V PWR Unregulated 8 volt power input 3-10 BD7-BD0 I/O Buffered Data bus. DB7 is Least sig bit 11-18 BA15-BA8 Out Partial Buffered Address Bus. BA15 is least sig bit 19 -EXPIO Out Active (low) when an address access in the range of >4F00 - >4FDF, and the proper CRU bits are set up. See the memory map for required CRU values to activate this signal. 20 -BWE Out Buffered P-box -WE (active low write enable) 21 -PH3 Out Buffered 3 MHz negaged phase 3 P-box signal 22 -BDBIN Out Buffered, active low, version of P-box DBIN 23 READY In Ready to the 99/4A processor. To extend a memory cycle, drive this line low with an open-collector output. 24 -INT1 In Active low interrupt input to the TMS9901 INT1 input. This line is pulled up to +5V with a resistor on the GRAND RAM board. 26 -INT9901 Out Active low interrupt output from the TMS9901 With proper software, this output can be programmed to supply a pulse at a rate determined by the 9901 interval timer. This would be useful as a very stable and controllable sample pulse for A/D and D/A converters, etc. 25 CRUBIT13 I/O General-purpose CRU I/O bit 28 CRUBIT14 I/O General-purpose CRU I/O bit 27 CRUBIT15 I/O General-purpose CRU I/O bit 29 AUDIO In External audio input to console sound chip 30 -INT2 In Interrupt or general purpose input 32 -INT4 In Interrupt or general purpose input 31 -INT5 In Interrupt or general purpose input 34 -INT6 In Interrupt or general purpose input 33 N/C No Connection 35,36 GND PWR Ground for power and signals 37,38 N/C No connection Sofmachine, Inc. 3-6 GRAND RAM TECHNICAL DATA Hardware Design MEMORY MAP +--------------------+--------------------+ | CRUBIT0 = 1 | CRUBIT0 = 1 | | CRUBIT2 = 0 | CRUBIT2 = 1 | |--------------------+--------------------| >4000| | | RAM PAGE 0 | >47FF| | |--------------------|--------------------| >4800| | | RAM PAGE 1 | >4EFF| | |--------------------|--------------------| >4F00| | | | EXPANSION | | | PORT I/O | | >4FDF| | | |--------------------| | >4FEO| PAGE REGISTER #0 | | |--------------------| | >4FE1| UNUSED | | |--------------------| | >4FE2| PAGE REGISTER #1 | | |--------------------| | >4FE3| UNUSED | | |--------------------| | >4FE4| CLOCK WRITE | RAM PAGE 1 | |--------------------| | >4FE5| UNUSED | | |--------------------| | >4FE6| CLOCK READ | | |--------------------| | >4FE7| UNUSED | | |--------------------| | >4FE8| >4FE0 - >4FE7 | | | is mirrored in | | | in this space | | >4FFF| | | |--------------------|--------------------| >5000| | | RAM PAGE SELECTED BY | | PAGE REGISTER #0 | >57FF| | |-----------------------------------------| >5800| | | RAM PAGE SELECTED BY | | PAGE REGISTER #1 | >5FFF| | |-----------------------------------------| Sofmachine, Inc. 3-7 ============================================================================ DTIHM038 THE PAL12L6 OF THE MYARC FLOPPY DISK CONTROLLER @Paolo Bagnaresi, February 1990 - % - THE PAL12L6 OF THE MYARC FLOPPY DISK CONTROLLER =============================================== Author: Paolo Bagnaresi Via J.F. Kennedy 17 20097 San Donato Milanese Italy Date: February 10, 1990 Disclaimer: although this document has been written to the best of my knowledge, it may be unaccurate or misleading. It is also unknown to me if the Myarc program burned inside the PAL has been copyrighted. If it has, you may not be allowed to use this document to duplicate the Myarc FDC PAL and usage or distributing of this document may be prohibited by the law. In any case, the informations provided by this document have been entirely worked out without assistance or help from Myarc. Purpose of this document ------------------------ This document will explain the usage of the PAL12L6 chip (National Semiconductor, Monolithic Memories, etc.) located inside the Myarc FDC. The PAL12L6 is a 20 pin, 12 dedicated inputs, 6 combinatorial outputs, Programmable Array Logic. Input pins are pins # 1,2,3,4,5,6,7,8,9,11,12,19. Output pins are pins # 13,14,15,16,17,18. This PAL acts as a "glue logic" inside the Myarc FDC. It has been used by Myarc to enable the following devices inside the FDC: 1) 74LS259 when a CRU OUT cycle the CRU address range >1100 - >11FF was executed 2) 74LS251 when a CRU IN cycle the CRU address range >1100 - >11FF was executed 3) 2764 Eprom when a Memory cycle in the address range >4000 - >4FFF was executed 4) 2024 Static Ram when a Memory cycle in the address range >5000 - >57FF was executed 5) WD1770 Read/Write Registers when a Memory cycle in the address range >5F00 - >5FFF was executed First off, I will describe how the PAL has been programmed. Then, the fuse blowing layout will be translated into a more understandable circuit layout and the suitable explanations will be given. The following SPRINT XPLOT listing has been obtained by analysing the PAL12L6 of Myarc Floppy Disk Controller by the "SPRINT PAL Programmer". Inspection was possible since Myarc did not blow the Security Fuse on the PAL after programming. The SPRINT XPLOT listing has been provided by Roberto Maffioletti, Via Magellano 8, 24040 Stezzano, Bergamo, Italy. I would like to thank Roberto for his invaluable help. *------------------------------------------------------------ SPRINT XPLOT listing of device N.S. DMPAL12L6 file 0000 0000 0011 1111 1111 2222 2222 2233 term pin 0123 4567 8901 2345 6789 0123 4567 8901 8 18 -XX- X--X -X -X -X -X ---X --X- 9 XXXX XXXX XX XX XX XX XXXX XXXX 10 XXXX XXXX XX XX XX XX XXXX XXXX 11 XXXX XXXX XX XX XX XX XXXX XXXX 16 17 X-X- X--X X- X- X- -X X--- X--X 17 XXXX XXXX XX XX XX XX XXXX XXXX 24 16 -XX- X--X -X -X -X -X ---- --X- 25 XXXX XXXX XX XX XX XX XXXX XXXX 32 15 ---- ---X X- -- -- -X ---- X--X 33 XXXX XXXX XX XX XX XX XXXX XXXX 40 14 ---- X--X X- -X -- -X ---- X--X 41 XXXX XXXX XX XX XX XX XXXX XXXX 48 13 ---- -X-X X- -- -- -X ---- X--X 49 XXXX XXXX XX XX XX XX XXXX XXXX 50 XXXX XXXX XX XX XX XX XXXX XXXX 51 XXXX XXXX XX XX XX XX XXXX XXXX Note: X = Fuse not blown - = Fuse blown *------------------------------------------------------------ Now, from the above SPRINT XPLOT listing you can easily build back the Fuse Link Map by marking an "X" on the logic diagram of the PAL12L6 (the diagram has not provided with this document, since its complexity far exceeds the drawing capabilities of TI-Writer). Please refer to the National Semiconductor "PROGRAMMABLE LOGIC DEVICES, Databook and Design Guide", for the PAL12L6 Fuse Link Map Diagram. From the so otained diagram, we will try to describe to what input pin each output pin in the PAL is connected. In the following drawing, the AND gate is represented as such I ---------|\ Note: the "-----0|" means n --------0| \ that the input p ---------| )-- Output signal is negated u ---------| / before being used t ---------|/ by the PAL array. Also, the OR gate is represented as such: \ \ Input --)>---- Output Input --)>0---- Negated Output / / ============================================================= PAL PIN 18 ---------- Line Input AND OR Output Output Name Pin Pin Description A07_B--------------1---|\ To G* (pin 14 A06_B--------------2--0| \ Chip Enable) A03----------------3---| \ of U10 A01----------------4---| \ 74LS259. A04_B--------------5--0| \ \ A05_B--------------6--0| )--)>0---Pin # 18 A00----------------7--0| / / MEMEN*------------11---| / CRUCLK------------12---| / A02---------------19---| / Address Lines decode -------------------- Address Line # 0123 4567 Weight 8421 8421 Address value 0001 0001 Hex Addr. value >11xx Output pin purpose ------------------ Sees if a CRU OUT data bit is aimed to the FDC card. CRU OUT data bit coming from 9900 are accepted by the card if : a) Address is >11xx in the Address Lines b) MEMEN* is HIGH (inactive) c) CRUCLK* is LOW (active) ============================================================= PAL PIN 17 ---------- Line Input AND OR Output Output Name Pin Pin Description A07_B--------------1---|\ To CS* (pin 1 A06_B--------------2---| \ Chip Enable) A03----------------3---| \ of U6 WD1770 A01----------------4---| \ Floppy Disk A04_B--------------5---| \ \ Controller. A05_B--------------6---| )--)>0---Pin # 17 A00----------------7--0| / / A15_B_CRU_OUT------8---| / CRU_BIT_ZERO_ON----9---| / MEMEN*------------11--0| / A02---------------19--0|/ Address Lines decode -------------------- Address Line # 0123 4567 Weight 8421 8421 Address value 0101 1111 Hex Addr. value >5Fxx Output pin purpose ------------------ Sees if a memory cycle (Memory Read/Write) is aimed to the Read/Write Registers of WD1770 chip (Floppy Disk controller) in the FDC card. Condition is true if: a) Address is >5Fxx in the Address Lines b) Address is also ODD (not EVEN) c) MEMEN* is LOW (active) d) The card has been already opened. That is, if the CRU BIT ZERO at Base >1100 has been already turned to ON state. ============================================================= PAL PIN 16 ---------- Line Input AND OR Output Output Name Pin Pin Description A07_B--------------1---|\ To STROBE A06_B--------------2--0| \ (Pin 7) of A03----------------3---| \ U5 74LS251 A01----------------4--0| \ Data Selector A04_B--------------5--0| \ \ A05_B--------------6--0| )--)>0---Pin # 16 A00----------------7--0| / / MEMEN*------------11---| / A02---------------19--0| / | / |/ Address Lines decode -------------------- Address Line # 0123 4567 Weight 8421 8421 Address value 0001 0001 Hex Addr. value >11xx Output pin purpose ------------------ Sees if a CRU IN cycle is aimed to the FDC card. Enables sending CRU data bit from the Myarc FDC card to the 9900, through the CRUIN data line, if: a) Address is >11xx in the Address Lines b) MEMEN* is HIGH (inactive) Note: in the Myarc FDC card, the CRUIN cycle decoding is equal to the CRUOUT cycle decoding. This means that during a CRUOUT cycle in the >11xx CRU address range the U5 74LS251 is selected anyway and a DATA BIT is sent to the 9900 as if CRUIN cycle had been executed. However, this approach does no harm since the the CRUIN line is a dedicated line and the 9900 simply ignores the bit value being presented on the CRUIN line during a CRUOUT cycle. ============================================================= PAL PIN 15 ---------- Line Input AND OR Output Output Name Pin Pin Description A01----------------4---|\ To RDBENA* Bus A00----------------7--0| \ \ Pin in the PEB CRU_BIT_ZERO_ON----9---| )--)>0---Pin # 15 MEMEN*------------11--0| / / A02---------------19--0|/ Address Lines decode -------------------- Address Line # 012 Weight 842 Address value 010 Hex Addr. value >4xxx - >5xxx Output pin purpose ------------------ Sees if a memory cycle is aimed to the FDC card. Asserts REMOTE DATA BUS ENABLE (RDBENA*) to its active state (LOW) if: a) Address is in the range >4xxx - >5xxx b) MEMEN* is LOW (active) c) The card has been already opened. That is, if the CRU BIT ZERO at Base >1100 has been already turned to ON state. ============================================================= PAL PIN 14 ---------- Line Input AND OR Output Output Name Pin Pin Description A03----------------3---|\ To CE* (pin A01----------------4---| \ 18, Chip A04_B--------------5--0| \ \ Enable) of A00----------------7--0| )--)>0---Pin # 14 U2 2016 CRU_BIT_ZERO_ON----9---| / / Static Ram MEMEN*------------11--0| / (2 Kbytes) A02---------------19--0|/ Address Lines decode -------------------- Address Line # 0123 4 Weight 8421 8 Address value 0101 0 Hex Addr. value >50xx - >57xx Output pin purpose ------------------ Sees if a memory cycle is aimed to the 2 K Static Ram in FDC card. Enables the 2 K Static Ram in the address range >50xx - >57xx if: a) Address is in the range >50xx - >57xx b) MEMEN* is LOW (active) c) The card has been already opened. That is, if the CRU BIT ZERO at Base >1100 has been already turned to ON state. ============================================================= PAL PIN 13 ---------- Line Input AND OR Output Output Name Pin Pin Description |\ A03----------------3--0| \ To CE* (pin A01----------------4---| \ \ 20, Chip A00----------------7--0| )--)>0---Pin # 13 U3 2764 CRU_BIT_ZERO_ON----9---| / / Eprom MEMEN*------------11--0| / (8 Kbytes) A02---------------19--0|/ Address Lines decode -------------------- Address Line # 0123 Weight 8421 Address value 0100 Hex Addr. value >4xxx Output pin purpose ------------------ Sees if a memory cycle is aimed to the 8 K Eprom in FDC card. Enables the 8 K Eprom in the address range >4xxx if: a) Address is in the range >4000 - >4FFF b) MEMEN* is LOW (active) c) The card has been already opened. That is, if the CRU BIT ZERO at Base >1100 has been already turned to ON state. Note: The Eprom is logically divided into two banks, each being 4 KBytes long and each residing in the address range >4000 - >4FFF. When the Eprom is accessed, which Eprom bank will be paged-in depends on the state of CRU OUT Bit # 3, which has also another function: it enables the Double Density when reading/writing from/to Floppy Disk. This particular hardware arrangements creates a problem: the software residing in the Eprom cannot directly turn on/off the Single/Double Density. If it does, the other Eprom bank may get turned on and the microprocessor would start executing the code residing in the other side of the Eprom. The problem is software solved by relocating a short portion of code in the Scratch Pad area (>8300 - >83FF) just prior to accessing the Floppy Disk Drive. Then, execution will be transfered to this code relocated in the Scratch Pad area. The selected density can be safely enabled and, after the transfer from/to the Floppy Disk has been carried out, the density pertaining to the Eprom bank being used will be restored to its previous state. Eventually, a return to the original Eprom bank will be performed. Also, it's worth noting that the code relocation to the Scratch Pad area ensures a 16 bit fast execution, as opposed to the 8 bit/wait state/8 bit slow execution that would take place for code executing from inside the Eprom. * Filename : MYARC-FDC1 - Actual code example is on files 80T-INIT-A thru D **************************************************************************** * MYARC DISK CONTROLLER CRU INFORMATIONS ******************************************************************************** Paolo Bagnaresi Via Kennedy 17 20097 San donato Milanese ITALY - Phone (02)-514.202 ******************************************************************************** The following informations are accurate and to the best of my knowledge. However, you should not assume they are free from errors. I will gladly accept any correction that you will send to my address. Please feel free to contact me on this matter. I am trying to share informations on this subject in the hope of receiving some feed back from other users: I would like to know YOUR PERSONAL EXPERIENCES. PLEASE WRITE ME BACK. ******************************************************************************** The MYARC Disk Controller (from now on MDC) is a card to be fitted in the PEB. It provides DS/DD diskette formatting and some other useful routines. This doc deals primarily with the CRU arrangement onf the MDC, that is somehow different from TI, ATRONIC and CORCOMP disk Controller. The MDC has usually a CRU base address of >1100. Inside, the MDC you can see, among the other chips: - 1 EPROM 4164 (8 Kbytes) - 1 2 Kbyte Ram. - 1 WD 1770 Disk controller The EPROM is banked into two 4 k portions. Each portion is addressed between >4000 and >4FFF. CRU Address >1100 turns on the first bank. Additionally, CRU address >1106 turns on the second bank. The 2 K Ram is addressed from >5000 to >57FF. Addresses between >5800 - >5EFF are unused. Adresses between >5F00 and >5FFF are reserved for I/O mapping (WD 1770 gates, see below). Banking the 4 K Eprom will not affect the Ram. Thus, the Ram can be "seen" from both Eprom banks. This is very convenient. The Ram is used to keep informations relevant to drive usage and to save part of the Scracth pad. Also, the Ram will act as temporary Buffer, for a read from disk. The usage of WD 1770 chip (28 pins) is fully described in the WESTERN DIGITAL "1986 Storage Management Products Handbook". This is the address of Western Digital: WESTERN DIGITAL CORPORATION 2445 McCabe Way Irvine, CA 92714, USA Phone (714)-863.0102. TWX 910-595-1139 GATES (HARDWARE MAPPED GATES TO DISK CONTROLLER) ================================================ These are special CPU RAM addresses that act as a gate to and from the disk controller WD 1770. They are 8 bits gates (a full byte). Please refer to the Western Digital Manual (see above) for a full description on how to use these gates. In the following range of addresses, only odd byte addresses between >5F01 and >5F07 are fully decoded; other odd address are the copy of odd addresses between >5F01 and >5F07: thus, >5F09 should act as >5F01. The even addresses on the same range are without effect. >5F01 = READ : STATUS REGISTER. = WRITE : COMMAND REGISTER. >5F03 = WRITE : CURRENT TRACK ADDRESS. >5F05 = WRITE : NEEDED SECTOR REGISTER. See a note below. >5F07 = READ : READ DATA GATE = WRITE : WRITE DATA GATE In the following descrition the CRU BASE is assumed to be >1100. All SBO, SBZ, TB, LDCR, STCR will have >1100 as a CRU BASE. TB INSTRUCTIONS (Test Bit istructions) ====================================== CRU BASE + 0 = TB 0 : COMMAND COMPLETED TEST. After issuing a Command to >5F01, COMMAND REGISTER GATE, you may want to check if the command has already been performed . This will avoid issuing a new command before completion of the current command. The TB will return 1 if Command has been completed, 0 if not completed. Example: TB 0 JEQ DONE CRU BASE + 2 = TB 1 : DATA REQUEST READY TEST. When reading or writing data to the >5F07 READ/WRITE DATA GATE, some time may elapse before the data is processed by the WD 1770 chip. By checking this CRU BIT you will know when a new data is ready to be processed. If a 1 is returned, then the gate is READY to process a new data. If a 0 is returned, the gate is not ready. Example: TB 1 JEQ READY CRU BASE + 4 = TB 2 : VERIFY HARD DISABLED if set to ZERO. Myarc suggests to run a jumper, inside the Myarc Disk Controller, between pin # 2 of U5 [a 74LS251] and ground to disable VERIFY after a write. The means for the software to detected if this jumper has been run is a TB 2. The only time this bit is tested is after a Write Sector. Example : TB 2 JNE DISABL (Jump if Verify is DISABLed) BASE + 6 = TB 3 : ?? unknown. Apparently is never used. CRU BASE + 8 = TB 4 : DRIVE # 4 80 TRACK DIP-SWITCH SELECTED TEST. This CRU Bit reflects the condition of the internal Dip-Switch # 4, relative to drive # 4 (can be either on ON or on OFF position). It returns 1 if the dip-switch is OFF, 0 if the dip-switch is ON. The dip-switch has to be turned on if the corresponding drive is an 80 track drive (such as TEAC FD 55 F). Please note that this CRU BIT depends only on the position of the corresponding Dip-Switch: it is not capable of really detecting the kind of drive connected. In other words, it is entirely possible that user has a 40 track drive and by mistake turned on the dip-switch: then the softwre will act as if an 80 track is connected .... with all the problem you can easily imagine. Example : TB 4 JNE TRAK80 jump if DIP-SWITCH is OFF. CRU BASE + 10 = TB 5 : DRIVE # 3 80 TRACK DIP-SWITCH SELECTED TEST. This CRU bit reflects the condition of the internal Dip-Switch # 3, relative to drive # 3 (can be either on ON or on OFF position). It returns 1 if the dip-switch is OFF, 0 if the dip-switch is ON. See explanations for TB 4. Example: TB 5 JNE TRAK80 jump if DIP-SWITCH is OFF. CRU BASE + 12 = TB 6 : DRIVE # 2 80 TRACK DIP-SWITCH SELECTED TEST. This CRU bit reflects the condition of the internal Dip-Switch # 2, relative to drive # 2 (can be either on ON or on OFF position). It returns 1 if the dip-switch is OFF, 0 if the dip-switch is ON. See explanations for TB 4. Example: TB 6 JNE TRAK80 jump if DIP-SWITCH is OFF. CRU BASE + 14 = TB 7 : DRIVE # 1 80 TRACK DIP-SWITCH SELECTED TEST. This CRU bit reflects the condition of the internal Dip-Switch # 1, relative to drive # 1 (can be either on ON or on OFF position). It returns 1 if the dip-switch is OFF, 0 if the dip-switch is ON. See explanations for TB 4. Example: TB 7 JNE TRAK80 jump if DIP-SWITCH is OFF. SBO, SBZ INSTRUCTIONS (Set cru Bit to One, Set cru Bit to Zero) =============================================================== CRU BASE + 0 = SBO 0 : ENABLE MYARC DSR CARD SBZ 0 : DISABLE MYARC DSR CARD CRU BASE + 2 = SBO 1 : ?? (may be WD 1770 Chip Enable) SBZ 1 : ?? ( " " " " Chip Disable) CRU BASE + 4 = SBO 2 : ENABLE SECOND SIDE OF MAGNETIC HEAD SBZ 2 : ENABLE FIRST SIDE OF MAGNETIC HEAD CRU BASE + 6 = SBO 3 : ENABLE SINGLE DENSITY AND BANK 2 OF EPROM MEMORY ADDRESSES BETWEEN >4000 AND >4FFF. SBZ 3 : ENABLE DOUBLE DENSITY AND BANK 1 BETWEEN >4000 AND >4FFF. CRU BASE + 8 = SBO 4 : ENABLE DRIVE # 1 SBZ 4 : DISABLE DRIVE # 1 CRU BASE + 10 = SBO 5 : ENABLE DRIVE # 2 SBZ 5 : DISABLE DRIVE # 2 CRU BASE + 12 = SBO 6 : ENABLE DRIVE # 3 SBZ 6 : DISABLE DRIVE # 3 CRU BASE + 14 = SBO 7 : ENABLE DRIVE # 4 SBZ 7 : DISABLE DRIVE # 4 >5F05 GATE (HARDWARE MAPPED SECTOR GATE TO DISK CONTROLLER) =========================================================== The sector # to write to disk Gate is the sector # relative to the track (INTERNAL SECTOR #). When a diskette is initialized, each track contains several sectors (they span from 0 up to either 9 or 18, depending on the density you are using). So, in each track, the sector # is numbered from 0 up to 18. When accessing a LOGICAL sector number, say sector LOGICAL SECTOR # 70, you have to compute the corrisponding TRACK # and INTERNAL SECTOR #. For instance, if the diskette has been initialized to 18 sectors, then LOGICAL SECTOR 70 is = TRACK # 3 (Integer of 70/18) = INTERNAL SECTOR 16 (Remainder of 70/18) Thus, you will write 16 to the >5F05 SECTOR GATE and 3 to the >5F03 TRACK GATE. INTERNAL RAM ORGANIZATION ========================= As said above, the 2 K RAM inside the MDC (>5000 - >57FF) it is used to store information relevant to Disk Management. The following map is a partial description of the use of this RAM. Further infos are needed to complete the map. Please help! >5000 - >501F = Workspace used by Sector READ/WRITE and Disk FORMATTING. >5020 - >508B = Save SCRATCH PAD HIGH AREA (>6C bytes from >8394 through >83FE). >508C - >50AE = Subprogram or Program invoked by the DSRLNK. Here will be stored the Subprogram you call (Ex. >0111 for a Disk Formatting routine), or a full PAB description if you call a Program (>0500,>1000,>0000,>2100,>000A,'DSK1.UTIL1' for a LOAD MEMORY IMAGE PROGRAM of a file 'UTIL1' from Drive 1). >50AF - = Byte: # of maximum RETRY during a READ/WRITE sector. It is initialized to 5 upon entering the READ/WRITE sector routine. The Read/Write Sector software will enable retrying 5 times before issuing error when accessing a sector. A LOST DATA during a read or a write sector will not modify this value (you still have 5 more chances). After a Write Sector error, Sector Zero of the diskette is read. If a new error is issued after reading sector Zero, then DENSITY value is changed and sector Zero is accessed again. This DENSITY swapping and reding Sector ZERO is continued until either sector zero is read succesfully, or RETRY times remains greater than ZERO. After that, a final error is issued to the routine that called the READ/WRITE sector.. On the other hand, if Sector Zero is read succesfully, then the original assigned sector is accessed again. A new error will restart the ZERO READ SECTOR PROCEDURE. >50B0 - >50B1 = Drive # accessed (at >50B1). Usually >50B0 is zero. >50B2 = Byte: if 0 then SECTOR ZERO doesn't need to be updated. If different from zero, then SECTOR ZERO needs updating. >50B3 = Byte: Drive # previously accessed. After computer RESET is always zero. >50B4 - >50B5 = unknown *----- DISKETTE TYPE INFORMATION AREA ---------------------------------------* *----- DRIVE 1 -----* >50B6 - >50B7 = Word: Drive 1 Maximum # of sector/disk. This value is taken from sector ZERO, offset >10, of the diskette you are using. It is always updated whenever you access sector ZERO. It will be: >0168 for 360 sectors >0280 " 640 " >02D0 " 720 " >0500 " 1280 " >05A0 " 1400 " >0A00 " 2560 " >0B40 " 2880 " >50B8 = Byte: Flag for Drive # 1 when an 80 Track Drive is used with a 40 track diskette. If the Most Significant Bit of this byte is set to 1, then the drive is an 80 track drive, but the diskette is a 40 track diskette. In other words, this bit flag enables double step of magnetic head in read a write operations. >50B9 = Byte: Drive 1 SECTOR/TRACK. Usually is either >09 (Single Density, or >10 (Double Density 16 Sector/Track) or >12 (Double Density 18 Sector/Track). *----- DRIVE 2 -----* >50BA - >50BB = Word: Drive 2 Maximum # of sector/disk. This value is taken from sector ZERO, offset >10, of the diskette you are using. It is always updated whenever you access sector ZERO. It will be: >0168 for 360 sectors >0280 " 640 " >02D0 " 720 " >0500 " 1280 " >05A0 " 1400 " >0A00 " 2560 " >0B40 " 2880 " >50BC = Byte: Flag for Drive # 2 when an 80 Track Drive is used with a 40 track diskette. If the Most Significant Bit of this byte is set to 1, then the drive is an 80 track drive, but the diskette is a 40 track diskette. In other words, this bit flag enables double step of magnetic head in read a write operations. >50BD = Byte: Drive 2 SECTOR/TRACK. Usually is either >09 (Single Density, or >10 (Double Density 16 Sector/Track) or >12 (Double Density 18 Sector/Track). *----- DRIVE 3 -----* >50BE - >50BF = Word: Drive 3 Maximum # of sector/disk. This value is taken from sector ZERO, offset >10, of the diskette you are using. It is always updated whenever you access sector ZERO. It will be: >0168 for 360 sectors >0280 " 640 " >02D0 " 720 " >0500 " 1280 " >05A0 " 1400 " >0A00 " 2560 " >0B40 " 2880 " >50C0 = Byte: Flag for Drive # 3 when an 80 Track Drive is used with a 40 track diskette. If the Most Significant Bit of this byte is set to 1, then the drive is an 80 track drive, but the diskette is a 40 track diskette. In other words, this bit flag enables double step of magnetic head in read a write operations. >50C1 = Byte: Drive 3 SECTOR/TRACK. Usually is either >09 (Single Density, or >10 (Double Density 16 Sector/Track) or >12 (Double Density 18 Sector/Track). *----- DRIVE 4 -----* >50C2 - >50C3 = Word: Drive 4 Maximum # of sector/disk. This value is taken from sector ZERO, offset >10, of the diskette you are using. It is always updated whenever you access sector ZERO. It will be: >0168 for 360 sectors >0280 " 640 " >02D0 " 720 " >0500 " 1280 " >05A0 " 1400 " >0A00 " 2560 " >0B40 " 2880 " >50C4 = Byte: Flag for Drive # 4 when an 80 Track Drive is used with a 40 track diskette. If the Most Significant Bit of this byte is set to 1, then the drive is an 80 track drive, but the diskette is a 40 track diskette. In other words, this bit flag enables double step of magnetic head in read a write operations. >50C5 = Byte: Drive 4 SECTOR/TRACK. Usually is either >09 (Single Density, or >10 (Double Density 16 Sector/Track) or >12 (Double Density 18 Sector/Track). *------ LAST TRACK ACCESSED >50C6 = Byte: Last track accessed of Drive # 1 >50C7 = Byte: " " " of Drive # 2 >50C8 = Byte: " " " of Drive # 3 >50C9 = Byte: " " " of Drive # 4 *-----------------------------------------------------------------------------* >50CA = Word: DSRLNK (or EPROM bank 1) RETURN ADDRESS >50CC = Byte: Flag. If ZERO, the the diskette has been previously accessed. If different from ZERO, then the diskette is handled as if it was never been accessed previously: therefore Sector zero is Read and the DISKETTE TYPE INFORMATION AREA is updated. Also, this byte is <>0 after a Read/Write sector error. >50CD = Byte: Flag. HARD VERIFY DISABLED. It reflects the condition of CRU bit 2 after a TB (TB 2). If ZERO, then VERIFY is ENABLED. PLEASE NOTE THAT A VERIFY IN MYARC DC ONLY IMPLIES READING BACK THE GIVEN SECTOR (to >4000 EPROM, a "deaf" area!). No match between the diskette sector content and the BUFFER area is ever performed This, in my opinion, is a strange approach. Myarc approach is entirely different from TI and CORCOMP, that do allow checking of the written sector against the BUFFER content. The Myarc Verify is based only on CRC, LOST DATA, SECTOR NOT FOUND ERRORS. It does not ensure that all the bytes you have passed to the diskette have been really written on the diskette. If, by any means, you bump into an hardware or software failure AND a different sector is accessed, NO ERROR IS EVER REPORTED! If the >50CD byte is different from ZERO, then VERIFY is disabled. >50CE = Byte: Flag. If ZERO, then the Read/Write sector and Initialize routnes will use the VPD RAM BUFFER. If different from ZERO, then the same routines will use a CPU RAM BUFFER (pointed, as usual, by the sane address in the FAC area. This way is faster than having to deal with VPD buffer. >50CF - = Byte: # of maximum files you can open from Basic or Assembler. It is the # of Files you want to allow with a CALL FILES from Basic. Paolo Bagnaresi, Via J.F. Kennedy 17, San Donato Milanese, Italy ~- % ~- File name : MYARC-FDC2 Stored on disk TECH-NOTES * Filename : MYARC-FDC2 - Actual code example is on files 80T-INIT-A thru D **************************************************************************** * MYARC DISK CONTROLLER INFORMATIONS ******************************************************************************** Paolo Bagnaresi Via Kennedy 17 20097 San donato Milanese ITALY - Phone (02)-514.202 ******************************************************************************** INTERNAL RAM ORGANIZATION (follows from previous file) ========================= >50D0 - >51CF = >100 bytes taken from sector ZERO of the diskette last accessed. This is the standard layout of sector ZERO. >50D0 - >50D9 = 10 bytes: DISKNAME, padded to the right with blancks. >50DA - >50DB = Total sector/disk: >0168 for 360 sectors >0280 " 640 " >02D0 " 720 " >0500 " 1280 " >05A0 " 1400 " >0A00 " 2560 " >0B40 " 2880 " >50DC = Byte: Sector/Track. - >09 = 9 (Single Density) - >10 = 16 (Double Density Myarc) - >12 = 18 (Double Density Myarc or CorComp). >50DD - >50DF = 3 Bytes: 'DSK' identifier. >50E0 = Byte: Disk Proprietary Protection >20 -> Not protected, >50 Protected. >50E1 = Byte: Track/Side. Usually either >28 (40 Track) or >50 (80 Track). >50E2 = Byte: Disk Side. >01 Single Side, >02 Double Side. >50E3 = Byte: Disk Density. >01 Single Density, >02 Double Density. >50E4 - >5107 = All >0000. Reserved area. >5018 ..>51CF = Used sector bit map. The actual lenght depends on a side/density factor. There are: >2D (45) bytes for Single Side/Single Dens. ( 9 Sector/Track) >5A (90) " " Double " / " " ( 9 " / " ) >5A (90) " " Single " /Double " (18 " / " ) >A0 (160) " " Double " / " " (16 " / " ) >B4 (180) " " " " / " " (18 " / " ) DISK BUFFERING AREA: The last FILE CONTROL BLOCK # available is always used before the others. ******************* 1st FILE CONTROL BLOCK= >108 bytes: 8 bytes for description, >100 bytes sector ------------------------------------------------------------------------------- >50D0 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when the file is closed. >51D1 = Byte: Drive # used, real number. It will be zeroed when the file is closed. >51D2 - >52D3 = Sector # where the NAME OF THE FILE is kept. >51D4 - >50D5 = Word: The first nibble is the FILE/TYPE. The second nibble, and the second byte, together, point to the last used sector. >51D6 - >51D7 = Word: Total sectors engaged for this file. >51D8 - >52D7 = >100 bytes brought directly from the NAME OF THE FILE sector. OFFSET >51D8 - >51E1 = >00 10 Bytes= FILENAME >51E2 - >51E3 = >0A Word = >0000 = Reserved >51E4 = >0C Byte = File Status Flag (File Type and Write Protection) >51E5 = >0D Byte = Max # of records per Sector = >03 for a 80 DIS/VAR file. >51E6 - >51E7 = >0E Word = Number of sectors currently allocated. >51E8 = >10 Byte = End Of File offset within the last used sector. >51E9 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80 file. >51EA - >51EB = >12 Word = # of FIXED length records or # of sectors for VARIABLE length (the bytes are reversed, LSB|MSB should be MSB|LSB. >51EC - >51F3 = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved. >51F4 - >51F6 = >1C 3 Bytes = Sector # of first sector and # of following sectors. Nibble are reversed. Also, if next 3 bytes are not zero, fracturing map. 2nd FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector ------------------------------------------------------------------------------- >52D8 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when the file is closed. >52D9 = Byte: Drive # used, real number. It will be zeroed when the file is closed. >52DA - >52DB = Sector # where the NAME OF THE FILE is kept. >52DC - >50DD = Word: The first nibble is the FILE/TYPE. The second nibble, and the second byte, together, point to the last used sector. >52DE - >52DF = Word: Total sectors engaged for this file. >52E0 - >53DF = >100 bytes brought directly from the NAME OF THE FILE sector. OFFSET >52E0 - >52E9 = >00 10 Bytes= FILENAME >52EA - >52EB = >0A Word = >0000 = Reserved >52EC >0C Byte = File Status Flag (File Type and Write Protection) >52ED = >0D Byte = Max # of records per Sector = >03 for a 80 DIS/VAR file. >52EE - >52EF = >0E Word = Number of sectors currently allocated. >52F0 = >10 Byte = End Of File offset within the last used sector. >52F1 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80 file. >52F2 - >52F3 = >12 Word = # of FIXED length records or # of sectors for VARIABLE length (the bytes are reversed, LSB|MSB should be MSB|LSB. >52F4 - >52FB = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved. >52FC - >52FE = >1C 3 Bytes = Sector # of first sector and # of following sectors. Nibble are reversed. Also, if next 3 bytes are not zero, fracturing map. 3rd FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector ------------------------------------------------------------------------------- >53E0 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when the file is closed. >53E1 = Byte: Drive # used, real number. It will be zeroed when the file is closed. >53E2 - >53E3 = Sector # where the NAME OF THE FILE is kept. >53E4 - >53E5 = Word: The first nibble is the FILE/TYPE. The second nibble, and the second byte, together, point to the last used sector. >53E6 - >53E7 = Word: Total sectors engaged for this file. >53E8 - >54E7 = >100 bytes brought directly from the NAME OF THE FILE sector. OFFSET >53E8 - >53F1 = >00 10 Bytes= FILENAME >53F2 - >53F3 = >0A Word = >0000 = Reserved >53F4 = >0C Byte = File Status Flag (File Type and Write Protection) >53F5 = >0D Byte = Max # of records per Sector = >03 for a 80 DIS/VAR file. >53F6 - >53F7 = >0E Word = Number of sectors currently allocated. >53F8 = >10 Byte = End Of File offset within the last used sector. >53F9 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80 file. >53FA - >53FB = >12 Word = # of FIXED length records or # of sectors for VARIABLE length (the bytes are reversed, LSB|MSB should be MSB|LSB. >53FC - >5403 = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved. >5404 - >5406 = >1C 3 Bytes = Sector # of first sector and # of following sectors. Nibble are reversed. Also, if next 3 bytes are not zero, fracturing map. 4th FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector ------------------------------------------------------------------------------- >54E8 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when the file is closed. >54E9 = Byte: Drive # used, real number. It will be zeroed when the file is closed. >54EA - >54EB = Sector # where the NAME OF THE FILE is kept. >54EC - >54ED = Word: The first nibble is the FILE/TYPE. The second nibble, and the second byte, together, point to the last used sector. >54EE - >54EF = Word: Total sectors engaged for this file. >54F0 - >55EF = >100 bytes brought directly from the NAME OF THE FILE sector. OFFSET >54F0 - >54F9 = >00 10 Bytes= FILENAME >54FA - >54FB = >0A Word = >0000 = Reserved >54FC >0C Byte = File Status Flag (File Type and Write Protection) >54FD = >0D Byte = Max # of records per Sector = >03 for a 80 DIS/VAR file. >54FE - >54FF = >0E Word = Number of sectors currently allocated. >5500 = >10 Byte = End Of File offset within the last used sector. >5501 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80 file. >5502 - >5503 = >12 Word = # of FIXED length records or # of sectors for VARIABLE length (the bytes are reversed, LSB|MSB should be MSB|LSB. >5504 - >550B = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved. >550C - >550E = >1C 3 Bytes = Sector # of first sector and # of following sectors. Nibble are reversed. Also, if next 3 bytes are not zero, fracturing map. 5th FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector ------------------------------------------------------------------------------- >55F0 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when the file is closed. >55F1 = Byte: Drive # used, real number. It will be zeroed when the file is closed. >55F2 - >55F3 = Sector # where the NAME OF THE FILE is kept. >55F4 - >55F5 = Word: The first nibble is the FILE/TYPE. The second nibble, and the second byte, together, point to the last used sector. >55F6 - >55F7 = Word: Total sectors engaged for this file. >55F8 - >56F7 = >100 bytes brought directly from the NAME OF THE FILE sector. OFFSET >55F8 - >5601 = >00 10 Bytes= FILENAME >5602 - >5603 = >0A Word = >0000 = Reserved >5604 = >0C Byte = File Status Flag (File Type and Write Protection) >5605 = >0D Byte = Max # of records per Sector = >03 for a 80 DIS/VAR file. >5606 - >5607 = >0E Word = Number of sectors currently allocated. >5608 = >10 Byte = End Of File offset within the last used sector. >5609 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80 file. >560A - >560B = >12 Word = # of FIXED length records or # of sectors for VARIABLE length (the bytes are reversed, LSB|MSB should be MSB|LSB. >560C - >5613 = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved. >5614 - >5616 = >1C 3 Bytes = Sector # of first sector and # of following sectors. Nibble are reversed. Also, if next 3 bytes are not zero, fracturing map. 6th FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector ------------------------------------------------------------------------------- >56F8 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when the file is closed. >56F9 = Byte: Drive # used, real number. It will be zeroed when the file is closed. >56FA - >56FB = Sector # where the NAME OF THE FILE is kept. >56FC - >56FD = Word: The first nibble is the FILE/TYPE. The second nibble, and the second byte, together, point to the last used sector. >56FE - >56FF = Word: Total sectors engaged for this file. >5700 - >57FF = >100 bytes brought directly from the NAME OF THE FILE sector. OFFSET >5700 - >5709 = >00 10 Bytes= FILENAME >570A - >570B = >0A Word = >0000 = Reserved >570C >0C Byte = File Status Flag (File Type and Write Protection) >570D = >0D Byte = Max # of records per Sector = >03 for a 80 DIS/VAR file. >570E - >570F = >0E Word = Number of sectors currently allocated. >5710 = >10 Byte = End Of File offset within the last used sector. >5711 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80 file. >5712 - >5713 = >12 Word = # of FIXED length records or # of sectors for VARIABLE length (the bytes are reversed, LSB|MSB should be MSB|LSB. >5714 - >571B = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved. >571C - >571E = >1C 3 Bytes = Sector # of first sector and # of following sectors. Nibble are reversed. Also, if next 3 bytes are not zero, fracturing map. ******************************************************************************** >577F Note = Last location in Myarc FDC RAM. ------------------------------------------------------------------------------ DTIHM039 DX-10 Opcodes and Mnemonics. [EDITORS NOTE: DX-10 was the operating system used by Texas Instruments 990 series of Minicomputers. Besides being (mostly) compatable with the 99/4a on the assembly level, much software and hardware development for the 99/4a was done on the mini computers. ] THE FOLLOWING TEXT DEFINES ALL THE POSSIBLE TAGS FOUND IN A DX/10 OBJECT FILE: ------------------------------------------------------------------------------- Field 1: Is always 4 bytes long, and contains a Value or Address in ASCII-HEX. But if it is compressed object code, this field is compressed down to 2 bytes and the data is stored in internal BINARY-WORD format. Field 2: Is always 6 bytes long, and contains Symbol characters, except for its use in the first record of the object file and the first TAG of `0'. During this use, this field is expanded by two bytes, to make room for the 8 byte long `PROGRAM ID' text. Field 3: Is always 4 bytes long, and contains a Module No. from >0000 to >0FFF. Start at >0000 for all DATA segments (DSEG) in the source files. The next Module No. >0001 is for all PROGRAM segments (PSEG), but since it is the default mode for all of the OBJECT code,it is never included in any TAG field. The rest of the Module Numbers from>0002 up until >0FFF are for all the different COMMON segments (CSEG). Each COMMON segment with a different Field 2 (Symbol) is assigned a new Module Number. The number of COMMON segments allowed varies depending on the amount of memory available for the Assembler. Linker and Loader programs; but if it is compressed OBJECT code, this field is compressed down to 2 bytes and the Module Number is stored in internal BINARY-WORD format. ------------------------------------------------------------------------------- SPECIAL TAGs: The 7,8,F,: TAGs are designed to control the file format of the OBJECT file, and are used to check for errors in the last record, and to mark the ends of each file,and the end of the OBJECT file. The `U' TAG is generated by the LOAD directive, and allows the source files to force a symbol and address to be loaded into the REF/DEF table for later use. The `D' TAG is generated by the user and allows the user to have a bias or offset added on all TAGs containing a relocatable address. The G,H,I,K,#TAGs are currently not used or no more information is available on them. T SPECIAL CTRL TAG USE: Field 1 Field 2 Field 3 - ---------------------- ---------------------------- ---------- --------- 7 = Checksum Indicator Checksum Value 8 = Checksum Ignore Any Data Value D = Load Bias or Offset Load Bias (user added) U = Force a REF/DEF load Absolute Address Symbol F = End of Record (line #) : = End of File (99/4 AS) - ---------------------- ---------------------------- ---------- --------- G = H = I = Program Identification K = External Macro REF Relocatable Address of Chain Symbol # = Absolute Value >007F???? ------------------------------------------------------------------------------- ALL & AORG: These TAGs are found in code which is AORG or used to mark Absolute Data (B) like OPcodes, etc. in all other kinds of segments. T ALL & AORG TAG USE: Field 1 Field 2 Field 3 - ---------------------- ---------------------------- ---------- --------- 1 = Entry Point Definition Absolute Address 4 = External References Absolute Address 6 = External Definitions Absolute Address 6 = Load Address Absolute Address B = Data Absolute Value ------------------------------------------------------------------------------- PSEG TAG USE: These TAGs are found in code which is inbetween the PSEG and PEND Assembler Directives. This is the default mode of all code which is not marked with one of the XSEG directives. Also, code marked with the RORG directive will end up as PSEG tagged code. These TAGs define all the PROGRAM segments in an assembled program, and also mark the main-relocatable part of the program. Program ID, (Field 2) is 8 bytes long, instead of the normal 6 byte field,and always is the first TAG in any object file,and only appears once. If the IDT directive was not used in the source file, then this field is padded out with 8 space characters. T PSEG TAG USE: Field 1 Field 2 Field 3 - ---------------------- ---------------------------- ---------- --------- 0 = Program Identification Total Length of all PSEG's Program ID 2 = Entry Point Definition Relocatable Address 3 = External References Relocatable Address of Chain Symbol 5 = External Definitions Relocatable Address of Chain Symbol V = External Secondary REF Relocatable Address of Chain Symbol A = Load Address Relocatable Address C = Data Relocatable Address ------------------------------------------------------------------------------- DSEG TAG USE: These TAGs are found in code which is inbetween the DSEG and DEND Assembler Directives. It defines all DATA segments in a assembled program, and also marks the modifiable segments of the program. The second field in the `M'TAG is fixed to the symbol of `$DATA', and only can appear once in any given object file. T DSEG TAG USE: Field 1 Field 2 Field 3 - ---------------------- ---------------------------- ---------- --------- M = Module Identification Total Length of all DSEG's $DATA >0000 X = External References Relocatable Address of Chain Symbol >0000 W = External Definitions Relocatable Address of Chain Symbol >0000 V = External Secondary REF Relocatable Address of Chain Symbol >0000 S = Load Address Relocatable Address T = Data Relocatable Address ------------------------------------------------------------------------------- CSEG TAG USE: These TAGs are found in code which is inbetween the CSEG and CEND Assembler Directives. It defines all the COMMON Module Segments in an assembled program. Since the COMMON segments are defined as separate modules with unique ID's, then these TAGs are useful in marking the page-relocatable parts of the program. The second field in the `M' TAG is defined by each CSEG [`string'], and can be any 6 byte Symbol. All CSEG directives using the same Symbol, are all considered part of the same module, and are all assigned the same Module No. Any CSEG directives without a Symbol, are all assigned the same default Symbol of`$BLANK' for use in the second field of the `M' TAG. T CSEG TAG USE: Field 1 Field 2 Field 3 - ---------------------- ---------------------------- ---------- --------- M = Modules Identification Length of a certain Module # Symbol Module #. X = External References Relocatable Address of Chain Symbol Module #. W = External Definitions Relocatable Address of Chain Symbol Module #. V = External Secondary REF Relocatable Address of Chain Symbol Module #. P = Load Address Relocatable Address Module #. N = Data Relocatable Address Module #. ------------------------------------------------------------------------------ THE FOLLOWING TEXT DEFINES ALL THE SPECIAL MNEMONICS IN A DX/10 SOURCE FILE: ------------------------------------------------------------------------------- These OPcodes are found in all 9900 based systems starting at the 9900CPU chip, all the way up to the latest 99000 CPU. But due to the fact that these OPcodes output a special CRU address on the system bus, they can't be used correctly in 99/4a type systems. Only the RSET and IDLE should ever be attempted in a 99/4a system, but we don't recommend it. These OPcodes are designed to interface with special CRU hardware to control various user-defined functions. OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ---- ----- ---------------------------------- --------------------------------- IDLE >0340 IDLE until a reset, interrupt,load |0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0| RSET >0360 ReSET status bits 12-15 to zero |0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0| CKON >03A0 ClocK ON (user) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0| CKOF >03C0 ClocK OFF (user) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0| LREX >03E0 Load or REstart eXecution (user) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0| ------------------------------------------------------------------------------- These OPcodes are only found in 9940 based systems using the 9940 CPU chip. But since they assemble using the XOP OPcode, it is possible to make them available on other 9900 based systems. On the 99/4a the DCA (XOP 0)vectors are: CRU >1B00 WS >2800, PC >4028 (Extended GPL mode),and for the DCS (XOP 2) the vectors are: WS >FFD8, PC >FFF8. The LIIM opcode is a special verion of the normal LIMI for the 9940, as the 9940 only has max. 4 levels of interrupts and the mormal LIMI allows up to 16 levels of interrupts. The LIIM is not needed on the 99/4a as this system only has one fixed level of interrupts; but if you need to emulate this OPcode for any reason, the vectors on the 99/4a for LIIM (XOP 0) are: WS >83A0, PC >8300. OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ---- ----- ---------------------------------- --------------------------------- DCA >2C00 Decimal Correct Addition XOP0 |0 0 1 0 1 1|0 0 0 0| Ts| S | DCS >2C40 Decimal Correct Subtraction XOP1 |0 0 1 0 1 1|0 0 0 1| Ts| S | LIIM >2C80 Load Immediate Interrupt Mask XOP2 |0 0 1 0 1 1|0 0 1 0| x | n | ------------------------------------------------------------------------------- These OPcodes are found in the 990/10 mainframe system, and also in any 99000 based system. They are designed to support the 99610 memory mapper, to allow easy access to another page without the need of switching a page someplace. They can also be emulated in a 9995 based system thru the MID interrupt. OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ---- ----- ---------------------------------- --------------------------------- LDS >0780 Long Distance Source |0 0 0 0 0 1 1 1 1 0| Ts| S | LDD >07C0 Long Distance Destination |0 0 0 0 0 1 1 1 1 1| Ts| S | ------------------------------------------------------------------------------- These OPcodes currently are not known about in any 9900 or possible 9900 based system,only the LMF has one small line about it in the 99000 manual. Its format is LMF Rx,x; where the Rx can be any workspace register from 0 thru 15, and the immediate can be a `0' or a `1'. The XIT opcode does not have any operands, and is just used by itself. It is not mentioned in any 9900 or 99000 reference manual, and lloks to me like a special opcode to return or eXIT from something. OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ---- ----- ---------------------------------- --------------------------------- LMF >0320 ????(not in any known 9900 system) |0 0 0 0 0 0 1 1 0 0 1|n| W | ---- ----- ---------------------------------- --------------------------------- XIT >0C0E ????(not in any known 9900 system) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0| ------------------------------------------------------------------------------- These OPcodes are only found in 99000 based systems using the 99110A CPU chip. They are designed to provide a floating point package for 9900 based systems; but they can also be emulated in a 9995 based system thru the MID interrupt. OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ---- ----- ---------------------------------- --------------------------------- AR >0C40 Add Real |0 0 0 0 1 1 0 0 0 1| Ts| S | CIR >0C80 Convert Integer to Real |0 0 0 0 1 1 0 0 1 0| Ts| S | SR >0CC0 Subtract Real |0 0 0 0 1 1 0 0 1 1| Ts| S | MR >0D00 Multiply Real |0 0 0 0 1 1 0 1 0 0| Ts| S | DR >0D40 Divide Real |0 0 0 0 1 1 0 1 0 1| Ts| S | LR >0D80 Load Real |0 0 0 0 1 1 0 1 1 0| Ts| S | STR >0DC0 Store Real |0 0 0 0 1 1 0 1 1 1| Ts| S | ---- ----- ---------------------------------- --------------------------------- CRI >0C00 Convert Real to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0| NEGR >0C02 Negate Real |0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0| CRE >0C04 Convert Real to Extended integer |0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0| CRE >0C06 Convert Extended integer to Real |0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0| ------------------------------------------------------------------------------- These OPcodes are currently not found in any 9900 based system;but if emulated, they are designed to provide an easy-to-use BCDecimal package for 9900 based systems. They can be emulated in a 9995 based system thru the MID interrupt. OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ---- ----- ---------------------------------- --------------------------------- AD >0E40 Add Decimal |0 0 0 0 1 1 1 0 0 1| Ts| S | CID >0E80 Convert Integer to Decimal |0 0 0 0 1 1 1 0 1 0| Ts| S | SD >0EC0 Subtract Decimal |0 0 0 0 1 1 1 0 1 1| Ts| S | MD >0F00 Multiply Decimal |0 0 0 0 1 1 1 1 0 0| Ts| S | DD >0F40 Divide Decimal |0 0 0 0 1 1 1 1 0 1| Ts| S | LD >0F80 Load Decimal |0 0 0 0 1 1 1 1 1 0| Ts| S | STD >0FC0 Store Decimal |0 0 0 0 1 1 1 1 1 1| Ts| S | ---- ----- ---------------------------------- --------------------------------- CDI >0C01 Convert Decimal to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1| CDE >0C05 Convert Decimal to Extended integer|0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1| CED >0C07 Convert Extended integer to Decimal|0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1| ------------------------------------------------------------------------------ THE FOLLOWING TEXT DEFINES ALL THE OPCODES AND MNEMONICS IN A 9900/99000 SYSTEM OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ----- ---- ---------------------------------- --------------------------------- >0000 (16 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 0|- - - -| >0010 ( 8 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 1 0|- - -| >0018 ( 4 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 1 1 0|- -| >001C SRAM Shift Right Arithmetic Multiple 32|0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0| >001D SLAM Shift Left Arithmetic Multiple 32|0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1| >001E ( 2 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 1 1 1 1|-| >0020 ( 8 opcodes available) |0 0 0 0 0 0 0 0 0 0 1 0 0|- - -| >0028 ( 1 opcode available) |0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0| >0029 AM Add Multiple 32|0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1| >002A SM Subtract Multiple 32|0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0| >002B ( 1 opcode available) |0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1| >002C ( 4 opcodes available) |0 0 0 0 0 0 0 0 0 0 1 0 1 1|- -| >0030 (16 opcodes available) |0 0 0 0 0 0 0 0 0 0 1 1|- - - -| >0040 (64 opcodes available) |0 0 0 0 0 0 0 0 0 1|- - - - - -| >0080 LST Load STatus register |0 0 0 0 0 0 0 0 1 0 0 0| W | >0090 LWP Load Workspace Pointer |0 0 0 0 0 0 0 0 1 0 0 1| W | >00A0 (16 opcodes available) |0 0 0 0 0 0 0 0 1 0 1 0|- - - -| >00B0 BLSK Branch immediate & Link to StacK |0 0 0 0 0 0 0 0 1 0 1 1| W | >00C0 (64 opcodes available) |0 0 0 0 0 0 0 0 1 1|- - - - - -| >0100 EVAD EValuate ADdress instruction |0 0 0 0 0 0 0 1 0 0| Ts| S | >0140 BIND Branch INDirect |0 0 0 0 0 0 0 1 0 1| Ts| S | >0180 DIVS DIVide-Signed |0 0 0 0 0 0 0 1 1 0| Ts| S | >01C0 MPYS MultiPlY-Signed |0 0 0 0 0 0 0 1 1 1| Ts| S | >0200 LI Load Immediate |0 0 0 0 0 0 1 0 0 0 0 0| W | >0210 (16 opcodes available) |0 0 0 0 0 0 1 0 0 0 0 1|- - - -| >0220 AI Add Immediate |0 0 0 0 0 0 1 0 0 0 1 0| W | >0230 (16 opcodes available) |0 0 0 0 0 0 1 0 0 0 1 1|- - - -| >0240 ANDI AND Immediate |0 0 0 0 0 0 1 0 0 1 0 0| W | >0250 (16 opcodes available) |0 0 0 0 0 0 1 0 0 1 0 1|- - - -| >0260 ORI OR Immediate |0 0 0 0 0 0 1 0 0 1 1 0| W | >0270 (16 opcodes available) |0 0 0 0 0 0 1 0 0 1 1 1|- - - -| >0280 CI Compare Immediate |0 0 0 0 0 0 1 0 1 0 0 0| W | >0290 (16 opcodes available) |0 0 0 0 0 0 1 0 1 0 0 1|- - - -| >02A0 STWP STore Workspace Pointer |0 0 0 0 0 0 1 0 1 0 1 0| W | >02B0 (16 opcodes available) |0 0 0 0 0 0 1 0 1 0 1 1|- - - -| >02C0 STST STore STatus |0 0 0 0 0 0 1 0 1 1 0 0| W | >02D0 (16 opcodes available) |0 0 0 0 0 0 1 0 1 1 0 1|- - - -| >02E0 LWPI Load Workspace Pointer Immediate |0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0| >02E1 ( 1 opcode available) |0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1| >02E2 ( 2 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 0 0 0 1|-| >02E4 ( 4 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 0 0 1|- -| >02E8 ( 8 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 0 1|- - -| >02F0 (16 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 1|- - - -| >0300 LIMI Load Interrupt Mask Immediate |0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0| >0301 CR Compare Reals 32|0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1| >0302 MM Multiply Multiple 32|0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0| >0303 ( 1 opcode available) |0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1| >0304 ( 4 opcodes available) |0 0 0 0 0 0 1 1 0 0 0 0 0 1|- -| >0308 ( 8 opcodes available) |0 0 0 0 0 0 1 1 0 0 0 0 1|- - -| >0310 (16 opcodes available) |0 0 0 0 0 0 1 1 0 0 0 1|- - - -| >0320 LMF ????(not in any known 9900 system) |0 0 0 0 0 0 1 1 0 0 1|n| W | >0340 IDLE IDLE until a reset, interrupt,load |0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0| >0341 ( 1 opcode available) |0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1| >0342 ( 2 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 0 0 0 1|-| >0344 ( 4 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 0 0 1|- -| >0348 ( 8 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 0 1|- - -| >0350 (16 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 1|- - - -| OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F ----- ---- ---------------------------------- --------------------------------- >0360 RSET ReSET the status bits 12-15 to zero|0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0| >0361 ( 1 opcode available) |0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1| >0362 ( 2 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 0 0 0 1|-| >0364 ( 4 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 0 0 1|- -| >0368 ( 8 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 0 1|- - -| >0370 (16 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 1|- - - -| >0380 RTWP ReTurn with Workspace Pointer |0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0| >0381 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1| >0382 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 0 0 0 1|-| >0384 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 0 0 1|- -| >0388 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 0 1|- - -| >0390 (16 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 1|- - - -| >03A0 CKON ClocK ON (user) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0| >03A1 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1| >03A2 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 1|-| >03A4 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 0 0 1|- -| >03A8 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 0 1|- - -| >03B0 (16 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 1|- - - -| >03C0 CKOF ClocK OFf (user) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0| >03C1 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1| >03C2 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 1|-| >03C4 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 0 0 1|- -| >03C8 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 0 1|- - -| >03D0 (16 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 1|- - - -| >03E0 LREX Load or REstart eXecution (user) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0| >03E1 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1| >03E2 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 1|-| >03E4 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 0 0 1|- -| >03E8 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 0 1|- - -| >03F0 (16 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 1|- - - -| >0400 BLWP Branch and Load Workspace Pointer |0 0 0 0 0 1 0 0 0 0| Ts| S | >0440 B Branch |0 0 0 0 0 1 0 0 0 1| Ts| S | >0480 X eXecute |0 0 0 0 0 1 0 0 1 0| Ts| S | >04C0 CLR CLeaR operand to zeros |0 0 0 0 0 1 0 0 1 1| Ts| S | >0500 NEG NEGate operand |0 0 0 0 0 1 0 1 0 0| Ts| S | >0540 INV INVert operand |0 0 0 0 0 1 0 1 0 1| Ts| S | >0580 INC INCrement operand by one |0 0 0 0 0 1 0 1 1 0| Ts| S | >05C0 INCT INCrement operand by Two |0 0 0 0 0 1 0 1 1 1| Ts| S | >0600 DEC DECrement operand by one |0 0 0 0 0 1 1 0 0 0| Ts| S | >0640 DECT DECrement operand by Two |0 0 0 0 0 1 1 0 0 1| Ts| S | >0680 BL Branch and Link |0 0 0 0 0 1 1 0 1 0| Ts| S | >06C0 SWPB SWaP Bytes |0 0 0 0 0 1 1 0 1 1| Ts| S | >0700 SETO SET operand to Ones |0 0 0 0 0 1 1 1 0 0| Ts| S | >0740 ABS ABSolute operand |0 0 0 0 0 1 1 1 0 1| Ts| S | >0780 LDS Long Distance Source |0 0 0 0 0 1 1 1 1 0| Ts| S | >07C0 LDD Long Distance Destination |0 0 0 0 0 1 1 1 1 1| Ts| S | >0800 SRA Shift register Right Arithmetic |0 0 0 0 1 0 0 0| count | W | >0900 SRL Shift register Right Logical |0 0 0 0 1 0 0 1| count | W | >0A00 SLA Shift register Left Arithmetic |0 0 0 0 1 0 1 0| count | W | >0B00 SRC Shift register Right Circular |0 0 0 0 1 0 1 1| count | W | >0C00 CRI Convert Real to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0| >0C01 CDI Convert Decimal to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1| >0C02 NEGR NEGate Real |0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0| >0C03 ( 1 opcode available) |0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1| >0C04 CRE Convert Real to Extended integer |0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0| >0C05 CDE Convert Decimal to Extended integer|0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1| >0C06 CER Convert Extended integer to Real |0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0| >0C07 CED Convert Extended integer to Decimal|0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1| >0C08 ( 1 opcode available) |0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0| OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F _____ ____ __________________________________ _________________________________ >0C09 TMB Test Memory Bit 32|0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1| >0C0A TCMB Test and Clear Memory Bit 32|0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0| >0C0B TSMB Test and Set Memory Bit 32|0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1| >0C0C ( 2 opcodes available) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 0|-| >0C0E XIT ????(not in any known 9900 system) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0| >0C0F ( 1 opcode available) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1| >0C10 (16 opcodes available) |0 0 0 0 1 1 0 0 0 0 0 1|- - - -| >0C20 (32 opcodes available) |0 0 0 0 1 1 0 0 0 0 1|- - - - -| >0C40 AR Add Real |0 0 0 0 1 1 0 0 0 1| Ts| S | >0C80 CIR Convert Integer to Real |0 0 0 0 1 1 0 0 1 0| Ts| S | >0CC0 SR Subtract Real |0 0 0 0 1 1 0 0 1 1| Ts| S | >0D00 MR Multiply Real |0 0 0 0 1 1 0 1 0 0| Ts| S | >0D40 DR Divide Real |0 0 0 0 1 1 0 1 0 1| Ts| S | >0D80 LR Load Real |0 0 0 0 1 1 0 1 1 0| Ts| S | >0DC0 SR Store Real |0 0 0 0 1 1 0 1 1 1| Ts| S | >0E40 AD Add Decimal |0 0 0 0 1 1 1 0 0 1| Ts| S | >0E80 CID Convert Integer to Decimal |0 0 0 0 1 1 1 0 1 0| Ts| S | >0EC0 SD Subtract Decimal |0 0 0 0 1 1 1 0 1 1| Ts| S | >0F00 MD Multiply Decimal |0 0 0 0 1 1 1 1 0 0| Ts| S | >0F40 DD Divide Decimal |0 0 0 0 1 1 1 1 0 1| Ts| S | >0F80 LD Load Decimal |0 0 0 0 1 1 1 1 1 0| Ts| S | >0FC0 SD Store Decimal |0 0 0 0 1 1 1 1 1 1| Ts| S | >1000 JMP unconditional JuMP |0 0 0 1 0 0 0 0| displacement | >1100 JLT Jump if Less Than |0 0 0 1 0 0 0 1| displacement | >1200 JLE Jump if Low or Equal |0 0 0 1 0 0 1 0| displacement | >1300 JEQ Jump if EQual |0 0 0 1 0 0 1 1| displacement | >1400 JHE Jump if High or Equal |0 0 0 1 0 1 0 0| displacement | >1500 JGT Jump if Greater Than |0 0 0 1 0 1 0 1| displacement | >1600 JNE Jump if Not Equal |0 0 0 1 0 1 1 0| displacement | >1700 JNC Jump if No Carry |0 0 0 1 0 1 1 1| displacement | >1800 JOC Jump if On Carry |0 0 0 1 1 0 0 0| displacement | >1900 JNO Jump if No Overflow |0 0 0 1 1 0 0 1| displacement | >1A00 JL Jump if logical Low |0 0 0 1 1 0 1 0| displacement | >1B00 JH Jump if logical High |0 0 0 1 1 0 1 1| displacement | >1C00 JOP Jump if Odd Parity |0 0 0 1 1 1 0 0| displacement | >1D00 SBO Set CRU Bit to One |0 0 0 1 1 1 0 1| displacement | >1E00 SBZ Set CRU Bit to Zero |0 0 0 1 1 1 1 0| displacement | >1F00 TB Test Bit |0 0 0 1 1 1 1 1| displacement | >2000 COC Compare Ones Corresponding |0 0 1 0 0 0| WsD | Ts| S | >2400 CZC Compare Zeros Corresponding |0 0 1 0 0 1| WsD | Ts| S | >2800 XOR eXclusive OR |0 0 1 0 1 0| WsD | Ts| S | >2C00 XOP eXtended OPeration & (DCA,DCS,LIIM)|0 0 1 0 1 1| n | Ts| S | >3000 LDCR LoaD Communication Register |0 0 1 1 0 0| count | Ts| S | >3400 STCR STore Communication Register |0 0 1 1 0 1| count | Ts| S | >3800 MPY MultiPlY |0 0 1 1 1 0| WsD | Ts| S | >3C00 DIV DIVide |0 0 1 1 1 1| WsD | Ts| S | >4000 SZC Set Zeros Corresponding |0 1 0 0| Td| D | Ts| S | >5000 SZCB Set Zeros Corresponding, Byte |0 1 0 1| Td| D | Ts| S | >6000 S Subtract words |0 1 1 0| Td| D | Ts| S | >7000 SB Subtract Bytes |0 1 1 1| Td| D | Ts| S | >8000 C Compare words |1 0 0 0| Td| D | Ts| S | >9000 CB Compare Bytes |1 0 0 1| Td| D | Ts| S | >A000 A Add words |1 0 1 0| Td| D | Ts| S | >B000 AB Add Bytes |1 0 1 1| Td| D | Ts| S | >C000 MOV MOVe words |1 1 0 0| Td| D | Ts| S | >D000 MOVB MOVe Bytes |1 1 0 1| Td| D | Ts| S | >E000 SOC Set Ones Corresponding |1 1 1 0| Td| D | Ts| S | >F000 SOCB Set Ones Corresponding, Byte |1 1 1 1| Td| D | Ts| S | -------------------------------------------------------------------------------