; MXO-NE11.ASM - NEC PC-8001A OVERLAY FILE FOR MEX10. 25 MAY 1984
;
REV EQU 11 ;overlay revision level
;
; This file adapts the NEC PC-8001A/Smartmodem 1200 to the MEX modem program.
; You must use Chan 1 RS232 port and set the port internally for 1200 baud.
; This overlay converts to MEX and no longer fits all features of MDMxx as
; rewritten.
;
; TO USE: Edit this overlay file as you prefer - then assemble it.
; ASM MXO-NE10 ;use ASM
; Patch MEX with the resulting hex file using MLOAD.
; MLOAD YOURNAME.COM=MEX10.COM,MXO-NE11
; Patch YOURNAME with the Smartmodem hex file if needed.
; MLOAD YOURNAME.COM=YOURNAME.COM,MXO-SM1x
;
; = = = = = = = = = = = = = = = = = =
;
; 05/25/84 - Converted from MDM7xx to MEX10 - David Poskie
; 11/11/83 - Renamed to M7NE-1.ASM, no changes - Irv Hoff
; 07/27/83 - Renamed for use with MDM712 - Irv Hoff
; 07/01/83 - Revised for use with MDM711 - Irv Hoff
; 06/22/83 - Revised for use with MDM710 - Irv Hoff
; 06/22/83 - Altered for use with MDM710 - Irv Hoff
; 06/22/83 - Altered MDM708DP for the NEC 8001
; computer using an external modem - Irv Hoff
;
; = = = = = = = = = = = = = = = = = =
;
BELL: EQU 07H ;bell
CR: EQU 0DH ;carriage return
ESC: EQU 1BH ;escape
LF: EQU 0AH ;linefeed
TAB: EQU 09H ;horizontal tab
TPA: EQU 100H ;start of RAM
;
YES: EQU 0FFH
NO: EQU 0
;
PORT: EQU 0C0H ;NEC PC-8001 serial port
MODCTL1: EQU PORT+1 ;Modem status port
MODCTL2: EQU PORT+1 ;Modem control port
MODDATP: EQU PORT ;Modem data port
MODRCVB: EQU 02H ;Modem receive bit
MODRCVR: EQU 02H ;Modem receive ready bit
MODSNDB: EQU 01H ;Modem send bit
MODSNDR: EQU 01H ;Modem send ready bit
;
; MEX service call processor equates
;
MEX EQU 0D00H ;MEX service call processor address
INMDM EQU 255 ;get char from port to A,
;CY=no more in 100ms
TIMER EQU 254 ;delay 100ms * reg B
TMDINP EQU 253 ;B=# secs to wait for char,cy=no char
CHEKCC EQU 252 ;check for ^C frm kybd,Z=present
SNDRDY EQU 251 ;test modem-send ready
RCVRDY EQU 250 ;test modem-receive ready
SNDCHR EQU 249 ;send char to modem (after SNDRDY)
RCVCHR EQU 248 ;rcv a char from modem (after RCVRDY)
LOOKUP EQU 247 ;table search (see CMDTBL comments)
PARSFN EQU 246 ;parse filename from input stream
BDPARS EQU 245 ;parse baud-rate from input stream
SBLANK EQU 244 ;scan input stream to next non-blank
EVALA EQU 243 ;evaluate numeric from input stream
LKAHED EQU 242 ;get next char w/o removing from input
GNC EQU 241 ;get char from input,cy=1 if none
ILP EQU 240 ;inline print
DECOUT EQU 239 ;decimal output
PRBAUD EQU 238 ;print baud-rate
;
CONOUT EQU 2 ;simulated BDOS function 2:con char out
PRINT EQU 9 ;simulated BDOS function 9:print string
INBUF EQU 10 ;input buffer,same structure as BDOS 10
;
ORG TPA ;here we go
;
DS 3 ;(for "JMP START" instruction)
;
PMODEM: DB NO ;yes=PMMI S-100 Modem 103H
SMODEM: DB YES ;yes=HAYES Smartmodem 104H
TPULSE: DB 'P' ;T=touch, P=pulse (Smartmodem-only) 105H
CLOCK: DB 40 ;clock speed in MHz *10, 25.5 MHz max. 106H
MSPEED: DB 5 ;0=110 1=300 2=450 3=600 4=710 5=1200 107H
;6=2400 7=4800 8=9600 9=19200 default
BYTDLY: DB 5 ;0=0 delay 1=10ms 5=50 ms - 9=90 ms 108H
;default time to send character in ter-
;minal mode file transfer for slow BB's
CRDLY: DB 5 ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
;default extra wait after CRLF in terminal
; mode file transfer for slow BB's
COLUMS DB 5 ;number of DIR columns shown 10AH
SETFL: DB YES ;yes=user-defined SET Command 10BH
SCRTEST: DB YES ;cursor control routine 10CH
RETRY: DB YES ;reset error count after 10 consec.errors
BAKFLG: DB NO ;yes=change any file same name to .BAK 10EH
CRCDFL: DB YES ;yes=default to CRC checking 10FH
TOGCRC: DB YES ;yes=allow toggling of CRC to Checksum 110H
CVTBK: DB NO ;yes=convert backspace to rub 111H
TOGLBK: DB YES ;yes=allow toggling of bksp to rub 112H
ADDLF: DB NO ;no=no LF after CR to send file in 113H
;terminal mode (added by remote echo)
TOGLLF: DB YES ;yes=allow toggling LF after CR 114H
TRNLOG: DB YES ;yes=allow logon transmission 115H
;write logon sequence at location LOGON
SAVCCP: DB YES ;yes=do not overwrite CCP 116H
LOCNXT: DB YES ;yes=local command if EXTCHR precedes 117H
;no=external command if EXTCHR precedes
TOGLOC: DB YES ;yes=allow toggling LOCONEXTCHR 118H
LSTTST: DB NO ;no=using modem on printer port 119H
XOFTST: DB YES ;yes=chcks for XOFF from remote while 11AH
;sending a file in terminal mode
XONWT: DB NO ;yes=wait for XON after CR while 11BH
;sending a file in terminal mode
TOGXOF: DB YES ;yes=allow toggling of XOFF checking 11CH
IGNCTL: DB YES ;yes=CTL-chars above ^M not displayed 11DH
EXTRA1: DB 0 ;for future expansion 11EH
EXTRA2: DB 0 ;for future expansion 11FH
BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone 120H
NOCONN: DB 'N'-40H ;^N = Disconnect from the phone line 121H
LOGCHR: DB 'L'-40H ;^L = Send logon 122H
LSTCHR: DB 'P'-40H ;^P = Toggle printer 123H
UNSVCH: DB 'R'-40H ;^R = Close input text buffer 124H
TRNCHR: DB 'T'-40H ;^T = Transmit file to remote 125H
SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer 126H
EXTCHR: DB '^'-40H ;^^ = Send next character 127H
;
DS 2 ;not used by MEX 128H
;
;low level modem I/O routines.
;
IN$MODCTL1: IN MODCTL1 ! RET ;in modem control port
DS 7
OUT$MODDATP: OUT MODDATP ! RET ;out modem data port
DS 7
IN$MODDATP: IN MODDATP ! RET ;in modem data port
DS 7
ANI$MODRCVB ANI MODRCVB ! RET ;test bit for receive ready
ANI$MODRCVR CPI MODRCVR ! RET ;receive bit value when ready
ANI$MODSNDB ANI MODSNDB ! RET ;test bit for send ready
ANI$MODSNDR CPI MODSNDR ! RET ;send bit value when ready
DS 12
;
LOGON DS 2 ;req for MDM compat, not ref by MEX
DIALV: DS 3
DISCV: JMP DISCON
GOODBYV: JMP GOODBY ;called before exit to CP/M
INMODV: JMP NITMOD ;cold-st user-written routine 16BH
NEWBAUDV: JMP NEWBAUD ;sets baud-rate
RET ! NOP ! NOP ;bypasses PMMI routine
RET ! NOP ! NOP ;bypasses PMMI routine
SETUPV: JMP SETCMD ;SET command 177H
SPMENV: DS 3 ;not used with MEX 17AH
VERSNV: JMP VERSN ;shows overlay version in sign-on
BREAKV: JMP SBREAK ;send a break 180H
;
; NOTE: For MEX compatibility, don't use these next 6 routines.
; Use the MEX service call processor routines instead.
; Do not change the following six routines.
; vv REPLACE WITH: vv
ILPRTV: DS 3 ;MEX funct 9 183H
INBUFV: DS 3 ;MEX funct 10 186H
INCMPV: DS 3 ;table lookup funct 247 189H
INMDMV: DS 3 ;MEX funct 255 18CH
NXSCRV: DS 3 ;not supported (returns NOP) 18FH
TIMERV: DS 3 ;MEX funct 254 192H
;
CLREOS: MVI C,ILP
CALL MEX
DB ESC,59H,0,0,0
RET
;
CLS: MVI C,ILP
CALL MEX
DB 1EH,ESC,59H,0,0
RET
;
; end of fixed area
;.....
;
VERSN: MVI C,ILP
CALL MEX
DB 'NEC PC-8001A <+> SMARTMODEM 1200 '
DB REV/10+'0'
DB '.'
DB REV MOD 10+'0'
DB CR,LF,0
RET
;
;-----------------------------------------------------------------------
;
; NOTE: You can change the VERSN message to be longer or shorter. The
; point is to be done with this overlay by 0B00H if using a
; Smartmodem or by 0D00H otherwise.
;
;=======================================================================
;
; This routine allows sending a 300 ms. break tone to reset some
; time-share computers.
;
SBREAK: MVI A,5
OUT MODCTL1
MVI A,1FH ;send a break tone
JMP GOODBY1
;.....
;
; This routine sets DTR low and sends a 300 ms. break tone
; to disconnect some modems (e.g. Bell 212A)
;
DISCON: MVI A,5
OUT MODCTL1 ;send break
MVI A,15H ;turn off DTR
GOODBY1: OUT MODCTL1 ;send to status port
MVI B,3 ;wait 300 ms
MVI C,TIMER
CALL MEX
GOODBY: MVI A,5
OUT MODCTL1
MVI A,07H ;normal send/receive with DTR
OUT MODCTL1 ;send to status port
RET
;.....
;
; NEC PC-8001 initialization -- sets the 8251A for 8 bits, 1 stop pulse,
; DTR high. Requires dip switche be set internally to 1200 baud then
; divides by 64 for 300, or by 16 for 1200 baud via "SET" command. Set
; now to default at 1200 baud.
;
NITMOD: MVI A,5 ;1200 baud transfer time
STA MSPEED
MVI A,087H ;insure out of mode
OUT MODCTL1 ;modem status port
OUT MODCTL1 ;slight delay
MVI A,4EH ;initialize USART
OUT MODCTL1
;
NITMOD1: MVI A,4EH ;default - divide by 16 for 1200 baud
OUT MODCTL1 ;modem status port
MVI A,17H ;DTR, RCV, XMT, ERROR reset
OUT MODCTL1
IN PORT ;clear data port
RET
;.....
;
SETCMD MVI C,SBLANK ;any argument?
CALL MEX
JC TELL ;if not, display baud-rate
LXI D,CMDTBL
MVI C,LOOKUP
CALL MEX ;parse argument
PUSH H ;save any parsed argument adr on stack
RNC ;if argument, return to it
POP H ;OOPS, argument not found in table
SETERR: MVI C,ILP ;inline print
CALL MEX ;say input not valid
DB CR,LF,'++ Invalid SET Command ++',CR,LF,BELL,0
RET
;
CMDTBL: DB '30','0'+80H
DW OK300
DB '120','0'+80H
DW OK1200
DB 0
;
TELL: MVI C,ILP
CALL MEX ;print current baud-rate
DB CR,LF,'Baud-rate is now: ',0
LDA MSPEED
MVI C,PRBAUD
CALL MEX
RET
;
OK300: MVI A,1
MVI B,4FH ;divide by 64 for 300 baud
JMP LOADBD ;go load it
;
OK1200: MVI A,5
MVI B,4EH ;divide by 16 for 1200 baud
;
;
LOADBD: STA NITMOD+1 ;change time-to-send to match baud-rate
MOV A,B ;get baud-rate byte
STA NITMOD1+1 ;store in NITMOD
JMP NITMOD ;reinitialize to new baud-rate and done
;
;
BAUDBUF: DB 10,0
DS 10
;
NEWBAUD: CPI 1
JZ OK300
CPI 5
JZ OK1200
RET
;.....
; (END OF NITMOD AND SETUP ROUTINES)
;=======================================================================
;
;
; NOTE: ABOVE WHEN ASSEMBLED MUST TERMINATE BEFORE 0B00H WITH A
; SMARTMODEM & BEFORE 0D00H WITHOUT.
;
;=======================================================================
;
END
;