home *** CD-ROM | disk | FTP | other *** search
- ;**********************************************************
- ; *
- ; 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