home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
mex
/
mxh-am11.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
20KB
|
713 lines
; MXH-AM11.ASM
; MEX overlay for the Ampro Little Board Computer
; Version 1.1 07 Feb 1986
; Changed to MXH-AM11 from MXO=AM10, added DCD & DTR support and
; made LOADable from within MEX+ --Bob Connolly
;
; Version 1.0: 28 Nov 1984
REV EQU 11 ;overlay revision level
; This is a MEX overlay file for the Ampro Computer. It is designed
; to work with the modem connected to serial port 'B'. It also
; requires the CTC and SIO parameter tables at the front of the
; Ampro bios, as well as the I/O initialization routine in the
; Ampro bios. This is a non-standard bios call and if not present
; in the bios it must be duplicated in this overlay.
; Note that all overlays may freely use memory up to 0CFFH. If the
; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM),
; the physical modem overlay should terminate by 0AFFH.
;------------------------------------------------------------
; Misc equates
NO EQU 0
YES EQU 0FFh
TPA EQU 100h
CR EQU 13
LF EQU 10
TAB EQU 9
; Ampro definitions
IOINT EQU 57 ;BIOS call of initialization routine
SIOB EQU 52h ;relative location in bios
SIOB1 EQU 53h
SIOB3 EQU 55h
SIOB5 EQU 57h
CT1 EQU 42h
; port definitions
MODCTL EQU 8Ch ;modem control port B
MODDAT EQU 88h ;modem data port B
; bit definitions
MDRCVB EQU 01h ;modem receive bit (DAV)
MDRCVR EQU 01h ;modem receive ready
MDSNDB EQU 04h ;modem send bit
MDSNDR EQU 04h ;modem send ready bit
; MEX service processor stuff ... MEX supports an overlay service
; processor, located at 0D00H (and maintained at this address from
; version to version). If your overlay needs to call BDOS for any
; reason, it should call MEX instead; function calls below about
; 240 are simply passed on to the BDOS (console and list I/O calls
; are specially handled to allow modem port queueing, which is why
; you should call MEX instead of BDOS). MEX uses function calls
; above about 244 for special overlay services (described below).
; Some sophisticated overlays may need to do file I/O; if so, use
; the PARSFN MEX call with a pointer to the FCB in DE to parse out
; the name. This FCB should support a spare byte immediately pre-
; ceeding the actual FCB (to contain user # information). If you've
; used MEX-10 for input instead of BDOS-10 (or you're parsing part
; of a SET command line that's already been input), then MEX will
; take care of DU specs, and set up the FCB accordingly. There-
; after all file I/O calls done through the MEX service processor
; will handle drive and user with no further effort necessary on
; the part of the programmer.
MEX EQU 0D00H ;address of the service processor
INMDM EQU 255 ;get char from port to A, CY=no more in 100 ms
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 from KBD, Z=present
SNDRDY EQU 251 ;test for modem-send ready
RCVRDY EQU 250 ;test for modem-receive ready
SNDCHR EQU 249 ;send a character to the modem (after sndrdy)
RCVCHR EQU 248 ;recv a char from modem (after rcvrdy)
LOOKUP EQU 247 ;table search: see CMDTBL comments for info
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 nxt 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: console char out
PRINT EQU 9 ;simulated BDOS function 9: print string
INBUF EQU 10 ;input buffer, same structure as BDOS 10
ORG TPA ;we begin
db 0c3h
DS 2 ;MEX has a JMP START here
; The following variables are located at the beginning of the program
; to facilitate modification without the need of re-assembly. They will
; be moved in MEX 2.0.
PMODEM: DB NO ;yes=PMMI modem \ / These 2 locations are not
SMODEM: DB YES ;yes=Smartmodem / \ referenced by MEX
TPULSE: DB 'T' ;T=touch, P=pulse (not referenced by MEX)
CLOCK: DB 40 ;clock speed x .1, up to 25.5 mhz.
MSPEED: DB 6 ;sets display time for sending a file
;0=110 1=300 2=450 3=600 4=710
;5=1200 6=2400 7=4800 8=9600 9=19200
BYTDLY: DB 5 ;default time to send character in
;terminal mode file transfer (0-9)
;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
CRDLY: DB 5 ;end-of-line delay after CRLF in terminal
;mode file transfer for slow BBS systems
;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
COLUMS: DB 5 ;number of directory columns
SETFL: DB YES ;yes=user-defined SET command
SCRTST: DB YES ;yes=if home cursor and clear screen 10Ch
;routine at CLRSCRN
DB 0 ;was once ACKNAK, now spare
BAKFLG: DB NO ;yes=make .BAK file
CRCDFL: DB YES ;yes=default to CRC checking
;no=default to Checksum checking
TOGCRC: DB YES ;yes=allow toggling of Checksum to CRC 110h
CVTBS: DB NO ;yes=convert backspace to rub
TOGLBK: DB YES ;yes=allow toggling of bksp to rub
ADDLF: DB NO ;no=no LF after CR to send file in
;terminal mode (added by remote echo)
TOGLF: DB YES ;yes=allow toggling of LF after CR
TRNLOG: DB YES ;yes=allow transmission of logon
;write logon sequence at location LOGON
SAVCCP: DB YES ;yes=do not overwrite CCP
LOCNXT: DB NO ;yes=local cmd if EXTCHR precedes
;no=not local cmd if EXTCHR precedes
TOGLOC: DB YES ;yes=allow toggling of LOCNXTCHR
LSTTST: DB YES ;yes=allow toggling of printer on/off
;in terminal mode. Set to no if using
;the printer port for the modem
XOFTST: DB NO ;yes=allow testing of XOFF from remote
;while sending a file in terminal mode
XONWT: DB NO ;yes=wait for XON after sending CR while
;transmitting a file in terminal mode
TOGXOF: DB YES ;yes=allow toggling of XOFF testing
IGNCTL: DB NO ;yes=do not send control characters
;above CTL-M to CRT in terminal mode
;no=send any incoming CTL-char to CRT
EXTRA1: DB 0 ;for future expansion
EXTRA2: DB 0 ;for future expansion
BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone
NOCONN: DB 'N'-40H ;^N = Disconnect from phone line
LOGCHR: DB 'L'-40H ;^L = Send logon
LSTCHR: DB 'P'-40H ;^P = Toggle printer
UNSVCH: DB 'R'-40H ;^R = Close input text buffer
TRNCHR: DB 'T'-40H ;^T = Transmit file to remote
SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer
EXTCHR: DB '^'-40H ;^^ = Send next character 127h
ds 2 ;make addresses right
; Low-level modem I/O routines: this will be replaced with
; a jump table in MEX 2.0 (you can insert jumps here to longer
; routines if you'd like ... I'd recommend NOT putting part of
; a routine in this area, then jumping to the rest of the routine
; in the non-fixed area; that will complicate the 2.0 conversion)
INCTL1: IN MODCTL ;in modem control port 12Ah
RET
DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
OTDATA: OUT MODDAT ;out modem data port 134h
RET
DB 0,0,0,0,0,0,0 ;spares if needed for non=PMMI
INPORT: IN MODDAT ;in modem data port 13Eh
RET
DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
; Bit-test routines. These will be merged with the above
; routines in MEX 2.0 to provide a more reasonable format
MASKR: ANI MDRCVB ! RET ;bit to test for receive ready 148h
TESTR: CPI MDRCVR ! RET ;value of receive bit when ready
MASKS: ANI MDSNDB ! RET ;bit to test for send ready
TESTS: CPI MDSNDR ! RET ;value of send bit when ready
dcdtst: jmp dcdvec ;data carrier detect 154h
rngdet: jmp rngvec ;ring-detect 157h
db 0,0,0,0,0
; Special modem function jump table: if your overlay cannot handle
; some of these, change the jump to "DS 3", so the code present in
; MEX will be retained. Thus, if your modem can't dial, change the
; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
; diagnostic for any commands that require dialing.
; DIALV dials the digit in A. See the comments at PDIAL for specs.
; DISCV disconnects the modem
; GOODBV is called just before MEX exits to CP/M. If your overlay
; requires some exit cleanup, do it here.
; INMODV is called when MEX starts up; use INMODV to initialize the modem.
; NEWBDV is used for phone-number baud rates and is called with a baud-rate
; code in the A register, value as follows:
; A=0: 110 baud A=1: 300 baud A=2: 450 baud
; A=3: 600 baud A=4: 710 baud A=5: 1200 baud
; A=6: 2400 baud A=7: 4800 baud A=8: 19200 baud
; If your overlay supports the passed baud rate, it should store the
; value passed in A at MSPEED (107H), and set the requested rate. If
; the value passed is not supported, you should simply return (with-
; out modifying MSPEED) -or- optionally request a baud-rate from the
; user interactively.
; NOPARV is called at the end of each file transfer; your overlay may simply
; return here, or you may want to restore parity if you set no-parity
; in the following vector (this is the case with the PMMI overlay).
; PARITV is called at the start of each file transfer; your overlay may simply
; return here, or you may want to enable parity detection (this is the
; case with the PMMI overlay).
; SETUPV is the user-defined command ... to use this routine to build your own
; MEX command, set the variable SETFL (117H) non-zero, and add your SET
; code. You can use the routine presented in the PMMI overlay as a
; guide for parsing, table lookup, etc.
; SPMENU is provided only for MDM compatibility, and is not used by MEX 1.0 for
; any purpose (it will be gone in MEX 2).
; VERSNV is called immediately after MEX prints its sign-on message at cold
; startup -- use this to identify your overlay in the sign-on message
; (include overlay version number in the line).
; BREAKV is provided for sending a BREAK (<ESC>-B in terminal mode). If your
; modem doesn't support BREAK, or you don't care to code a BREAK rou-
; tine, you may simply execute a RET instruction.
;
smdisc: ds 3 ;smartmodem disc (not here} 15Fh
DIALV: DS 3 ;dial digit in A (see info at PDIAL) 162h
DISCV: jmp drdtr ;disconnect the modem 165h
GOODBV: DS 3 ;called before exit to CP/M
INMODV: JMP NITMOD ;initialization. Called at cold-start
NEWBDV: JMP PBAUD ;set baud rate
NOPARV: JMP NOPAR ;set modem for no-parity
PARITV: JMP PARITY ;set modem parity
SETUPV: JMP SETCMD ;SET cmd: jump to a RET if you don't write SET
SPMENV: DS 3 ;not used with MEX
VERSNV: JMP SYSVER ;Overlay's voice in the sign-on message 17Dh
BREAKV: DS 3 ;send a break 180h
; The following jump vector provides the overlay with access to special
; routines in the main program (retained and supported in the main pro-
; gram for MDM overlay compatibility). These should not be modified by
; the overlay.
; Note that for MEX 2.0 compatibility, you should not try to use these
; routines, since this table will go away with MEX 2.0 (use the MEX
; service call processor instead).
ILPRTV: DS 3 ;replace with MEX function 9
INBUFV: DS 3 ;replace with MEX function 10
ILCMPV: DS 3 ;replace with table lookup funct. 247
INMDMV: DS 3 ;replace with MEX function 255
NXSCRV: DS 3 ;not supported by MEX (returns w/no action)
TIMERV: DS 3 ;replace with MEX function 254
; Clear/screen and clear/end-of-screen. Each routine must use the
; full 9 bytes alloted (may be padded with nulls).
; These routines (and other screen routines that MEX 2.0 will sup-
; port) will be accessed through a jump table in 2.0, and will be
; located in an area that won't tie the screen functions to the
; modem overlay (as the MDM format does).
CLREOS: LXI D,EOSMSG ; 195h
MVI C,PRINT
CALL MEX
RET
CLS: LXI D,CLSMSG ;null unless patched 19Eh
MVI C,PRINT
CALL MEX
RET
;
org 200h ; area above is reserved
;
EOSMSG: DB 27,89,0,0,0,'$'
CLSMSG: DB 27,42,0,0,0,'$'
NOPAR: RET
PARITY: RET
;
DRDTR: MVI A,5 ; Setup to write register 5
OUT MODCTL
MVI A,68H ; Clear RTS causing shutdown
OUT MODCTL
RET
;
dcdvec: mvi a,10h ;reset status
out modctl ; 0=NO CARRIER 255=CARRIER
in modctl ; 254=NOT SUPPORTED
ani 20h ;dcd from modem must
rz ; be connected to
ori 0ffh ; cts (ampro) else
ret ; return 0feh (unsupported)
;
rngvec: mvi a,0feh
ret
;
NITMOD: MVI A,6 ;initialize to 2400 baud. No other
;parameters changed... fall thru
;------------------------------------------------------------------
PBAUD: PUSH H ;don't alter anybody
PUSH D
PUSH B
MOV E,A ;code to DE
MVI D,0
LXI H,BAUDTB ;offset into table
DAD D
MOV A,M ;fetch code
ORA A ;0? (means unsupported code)
STC ;return error for STBAUD caller
JZ PBEXIT ;exit if so
STA BSAVE1 ;save it
MOV A,E ;get speed code back
STA MSPEED ;make it current
LXI H,BAUDTX ;offset into second table
DAD D
MOV A,M ;get second value
STA BSAVE2 ;save it also
LHLD 1 ;get location of bios
MVI L,CT1 ;add 42 to reach CT1 in i/o table
MVI A,47h
MOV M,A
INX H ;move to next location
LDA BSAVE1 ;get first table value
MOV M,A ;store it
LDA BSAVE2 ;get second table value
MOV B,A ;and save it
MVI L,SIOB1 ;move ahead to siob+1 values
MOV A,M ;get current value
ANI 3Fh
ORA B ;or it with second value
MOV M,A ;store it in work table
INX H
INX H
MOV A,M ;get last value and make
ORI 80h ;sure msb is set
MOV M,A ;put it back in working table
CALL IOINIT ;do the initialization
STC
CMC ;return no error for STBAUD
PBEXIT: POP B ;all done
POP D
POP H
RET
IOINIT MVI A,IOINT ;offset into bios jump table
LHLD 1 ;address of bios in HL
MOV L,A ;add offset
JMP GOHL ;and go there with auto return
; table of baud rate divisors for supported rates
BAUDTB: DB 0,208,139,208,0,104 ;110,300,450,600,710,1200
DB 52,26,13,0 ;2400,4800,9600,19200
BAUDTX: DB 0,80h,80h,40h,0,40h
DB 40h,40h,40h,0
BSAVE1 DB 0 ;current setting from
BSAVE2 DB 0 ;tables - uninitialized
; Sign-on message
SYSVER: LXI D,SOMESG
MVI C,PRINT
CALL MEX
RET
SOMESG: DB 'Ampro Overlay Version '
DB REV/10+'0'
DB '.'
DB REV MOD 10+'0'
DB CR,LF,'$'
; Newline on console
CRLF: MVI A,CR
CALL TYPE
MVI A,LF ;fall into TYPE
; type char in A on console
TYPE: PUSH H ;save 'em
PUSH D
PUSH B
MOV E,A ;align output character
MVI C,CONOUT ;print via MEX
CALL MEX
POP B
POP D
POP H
RET
; Data area
;------------------------------------------------------------
; The remainder of this overlay implements a very versatile
; SET command -- if you prefer not to write a SET for your
; modem, you may delete the code from here to the END statement.
; Control is passed here after MEX parses a SET command.
SETCMD: MVI C,SBLANK ;any arguments?
CALL MEX
JC SETSHO ;if not, go print out values
LXI D,CMDTBL ;parse command
CALL TSRCH ;from table
PUSH H ;any address on stack
RNC ;if we have one, execute it
POP H ;nope, fix stack
SETERR: LXI D,SETEMS ;print error
MVI C,PRINT
CALL MEX
RET
SETEMS: DB CR,LF,'SET command error',CR,LF,'$'
; SET command table ... note that tables are constructed of command-
; name (terminated by high bit=1) followed by word-data-value returned
; in HL by MEX service processor LOOKUP. Table must be terminated by
; a binary zero.
; Note that LOOKUP attempts to find the next item in the input stream
; in the table passed to it in HL ... if found, the table data item is
; returned in HL; if not found, LOOKUP returns carry set.
CMDTBL: DB '?'+80H ;"set ?"
DW STHELP
DB 'BAU','D'+80H ;"set baud"
DW STBAUD
DB 'BIT','S'+80H ;"set bits"
DW STBITS
DB 'PARIT','Y'+80H ;"set parity"
DW STPAR
DB 'STO','P'+80H ;"set stop"
DW STSTOP
DB 'SHAK','E'+80H ;"set shake"
DW STSHAK
DB 0 ;<<=== table terminator
; SET <no-args>: print current statistics
SETSHO: LXI H,SHOTBL ;get table of SHOW subroutines
SETSLP: MOV E,M ;get table address
INX H
MOV D,M
INX H
MOV A,D ;end of table?
ORA E
RZ ;exit if so
PUSH H ;save table pointer
XCHG ;adrs to HL
CALL GOHL ;do it
CALL CRLF ;print newline
MVI C,CHEKCC ;check for console abort
CALL MEX
POP H ;it's done
JNZ SETSLP ;continue if no abort
RET
GOHL: PCHL
; table of SHOW subroutines
SHOTBL: DW BDSHOW
DW BITSH
DW PARSH
DW STPSH
DW SHKSH
DW 0 ;<<== table terminator
; SET ? processor
STHELP: LXI D,HLPMSG
MVI C,PRINT
CALL MEX
RET
; The help message
HLPMSG: DB CR,LF,'SET command, Ampro version:',CR,LF
DB CR,LF,' >SET BAUD 300, 450, 600, 1200, 2400, 4800, or 9600.'
DB CR,LF,' >SET BITS 5, 6, 7, or 8.'
DB CR,LF,' >SET PARITY ODD, EVEN, or NONE.'
DB CR,LF,' >SET STOP 1, or 2.'
DB CR,LF,' >SET SHAKE ON, or OFF.'
DB CR,LF,CR,LF,'$'
; SET BAUD processor
STBAUD: MVI C,BDPARS ;function code
CALL MEX ;let MEX look up code
JC SETERR ;invalid code
CALL PBAUD ;no, try to set it
JC SETERR ;not-supported code
BDSHOW: CALL ILPRT ;display baud
DB ' Baud rate: ',0
LDA MSPEED
MVI C,PRBAUD ;use MEX routine
CALL MEX
RET
; SET BITS processor
STBITS: LXI D,BITTBL ;load lookup table
CALL TSRCH ;look for 7 or 8
JC SETERR ;if not found
MOV C,L ;save selection value
LHLD 1 ;get bios address
MVI L,SIOB3 ;move to siob+3
MOV A,M ;wr5 info
ANI 9Fh ;mask
ORA C ;add selection
MOV M,A ;store it
MOV A,C ;get selection
RAL
MOV C,A ;shift selection left
MVI L,SIOB5 ;move to siob+5
MOV A,M ;wr3 info
ANI 3Fh ;mask
ORA C
MOV M,A ;store it
CALL IOINIT ;do it.
BITSH: CALL ILPRT
DB ' Data bits: ',0
LHLD 1 ;get bios location
MVI L,SIOB3 ;move to siob+3
MOV A,M ;get current value
ANI 60h
CPI 60h
JZ BITSH8
CPI 20h
JZ BITSH7
CPI 40h
JZ BITSH6
CALL ILPRT
DB '5',0 ;show a 5
RET
BITSH6 CALL ILPRT
DB '6',0 ;show a 6
RET
BITSH7 CALL ILPRT
DB '7',0 ;show a 7
RET
BITSH8: CALL ILPRT
DB '8',0
RET
BITTBL: DB '5'+80h
DW 00h
DB '6'+80h
DW 40h
DB '7'+80h
DW 20h
DB '8'+80h
DW 60h
DB 0
;
STPAR: LXI D,PARTBL
CALL TSRCH
JC SETERR
MOV C,L
LHLD 1 ;get bios address
MVI L,SIOB1 ;go to siob+1
MOV A,M
ANI 0FCh
ORA C
MOV M,A
CALL IOINIT
PARSH: CALL ILPRT
DB ' Parity: ',0
LHLD 1 ;get bios address
MVI L,SIOB1
MOV A,M
ANI 03h ;mask
CPI 01h ;check for none
JZ PARSHO
CPI 03h
JZ PARSHE
CALL ILPRT
DB 'none',0
RET
PARSHO CALL ILPRT
DB 'odd',0
RET
PARSHE: CALL ILPRT
DB 'even',0
RET
PARTBL: DB 'OD','D'+80h
DW 01h
DB 'EVE','N'+80h
DW 03h
DB 'NON','E'+80h
DW 00h
DB 0
STSTOP: LXI D,STPTBL
CALL TSRCH
JC SETERR
MOV C,L
LHLD 1 ;get bios address
MVI L,53h ;shift to bios+1
MOV A,M
ANI 0F3h
ORA C
MOV M,A
CALL IOINIT
STPSH: CALL ILPRT
DB ' Stop bits: ',0
LHLD 1 ;get bios address
MVI L,53h ;shift to bios+1
MOV A,M
ANI 0Ch
CPI 0Ch
JZ STPSH2
CALL ILPRT
DB '1',0
RET
STPSH2: CALL ILPRT
DB '2',0
RET
STPTBL: DB '1'+80h
DW 04h
DB '2'+80h
DW 0Ch
DB 0
STSHAK: LXI D,SHKTBL ;get handshake table
CALL TSRCH ;search it for parameter
JC SETERR ;if not found
MOV C,L ;temp store value in C
LHLD 1 ;get location of BIOS
MVI L,6Dh ;location of HSB in bios
MOV M,C ;put new value in it
SHKSH: CALL ILPRT
DB ' Hand Shake: ',0
LHLD 1 ;get bios location
MVI L,6DH ;location of HSB in bios
MOV A,M ;get current value
CPI 1
JZ SHKSHY ;show a yes
CALL ILPRT
DB 'off',0
RET
SHKSHY CALL ILPRT
DB 'on',0
RET
SHKTBL DB 'OF','F'+80h
DW 0
DB 'O','N'+80h
DW 1
DB 0
;----------------------------------------------------------
; Compare next input-stream item in table @DE; CY=1
; if not found, else HL=matched data item
TSRCH: MVI C,LOOKUP ;get function code
JMP MEX ;pass to MEX processor
; Print in-line message ... blows away C register
ILPRT: MVI C,ILP ;get function code
JMP MEX ;go do it
;------------------------------------------------------------
; End of AMPRO MEX modem overlay
;------------------------------------------------------------
END