 .PAGE 'DSKINT'
;
; ERROR DISPLAY ROUTINE
; BLINKS THE (ERROR #)+1 IN ALL THREE LEDS
;
TABJMP SEI
 LDA #0
 STA $403
 JMP $FC04 ;JMP TO WAIT LOOP
;
PEZRO LDX #0 ;ERROR #1 FOR ZERO PAGE
 .BYTE $2C ;SKIP NEXT TWO BYTES
PERR LDX TEMP ;GET ERROR #
 TXS ;USE STACK AS STORAGE REG.
PE20 TSX ;RESTORE ERROR #
PE30 LDA #ERRLED+LED0+LED1
 STA PBD2 ;TURN ON ALL THREE LEDS
 TYA ;CLEAR INNER CTR
PD10 CLC
PD20 ADC #1 ;COUNT INNER CTR
 BNE PD20
 DEY ;DONE ?
 BNE PD10 ;NO
;
 STY PBD2 ;TURN OFF ALL LEDS
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
 .SKIP 3
DSKINT
 SEI
 CLD
 LDX #$FF
 STX IEEEDO
 STX PBDD1
 INX
 STX PBD2
 LDA #DAVO+EOIO+RFDO
 STA PAD2
 LDA #$1F
 STA PADD2
 LDA #ERRLED+LED0+LED1
 STA PBDD2
;
;
;*********************************
;
; POWER UP DIAGNOSTIC
;
;*********************************
;
PU10 TXA ;FILL Z-PAGE ACCEND PATTERN
 STA $0,X
 INX
 BNE PU10
PU20 TXA ;GET X INTO Y
 TAY
 INY ;START Y CTR ONE AHEAD OF MEMORY
PU30 INC $0,X ;BUMP MEMORY AROUND TO $FF
 INY ;BUMP Y AROUND TO $00
 BNE PU30 ;NOT THERE YET
 LDY $0,X ;CHECK IF MEMORY AT $FF
 INY
 BNE PEZRO ;NO - SHOW ERROR #
 INC $0,X ;YES - BUMP MEMORY TO $00
 BNE PEZRO ;NOT ZERO - SHOW ERROR #
 INX ;NEXT MEMORY LOCATION
 BNE PU20
 .SKIP 3
; TEST THREE FILE SIDE ROMS
;
; ENTER X=START PAGE
; EXIT IF OK
;
RM10 INC TEMP ;NEXT ERROR #
 STX IP+1 ;SAVE PAGE, START X=0
 LDA #0
 STA IP ;ZERO LO INDIRECT
 TAY
 LDX #16 ;16 PAGES IN 4K ROM
 CLC
RT10 DEC IP+1 ;DO IT BACKWARDS
RT20 ADC (IP),Y ;TOTAL CHECKSUM IN A
 INY
 BNE RT20
 DEX
 BNE RT10
 ADC #0 ;ADD IN LAST CARRY
 TAX ;SAVE LOWER PAGE IN X
 CMP IP+1 ;CORRECT ?
PERR2
 BNE PERR ;NO - SHOW ERROR NUMBER
;
 CPX #$D0 ;DONE ALL THREE ?
 BNE RM10 ;NO
RCON1
 LDA TABJMP,Y ;TRANSFER JMP TO WAIT LOOP
 STA BUFS,Y
 INY
 BNE RCON1
;
 LDA #JUMPC
 STA JOBS ;SEND CONTRLR AWAY
 INC TEMP
CDELAY
 INY
 BNE CDELAY
 LDA JOBS
 BEQ CR20
;
 DEX
 BMI CDELAY
 BNE PERR2
 .SKIP 3
; TEST ALL COMMON RAM EXECPT PAGE $1000
;
CR20 LDA #$10 ;START OF 1ST BLOCK
CR30 STA IP+1 ;SAVE PAGE #
 INC TEMP ;BUMP ERROR #
; ENTER X=# OF PAGES IN BLOCK
;  IP PTR TO FIRST PAGE IN BLOCK
; EXIT IF OK
;
RAMTST LDX #4 ;SAVE PAGE COUNT
RA10 TYA ;FILL WITH ADR SENSITIVE PATTERN
 CLC
 ADC IP+1
 STA (IP),Y
 INY
 BNE RA10
 INC IP+1
 DEX
 BNE RA10
 LDX #4 ;RESTORE PAGE COUNT
RA30 DEC IP+1 ;CHECK PATTERN BACKWARDS
RA40 DEY
 TYA ;GEN PATTERN AGAIN
 CLC
 ADC IP+1
 CMP (IP),Y ;OK ?
 BNE PERR2 ;NO - SHOW ERROR #
 EOR #$FF ;YES - TEST INVERSE PATTERN
 STA (IP),Y
 EOR (IP),Y ;OK ?
 STA (IP),Y ;LEAVE MEMORY ZERO
 BNE PERR2 ;NO - SHOW ERROR #
 TYA
 BNE RA40
 DEX
 BNE RA30
;
 LDA IP+1 ;GET FIRST PAGE OF BLOCK
 CLC
 ADC #$10 ;NO - NEXT BLOCK
 CMP #$50 ;DONE ?
 BNE CR30 ;NO
 .SKIP 3
;*********************************
;
; CONTROLLER TEST GOES HERE
;
;*********************************
 .SKIP 3
DIAGOK
 LDX #$FF
 TXS
 LDA PBD2 ;CLEAR LEDS
 AND #255-ERRLED-LED0-LED1
 STA PBD2
;
 LDA PBD2 ;COMPUTE PRIMARY ADDR
 AND #7
 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 0 TO 5 FREE
 STA LINUSE
 .SKIP
 LDA #RDYLST
 STA CHNRDY+CMDCHN
 LDA #RDYTLK
 STA CHNRDY+ERRCHN
 LDA #0
 STA BUFUSE
 LDA #$F0
 STA BUFUSE+1
 JSR USRINT ;INIT USER JMP
;
; SET INDIRECT VECTORS
 LDA #<DIAGOK
 STA VNMI
 LDA #>DIAGOK
 STA VNMI+1
;
 LDA #10 ;SET UP SECTOR OFFSET
 STA SECINC
 STA REVCNT
 .SKIP
;*
;*
;********************************
;*
;*   SETSEC
;*   SET UP THE SECTORS/TRACK
;*   TABLE DEPENDING ON THE
;*   CONTROLLER USED
;*
;********************************
;*
;*
SETSEC LDA ID ;LOOK AT CT ID BYTE
 LDX #0 ;LOAD INDEX FOR 2040
 CMP #ID2040 ;IS IT THE 2040?
 BEQ SETS30 ;JMP TO LOAD TABLE
SETS10
 LDX #CTBSIZ ;LOAD INDEX FOR 2030
 CMP #ID2030
 BEQ SETS30 ;JMP TO LOAD TABLE
SETS20
 INC TEMP
 JMP PERR ;NOT A GOOD CONTROLLER
SETS30
 LDY #0 ;SET UP TABLE
SETS40
 LDA SECTRK,X ;LOAD #SECTORS
 STA NUMSEC,Y ;STORE IN TABLE
 INX
 INY
 CPY #CTBSIZ ;DONE YET?
 BNE SETS40 ;NOT YET
;
;
;*
;*******************************
;*
;*    SETERR
;*    SET UP POWER ON ERROR MSG
;*
;*    CBM DOS V2.0 (C)1979
;*
;*******************************
;*
;*
;
SETERR LDA #$73
 JSR ERRTS0
;*
;*
;**************************
;*
;*  POWER ON BUMP
;*
;**************************
;
PONBMP LDA #1
 STA $1023
 STA $102B ; INIT TRACK IN HDR
 LDA #$C0
 STA $1003
 LDA #$C1
 STA $1004 ; DO THE BUMPS
;
;ALLOW ATN TO INTERRUPT
 STA ATNPE
;MUST BE CONTIGUOUS TO .FILE IDLE
;
.END
