[comp.sys.atari.8bit] Intermittent Heat-Related System Failure

cfchiesa@bsu-cs.UUCP (Christopher Chiesa) (05/31/88)

   Greetings.

   Regular readers of this group may recall my postings over the past several 
months, dealing with intermittent system problems which I attributed to my
aging Percom AT-88 disk drive.  Unfortunately, the problem has always been spo-
radic enough to elude simple cause-and-effect diagnosis, and the software which
locks up has always been complex enough (AtariWriter, AtariWriter Plus, video 
games) that the problem "could be anything" in the system.  

   Last night, however, all of that changed.  I've been working on a little 
graphics-demo program, in which the "main program" does the well-known "rain-
bow" effect with the "background" color,  while a VBI routine "rotates" five
players (yes, five) horizontally across the central portion of the screen.
It's a short program, I understand it thoroughly, and it LOCKED UP on my com-
puter three separate times when it absolutely should NOT have.  (Code is be-
low for those who want it.)

   From this latest development, I've been able to deduce that yes, the prob-
lem IS heat-related.  The first time this program locked up, the computer had
been on most of the day, and a hot day at that.  Thinking back, most of the 
other failures occurred when one or both of these factors was true.  The clin-
cher was when I let the program run all night.  It ran fine for a half hour
before I shut the monitor off at 2AM, then when I turned it back on at 10AM the
background ripple was gone, the player graphics data was corrupted, and the
program no longer responded to the "exit" command (START+SELECT+OPTION all
pressed at the same time.)  The "main program," in other words, had died.  The
VBI routine, however, was still running, rotating the players just as always.
THAT seems as though it ought to be significant; can anyone be more specific?

   On discovering this situation, I felt around the case (this is an 800, not
an XL or XE) and found that the hottest place was in the right rear, where as
I recall from years ago, the RF drive circuitry lies.  (I'm using a monitor
so the RF circuit is driving NOTHING; can that be enough of a problem to fry
the rest of the machine?)  The "personality board" and three RAM boards inside
the main hatch (BACK of the cartridge slots) were warm to the near-touch, also.

   There's a computer place north of here that for ten bucks will examine your
computer and tell you what's wrong with it.  I am thinking of taking this beast
up there, but I sure don't want them to MISS anything.  From what I've
described, can anyone here suggest the most likely / common cause of this
type of problem?  I should point out that no one else I've known with an Atari
(although most of them are XLs, not originals like mine) has any problem run-
ning the VERY SAME COPY of any of the programs that lock up on my machine.

   Thanks in advance for anything anyone can say.  The disk drive problem is
one thing, but if my main box is fried that's another story entirely.  SPARE 
NO EXPENSE! etc.

    Chris Chiesa
     Ball State University
     Muncie, IN

The following is the code for my short graphics-demo program.  Put it on when
you go to bed tonight, and see if it is still running properly when you get up
tomorrow morning.  If it IS, then I've got a problem.  If it ISN'T then YOU'VE
got the SAME problem.
===========CUT HERE =============== CUT HERE =================================

; STRIPES -- "moving stripes" graphics demo 
;   v4.1, Chris Chiesa, 5/29/88
;
RTCLOK   =   $14
SDMCTL   =   $022F
GPRIOR   =   $026F
SIZEP0   =   $D008
GRAFP0   =   $D00D
COLPM0   =   $D012
COLBK    =   $D01A
CONSOL   =   $D01F
POT0     =   $D200
WSYNC    =   $D40A
SETVBV   =   $E45C
SYSVBV   =   $E45F
XITVBV   =   $E462
;
VBI      =   $06         ; "Immediate VBLANK Vector" - for SETVBV routine
ALLKEYS  =   $07         ; CONSOL value when OPTION, SELECT, START all pressed
COLRINC  =   $10         ; Color-rotation increment (players): clr +1, lum +0
;
DMADSB   =   $00         ; Turn display off entirely 
DMAPM    =   $0C         ; Enable Players/Missiles only
DMAENB   =   $22         ; Enable normal playfield display
;
LMAR     =   $40         ; P/M coordinate "Left Margin" 
MID      =   $A0         ; P/M coordinate "threshold"
RMAR     =   $C0         ; P/M coordinate "Right Margin"
;
         *=  $2000
COLREG   .BYTE 0                        ; temporary Color Register
POSARR   .BYTE $40,$60,$80,$A0,$C0      ; P/M positions 0 - 4
DATARR   .BYTE $FF,$FF,$FF,$FF,$00      ; P/M graphic data, 0 - 4
;
START    JSR INIT             ; Initialize P/M graphics
;
INSTAL   LDX # >SCROLL        ; install P/M "scroll" routine as Immediate
         LDY # <SCROLL        ; VBI
         LDA #VBI
         JSR SETVBV
;
WAIT     LDA CONSOL           ; read console keys
         AND #ALLKEYS         ; all keys pressed?
         BEQ QUIT             ; yes - QUIT.
