Post Reply 
The ET-11967 Service Module
05-28-2024, 06:46 PM
Post: #1
The ET-11967 Service Module
Hi all,

While looking at the Service Module (SM-1C), I raised some questions about the test of peripheral flags.
The answer (that I had missed from the documentation) was the use of the ET-11967 FI-wired module.

It is described in another post that "This ET-11967 module is a double memory module which fills both ports 3 & 4 address range and has FI line active".

While trying to implement this module on the Pico board, I stumbled upon some questions while disassembling the code and trying to understand the inner workings of this module.

In short - I have now successfully executed the IO service test on a real HP-41 with the Service Module loaded and the ET-11967 module emulated, and to get this to work I had to abandon the description above.

Firstly, the FI-line is not just active, it is in reality a copy of the DATA line. I think (without having a module to test with), that the FI and DATA pins are just shorted in the module, so that any data on the DATA pin is copied to the FI line.
This is how I implemented the ET-11967 in the Pico - just copy the DATA to the FI line when a Service Module is plugged in.

Secondly I doubt that this is a "double memory module" - I belive it is only a single memory module only.

While developing the code for the ET-11967 I tested it on a HP-41CV, and I could verify that the peripheral flag test worked ok, but the memory test failed - I just got "IO PORT TEST FAILED".

Looking through the code, I found the test code and it loops 4 times, writing and reading at address 0x100, 0x140, 0x180 and 0x1C0 - which corresponds to the addresses of the 4 memory modules that fits in the calculator.

And according to the ínstructions in the module manual, the Service Module should be in port 3, the ET-11967 in port 4, and a single memory module in both port 1 and 2.

This made us belive that the ET-11967 is a double memory module, so that we have full memory in the calculator and the service module could test them all.

I equipped a HP41C with no memory modules and the Pico (with Service Module and the ET-11967 emulated).
Running the IO test resulted in "1,2,3,4, FAILED".
WIth two memory modules inserted I got "3,4, FAILED".
As expected, since I don't have any memory emulation in the Pico for this setup.

But why did the HP41CV fail? It should have all the memory needed?!?

Disassembling the test code revealed that there is a loop, which writes and reads from the adresses above (writes a value, reads it back and compare - if equal the memory exists).
If the test fails - it will increment a counter, and after the test, this counter is tested against .... 1 !!

So, for the test to work, the loop must fail once!

I loaded my HP41C with three memory modules and executed the test again - and voila - "IO PORT TEST OK"!

So, my interpretation of these results and tests shows that the ET-11967 is NOT a double memory module, but a single memory module with the FI and DATA pins connected.

Is there anyone out there who have access to these two modules and could try the IO test (EEX) in a HP41CV?
Or if someone have made a double memory module to try that with the service module (SM1C) in a 41C with two memory modules? My expectation in that case is that the test should work with only one memory module ... (but the test will fail if the DATA and FI are not connected).

So, in summary, the description of the module should be that "This ET-11967 module is a single memory module which fills port 3 address range and has FI connected to DATA pin".

If someone is interested I could provide traces from executing the IO test in a CV or C with 3 memory modules.

Cheers,
Thomas

This is the code for the complete IO port test in Servioce Module SM-1C.
It only checks the peripheral flags according to a pattern in register C, and then writes and read from 4 addresses, of which one (and one only) must fail, then reports the result.

