• Please review our updated Terms and Rules here

Building a (PT) SUBSYSTEM B without a GPM card

Nama

Veteran Member
Joined
May 22, 2009
Messages
854
Location
New Zealand
I have my IMSAI up and running with a 3P+S card jumpered to mimic a 2SIO card and John Garza’s M84 monitor at F000.

However I decided to try to build it up as a Processor Tecnology ‘Subsystem B’ system.
Subsystem is a collection of Processor Technology cards that come together to form a complete system:

- 3P+S Parallel/Serial card
- VDM-1 Video card
- GPM RAM/ROM card

I’m missing the GPM card but have both the VDM-1 and 3P+S card.
Instead I thought I could build it up using a EconoROM and one of my PSS RAM16 cards to mimic the GPM card.
The GPM card is unique in that it contains the Cuter Monitor rom at C000h, and 1k of RAM starting right after cuter at C800h.
Following the 1K or RAM is another 1K of video RAM for the VDM-1 card starting at CC00h
(All cards I believe are working)

I hooked up my system in the following way.

- 16k RAM @ 0h - 3FFFh
- EconoROM containing 2k cuter @ C000h to C7FFh
- 16k RAM @ addressed to C000h - FF00h, then jumpered for a 2k hole a starting at C000h (for Cuter) and another 1k hole at CC00h (for the VDM video RAM).

Memory map.jpg

Unfortunately I could not get this setup to work. I was able to get the video to reset, and the cursor to display in the upper left corner, but there was no '>' prompt, and following the cursor was some random characters.

I tested to see if my setup looked correct. I could read and write to all the RAM locations (taking into account the holes), and I could see the Cuter ROM where it should be.
I wasn’t sure how I should go about organising the PHANTOM lines on all the cards, or even if I needed to worry about them.

I played with this setup for sometime, with no success.

In the end I took it back to my original M84 monitor setup, but would really like to give SUBSYSTEM B setup another go.

Anyway, I was just wondering if anyone knew what I was doing wrong, or had any insight into my problem.

Thanks

Phil
 
Last edited:
The GPM card provides control of auto-start and Phantom out for the Subsystem B card set. For Solos/Cuter, the GPM card was configured to assert Phantom to the bus during the 1st four cycles after a reset, and during these four cycles, execute the first four bytes at C000.

Since you don't have the GPM card, and I doubt the EconoROM happens to provide the auto-start logic required, your system is not going to auto-start on power up or reset. However, on the IMSAI, I assume you can use your front panel to execute from C000 and this is probably what you've tried, correct?

Mike
 
Last edited:
Hi Mike,
Yes, that's correct.
I just set the front panel to C000 and try to execute the code from there.
In your understanding of the GPM board, do you think what I'm trying to do is actually possible?

Thanks

Phil
 
...I don't suppose someone could send me a dump of their known working Cuter ROMs?

Thanks
 
Use the front panel to put an 'A' or similar in numerous locations in video RAM at CC00 and up. Do the characters display properly?

Mike
 
This weekend I double checked the VDM-1 card as you suggested.
Using the M84 Monitor I was able to load in some of the test programs from the VDM-1 manual, and I was even able to load in the SOL-20 program, TARG.

TARG_on _IMSAI.JPG

Of course I couldn't play TARG as the 3P+S card is jumpered to mimic a 2SIO card which the M84 monitor uses. So no keyboard attached in anyway that TARG could see. So I can be fairly certain that the VDM-1 card, and the 3P+S, the PSS RAM16 and the CPU card are all working.

I then tried CUTER again:
I put in the CUTER ROMs, and set it's address to C000. Put 16k card at 0000, and another at C000, with two holes for CUTER and for the 1k VDM-1 RAM....still no go :-(

Very frustrating.

Thanks again

Phil
 
Last edited:
Your 16K RAM card has very flexible addressing! I'd triple-check that the RAM from C800-CBFF is reading and writing without errors. This is the RAM used by CUTER.

Does your CUTER ROM have a version label on it? If I can match the version, I'll send you a dump for comparison.

Mike
 
