SUBTTL 'POWER ON TEST' ; ********************************************************* ; * * ; * POWER ON TEST * ; * * ; ********************************************************* ; ; POTEST.ASM ; FEBRUARY 22TH, 1983 ; BY CHRIS MAYER ; ; MODULE 1 --ROM1-- ENTRY POINTS ; ; POWER ON DIAGNOSTICS ; ; ; PODIAG: START OF DIAGNOSTIC TEST ; MEMORY_TEST: START OF MEMORY TEST ; ROM_TEST: START OF ROM TEST ; LSI_TEST: START OF LSI REGISTERS TEST ; DIAG_INIT: INITIALIZES SYSTEM FOR DIAGNOSTIC PAGE .Z80 ; .XLIST ; INCLUDE SYSS1.MAC ;SYSTEST FILE ; INCLUDE RAMS10.MAC ;RAM MEMORY LOCATIONS AND CONSTANTS ; INCLUDE RAMSMON.MAC ;MONITOR RAM MEMORY LOCATIONS ; .LIST ; ;SYSS1.MAC , RAMSMON.MAC AND RAMS10.MAC INCLUDED ; EXT SET_INT,INITIALIZE,INIT_INT,COUT,AUTOBOOT,OSTR ; PUBLIC PODIAG,L_PWR_UP,DIAG_INIT PAGE PODIAG: LD A,0 PWR_UP: DI EX AF,AF' ;RESET REPEAT FLAG XJ007: CALL MEMORY_TEST MEM_DONE: CALL ROM_TEST CALL LSI_TEST LD A,0FFH EX AF,AF' CP 0FFH ;LOOP FLAG SET ? JP Z,XJ007 CALL DIAG_INIT ;RESTORE INTERRUPTS & STUFF LD C,'G' -040H CALL COUT ;YEA! WE MADE IT LD SP,ROMSTK EI JP AUTOBOOT ;ALL DONE L_PWR_UP: LD A,0FFH JP PWR_UP ;***** MEMORY TEST ***** MEMORY_TEST: LD SP,0BFFFH ;STACK = TPA UNDER VIDEO MEMORY LD A,0C0H ;TEST VIDEO MEMORY OUT (SYS_DTA),A LD HL,0C000H ;SET FIRST ADDRESS POINTER LD BC,4*1024 ;SET BLOCK SIZE LD A,0AAH ;SET TEST PATTERN CALL MEM_TEST LD A,055H CALL MEM_TEST EX AF,AF' PUSH AF ;SAVE LOOP FLAG CALL DIAG_INIT ;RESTORE CONSOLE STUFF LD DE,TEST_MESSAGE ;CLEAR JUNK FROM VIDEO TEST CALL OSTR ; & SHOW TEST MESSAGE DI POP AF EX AF,AF' ;RESTORE LOOP FLAG LD HL,02000H ;TEST ROM'S RAM LD BC,2*1024 LD A,0AAH CALL MEM_TEST LD A,055H CALL MEM_TEST LD SP,027FFH ;STACK = TOP OF ROM'S RAM LD A,080H ;TEST BANK 0 OUT (SYS_DTA),A LD HL,04000H LD BC,48*1024 LD A,0AAH CALL MEM_TEST LD A,055H CALL MEM_TEST LD A,081H ;TEST BANK 1 OUT (SYS_DTA),A LD HL,04000H LD BC,44*1024 LD A,0AAH CALL MEM_TEST LD A,55H CALL MEM_TEST CALL UNIQUE_ADDR JP MEM_DONE ;RET IS FUNNY AFTER A MEM TEST MEM_TEST: PUSH HL PUSH BC ;SAVE REGISTERS FOR NEXT PATTERN PUSH HL PUSH BC ;SAVE REGISTERS FOR CPI# LD E,L LD D,H ;DE <- HL INC DE ;SETTING DE UP FOR LDIR LD (HL),A DEC BC ;FIRST LOAD WAS DONE 'BY HAND' LDIR ;FILL MEMORY POP BC POP HL ;RESTORE REGISTERS FOR CPI# MEM_CHECK: CPI LD IY,' M' ;M = MEMORY ERROR JP NZ,ERROR ;HOPE IT'S THE SAME JP PE,MEM_CHECK ;DONE YET ? POP BC POP HL ;RESTORE REGISTERS FOR NEXT TEST RET UNIQUE_ADDR: LD IY,' U' ;U = UNIQUE ADDRESS TEST ERROR LD A,0 ;DATA WRITTEN LD B,15 LD DE,1 LD HL,08001H ;ADDRESS POINTER XJ008: LD (HL),A ;WRITE DATA INC A ;CHANGE IT ADD HL,DE ;POINT TO NEXT ADDRESS EX DE,HL ADD HL,HL EX DE,HL ;DOUBLE DE DJNZ XJ008 ;15 TIMES LD (08000H),A INC A LD (07FFFH),A LD C,0 LD B,15 LD DE,1 LD HL,08001H XJ009: LD A,(HL) ;READ DATA CP C JP NZ,ERROR INC C ADD HL,DE ;POINT TO NEXT ADDRESS EX DE,HL ADD HL,HL EX DE,HL ;DOUBLE DE DJNZ XJ009 LD A,(08000H) CP C JP NZ,ERROR INC C LD A,(07FFFH) CP C ;CHECK LAST ADDRESS JP NZ,ERROR RET ;THE PATTERN IS AS FOLLOWS: ;10000000_00000001B 00 ;10000000_00000010B 01 ;10000000_00000100B 02 ;10000000_00001000B 03 ;10000000_00010000B 04 ;10000000_00100000B 05 ;10000000_01000000B 06 ;10000000_10000000B 07 ;10000001_00000000B 08 ;10000010_00000000B 09 ;10000100_00000000B 0A ;10001000_00000000B 0B ;10010000_00000000B 0C ;10100000_00000000B 0D ;11000000_00000000B 0E ;10000000_00000000B 0F ;01111111_11111111B 10 ;***** ROM CHECK-SUM VERIFICATION ***** ROM_TEST: LD HL,0 ;POINTER TO BYTES TO ADD UP LD IX,0 ;MID & LOW BYTES ACCUMULATOR LD BC,8*(1024)-3 ;# OF BYTES TO ADD UP LD DE,0 LD A,0 ;HIGH BYTE ACCUMULATOR PUSH AF MORE: POP AF ;RESTORE HIGH BYTE OF SUM LD E,(HL) ;GET BYTE INC HL DEC BC ADD IX,DE ADC A,0 ;ADD CARRY TO HIGH BYTE PUSH AF ;SAVE HIGH BYTE OF CHECK-SUM LD A,B OR C JR NZ,MORE ;FINISHED ADDING YET ? POP AF LD HL,8*(1024)-1 CP (HL) ;COMPARE WITH HIGH BYTE LD IY,' R' ;R = ROM ERROR JP NZ,ERROR PUSH IX POP DE DEC HL ;POINT TO MID BYTE LD A,D CP (HL) ;COMPARE WITH MIDDLE BYTE JP NZ,ERROR DEC HL LD A,E CP (HL) ;COMPARE WITH LOW BYTE JP NZ,ERROR RET ;YEA YEA, ROM'S O.K. ! ;***** LSI REGISTERS TEST ***** LSI_TEST: LD IY,' P' ;P = PARALELL CHIP ERROR CALL PIA LD IY,' S' ;S = SIO ERROR CALL SIO ; LK IY,' C' ;C = CTC ERROR ; CALL CTC8253 RET PIA: LD A,03FH ;TOP 2 BITS ARE INTERRUPTS CALL XJ010 ;TEST SYS CONTROL REGISTERS LD A,0 CALL XJ010 LD A,080H ;HIGH BIT KEEPS THE ROM ON CALL XJ011 ;TEST SYS DIR REGISTERS LD A,0FFH CALL XJ011 LD A,04H OUT (SYS_CNA),A OUT (SYS_CNB),A ;ENABLE DATA REGISTERS LD A,010001000B ;HIGH BIT KEEPS THE ROM ON CALL XJ011 ;TEST SYS DATA REGISTERS LD A,011110111B ;THIS PATTERN LEAVES DRIVES & SPEAKER OFF CALL XJ011 RET XJ010: LD B,A OUT (SYS_CNA),A OUT (SYS_CNB),A IN A,(SYS_CNA) AND 00111111B CP B JP NZ,ERROR IN A,(SYS_CNB) AND 00111111B CP B JP NZ,ERROR RET XJ011: LD B,A OUT (SYS_DTA),A OUT (SYS_DTB),A IN A,(SYS_DTA) CP B JP NZ,ERROR IN A,(SYS_DTB) CP B JP NZ,ERROR RET SIO: LD C,0 CALL SIO_TEST LD C,0F1H CALL SIO_TEST RET SIO_TEST: LD A,2 OUT (SIO_CNB),A ;POINT TO WRITE REG 2 LD A,C OUT (SIO_CNB),A ;WRITE PATTERN LD A,2 OUT (SIO_CNB),A ;POINT TO READ REGISTER 2 IN A,(SIO_CNB) ;READ IT BACK AND 011110001B ;REMOVE BITS WHICH MAY CHANGE ;BECAUSE OF STATUS AFFECTS VECTOR ;STATE OF SIO CP C JP NZ,ERROR ;THEY BETTER BE THE SAME ! RET ;CTC8253: LK C,TIM_CT0 ; CALL CTC_TEST ; LK C,TIM_CT1 ; CALL CTC_TEST ; LK A,060H ; OUT TIM_CT2 ; LK A,0 ; OUT TIM_CT2 ;CT2 NEVER GETS INITIALIZED ; LK C,TIM_CT2 ; CALL CTC_TEST ; RET ; ;CTC_TEST: IN,C A ; MOV E,A ; IN,C A ; MOV D,A ;PUT VALUE IN DE ; IN,C A ; MOV L,A ; IN,C A ; MOV H,A ;PUT 'LATER' VALUE IN HL ; OR A ;RESET CARRY FLAG FOR SBC ; SBC HL,DE ; MOV A,H ; OR L ; JZ ERROR ;COUNTER NOT DECREMENTING ! ; RET ;***** COMMON ROUTINES AND MESSAGES ***** ERROR: PUSH IY ;SAVE ERROR CODE CALL INITIALIZE ;RESTORE INTERRUPTS & STUFF LD DE,ERROR_MSG ;OH NOOOOOO ! CALL OSTR LD A,0C0H OUT (SYS_DTA),A POP BC ;RESTORE ERROR CODE LD HL,0C000H LD (HL),C ;SHOW WHICH ERROR JR $ ;SO RESET JUMPS TO BOOT ROUTINE TEST_MESSAGE: DB 'Z'-040H,ESC,'=',32+10,32+30,'PERFORMING SELF-TES' DC 'T' ERROR_MSG: DB ESC,'=',32+10,32+25, 'COMPUTER NOT WORKING PROPERLY' DB ESC,'=',32+11,32+24,'PLEASE CONTACT AN OSBORNE DEALER' DB ESC,'=',32+12,32+28 ,'PROCEED AT YOUR OWN RIS' DC 'K' PAGE ; ********************************************************* ; * * ; * DIAGNOSTIC INITIALIZATION * ; * * ; ********************************************************* ;INITIALIZE SYSTEM FOR DIAGNOSTIC DIAG_INIT: CALL INITIALIZE ;INITIALIZE MEMORY & SYSTEM PIA CALL SET_INT ;INDIVIDUALLY DISABLE ALL INTERRUPTS EXCEPT RESET CALL INIT_INT ;INITIALIZE SIO AND REENABLE ALL THE INTERRUPT RET