Code:
 ; Execute IO test (key EEX)
 45FB 33111C       ?NCXQ  47CC        ; Display " TEST"
 45FD 09D11C       ?NCXQ  4727
 45FF 014          ; 'T'
 4600 012          ; 'R'
 4601 00F          ; 'O'
 4602 010          ; 'P'
 4603 020          ; ' '
 4604 00F          ; 'O'
 4605 109          ; 'I'
 4606 24111C       ?NCXQ  4790        ; Delay 0.7 seconds
 4608 27D108       ?NCXQ  429F        ; Set B[M] to 000FFFFFFFF

 ; Load C with a test pattern for FI signal
 460A 04E          C=0  ALL
 460B 2DC          R=  13
 460C 3D0          LD@R  F
 460D 3D0          LD@R  F
 460E 3D0          LD@R  F
 460F 3D0          LD@R  F
 4610 09C          R=  5
 4611 3D0          LD@R  F
 4612 3D0          LD@R  F
 4613 3D0          LD@R  F
 4614 01C          R=  3
 
 ; C = FFFF0000FFF000

 ; This needs a FI-wired module so that the C-reg is
 ; feed back into FI so that the flags could be checked!
 ; With the pattern above flag 0,1,2,6,7,8 and 9 should be active

 4615 3AC          ?FI= 0
 4616 0DB          JNC  +27 4631
 4617 32C          ?FI= 1
 4618 0CB          JNC  +25 4631
 4619 22C          ?FI= 2
 461A 0BB          JNC  +23 4631
 461B 02C          ?FI= 3
 461C 0AF          JC  +21 4631
 461D 06C          ?FI= 4
 461E 09F          JC  +19 4631
 461F 0AC          ?FI= 5
 4620 08F          JC  +17 4631
 4621 16C          ?FI= 6
 4622 07B          JNC  +15 4631
 4623 2AC          ?FI= 7
 4624 06B          JNC  +13 4631
 4625 12C          ?FI= 8
 4626 05B          JNC  +11 4631
 4627 26C          ?FI= 9
 4628 04B          JNC  +9 4631
 4629 0EC          ?FI= 10
 462A 03F          JC  +7 4631
 462B 1AC          ?FI= 11
 462C 02F          JC  +5 4631
 462D 36C          ?FI= 12
 462E 01F          JC  +3 4631
 462F 2EC          ?FI= 13
 4630 01B          JNC  +3 4633

; If we reach here - some flags were failing!
 4631 022          B=0  @R       ; B = .00FFFFFFF0...
 4632 188          SETF  11      ; Set flag to indicate FI failure

 4633 05E          C=0  MS
 4634 3F0          PRPHSLCT
 4635 236          C=C+1  XS

 4636 0A0          SLCTP
 4637 3DC          R=R+1
 4638 10E          A=C  ALL
 4639 270          RAMSLCT
 463A 2F0          WRITDATA      ; Write to a memory address
 463B 04E          C=0  ALL      ; Clear C
 463C 038          READDATA      ; Read back from same address
 463D 36E          ?A#C  ALL
 463E 02B          JNC  +5 4643  ; Jump if equal (address exist)
 463F 17E          A=A+1  MS     ; Increment A[MS]
 4640 0AE          A<>C  ALL
 4641 10E          A=C  ALL      ; C = A
 4642 022          B=0  @R

 4643 0E0          SLCTQ
 4644 31C          R=  1
 4645 130140       LDIS&X  140
 4647 20A          C=C+A  R<
 4648 373          JNC  -18 4636
 4649 0A0          SLCTP
 464A 309118       ?NCXQ  46C2   ; Turn display on
 464C 05E          C=0  MS       ; C[MS] = 0
 464D 23E          C=C+1  MS     ; C[MS] = 1
 464E 37E          ?A#C  MS
 464F 0FF          JC  +31 466E  ; Jump if A[MS] != 1 (error)
 4650 05C          R=  4
 4651 052          C=0  P-Q
 4652 272          C=C-1  P-Q
 4653 0F2          B<>C  P-Q
 4654 18C          ?FSET  11     ; Check FI error flag
 4655 0CF          JC  +25 466E  ; Jump if FI flag test failed ...
 4656 14D11C       ?NCXQ  4753   ; Display " OK "
 4658 328          WRIT  12
 4659 328          WRIT  12
 465A 09D11C       ?NCXQ  4727
 465C 013          ; 'S'
 465D 014          ; 'T'
 465E 012          ; 'R'
 465F 00F          ; 'O'
 4660 010          ; 'P'
 4661 120          ; ' '
 4662 24111C       ?NCXQ  4790        ; Delay 0.7 seconds
 4664 3CC          ?KEY
 4665 1DD103       ?CGO  4077
 4667 18C          ?FSET  11
 4668 027          JC  +4 466C
 4669 2CC          ?FSET  13
 466A 3ED117       ?CGO  45FB
 466C 201102       ?NCGO  4080