Last edited:
Hi again,
Maybe I’m misunderstanding things, but the PSS RAM16 have a set of jumpers where individual 1k segments can be disabled.

PSS_RAM16.jpg

So in my case I have addressed one 16k card to C000h, and then jumpered it for disabling segment 0 and 1 (for the CUTER ROM hole) and segment 3 (for the VDM-1 RAM hole).

I have burnt my own CUTER ROMs made from files found on sol20.org. It would be really great to cross check my code with dump from a known working set. If you could send something through would be fantastic.

Cheers
Phil
 
Thank you very much.

I now have three versions with some slight changes between them all:

v1) Assembled from the file on Sol20.org, which has byte C359h as 0E, and byte C389h as 3B.
v2) Another version I found online from a .PRN file that I manually pulled apart, which has byte C359h as DE and byte C389h as 3A.
v3) Your version, which has byte C359h as 0E, and byte C389h as 3A.

I've burnt both versions 1 and 2 to EPROMs, and tried them in my machine, with no luck.
Not sure why these versions are all different, or if it makes any real difference.
Unfortunately I can't program in assembler (I'm a BASIC only guy), but I've attached the relevant section (C33Ah to C3A4) of the assembler code from the .PRN file I found online:


Code:
                       0792 * -*-
                       9999   COPY  CUTER2/1                               2 OF 3 ****
                       0793 *
                       0794 *
                       0795 *      OUTPUT A CRLF FOLLOWED BY A PROMPT
                       0796 *
C33A CD 42 C3           0797 PROMPT CALL   CRLF
C33D 06 3E              0798        MVI    B,'>'  THE PROMPT
C33F C3 19 C0           0799        JMP    SOUT   PUT IT ON THE SCREEN
                       0800 *
C342 06 0A              0801 CRLF   MVI    B,LF   LINE FEED
C344 CD 19 C0           0802   CALL   SOUT
C347 06 0D              0803        MVI    B,CR   CARRIAGE RETURN
C349 CD 19 C0           0804   CALL   SOUT
C34C 3A 10 C8           0805        LDA    NUCNT  GET COUNT OF NULLS TO OUTPUT
C34F 4F                 0806        MOV    C,A    SAVE COUNT IN C
C350 0D                 0807 NULOT  DCR    C
C351 F8                 0808        RM     . COUNTED DOWN PAST ZERO (MAX COUNT IS X'7F')
C352 AF                 0809        XRA    A      HERE IS THE NULL
C353 CD 10 C4           0810   CALL   OUTH   OUTPUT IT
C356 C3 50 C3           0811        JMP    NULOT  LOOP FOR NUMBER OF NULLS
                       0812 *
                       0813 *
                       0814 *  SCAN OVER UP TO 12 CHARACTERS LOOKING FOR A BLANK
                       0815 *
C359 DE 0C              0816 SBLK   MVI    C,12   MAXIMUM COMMAND STRING
C35B 1A                 0817 SBLK1  LDAX   D
C35C FE 20              0818   CPI    BLANK
C35E CA 6C C3           0819        JZ     SCHR   GOT A BLANK NOW SCAN PAST IT
C361 13                 0820        INX    D
C362 FE 3D              0821   CPI    '='    A EQUAL WILL ALSO STOP US (AT NEXT CHAR)
C364 CA 6C C3           0822        JZ     SCHR   FOUND, DE PT TO NEXT CHAR
C367 0D                 0823        DCR    C      NO MORE THAN TWELVE
C368 C2 5B C3           0824        JNZ    SBLK1
C36B C9                 0825        RET    .      GO BACK WITH ZERO FLAG SET
                       0826 *
                       0827 *
                       0828 *  SCAN PAST UP TO 10 BLANK POSITIONS LOOKING FOR
                       0829 * A NON BLANK CHARACTER.
                       0830 *
