;***************************************
;
; ERROR DISPLAY ROUTINE
; BLINKS THE (ERROR #)+1 IN BOTH LEDS
;
;***************************************
;
; ERROR CODES AND THEIR MEANING
;
; 1 = ROM CHIP 1 LRC FAILURE
; 2 = ROM CHIP 2 LRC FAILURE
; 3 = RAM TEST FAILURE
; 4 = REFRESH TEST FAILURE
; 7 = PROGRAM BUG IN DOS
;
PGMCHK ;DOS BUG ERROR
 LDX #7 ;*
 .BYTE $2C ;SKIP NEXT INST
PERR LDX TEMP ;GET ERROR #
 SEI ;DISABLE
 TXS ;USE STACK AS STORAGE REG.
PE20 TSX ;RESTORE ERROR #
PE30 LDA #$F3 ;LED0+LED1
 AND DRDBI ;TURN ON BOTH LEDS
 STA DRDBI ;*
 STA DRDB ;*
 TYA ;CLEAR INNER CTR
PD10 CLC
PD20 ADC #1 ;COUNT INNER CTR
 BNE PD20
 DEY ;DONE ?
 BNE PD10 ;NO
;
 LDA #$0C ;TURN OFF BOTH LEDS
 ORA DRDBI ;*
 STA DRDBI ;*
 STA DRDB ;*
PE40 ;WAIT
 TYA ;CLEAR INNER CTR
PD11 CLC
PD21 ADC #1 ;COUNT INNER CTR
 BNE PD21
 DEY ;DONE ?
 BNE PD11 ;NO
;
 DEX ;BLINKED # ?
 BPL PE30 ;NO - BLINK AGAIN
 CPX #$FC ;WAITED BETWEEN COUNTS ?
 BNE PE40 ;NO
 BEQ PE20 ;ALWAYS - ALL AGAIN
 .PAG 'DOS BEGIN'
;***************************************
;
;    HARDWARE JUMPS HERE WHEN RESET
;
;***************************************
DSKINT ;POWER ON RESET COMES HERE
 SEI ;DISABLE INTERRUPTS
 CLD ;SET BINARY MODE
 LDX #$FF ;LOAD THE STACK POINTER
 TXS ;*
 LDA #0
 STA IEACR ;STOP NMI IF SOFT RESET
 STA TEMP ;ZERO ERROR #
 STA DRCA ;ADD DIRECTION REG
 LDX #255 ;MAKE ALL OUTPUTS
 STX DRDA ;*
 LDY #%00000100 ;CA1 ATN INT HIGH
 STY DRCA ;CA2 ATN INT LOW
 ;ADD DATA REG
 LDY #04 ;ADD DATA REG
 STY DRCB ;*
 LDY #$41 ;RESET SEQUENCER
 STY DRDB ;& LIGHT BOTH LIGHTS
 STA DRCB ;ADD DIR REG
 STX DRDB ;MAKE ALL OUTS
 LDA #%00111100 ;ADD DATA REG
 ;AND SET RFDMSK
 STA DRCB ;*
 JSR GLIT1 ;ENABLE ATTN GLITCH CHK
;
 .PAG 'POR ROM DIAG'
;*********************************
;
; POWER UP ROM DIAGNOSTIC
;
;*********************************
;
; TEST THE TWO ROMS
;
;
RM10
 LDA #0 ;START AT FF00
 STA TEMP+2 ;SAVE PAGE, START X=0
 STA TEMP+1 ;ZERO LO INDIRECT
 TAY
RT05
 INC TEMP
 LDX #32 ;32 PAGES IN 8K ROM
RT10 DEC TEMP+2 ;DO IT BACKWARDS
RT20 EOR (TEMP+1),Y ;TOTAL CHECKSUM IN A
 INY
 BNE RT20
 DEX
 BNE RT10
 TAX ;SAVE LOWER PAGE IN X
 EOR TEMP+2 ;CORRECT ?
 BNE PERR2 ;NO - SHOW ERROR NUMBER
;
 CPX #$C0 ;DONE WITH BOTH ?
 BNE RT05 ;NO
 .PAG 'POR RAM DIAG'
;***************************************
;
;   POR RAM DIAGNOSTIC
;
;***************************************
;
CR20 LDA #$00 ;START OF 1ST BLOCK
 STA TEMP+1 ;SAVE PAGE #
 STA TEMP+2 ;*
 INC TEMP ;BUMP ERROR #
; ENTER X=# OF PAGES IN BLOCK
;  TEMP+1 PTR TO FIRST PAGE IN BLOCK
; EXIT IF OK
;
 LDY #BGTEST ;BEG DISPLACEMENT TO TST
 LDX #$1F ;SAVE PAGE COUNT
RA10 TYA ;FILL WITH ADR SENSITIVE PATTERN
 CLC
 ADC TEMP+2
 STA (TEMP+1),Y
 INY
 BNE RA10
 INC TEMP+2
 DEX
 BPL RA10
 LDX #$1F ;RESTORE PAGE COUNT
RA30 DEC TEMP+2 ;CHECK PATTERN BACKWARDS
RA40 DEY
 TYA ;GEN PATTERN AGAIN
 CLC
 ADC TEMP+2
 CMP (TEMP+1),Y ;OK ?
 BNE PERR2 ;NO - SHOW ERROR #
 EOR #$FF ;YES - TEST INVERSE PATTERN
 STA (TEMP+1),Y
 EOR (TEMP+1),Y ;OK ?
 STA (TEMP+1),Y ;LEAVE MEMORY ZERO
 BNE PERR2 ;NO - SHOW ERROR #
 TYA
 BEQ RA50
 CMP #BGTEST ;END ?
 BNE RA40 ;BR IF NOT
 CPX #0 ;LAST PAGE ?
 BEQ RA60 ;BR TO DONE
 BNE RA40
RA50
 DEX
 BPL RA30
;
RA60
 JMP POR ;LET CU SOFTWARE POWER UP
PERR2
 JMP PERR ;GO TO ERROR DISPLAY
RETURN ;IT RETURNS HERE
 LDA #$7F ;SET UP IRQ STACK POINTER
 STA IRQSP ;*
;
;  BE SURE REFRESH IS WORKING ON RAMS
;
 INC TEMP ;NEXT ERROR #
 LDY #0 ;DELAY VALUES = MAX
 LDX #0 ;*
DELL
 NOP ;MAIN DELAY LOOP
 DEX ;DELAY LETS MEMORY DECAY
 BNE DELL ;IF REFRESH NOT RUNNING
 DEY ;*
 BNE DELL ;*
 STY TEMP+1 ;NOW CHECK 800-1FFF
 LDA #>FMTCOD ;TO BE SURE ITS ALL ZEROES
 STA TEMP+2 ;*
 TYA ;ZEROES
DELL1
 LDA (TEMP+1),Y ;CHK=00
 BNE PERR2 ;BR IF ERROR
 INY
 BNE DELL1 ;LOOP THROUGH 256
 INC TEMP+2 ;NEXT PAGE
 LDA TEMP+2 ;CHK FOR END
 CMP #$20 ;$2000
 BNE DELL1 ;LOOP TILL DONE / ERROR
 .PAG 'DOS INITIALIZE'
;*********************************
;
; CONTINUE WITH DOS INITIALIZE
;
;*********************************
;
 LDA IEDATB ;COMPUTE PRIMARY ADDR
 AND #IEADR
 ORA #$48 ;TALK ADDRESS
 STA TLKADR
 EOR #$60 ;LISTEN ADDRESS
 STA LSNADR
;
; INITIALIZE BUFFER PNTR TABLE
;
INTTAB LDX #0
 LDY #0
INTT1 LDA #0
 STA BUFTAB,X
 INX
 LDA BUFIND,Y
 STA BUFTAB,X
 INX
 INY
 CPY #BFCNT+2
 BNE INTT1
;
 LDA #<CMDBUF ;SET PNTR TO CMDBUF
 STA BUFTAB,X
 INX
 LDA #>CMDBUF
 STA BUFTAB,X
 INX
 LDA #<ERRBUF ;SET PNTR TO ERRBUF
 STA BUFTAB,X
 INX
 LDA #>ERRBUF
 STA BUFTAB,X
;
 LDA #$FF
 LDX #MAXSA
DSKIN1 STA LINTAB,X
 DEX
 BPL DSKIN1
;
 LDX #MXCHNS-1
DSKIN2
 STA BUF0,X ;SET BUFFERS AS UNUSED
 STA BUF1,X
 STA SS,X
 DEX
 BPL DSKIN2
;
 LDA #BFCNT+2 ;SET BUFFER POINTERS
 STA BUF0+CMDCHN
 LDA #BFCNT+3
 STA BUF0+ERRCHN
 .SKIP
 LDA #ERRCHN
 STA LINTAB+ERRSA
 LDA #CMDCHN+$80
 STA LINTAB+CMDSA
 LDA #<LXINT ;LINDX ALL FREE
 STA LINUSE
 LDA #>LXINT ;LINDX ALL FREE
 STA LINUSE+1 ;*
 .SKIP
 LDA #RDYLST
 STA CHNRDY+CMDCHN
 LDA #RDYTLK
 STA CHNRDY+ERRCHN
 LDA #0 ;MARK 32 FREE BUFFERS
 STA BUFUSE
 STA BUFUSE+1
 STA BUFUSE+2
 STA BUFUSE+3
;
 LDA #RETRYS ;SET UP RECOVERY COUNT
 STA REVCNT
;
SETERR LDA #CBMV2 ;VERS # MSG
 JSR ERRTS0
 LDA #0 ;INIT DRIVE 0 -HD-
 STA DRVNUM ;*
 JSR HDEMPT ;MARK BAM NOT RESIDENT
 INC DRVNUM ;DO DRIVE 1 ALSO
 JSR HDEMPT ;MARK BAM NOT RESIDENT
 LDA #$C0 ;FORCE AUTO INIT
 STA DOOPSW ;*
 JSR ERROFF ;TURN OFF ERROR LEDS
;
;ALLOW ATN TO INTERRUPT
 LDX IRQSP ;INT STACK PTR
 TXS ;*
 JSR SEWAT ;WAIT FOR ATTENTION
 TSX ;SAVE STACK POINTER
 STX IRQSP ;SAVE FOR IRQ
 LDX #$FF ;REINIT STACK
 TXS ;*
 CLI ;ALLOW INTERRUPTS
 JSR PORBMP ;DO POWER UP RESTORES
 INC IRQREQ ;FORCE LOOK SEE AT ATN
; THIS MUST BE FOLLOWED BY BG IDLE
 .END