;
;  Additional special effect: implement the famous Atari "rainbow" ripple:
; 
         LDA POT0             ; no -- get current-scanline count value
         ADC RTCLOK           ; add to "current video frame" count value
         STA COLBK            ; to obtain color value: alter BACKGROUND color
         STA WSYNC            ; synchronize with Horizontal Blank
         JMP WAIT             ; repeat
;
QUIT     LDX SYSVBV+2         ; restore system-default Immediate VBLANK vector
         LDY SYSVBV+1
         LDA #VBI
         JSR SETVBV
;
         LDA #DMAENB          ; retore normal playfield display 
         STA SDMCTL
         RTS                  ; end; return to OS  (DOS/XL) 
;
;  Immediate VBLANK Interrupt routine -- scroll players "one bit left" every
;  VBLANK.  Increment RTCLOK so that rainbow effect MOVES.
;

SCROLL   INC RTCLOK           ; remove this for STATIC rainbow background
;
         LDX #$00             ; start with player 0
SLOOP    DEC POSARR,X         ; quad-width player must move 4 "color clocks"
         DEC POSARR,X         ; to equal one displayed bit-width.
         DEC POSARR,X
         DEC POSARR,X
         LDA POSARR,X         ; player's new position
;
TESTL    CMP #LMAR            ; sliding off at left margin?
         BCS TESTR            ; no - skip.
         CLC                  ; yes; roll OFF bits in at left to compensate
         ROR DATARR,X
         JMP TEST0            ; skip right-margin test
;
TESTR    CMP #MID             ; sliding in at right margin?
         BCC TEST0            ; no - skip.
         SEC                  ; yes; roll ON bits in at left to compensate 
         ROR DATARR,X
;
TEST0    BNE UPDATE           ; are all bits of player OFF?  (true only when
;                               player has just slid off left margin completely
         LDA #RMAR            ; yes: prepare to bring player in at right on
         STA POSARR,X         ;  next VBI pass.
         LDA COLREG           ; Give it the next color available.  
         JSR SETCLR
         CLC 
         ADC COLRINC
         STA COLREG
;
UPDATE   LDA DATARR,X         ; Give player computed new graphics data 
         STA GRAFP0,X
         LDA POSARR,X         ; Place player at computed new position
         JSR SETPOS
;
         INX                  ; next player
         CPX #5               ; process players 0 - 4 ("fifth player" enabled)
         BNE SLOOP
         JMP (SYSVBV+1)       ; exit from VBLANK when done
;
;  Initialization of player parameters etc.
;
INIT     LDA #DMADSB          ; turn off display while initializing 
         STA SDMCTL
         STA COLREG           ; start with color 0, luminance 0
         LDA #$11             ; players priority; enable 5th player
         STA GPRIOR
;
         LDX #$00             ; start with player 0
ILOOP    LDA #$FF
         STA SIZEP0,X         ; quadruple width players
         LDA DATARR,X
         STA GRAFP0,X         ; default graphics: P 0-3, all ON.  P4, all OFF 
         LDA POSARR,X         ; default positions
         JSR SETPOS
         LDA COLREG           ; hand out colors in order
         JSR SETCLR           ; set "current" player to "current" color
         CLC 
         ADC #COLRINC         ; prepare "next" color for "next" player
         STA COLREG
;
         INX                  ; do for players 0 - 4 
         CPX #5
         BNE ILOOP
         LDA #DMAPM           ; enable P/M display
         STA SDMCTL
         RTS 
;
;  SET COLOR OF PLAYER : handle fifth-player color-setting uniformly
;
SETCLR   CPX #$04            ; fifth player gets special processing
         BEQ CL4
         STA $02C0,X         ; player 0 - 3, simple offset 
         RTS 
CL4      STA $02C7           ; player 4, location of its own
         RTS 
;
;   SET POSITION OF PLAYER : handle fifth-player position-setting uniformly
;
SETPOS   CPX #$04            ; fifth player gets special processing
         BEQ POS4
         STA $D000,X         ; player 0-3 position registers contiguous
         RTS 
POS4     TAY                 ; save "position" value
         TXA                 ; save "player number"
         PHA 
         TYA                 ; restore "position" value 
         LDX #$03            ; player 4 -- 4 independent position registers;
;                              "reverse order" w/respect to graphics data bits 
PLOOP    STA $D004,X         ; position 4 missiles comprising player 4, so 
         CLC                 ; graphics data is displayed in same format as 
         ADC #$08            ; true players
         DEX 
         BPL PLOOP
;
         PLA                 ; restore player numher and position value
         TAX 
         TYA 
         RTS 
;
         *=  $02E0           ; Load-N-Go
         .WORD START




-- 
UUCP: <backbones>!{iuvax,pur-ee,uunet}!bsu-cs!cfchiesa 
cfchiesa@bsu-cs.UUCP