TITLE M5 INITIALIZATION LIST NOCOND ;*************************************************************************** ; ; M5 INITIALIZATION CODE ; ;*************************************************************************** ; ; This module contains the Z-80 code to perform self test and ; initialization of the M5b system. It is expected to get control after ; reset and reside at page 0. After self test it then moves ZMON2 to high ; memory and transfers control to the ZMON2 cold start routines. ; ;*************************************************************************** ; ; Revisions: ; ; 1.0 Release grh ; VERS EQU '10' ; ;*************************************************************************** SUBTTL DECLARATIONS PROMST EQU 0 ;START ADDRESS OF THIS PROM MONROM EQU 0800H ;START ADDRESS OF MONITOR CODE IN ROM OVROM EQU 1000H ;START ADDRESS OF MONITOR OVERLAYS IOROM EQU 3000H ;START ADDRESS OF I/O DRIVER ROM LOTEST EQU 0A000H ;PLACE TO PUT LOW MEMORY TEST MONST EQU 0F800H ;START OF MONITOR RAM IMAGE ;*INCLUDE MONBOARD.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE CLOCK.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE PROMIII.DEF ;*INCLUDE PRI.DEF ;*INCLUDE COMIOPB.DEF LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE CLOCK.DEF *INCLUDE ISHA.DEF *INCLUDE JDDCONT.DEF *INCLUDE PROMIII.DEF *INCLUDE PRI.DEF *INCLUDE COMIOPB.DEF LIST ON ;=========================================================================== ; ; I/O DRIVER PROM ENTRY POINTS ; ;=========================================================================== ORG IOROM NTINIT DS 3 ;NAKED TERMINAL INIT NTOUT DS 3 ;NAKED TERMINAL OUTPUT NTINI DS 3 ;NAKED TERMINAL INPUT INIT NTIN DS 3 ;NAKED TERMINAL INPUT (KEYBOARD) CR EQU 0DH LF EQU 0AH SUBTTL CODE ;--------------------------------------------------------------------------- ; ; BEGINNING OF SELF TEST ; ;--------------------------------------------------------------------------- ORG PROMST ; ; FIRST DISABLE MONITOR BOARD RAM IN CASE ITS INSTALLED ; LD A,8 OUT (0FCH),A ; ; REMOVE THE JADE CONTROLLERS FROM MEMORY 1ST ; LD C,41H X1: XOR A,A OUT (C),A INC C LD A,C CP 44H JR C,X1 ; ; TEST HIGH RAM ; LD HL,8000H ;SET PTR LD BC,8000H ;SET COUNT LD SP,HRAMDN - 2 ;FAKE RETURN ADDRESS IN ROM JP RAMTST ; DW HRAMDN HRAMDN: JR Z,HRAMOK ;IF HIGH RAM OK THEN GO DO LOW RAM ; ; FATAL ERROR- HIGH RAM NO GOOD FOR STACK! PRINT IT OUT! ; FRE: EXX ;SAVE ADDRESS LD DE,RAMMSG ;PRINT MESSAGE FRE3: LD A,(DE) OR A,A JR Z,FRE2 ; LD C,A INC DE LD SP,FRE1 - 2 JP NTOUT ; DW FRE1 FRE1: JR FRE3 ; FRE2: LD E,4 ;DIGIT COUNT ; EXX ;RESTORE BAD ADDRESS FOR OUTPUT LD A,H EXX ; FRE6: RLCA RLCA RLCA RLCA LD B,A AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A LD SP,FRE5 - 2 JP NTOUT ; DW FRE5 FRE5: LD A,B ;RESTORE BYTE FOR NEXT DIGIT DEC E ;IF COUNT EXHAUSTED THEN DONE JR Z,FRE10 ; BIT 0,E ;IF ODD THEN GO DO 2ND NIBBLE JR NZ,FRE6 ; EXX ;ELSE DO LOW BYTE LD A,L EXX JR FRE6 ; FRE10: LD C,'H' ;OUTPUT H SUFFIX LD SP,FRE11 - 2 JP NTOUT ; DW FRE11 FRE11: JR $ ;EFFECTIVELY HALT ; ; HIGH RAM OK, SET STACK & CHECK LOW RAM ; HRAMOK: LD SP,9000H ;SHOULD BE OK CALL TSTLOW JR NZ,FRE ; ; ALL RAM PASSED, GO ON TO SELF TESTS ; ;--------------------------------------------------------------------------- ; ; SELF TESTS: ; ;--------------------------------------------------------------------------- ; ; JADE FLOPPY CONTROLLERS ; LD C,41H ;START WITH 1ST BOARD JAD1: IN A,(C) ;SEE IF BOARD PRESENT INC A ;IF 0FFH THEN ABSENT JR Z,NOJADE ; ; CONTROLLER PRESENT, ANNOUNCE IT ; EXX LD HL,JADM ;OUTPUT BOARD PRESENCE CALL POUT EXX LD A,C ;OUTPUT PORT EXX SUB A,10H ;CONVERT 41..43H TO '1'..'3' LD C,A CALL NTOUT LD HL,JADM2 CALL POUT ; ; COMMAND THE SELF TEST ; EXX LD A,DDBGN ;RESET BOARD OUT (C),A ; LD HL,0 JAD2: IN A,(C) ;CHECK FOR DONE BIT DDSHLT,A JR Z,JAD4 ; DEC HL ;WAIT FOR A WHILE LD A,L OR A,H JR NZ,JAD2 ; ; CONTROLLER TIMEOUT! ; JAD3: EXX LD HL,TMOM CALL POUT EXX JR NOJADE ; ; CONTROLLER DONE, GET RESULTS ; JAD4: LD A,DDMB0 ;FETCH RESULTS OUT (C),A ; IN A,(C) ;COMPUTE BOARD ADDRESS AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,0A0H ;STORE DATA LD L,C LD (HL),A ; LD H,A LD L,0 LD DE,DDCBO ADD HL,DE PUSH HL POP IX ; LD A,(IX + PBSTATO) ;GET SELF TEST STATUS OR A,A JR NZ,JAD5 ; ; CONTROLLER PASSED ; EXX LD HL,PM CALL POUT EXX JR NOJADE ; ; CONTROLLER FAILED ; JAD5: EXX ;OUTPUT FAILED LD HL,FM CALL POUT ; LD A,(IX + PBSTATO) ;OUTPUT STATUS CALL OUTBH EXX ; ; NEXT BOARD ; NOJADE: XOR A,A ;REMOVE FDC WINDOW OUT (C),A ; INC C ;NEXT PORT LD A,C CP A,44H JR C,JAD1 ; ; ;--------------------------------------------------------------------------- ; ; TEST INTELLIGENT SASI HOST ADAPTER ; ;--------------------------------------------------------------------------- IN A,(HSTATUS) ;CHECK FOR PRESENCE INC A JR Z,NOISHA ; ; BOARD FOUND, TEST IT ; LD HL,ISHAM ;REPORT FIND CALL POUT ; LD A,1 SHL HRESET ;START THE TEST OUT (HCMD),A XOR A,A OUT (HCMD),A ; LD HL,0 ;WAIT FOR DONE ISHA1: IN A,(HSTATUS) BIT HBUSYB,A JR NZ,ISHADN ; DEC HL ;IF COUNT NOT EXHAUSTED THEN REPEAT LD A,L OR A,H JR NZ,ISHA1 ; ; ERROR, BOARD TIMED OUT ; LD HL,TMOM CALL POUT JR NOISHA ; ; CHECK FOR SELF TEST ERROR ; ISHADN: IN A,(HDATA) ;FETCH SELF TEST STATUS OR A,A JR NZ,ISHAER ; ; ISHA OK ; LD HL,PM CALL POUT JR NOISHA ; ; ISHA ERROR ; ISHAER: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOISHA: ; ; ;--------------------------------------------------------------------------- ; ; CROMEMCO 'PRI' PRINTER INTERFACE SELF TEST ; ;--------------------------------------------------------------------------- IN A,(PRI1ST) ;TEST FOR PRESENCE INC A JR Z,NOPRI ; ; ANNOUNCE THE BOARD'S PRESENCE ; LD HL,PRIM CALL POUT LD HL,PTM CALL POUT ; NOPRI: ; ; ;--------------------------------------------------------------------------- ; ; PROM PROGRAMMER SELF TEST ; ;--------------------------------------------------------------------------- IN A,(PRMST) ;CHECK IF BOARD PRESENT INC A JR Z,NOPROM ; ; BOARD PRESENT, TEST IT! ; LD HL,PROMM CALL POUT ; LD A,1 SHL PPG ;OUTPUT PROGRAM GATE BIT TO READ DATA REGISTER OUT (PRMCMD),A LD C,PDATA ;SET UP DATA PORT # ; ; TEST DATA REGISTER FOR ALL 0S ; LD E,0 CALL REGCMP LD A,1 ;PASS ERROR # JR NZ,PROME ; ; TEST DATA REGISTER FOR ALL 1S ; LD E,-1 ;CHECK OPPOSIT CALL REGCMP LD A,2 JR NZ,PROME ; ; TEST DATA REGISTER WITH A WALKING 1 TEST ; LD E,1 LD B,8 PROM2: CALL REGCMP PUSH AF LD A,B ;PASS COUNT + 10H BACK AS ERROR ADD A,10H LD D,A POP AF LD A,D JR NZ,PROME ; SLA E ;WALK BIT LEFT DJNZ PROM2 ; ; TEST A/D EOC ; CALL GETAD ;FETCH A/D DATA LD L,A LD A,3 ;PASS BACK ERROR 3 JR C,PROME ; ; TEST A/D DATA ; LD A,L OR A,A ;IF 0 OR FFH THEN ERROR LD A,4 JR Z,PROME ; INC L LD A,5 JR Z,PROME ; ; SELF TEST PASSED ; LD HL,PM CALL POUT JR NOPROM ; ; SELF TEST FAILED ; PROME: PUSH AF ;SAVE ERROR CODE LD HL,FM CALL POUT POP AF CALL OUTBH ; NOPROM: ; ; ;--------------------------------------------------------------------------- ; ; CLOCK SELF TEST ; ;--------------------------------------------------------------------------- IN A,(CLKDAT) ;CHECK FOR PRESENCE INC A JR Z,NOCLK ; ; CLOCK PRESENT, TEST IT ; LD C,CLKSECL ;WAIT FOR SECONDS TO CHANGE CALL GETD AND A,CLKDMSK LD B,A LD HL,0 ;SET ALARM CLK1: CALL GETD AND A,CLKDMSK CP A,B JR NZ,CLK2 ; DEC HL LD A,L OR A,H JR NZ,CLK1 ; ; TIMEOUT - FAILURE ; LD HL,FM CALL POUT JR NOCLK ; ; PASS ; CLK2: LD HL,PM CALL POUT ; NOCLK: ; ; ;--------------------------------------------------------------------------- ; ; NOW BOOT MONITOR CODE ; ;--------------------------------------------------------------------------- ; ; BLOCK MOVE MONITOR TO HIGH RAM ; LD HL,MONROM LD DE,MONST LD BC,2048 LDIR ; ; TEST LOAD ; LD HL,MONROM LD DE,MONST LD BC,2048 MONTST: LD A,(DE) CP A,(HL) JR NZ,MONERR ; INC HL INC DE DEC BC LD A,C OR A,B JR NZ,MONTST ; ; MONITOR CODE LOADED & VERIFIED ; JP MONST ; ; MONITOR LOAD ERROR ; MONERR: PUSH HL ;SAVE ERROR STATUS PUSH DE PUSH HL ; LD HL,MONERM ;OUTPUT ERROR CALL POUT ; POP HL ;OUTPUT ADDRESS CALL OUTW CALL OUTSPC ; POP DE ;OUTPUT BITS IN ERROR POP HL LD A,(DE) XOR A,(HL) CALL OUTBH ; JR $ ;EFFECTIVELY HALT SUBTTL FUNCTIONS & SUBROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST LOW RAM FUNCTION ; EXIT - ZF= PASS, NZ= FAIL ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TSTLOW: LD HL,TSTLO1 ;MOVE THIS CODE TO HIGH RAM LD DE,LOTEST LD BC,TLSIZE LDIR JP LOTEST ; ; NOW EXECUTING IN HIGH MEMORY ; TSTLO1: XOR A,A ;TURN OFF 32K BYTESAVER OUT (40H),A ; CALL RAMTST - TSTLO1 + LOTEST ;DO THE TEST ; LD A,2 ;TURN BYTESAVER BACK ON & RETURN OUT (40H),A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NON DESTRUCTIVE RAM TEST FUNCTION ; ENTRY- HL= RAM PTR ; BC= COUNT ; EXIT - ZF= PASS, NZ= FAIL (HL= BAD LOCATION ADDRESS) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RAMTST: LD A,(HL) ;FETCH BYTE CPL ;INVERT IT LD (HL),A ;STORE IT CP (HL) ;TEST IT CPL ;RESTORE ORIGINAL DATA LD (HL),A RET NZ ;IF BAD THEN RETURN NZ ; INC HL ;NEXT LOCATION DEC BC ;IF COUNT NOT EXHAUSTED THEN REPEAT LD A,C OR A,B JR NZ,RAMTST ; RET ;ELSE RETURN ; TLSIZE EQU $ - TSTLO1 ;*************************************************************************** ; ; OUTPUT TEXT SUBR ; ENTRY- HL= TEXT PTR ( > 7FH = LAST CHAR) ; ;*************************************************************************** POUT: LD C,(HL) PUSH HL RES 7,C CALL NTOUT POP HL BIT 7,(HL) ;IF CHAR >= 80H THEN DONE RET NZ ; INC HL JR POUT ;*************************************************************************** ; ; OUTPUT HEX WORD SUBR ; ENTRY- HL= WORD ; ;*************************************************************************** OUTW: LD A,H ;START WITH HIGH BYTE PUSH HL CALL OUTB POP HL LD A,L CALL OUTB ;*************************************************************************** ; ; OUTPUT 'H' SUBR ; ;*************************************************************************** OUTH: LD C,'H' JP NTOUT ;*************************************************************************** ; ; OUTPUT HEX BYTE SUBR ; ENTRY- A= BYTE ; ;*************************************************************************** OUTBH: CALL OUTB ;OUTPUT WITH 'H' APPENDED JR OUTH ; ; OUTB: CALL PRDIG PRDIG: RLCA RLCA RLCA RLCA PUSH AF PUSH HL AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A CALL NTOUT POP HL POP AF RET ;*************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;*************************************************************************** OUTSPC: LD C,' ' JP NTOUT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET CLOCK DATA FUNCTION ; ENTRY- C= CLOCK REGISTER # ; EXIT - A= REGISTER DATA ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETD: LD A,C ;SET UP READ SET CLKRD,A OUT (CLKCMD),A ; ; DELAY A WHILE ; EX (SP),HL EX (SP),HL ; ; RETURN DATA ; IN A,(CLKDAT) RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMPARE PORT DATA READ-BACK FUNCTION ; ENTRY- C= PORT # ; E= PORT DATA IMAGE ; EXIT - A= DATA READ BACK ; ZF= PASS, NZ= FAIL ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ REGCMP: OUT (C),E IN A,(C) CP A,E RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET A/D DATA FUNCTION ; EXIT - A= DATA ; CF= NO EOC ERROR ; B= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETAD: LD A,[1 SHL PSCV] + [1 SHL PVO] ;ISSUE START CONVERT PULSE OUT (PRMCMD),A RES PSCV,A OUT (PRMCMD),A ; ; WAIT A WHILE FOR EOC ; LD B,0 EOCLP: IN A,(PRMST) AND A,PRMEOC JR Z,GOTEOC ; ; IF NO TIMEOUT THEN REPEAT ; DJNZ EOCLP ; ; ELSE RETURN TIMEOUT FLAG ; SCF RET ; ; GOT EOC, RETURN DATA ; GOTEOC: IN A,(PADDAT) OR A,A RET SUBTTL DATA RAMMSG: DB CR,LF,'RAM ERROR AT ',0 MONERM: DM CR,LF,'MONITOR LOAD ERROR AT ' JADM: DM CR,LF,'JADE FDC AT 4' JADM2: DM 'H =' ISHAM: DM CR,LF,'ISHA =' PRIM: DM CR,LF,'PRI =' PROMM: DM CR,LF,'PROM =' CLKM: DM CR,LF,'CLOCK =' PM: DM ' PASS' FM: DM ' FAILED ' PTM: DM ' PRESENT' TMOM: DM ' TIMED OUT' END