home *** CD-ROM | disk | FTP | other *** search
-
- ;**********************************************************
- ; *
- ; GENUSR VERSION 4.8 *
- ; 12/31/82 *
- ; R. L. Plouffe *
- ; *
- MSIZE EQU 61 ;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 will work only with North Star CP/M 2.2 *
- ; version 1.1.0 QD. Use the GENSYS vers. 4.1 utility *
- ; to sysgen your system to contain the USER2 code shown *
- ; below (or your own stuff). The additional code will *
- ; be resident on the first four sectors of track 0 on *
- ; the North Star disk. enjoy! *
- ; *
- ; This version can be assembled with ASM.COM *
- ; *
- ; Version 4.8 Fixed ANSWR and BAUD commands. Also *
- ; changed date to 1983 in clock routine. rlp *
- ; *
- ; Version 4.7 Changed location of F35 and F40 labels *
- ; that are used with the alternate format routines so *
- ; that North Star Hard Disk will operate properly. *
- ; Must now user NEWCPY and NEWFMT (copier and formatter) *
- ; that signs on and says 'as of Dec 2, 1982' or later. *
- ; *
- ; Version 4.6 Added MSPEED equate and relocated MDMBYT *
- ; to 0 page for use with XMODEM56. Added SPDSEL bytes *
- ; to the speed synchronization routine for storage at *
- ; MSPEED. Added BAUD command. rlp *
- ; *
- ; Version 4.5 Corrected alternate Quad format routine. *
- ; Must use my FORMAT and COPY routines as of October *
- ; 31, 1982 or later. *
- ; *
- ; Version 4.1 includes full disk error recovery *
- ; and error messages. *
- ; *
- ***********************************************************
- ;
- ; SYSTEM EQUATES
- ;
- FALSE EQU 0
- TRUE EQU NOT FALSE ;SEE OPTIONS BLOCK
- ;TO SELECT ALL OPTIONS
- ;
- BIOS EQU (MSIZE*1024)-0D00H ;BASE OF BIOS
- CCP EQU BIOS-1600H ;BASE OF CCP
- USER1 EQU BIOS+0700H ;BASE OF THIS MODULE
- UNUSED EQU 3DH ;ORIGINAL UNUSED BUFFER
- BUFEXP EQU 80H-UNUSED ;EXPANSION OF BUFFER
- USER2 EQU (MSIZE*1024)+BUFEXP ;BASE 2ND USER AREA
- OVERLAY EQU 2B00H-BIOS ;COMPUTED OVERLAY
- BDOS EQU CCP+800H ;BASE OF BDOS
- CMDS EQU BIOS+0CBFH
- ;
- COMBUF EQU CCP+7H ;LOC OF CMD BUFFER
- BUF EQU USER1+200H
- ;
- MDMBYT EQU 0050H ;MODEM BYTE ADDRESS
- ;..0FFH=OFF
- MSPEED EQU 0051H ;MODEM SPEED BYTE LOC.
- IOBYTE EQU 0003H ;I/O BYTE ADDRESS
- 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 10100100B ;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
- ;
- HARDSK EQU FALSE ;NORTH STAR HARD DISK?
- ;
- PARTYLN EQU FALSE ;WANT PARTY LINE OPERATION?
- ;
- BGTST EQU TRUE ;WANT BACKGROUND MEMORY TEST
- ;
- RUNHELP EQU TRUE ;WANT TO RUN HELP.COM WHEN PHONE
- ;IS ANSWERED BY 'BYE'?
- PARITY EQU TRUE ;PARITY MEMORY?
- ;
- 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
- ;
- MAXDRV EQU 4 ;MAX # OF DRIVES ON LINE
- ;
- ORG USER1-0AH
- NDRV DB 00001110B ; 0 = A
- ; ds 1 ;temporarily
- ; 1 = B
- ; 2 = C
- ; 4 = D
- HDPAGE DB 0H ;non-zero cause auto hard boot
- ;
- CONFG: DB 11111111B ;SAME AS IN NORTH STAR DOS
- ; ds 1 ;temporarily
- ;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 BIOS+6EDH
- RET
- DW WINIT
- ;
- ORG USER1-1H
- ;
- MODE: DB 01010001B ;MODE BYTE
- ;; ; ;;........;COLD BOOT AUTO FUNCTION
- ;; ; ;.........;WARM BOOT AUTO FUNCTION
- ;; ; ;
- ;; ;............;ENABLE INTERRUPTS AFTER
- ;; ;DISK ACCESS
- ;;..............;SET READ AFTER WRITE
- ;...............;BIT 7=1 INDICATES 1 DRIVE
- ;
- ;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
- ;
- ;**********************************************************
- ORG USER1
- ;
- ;***********************************************************
- ;
- ; IOBYTE PROCESSOR
- ; INCLUDING SCANNER OF MODEM & CONSOLE
- ;
- ;***********************************************************
- ;
- 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:
- IF BGTST
- CALL TEST ;BACKGROUND MEMORY TEST
- ENDIF
- 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
- ;
- 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
- ;
- READER0:
- IF BGTST
- CALL TEST ;BACKGROUND MEM TEST
- ENDIF
- 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
- ;
- CRTIN: IN SER1D ;GET DATA
- STRPRET: ANI 7FH ;STRIP PARITY
- RET
-
- 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
- DB JR, STRPRET-$-1 AND 0FFH
- ;
- 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
- ;
- ;**********************************************************
- ;
- SIGNON:
- DB CR,LF
- INITIAL:
- 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
- DCR A
- DB JR, SKIPHRLD-$-1
- ;
- ;**********************************************************
- ;This is a continuation of the signon message. The first part
- ;of the message is placed from INITIAL to here by the cold
- ;boot loader and overwrites the INITIAL code since it is no
- ;longer needed. Also, the CCP stack is redirected to start
- ;from the end of this INITIAL code, thus eating the code from
- ;the end up.
- ;
- ;next DB must be at INITIAL + 21 bytes
- DB 'RLP RCPM McLean, Virginia. ',CR,LF,0
- ; ^ ^
- ; | |
- ; '****DO NOT LENGTHEN*****' except as instructed:
- ;
- ;If you lengthen this message, make sure that the code in
- ;USER1 does not exceed USER1+1FFH. If so, then move some
- ;routines to USER2.
- ;
- ;**********************************************************
- ;
- SKIPHRLD:
- STA MDMBYT
- ;
- MVI A,40H ;DISABLE PARITY LOGIC
- OUT MEMORY ;BEFORE READING RAM
- ;
- LHLD BIOS+1
- MOV D,H
- MOV E,L
- LXI B,-1023 ;NUMBER OF BYTES TO CLEAR
- DW LDDR ;SET PARITY ON ALL RAM
- INR A ;PARITY ENABLE CODE
- OUT MEMORY ;REARM PARITY LOGIC
- ;
- LXI H,MODE ;POINT TO MODE BYTE
- JMP TINUINIT
- ;
- STACK EQU $ ;THE CCP STACK EATS UP
- ;TO 24 BYTES OF PREVIOUS
- ;CODE, NO LONGER NEEDED
- ;
- ;**********************************************************
- ;Routine performs disk error recovery and sets up the call-
- ;ing routine in the Bios to print the correct error message.
- ;The routine is called by patching the bios at BIOS+6EAH to
- ;jump to here. Bios contained a RET and two NOP's at that
- ;location for this kind of purpose.
- ;
- DSKERR:
- DB JRNZ, DSKERR1-$-1
- LDA BOOTCNT
- MOV B,A
- DCR B
- MOV A,B
- STA BOOTCNT
- JZ STOPIT
- JMP 0000H ;else do a warm boot.
- ;
- DSKERR1:
- ANI 07H
- LXI H,MSGTBL-2 ;point to message table
- MOV B,A
- FNDMSG: INX H
- INX H
- DCR B
- DB JRNZ, FNDMSG-$-1 AND 0FFH
- MOV E,M
- INX H
- MOV D,M
- PUSH D
- ANI 02H ;mask to see if type
- ORA A ;...1,4 or 5 error
- DB JRNZ, TELHIM-$-1 ;skip if not
- LDA DRIVE ;set drive byte to
- ANI 0F0H ;...return to A on a
- STA DRIVE ;...warm boot without
- ;...change of user area.
- TELHIM: LDA DRVCODE ;get drive number
- ADI 40H ;convert to alpha
- STA ERRDRV ;put into msg
- LXI H,TRKCODE
- LXI D,ERRTRK
- LXI B,3
- DW LDIR
- LDA SECCODE
- STA ERRSEC
- LXI H,SAYERR
- CALL BIOS+6B8H ;print the message
- POP H
- MVI A,0FFH
- RET
- ;
- SAYERR: DB CR,LF,'Error on drive '
- ERRDRV: DB ' , track '
- ERRTRK: DB ' , sector '
- ERRSEC: DB 0,'.',80H
- ;
- ;**********************************************************
- ;ROUTINE TO SET UP THE MODEM UART PARAMETERS.
- ;
- SETUP: MOV A,M
- CPI 76H
- DB JRNZ, SETURT-$-1
- LXI H,UART
- SETURT: LXI D,SPDSEL
- LXI B,6
- DW LDIR
- RET
- ;
- ;**********************************************************
- ;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
- ;
- ;***********************************************************
- ;ROUTINE TO TEST LOG IN
- ;
- LOGTST: LXI H,PASBYTE
- DW BIT5M
- RET
- ;
- USR1END: EQU $ ;END OF USER1 CODE FOR NOW
- USR1SIZE EQU USR1END-USER1 ;MUST NOT EXCEED SPACE
- ;ALLOCATED IN USER1
- ;
- ;**********************************************************
- ;
- ;
- ;**********************************************************
- ; USER2 code starts here. Will be relocated to just above
- ; CP/M by the BIOS
- ;
- ORG USER2
- ;**********************************************************
- ; 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:
- IF PARITY
- CALL ILPRT
- DB CR,LF,'Ram parity error',0
- JMP HANGUP
- ;
- ENDIF
- ;**********************************************************
- ;This org must be at 5CH in this page to hold the format
- ;byte at this location.
- ;
- ORG USER2-BUFEXP+5CH
- DS 1 ;for the format byte
- ;
- ;**********************************************************
- ;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:
- 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-$-1
- LHLD 000BH
- INX H
- SHLD 000BH
- NOTH89:
- CALL RSTCLK
- POP PSW
- DB JRNZ, DUN-$-1
- LXI H,INTCNTR
- SHLD COUNTER
- LDA H89FLG
- ORA A
- DB JRNZ, DUN-$-1
- CALL CHECK
- DUN:
- POP H
- POP PSW
- RET
- ;
- ARMCLK:
- DI
- LXI H,INTCNTR
- SHLD COUNTER
- MVI A,0C0H ;ARM CLOCK INTERRUPT
- OUT MOTHER
- ;
- RSTCLK:
- MVI A,50H
- OUT MOTHER
- EI
- RET
- ;
- ;**********************************************************
- ;LOSS OF CONNECTION TEST
- ;
- CARCK:
- ;
- ;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-$-1 AND 0FFH
- ;
- ;**********************************************************
- ;ROUTINE TO CHECK FOR CARRIER LOST
- ;
- CHECK:
- 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:
- LDA MDMBYT
- ORA A
- JZ HUH
- MVI A,0FFH
- STA H89FLG
- CALL ARMCLK
- CALL ILPRT
- DB 'Game: ',0
- JMP GETCMD-3
- ;
- ;**********************************************************
- ;This is the in-line print subroutine.
- ;
- ILPRT:
- DB EXX
- CALL CRLF
- DB EXX
- ILPRT2:
- XTHL ;SAVE HL, GET MSG
- ;
- ILPLP:
- 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-$-1 AND 0FFH
- XTHL ;RESTORE HL, RET ADDR
- RET ;RET PAST MSG
- ;
- ;**********************************************************
- ;Routine to reboot the system. Can be invoked only by local
- ;terminal and only at highest password level.
- ;
- BOOT:
- LDA MDMBYT
- ORA A
- JZ HUH
- JMP BOOT0 ;do a cold boot
- ;
- ;**********************************************************
- ;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:
- DS USER2+00EFH-BUFEXP-$
- ;
- ;**************************************
- ; *****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: ;THIS ADDRESS MUST BE AT
- ;0EFH IN SAME PAGE AS PERR
- DW PERR
- ;
- ;Routine to check carrier
- ;
- CKCTS:
- IN RPORT ;LOOK AT STATUS
- ANI P2CTS ;GET CARRIER DETECT BIT
- RET
- ;
- PASBYTE: DB 0
- ;
- TABLE1: ;THIS ADDRESS MUST BE AT
- ;0F7H IN THIS PAGE
- DW DISCONN ;ADDR OF ROUTINE TO HANGUP
- ; THE LINE
- ;
- ;**********************************************************
- ;
- ;Computime T-102 clock routine
- ;
- IF CLOCK
- TIME: ;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-$-1
- MVI A,20H ;SUPPRESS WITH A BLANK
- NOBLNK:
- 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: ;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: ;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-$-1
- INX H ;IF SO GO INCREMENT POINTER
- SKIP1:
- CPI 3AH ;IS IT : ?
- DB JRNZ, SKIP2-$-1 ;ADVANCE POINTER TO SKIP
- INX H
- SKIP2:
- 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
- ;
- DTMSG: ;DATE/TIME STORAGE LOCATION
- DB 'Time '
- HHMM:
- DB 'HH:MM:'
- SECX10:
- DB 'S'
- SECX1:
- DB 'S'
- ;
- DATE:
- DB ' Date '
- MMDD:
- DB 'MM/DD/'
- YY:
- DB '1983'
- DB 0,'$'
- ;
- NOCLOCK:
- DB 'No clock',0,'$'
- ENDIF
- ;
- ***********************************************************
- ;DELAY ROUTINES
- ;
- ; .1 SEC DELAY
- ANSDLY:
- PUSH B
- ;
- IF FASTCLK
- LXI B,16667 ;4 MHZ
- ENDIF
- ;
- IF NOT FASTCLK
- LXI B,8334 ;2 MHZ
- ENDIF
- ;
- DB JR, DELAY1-$-1
- ;
- ; 2 MSEC DELAY
- CLKDLY:
- PUSH B
- ;
- IF FASTCLK
- LXI B,333
- ENDIF
- ;
- IF NOT FASTCLK
- LXI B,167
- ENDIF
- ;
- DELAY1:
- DCX B
- MOV A,B
- ORA C
- DB JRNZ, DELAY1-$-1 AND 0FFH
- POP B
- RET
- ;
- ;**********************************************************
- ;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:
- LXI H,PASBYTE
- DW BIT7M
- DB JRNZ, OFF-$-1
- CALL PRNTIM
- CALL ILPRT ;PRINT THIS MSG:
- DB 'Goodbye, call again',CR,LF,0
- ;
- HANGUP:
- ;
- ;SET BIT 7, PMMI AUX INTERFACE, CAUSING POWER TO GO OFF
- ;(has no effect if aux interface is not implemented)
- CALL RSTCNTR ;reset controller (stops motors)
- MVI A,OFFPWR
- OUT CPORT
- ;
- OFF:
- 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
- MVI A,0C3H
- STA BIOS+6EDH
- CALL RSTPRMS
- CALL RSTCNTR
- ;
- ;AWAIT RINGING
- RINGWT:
- ;
- ;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-$-1 AND 0FFH ;NO, WAIT
- ;
- IF PARTYLN
- CALL DARMCLK
- ;NOW WAIT UNTIL RING IS FINISHED
- ENDRING:
- CALL ANSDLY ;.1 SEC DELAY FOR DEBOUNCE
- IN RPORT ;GET STATUS
- ANI P2RDET ;STILL RINGING?
- DB JRZ, ENDRING-$-1 AND 0FFH ;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:
- CALL ANSDLY ;WAIT .1 SECONDS
- DCR L ;MORE TO GO?
- DB JRNZ, WAITNX-$-1 AND 0FFH ;YES?...LOOP
- IN RPORT ;GET THE STATUS
- ANI P2RDET ;RINGING AGAIN?
- DB JRNZ, EXPECT-$-1 ;NO?...ITS FOR ME
- ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET
- WAITNR:
- MVI L,100 ;WAIT FOR 10 SECS NO RINGING
- WAITNRL:
- CALL ANSDLY ;DELAY .1 SECONDS
- IN RPORT ;GET THE STATUS
- ANI P2RDET ;STILL RINGING?
- DB JRZ, WAITNR-$-1 AND 0FFH ;YES, WAIT 10 MORE SECONDS
- DCR L ;NO RING, MAYBE WE'RE DONE
- DB JRNZ, WAITNRL-$-1 AND 0FFH ;NO, LOOP SOME MORE
- DB JR, HANGUP-$-1 AND 0FFH
- ;
- EXPECT:
- LXI H,400 ;40 SECONDS TO REDIAL
- LOOKAGN:
- IN RPORT
- ANI P2RDET ;RINGING AGAIN?
- DB JRZ, ANSWER-$-1
- CALL ANSDLY
- DCX H
- MOV A,H
- ORA L
- DB JRNZ, LOOKAGN-$-1 AND 0FFH
- JMP HANGUP
- ENDIF
- ;
- DB JR, ANSWER-$-1
- ;
- DARMCLK:
- MVI A,40H ;DISARM CLOCK INTERRUPT
- OUT MOTHER
- RET
- ;
- BAUD:
- CALL ILPRT
- DB 'Change your speed (110,300,450,600,710) and '
- DB 'send C/R''s to synch.',CR,LF,0
- ;
- ;SETUP MODEM
- ANSWR: ;IMMEDIATE ANSWER TONE
- LXI H,PASBYTE ;POINT TO PASSWORD BYTE
- DW RES5M ;NO 1RST PASSWORD REQUIRED
- ;
- ANSWER:
- MVI A,0C3H
- STA 55H
- LXI H,CONOUT0
- SHLD 56H
- CALL ARMCLK
- LXI H,UART
- CALL SETMDM ;SET MODEM BYTE
- SYNCH:
- LDA SPDSEL ;GET SPEED INDICATOR
- STA MSPEED ;STORE HERE FOR APPLICATIONS
- 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-$-1
- CPI LF ;LINE FEED?
- DB JRZ, WELCOME-$-1
- CPI 'C'-40H ;IF A CONTROL-C
- DB JRZ, WELCOME-$-1 ;YES, EXIT
- CALL SETUP
- DB JR, SYNCH-$-1 AND 0FFH ;TEST MORE - INVALID BAUD RATE
- ;
- UART:
- DB 1,B300,P3TODTR,P0NOPY+P08BIT,'30'
- DB 2,B450,P3TODTR-20H,P0NOPY+P08BIT,'45'
- DB 0,B110,P3TODTR,P0NOPY+P08BIT+P0TSB,'11'
- DB 3,B600,P3TODTR-20H,P0NOPY+P08BIT,'60'
- DB 4,B710,P3TODTR-20H,P0NOPY+P08BIT,'71'
- DB 76H
- SPDSEL:
- DB 3 ;SPEED SELECT BYTE (FOR XMODEM56)
- BAUDRT:
- DB B600
- DTR:
- DB P3TODTR-20H
- UARTWD:
- DB P0NOPY+P08BIT
- RATE:
- DB '600 baud',0
- ;
- WELCOME:
- LXI B,RATE
- CALL PRNSTR1 ;SHOW THE BAUD RATE
- CALL PRNTIM
- LXI H,SIGNON
- CALL PRNSTR2 ;SHOW SIGN-ON STRING
- ;
- 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:
- LXI H,TRAPBYT
- DW SET0M ;SET DIR TRAP
- JMP GETRANS
- ;
- TYPE1:
- LXI H,TRAPBYT
- DW SET1M
- JMP GETRANS
- ;
- HUH0:
- 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, ',0
- CALL LOGTST
- JNZ RELOG
- JMP HUH+3
- ;
- ;**********************************************************
- ;Routine for ORIG(inate) command.
- ;
- ORIG:
- LDA MDMBYT
- ORA A
- JZ HUH
- CALL WRFCB
- ORIG1:
- LXI H,UART
- ROTATE:
- CALL SETUP
- JZ HUH
- PUSH H
- LXI H,BAUDRT+3
- LDA FCBFN
- CPI 20H
- DB JRNZ, COMPR-$-1
- MVI A,'3' ;DEFAULT TO 300 BAUD
- COMPR:
- CMP M
- POP H
- DB JRNZ, ROTATE-$-1 AND 0FFH
- MVI A,P3CLEAR
- OUT CPORT
- LXI B,RATE
- CALL PRNSTR1
- MVI A,P0ORIG
- OUT TPORT
- LDA DTR
- OUT CPORT
- WTCTS:
- CALL REQEXIT
- CPI 'E'-40H
- JZ CCPRET
- CALL CKCTS
- DB JRNZ, WTCTS-$-1 AND 0FFH
- LDA BAUDRT
- OUT RPORT
- LDA UARTWD
- OUT TPORT
- COMLOOP:
- IN TPORT
- ANI P0DAV
- DB JRZ, NOMDAT-$-1
- IN DPORT
- ANI 7FH
- MOV C,A
- CALL CONOUT
- NOMDAT:
- CALL CONST
- ORA A
- DB JRZ, COMLOOP-$-1 AND 0FFH
- CALL CONIN
- OUT DPORT
- CPI 'D'-40H
- JZ CCPRET
- CPI 'E'-40H
- JZ RETCCP
- DB JR, COMLOOP-$-1 AND 0FFH
- ;
- ;**********************************************************
- ;This is the command string which is divided into private
- ;and public sections. Do not use more than six letters for
- ;the name of any command/transient and fill out each string
- ;to exactly six characters by using spaces below. Strings
- ;must occur at 6 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 6 to 4. I use 6 below so that LOGOFF etc. can fit.
- ;
- CMDSTR2:
- DB 'ERA ERASE REN RENAMESAVE H89 '
- DB 'H19 GAME LOCK BOOT '
- CMDSTR1:
- DB 'TYPE PRINT USER PASS DIR CAT '
- DB 'ANSWR ANSWERBAUD ORIG '
- CMDSTR0:
- DB 'DIR CAT LOGIN LOGON OFF BYE '
- DB 'EXIT QUIT LOGOFFLOGOUTBYEBYEDONE '
- DB 'OUT CUL SOLONG'
- ;
- ;**********************************************************
- ;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:
- DW ERA ;ERA....PRIVATE COMMANDS
- DW ERA ;ERASE
- DW REN ;REN
- DW REN ;RENAME
- DW SAVE ;SAVE
- DW H89 ;SET H89 MODE (temporarily)
- DW H89 ;H19
- DW H89 ;GAME
- DW LOCK ;SET 2ND PASSWORD TO REQUIRED
- DW BOOT ;RE- BOOT THE SYSTEM
- CMDTBL1:
- DW TYPE1 ;TYPE..In case MLIST.COM renamed
- ;to 'TYPE.COM'. Put the transient
- ;in USER 14 on drive A.
- DW TYPE1 ;PRINT
- 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 DIR1 ;CAT
- DW ANSWR ;ANSWR routine
- DW ANSWR ;ANSWER
- DW BAUD ;BAUD rate (send C/R's to synch)
- DW ORIG ;ORIGinate routine
- ;These commands will be the only ones allowed until the user
- ;logs in to the system with LOGIN.
- CMDTBL0:
- DW DIR ;WILL RUN THE CCP 'DIR' CODE
- DW DIR ;CAT
- DW PASSINT ;LOGIN
- DW PASSINT ;LOGON
- DW BYE ;OFF
- DW BYE ;BYE
- DW BYE ;EXIT
- DW BYE ;QUIT
- DW BYE ;LOGOFF
- DW BYE ;LOGOUT
- DW BYE ;BYEBYE
- DW BYE ;DONE
- DW BYE ;OUT
- DW BYE ;CUL
- DW BYE ;SOLONG
- GETRAN0: ;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:
- MVI A,LENCMD
- STA CMDLEN
- LXI H,PASBYTE
- DW BIT5M
- DB JRNZ, RST0-$-1
- DW BIT2M
- DB JRNZ, RST1-$-1
- ;
- RST2:
- LXI H,CMDSTR2
- SHLD STRPTR
- MVI A,(GETRAN0-CMDTBL2)/2
- STA CMDCNT
- LXI H,CMDTBL2
- SHLD CMDPTR
- MVI A,16
- STA TSTUSR
- RET
- ;
- RST1:
- 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:
- MVI A,(GETRAN0-CMDTBL0)/2
- STA CMDCNT
- LXI H,CMDSTR0
- SHLD STRPTR
- LXI H,CMDTBL0
- SHLD CMDPTR
- MVI A,1
- STA TSTUSR
- RET
- ;
- ;**********************************************************
- ;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.
- ;
- 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
- CALL RSTCNTR
- LXI H,2722H
- SHLD F35
- 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 CHECK EXIT REQUEST FROM A LOOP
- ;
- REQEXIT: CALL CONST
- ORA A
- RZ
- CALL CONIN
- RET
- ;
- ;**********************************************************
- ;Bios Error Messages
- ;
- MSG1: DB 'No Synch byte.',80H
- ;
- MSG2: DB 'CRC error.',80H
- ;
- MSG3: DB 'Verify-compare error.',80H
- ;
- MSG4: DB 'No index pulse.',80H
- ;
- MSG5: DB 'Density mismatch.',80H
- ;
- MSG6: DB 'Write-protected.',80H
- ;
- ;**********************************************************
- ;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:
- MOV A,B ;duplicate instruction overlayed
- ORA A ;check pointer for zero byte
- DB JRNZ, UNIV1-$-1 ;skip if not zero byte of fcb
- ;
- LDA CURDSK ;get current disk
- ANI 0FH ;mask out high nibble
- ORA A ;is it drive A?
- DB JRNZ, UNIV1-$-1 ;skip if not
- ;
- LDAX D ;get fcb first byte
- CPI 0E5H ;check for erased
- DB JRZ, UNIV1-$-1 ;skip if erased
- ;
- LDA PASBYTE
- DW BIT5A
- DB JRNZ, DFU13-$-1
- DW BIT2A
- DB JRNZ, DFU14-$-1
- ;
- MOV A,M
- CPI 15 ;and check for user 15
- DB JRZ, MATCH0-$-1 ;jump if zero
- ;
- DFU14:
- MOV A,M
- CPI 14 ;check for user 14
- DB JRZ, MATCH0-$-1
- ;
- DFU13:
- MOV A,M
- CPI 13 ;check for user 13
- MATCH0:
- JZ MATCH
- ;
- UNIV1:
- MOV A,B ;duplicate instuction overlayed
- CPI 0DH ; " " "
- JMP TINUSRCH ;and return where routine left off
- ;
- ;**********************************************************
- ;To support North Star hard disk
- WRITHST EQU BIOS+62DH
- PRNERRMSG EQU BIOS+2FCH
- SYSLOD: EQU BIOS+6CDH
- ;
- HDSUPP:
- IF HARDSK
- LXI B,16 ;number of bytes to move
- LXI D,CCP+7 ;destination address
- LXI H,HD18 ;source address
- DW LDIR ;move them
- JMP CCP ;boot the hard disk
- ;
- HD18:
- DB 08H,'HD'
- WORK:
- DB '18BOOT '
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0
- DW WRITHST
- DW PRNERRMSG
- DW SYSLOD
- DW WORK
- DB 'CPMWORK'
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0
- ENDIF ;HARDSK
- ;
- IF NOT HARDSK
- JMP 0000H ;do a warm boot instead
- ENDIF
- ;
- ;**********************************************************
- ;Alternate Disk Parameter Block for 96 tpi drives. This
- ;version of GENUSR now permits support of the original
- ;North Star format for N-drives as well as this one.
- ;
- ;Double density, double sided (2.x)
- ;Format byte = D2H
- ;Double track (96/in.)
- ;
- N5 EQU 160 ;number of tracks
- SPT5 EQU 40 ;CPM sectors per track
- DRM5 EQU 127 ;directory size-1
- BLS5 EQU 2 ;block size (kbytes)
- SYSTRK5 EQU 2 ;reserved tracks
- ;
- DB 8*BLS5
- ;
- DPB5:
- DW SPT5 ;SPT-sectors/track
- DB 04 ;BSH-block shift factor
- DB 8*BLS5-1;BLM-block mask
- DB BLS5-1-BLS5/2
- ;EXM-null mask
- DW -1+(((N5-SYSTRK5)*SPT5)/(8*BLS5))
- ;DSM-disk size-1
- DW DRM5 ;DRM-directory max
- DB 192 ;AL0-allocation 0
- DB 0 ;AL1-allocation 1
- DW (DRM5+1)/4
- ;CKS-check size
- DW SYSTRK5 ;OFF-track offset
- ;
- ;**********************************************************
- ;Alternate Disk Parameter Block for QUAD (48tpi) drives. This
- ;version of GENUSR now permits support of the original
- ;North Star format for Quad drives as well as this one.
- ;
- ;Double density, double sided (2.x)
- ;Format byte = D0H
- ;
- N6 EQU 80 ;number of tracks
- SPT6 EQU 40 ;CPM sectors per track
- DRM6 EQU 63 ;directory size-1
- BLS6 EQU 2 ;block size (kbytes)
- SYSTRK6 EQU 2 ;reserved tracks
- ;
- DSM6 EQU -1+(((N6-SYSTRK6)*SPT6)/(8*BLS6))
- ;
- DB 8*BLS6
- ;
- DPB6:
- DW SPT6 ;SPT-sectors/track
- DB 04 ;BSH-block shift factor
- DB 8*BLS6-1;BLM-block mask
- DB BLS6-1
- ;EXM-null mask
- DW DSM6 ;DSM-disk size-1
- DW DRM6 ;DRM-directory max
- DB 128 ;AL0-allocation 0
- DB 0 ;AL1-allocation 1
- DW (DRM6+1)/4
- ;CKS-check size
- DW SYSTRK6 ;OFF-track offset
- ;
- ;**********************************************************
- ;These routines are in-line with the bios SELDSK routine
- ;and permit the alternate formats above if your formatter
- ;is modified to place a 0D2H at the format byte location
- ;and formats 160 tracks for 96 tpi drives; and, a 0D0H
- ;format byte with formatting of 80 tracks for Quad drives.
- ;
- DPB3 EQU BIOS+50EH ;Quad
- DPB4 EQU BIOS+51EH ;N-drive (Octal)
- SEKTRK EQU BIOS+0CAEH
- TINUIT EQU BIOS+5ACH
- WRTDPH EQU BIOS+444H ;routine in bios to
- ;write the Disk Parm Header
- ;
- ALTOCTL:
- MOV A,B ;get the format byte
- LXI D,DPB4-1
- ANI 20H ;see which format
- DB JRNZ, GODPH-$-1
- LXI D,DPB5-1
- DB JR, GODPH-$-1;go write the Disk Parm Header
- ;
- ALTQUAD:
- MOV A,B ;get the format byte
- ANI 40H ;see if double sided
- DB JRZ, GODPH-$-1
- MOV A,B ;get the format byte again
- ANI 20H ;see which format
- DB JRNZ, GODPH-$-1
- LXI D,DPB6-1;point to Disk Parm Block for this frmt.
- GODPH JMP WRTDPH ;go write the Disk Parameter Header
- ;
- ;**********************************************************
- ;Routine to test for 80 track format and to patch or unpatch
- ;depending on 80/70 tracks.
- ;
- CKQUAD80:
- LDA F35
- CALL STOREM
- LDA BDOS+0DC6H ;get the disk size byte for
- ;the current disk access.
- CPI DSM6
- DB JRNZ, COMRDWR-$-1
- LDA F40
- CALL STOREM
- COMRDWR
- LHLD SEKTRK
- JMP TINUIT
- ;
- STOREM:
- STA BIOS+105H
- INR A
- STA BIOS+10BH
- STA BIOS+668H
- STA BIOS+68EH
- RAL ;@4.5
- ADI 3FH ;@4.5
- STA BIOS+66DH ;@4.5
- RET
- ;
- ;**********************************************************
- ;
- RSTCNTR:
- LHLD CMDS
- MVI L,7
- MOV A,M ;reset controller, deselect drives
- ;and stop motors.
- RET
- ;
- ;**********************************************************
- ;
- ; USER DEFINED I/O DEVICE DRIVERS
- ;
- ;**********************************************************
- ;
- UC1ST: ;USER CONSOLE 1 STATUS
- UL1ST: ;USER LIST DEVICE STATUS
- MVI A,0FFH ;ALWAYS READY
- RET
- ;
- UC1OUT: ;USER CONSOLE 1 IN (NULL)
- UP1OUT: ;USER PUNCH ONE OUT (NULL)
- UP2OUT: ;USER PUNCH TWO OUTPUT "
- UL1OUT: ;USER LIST OUTPUT (NULL)
- MOV A,C ;CHARACTER INTO A
- RET
- ;
- UC1IN: ;USER CONSOLE 1 IN (NULL)
- UR1IN: ;USER READER ONE INPUT
- UR2IN: ;USER READER TWO INPUT
- MVI A,EOF ;END OF FILE FOR NOW
- RET
- ;
- ;**********************************************************
- ;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
- ;
- IF BGTST
- TEST:
- DI
- PUSH H
- LHLD TSTPT
- INX H
- MOV A,H
- CPI $/100H
- DB JRNZ, TEST1-$-1
- LXI H,0000H
- ;
- TEST1:
- SHLD TSTPT
- MOV A,M
- CMA
- MOV M,A
- CMP M
- DB JRZ, TEST2-$-1
- 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:
- CMA
- MOV M,A
- POP H
- EI
- RET
- ;
- ;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
- ;
- ENDIF
- ;
- ;END OF CONSTANT MEMORY TEST
- ;
- USR2END: ;END OF USER2 CODE FOR NOW
- USR2SIZE EQU USR2END-USER2 ;DO NOT EXCEED SPACE ALLOCAT-
- ;ED ABOVE YOUR RUNNING CP/M.
- ;
- ;**********************************************************
- ; EQUATES FOR CCP PATCHES
- LENCMD EQU 6 ;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
- 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
- ;
- ;**********************************************************
- ; CCP patches
- ;**********************************************************
- ;Patch the turnkey start string into the CCP command buffer.
- ORG COMBUF
- TNKY: DB 08,'BYE 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
- DW RES7M
- JMP OK
- ;
- TRAPBYT:
- DB 0
- ;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
- ;**********************************************************
- ; 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
- ;
- ;
- ;**********************************************************
- ;
- ORG HOLE1
- RELOG0: CALL CRLF
- RELOG: CALL LOGTST
- DB JRZ, EXIT-$-1
- CALL ILPRT2
- DB 'Login please',0
- EXIT: LXI SP,STACK
- JMP RETCCP
- ;
- ;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
- ;
- ;patch to make backspace and rubout to delete character
- ORG BDOS+21BH
- JMP BDOS+207H
- ;
- ;**********************************************************
- ;
- ; USER WARM INITIALIZATION ROUTINE
- ;
- ;**********************************************************
- ;eight bytes available here in the BDOS
- WINIT:
- PRNTIM:
- IF NOT CLOCK
- RET
- ENDIF
- ;
- IF CLOCK
- CALL TIME
- JMP PRNSTR1
- ENDIF
- ;
- ;**********************************************************
- ;
- ORG BDOSPARE
- ;These routines are part of the 'BYE' command stuffed here
- ;for convenience.
- ;
- PASTBL1:
- DW OK1
- DW CKAGIN
- PASTBL2:
- DW OK2
- DW CKAGIN
- ;
- H89FLG:
- DB 0 ;INITIAL VALUE
- ;
- ;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
- BOOTCNT: DB 5 ;5 tries for warm boot
- TSTPT: DW 0000H
- ;3 bytes here
- ;
- ORG BDOS+75EH
- JMP UNIV
- ;
- ;**********************************************************
- ;The code from this org to 'here' must not exceed 48 bytes.
- ;
- ORG BDOS+311H
- ;Message address table
- ;
- MSGTBL:
- DW MSG1
- DW MSG2
- DW MSG3
- DW MSG4
- DW MSG5
- DW MSG6
- ;
- STOPIT: CALL ILPRT
- DB 'Aborting, do a cold boot.',CR,LF,0
- ENDLESS:
- JMP ENDLESS
- ;
- COUNTER:
- DW INTCNTR ;INITIAL VALUE
- ;
- here: EQU $
- ;
- ;**********************************************************
- ;Coldboot loader patches
- OFFSET EQU 1600H
- FR: EQU -1-OFFSET
- BR: EQU FR+0FFH+1
- LOADIT EQU BIOS+3FH
- ;
- ORG CCP-100H+1CH
- LDUSR2: EQU $+OFFSET
- LXI B,1F00H
- LXI D,0001H
- LXI H,USER2-BUFEXP
- MVI A,4
- STA MODE
- CALL BIOS+3FH
- DB JRNZ, LDUSR2-$+BR
- ;
- LDBIOS: EQU $+OFFSET
- LXI B,0000H
- LXI D,0501H
- LXI H,BIOS+100H
- MVI A,4
- STA MODE
- CALL LOADIT
- DB JRNZ, LDBIOS-$+BR
- ;
- LXI H,BIOTBL2
- CALL BIOS-100H+84H
- XRA A
- STA 0003
- STA 0004
- CALL BIOS+0BFH
- XX1: EQU $+OFFSET+2
- LDA 0EB11H
- DDLY0: EQU $+OFFSET
- MVI A,0E2H
- DDLY EQU $+OFFSET
- DCR A
- DB JRNZ, DDLY-$+BR
- INR D
- XX2: EQU $+OFFSET+2
- LDA 0EB10H
- ORA A
- JP DDLY0
- MOV A,D
- STA BIOS+0CB3H
- CALL INITIAL
- LXI H,HERALD
- CALL BIOS+6B8H
- MVI A,0C3H
- STA BIOS+3CH
- CALL MOVHRLD
- LDA BIOS+6F7H
- ORA A
- JZ BIOS+34DH
- LXI H,HDSUPP
- JMP BIOS+361H
- ;
- ORG CCP-100H+97H
- BIOTBL1:EQU $+OFFSET
- DW XX1
- DW XX2
- ;
- ORG CCP-100H+0ADH
- BIOTBL2:EQU $+OFFSET
- DW BIOS+12EH
- DW BIOS+172H
- DW BIOS+17CH
- DW BIOS+1B1H
- DW BIOS+1C0H
- DW BIOS+1C9H
- DW BIOS+1EAH
- DW BIOS+203H
- DW BIOS+209H
- DW BIOS+23CH
- DW BIOS+23FH
- DW BIOS+242H
- DW BIOS+24AH
- DW BIOS+24DH
- DW BIOS+254H
- DW BIOS+25EH
- DW BIOS+11FH
- DW BIOS+1E7H
- DW BIOS+002H
- DW BIOS-100H+0ABH
- DW 0000H
- ;
- MOVHRLD:EQU $+OFFSET
- LXI H,HERALD+2
- LXI D,INITIAL
- LXI B,21 ;to move 21 bytes
- DW LDIR
- RET
- ;
- HERALD: EQU $+OFFSET
- DB ESC,SCRN,'CP/M 2.2 '
- DB MSIZE/10+30H
- DB MSIZE MOD 10 + 30H
- DB 'K system',CR,LF,80H
- ;
- ;**********************************************************
- ;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
- BOOT0: DS 3
- WRMSTRT: DS 3
- JMP CONST
- JMP CONIN
- CONSOUT: DS 3
- JMP LIST
- JMP PUNCH
- JMP READER
- HOME: DS 3
- SELDSK: DS 3
- SETTRK: DS 3
- SETSEC: DS 3
- SETDMA: DS 3
- READ0: DS 3
- WRITE: DS 3
- LISTST0: JMP LISTST
- SECTRAN: DS 3
- LOADSYS: DS 3
- ;
- ORG BIOS+54AH
- JMP CONOUT
- ;
- ;**********************************************************
- ;Resets disk system if no index hole is found on drive, and
- ;returns logged drive to 'A'
- ;
- ORG BIOS+6EAH
- JMP DSKERR
- ORG BIOS+6F9H
- DB 0FFH
- ;
- ;**********************************************************
- ;
- ORG BIOS+2A8H
- DW ERRCODE
- ORG BIOS+2CAH
- DW DRVCODE
- ORG BIOS+2D1H
- DW SECCODE
- ORG BIOS+2E1H
- DW ERRCODE
- ;
- ORG BIOS+317H
- ERRCODE:
- DS 1
- DRVCODE:
- DS 1
- TRKCODE:
- DS 3
- SECCODE:
- DS 1
- ;
- ORG BIOS+31DH
- TINUINIT:
- 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 SER1D
- IN SER2D
- IN DPORT
- MVI A,PASBYT
- STA PASBYTE
- MVI A,0C3H
- STA 52H
- LXI H,TIME
- SHLD 53H
- MVI A,30H ;RESET PI FLAG
- OUT MOTHER
- RET
- ;
- BDOSSTK EQU $
- ;To move the BDOS stack to here:
- ;
- ORG BDOS+25H
- DW BDOSSTK
- ;
- ;**********************************************************
- ;These patches provide for a slightly enlarged buffer so
- ;that the necessary scratch space for the disk allocation
- ;vectors (ALV's) is there. The ALV space is now 39H for
- ;each drive instead of 19H as in original N* release. The
- ;Directory buffer has been moved in order to accomplish this.
- ;
- ORG BIOS+460H
- DW DIRBUF
- ORG BIOS+46CH
- DW 003DH
- ORG BIOS+481H
- DW DPBASE0-6AH
- ORG BIOS+484H
- DW 006AH
-
- DPBASE0 EQU BUF+200H
- DIRBUF EQU USER2-80H
- ;
-
- ORG BIOS+441H
- JMP ALTOCTL ;puts the ALTOCTL routine in-line
- ;with the SELDSK routine in bios.
- ;
- ;patches for quad drives to give 40 tracks per side
- ORG BIOS+437H
- DW ALTQUAD ;to check for alt Quad format
- ;
- ORG BIOS+43EH
- DW ALTQUAD
- ;
- ORG BIOS+5A9H
- JMP CKQUAD80
- ;
- ORG BIOS+6E5H
- ;These 2 bytes are used in the alternate Quad formatting scheme
- ;and are manipulated by the formatter, NEWFRMAT.COM. So don't
- ;change or delete these bytes or their location.
- F35: DB 22H
- F40: DB 27H
- ;
- ;**********************************************************
- ;
- ; 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
- PUSHIX EQU 0E5DDH ;PUSH IX ONTO STACK
- POPIX EQU 0E1DDH ;POP IX OFF OF STACK
- PUSHIY EQU 0E5FDH
- POPIY EQU 0E1FDH
- PCIY EQU 0E9FDH
- 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
- BIT7M EQU 7ECBH ;TEST BIT 7 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
- SET7M EQU 0FECBH ;SET BIT 7 IN MEM
- SET7A EQU 0FFCBH ;SET BIT 7 IN ACC
- 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
- RES7M EQU 0BECBH ;RESET BIT 7 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