.Z80 ; ; MESSAGES ; MSG1: DEFB CR,LF,BELL DEFB 'Bios Error: Boot Failure -- Hit any key to retry.' DEFB CR,LF,0 ; ; MSG3: DEFB CR,LF M21A: DEFB 'Bios ' DEFB 0 ; VTAB: DEFB ' Error on ' VDRV: DEFS 1 DEFB ':' DEFB CR,LF DEFB 'Track = ' VTRK: DEFB '999' DEFB ', Sector = ' VSEC: DEFB '99' DEFB CR,LF DEFB 0 ; MSG5: DEFB 'FDC status = ' FSCODE: DEFS 2 DEFB 'H' CRLF: DEFB CR,LF DEFB 0 ; ; MSGRC: DEFB 'Read' DEFB 0 ; MSGWC: DEFB 'Write' DEFB 0 ; MSGSC: DEFB 'Restore' DEFB 0 ; MSGUC: DEFB 'Unknown' DEFB 0 ; ; DOOR MESSAGE TABLE ; RDYMSG: DEFB CR,LF DEFM 'Check the disk in drive "' VDRIVE: DEFS 1 DEFM '", and close the door.' DEFB CR,LF DEFB 0 ; IF TPCI DRMSG: DEFB CR,LF,CR,LF DEFM 'Insert diskette ' DEFB 'for drive ' DISKET: DEFS 1 DEFB ': Press any key when ready.' DEFB 0 ENDIF ; IF USRCPM ;* ;* M M M O S T 2 . 0 ;* ; ; USER PROCESSOR ERROR AND SIGN ON MESSAGES ; M11: DB 'BDOS ERR ON ',0 M11TAB: DW M11A ;TABLE OF PSUEDO BDOS ERROR ADDRESSES DW M11A DW M11B DW M11C M11A: DB ': BAD SECTOR',0 M11B: DB ': FILE/DRIVE R/O',0 M11C: DB ': SELECT',0 ; M22ATAB:DW MSGRC ;TABLE OF BIOS ERROR CAUSES DW MSGWC DW M22AC ; M22AC: DB 'SELECT',0 M23A: DB ' ERROR ON DRV=',0 M24A: DB '; TRK=',0 M25A: DB '; SCTR=',0 M26A: DB '; WRT TYPE=',0 M27AB: DB '; RTN CODE=',0 ; M21B: DB 'BDOS ERROR ON FUNC=',0 M22B: DB '; DRV=',0 M23B: DB '; FILE=',0 ; M3TAB: DW M3A DW M3B DW M3C DW M3D DW M3E DW M3F DW M3G DW M3H DW M3I ;CNGSEQ#1 ; M3A: DB 'COMMAND FAULT ERROR',0 M3B: DB 'WRITE PROTECT ERROR',0 M3C: DB 'ILLEGAL FUNCTION CALL',0 M3D: DB 'FILE STATUS INCONSISTENT WITH FUNCTION',0 M3E: DB 'DRIVE TYPE ERROR',0 M3F: DB 'TRANSFER OUT ERROR',0 M3G: DB 'TRANSFER IN ERROR',0 M3H: DB 'GENREV NO. INCONSISTENT WITH DPCPARMS.DAT. ' DB 'TO CORRECT, RERUN CNFGUSER.',0 M3I: DB 'NO SPACE',0 ;CNGSEQ#1 ; ; ; BIOS/BDOS ACTIVITY TABLE, ONE BYTE PER FUNCTION WITH MEANINGS ; BIT0=1 PASS FUNC. TO MMMOST=0 PASS TO LOCAL BDOS ; BIT1=1 FILE CLOSED PRIOR TO CALL, =0 FILE OPEN PRIOR TO CALL ; BIT2=1 SEND 128 BYTES DATA AFTER REQ. BLK (WRITE), =0 DON'T SEND ; BIT3=1 READ 128 BYTES DATA AFTER FCB BLK READ (READ), =0 DON'T ; BIT4=1 ADD FILE TO OPEN LIST, =0 DON'T CHANGE OPEN STATUS ; BIT5=1 DELETE FILE FROM OPEN LIST, =0 DON'T DELETE ; BIT6=1 ERROR RETURN ~=00, =0 ERROR ON FF ONLY ; BIT7=1 DON'T CARE ON OPEN/CLOSE STATUS, =0 THEN CARE ; BDOSTAB EQU $ FUN014: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 FUN15: DB 10010011B ;OPEN FUNCTION FUN16: DB 00100001B ;CLOSE FUNCTION FUN17: DB 00000001B ;SEARCH FIRST FUN18: DB 0 FUN19: DB 10000011B ;DELETE FUN20: DB 01001001B ;READ SEQ. FUN21: DB 01000101B ;WRITE SEQ. FUN22: DB 00010011B ;MAKE FUN23: DB 10000011B ;RENAME FUN2429:DB 0,0,0,0,0,0 FUN30: DB 00000011B ;SET FILE ATTRIBUTES FUN3132:DB 0,0 FUN33: DB 01001001B ;READ RANDOM FUN34: DB 01000101B ;WRITE RANDOM FUN35: DB 10000001B ;COMPUTE FILE SIZE FUN36: DB 00000001B ;SET RANDOM RECORD FUN3739:DB 0,0,0 FUN40: DB 01000101B ;WRITE RANDOM, ZERO FILL ; REALDOS:DS 2 ;ADDRESS OF LOCAL BDOS ENTRY FCBA: DS 2 ;FCB ADDRESS PASSED CURFNCA:DS 1 ;CURRENT ACTIVITY BYTE ; BDRQBLK:DB 1 ;START OF REQUEST (SOR) DB 'F' ;BDOS FUNCTION REQUEST CODE LOGDRV: DS 1 ;LOGGED IN DRIVE FOR THIS CALL BDOSFUN:DS 1 ;CURRENT BDOS FUNCTION USERCOD:DS 1 ;USER CODE FOR CURRENT CALL FILEN1: DS 2 ;FILE NUMBER INVOLVED IN CALL ; CURBDSK:DS 1 ;DRIVE OF FILE CURRENTLY BEING ACCESSED CURBFNC:DS 1 ;CURRENT BDOS FUNCTION RETBUF EQU $ FILENO: DS 2 ;FILE NUMBER ASSIGNED RTNCODE:DS 1 ;RETURN CODE FROM BDOS PRNTRTN:DS 1 ;PRINT CONTROL RETURN BYTE ; FILINDX:DS 2 ;ADDRESS IN FILETAB OF CURRENT FILE FILETAB:DS TABLEN*14+1 ;PLUS ONE FOR END OF TABLE FLAG USTACK: DS 2 ;TEMPORARY STOARAGE OF USER'S SP LCLSTCK:DS 20H ;LOCAL STACK TOS EQU $ ; LRQBLK: DB SOR LRQCOD: DS 1 DS 2 LBLNG: DS 2 DS 2 LSELCT: DS 1 DS 1 ;* ;* END MMMOST 2.0 ;* ; SELDRV: DB 0 ;SELECTED DRIVER MMMOST2.0 IRQBLK: DB SOR IRQCOD: DS 1 NODISK: DS 1 TRK: DS 1 ;*** NOTE: DO NOT CHANGE SECT: DS 2 ;THE ORDER OF THESE BYTES *** TRK16: DS 2 ENDIF WRTYPE: DS 1 ;BDOS WRITE TYPE IF USRCPM SELFLG: DS 1 ICKSUM: DS 1 ; STABUF: DS 4 SAVDPH: DS 2 SAVBUF: DS 1 ECOUNT: DS 1 ;ERROR RETRY COUNTER ; TEMP: DS 1 ;TEMPORARY STORAGE. LBTIME: DW 0 ; MMMOST2.0 FORCEF: DB 0 ; MMMOST2.0 LBCNT: DB 0 ;LIST BUFFER CHAR COUNT LBUFF: DS 128 ;LIST BUFFER LFLCNT: DW 0 ;LIST FLUSH COUNTER STATIC: DB 0 ;STATIC MEMORY FLAG(0-STATIC MEMORY EXISTS, ; TS-800) ENDIF ; ; ********************************************** ; CP/M LOGICAL DISKS TRANSLATE TABLE ; LOGICAL DISK # A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P ; ********************************************** ; IF STDCPM DISKTAB: DEFB 0,1 CTLTAB: DEFB 2,2 ENDIF ; IF USRCPM LDSKTB: DEFB 0 ;DRIVE 'M' TO DRIVE #0 DEFB 0 ;OF FLOPPY DISK IF TS800 OR TS803 OR TPCI DEFB 1 ;DRIVE 'N' TO DRIVE #1 DEFB 0 ;OF FLOPPY DISK ENDIF IF TS803H DEFB 3 ;DRIVE 'N' TO DRIVE #2 DEFB 1 ;OF HARD DISK DEFB 2 ;DRIVE 'O' TO DRIVE #1 DEFB 1 ;OF HARD DISK DEFB 1 ;DRIVE 'P' TO DRIVE #0 DEFB 1 ;OF HARD DISK ENDIF ; REALDSK: DEFB 0 ;REAL DISK NUMBER ENDIF ; IF TS803H ; ; Warm boot control flag is passed by 'BOOT' module ; = 0 if system cold boot from winchester drive ; = 1 if system cold boot from floppy drive. ; WBFLAG: DEFB 0 ENDIF ; NODRV: DEFS 1 ; STORAGE FOR # OF DRIVE FOR TELETOTE I CURDRV: DEFS 1 ; CURRENT DRIVE SELECTED FOR TELETOTE I CWFLAG: DEFB 0 ; COLD/WARMBOOT FLAG ; SPTCPM: DEFB 48H ; CP/M SECTOR PER TRACK ; ; Storage for time and date ; CLOCK: DEFB 0 ; 1/100 SEC COUNTER(BCD) 0 TO 59 SECOND: DEFB 0 ; SECOND (BCD) 0 TO 59 MINUTE: DEFB 0 ; MINUTE (BCD) 0 TO 59 HOUR: DEFB 0 ; HOUR (BCD) 0 TO 23 DATE: DEFB 1 ; DATE (BCD) 1 TO 31 MONTH: DEFB 1 ; MONTH (BCD) 1 TO 12 YEAR: DEFB 0 ; YEAR (BCD) 0 TO 99 LSB DEFB 0 ; YEAR (BCD) 0 TO 99 MSB ; TINITF: DEFB 1 ; DATE AND TIME INITIALIZE FLAG FDTIME: DEFB FDTOUT ; FLOP DISK TIMER(0=DISABLE MOTOR TIMEOUT) FDMOT: DEFB 0 ; MOTOR ON/OFF FLAG (1=ON, 0=OFF) ; ; Timer stack area ; ; DEFS 14 ;LSTACK: DEFS 2 ;TUSTACK: ; DEFS 2 ; USER STACK ; ; ********************** ; ** DISK DEFINITIONS ** ; ********************** ; ; DISK PARAMETER HEADER ; DPBH: ; ; FLOPPY DISK 0 PARAMETER HEADER ; DPFLP0: DEFW 0 DEFW 0 DEFW 0 DEFW 0 IF STDCPM DEFW DIRBFR ENDIF IF USRCPM DPF1: DS 2 ENDIF DEFW DPRMB0 DEFW CHKSV0 DEFW ALOCV0 ; ; FLOPPY DISK 1 PARAMETER HEADER ; DPFLP1: DEFW 0 ; ADDR. OF SECTOR TRANSLATE TABLE FOR DISK 1 DEFW 0 ; BDOS SCRATCH WORDS DEFW 0 ; THREE OF THEM DEFW 0 IF STDCPM DEFW DIRBFR ; ADDR. OF DIRECTORY BUFFER FOR DISK ENDIF IF USRCPM DPF2: DS 2 ENDIF DEFW DPRMB1 ; ADDR. OF DISK PARAMETER BLOCK 1 DEFW CHKSV1 ; ADDR. OF CHECK SCRATCHPAD DEFW ALOCV1 ; ADDR. OF DISK ALLOCATION SCRATCHPAD ; ; ******************** ; DISK PARAMETER BLOCK ; ******************** ; DPRMB0: DPRMB1: DEFW FSPT0 DEFB FBSH0 DEFB FBLM0 DEFB FEXM0 DEFW FDSM0 DEFW FDRM0 DEFB FALL0 DEFB FALH0 DEFW FCKS0 DEFW FOFF0 ; ; PROGRAM STORAGE ; SECNT: DEFS 1 ; SECTOR COUNT (FOR WARMBOOT) ; ; TEMPORARY STORAGES FOR REGISTERS ; TEMPBC: DEFW 0 TEMPDE: DEFW 0 TEMPHL: DEFW 0 ; JMPSW: DEFB 0 ; FLAG FOR DOOR MESSAGE PRINT ; ; *** DATA FOR FLOPPY DISK I/O MODULE *** ; ; DISK I/O COMMAND PARAMETERS ; DRIVE: DEFS 1 ; CURRENTLY SELECTED DRIVE COMAND: DEFS 1 ; CURRENT COMMAND DSELCMD: DEFS 1 ; DRIVE CONFIGURE TSEC: DEFS 1 ; TEMP. READ/WRITE SECTOR VARIABLE. FRETRY: DEFS 1 ; RETRY COUNT UNMSTA: DEFS 1 ; UNMASKED VERSION OF ABOVE ; ; UNITIALIZED RAM DATA AREAS ; SECPTRK: DEFS 1 ; SECTOR PER TRACK SECBLK: DEFS 1 ; SECTOR BLOCKING SEKDSK: DEFS 1 ; SEEK DISK NUMBER SEKTRK: DEFS 2 ; SEEK TRACK NUMBER SEKSEC: DEFS 1 ; SEEK SECTOR NUMBER ; HSTDSK: DEFS 1 ; HOST DISK NUMBER HSTTRK: DEFS 2 ; HOST TRACK NUMBER HSTSEC: DEFS 1 ; HOST SECTOR NUMBER ; SEKHST: DEFS 1 ; SEEK HOST SECTOR NUMBER HSTACT: DEFS 1 ; HOST ACTIVE FLAG HSTWRT: DEFS 1 ; HOST BUFFER WRITE PENDING FLAG ; UNACNT: DEFS 1 ; UNALLOCATION SECTOR COUNT UNADSK: DEFS 1 ; LAST UNALLOC DISK UNATRK: DEFS 2 ; LAST UNALLOC TRACK UNASEC: DEFS 1 ; LAST UNALOCA SECTOR ; ERFLAG: DEFS 1 ; ERROR REPORTING RSFLAG: DEFS 1 ; PRE-READ SECTOR FLAG READOP: DEFS 1 ; 0 IF WRITE OPERATION; 1 IF READ OPER. DMAADR: DEFS 2 ; LAST DMA ADDRESS LOGDSKN: DEFB 0 ; 0/1 = LOGICAL DISK SELECT #0/#1 ; ; ; CONSOLE BUFFER ; first 2 bytes are used as beg and end of buffer ; and rest of 64 bytes are actual buffer ; ;CONBUF: DEFS 66 BUFSIZ EQU 64 ; ACTUAL BUFFER SIZE ; ; HSTBUF EQU $ ; HOST BUFFER(OVERLAYED) ; ; 256-BYTE PARAMETER ARRAY AREA ; PARMAR EQU HSTBUF+HSTSIZ ; ENTRY POINT AT 0FF00H ; ; FLOPPY DISK DRIVE 0 STORAGE AREA ; ALOCV0 EQU PARMAR+256 ; ALLOCATION VECTOR STORAGE CHKSV0 EQU ALOCV0+(FDSM0/8)+1 ;CHECK VECTOR STORAGE ALOCV1 EQU CHKSV0+FCKS0 ;ALLOCATION VECTOR STORAGE CHKSV1 EQU ALOCV1+(FDSM1/8)+1 ;CHECK VECTOR STORAGE CONBUF EQU CHKSV1+FCKS1 ;CONSOLE BUFFER STORAGE LSTACK EQU CONBUF+86 ;STORAGE FOR TIMER STACK TUSTACK EQU LSTACK+2 MRX_BUFF EQU TUSTACK+2 ;MODEM RECEIVER BUFFER STORAGE MOUSTK EQU MRX_BUFF+144 ;STORAGE FOR MOUSE STACK IF STDCPM DIRBFR EQU MOUSTK+2 ;IF STDCPM SAVE 128 BYTE OF IMAGEND EQU DIRBFR+128 ;DIRECTORY BUFFER ENDIF IF USRCPM ;IF USRCPM SHARE DIRECTRY BUFFER IMAGEND EQU MOUSTK+2 ;WHICH WAS CREATED BY EXTERNAL DRIVES. ENDIF ; ;****************************************************************** ;* Boot is the cold boot loader. * ;* All of CP/M has been loaded in when control is passed here. * ;* Warning: 256 bytes of local storage are reserved from 0ff00h * ;* to 0ffffh for alpha and graphic drivers in page 0. * ;* Last address of bios must be less than 0ff00h. * ;****************************************************************** ; OVERLAY: ; Beginning of overlay area(max 256 bytes) BOOT: DI LD SP,TPA ; Set up stack ; LD A,(IODEF) ; Initialize CP/M iobyte LD (IOBYTE),A ; Set iobyte ; ; System Interrupt Vector Mode 2 ; LD HL,INTVEC LD A,H LD I,A IM 2 ; IF USRCPM LD BC,6 LD DE,SMSG1 ; DEFAULT SYSTEM TYPE MESSAGE(TS-803) IN A,(IDSWITCH) BIT 3,A JR NZ,HWINIT ; TS-803H BIT 5,A JR Z,HWINIT ; TS-803 LD HL,SMSG3 LDIR ENDIF ; HWINIT: ; ; Get the baud rate for printer and modem from ; dip switch or user through the setup program. ; Default baudrate for both of printer and modem ; is 9600. ; LD A,(PBAUD) ; GET PRINTER BAUD RATE FROM SYSTEXT OR A ; USER REQUEST BAUDRATE? JR NZ,PRNBDR ; YES CALL GETDSW ; NO, GET IT FROM DIP SWITCH PRNBDR: LD D,A ; D = PRINTER BAUD RATE CONSTANT LD A,(MBAUD) ; GET MODEM BAUDRATE FROM SYSTEXT OR A ; USER REQUEST BAUD RATE? JR NZ,MODBDR ; YES CALL GETDSW ; NO, GET IT FROM DIP SWITCH MODBDR: LD E,A ; E = MODEM BAUD RATE CONSTANT ; ; Initialize STI ; LD A,6 ; POINTER FOR DDR OUT (PVR),A LD A,00100100B ; DDR, DEFINE I/O PIN DIRECTION(0=IN, 1=OUT) OUT (DDR),A LD A,00000000B ; INITIAL HAND-SHAKE LINES OUT (GPIP),A ; CHECK CTS BY I1 ; ; Initialize timer A,B,C and D ; LD A,7 ; POINTER FOR TIMERS C & D OUT (PVR),A LD A,10001000B ; RESET CHANNEL A & B OUT (TCDCR),A ; TCDCR: CONTROL REG FOR TIMER C & D LD A,00000000B ; STOP TIMER A & B OUT (TABCR),A ; TABCR: CONTROL REG FOR TIMER A & B ; LD A,D ; GET TIME CONSTANT FOR PRINTER PORT OUT (PRTSTI),A ; INITIALIZE PRINTER BAUDRATE TO STI CHANNEL B LD A,E ; GET TIME CONSTANT FOR MODEM PORT OUT (MODSTI),A ; INITIALIZE MODEM BAUD RATE TO STI CHANNEL A LD A,00010001B ; TIMER A & B CONTROL WORD OUT (TABCR),A ; ; Initialize UART ; LD A,(UARTCW) ; GET UART CONTROL WORD OUT (MODMCP),A LD A,00000001B ; RSR, ENABLE RECEIVER OUT (MODRSR),A LD A,00000101B ; TSR, ENABLE TRANSMITTER OUT (MODTSR),A ; ; Initialize DART ; LD HL,PRNTAB ; DART channel B for printer port CALL PRTINI LD HL,KBDTAB ; DART channel A for keyboard port CALL PRTINI ; LD HL,PARMAR ; Get Parameter Array Area entry point LD (0FF00H),HL ; Set entry point at 0FF00H ; ; Alpha driver and Printer buffer initialization ; LD IX,0 ADD IX,SP ; Save old stack pointer LD SP,LOCSTK ; Set new local stack pointer LD HL,0 LD A,0 ; Switch to memory bank 0 OUT (BANKSW),A LD (INPUTOFF),HL ; Clear input offset of printer buffer LD (OUTPUTOFF),HL ; Clear output offset of printer buffer PUSH IX ; Save register CALL ALINIT ; Call alpha driver initialization POP IX ; Restore register LD A,1 ; Switch to memory bank 1 OUT (BANKSW),A LD SP,IX ; Restore old stack pointer ; IF TPCI LD A,RSTOBE ; Initialize print control port OUT (PARALCP),A XOR A ; TURN OFF HARDWARE MOUSE CURSOR OUT (0CEH),A LD (KYSTAT),A ; INITIALIZE KEY STATUS AND KEY RELEASE LD (KEYREL),A ; BYTES LD (KEYCLK),A ; SET KEYCLICK ON ENDIF ; ; Clear out Keyboard Buffer ; CALL FLSHKB ; IF TPCI LD A,1 ; Set number of drive to two drive LD (NODRV),A ; system. LD A,11010101B ; Select drive "B" OUT (DSELOP),A ; to check if it is single drive LD A,00001000B ; system OUT (FDCCMD),A LD A,150 ; Delay about 30usec DELAY2: DEC A JR NZ,DELAY2 DELAY3: IN A,(FDCCMD) ; Restore command accomplished? BIT 0,A ; JR NZ,DELAY3 ; BIT 2,A ; If so, print two drive message, JR NZ,TWODR XOR A ; If not, set number of drive to one. LD (NODRV),A ; Set current drive to "A" LD (CURDRV),A IF STDCPM LD BC,15 ; Select proper message for single LD DE,MS1DR ; drive system LD HL,MS2DR LDIR ENDIF ENDIF ; TWODR: IF STDCPM LD HL,SIGNON ; Prep for sending signon message CALL PRNT ; Send the promt ENDIF ; ; Floppy disk initialization ; XOR A ; Make logged drive zero LD (HSTACT),A ; Reset disk buffer active flag LD (HSTWRT),A ; Reset write pending data in buffer LD (SECNT),A ; Reset sector counter ; IF STDCPM LD (DRIVE),A ENDIF ; IF USRCPM DEC A LD (DRIVE),A ENDIF ; LD A,11100101B ; Set drive select configure LD (DSELCMD),A ; Select drive 0, Dden, side 1 and motor on OUT (DSELOP),A LD A,RESCMD ; Restore head to track #0 OUT (FDCCMD),A ; ; AUTOLOAD FILE AT COLDBOOT TIME ; LD DE,COLDBEG LD HL,COLDEND CALL AUTOSETUP ; XOR A LD (CWFLAG),A ; Reset Cold/Warm boot Flag LD (CDISK),A ; Load Default Drive as 0 LD (ESCFLAG),A ; Reset esc flag for printer function LD (XONXOFF),A ; Reset xonxoff flag INC A LD (P_EMPTY),A ; SET PRINTER BUFFER EMPTY ; IF USRCPM LD HL,(DPBASE+8) ;STORE DIRBUFF ADDRESS OF EXTERNAL SYSTEM LD (DPF1),HL ;TO LOCAL SYSTEM DIRBUFF TO SHARE THE LD (DPF2),HL ;DIRECTORY BUFFER AREA LD (NODISK),A CALL BDOSSET ;SET UP BDOS INTERCEPT IN BIOS MMMOST2.0 LD A,(BIOS) RES 7,A ;CLEAR HIGH BIT OF THIS LOCATION LD (BIOS),A ;INDICATE THIS IS MULTIUSER BIOS .8080 IN KBDDP ;CLEAR KEYBOARD LXI H,SMSG ;PRINT OPENING MESSAGE. CALL PRNT ;* ;* MMMOST 2.0 ;* MVI A,COMCD ;REQUEST USER STATUS MMMOST2.0 STA IRQCOD ; MMMOST2.0 MVI A,'P' ;PRINT SPOOL DRIVE STA TRK MVI B,10 LXI H,IRQBLK CALL PNXO MVI B,128 CALL PNXO MVI B,4 LXI H,STABUF CALL PNXI LDA STABUF STA SPLDRV MVI A,'S' ;WHICH IS DIRECT COMMAND MMMOST2.0 STA TRK ; MMMOST2.0 MVI B,10 ; MMMOST2.0 LXI H,IRQBLK ; MMMOST2.0 CALL PNXO ; MMMOST2.0 MVI B,128 ;SEND DUMMY COMMAND RECORD MMMOST2.0 CALL PNXO ; MMMOST2.0 MVI B,4 ;GET STATUS BACK MMMOST2.0 LXI H,STABUF ; MMMOST2.0 CALL PNXI ; MMMOST2.0 LDA STABUF ;IF BIT 6 OF STABUF = 1 ANI 40H ;THEN AUTOLOAD IS ENABLED JNZ NPRCID ; XRA A ;ELSE CLEAR COUNT OF CONSOLE STA AUTOFLG ;INPUT BUFFER NPRCID: LDA STABUF ;PRINT PROCESSOR ID IN SIGN ON MESSAGE MMMOST2.0 ANI 0FH ;ID = LS NYBBLE OF RETURN MMMOST2.0 STA PROCID ;SET PROCESSOR ID MMMOST2.1 INR A ;CONVERT FROM REL. 0 TO REL. 1 MMMOST2.0 CPI 0AH ;CONVERT TO BCD MMMOST2.0 JC OKDIG ; MMMOST2.0 ADI 6 ;CONVERT 0A-0F TO 10 TO 15 MMMOST2.0 OKDIG: CALL PBYTE ;CALL ROUTINE TO PRINT ACCUMULATOR MMMOST2.0 LXI H,SMSG2 ;PRINT ' <=> ' CALL PRNT LDA STABUF ;PRINT PROCESSOR ID A-P ANI 0FH ADI 41H MOV C,A CALL CONOUT CALL PCRLF ;PRINT CARRIAGE RETURN, LINE FEED MVI A,'R' ;GET CURRENT GENREV NUMBER FROM MMMOST STA TRK MVI B,10 ;MAKE REQUEST FOR GENREV LXI H,IRQBLK CALL PNXO MVI B,128 ;DUMMY DIRECT COMMAND BUFFER CALL PNXO MVI B,4 ;READ IN GENREV NUMBER LXI H,STABUF CALL PNXI LDA STABUF ;GET CURRENT GENREV LXI H,GENREV CMP M ;COMPARE CURRENT TO GENREV STORED AT LAST JZ FUNKEY ;RUN OF CNFGUSER CALL PCRLF ;PRINT CARRIAGE RETURN LINE FEED MVI B,8 ;PRINT ERROR MESSAGE IF NO MATCH CALL PRNTERR DIE: JMP DIE ;THEN HANG ENDIF .Z80 ; ; STORE DEFAULT FUNCTION KEY ; FUNKEY: LD D,32 ; SET FUNCTION KEY COUNTER LD HL,DFKTAB ; GET DEFAULT FUNCTION KEY TABLE POINTER LDDFKY: LD C,1BH ; ESC KEY CALL STODFK LD C,7CH ; | KEY CALL STODFK LD E,4 ; SET TABLE ACCESS BYTE COUNTER LUPDFK: LD A,(HL) ; GET BYTE VALUE LD C,A CALL STODFK DEC E ; DECREMENT BYTE COUNTER INC HL ; INCREMENT BYTE ADDRESS JR NZ,LUPDFK LD C,0DH ; CR KEY CALL STODFK LD C,19H ; ^Y KEY CALL STODFK DEC D ; DECREMENT LOOP COUNTER JR NZ,LDDFKY ; ; Initialization for TIMER D to "Delay Mode/64 Prescale" ; and time constant to be 192 for "Time and Date" routine ; TIMER: LD A,00011000B ; UNMASK RCV/ERROR INTERRUPT OUT (IMRA),A LD A,00010000B ; UNMASK TIMER D INTERRUPT OUT (IMRB),A LD A,1 ; POINTER FOR TDDR OUT (PVR),A LD A,192 ; TIME CONSTANT FOR TIMER D OUT (TDDR),A LD A,7 ; POINTER FOR TCDCR OUT (PVR),A ; POINTER FOR TCDCR AND INITIALIZE INTERRUPT ; VECTOR LD A,00000101B ; DELAY MODE/64 OUT (TCDCR),A ; LD A,5 ; POINTER FOR IERA OUT (PVR),A LD A,00011000B ; ENABLE RCV_BUFF_FULL AND RCV_ERR INTERRUPTS OUT (IERA),A LD A,STIIVL+4 ; SET LOW BYTE OF STI INTERRUPT VECTOR OUT (PVR),A LD A,00010000B ; ENABLE TIMER D INTERRUPT OUT (IERB),A ; LD A,0FFH OUT (LED12),A ; Turn off all led OUT (LED34),A ; ; INITIALIZE MOUSE FUNCTION VARIABLES ; LD B,13 ; LD HL,MSCSTS-1 ; POINT HL TO BEGINING OF VARIABLE CLEAR: INC HL ; LD (HL),0 ; INITIALIZE VARIABLES DJNZ CLEAR LD B,3 LD A,32 SETCL: INC HL LD (HL),A INC A DJNZ SETCL INC HL LD (HL),5 ; JP GOCPM ; STODFK: PUSH HL ; SAVE REGISTERS PUSH DE CALL CONOUT POP DE ; RESTORE REGISTERS POP HL RET ; ; Read dip switch to get baudrate for printer and modem ; GETDSW: IN A,(IDSWITCH) ; NO, READ DIP SWITCH AND 07H ; GET BAUDRATE BITS LD B,A LD A,1 RET Z ; 9600 BAUD LSHIFT: SLA A DJNZ LSHIFT RET ; ; ************************************** ; Signon message output during cold boot ; ************************************** ; IF STDCPM IF TPCI SIGNON: DEFB CR,LF DEFB 'TeleVideo System TPC I V' DEFB REVNUM/10+'0' ; Cbios revision number DEFB '.' DEFB (REVNUM MOD 10)+'0' DEFB CR,LF DEFB '(c) 1983 TeleVideo Systems, Inc.' DEFB CR,LF DEFB SMSIZE/10+'0' ; CP/M memory size DEFB (SMSIZE MOD 10)+'0' DEFB 'K CP/M version ' ; CP/M version number DEFB CPMREV/10+'0' DEFB '.' DEFB (CPMREV MOD 10)+'0' MS1DR: DEFB ' (double drive)' DEFB CR,LF DEFB 0 ; Termination MS2DR: DEFB ' (single drive)' ENDIF IF TS803 SIGNON: DEFB CR,LF DEFB 'TeleVideo System TS 803 V' DEFB REVNUM/10+'0' ; Cbios revision number DEFB '.' DEFB (REVNUM MOD 10)+'0' DEFB CR,LF DEFB '(c) 1983 TeleVideo Systems, Inc.' DEFB CR,LF DEFB SMSIZE/10+'0' ; CP/M memory size DEFB (SMSIZE MOD 10)+'0' DEFB 'K CP/M version ' ; CP/M version number DEFB CPMREV/10+'0' DEFB '.' DEFB (CPMREV MOD 10)+'0' DEFB CR,LF DEFB 0 ; Termination ENDIF ENDIF ; IF USRCPM SMSG: DB 0BH,0DH,0AH,'TeleVideo Systems ' DB SMSIZE/10+'0' ; CP/M memory size DB (SMSIZE MOD 10)+'0' DB 'K CP/M V2.2' DB 0DH,0AH DB '(c) 1983 TeleVideo Systems, Inc.' DB 0DH,0AH DB 'Distributed Processor ' ; SMSG1: DB 'TPC I' DB ' Z' DB REVNUM/10 + '0' ;BIOS REVISION NUMBER DB '.' DB (REVNUM MOD 10) + '0' DB 0DH,0AH ; DB 'Processor ID ',0 SMSG2: DB ' <=> ',0 SMSG3: DB 'TS 800' ENDIF ; ; ; ; ; DEFAULT FUNCTION KEY TABLE ; in each function key, 4 bytes(function key value, full dplx mode ; key=1, ^A, key char) preceded and followed by other control char. ; DFKTAB: DEFB 31H,31H,01H,40H ;unshifted func key F1 '1','1',^A,'@' DEFB 32H,31H,01H,41H ; F2 '2','1',^A,'A' DEFB 33H,31H,01H,42H ; F3 '3','1',^A,'B' DEFB 34H,31H,01H,43H ; F4 '4','1',^A,'C' DEFB 35H,31H,01H,44H ; F5 '5','1',^A,'D' DEFB 36H,31H,01H,45H ; F6 '6','1',^A,'E' DEFB 37H,31H,01H,46H ; F7 '7','1',^A,'F' DEFB 38H,31H,01H,47H ; F8 '8','1',^A,'G' DEFB 39H,31H,01H,48H ; F9 '9','1',^A,'H' DEFB 3AH,31H,01H,49H ; F10 ':','1',^A,'I' DEFB 3BH,31H,01H,4AH ; F11 ';','1',^A,'J' DEFB 47H,31H,01H,4BH ; F12 'G','1',^A,'K' DEFB 48H,31H,01H,4CH ; F13 'H','1',^A,'L' DEFB 49H,31H,01H,4DH ; F14 'I','1',^A,'M' DEFB 4AH,31H,01H,4EH ; F15 'J','1',^A,'N' DEFB 4BH,31H,01H,4FH ; F16 'K','1',^A,'O' DEFB 3CH,31H,01H,60H ;shifted func key F1 '<','1',^A,'`' DEFB 3DH,31H,01H,61H ; F2 '=','1',^A,'a' DEFB 3EH,31H,01H,62H ; F3 '>','1',^A,'b' DEFB 3FH,31H,01H,63H ; F4 '?','1',^A,'c' DEFB 40H,31H,01H,64H ; F5 '@','1',^A,'d' DEFB 41H,31H,01H,65H ; F6 'A','1',^A,'e' DEFB 42H,31H,01H,66H ; F7 'B','1',^A,'f' DEFB 43H,31H,01H,67H ; F8 'C','1',^A,'g' DEFB 44H,31H,01H,68H ; F9 'D','1',^A,'h' DEFB 45H,31H,01H,69H ; F10 'E','1',^A,'i' DEFB 46H,31H,01H,6AH ; F11 'F','1',^A,'j' DEFB 4CH,31H,01H,6BH ; F12 'L','1',^A,'k' DEFB 4DH,31H,01H,6CH ; F13 'M','1',^A,'l' DEFB 4EH,31H,01H,6DH ; F14 'N','1',^A,'m' DEFB 4FH,31H,01H,6EH ; F15 'O','1',^A,'n' DEFB 50H,31H,01H,6FH ; F16 'P','1',^A,'o' ; ; THIS ROUTINE SETS UP COMMAND BUFFER TO DO AN AUTOLOAD ; ; DE = BEGINNING ADDRESS OF FILENAME ; HL = ENDING ADDRESS OF FILENAME ; AUTOSETUP: PUSH DE ; SAVE START OF FILENAME OR A ; CLEAR CARRY SBC HL,DE ; COMPUTE LENGTH OF FILENAME INC L ; ADD ONE LD A,L LD DE,CCP+7 ; BEGINNING OF COMMAND BUFFER LD (DE),A ; MOVE LENGTH OF FILENAME INTO BUFFER INC DE POP HL ; GET START OF FILENAME LD B,0 LD C,A ; MOVE FILENAME INTO BUFFER LDIR RET ; ; OVLYEND EQU $ IF IMAGEND GT OVLYEND DEFS IMAGEND-OVLYEND ENDIF ; LAST: DEFB 55H ; DEFINES END OF PROGRAM ; IF USRCPM ; ; THESE MUST BE LAST FOR AUTO GEN ; ACONBF: DEFW CONBUF ;ADDRESS OF CONSOLE BUFFER AREA PROCID: DEFS 1 ;PROCESSOR ID SPLDRV: DEFB 1 ;SPOOL DRIVE MMMOST2.0 GENREV: DEFB 0 ;GENERATE VERSION NUMBER MMMOST2.0 DRVTAB: DEFW 4000H ;BIT STRING OF LEN. 16 WHERE 1 MMMOST2.0 ;INDICATES BDOS INTERCEPT FOR MMMOST2.0 ;FILE ACCESS MMMOST2.0 NDISK: DEFS 1 ;FILLED IN BY AUTO GEN - NO. OF LOGICAL DRIVE ; DPBASE: DEFB 55H ;MARKER FOR 'CNFGUSER.COM' PROGRAM ENDIF ; ; END OF TPCIDATA.MAC