Further update. The Z80-A CTC appears to be the culprit. The logic
analyzer told me that INT# was being asserted (active low) right out of
the gate. Removal of the chips that connect to INT# and inserting them
one at a time until the symptom re-appeared revealed the CTC chip as
having a problem. And, if I bend the interrupt pin on the CTC out, the
ROM program proceeds further. The ROM code gets past the point where
the "%" should appears on the console - but it still does not appear.
But I figure that if the CTC is bad, it is not at all unlikely that the
clock going over to the SIO chip is wrong or even nonexistant. Plus, a
later chunk of code loops forever waiting for transmitter buffer empty
from the SIO chip. (Check that tomorrow).
An update: Although I still expect there is an issue
with that loop
count of 10 (0x0A), I went ahead and stuck my logic analyzer on it in
state mode just to see what, if anything, was going on.
The CPU is running and runs the program in the ROM as expected at first.
But the program gets to the point of location 0x13, and then goes awry.
Noticing that is just after interrupts are enabled, I suspect it is
taking an interrupt at a location it isn't expecting: in particular, it
seems to be vectoring through location 0, which of course was not
intended to be an interrupt vector. So, the CPU ends up fetching the
next instruction from address 0x5EED, which is a 0xFF - uninitialized
RAM, actually - which to a Z80 is a rst 0x38 - which is where the
program picks up again.
So, either it should not be interrupting, or whatever is interrupting is
not placing the correct 8 bits of the interrupt vector there for the
CPU, so it ends up in the wrong place.
But, at least I have something to go on.
JRJ
On 7/11/2015 2:26 PM, Jay Jaeger wrote:
In working on my ACS 8000-2, I managed to dump
the ROM and started
disassembling it, and almost immediately came up with something strange
(see below). As a result, it is not surprising the machine is totally
confused.
If anyone has an Altos ACS 8000, models 1 thru 4 or 1S thru 4S, that is,
an Altos 8000 with an 8000 or 8100 circuit board, I would really
appreciate a dump of the ROM, as mine either has a coding error (in
which case there could be more) or a bit pick (in which case there could
be more) or some kind of flat-out bug.
Even a paper listing would be just fine. I have at least two different
ways I ought to be able to program a 2708 if I need to (and I almost
certainly do).
Below is what I found, right at the start of my ROM. The oddness is
that the Stack Pointer, which is used to do pop values into BC for the
port and byte count for a series of OTIR commands is initialized by the
code to point at 0x35E. Data for these commands starts at 036E. The
iteration count for the overall loop is 0x0A (10 decimal).
Here is the problem: given where the stack starts, 0x35E, that is used
to pop successive port/bytecount pairs into BC, there is only room for 8
of them before it gets to 0x36E, and the data there is clearly NOT part
of the port/bytecount pairs pattern.
So, it seems that one of the following is true:
- The iteration count has a bit pick and should be 08 instead of 0A
- The starting stack pointer has a bit pick, and should be
0x35A instead of 0x35E
- There is a coding error (essentially equivalent to the first choice)
There is some evidence to support any of these possible choices, though
right now it seems most likely that the iteration count of 0x0A really
should be 0x08. If someone has a known good ACS 8000 ROM image, then I
could sort it out more easily.
Anyway, given this, it is no wonder the machine is getting confused.
Thanks in advance.
JRJ
Input file: test.bin
0000 ED5E im 2 ; Set Interrupt Mode 2
;
; Initialization outputs
;
; Port 0A 5 bytes (PIO Y2 Channel A)
; Port 0B 5 bytes (PIO Y2 Channel B)
; Port 12 5 bytes (PIO Y4 Channel A)
; port 13 2 bytes (PIO Y4 Channel B)
; port 0C 3 bytes (Console Baud Rate, Y3 CTC CH0)
; port 0E 2 bytes (Printer Baud Rate, JX CTC CH2)
; port 1D 6 bytes (SIO Channel A - Console - Y7)
; port 1F 6 bytes (SIO Channel B - Printer - Y7)
;
0002 216E03 ld hl,0x036E ; HL <- 0x36E
0005 315E03 ld sp,0x035E ; SP <- 0x35E
0008 160A ld d,0x0A ; D <- 0x0A
000A C1 pop bc ; BC <- (SP)
000B EDB3 otir ; Output, as described above
;
; In "peudo C", the otir instruction would do:
;
; do {
; output(C,*HL++);
; } until(--B == 0);
;
000D 15 dec d ; Total iterations, 0x0A (10) times
000E 20FA jr nz,0x000A
;
; Done with initializations
;
0010 FB ei ; Turn on interrupts
0011 31FF3F ld sp,0x3FFF ; Real SP initialization
; for RAM during boot,
; Bit 10 MUST be a '1'
0014 3E00 ld a,0x00 ; A <- 0
... Left out the rest of the disassembly
0357 FB ei
0358 ED4D reti
;
; Data appears to begin here.
;
035A 04 inc b
035B 08 ex af,af'
035C 1020 djnz 0x037E
035E 0A ld a,(bc)
035F 05 dec b
0360 0B dec bc
0361 05 dec b
0362 12 ld (de),a
0363 05 dec b
0364 13 inc de
0365 02 ld (bc),a
0366 0C inc c
0367 03 inc bc
0368 0E02 ld c,0x02
036A 1D dec e
036B 061F ld b,0x1F
036D 06CF ld b,0xCF
036F 42 ld b,d
0370 5E ld e,(hl)
0371 37 scf
0372 BF cp a
0373 CF rst 0x08
0374 FC6A37 call m,0x376A
0377 FECF cp 0xCF
0379 F8 ret m
037A 6C ld l,h
037B 37 scf
037C DF rst 0x18
037D 0F rrca
037E 03 inc bc
037F 47 ld b,a
0380 0D dec c
0381 60 ld h,b
0382 07 rlca
0383 34 inc (hl)
0384 04 inc b
0385 44 ld b,h
0386 03 inc bc
0387 E1 pop hl
0388 05 dec b
0389 EA0444 jp pe,0x4404
038C 03 inc bc
038D E1 pop hl
038E 05 dec b
038F EA3031 jp pe,0x3130