;********************************************************** ; * ; HORIZON USER MODULE -- 1/12/82 * ; * ; R. L. PLOUFFE * ; * MSIZE EQU 62 ;MEMORY SIZE THIS VERS * ;CHANGE TO YOUR SIZE HERE * OVERLAY EQU OVERLAY ;COMPUTED SYSGEN OVERLAY * ; * ; Requires North Star Horizon, PMMI modem, H19 terminal, * ; and Computime T102 clock. Can be adapted for others. * ; * ; This version can be assembled with ASM.COM * ;********************************************************** ; ; GENEUSER VERSION 3.7 ; ; 1/10/82 vers 3.6, cleaned up the code ; ; 12/30/81 vers 3.5, added H89 mode so that H89 ; games that use a 16 bit counter at 000BH inc- ; remented by a clock interrupt will work properly. ; The H89 command sets this mode and provides a prompt ; for entry of the game file name. It auto resets at ; end of game, on a warm boot, or whenever CCP prompts. ; This mode is used if you have a H19, or Z19 terminal. ; Also added PARTYLN mode to the CCP-included 'BYE' ; command to require ring back. (conditional assy.) ; In all cases now, when the 'BYE' code is executed a ; prompt of *> appears indicating that the system is ; in auto-answer mode. The local console can get to ; CP/M by hitting the ESC key. ; ; 12/14/81 vers 3.0, major revision to bring ; GENEUSER up to date with XTCPM vers 1.5 ; Major difference from previous release is that ; transients may have 3 levels of password pro- ; tection (none, level 1, & level 2) just by ; placing them in USER 13, 14, or 15 respectively. ; Transients so placed will be universal in all ; user areas only on drive A depending on password ; level achieved. ; *** RESTRICTION *** ; Do not change file attributes (R/W R/O DIR SYS) ; with STAT on your sytem disk in the 'A' drive unless ; you know the file is in the user area that you are ; logged to, otherwise the file will now be owned ; by the new user area. For that reason also, don't ; use wild card changes to file attributes on A drive. ; Once you make up your system disk with the files you ; wish at password levels 0, 1, and 2 placed in users ; 13, 14, and 15 respectively, change file attributes ; if you wish one file at a time and while logged to ; the user area the file is in. Then write-protect ; your system disk. ; Also, you can now log to a drive ; and user area on one command line. i.e, B: 3 will ; log you to drive B, user 3. ; ; ; NOTE: Requires HELP.COM..See GENEHELP.ASM. ; or use HELP20.ASM Place HELP.COM in user 13 ; and the .HLP files in user 0, both on A drive. ; ; FOR USE WITH CP/M VERS 1.45, 2.01, 2.2, 2.21A ; AND 2.22 ON NORTH STAR DISK WITH LIFEBOAT BIOS. ; ; THIS MODULE NOW PROVIDES FOR N ADDITIONAL CCP ; COMMANDS INTEGRATED WITH THE ORIGINAL CCP. LOOK ; AT THE FILE TO DISCOVER THEM ALL. 'BYE' IS ONE ; OF THE INCLUDED CCP COMMANDS AND INCLUDES AN ; 'ANSWR' COMMAND THAT CAN BE USED LOCALLY TO GO ; TO IMMEDIATE ANSWER TONE OR FROM A REMOTE TO ; CHANGE BAUD RATE, SINCE IT WAITS FOR C/R'S OR ; CONTROL-C'S TO SENSE NEW BAUD RATE. ALSO INCLUD- ; ED IS AN 'ORIG' COMMAND THAT DEFAULTS TO 300 BAUD ; OR ORIGINATES AT 110, 300, 450, OR 600 BAUD ; BY ENTERING A 1, 3, 4, OR 6 ON THE COMMAND LINE ; WITH 'ORIG', INITIATE CALL MANUALLY AND THEN ; ENTER 'ORIG [X]' TO GO ON LINE. THE CCP COMMANDS ; ARE DIVIDED INTO PUBLIC AND PRIVATE COMMANDS ; WITH PASSWORD ENTRY FROM 'BYE' AND AN ADDITIONAL ; PASSWORD REQUIRED FOR PRIVILEGED COMMANDS AND ; USER AREAS ABOVE MAXUSER. ; ; THE MODULE ALSO INCLUDES A BACKGROUND MEMORY ; TEST THAT CONSTANTLY RUNS WHENEVER THE CURRENT ; CONSOLE IS AWAITING INPUT. ALSO, AN INTERRUPT ; IS USED TO DISCONNECT THE LINE WHENEVER CARRIER ; IS LOST. IT WILL ALSO TURN OFF THE COMPUTER ; IF THE PMMI AUXILIARY INTERFACE IS IMPLEMENTED. ; THE INTERRUPT IS INITIATED BY THE HORIZON REAL ; TIME CLOCK EVERY 3.328 MS. TO IMPLEMENT, CONNECT ; PIN 12 TO 13 ON THE CLOCK HEADER (10A) AND PIN ; 7 TO 16 ON THE INTERRUPT HEADER (1A). THE 'ID' ; JUMPER AT LOC 7E ON THE Z80 BOARD MUST ALSO BE ; CUT SO AS TO ENABLE INTERRUPTS. IN THE H89 MODE, ; A COUNTER AT 000BH WILL BE INCREMENTED EVERY 3.33 ; MS. THE TEST TO DISCONNECT THE LINE IF CARRIER IS ; LOST USES THE SAME CLOCK INTERRUPT BUT IS DONE ONLY ; ONCE EVERY 1000H INTERVALS (SO ONCE EVERY 13 SECS.). ; ; THESE FEATURES ARE AVAILABLE ONLY WITH THE S201, S22 ; OR S22X CONDITIONAL ASSEMBLY AND NOT WITH S145 ; ASSEMBLY NOT CHECKED FOR CPM145. ; ; AS DISTRIBUTED HERE, ALL OF THE FEATURES ARE ; AVAILABLE WITH ONLY ONE KILOBYTE OF SPACE ABOVE ; CP/M. THUS, YOU CAN RUN A CP/M 62K SYSTEM IF YOUR ; CONTROLLER PROM IS AT FC00H. ; ; THE UTILITY, GENESYS.COM, IS USED TO GEN THE SYSTEM ; TO OBTAIN THE ADDITIONAL 1KB RESIDENT ON THE NORTH ; STAR SYSTEM DISK TRACKS. THE NEW VERSION, GENSYS32, ; NOW WORKS WITH LIFEBOAT VERS 2.22 BIOS AS WELL AS ; PREVIOUS VERSIONS (1.45, 2.01, 2.2, 2.21A). BE SURE ; TO READ GENEUSYS.DOC FOR INSTRUCTIONS. ; *********************************************************** ; ; SYSTEM EQUATES ; FALSE EQU 0 TRUE EQU NOT FALSE ;SEE OPTIONS BLOCK ;TO SELECT ALL OPTIONS ; must select one, and only one, of these TRUE S145 EQU FALSE S201 EQU FALSE S22 EQU FALSE S22X EQU TRUE ;TRUE FOR 2.21A & 2.22 ; ; IF S201 OR S22 OR S22X BIOS EQU (MSIZE*1024)-0D00H ;BASE OF BIOS CCP EQU BIOS-1600H ;BASE OF CCP USER1 EQU BIOS+0700H ;BASE OF THIS MODULE USER2 EQU MSIZE*1024 ;BASE 2ND USER AREA PROMLOC EQU BIOS+6F5H ;LOC OF PROMHI BYTE OVERLAY EQU 2000H-BIOS ;COMPUTED OVERLAY ENDIF ; IF S145 BIOS EQU (MSIZE*1024)-200H ;BASE OF BIOS CCP EQU BIOS-1500H ;BASE OF CCP USER1 EQU BIOS+500H ;BASE OF THIS MODULE USER2 EQU MSIZE*1024+800H ;BASE OF 2ND USER AREA PROMLOC EQU CCP-100H+0CH ;LOC OF PROMHI BYTE. ;PLACED HERE BY COLD ;BOOT LOADER PATCHED ;IN BY GENESYS.COM OVERLAY EQU 2400H-USER1 ;COMPUTED OVERLAY ENDIF ; BDOS EQU CCP+800H ;BASE OF BDOS ; IF S22 OR S22X STACK EQU BDOS+341H ;ROOM IN SYSTEM FOR A ;A 24 LEVEL STACK. 12 REQ. ENDIF ; IF S201 STACK EQU BIOS+6DDH ;24 LEVEL STACK ENDIF ; COMBUF EQU CCP+7H ;LOC OF CMD BUFFER ; IOBYTE EQU 0003H ;I/O BYTE ADDRESS INIT EQU CCP-900H ;ORG FOR INIT CODE DRIVE EQU 0004H ;LOC OF CURR DRV BYTE HOLE4 EQU CCP+1F5H ;20 BYTES INTCNTR EQU 1000H ;INTERRUPT COUNTER VALUE ; ;********************************************************** ;********************************************************** ; ; SYSTEM OPTIONS ; ALL OPTIONS ARE IN THIS BLOCK. ; IOBYT EQU 00000001B ;VALUE OF IOBYTE ; ; ; ;---------;CONSOLE IS TTY: 00 ; ; ; ; CRT: 01 ; ; ; ; BAT: 10 ; ; ; ; UC1: 11 ; ; ;-----------;READER IS TTY: 00 ; ; ; RDR: 01 ; ; ; UR1: 10 ; ; ; UR2: 11 ; ;-------------;PUNCH IS TTY: 00 ; ; PUN: 01 ; ; UP1: 10 ; ; UP2: 11 ;---------------;LIST IS TTY: 00 ; CRT: 01 ; LPT: 10 ; UL1: 11 ; PASBYT EQU 00100100B ;PASSWORD BYTE ; ;----------;PASSWORD 2 REQUIRED ;-------------;PASSWORD 1 REQUIRED ; ORG HOLE4 ;These are the passwords for entry to CP/M from BYE ;and to USER area and command privileges above MAXUSER ;repectively. Passwords must be exactly 10 characters, and ;may be filled out to this value with spaces. The password ;checking routine sets bit 7 of the char it gets from the ;console (including remote) high, so add 80H to each char ;of the password (including any spaces) that will be entered. ;Fill out passwords shorter than 10 chars w/spaces without ;bit 7 set high. This prevents the ASCII characters from ;being visible with a monitor. They look like code instead. ; PAS1: DB 'P'+80H ; 1 PASSWORD1 DB 'A'+80H ; 2 DB 'S'+80H ; 3 DB 'S'+80H ; 4 DB 'W'+80H ; 5 DB 'O'+80H ; 6 DB 'R'+80H ; 7 DB 'D'+80H ; 8 DB '1'+80H ; 9 DB ' ' ; 10 ; PAS2: DB 'P'+80H ; 1 PASSWORD2 DB 'A'+80H ; 2 DB 'S'+80H ; 3 DB 'S'+80H ; 4 DB 'W'+80H ; 5 DB 'O'+80H ; 6 DB 'R'+80H ; 7 DB 'D'+80H ; 8 DB '2'+80H ; 9 DB ' ' ; 10 ; ;20 BYTES AVAILABLE AT HOLE4 ; ; PARTYLN EQU FALSE ;WANT PARTY LINE OPERATION? ;NOTE - IF PARTYLN IS SET TRUE ;AND ALL OTHER OPTIONS ARE TRUE, ;THEN U WILL NEED MORE THAN 1K ;RESERVED ABOVE CP/M. RUNHELP EQU TRUE ;WANT TO RUN HELP.COM WHEN PHONE ;IS ANSWERED BY 'BYE'? PARITY EQU TRUE ;WANT TO SET PARITY MEMORY SCRCLR EQU TRUE ;WANT TO CLEAR SCREEN ON BOOT CLOCK EQU TRUE ;WANT TIME FROM CLOCK BOARD ; FASTCLK EQU TRUE ;SET TRUE FOR 4 MHZ CLOCK ; MAXUSER EQU 2 ;FOR EXAMPLE..MAX PUBLIC USER AREA ; IF S201 OR S22 OR S22X ORG USER1-8H CONFG: DB 00000000B ;SAME AS IN NORTH STAR DOS ;BITS 0,1,2,3 SET INDICATE ;FASTSTEPPING IN ORDER A, ;B,C,D. BITS 7,6,5,4 SET ;INDICATE DOUBLE SIDED IN ;ORDER A,B,C,D. ORG USER1-13H JMP WINIT ;REPLACE THE JMP WITH RET ;IF YOU DO NOT WANT THE ;WINIT RTNE. ; JOFTEN: RET ;REPLACE WITH A JMP DW 0000H ;PATCH IN ADDR OF YOUR RTNE ENDIF ; IF S145 ORG USER1-4H DENSITY: DB 10101010B ;BITS 1,3,5,7 DD ON A,B,C,D BUFFER: DW USER1+100H ;BIOS BUFFER LOCATION ;YOU CAN CHANGE THIS IF YOU ;WISH BUT IN 1K INCREMENTS ENDIF ; ORG USER1-1H MODE: DB RAW+EIBIT+CAUTO ;MODE BYTE ; ONEDRV EQU 80H ;BIT 7=1 INDICATES 1 DRIVE RAW EQU 40H ;SET READ AFTER WRITE EIBIT EQU 10H ;ENABLE INTERRUPTS AFTER ;DISK ACCESS NMOUNT EQU 8 ;USE DRVPAR PARAMETERS WAUTO EQU 2 ;WARM BOOT AUTO FUNCTION CAUTO EQU 1 ;COLD BOOT AUTO FUNCTION ; ;END OF OPTIONS BLOCK ;*********************************************************** ;*********************************************************** ; ; HORIZON I/O PORT ASSIGNMENTS ; ;Be sure to check memory, modem, and clock port assignments ;for your system. ; PARAL EQU 0 ;PARALLEL I/O PORT SER1D EQU 2 ;LEFT SERIAL PORT DATA SER1ST EQU 3 ;LEFT SERIAL PORT STATUS SER2D EQU 4 ;RIGHT SERIAL PORT DATA SER2ST EQU 5 ;RIGHT SERIAL PORT STATUS MOTHER EQU 6 ;MOTHERBOARD COMMAND/STATUS MEMORY EQU 0C0H ;PARITY MEMORY PORT MODEM EQU 0E0H ;PMMI MODEM BASE PORT CLKBRD EQU 0CH ;DATA PORT FOR COMPUTIME BOARD ; ;********************************************************** ;START OF USER1 CODE ; ; JUMP TABLE LINKS BIOS TO GENEUSER ; The rest of the jumps are at base ; of the BIOS. ; ;DO NOT CHANGE THE NUMBER OF BYTES FROM HERE TO 'CONOUT:'. ; ;********************************************************** ORG USER1 JMP INITIAL ;USER INIT ROUTINE IF S22X JMP WINIT ;USED BY 221A & HIGHER ONLY ENDIF ; CRTIN: IN SER1D ;GET DATA STRPRET: ANI 7FH ;STRIP PARITY RET PASBYTE: DB 0 ;BUFFER FOR PASSWORD BYTE ; ;*********************************************************** ; ; IOBYTE PROCESSOR ; INCLUDING SCANNER OF MODEM & CONSOLE ; ;*********************************************************** ; CONOUT: LDA MDMBYT ;MODEM MODE? ORA A DB JRNZ, CONOUT0-$-1 ;IF NOT ,SKIP MODEM CHK ; IN TPORT ANI P0TBMT ;XMIT BUFFER EMPTY? DB JRZ, CONOUT-$-1 AND 0FFH ; MOV A,C OUT DPORT ; CONOUT0: ;CONSOLE OUTPUT ROUTINE CALL CONSOL ;COMMON ROUTINE DW TTYOUT ;TTY OUTPUT DW CRTOUT ;CRT OUTPUT DW LIST ;LIST OUTPUT DW UC1OUT ;USER CONSOLE OUTPUT ; CONSOL: MVI A,CONCNT ;SHIFT COUNTER ; DISPAT: ;I/O DISPATCHER - TO MAP LOGICAL TO PHYSICAL XTHL ;GET RETURN ADDR & SAVE HL PUSH B ;SAVE BC PUSH D ;SAVE DE MOV B,A ;PUT COUNTER VALUE IN B LDA IOBYTE ;GET THE IO BYTE ; DISPAT1: DCR B ;SHIFT IOBYTE UNTIL DB JRZ, DISPAT2-$-1 ;COUNT IN B=0 RRC RRC DB JR, DISPAT1-$-1 AND 0FFH ;SHIFT NEXT TWO BYTES ; DISPAT2: ANI 03H ;MASK OUT BITS 0,1 RLC ;DOUBLE MVI D,0 ;CLEAR D MOV E,A ; DAD D ;H,L POINTS TO ENTRY MOV A,M ;GET LOW BYTE INX H ;POINT TO HIGH BYTE MOV H,M ;GET HIGH BYTE MOV L,A ;H,L POINTS TO SUBR. POP D ;RESTORE DE POP B ;RESTORE BC XTHL ;RSTR HL & PUT RET ON STACK RET ; CONST: LDA MDMBYT ;GET MODEM BYTE ORA A ;ZERO? DB JRNZ, CONST0-$-1 ;IF NOT, SKIP MODEM CHECK ; ;CHECK FOR MODEM CHAR READY IN TPORT ;GET MODEM STATUS ANI P0DAV ;DATA AVAILABLE? DB JRZ, CONST0-$-1 ;NO, TEST KEYBOARD ; ;GOT CHAR FROM MODEM MVI A,0FFH ;SHOW TRUE ORA A ;RESET FLAGS RET ; CONST0: ;CONSOLE STATUS, RETURN 0FFH IF READY ,0 IF NOT CALL CONSOL ;COMMON ROUTINE DW TTYST ;TTY STATUS DW CRTST ;CRT STATUS DW RDRST ;READER STATUS DW UC1ST ;USER CONSOLE STATUS ; CONIN: CALL TEST ;BACKGROUND MEMORY TEST CALL CONST ORA A ;SET CC DB JRZ, CONIN-$-1 AND 0FFH ;TEST KEYBOARD FIRST CALL CONST0 ORA A ;SET CC DB JRZ, KEYNK-$-1 ;NO KEYBOARD CHAR ; ;GOT KEYBOARD CHAR CONIN0: ;CONSOLE INPUT ROUTINE CALL CONSOL ;COMMON CONSOLE ROUTINE DW TTYIN ;TTY INPUT DW CRTIN ;CRT INPUT DW READER ;READER INPUT DW UC1IN ;USER CONSOLE INPUT ; KEYNK: ;GET CHAR FROM MODEM IF READY LDA MDMBYT ORA A MVI A,0FFH ;RET FF IF NO CARRIER RNZ ; IN TPORT ;STATUS ANI P0DAV ;RECEIVE CHAR? DB JRZ, CONIN-$-1 AND 0FFH ;NO MODEM CHAR IN DPORT ;GET DATA JMP STRPRET ;STRIP PARITY & RETURN ; READER0: CALL TEST ;BACKGROUND MEM TEST READER: ;READER INPUT ROUTINE MVI A,RDRCNT ;SHIFT COUNTER CALL DISPAT ;GO TO LOOKUP ROUTINE DW TTYRDR ;READER IS TTY KBD. DW HSRIN ;IS HIGH SPEED READER DW UR1IN ;USER READER ONE DW UR2IN ;USER READER TWO ; PUNCH: ;PUNCH OUTPUT ROUTINE MVI A,PCHCNT ;SHIFT COUNTER CALL DISPAT ;LOOK UP ROUTINE DW TTYOUT ;PUNCH IS TTY DW PUNOUT ;HIGH SPEED PUNCH DW UP1OUT ;USER PUNCH ONE DW UP2OUT ;USER PUNCH TWO ; LIST: ;LIST OUTPUT ROUTINE MVI A,LSTCNT ;SHIFT COUNTER CALL DISPAT ;GO TO DISPATCHER DW TTYOUT ;LIST DEVICE IS TTY DW CRTOUT ;LIST DEVICE IS CRT DW LPTOUT ;LINE PRINTER DW UL1OUT ;USER LIST DEVICE ; LISTST: ;LIST DEVICE STATUS ROUTINE MVI A,LSTCNT ;SHIFT COUNTER CALL DISPAT ;LOOK UP ROUTINE DW TTYST ;RETURN TTY STATUS DW CRTST ;RETURN CRT STATUS DW LPTST ;LINE PRINTER STATUS DW UL1ST ;USER LIST DEVICE STATUS ; ;********************************************************** ; ; NORTH STAR HORIZON I/O DRIVERS ; ;********************************************************** ; ; CRT DRIVERS (LEFT SERIAL PORT) ; CRTST: ;CRT STATUS IN SER1ST ;GET SERIAL ZERO STATUS DB JR, TSTSTAT-$-1 ; CRTOUT: ;CRT OUTPUT IN SER1ST ;GET STATUS FOR LEFT SERIAL ANI OUTRDY ;READY TO RECEIVE DATA? DB JRZ, CRTOUT-$-1 AND 0FFH ;NO, LOOP TIL READY MOV A,C ;GET DATA OUT SER1D ;SEND TO DATA PORT RET ; ; TTY DRIVERS (RIGHT SERIAL PORT) ; TTYST: ;TTY INPUT STATUS IN SER2ST ;GET SERIAL TWO STATUS DB JR, TSTSTAT-$-1 ; TTYRDR: ;TTY KEYBOARD AS READER IN SER2ST ANI INRDY JZ READER0 TTYIN: IN SER2D ;GET DATA JMP STRPRET ; TTYOUT: ;TTY OUTPUT IN SER2ST ;GET STATUS FOR SERIAL PORT 1 ANI OUTRDY ;READY FOR DATA? DB JRZ, TTYOUT-$-1 AND 0FFH ;NO, WAIT TIL READY MOV A,C ;GET DATA OUT SER2D ;SEND TO SERIAL 2 DATA PORT RET ; ; READER DRIVER (PARALLEL INPUT PORT) ; RDRST: ;READER STATUS IN MOTHER ;GET STATUS TSTSTAT: ANI INRDY ;MASK FOR READY RRC ;SHIFT TO LSB DCRCMA: DCR A ;IF ZERO, MAKE FF CMA ;COMPLEMENT THE ACC. RET HSRIN: ;HIGH-SPEED READER INPUT IN MOTHER ;GET STATUS ANI INRDY ;READY WITH DATA? JZ READER0 ;LOOP UNTIL PI FLAG IN PARAL ;GET PARALLEL INPUT DATA ANI 07FH ;STRIP PARITY MOV B,A ;SAVE MVI A,30H ;LOAD COMMAND BYTE TO A OUT MOTHER ;RESET PI FLAG MOV A,B ;RECOVER DATA RET ; ; PUNCH DRIVER (PARALLEL OUTPUT PORT) ; PUNOUT: ;HIGH-SPEED PUNCH OUTPUT LPTOUT: ;LINE PRINTER OUT ;PUNOUT AND LPTOUT ARE SAME ROUTINE IN MOTHER ;GET STATUS ANI OUTRDY ;READY FOR DATA DB JRZ, LPTOUT-$-1 AND 0FFH ;NO, WAIT TIL READY MOV A,C ;GET DATA OUT PARAL ;SEND TO PARALLEL PORT MVI A,20H ;COMMAND BYTE OUT MOTHER ;RESET PO FLAG MOV A,C ;GET DATA AGAIN RET ; LPTST: ;LINE PRINTER STATUS IN MOTHER ;GET STATUS ANI OUTRDY ;READY TO RECEIVE CHAR DB JR, DCRCMA-$-1 AND 0FFH ; ;********************************************************** ; ; USER WARM INITIALIZATION ROUTINE ; ;********************************************************** ; WINIT: PRNTIM: IF NOT CLOCK CALL ILPRT2 DB ESC,EXGRAPH,0 RET ENDIF ; IF CLOCK AND NOT S145 CALL TIME DCX B DCX B JMP PRNSTR1 ENDIF ; ; ;********************************************************** ;This patch which is called from the CCP provides for a ;report of USER number at the prompt....i.e. A2> for USER 2, ;'A' drive. ; IF NOT S145 UPATCH: CALL GETUSR ;GET USER NUMBER ANI 0FH ;KILL UNWANTED BITS DB JRZ, UPA2-$-1 ;IF USER 0, DON'T REPORT CPI 10 DB JRC, UPA1-$-1 ;JIF USER NUM = 0 THRU 9 SUI 10 ;USER NUM = 10 THRU 15 PUSH PSW MVI C,'1' CALL CONOUT ;PRINT A '1' POP PSW ; UPA1: ADI '0' MOV C,A CALL CONOUT ;PRINT DIGIT ; UPA2: MVI C,'>' CALL CONOUT ;PRINT '>', EXIT LDA H89FLG ORA A ;H89 MODE? CNZ DARMCLK ;DISARM REAL TIME CLOCK XRA A STA TRAPBYT ;CLEAR THE TRAPS STA H89FLG ;SET H89 MODE TO FALSE JMP RSTPRMS ;RESET PARAMETERS & RETURN ; ;********************************************************** ;The password checking routine- uses string comparator ;that is contained in the CCP. ; CKPASS0: LXI H,PASBYTE DW BIT2M DB JRZ, OK-$-1 LXI H,PAS2 SHLD STRPTR LXI H,PASTBL2 SHLD CMDPTR DB JR, CKPASS-$-1 ; PASSINT: CALL LOGTST DB JRZ, OK-$-1 LXI H,PAS1 SHLD STRPTR LXI H,PASTBL1 SHLD CMDPTR ; CKPASS: MVI A,1 STA CMDCNT MVI A,10 STA CMDLEN MVI C,4 ;GIVES 4 TRIES PUSH B ; CKAGIN: CALL ILPRT DB 'Password: ',0 POP B MVI B,14 ;TO KEEP HIM FROM CLOBBERING ;THE CODE LXI H,FCBFN DRCON: CALL CONIN DW SET7A ;SET BIT 7 OF PASSWORD CHAR HIGH CPI CR+80H DB JRNZ, DRCN2-$-1 MVI A,20H MVI B,1 DRCN2: MOV M,A INX H DCR B DB JRNZ, DRCON-$-1 AND 0FFH ; DCR C JZ RELOG0 PUSH B JMP SRCHCMD ; ;********************************************************** ;Routine to set 2nd password bit so that entry of 2nd ;password is required again. ; LOCK: LXI H,PASBYTE DW SET2M ; ;fall through *********************************************************** ;Say ok. OK: CALL ILPRT DB 'Ok',0 JMP RETCCP ; ;********************************************************** ;ROUTINE TO SET UP THE MODEM UART PARAMETERS. ; SETUP: MOV A,M ORA A DB JRNZ, SETURT-$-1 LXI H,UART SETURT: LXI D,BAUDRT LXI B,5 DW LDIR RET ; ;********************************************************** ;ROUTINE TO CHECK EXIT REQUEST FROM A LOOP ; REQEXIT: CALL CONST ORA A RZ CALL CONIN RET ; ENDIF ; ;********************************************************** ;Print hex subroutines used in the background memory test. ; PRTHX: PUSH PSW RRC RRC RRC RRC CALL PRTHX1 POP PSW ; PRTHX1: ANI 0FH CPI 10 DB JRC, PRTHX2-$-1 ADI 7 ; PRTHX2: ADI '0' MOV C,A JMP CONOUT ; ;********************************************************** ;DISARM CLOCK INTERRUPT BEFORE RETURNING TO CCP ; CCPRET: XRA A STA PASBYTE MVI A,P3CLEAR OUT CPORT ;BE SURE PHONE LINE DISCONNECTED ; CALL DARMCLK ;IN CASE RETURNING TO CCP JMP RELOG0 ; USR1END: EQU $ ;END OF USER1 CODE FOR NOW USR1SIZE EQU USR1END-USER1 ;MUST NOT EXCEED SPACE ;ALLOCATED IN USER1 ; ;********************************************************** ; ; THIS IS THE INIT ROUTINE. IT WILL RUN AT CCP-900H ; AND WILL MOVE THE USER2 CODE JUST ABOVE CPM WHERE ; YOU MUST HAVE RESERVED EITHER 1 OR 2K, SIZING YOUR ; SYSTEM ACCORDINGLY. THE INIT CODE IS NOT MOVED ; AND WILL BE OVERWRITTEN BY TRANSIENT PROGRAMS. ; ORG INIT ; INITIAL: LXI H,SOURCE ;SOURCE OF USER2 CODE LXI D,USER2 ;DEST OF USER2 CODE LXI B,USR2END-USER2 ;# OF BYTES TO MOVE DW LDIR ;MOVE THEM ; MVI A,IOBYT ;THE VALUE STA IOBYTE ;THE LOCATION ; XRA A ;SET TO CLEAR MOTHERBOARD OUT MOTHER OUT MOTHER ;EXTRAS FOR TIMING, OUT MOTHER OUT MOTHER ;DON'T ASK OUT CPORT OUT TPORT ; MVI A,40H ;DISABLE PARITY LOGIC OUT MEMORY ;BEFORE READING RAM ; LHLD PROMLOC-1 ;POINT TO LOC OF PROMHI. ;AT 0CH OF CLDBT FOR 1.45. ;AT BIOS+6F5H FOR 2.0,2.2, ;&2.21A MVI L,0 ;ZERO L ; IF PARITY ;WANT PARITY SETTING CODE? MOV D,H MOV E,L LXI B,-1023 ;NUMBER OF BYTES TO CLEAR DW LDDR ;SET PARITY ON ALL RAM MVI A,41H ;PARITY ENABLE CODE OUT MEMORY ;REARM PARITY LOGIC ENDIF ; LXI H,MODE ;POINT TO MODE BYTE DW SET4M ;SET MODE BYTE SO THAT ;INTERRUPTS ARE ENABLED ;AFTER DISK ACCESS MVI A,USER2/256 ;PAGE ADDR OF PARITY ERROR ;ROUTINE DW MOVIVA ;PUT HI BYTE IN IV REGISTER DW IM2 ;SET INTERRUPT MODE 2 EI ; MVI A,0CEH ;INITIALIZE UARTS ;2 STOPS, 16X CLOCK ;8 BITS, NO PARITY OUT SER1ST OUT SER2ST ; MVI A,37H ;COMMAND: RTS, ER, ;RXF, DTR, TXEN OUT SER1ST OUT SER2ST ; ; IN DPORT ;CLEAR MODEM PORT IN SER1D ;CLEAR INPUT BUFFER IN SER2D ;CLEAR INPUT BUFFER IN PARAL ;CLEAR PARALLEL PORT MVI A,PASBYT STA PASBYTE ; DB JR, TINU-$-1 ; ; ***THIS IS A SPECIAL ORG FOR THE LIFEBOAT FORMAT BYTE**** ; BE SURE THAT PRECEEDING CODE DOES NOT OVERWRITE THIS LOC. ORG INIT+5CH DS 1 ;STORAGE FOR FORMAT BYTE ; TINU: MVI A,0C3H STA 52H LXI H,TIME SHLD 53H MVI A,30H ;RESET PI FLAG OUT MOTHER RET ; INITEND:EQU $ INITSIZE EQU INITEND-INIT ; ;********************************************************** ; USER2 code starts here. Will be relocated to just above ; CP/M by the INIT code. ; SOURCE: EQU $ ;SOURCE OF USER2 CODE OFFSET: EQU USER2-SOURCE ;OFFSET FOR USER2 CODE FR: EQU -1-OFFSET ;FORWARD RELATIVE BR: EQU FR+0FFH+1 ;BACKWARD RELATIVE ; ;********************************************************** ; THIS IS RAM PARITY ERROR ROUTINE FOR USE WITH NORTH STAR ; PARITY MEMORY BOARDS. INITIALIZATION IN INIT MUST BE TO ; Z80 INTERRUPT MODE 2 AND PARITY ERROR SHOULD ACTIVATE INT- ; ERRUPT VECTOR 5 BY JUMPERING ON MEMORY BOARDS. DO NOT ; CHANGE THE ORG FOR THIS CODE + SEE THE WARNING BELOW AT ; LABEL 'STORE'. ; PERR: EQU $+OFFSET PUSH PSW CALL ILPRT DB 'Ram parity error',0 MVI A,40H OUT MEMORY ;DISARM PARITY LOGIC POP PSW ; ;********************************************************** ;Routines to disconnect the line upon clock interrupt and ;carrier not detected. The routines are peculiar to the ;North Star Horizon hardware. Provide your own service ;routines for other hardware. This routine also provides for ;incrementing a counter at 000BH every 3.33 ms. for the use ;of some H89 games. Carrier checking is done only one out of ;every 1000H interrupts which are provided by the real time ;clock every 3.33 ms. ; DISCONN: EQU $+OFFSET PUSH PSW PUSH H LHLD COUNTER DCX H ;DECREMENT COUNTER MOV A,H ;TO TEST FOR ZERO ORA L ; SHLD COUNTER PUSH PSW LDA H89FLG ORA A DB JRZ, NOTH89-$+FR LHLD 000BH INX H SHLD 000BH NOTH89: EQU $+OFFSET CALL RSTCLK POP PSW DB JRNZ, DUN-$+FR LXI H,INTCNTR SHLD COUNTER LDA H89FLG ORA A DB JRNZ, DUN-$+FR CALL CHECK DUN: EQU $+OFFSET POP H POP PSW RET ; ARMCLK: EQU $+OFFSET DI LXI H,INTCNTR SHLD COUNTER MVI A,0C0H ;ARM CLOCK INTERRUPT OUT MOTHER ; RSTCLK: EQU $+OFFSET MVI A,50H OUT MOTHER EI RET ; ;********************************************************** ;Computime T-102 clock routine ; IF CLOCK TIME: EQU $+OFFSET ;DISPAYS DATE AND TIME IN CLKBRD ;CLOCK STATUS INR A ;NO CLOCK BOARD? LXI D,NOCLOCK RZ ;SAY NO CLOCK BOARD ; LXI H,HHMM ;POINT TO START OF HR.,MIN. XRA A ;TO GET THE HR. TENS CALL GETDIG ;GET THE DIGITS LXI H,MMDD ;POINT TO DATE DIGITS MVI A,8 ;TO GET MONTH TENS CALL READ ;READ IT CPI 63 ;TEST TO SUPPRESS LEADING 0 DB JRNZ, NOBLNK-$+FR MVI A,20H ;SUPPRESS WITH A BLANK NOBLNK: EQU $+OFFSET MOV M,A ;PUT IN MEMORY INX H ;POINT TO NEXT DIGIT MVI A,9 ;SET TO READ MONTH UNITS CALL GETDIG ;GET IT LXI D,DTMSG ;POINT TO DATE/TIME MSG ;SUPPLY YOUR OWN OUT ROUTINE PUSH D XCHG POP D PUSH D POP B ;NOTE, THAT BC, DE, & HL ALL ;CONTAIN ADDRESS OF DATE/TIME ;MESSAGE FOR THE CONVENIENCE ;OF YOUR APPLICATIONS. ;string terminator is 0 or '$' RET ; READ: EQU $+OFFSET ;READ A DIGIT, CONV TO ASCII OUT CLKBRD ;SEND FUNCT # TO CLOCK BOARD CALL CLKDLY IN CLKBRD ;DIGIT RETURNED IN A ANI 0FH ;MASK ADI 30H ;CHANGE TO ASCII RET ; GETDIG: EQU $+OFFSET ;GET A DIGIT AND STORE IT CPI 12 ;DONE WITH DATE? RZ CPI 6 ;DONE WITH TIME? RZ MOV B,A ;SAVE A FOR AWHILE CALL READ ;GET DIGIT FROM CLOCK MOV C,A ;SAVE FOR AWHILE MOV A,M ;READ CHAR IN MEMORY CPI 2FH ;IS IT / ? DB JRNZ, SKIP1-$+FR INX H ;IF SO GO INCREMENT POINTER SKIP1: EQU $+OFFSET CPI 3AH ;IS IT : ? DB JRNZ, SKIP2-$+FR ;ADVANCE POINTER TO SKIP INX H SKIP2: EQU $+OFFSET MOV M,C ;PUT DIGIT IN MEMORY MOV A,B ;GET SAVE CLOCK FUNCT VALUE INX H ;POINT TO NEXT DIGIT INR A ;ADVANCE TO NEXT FUNCTION JMP GETDIG ;AND GET ANOTHER DIGIT ; DB ESC,EXGRAPH DTMSG: EQU $+OFFSET ;DATE/TIME STORAGE LOCATION DB 'Time ' HHMM: EQU $+OFFSET DB 'HH:MM:' SECX10: EQU $+OFFSET DB 'S' SECX1: EQU $+OFFSET DB 'S' ; DATE: EQU $+OFFSET DB ' Date ' MMDD: EQU $+OFFSET DB 'MM/DD/' YY: EQU $+OFFSET DB '1982' DB 0,'$' ; DB ESC,EXGRAPH NOCLOCK: EQU $+OFFSET DB 'NoClk',0,'$' ENDIF ; ;********************************************************** ;LOSS OF CONNECTION TEST ; CARCK: EQU $+OFFSET ; ;THE PMMI MODEM AUTOMATICALLY HANGS UP THE PHONE AFTER ;15 SECONDS OF LOSS OF CARRIER, PROVIDING YOU OUTPUT TO ;PORT 0 TO ALLOW IT (WHICH THIS PROGRAM DOES). ; ;..SO, THIS ROUTINE FIRST CHECKS IF THE MODEM HAS HUNG UP, ;AND IF SO, RETURNS WITH CARRY SET. IF NOT, IT CHECKS FOR ;CARRIER AND RETURNS IF CARRIER IS ON; OTHERWISE WAITS FOR ;CARRIER WHILE STILL TESTING FOR DISCONNECT. ; ;IT TESTS THE PMMI "CTS" (CLEAR TO SEND) BIT ;WHICH IS 0 WHEN THERE IS CARRIER. ; IN RPORT ;GET STATUS ANI P2CONN ;CONNECTED? STC ;(IN CASE NOT) RNZ ;HUNG UP. ;STILL CONNECTED, CHECK FOR CARRIER CALL CKCTS ;SEE IF CLEAR TO SEND RZ ;LOOP UNTIL EITHER CONNECTION LOST, OR CARRIER RETURNS DB JR, CARCK-$+BR ; ;********************************************************** ;DELAY ROUTINES ; ; .1 SEC DELAY ANSDLY: EQU $+OFFSET PUSH B ; IF FASTCLK LXI B,16667 ;4 MHZ ENDIF ; IF NOT FASTCLK LXI B,8334 ;2 MHZ ENDIF ; JMP DELAY1 ; ;********************************************************** ;The values at TABLE and TABLE1 must be at 0EFH and 0F7H ;respectively in this page. They are the addresses of the ;parity error message and phone disconnect service routines. ;Those addresses are called by the Z80 mode 2 interrupt ;when a parity error is detected on a north star memory ;board and phone line disconnect with a PMMI modem using ;interrupts 5 and 6 respectively. ; STORE: EQU $+OFFSET DS USER2+00EFH-$-OFFSET ; ;************************************** ; *****WARNING***** * ; IF YOU ADD CODE IN USER2 ABOVE THIS * ; POINT, BE CERTAIN THAT THE LOCATION * ; OF THE FOLLOWING TABLE ADDRESS IS * ; EQUAL TO OR > THAN THE ADDRESS * ; AT 'STORE' AND THAT THE LO BYTE IS * ; 0EFH IN THIS PAGE OR ELSE THE RAM * ; PARITY ERROR MESSAGE WON'T WORK. * ;************************************** ; TABLE: EQU $+OFFSET ;THIS ADDRESS MUST BE AT ;0EFH IN SAME PAGE AS PERR DW PERR ; ;Routine to check carrier ; CKCTS: EQU $+OFFSET IN RPORT ;LOOK AT STATUS ANI P2CTS ;GET CARRIER DETECT BIT RET DB 0 ;SPARE, DO NOT REMOVE ; TABLE1: EQU $+OFFSET ;THIS ADDRESS MUST BE AT ;0F7H IN THIS PAGE DW DISCONN ;ADDR OF ROUTINE TO HANGUP ; THE LINE ; H89FLG: EQU $+OFFSET DB 0 ;INITIAL VALUE ; *********************************************************** ; 2 MSEC DELAY ; CLKDLY: EQU $+OFFSET PUSH B ; IF FASTCLK LXI B,333 ENDIF ; IF NOT FASTCLK LXI B,167 ENDIF ; DELAY1: EQU $+OFFSET DCX B MOV A,B ORA C DB JRNZ, DELAY1-$+BR POP B RET ; ;********************************************************** IF (S201 OR S22 OR S22X) ;This is Ward's 'BYE' program modified to run as CCP-includ- ;ed command. It comes up in auto-answer mode and requires a ;password using the CCP-included LOGIN command routine. You ;may exit locally to the system by hitting the ESCape key. ;You can also enter the command ANSWR after you are in the ;system to give an immediate answer tone. (The remote can ;then send a few C/R's to set to his baud rate and will get ;in without requiring a password.) After the remote is in, ;he may enter the ANSWR command, return to his system to ;change his speed, and then come back with C/R's to change ;the answer baud rate. In each case, a second password must ;be entered to obtain CCP privilege to higher USER areas and ;CCP command/transients using the PASS command. ; BYE: EQU $+OFFSET CALL PRNTIM CALL ILPRT ;PRINT THIS MSG: DB 'Goodbye, call again',CR,LF,0 ; HANGUP: EQU $+OFFSET ; ;SET BIT 7, PMMI AUX INTERFACE, CAUSING POWER TO GO OFF ;(has no effect if aux interface is not implemented) MVI A,OFFPWR OUT CPORT ; OFF: EQU $+OFFSET MVI A,PASBYT STA PASBYTE CALL RSTMDM ;TO RESET THE MODEM BYTE ; ;CLEAR DTR CAUSING PHONE TO HANG UP MVI A,P3CLEAR OUT CPORT CALL ARMCLK CALL ILPRT2 DB CR,'*>',0 SETPRMS: EQU $+OFFSET CALL RSTPRMS ; ;AWAIT RINGING RINGWT: EQU $+OFFSET ; ;CHECK LOCAL KEYBOARD FOR 'ESC' EXIT REQUEST. CALL REQEXIT CPI ESC JZ CCPRET ;YES, --EXIT-- TO CP/M IN RPORT ;GET THE STATUS ANI P2RDET ;RINGING? DB JRNZ, RINGWT-$+BR ;NO, WAIT ; IF PARTYLN CALL DARMCLK ;NOW WAIT UNTIL RING IS FINISHED ENDRING: EQU $+OFFSET CALL ANSDLY ;.1 SEC DELAY FOR DEBOUNCE IN RPORT ;GET STATUS ANI P2RDET ;STILL RINGING? DB JRZ, ENDRING-$+BR ;WAIT UNTIL RING FINISHED ; ;PHONE IS RINGING ; ; THIS ROUTINE MINIMIZES THE COMPUTER'S INTERFERENCE ; WITH NORMAL HOUSEHOLD PHONE USE BY HAVING COMPUTER ; FOLK DIAL, LET THE PHONE RING ONCE, HANG UP AND ; THEN DIAL AGAIN. WHEN THE PHONE RINGS ONLY ONCE IT ; ALERTS THE COMPUTER WHICH THEN WAITS FOR AND ANSWERS ; ANY RING WHICH OCCURS WITHIN THE NEXT 40 SECONDS. ; MVI L,45 ;DELAY 4.5 SECONDS FOR NEXT RING WAITNX: EQU $+OFFSET CALL ANSDLY ;WAIT .1 SECONDS DCR L ;MORE TO GO? DB JRNZ, WAITNX-$+BR ;YES?...LOOP IN RPORT ;GET THE STATUS ANI P2RDET ;RINGING AGAIN? DB JRNZ, EXPECT-$+FR ;NO?...ITS FOR ME ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET WAITNR: EQU $+OFFSET MVI L,100 ;WAIT FOR 10 SECS NO RINGING WAITNRL: EQU $+OFFSET CALL ANSDLY ;DELAY .1 SECONDS IN RPORT ;GET THE STATUS ANI P2RDET ;STILL RINGING? DB JRZ, WAITNR-$+BR ;YES, WAIT 10 MORE SECONDS DCR L ;NO RING, MAYBE WE'RE DONE DB JRNZ, WAITNRL-$+BR ;NO, LOOP SOME MORE DB JR, HANGUP-$+BR ; EXPECT: EQU $+OFFSET LXI H,400 ;40 SECONDS TO REDIAL LOOKAGN: EQU $+OFFSET IN RPORT ANI P2RDET ;RINGING AGAIN? DB JRZ, ANSWER-$+FR CALL ANSDLY DCX H MOV A,H ORA L DB JRNZ, LOOKAGN-$+BR JMP HANGUP ENDIF ; DB JR, ANSWER-$+FR ; MDMBYT: EQU $+OFFSET DB 0FFH ;MODEM BYTE, 0FFH=OFF ; DARMCLK: EQU $+OFFSET MVI A,40H ;DISARM CLOCK INTERRUPT OUT MOTHER RET ; ;SETUP MODEM ANSWR: EQU $+OFFSET ;IMMEDIATE ANSWER TONE LXI H,PASBYTE ;POINT TO PASSWORD BYTE DW RES5M ;NO 1RST PASSWORD REQUIRED ; ANSWER: EQU $+OFFSET CALL ARMCLK LXI H,UART CALL SETMDM ;SET MODEM BYTE SYNCH: EQU $+OFFSET LDA DTR ;TURN ON DTR OUT CPORT ;.. AND SET FILTER VALUE CALL ANSDLY ;TIME TO TURN ON MVI A,P0110+P0ANSW OUT TPORT ;ANSWER PHONE CALL ANSDLY LDA UARTWD OUT TPORT IN DPORT ;..CLEAR MODEM IN DPORT ;..MAKE SURE IT'S CLEAR LDA BAUDRT OUT RPORT ;SET BAUD RATE DIVISOR CALL CONIN ;GET CHARACTER FROM MODEM CPI CR ;IF A CARRIAGE RETURN... DB JRZ, WELCOME-$+FR CPI LF ;LINE FEED? DB JRZ, WELCOME-$+FR CPI 'C'-40H ;IF A CONTROL-C DB JRZ, WELCOME-$+FR ;YES, EXIT CALL SETUP DB JR, SYNCH-$+BR ;TEST MORE - INVALID BAUD RATE ; UART: EQU $+OFFSET DB B300,P3TODTR,P0NOPY+P08BIT,'30' DB B450,P3TODTR-20H,P0NOPY+P08BIT,'45' DB B110,P3TODTR,P0NOPY+P08BIT+P0TSB,'11' DB B600,P3TODTR-20H,P0NOPY+P08BIT,'60' ; DB B520,P3TODTR-20H,P0NOPY+P08BIT,'52' ; DB B220,P3TODTR,P0NOPY+P08BIT,'22' ; DB B710,P3TODTR-20H,P0NOPY+P08BIT,'71' DB 0 BAUDRT: EQU $+OFFSET DB B600 DTR: EQU $+OFFSET DB P3TODTR-20H UARTWD: EQU $+OFFSET DB P0NOPY+P08BIT RATE: EQU $+OFFSET DB '600 baud',0 ; WELCOME: EQU $+OFFSET LXI B,RATE CALL PRNSTR1 ;SHOW THE BAUD RATE CALL PRNTIM LXI H,SIGNON CALL PRNSTR2 ;SHOW SIGN-ON STRING W/O SCRCLR ; IF RUNHELP JMP GETCMD ;RUN 'HELP' ENDIF ; IF NOT RUNHELP JMP RETCCP ENDIF ; ;********************************************************** ;Routines to trap transient files if they are resident ;on drive A. If DIR.COM not present, then the CCP code for ;the DIR command will be executed. If TYPE.COM not present, ;then the CCP code for the TYPE command will be executed. ;This trapping is useful for SD.COM and MLIST.COM re-named ;to DIR.COM and TYPE.COM respectively. ;**NOTE** Do not use a Directory transient that scans user ;areas such as SD-21 or SD-22. KDIR is ok. You can use SD-42 ;if you set AOPT to FALSE and add an IF AOPT and ENDIF around ;the [lda,newusr; cmp m; jnz mordir] sequence at the label, ;SYSFOK. Otherwise you will defeat the universal user area ;features in this program so far as directories are concerned, ;although the universallity will still apply to execution and ;finding of files in users 13, 14, and 15. ; DIR1: EQU $+OFFSET LXI H,TRAPBYT DW SET0M ;SET DIR TRAP JMP GETRANS ; TYPE1: EQU $+OFFSET LXI H,TRAPBYT DW SET1M JMP GETRANS ; HUH0: EQU $+OFFSET LXI H,TRAPBYT DW BIT0M ;SEE IF DIR TRAP SET JNZ DIR ;CCP DIR CODE IF NOT DW BIT1M ;SEE IF TYPE TRAP SET DW RES1M JNZ TYPE ;CCP TYPE CODE IF NOT CALL ILPRT DB 'No, ',BELL,0 CALL LOGTST JNZ RELOG JMP HUH+3 ; ;********************************************************** ;Routine for ORIG(inate) command. ; ORIG: EQU $+OFFSET LDA MDMBYT ORA A JZ HUH CALL WRFCB ORIG1: EQU $+OFFSET LXI H,UART ROTATE: EQU $+OFFSET CALL SETUP JZ HUH PUSH H LXI H,BAUDRT+3 LDA FCBFN CPI 20H DB JRNZ, COMPR-$+FR MVI A,'3' ;DEFAULT TO 300 BAUD COMPR: EQU $+OFFSET CMP M POP H DB JRNZ, ROTATE-$+BR MVI A,P3CLEAR OUT CPORT LXI B,RATE CALL PRNSTR1 MVI A,P0ORIG OUT TPORT LDA DTR OUT CPORT WTCTS: EQU $+OFFSET CALL REQEXIT CPI 'E'-40H JZ CCPRET CALL CKCTS DB JRNZ, WTCTS-$+BR LDA BAUDRT OUT RPORT LDA UARTWD OUT TPORT COMLOOP: EQU $+OFFSET IN TPORT ANI P0DAV DB JRZ, NOMDAT-$+FR IN DPORT ANI 7FH MOV C,A CALL CONOUT NOMDAT: EQU $+OFFSET CALL CONST ORA A DB JRZ, COMLOOP-$+BR CALL CONIN OUT DPORT CPI 'D'-40H JZ CCPRET CPI 'E'-40H JZ RETCCP DB JR, COMLOOP-$+BR ; ;********************************************************** ;This is the command string which is divided into private ;and public sections. Do not use more than five letters for ;the name of any command/transient and fill out each string ;to exactly five characters by using spaces below. Strings ;must occur at 5 character intervals. If you use some ;other string length such as 4 as in the original CCP, just ;change string lengths below and change the LENCMD equate ;from 5 to 4. I use 5 below so that LOGIN can fit. ; CMDSTR2: EQU $+OFFSET DB 'ERA REN SAVE H89 LOCK BOOT ' CMDSTR1: EQU $+OFFSET DB 'TYPE USER PASS DIR ANSWRORIG ' CMDSTR0: EQU $+OFFSET DB 'DIR LOGINOFF BYE QUIT ' ; ;********************************************************** ;This is the command address table which is divided into ;private and public areas. The address of the routine to be ;jumped to must be here for CCP-included code as well as ;any that you put in your customized BIOS. ;You can expand the table to any extent that you have space ;and the command string above must be expanded in synchronism. ; CMDTBL2: EQU $+OFFSET DW ERA ;ERA....PRIVATE COMMANDS DW REN ;REN DW SAVE ;SAVE DW H89 ;SET H89 MODE (temporarily) DW LOCK ;SET 2ND PASSWORD TO REQUIRED DW BOOT ;RE- BOOT THE SYSTEM CMDTBL1: EQU $+OFFSET DW TYPE1 ;TYPE..In case MLIST.COM renamed ;to 'TYPE.COM'. Put the transient ;in USER 14 on drive A. DW USER ;USER DW CKPASS0 ;PASS(word) to gain access to ;private user areas. DW DIR1 ;DIR....If you wish to use SD or ;KDIR as a CCP transient instead of ;the CCP DIR code, just change the ;name of your transient to DIR.COM ;and put it in USER 14 on drive A. ;The transient will run only if 1rst ;password level has been achieved. ;If transient not present then CCP ;'DIR' code will run. DW ANSWR ;ANSWR routine DW ORIG ;ORIGinate routine ;These commands will be the only ones allowed until the user ;logs in to the system with LOGIN. CMDTBL0: EQU $+OFFSET DW DIR ;WILL RUN THE CCP 'DIR' CODE DW PASSINT ;LOGIN DW OFF ; DW BYE ;BYE DW BYE ;QUIT GETRAN0: EQU $+OFFSET ;This must be last entry in table. DW GETRANS ;GET THE TRANSIENT AND EXECUTE OR ;RETURN TO CCP W/HUH MESSAGE IF NOT ;ON DISK. ; ;********************************************************** ;Routines to reset parameters for string matching and other ;purposes. ; RSTPRMS: EQU $+OFFSET MVI A,LENCMD STA CMDLEN LXI H,PASBYTE DW BIT5M DB JRNZ, RST0-$+FR DW BIT2M DB JRNZ, RST1-$+FR ; RST2: EQU $+OFFSET LXI H,CMDSTR2 SHLD STRPTR MVI A,(GETRAN0-CMDTBL2)/2 STA CMDCNT LXI H,CMDTBL2 SHLD CMDPTR MVI A,16 STA TSTUSR RET ; RST1: EQU $+OFFSET LXI H,CMDSTR1 SHLD STRPTR MVI A,(GETRAN0-CMDTBL1)/2 STA CMDCNT LXI H,CMDTBL1 SHLD CMDPTR MVI A,MAXUSER+1 STA TSTUSR RET ; RST0: EQU $+OFFSET MVI A,(GETRAN0-CMDTBL0)/2 STA CMDCNT LXI H,CMDSTR0 SHLD STRPTR LXI H,CMDTBL0 SHLD CMDPTR MVI A,1 STA TSTUSR RET ; ;********************************************************** ;This routine will make USER 13, 14, and/or 15 universal on ;drive A only depending on password level. Files placed in ;user 13 will be universal without any password. Files placed ;in user 14 will additionally be universal on drive A at the ;first password level, and files placed in user 15 will be ;universal at the second password level in addition to those ;in users 13 and 14. ; ***** WARNING ***** ;NEVER have two files by the same name & extension on the ;same disk (one in USER 15 and the other in some other ;USER) because CP/M will take which ever one comes first ;in the directory. ; UNIV: EQU $+OFFSET MOV A,B ;duplicate instruction overlayed ORA A ;check pointer for zero byte DB JRNZ, UNIV1-$+FR ;skip if not zero byte of fcb ; LDA CURDSK ;get current disk ANI 0FH ;mask out high nibble CPI 0 ;is it drive A? (may be changed ;to any drive. 0,1,2.. = A,B,C..) DB JRNZ, UNIV1-$+FR ;skip if not ; LDAX D ;get fcb first byte CPI 0E5H ;check for erased DB JRZ, UNIV1-$+FR ;skip if erased ; LDA PASBYTE DW BIT5A DB JRNZ, DFU13-$+FR DW BIT2A DB JRNZ, DFU14-$+FR ; MOV A,M CPI 15 ;and check for user 15 DB JRZ, MATCH0-$+FR ;jump if zero ; DFU14: EQU $+OFFSET MOV A,M CPI 14 ;check for user 14 DB JRZ, MATCH0-$+FR ; DFU13: EQU $+OFFSET MOV A,M CPI 13 ;check for user 13 MATCH0: EQU $+OFFSET JZ MATCH ; UNIV1: EQU $+OFFSET MOV A,B ;duplicate instuction overlayed CPI 0DH ; " " " JMP TINUSRCH ;and return where routine left off ; ;********************************************************** ;This is the in-line print subroutine. ; ILPRT: EQU $+OFFSET DB EXX CALL CRLF DB EXX ILPRT2: EQU $+OFFSET XTHL ;SAVE HL, GET MSG ; ILPLP: EQU $+OFFSET MOV C,M ;GET CHAR CALL CONOUT ;OUTPUT IT INX H ;POINT TO NEXT MOV A,M ;TEST ORA A ;..FOR END DB JRNZ, ILPLP-$+BR XTHL ;RESTORE HL, RET ADDR RET ;RET PAST MSG ; ;*********************************************************** ;ROUTINE TO TEST LOG IN ; LOGTST: EQU $+OFFSET LXI H,PASBYTE DW BIT5M RET ; ;********************************************************** ;ROUTINE TO CHECK FOR CARRIER LOST ; CHECK: EQU $+OFFSET CALL CARCK ;SEE IF CARRIER STILL ON RNC ;ALL OK ; ;CARRIER IS LOST LXI SP,STACK JMP HANGUP ; ;********************************************************** ;This routine, which is exercised by the H89 command, sets ;H89 mode to on. Each return to the CCP prompt will set the ;H89 flag to zero and disable the clock interrupt if the ;H89 flag indicates that the mode is on. Invoke H89 games ;by entering: H89 and then when the prompt 'Game: ' appears ;enter the name of the game to run it. ; H89: EQU $+OFFSET LDA MDMBYT ORA A JZ HUH MVI A,0FFH STA H89FLG CALL ARMCLK CALL ILPRT DB 'Game: ',0 JMP GETCMD-3 ; COUNTER: EQU $+OFFSET DW INTCNTR ;INITIAL VALUE ; ;********************************************************** ;Routine to reboot the system. Can be invoked only by local ;terminal and only at highest password level. ; BOOT: EQU $+OFFSET LDA MDMBYT ORA A JZ HUH LHLD PROMLOC-1 MVI L,0 PCHL ; ;********************************************************** ;This is a background memory test that runs whenever the ;current console (including remote) is waiting for an input ;character to be typed. ; ;TEST ROUTINE TO CONSTANTLY TEST MEMORY ; TEST: EQU $+OFFSET DI PUSH H LHLD TSTPT INX H MOV A,H CPI ($+OFFSET)/100H DB JRNZ, TEST1-$+FR LXI H,0 ; TEST1: EQU $+OFFSET SHLD TSTPT MOV A,M CMA MOV M,A CMP M DB JRZ, TEST2-$+FR XRA M PUSH PSW PUSH H CALL CRLF POP H POP PSW PUSH PSW CALL PRTHX CALL ILPRT2 DB 'H Bits bad: ',0 MOV A,H CALL PRTHX MOV A,L CALL PRTHX POP PSW ; TEST2: EQU $+OFFSET CMA MOV M,A POP H EI RET ENDIF ; ;END OF CONSTANT MEMORY TEST ;********************************************************** ; ; USER DEFINED I/O DEVICE DRIVERS ; ;********************************************************** ; UC1ST: EQU $+OFFSET ;USER CONSOLE 1 STATUS UL1ST: EQU $+OFFSET ;USER LIST DEVICE STATUS MVI A,0FFH ;ALWAYS READY RET ; UC1OUT: EQU $+OFFSET ;USER CONSOLE 1 IN (NULL) UP1OUT: EQU $+OFFSET ;USER PUNCH ONE OUT (NULL) UP2OUT: EQU $+OFFSET ;USER PUNCH TWO OUTPUT " UL1OUT: EQU $+OFFSET ;USER LIST OUTPUT (NULL) MOV A,C ;CHARACTER INTO A RET ; UC1IN: EQU $+OFFSET ;USER CONSOLE 1 IN (NULL) UR1IN: EQU $+OFFSET ;USER READER ONE INPUT UR2IN: EQU $+OFFSET ;USER READER TWO INPUT MVI A,EOF ;END OF FILE FOR NOW RET ; USR2END: EQU $+OFFSET ;END OF USER2 CODE FOR NOW INITSIZE EQU INITSIZE ; USR2SIZE EQU USR2END-USER2 ;DO NOT EXCEED SPACE ALLOCAT- ;ED ABOVE YOUR RUNNING CP/M. ;WHEN MAKING A 2KB USER2 AREA, ;THE SPACE OCCUPIED BY INIT- ;SIZE WILL BE AVAILABLE AS ;SCRATCH AREA ABOVE USER2 AND ;REDUCES THE CODE THAT IS ACT- ;UAL USER2 CODE BY THAT AMOUNT. ;GOOD PLACE TO PUT YOUR STACK. ; ;********************************************************** ; EQUATES FOR CCP PATCHES LENCMD EQU 5 ;LENGTH OF CCP CMD STRINGS BUFSIZE EQU CCP+6H ;LOC. OF CMD BUF SIZE BYTE GETUSR EQU CCP+113H ;GET USER # SETUSR EQU CCP+115H ;SET USER # TSTUSR EQU CCP+692H ;TEST USER # USRSAV EQU CCP+118H CCPPASS EQU CCP+7CH ;LOCATION OF CCP PASSWORD UPATCH0 EQU CCP+390H UPATCH1 EQU CCP+393H HUH EQU CCP+209H ;CCP HUH RESPONSE CRLF EQU CCP+98H ;CCP CR/LF FUNCTION RCCPNL EQU CCP+789H ;RSTRT CCP W/O LOG OF DFLT DRV RETCCP EQU CCP+382H ;RE-ENTRY TO CCP GETCMD0 EQU CCP+37BH ;CK IF CMD ENTERED AND GET IT GETCMD EQU CCP+398H ;GET THE ENTERED COMMAND SRCHCMD EQU CCP+3B1H ;ENTRY TO SEARCH OF COMMANDS BUFPTR EQU CCP+88H ;LOC OF CMD BUFFER POINTER CMDPTR EQU CCP+3B5H ;LOC OF CMD ADDR TBL PTR GETRPTR EQU CCP+3AFH ;LOC OF GET TRANS PTR STRPTR EQU CCP+32FH ;POINTER TO CCP CMD STRINGS CMDCNT EQU CCP+335H ;BYTE VALUE = # OF COMMANDS CMDLEN EQU CCP+33BH ;BYTE VALUE = LENGTH OF EACH ;COMMAND STRING. TSTOPN EQU CCP+6DCH ;TEST FILE OPEN FUNCTION CMDDRV EQU CCP+7F0H ;BYTE INDICATES DRV IN CMD CMDERR EQU CCP+76BH ;HUH RESPONSE IF DR # FCBFN EQU CCP+7CEH ;LOC FOR FN IN FCB XTNSN EQU CCP+7D6H ;STORAGE LOC FOR FILE TYPE, ;EXT #, AND RECORD COUNT RELOOK EQU CCP+6CDH ;RELOOK W/INDICATED DRIVE TPASUB EQU CCP+75DH ;LOC TO SUSTITUTE BEFORE ;CALLING THE TPA CONTINUE EQU CCP+75FH ;CONTINUE AFTER CALL TO TPA GETRANS EQU CCP+6A8H ;GET TRANS OR CCP COMMAND ERA EQU CCP+51FH ;ADDR OF ERA ROUTINE REN EQU CCP+610H ;ADDR OF REN ROUTINE SAVE EQU CCP+5ADH ;ADDR OF SAVE ROUTINE DIR EQU CCP+477H ;ADDR OF DIR ROUTINE TYPE EQU CCP+55DH ;ADDR OF TYPE ROUTINE USER EQU CCP+68EH ;ADDR OF USER ROUTINE TPA EQU 100H ;OR YOUR TPA ADDRESS STKPTR1 EQU CCP+35DH STKPTR2 EQU CCP+760H STKPTR3 EQU CCP+383H PRNSTR1 EQU CCP+0A7H ;PRINT STRING WITH LEADING ;CR/LF..POINT TO IT WITH BC PRNSTR2 EQU CCP+0ACH ;PRINT STRING..POINT WITH HL WRFCB EQU CCP+3F8H ;RTNE IN CCP TO WRITE FCB CCPSPARE EQU CCP+7F2H ;14 SPARE BYTES AT END CCP BDOSPARE EQU BDOS+0DEEH ;18 SPARE BYTES AT END BDOS ;Addresses of holes left in CCP that are filled in ;with patches. HOLE1 EQU CCP+310H ;30 BYTES HOLE2 EQU CCP+3C1H ;24 BYTES HOLE3 EQU CCP+79BH ;16 BYTES HOLE4 EQU CCP+1F5H ;20 BYTES HOLE5 EQU CCP+6A5H ;3 BYTES ; IF (S201 OR S22 OR S22X) ;********************************************************** ; CCP patches ;********************************************************** ;Patch the turnkey start string into the CCP command buffer. ORG COMBUF TNKY: DB 08,'OFF HELP',0 ; ORG GETRPTR DW GETRANS ;********************************************************** ;These two patches allow changing the user area on the ;command line after X: where X is drive letter. ; ORG CCP+6C2H DW USER ORG CCP+69DH DW RCCPNL ; ;********************************************************** ;To trap the HUH message. ; ORG HUH JMP HUH0 ; ;********************************************************** ;To redirect the CCP stack so a larger stack is available. ; ORG STKPTR1 DW STACK ORG STKPTR2 DW STACK ORG STKPTR3 DW STACK ; ;********************************************************** ; This patch is used to restrict access to the higher user ; areas while leaving the lower user areas public. The high- ; est available public user area is defined by MAXUSER. ; ORG USRSAV DW SAVUSR ; ORG HOLE2 SAVUSR: MOV A,E CPI 0FFH JZ BDOSFNC RLC RLC RLC RLC MOV B,A LDA DRIVE ANI 0FH ORA B STA DRIVE JMP BDOSFNC ; DB 0 ;SPARE ;DO NOT EXPAND ;24 BYTES AVAILABLE AT HOLE2 ; ORG HOLE3 OK2: LXI H,PASBYTE DW RES2M ; OK1: LXI H,PASBYTE DW RES5M JMP OK ; TRAPBYT: DB 0 DB 0,0 ;SPARES ;DO NOT EXPAND ;16 BYTES AT HOLE3 ; ;********************************************************** ; This patch causes user number to be reported at the cp/m ; prompt.....i.e. - A2>. User 0 report is suppressed. ; ORG UPATCH0 MVI C,USRFNC ORG UPATCH1 DW UPATCH ;the routine UPATCH is located in the USER1 area ;********************************************************** ; This patch causes the CCP of a cp/m 2.x system to look on ; drive A when you are logged into a drive other than A and ; call for a .COM file that does not exist on that drive. ; Giving an explicit drive reference overrides this feature, ; so that you can always force the file to be loaded from a ; specific drive. ; ORG TSTOPN DW APATCH ;REPLACES 'CMDERR' ; ORG CCPSPARE APATCH: LXI H,CMDDRV ;GET DRIVE FROM CURRENT CMD. ORA M ;FETCHES DRIVE JNZ CMDERR ;GIVE ERR IF CMD HAS DRIVE # INR M ;FORCE TO DRIVE A LXI D,XTNSN ;UNDO WHEN... JMP RELOOK ;REENTERING CCP ; ;********************************************************** ;This patch extends the CCP to include up to N additional ;commands that are user defined. The commands may be either ;CCP-included or transient, and may be either private or ;public depending on password privilege. ; ORG CMDPTR CMDPTR: DW CMDTBL0 ; ORG STRPTR STRPTR: DW CMDSTR0 ; ORG CMDCNT CMDCNT: DB (GETRAN0-CMDTBL0)/2 ;TO LIMIT PUBLIC ACCESS TO CCP ;COMMANDS. RESET TO ALL WHEN ;PASSWORD IS ENTERED FOR USER ;AREAS ABOVE MAXUSER. ORG CMDLEN CMDLEN: DB LENCMD ;LENGTH OF CCP COMMAND STRINGS ; ;The rest of this patch is in USER1 and 2 code areas. ; ;********************************************************** ; ORG HOLE1 RELOG0: CALL CRLF RELOG: CALL LOGTST DB JRZ, EXIT-$-1 CALL ILPRT2 DB 'Login please',0 EXIT: JMP RETCCP ; DB 0,0,0 ;SPARES ;DO NOT EXPAND ;30 BYTES AVAILABLE AT HOLE1 ; ;********************************************************** ; BDOSPARE EQU BDOS+0DEEH ;18 SPARE BYTES AT END BDOS MATCH EQU BDOS+077CH CURDSK EQU BDOS+342H TINUSRCH EQU BDOS+761H ; ORG BDOS+75EH JMP UNIV ; ORG BDOSPARE ;These routines are part of the 'BYE' command stuffed here ;for convenience. ; PASTBL1: DW OK1 DW CKAGIN PASTBL2: DW OK2 DW CKAGIN DB 0 ;SPARE ; ;SET THE MODEM BYTE TO CAUSE SCAN OF MODEM AND CONSOLE SETMDM: XRA A DB JR, MDMRST-$-1 ; ;RESET THE MODEM BYTE SO ONLY CONSOLE IS LOOKED AT RSTMDM: MVI A,0FFH MDMRST: STA MDMBYT RET ;18 bytes here ; ORG HOLE5 DB 0,0,0 ;SPARES -- 3 BYTES AVAIL AT HOLE5 ENDIF ; ;********************************************************** ;BIOS patches. This jump table overlays the table at the ;base of the BIOS thus making it unecessary to have all of ;the jumps in the jump table at the base of the USER1 area. ; ORG BIOS+06H JMP CONST JMP CONIN DS 3 JMP LIST JMP PUNCH JMP READER ; ORG BIOS+2DH JMP LISTST ; IF NOT S201 ORG BIOS+36H ENDIF IF SCRCLR AND NOT S201 DB ESC,SCRN ;SEQUENCE TO CLEAR SCREEN ENDIF ; IF (S22 OR S22X) SIGNON: DB CR,LF,'RLP RCPM McLean, Va. ',CR,LF ; ^ ^ DO NOT EXPAND ENDIF IF S22X DB 'CP/M 2.2x ' ; ^ ^ " ENDIF IF S22 DB 'CP/M 2.2 ' ; ^ ^ " ENDIF IF (S22 OR S22X) DB MSIZE/10+30H DB MSIZE MOD 10 + 30H DB 'K system',CR,LF,0,'$' ; ^ ^ " ENDIF ; IF S201 ORG BIOS+36H ENDIF ; TSTPT: DW 0 ; IF S201 ORG BIOS+0D8H DW BDOS+0DB6H ENDIF ORG BDOS+0DB6H IF S201 AND SCRCLR DB ESC,SCRN ENDIF ; IF S201 SIGNON: DB CR,LF,'RLP RCPM McLean, Va. ',CR,LF ; ^ ^ ;DO NOT EXPAND DB 'CP/M 2.01 ' ; ^ ^ ;DO NOT EXPAND DB MSIZE/10+30H DB MSIZE MOD 10 + 30H DB 'K system',CR,LF,0,'$' ; ^ ^ ;DO NOT EXPAND ENDIF ; ;************************************************************ ; ; SPECIAL ASCII CODES ; LF EQU 0AH ; LINE FEED CR EQU 0DH ; CARRIAGE RETURN EOF EQU 1AH ; END OF FILE BELL EQU 07H ; DING NULL EQU 00H ; NOTHING ESC EQU 1BH ; ESCAPE - USED IN TWO CHAR COMMANDS ;the following are specific to an H19 terminal.-put yours here LIN EQU 6CH ; CHAR AFTER ESCAPE TO CLEAR LINE SCRN EQU 45H ; CHAR AFTER ESCAPE TO CLEAR SCREEN EXGRAPH EQU 47H ; CHAR AFTER ESCAPE TO EXIT GRAPHICS UPCRSR EQU 41H ; CHAR AFTER ESCAPE TO DO UP-CURSOR ; ; STATUS MASKS ; INRDY EQU 02H ;INPUT READY MASK OUTRDY EQU 01H ;OUTPUT READY MASK ; ; POSITION OF BIT PAIR IN IOBYTE ; CONCNT EQU 1 ;CONSOLE BITS 0,1 RDRCNT EQU 2 ;READER BITS 2,3 PCHCNT EQU 3 ;PUNCH BITS 4,5 LSTCNT EQU 4 ;LIST BITS 6,7 ; ;********************************************************** ; ; Z80 EQUATES ; JR EQU 18H ;JUMP RELATIVE JRZ EQU 28H ;JUMP RELATIVE ON ZERO JRNZ EQU 20H ;JUMP RELATIVE ON NOT ZERO JRC EQU 38H ;JUMP RELATIVE ON CARRY JRNC EQU 30H ;JUMP RELATIVE IF CARRY RESET DJNZ EQU 10H ;DECR B AND JMP REL IF B NOT=0 LDIY EQU 21FDH ;LD 16 BIT VAL TO IY REG CPIY EQU 0BEFDH ;CMP MEM WITH LOC IN IY+DISPL INCIY EQU 23FDH ;INCREMENT IY LDIR EQU 0B0EDH ;MEMORY BLOCK MOVE LDDR EQU 0B8EDH ;MOVE BLOCK UNTIL COUNTER=0 MOVIVA EQU 47EDH ;MOVE ACC TO INTERRUPT REGISTER IM2 EQU 5EEDH ;SET INTERRUPT MODE 2 BIT0A EQU 47CBH ;TEST BIT 0 IN ACC. BIT2A EQU 57CBH ;TEST BIT 2 IN ACC BIT3A EQU 5FCBH ;TEST BIT 3 IN ACC. BIT4A EQU 67CBH ;TEST BIT 4 IN ACC. BIT5A EQU 6FCBH ;TEST BIT 5 IN ACC. BIT0M EQU 46CBH ;TEST BIT 0 IN MEM BIT1M EQU 4ECBH ;TEST BIT 1 IN MEM BIT2M EQU 56CBH ;TEST BIT 2 IN MEM BIT5M EQU 6ECBH ;TEST BIT 5 IN MEM SET0M EQU 0C6CBH ;SET BIT 0 IN MEM SET1M EQU 0CECBH ;SET BIT 1 IN MEM SET2M EQU 0D6CBH ;SET BIT 2 IN MEM SET4M EQU 0E6CBH ;SET BIT 4 IN MEM SET5M EQU 0EECBH ;SET BIT 5 IN MEM SET7A EQU 0FFCBH ;SET BIT 7 IN MEM RES0M EQU 86CBH ;RESET BIT 0 IN MEM RES1M EQU 8ECBH ;RESET BIT 1 IN MEM RES2M EQU 96CBH ;RESET BIT 2 IN MEM RES5M EQU 0AECBH ;RESET BIT 5 IN MEM MOVDM EQU 53EDH ;MOVE BC TO MEM, DIRECT ADDR EXX EQU 0D9H ;EXCH REG PAIRS B, D, & H EXAF EQU 08H ;EXCH AF PAIRS ; ;********************************************************** ; ; PMMI MODEM PORT ASSIGNMENTS ; TPORT EQU MODEM ;UART CONTROL/STATUS PORT DPORT EQU TPORT+1 ;DATA PORT RPORT EQU TPORT+2 ;RATE GEN/MODEM STATUS CPORT EQU TPORT+3 ;MODEM CONTROL PORT ; ;********************************************************** ; ; MODEM CONTROL COMMAND WORDS P3CLEAR EQU 3FH ;IDLE MODE OFFPWR EQU 80H ;TO TURN POWER OFF THRU PMMI ;AUXILIARY INTERFACE ; ; SET FOLLOWING TO 5FH FOR >300 BAUD ; P3TODTR EQU 7FH ;TURN ON DTR ; ;********************************************************** ; ; SWITCH HOOK AND MODEM COMMANDS..OUT TO TPORT ; P0BYE EQU 0 ;ON HOOK, OR DIALING BREAK P0ORIG EQU 1 ;OFF HOOK, ORIG P0ANSW EQU 2 ;ANSWER PHONE P08BIT EQU 0CH ;8 DATA BITS P0NOPY EQU 10H ;NO PARITY P0EPS EQU 20H ;EVEN PARITY SELECT P0TSB EQU 40H ;2 STOP BITS P0EI EQU 80H ;ENABLE INTERRUPTS P0NORM EQU P08BIT+P0NOPY ;8 BITS, NO PARITY P0110 EQU P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS ; ;********************************************************** ; ; MODEM STATUS, INPUT ON RPORT ; P2DTD EQU 1 ;DIAL TONE DETECT P2RDET EQU 2 ;RING DETECT P2CTS EQU 4 ;CTS (CARRIER DETECT) P2RXBRK EQU 8 ;RECEIVE BREAK P2CONN EQU 10H ;CONNECTED? (0=YES) ;1=MODEM HUNG UP THE PHONE LINE P2TMPUL EQU 80H ;TIMER PULSES (40% UP CYCLE) ; ;********************************************************** ; ; PMMI MODEM STATUS MASKS ; P0TBMT EQU 1 ;XMIT BUFFER EMPTY P0DAV EQU 2 ;DATA AVAILABLE P0TEOC EQU 4 ;TEST END OF CHAR. P0RPE EQU 8 ;REC'D PARITY ERROR P0ORUN EQU 10H ;OVERRUN P0FERR EQU 20H ;FRAMING ERROR TRATE EQU 250 ;VALUE FOR .1 SEC ; B300 EQU 52 ;DIVISOR FOR 300 BAUD B110 EQU 142 ; " 110 B220 EQU 71 ; " 220 B450 EQU 35 ; " 450 B520 EQU 30 ; " 520 B600 EQU 26 ; " 600 B710 EQU 22 ; " 710 ; ; ;BDOS EQUATES ; BDOSFNC EQU BDOS+6H USRFNC EQU 32 ; END