; Jumps here if failed 
 466E 2DC          R=  13
 466F 188          SETF  11
 4670 290          LD@R  A
 4671 235118       ?NCXQ  468D         ; Fill A with "C6F1F2F3F4"
 4673 0C6          ;
 4674 0F1          ;
 4675 0F2          ;
 4676 0F3          ;
 4677 1F4          ;
 4678 08111C       ?NCXQ  4720
 467A 006          ; 'F'
 467B 001          ; 'A'
 467C 009          ; 'I'
 467D 00C          ; 'L'
 467E 005          ; 'E'
 467F 104          ; 'D'
 4680 313          JNC  -30 4662

 4681 1B0          POPADR
 4682 31C          R=  1
 4683 3EE          LSHFA  ALL
 4684 3EE          LSHFA  ALL
 4685 330          FETCHS&X
 4686 10A          A=C  R<
 4687 23A          C=C+1  M
 4688 2F6          ?C#0  XS
 4689 3D3          JNC  -6 4683
 468A 170          PUSHADR
 468B 0AE          A<>C  ALL
 468C 3E0          RTN

[35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X]
Find all posts by this user
Quote this message in a reply
05-28-2024, 07:31 PM
Post: #2
RE: The ET-11967 Service Module
(05-28-2024 06:46 PM)ThomasF Wrote:  So, in summary, the description of the module should be that "This ET-11967 module is a single memory module which fills port 3 address range and has FI connected to DATA pin".

Great deep dive and analysis of this service module !

Does this means that an ET-11967 Service Module could be built from a modified 82106A single memory module where B3 would be internally forced to 0 and DATA connected to FI?
Find all posts by this user
Quote this message in a reply
05-28-2024, 08:25 PM
Post: #3
RE: The ET-11967 Service Module
(05-28-2024 07:31 PM)Didier Lachieze Wrote:  
(05-28-2024 06:46 PM)ThomasF Wrote:  So, in summary, the description of the module should be that "This ET-11967 module is a single memory module which fills port 3 address range and has FI connected to DATA pin".

Great deep dive and analysis of this service module !

Does this means that an ET-11967 Service Module could be built from a modified 82106A single memory module where B3 would be internally forced to 0 and DATA connected to FI?

Hi Didier,

Yes, that is my conclusion, with the disclaimer that I have not been able to verify the connections since I have no module myself.
But hopefully someone with a real ET-11967 could measure on these pins to verify this.

Cheers,
Thomas

[35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X]
Find all posts by this user
Quote this message in a reply
05-30-2024, 04:54 PM (This post was last modified: 05-30-2024 04:55 PM by ThomasF.)
Post: #4
RE: The ET-11967 Service Module
Hi again,

Curiosity wins sometimes - so I disassembled a single memory module, lifted the B3 pin, and made a shortcut between DATA and the FI pin.

With two memory modules in port 1 and 2, my Pico with Service Module SM-1C in port 3 and the DIY "ET-11967" in port 4, I can now run the IO PORT TEST with success!

There is no emulation of the ET-11967 in the Pico, it just hold the ROM for the Service Module at 0x4000.

(05-28-2024 07:31 PM)Didier Lachieze Wrote:  Does this means that an ET-11967 Service Module could be built from a modified 82106A single memory module where B3 would be internally forced to 0 and DATA connected to FI?

So the answer should be yes, and very easy to do so (with no problem to restore the module again) ... Wink

Cheers,
Thomas

[35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X]
Find all posts by this user
Quote this message in a reply
05-30-2024, 06:31 PM
Post: #5
RE: The ET-11967 Service Module
Great ! Thanks for checking.
Find all posts by this user
Quote this message in a reply
Post Reply 




User(s) browsing this thread: 6 Guest(s)