C36C 0E 0A              0831 SCHR   MVI    C,10   SCAN TO FIRST NON BLANK CHR WITHIN 10
C36E 1A                 0832 SCHR1  LDAX   D      GET NEXT CHARACTER
C36F FE 20              0833   CPI    SPACE
C371 C0                 0834        RNZ    .      WE'RE PAST THEM
C372 13                 0835        INX    D      NEXT SCAN ADDRESS
C373 0D                 0836        DCR    C
C374 C8                 0837        RZ     . COMMAND ERROR
C375 C3 6E C3           0838        JMP    SCHR1  KEEP LOOPING
                       0839 *
                       0840 *  THIS ROUTINE SCANS OVER CHARACTERS, PAST BLANKS AND
                       0841 * CONVERTS THE FOLLOWING ADDRESS TO HEX.  ERRORS RETURN TO
                       0842 * THE ERROR HANDLER.
                       0843 *
C378 CD 59 C3           0844 SCONV  CALL   SBLK
C37B CA 6B C4           0845        JZ     ERR1
                       0846 *
                       0847 *  THIS ROUTINE CONVERTS ASCII DIGITS INTO BINARY FOLLOWING
                       0848 * A STANDARD HEX CONVERSION.  THE SCAN STOPS WHEN AN ASCII
                       0849 * SPACE IS ENCOUNTERED.  PARAMETER ERRORS REPLACE THE ERROR
                       0850 * CHARACTER ON THE SCREEN WITH A QUESTION MARK.
                       0851 *
C37E 21 00 00           0852 SHEX   LXI    H,0    CLEAR H & L
C381 1A                 0853 SHE1   LDAX   D      GET CHARACTER
C382 FE 20              0854   CPI    20H    IS IT A SPACE?
C384 C8                 0855        RZ     .      IF SO
C385 FE 2F              0856   CPI    '/'
C387 C8                 0857        RZ
C388 FE 3A              0858   CPI    ':'
C38A C8                 0859        RZ
                       0860 *
C38B 29                 0861 HCONV  DAD    H      MAKE ROOM FOR THE NEW ONE
C38C 29                 0862        DAD    H
C38D 29                 0863        DAD    H
C38E 29                 0864        DAD    H
C38F CD 9B C3           0865   CALL   HCOV1  DO THE CONVERSION
C392 D2 6B C4           0866        JNC    ERR1   NOT VALID HEXIDECIMAL VALUE
C395 85                 0867        ADD    L
C396 6F                 0868        MOV    L,A    MOVE IT IN
C397 13                 0869        INX    D      BUMP THE POINTER
C398 C3 81 C3           0870        JMP    SHE1
                       0871 *
C39B D6 30              0872 HCOV1  SUI    48     REMOVE ASCII BIAS
C39D FE 0A              0873   CPI    10
C39F D8                 0874        RC     .      IF LESS THAN 9
C3A0 D6 07              0875        SUI    7      IT'S A LATTER??
C3A2 FE 10              0876   CPI    10H
C3A4 C9                 0877        RET    .      WITH TEST IN HAND
 
Location C359 needs to be a MVI C instruction. This is opcode 0E.

Location C389 needs to be the ':' character. This is a 3A.

So neither ROM 1 or 2 is exactly right, however, at quick glance, neither of these should prevent CUTER from putting up the ">" prompt.

During initialization, CUTER reads the sense switch port (FF) to determine the default input and output device. If you've entered C000 on the front panel in order to run from C000, the sense port should read C0. Bits 3-2 determine the input pseudo-port and bits 1-0 determine the output pseudo port. So, most likely, these are both reading as 00. If this is the case, that should be fine. If for any reason you've set the sense switches to anything else before running CUTER each time, that might be your problem.

CUTER assumes the parallel keyboard (pseudo input device 0) is on I/O port 3 and the VDM (pseudo output device 0) status port is at C8. Triple check this is your configuration and that no other hardware in the computer conflicts with these I/O addresses.

Finally, CUTER initialization hits tape control ports at FA and FB. Do you have anything in your system at these I/O addresses that CUTER's initialization of these ports could be messing up?

Mike
 
Hi Mike,
Thanks for the confirmation on the ROM's.
I had already tried playing with the sense switches, but with no luck.

Anyway, I've decided that instead of using my IMSAI, I may try building up one of Don Caprio's 8 slot motherboards as the 'Subsystem B' setup. Could be a challenge though.
Stay tuned...
 
Back
Top