.Z80 ; ; System Interrupt Vectors ; INTVEC: ; ; Low-order 4 bits of address for DART interrupt vector must be 0000 ; DRTINT: IF TS800 OR TS803 OR TS803H DEF× INTPRNT » DARÔ cè b txmô bufæ empty(printer) ELSE DEFW DISAINT ENDIF DEFW RETURN ; ch b ext/stat change DEFW INTMSC ; ch b receive char interrupt(mouse) DEFW SRCMSC ; ch b special receive condition ; DEFW RETURN ; ch a txmt buff empty(keyboard) DEFW RETURN ; ch a ext/stat change DEFW INTKEY ; ch a receive char interrupt(keyboard) DEFW SRCKB ; ch a special receive condition ; ; Low-order 5-bits of address for STI interrupt vector must be 00000 ; STIINT: DEFW RETURN ; STI ch #0 interrupt DEFW RETURN DEFW RETURN IF TS800 OR TS803 OR TS803H DEFW RETURN ELSE DEFW INTPARAL ; ch #4 interrupt (parallel print) ENDIF DEFW TCOUNT ; ch #5 interrupt (timer/wdc) DEFW RETURN DEFW RETURN DEFW RETURN DEFW RETURN DEFW RETURN DEFW RETURN DEFW MRX_INT ; STI UART RECEIVER READY ***6/10/83*** DEFW MRX_INT ; STI UART RECEIVER READY DEFW RETURN DEFW RETURN DEFW RETURN ; ; Not implemented interrupts ; RETURN: EI RETI ; ; Disable serial print interrupt ; DISAINT: PUSH AF LD A,1 ; OUT (PRNTCP),A LD A,1CH OUT (PRNTCP),A LD A,10H OUT (PRNTCP),A POP AF EI RETI ; ; Reset Error Condition and Resyncronize Keyboard ; SRCKB: PUSH AF LD A,00110000B ;ERROR RESET OUT (KBDCP),A POP AF EI RETI ; ; Key board initialization resides in firmware(ROM) ; FLSHKB: LD BC,FLSHROM ; Load bc with starting address of key board CALL ROMSW ; initialize routine and go to eprom RET ; ; Auxiliary Jump Table ; WTSERV: DEFB 0 IF STDCPM ; For stand-alone system JP UNUSED JP UNUSED JP UNUSED JP UNUSED JP UNUSED JP UNUSED ENDIF IF USRCPM ; For usercpm JP CONST JP BRKPT JP PNXO JP PNXI JP CONIN JP CONST ENDIF JP TOD ; Get/Set time and date JP INTADD ; Get interrupt table address in DE ; Not used jump vectors UNUSED: RET ; Just return ; COPYRIGHT STATEMENT DEFM '(c) 1983 TeleVideo Systems, Inc.' ; ; STACK AREA FOR KEY BOARD FILTER ; KB_LOCSTK EQU $-2 KEYSTK EQU KB_LOCSTK ; VERSION AND REVISION NUMBER VER: DEFB 1 REV: DEFB 0 ; ;************************************************************************* ;* Wboot is the warm boot loader. * ;* We jump here whwnever the user wants to restart the system, * ;* i.e., reread CP/M without modifying the bios. * ;************************************************************************* ; WBOOT: LD SP,TPA ; Set up stacks LD A,1 LD (CWFLAG),A ; Set warmboot flag CALL MRX_RSET ; IF STDCPM XOR A LD (HSTACT),A ; Initialize host active as 0 ; HWBOOT: LD C,0 ; Select drive zero CALL SELDSK CALL HOME ; Seek to track zero LD HL,CCP ; CP/M load address LD (DMAADR),HL ; Save it LD C,2 CALL SETSEC ; Set sector address LD A,NSECT ; # of sectors to warmboot WB1: LD (SECNT),A ; Save sector count CALL READ ; Read a sector OR A JR Z,WB2 ; Jump if read ok LD HL,MSG1 ; Can't boot CALL PRNT CALL CONIN ; Wait for operator LD HL,CRLF CALL PRNT JR HWBOOT ; Try another boot WB2: LD HL,(DMAADR) LD DE,128 ADD HL,DE ; Bump DMA address LD (DMAADR),HL LD HL,SEKSEC INC (HL) ; Increment sector address LD A,(SECNT) ; A = sector count DEC A JR NZ,WB1 ; Jump if more to read ENDIF ; IF USRCPM .8080 CALL DWBOOT ;FLUSH LOCAL BUFFER IF HAVE TO LXI H,WTSERV SHLD 0001BH ;PROVIDE STANDARD ENTRY TO AUX JMP MVI A,0 STA WRECNO LXI H,CCP-80H PUSH H LOOPWB: LXI H,WRQBLK MVI B,10 CALL PNXO CPI 0 JNZ RDERR XFRIWB: POP H PUSH H MVI B,128 CALL PNXI CPI 0 JNZ RDERR LDA WRECNO CPI NSECTS JZ ALDON ; ; INCREMENT MEMORY ADDRESS FOR NEXT SECTOR ; POP H MVI A,128 ADD L MOV L,A MVI A,0 ADC H MOV H,A PUSH H ; ; REQUEST NEXT RECORD ; LXI H,WRECNO INR M JMP XFRIWB ALDON: CALL BDOSSET ;RESET BDOS INTERCEPT FUNCTION MMMOST2.0 EI ;ALLOW THEM AGAIN HERE ; POP H JMP GOCPM ;GO BACK TO CPM ; RDERR: LXI H,MSG1 ;GET ADDRESS OF "BOOT ERROR" CALL PRNT ;PRINT IT CALL CONIN ;READ A CHAR FROM CONSOLE JMP WBOOT ;DO A WARM BOOT ENDIF ; ;**************************************************************** ;* Gocpm is the entry point from cold boots, and warm boots. It * ;* initializes some of the locations in page 0, and sets up the * ;* initial DMA address (80h). * ;**************************************************************** .Z80 GOCPM: LD A,FDTOUT ; Set timer for floppy motor on/off LD (FDTIME),A ; IF USRCPM CALL BRKPT ENDIF ; LD HL,CPMBUF ; Initialize DMA address LD (DMAADR),HL LD A,JP ; Initialize jump to warm boot LD (WBOT),A LD (ENTRY),A ; Initialize jump to BDOS LD (GRRSTV),A ; Initialize jump to graphic driver LD (MOUSEV),A LD HL,BIOS+3H ; Address in warm boot jump LD (WBOT+1),HL LD HL,BDOS ; Address in BDOS jump LD (ENTRY+1),HL LD HL,GRPDRV LD (GRRSTV+1),HL ; Using RST 5 for entry to graphic driver LD HL,MSCFNC LD (MOUSEV+1),HL ; Using RST 6 for entry to mouse function LD HL,WTSERV LD (1BH),HL ; ; Reset Local Escape Flag ; XOR A LD (LOCFLG),A ; IF ETXDRV LD (UL1CNT),A ; Clear serial printer buffer count ENDIF ; IF XONDRV LD A,0FFH LD IX,XONOFF LD (IX),A ; Preset x-on flag for printer port ENDIF ; LD A,(CDISK) ; Jump to CP/M with currently selected disk ; IF STDCPM LD C,A ENDIF ; AND 0FH ; IF USRCPM LD HL,NDISK ;GET NUMBER OF LEGAL DISK CP (HL) JR C,GOCPM0 ;JUMP IF SERVICE PROCESSOR DRIVE IS LEGAL LD C,A CALL DSELDSK ;CHECK IF LOCAL DRIVE NUMBER IS LEGAL LD A,H OR L GOCPM0: LD A,(CDISK) JR NZ,GOCPM1 ;JUMP IF LOCAL DRIVE NUMBER IS LEGAL AND 0F0H ;MAKE IT AS DEFAULT DRIVE 0 IF ILLEGAL ENDIF ; IF STDCPM CP MAXDRV ; See if selected disk is illegal JP C,GOCPM2 LD A,C AND 0F0H ENDIF ; GOCPM1: LD C,A GOCPM2: LD A,(CWFLAG) ; Check cold/warm boot flag OR A JR NZ,GOCPM3 XOR A ; Reset buffer index at Coldboot time LD (CONBUF),A LD (CONBUF+1),A LD A,(AUTOFLG) ; Get autoload flag OR A ; EI ; JP NZ,CCP ; Want to autoload GOCPM3: JP CCP+3 ; Do not want to autoload ; ; END OF TPCIBOOT.MAC