;******************************************************** ;* * ;* COLD START INITIALIZATION ROUTINE FOR * ;* CONFIGURING THE SYSTEM AFTER A POWER-ON * ;* OR PUSHBUTTON RESET. * ;* * ;******************************************************** ; ; ; INIT: DI LD SP,TSTSTK LD DE,0 LD A,10H CALL CRCGEN ;VERIFY CRC IN FIRST 4K ROM INIT1: JR NZ,$ ;LOOP FOREVER IF BAD CRC ; ; ; PERFORM READ/WRITE TEST OF MONITOR AND GLOBAL VARIABLES RAM ; RAMTST: LD HL,MONITR LD DE,RAM LD A,1 RTST1: LD B,8 RTST2: LD (HL),A ;WRITE TEST BYTE INTO MONITOR/GLOBALS LD (DE),A RLCA ;ROTATE BIT PATTERN IN A INC HL INC E ;BUMP E TO DO INNER LOOP 256 TIMES JR NZ,RTST2 DJNZ RTST2 ;REPEAT 8 TIMES FOR 2048 BYTES LD C,8 RTST3: DEC HL DEC E RRCA CP (HL) ;VERIFY THAT TEST PATTERN IS WRITTEN JR NZ,$ ;STICK FOREVER IF MONITOR RAM FAILURE EX DE,HL CP (HL) EX DE,HL JR NZ,$ ;STICK FOREVER IF GLOBAL RAM FAILURE DJNZ RTST3 DEC C JR NZ,RTST3 ADD A,A JR NZ,RTST1 ;DO 8 PASSES OVER MEMORY BLOCKS ; ; LD SP,STACK ;LOAD STACK POINTER NOW THAT IT IS SAFE ; ; ; MOVE COPY OF RAM-RESIDENT ROUTINES TO HIGH MEMORY ; LD HL,MONCOPY LD DE,MONITR LD BC,MONLEN LDIR ; ; MOVE COPY OF INITIALIZED GLOBAL VARIABLES TO HIGH MEMORY ; LD HL,RAMCOPY LD DE,RAM LD BC,RAMLEN LDIR ; ; ; INITIALIZE Z80 FAMILY PROGRAMMABLE I/O DEVICES ; LD HL,IOTAB ;POINT TO I/O INIT TABLE INIT3: LD B,(HL) ;B=INIT LOOP BYTECOUNT INC HL LD C,(HL) ;C=DEVICE CONTROL PORT# INC HL OTIR ;SEND DATA @ HL TO PORT @ C BIT 7,(HL) ;TEST FOR TABLE END MARKER JR Z,INIT3 ;LOOP AGAIN IF NOT AT END ; ; ; FIRE-UP CRT DISPLAY ; LD HL,M1TAB IN A,(SENSE) ;TEST SENSE SWITCHES FOR 5*7 OR 7*9 BIT 4,A ; FONT AND PROGRAM 6845 ACCORDINGLY JR Z,SKIP1 LD HL,M2TAB SKIP1: CALL INITCRT ;PROGRAM 6845 CONFIGURATION REGISTERS CALL CLRALL ;CLEAR VIDEO DISPLAY MEMORY ; ; SET DISK PARAMETERS FOR 5 OR 8 INCH DRIVES ; IN A,(SENSE) BIT 5,A ;TEST DISK-TYPE SENSE SWITCH INPUT JR Z,SKIP2 ; AND JUMP IF 8 INCH DRIVES INDICATED LD A,00000011B LD (DSKTYP),A ;SET DISK TYPE FOR MINI-FLOPPIES LD A,15 LD (NREVS),A ;REQUIRE 15 REVOLUTIONS BEFORE READY LD A,5*20 LD (NSTOP),A ;STOP MOTORS AFTER 20 SECONDS SKIP2: CALL FLIPDENS ;SET SMC DATA SEPRARATOR INITAL VALUE ; ; INITIALIZE THE Z-80 FOR INTERRUPT MODE #2 LD HL,RAM LD A,H LD I,A ;LOAD I REG WITH MSB OF VECTOR TABLE IM 2 ; AND SELECT INTERRUPT MODE 2 ; ; ; DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE FOR THE ; ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL. ; LD DE,1000H LD A,18H CALL CRCGEN ;CHECK CRC OF SECOND ROM CALL Z,1000H ;EXECUTE SECOND ROM IF CRC VERIFIES CALL BELL ;BEEP THE BUZZER TO SAY WE ARE ALIVE IN A,(SENSE) AND 00001011B LD C,A ;SAVE STATE OF SENSE INPUT PORT DECIDE: IN A,(SENSE) AND 00001011B ;TEST FOR ARRIVAL OF A START BIT OR XOR C ; A CHANGE IN THE KEYBOARD STROBE JR Z,DECIDE BIT 3,A JR NZ,PARALL ;JUMP IF INPUT IF FROM KEYBOARD ; ; AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO ; BAUD: AND 00000011B LD C,A ;GET MASK BIT FOR SIO CHANNEL A/B LD B,0 BAUD1: IN A,(SENSE) ;READ SENSE INPUT PORT AND C ;TEST SIO RECEIVE INPUT BIT JR Z,BAUD1 ;LOOP UNTIL IT CHANGES STATE BAUD2: EX (SP),HL ;DELAY A BIT EX (SP),HL INC B IN A,(SENSE) ;LOOP TO MEASURE THE START BIT TIME AND C JR NZ,BAUD2 LD DE,RATES-1 BAUD3: INC DE ;INDEX INTO BAUD RATE TABLE RL B ; USING COUNT DERRIVED IN B JR NC,BAUD3 LD HL,SIOATAB ;POINT TO SIO CHANNEL A INIT STUFF BIT 0,C ;TEST IF USING SIO CHANNEL A OR B JR NZ,BAUD4 ;JUMP IF USING CHANNEL A LD HL,SIOBTAB ;ELSE POINT TO OTHER INIT DATA TABLE BAUD4: LD C,(HL) ;GET BAUDRATE CTC PORT# FROM TABLE INC HL LD A,01000111B OUT (C),A ;PUT BAUDRATE CTC IN COUNTER MODE LD A,(DE) OUT (C),A ;SET DIVIDE RATIO FOR SELECTED RATE LD E,(HL) ;LOAD E WITH SIO A/B CONTROL PORT# INC HL LD D,(HL) ;LOAD D WITH SIO A/B DATA PORT# INC HL LD (SIOADR),DE ;SAVE SIO CONTROL/DATA PORT NUMBERS LD C,E BAUD5: IN A,(C) ;LOOP UNTIL SIO CHANNEL RECEIVES BIT 0,A ; GARBLED FIRST CHARACTER JR Z,BAUD5 LD C,D IN A,(C) ;THEN READ AND DISCARD THE CHARACTER LD C,E LD A,1 OUT (C),A ;RE-PROGRAM SIO CHANNEL TO GENERATE LD A,00011100B ; INTERRUPTS ON RECIEVED DATA, OUT (C),A ; PARITY DOES NOT AFFECT VECTOR LD A,(HL) LD (CONNUM),A ;STORE NUMBER OF CONSOLE DEVICE LD HL,SIOOUT LD (CONOUT+1),HL ;RE-DIRECT CONSOLE OUTPUT TO SIO JR SIGNON ; ; DIVIDE RATIO TABLE FOR CTC-DERRIVED BAUD RATES ; RATES: DEFB 128 ; 300 BAUD DEFB 64 ; 600 BAUD DEFB 32 ; 1200 BAUD DEFB 16 ; 2400 BAUD DEFB 8 ; 4800 BAUD DEFB 4 ; 9600 BAUD DEFB 2 ; 19200 BAUD DEFB 2 ; 19200 BAUD ; ; SIOATAB: DEFB CTCB1 ;SIO CHANNEL A BAUDRATE CTC DEFB SIOCPA ; CONTROL PORT DEFB SIODPA ; DATA PORT DEFB 1 ; CONSOLE# ; SIOBTAB: DEFB CTCB0 ;SIO CHANNEL B BAUDRATE CTC DEFB SIOCPB ; CONTROL PORT DEFB SIODPB ; DATA PORT DEFB 2 ; CONSOLE# ; ; ; ; DETERMINE KEYBOARD STROBE POLARITY AND PROGRAM INTERRUPTS ; PARALL: IN A,(SENSE) XOR C BIT 3,A JR NZ,PARALL ;WAIT UNTIL STROBE GOES AWAY PARL3: LD A,11000111B ;PROGRAM CTCA0 FOR KBD INTERRUPT BIT 3,C JR NZ,PARL4 ;DETERMINE SENSE OF KBD STROBE SET 4,A PARL4: OUT (CTCA0),A LD A,1 OUT (CTCA0),A ;COUNT STROBES MODULO 1 SIGNON: EI CALL PNEXT DEFB CR,LF,LF DEFB '... Bigboard_II System Monitor 7-July-82 ...' DEFB CR,LF,LF DEFB EOT JP PROMPT ;GO ENTER MONITOR ; ; ; ; DUMMY STACK FOR POWER-UP CRC CHECK ; DEFW INIT1 ;RETURN POINT FOR FIRST CRC CHECK TSTSTK EQU $ ; ; ; ; COMPUTE CRC16 OVER CONTENTS OF ROM TO VERIFY ROM INTEGRITY ; CRCGEN: LD HL,-1 ;SET CRC16 ACCUMULATOR TO ALL ONES CRCG1: LD B,8 ;PREPARE TO RUN ROM BYTE THRU CRC GEN EX AF,AF' LD A,(DE) LD C,A CRCG2: LD A,C XOR H ;XOR DATA BIT WITH MSB OF CRC RLCA ADC HL,HL ;SHIFT RESULTING BIT LEFT INTO CRC RRCA JR NC,CRCG3 ;JUMP IF BIT WAS A ZERO LD A,H XOR 00010000B ;ELSE XOR CRC WITH POLY COEFFICIENTS LD H,A LD A,L XOR 00100000B LD L,A CRCG3: RL C ;ADVANCE TO NEXT DATA BIT DJNZ CRCG2 EX AF,AF' INC DE CP D ;TEST FOR ENDING PAGE NUMBER JR NZ,CRCG1 LD A,H OR L ;HL SHOULD=0 IF VALID CRC16 RET ; ; ; ; INITCRT: LD B,16 ;WRITE TO 16 REGISTERS IN 6845 LD C,0 INCRT1: LD A,C OUT (CRTADD),A ;OUTPUT REGISTER NUMBER TO CRTC LD A,(HL) INC HL OUT (CRTDAT),A ;OUTPUT DATA TO SELECTED REGISTER INC C DJNZ INCRT1 RET ; ; ; ; PAGE ; ; ; ... INPUT/OUTPUT PORT EQUATES AND INITIALIZATION TABLES ... ; ; SIO EQU 80H ;DUAL SERIAL I/O CTCA EQU 84H ;CTC FOR KEYBOARD/FDC/SIO INTERRUPTS CTCB EQU 88H ;CTC FOR BAUDRATES AND TIMERS DMA EQU 8CH ;Z80 DMA CONTROLLER PORT3 EQU 0C0H ;MEMORY CONTROL 74LS259 SENSE EQU 0C4H ;SENSE INPUTS 74LS244 PORT0 EQU 0C8H ;MISC CONTROL BITS 74LS259 SELMUX EQU 0CCH ;DRIVE SELECT/DMA MUX 74LS273 KBD EQU 0D0H ;KEYBOARD INPUTS 74LS373 WD179X EQU 0D4H ;WESTERN DIGITAL DISK CONTROLLER GENPIO EQU 0D8H ;GENERAL PURPOSE PARALLEL PORTS CRTC EQU 0DCH ;6845 CRT CONTROLLER ; ; SIODPA EQU SIO+0 ;SIO DATA PORT A SIOCPA EQU SIO+1 ;SIO CONTROL/STATUS PORT A SIODPB EQU SIO+2 ;SIO DATA PORT B SIOCPB EQU SIO+3 ;SIO CONTROL/STATUS PORT B ; ; CTCA0 EQU CTCA ;CTC A CHANNEL 0 (KEYBOARD STROBE) CTCA1 EQU CTCA+1 ;CTC A CHANNEL 1 (INDEX PULSE COUNT) CTCA2 EQU CTCA+2 ;CTC A CHANNEL 2 (SIO A SYNC INTERRUPT) CTCA3 EQU CTCA+3 ;CTC A CHANNEL 3 (VSYNC INTERRUPT) ; ; CTCB0 EQU CTCB ;CTC B CHANNEL 0 (SIO A BAUDRATE) CTCB1 EQU CTCB+1 ;CTC B CHANNEL 1 (SIO B BAUDRATE) CTCB2 EQU CTCB+2 ;CTC B CHANNEL 2 (1 MILLISECOND TIMER) CTCB3 EQU CTCB+3 ;CTC B CHANNEL 3 (CLOCK INTERRUPT) ; ; ; ON EQU 00001000B OFF EQU 00000000B ; ; BIT ASSIGNMENTS FOR LATCH 'U14' ; BUZZER EQU 7 MOTOR EQU 6 HLDTIM EQU 5 DDEN EQU 4 SMC2 EQU 3 SMC1 EQU 2 SIDSEL EQU 1 DYSTAT EQU 0 ; ; ; BIT ASSIGNMENTS FOR LATCH 'U41' ; ATTEN EQU 7 ;ATTRIBUTE ENABLE PIN FDCRST EQU 6 ;DISK CONTROLLER RESET STDBB EQU 5 ;STD/BETTERBOARD BANK SELECT VPP EQU 4 ;PROM VPP ENABLE PGM EQU 3 ;PROM PGM ENABLE OEVPP EQU 2 ;PROM OE/VPP SWITCH DECODE EQU 1 ;BYTEWIDE MEMORY DECODE CONTROL OUTEN EQU 0 ;BYTEWIDE MEMORY /OE CONTROL ; ; ; ; IOTAB EQU $ ;I/O INITIALIZATION TABLE ; ; INITIALIZATION FOR TTL BIT LATCHES ; DEFB 2,PORT3 DEFB ATTEN+ON ;ATTRIBUTE ENABLE ON DEFB FDCRST+ON ;179X RESET PIN HIGH DEFB 1,SELMUX DEFB 00001010B ;ALL DRIVES OFF, /TEST=1, DRQ->RDY ; ; ; DO SOFTWARE RESET OF DMA AS RECOMENDED BY ZILOG ; DEFB 6,DMA DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B DEFB 11000011B ; ; ; PROGRAM CTC A AND B FOR VARIOUS INTERRUPT ; AND TIMING FUNCTIONS ; DEFB 1,CTCA0 DEFB CTCAV ;BASE INTERRUPT VECTOR FOR CTC A DEFB 2,CTCA1 DEFB 01000111B ;PUT CTC1 IN COUNTER MODE DEFB 0 ;COUNT INDEX PULSES MODULO-256 ; ; DEFB 1,CTCB0 DEFB CTCBV ;BASE INTERRUPT VECTOR FOR CTC B DEFB 2,CTCB0 DEFB 01000111B ;PUT CTC0 IN COUNTER MODE DEFB 128 ;DIVIDE BY 128 GIVES 300 BAUD FOR SIO B DEFB 2,CTCB1 DEFB 01000111B ;PUT CTC1 IN COUNTER MODE DEFB 128 ;DIVIDE BY 128 GIVES 300 BAUD FOR SIO A DEFB 2,CTCB2 DEFB 00000111B ;PUT CTC2 IN TIMER MODE DEFB 250 ;PULSE EVERY 250*4 MICROSECONDS DEFB 2,CTCB3 DEFB 11000111B ;PUT CTC3 IN COUNTER MODE DEFB 250 ;INTERRUPT EVERY 250 MILLISECONDS ; ; ; INITIALIZE SIO CHANNEL A AND B FOR ASYNCHRONOUS SERIAL ; INTERFACE TO PRINTER OR TERMINAL ; DEFB 10,SIOCPB DEFB 4 ;SELECT REGISTER #4 DEFB 01000101B ;16X CLOCK, 1 STOP BIT DEFB 1 ;SELECT REGISTER #1 DEFB 00000100B ;STATUS AFFECTS VECTOR DEFB 3 ;SELECT REGISTER #3 DEFB 01000001B ;7 BITS/RX CHARACTER DEFB 5 ;SELECT REGISTER #5 DEFB 10101010B ;7 BITS/TX CHARACTER DEFB 2 ;SELECT REGISTER #2 DEFB SIOVEC ;BASE SIO INTERRUPT VECTOR DEFB 8,SIOCPA DEFB 4 ;SELECT REGISTER #4 DEFB 01000101B ;16X CLOCK, 1 STOP BIT DEFB 1 ;SELECT REGISTER #1 DEFB 00000000B ;INTERRUPTS OFF DEFB 3 ;SELECT REGISTER #3 DEFB 01000001B ;7 BITS/RX CHARACTER DEFB 5 ;SELECT REGISTER #5 DEFB 10101010B ;7 BITS/TX CHARACTER ; ; DEFB -1 ;END-OF-TABLE ; ; ; PAGE ; ; ; ... EQUATES AND INITIALIZATION TABLES FOR 6845 CRTC ... ; ; CHRMEM EQU 6000H ;2K BYTE CHARACTER MEMORY ATTMEM EQU 7000H ;2K BYTE ATTRIBUTE MEMORY ; CRTADD EQU CRTC ;6845 ADDRESS REGISTER CRTDAT EQU CRTC+1 ;6845 DATA REGISTER BLINK EQU 01000000B ;BLINK ATTRIBUTE BIT REVERSE EQU 00010000B ;REVERSE VIDEO UNDLINE EQU 00001000B ;UNDERLINE STRIKE EQU 00000100B ;STRIKETHRU ; ; INITIALIZATION FOR 80*24 DISPLAY USING 11 MHZ CLOCK ; AND 7 DOT BY 10 RASTER CHARACTER CELL SIZE ; M1TAB: DEFB 99 ;HORIZ TOTAL-1 DEFB 80 ;HORIZ DISPLAYED DEFB 82 ;HORIZ SYNC POSITION-1 DEFB 28H ;VERT/HORIZ SYNC WIDTH DEFB 25 ;VERT TOTAL-1 DEFB 2 ;VERT TOTAL ADJUST DEFB 24 ;VERT DISPLAYED DEFB 25 ;VERT SYNC POSITION-1 DEFB 00000000B ;INTERLACE AND SKEW DEFB 9 ;MAX RASTER ADDRESS DEFB 00100000B ;CURSOR START RASTER DEFB 0 ;CURSOR END RASTER DEFB 0 ;START ADDRESS MSB DEFB 0 ;START ADDRESS LSB DEFB 0 ;CURSOR ADDRESS MSB DEFB 0 ;CURSOR ADDRESS LSB ; ; ; INITIALIZATION FOR 80*24 DISPLAY USING 16 Mhz CLOCK ; AND 9 DOT BY 12 RASTER CHARACTER CELL SIZE ; M2TAB: DEFB 96 ;HORIZ TOTAL-1 DEFB 80 ;HORIZ DISPLAYED DEFB 71 ;HORIZ SYNC POSITION-1 DEFB 28H ;VERT/HORIZ SYNC WIDTH DEFB 25 ;VERT TOTAL-1 DEFB 16 ;VERT TOTAL ADJUST DEFB 24 ;VERT DISPLAYED DEFB 26 ;VERT SYNC POSITION-1 DEFB 00000010B ;INTERLACE AND SKEW DEFB 11 ;MAX RASTER ADDRESS DEFB 00100000B ;CURSOR START RASTER DEFB 0 ;CURSOR END RASTER DEFB 0 ;START ADDRESS MSB DEFB 0 ;START ADDRESS LSB DEFB 0 ;CURSOR ADDRESS MSB DEFB 0 ;CURSOR ADDRESS LSB ; ; ; ;