home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
MODEMS
/
ZMODEM
/
ZMO-SN05.Z80
< prev
next >
Wrap
Text File
|
2000-06-30
|
15KB
|
583 lines
; PROGRAM: ZMO-SN05.Z80
; AUTHOR: Richard Kopplin
; VERSION: 1.5
; DATE: 25 Oct, 1988
;-----------------------------------------------------------------------
; This overlay is set up for a Sanyo MBC-1200/1250
; UART 8251 NO baud rate generator
;-----------------------------------------------------------------------
; 89/04/12 - Modified to ZMP v1.5 - George Conover
; 89/03/15 - Removed the beginning remarks to make the file
; smaller. If you need the remarks there are in the
; file ZMP-BLNK.Z80 - George Conover
; 89/03/14 - Modified to ZMP v1.4 - George Conover
; 88/10/10 - Modified to ZMP v1.3 - Ron Murray
; 88/09/15 - Modified to ZMP v1.2 - Ron Murray
; 88/09/14 - First version of this file - Richard Kopplin
;
; Written by - Richard Kopplin, 805-486-6847, Port Hueneme, CA
;-----------------------------------------------------------------------
; NOTES: On use of ZMP with the Sanyo MBC-1200/1250
; Although the Sanyo has no baud rate generator the program will select
; between 300 or 1200 baud. To get 300 you must select 300 any other baud
; rate will program the UART for 1200. Selection of 1 or 2 stop bits, Odd
; Even or No parity and 7 or 8 bit selection is also enabled. This feature
; can be disabled by deleting the call to "init2" in the "init" routine.
; The "userin:" routine redefines the Sanyo function keys, "userout:"
; restores the orginal Sanyo function keys when exiting ZMP. The definition
; table for the function keys while in ZMP is located in the "newkeys:" area
; just below "userout:".
; I could not get the screen print funciton to work with my printer.
; although if you had the "right" printer I'am sure it would work. What I did
; add here is a one line message with the overlay date and version.
;
;============================================================================
; User-set variables:
CLKSPD EQU 4 ; Processor clock speed in MHz
;Set the following two equates to the drive and user area which will contain
; ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
; (null) to locate them on the drive from which ZMP was invoked.
OVERDRIVE EQU 'A' ; Drive to find overlay files on ('A'-'P')
OVERUSER EQU 0 ; User area to find files
;------------------------------------------------------------------------------
MDDATA EQU 0ECH ; Modem data port for the Sanyo MBC-1200/1250
MDCTRL EQU 0EDH ; the UART is an 8251, no baud rate control.
;============================================================================
; NOT user-set variables
USERDEF EQU 0145H ; Origin of this overlay. This address may
; change with subsequent revisions.
MSPEED EQU 05CH ; location of current baud rate.
OVSIZE EQU 0400H ; max size of this overlay
ESC EQU 1BH
CR EQU 0DH
LF EQU 0AH
BDOS EQU 5
.Z80 ; use z80 code
ASEG ; absolute
ORG USERDEF
CODEBGN EQU $
;Jump table for the overlay: do NOT change this
JUMPTAB:
JP SCRNPR ; screen print
JP MRD ; modem read with timeout
JP MCHIN ; get a character from modem
JP MCHOUT ; send a character to the modem
JP MORDY ; test for tx buffer empty
JP MIRDY ; test for character received
JP SNDBRK ; send break
JP CURSADD ; cursor addressing
JP CLS ; clear screen
JP INVON ; inverse video on
JP INVOFF ; inverse video off
JP HIDE ; hide cursor
JP SHOW ; show cursor
JP SAVECU ; save cursor position
JP RESCU ; restore cursor position
JP MINT ; service modem interrupt
JP INVEC ; initialise interrupt vectors
JP DINVEC ; de-initialise interrupt vectors
JP MDMERR ; test uart flags for error
JP DTRON ; turn DTR on
JP DTROFF ; turn DTR OFF
JP INIT ; initialise uart
JP WAIT ; wait seconds
JP MSWAIT ; wait milliseconds
JP USERIN ; user-defined entry routine
JP USEROUT ; user-defined exit routine
JP GETVARS ; get system variables
JP SETPORT ; Set port (0 or 1)
;
; Spare jumps for compatibility with future versions
;
JP SPARE ; spare for later use
JP SPARE ; spare for later use
JP SPARE ; spare for later use
JP SPARE ; spare for later use
JP SPARE ; spare for later use
JP SPARE ; spare for later use
;============================================================================
; Main code starts here
;
;Screen print function
SCRNPR:
CALL PRINT
DB 'Zmodem v1.5 overlay for Sanyo MBC-1200/1250 '
DB ' v0.1 dated 25 October 1988',CR,LF
DB 'Print screen function is not supported.',CR,LF,0
SPARE:
RET ; This ret used by both scrnpr and spare
; User-defined entry routine:
; Install a new function key table for the Sanyo MBC-1200/1250
USERIN:
LD HL,(0001H) ; Load address of warm boot
LD BC,0030H ; add offset for keytable
ADD HL,BC
LD BC,NEWKEYS ; load address of new key table
LD E,(HL) ; store normal keytable in de
LD (HL),C
INC HL
LD D,(HL)
LD (HL),B
LD (KEYADD),DE ; store address for normal keytable
RET
; User-defined exit routine: Reinstall normal function key table
USEROUT:
LD HL,(0001H) ; Load address of warm boot
LD BC,0030H ; add offset for keytable address
ADD HL,BC
LD BC,(KEYADD) ; load address of normal keytable
LD (HL),C ; and restore it in BIOS
INC HL
LD (HL),B
RET
KEYADD: DW 0 ; Temp storage of normal keytable address
NEWKEYS:
DB 08H,0,0,0,0,0,0,0 ; Brown "INS" key
DB CR, 0,0,0,0,0,0,0 ; Brown "ENTER" key
DB ESC,'1',0,0,0,0,0,0 ; PF1 - Macro key 1
DB ESC,'2',0,0,0,0,0,0 ; PF2 - Macro key 2
DB ESC,'3',0,0,0,0,0,0 ; PF3 - Macro key 3
DB ESC,'4',0,0,0,0,0,0 ; PF4 - Macro key 4
DB ESC,'5',0,0,0,0,0,0 ; PF5 - Macro key 5
DB ESC,'6',0,0,0,0,0,0 ; PF6 - Macro key 6
DB ESC,'7',0,0,0,0,0,0 ; PF7 - Macro key 7
DB ESC,'8',0,0,0,0,0,0 ; PF8 - Macro key 8
DB ESC,'9',0,0,0,0,0,0 ; PF9 - Macro key 9
DB ESC,'0',0,0,0,0,0,0 ; PF10 - Macro key 0
DB ESC,'K',0,0,0,0,0,0 ; PF11 - Display keyboard macros
DB ESC,'F',0,0,0,0,0,0 ; PF12 - Disk Operation
DB ESC,'D',0,0,0,0,0,0 ; PF13 - Disk Directory
DB ESC,'H',0,0,0,0,0,0 ; PF14 - HELP
DB ESC,'Q',0,0,0,0,0,0 ; PF15 - Quit/Exit program
DB ESC,'Z',0,0,0,0,0,0 ; Left arrow - Clear Screen
DB ESC,'M',0,0,0,0,0,0 ; Right arrow - Toggle capture mode
DB 'Q'-40H,0,0,0,0,0,0,0 ; Up arrow - ctrl Q
DB 'S'-40H,0,0,0,0,0,0,0 ; Down arrow - ctrl S
DB 'C'-40H,0,0,0,0,0,0,0 ; Left/up arrow - ctrl C
;============================================================================
; Modem control area: UART 8251 No baud rate generator
; -------------------------------------------------
; | DSR | syn | FE | OE | PE | TxE | RxR | TxR | Stauts format
; -------------------------------------------------
; | EH | IR | RTS | ER | SBRK| RxE | DTR | TxE | Command format
; -------------------------------------------------
; | S2 | S1 | EP | PEN | L2 | L1 | B2 | B1 | Commands
; -------------------------------------------------
;
; S2 S1 Bits EP PEN L2 L1 Bits B2 B1 Rate
; 0 0 ? 0 Odd 0 Disable 0 0 5 0 0 ?
; 0 1 1 1 Even 1 Enable 0 1 6 0 1 X1
; 1 0 1.5 1 0 7 1 0 X16
; 1 1 2 1 1 8 1 1 X64
;
;Get a character from the modem: return in HL
MCHIN: ; <== Insert your own code here
IN A,(MDDATA)
; <== End of your own code
LD L,A ; put in HL
LD H,0
OR A ; set/clear Z
RET
;Send a character to the modem
MCHOUT:
LD HL,2 ; get the character
ADD HL,SP
LD A,(HL)
; <== Insert your own code here
OUT (MDDATA),A
; <== End of your own code
RET ; done
;Test for output ready: return TRUE (1) in HL if ok
MORDY: ; <== Insert your own code here
LD HL,0
IN A,(MDCTRL)
BIT 0,A
JR Z,MORDY1
INC HL
; <== End of your own code
MORDY1: LD A,L ; set/clear Z
OR A
RET
;Test for character at modem: return TRUE (1) in HL if so
MIRDY: ; <== Insert your own code here
LD HL,0
IN A,(MDCTRL)
BIT 1,A
JR Z,MINDY1
INC HL
; <== End of your own code
MINDY1: LD A,L ; set/clear Z
OR A
RET
;Send a break to the modem: leave empty if your system can't do it
SNDBRK:
LD A,00001000B
OUT (MDCTRL),A
LD HL,300 ; wait 300 mS
CALL WAITHLMS
LD A,00110111B
OUT (MDCTRL),A
RET
;Test UART flags for error: return TRUE (1) in HL if error.
MDMERR: ; <== Insert your own code here
LD HL,0
IN A,(MDCTRL)
BIT 4,A
JR Z,MDMER1
LD A,00110111B ; if error reset UART
OUT (MDCTRL),A
INC HL
; <== End of your own code
MDMER1: LD A,L ; set/clear Z
OR A
RET
;Turn DTR ON
DTRON:
LD A,00110111B
OUT (MDCTRL),A
RET
;Turn DTR OFF
DTROFF:
LD A,00110101B
OUT (MDCTRL),A
RET
;Initialise the uart
INIT:
LD HL,2 ; get parameters
ADD HL,SP
EX DE,HL
CALL GETPARM ; in HL and save it in ..
LD (BRATE),HL ; baud rate
CALL GETPARM
LD (PARITY),HL ; parity
CALL GETPARM
LD (DATA),HL ; data bits (BINARY 7 or 8)
CALL GETPARM
LD (STOP),HL ; stop bits (BINARY 1 or 2)
; <== Insert your own code here
LD A,5 ; load mspeed with the current (default)
LD (MSPEED),A ; brate value if the new rate is valid
LD A,01000010B ; reset 8251 and leave DTR on
OUT (MDCTRL),A
LD A,01001110B ; 1 stop bit, parity disabled, 8 bits, X16
CALL INIT2 ; change UART default settings
OUT (MDCTRL),A
LD A,00110111B ; FIX, no reset, RTS on, Error reset,
OUT (MDCTRL),A ; no break, RX enable, DTR on, TX enable
RET ; <== End of your own code
; Change default UART settings to those set by ZMP escape commands
INIT2:
LD E,A ; save default settings 01001110b
LD A,(BRATE)
CP 1 ; if 300 baud; set bit 0, X64
JR NZ,INIT3
SET 0,E
LD (MSPEED),A ; change mspeed value for new baud rate
INIT3:
LD A,(DATA)
CP 7 ; if 7 data bits; reset bit 2
JR NZ,INIT4
RES 2,E
INIT4:
LD A,(PARITY)
CP 'O' ; if Odd parity; set bit 4, reset bit 5
JR NZ,INIT5
SET 4,E
RES 5,E
INIT5:
CP 'E' ; if Even parity; set bits 4 and 5
JR NZ,INIT6
SET 4,E
SET 5,E
INIT6:
LD A,(STOP)
CP 2 ; if 2 stop bits; set bit 7
JR NZ,INIT7
SET 7,E
INIT7:
LD A,E ; load new mode back in register a
RET
;--------------------------------------------------------------------------
STOP: DW 1 ; stop bits: 1 or 2
PARITY: DW 'N' ; parity: N, O or E
DATA: DW 8 ; data bits: 7 or 8
BRATE: DW 5 ; baud rate: see below
;--------------------------------------------------------------------------
; Values of brate for each baud rate allowed
;
; brate baud rate brate baud rate brate baud rate
; 0 110 5 1200 9 19200
; 1 300 6 2400 10 38400
; 2 450 7 4800 11 57600
; 3 600 8 9600 12 76800
; 4 710
;
; Set the port. ZMP supplies either 0 or 1 as a parameter.
;
setport:
ld hl,2 ; get port number
add hl,sp
ex de,hl
call getparm ; in HL (values are 0 and 1)
; <== Insert your own code here
; <== End of your own code
ret
;
;============================================================================
; Video terminal sequences for the Sanyo MBC-1200/1250
;Cursor addressing:
CURSADD:
LD HL,2 ; get parameters
ADD HL,SP
EX DE,HL
CALL GETPARM ; in HL
LD (ROW),HL ; row
CALL GETPARM
LD (COL),HL ; column
; <== Insert your own code here
; using values in row and col
CALL PRINT
DB ESC,'=',0 ; Sanyo leadin characters
LD A,(ROW) ; row first
ADD A,' ' ; add offset
CALL COUT
LD A,(COL) ; same for column
ADD A,' '
CALL COUT
; <== end of your own code
RET
ROW: DW 0 ; row
COL: DW 0 ; column
;Clear screen:
CLS:
CALL PRINT
DB 1AH,0
RET
;Inverse video on:
INVON:
CALL PRINT
DB ESC,'t4',0
RET
;Inverse video off:
INVOFF:
CALL PRINT
DB ESC,'t0',0
RET
;Turn off cursor:
HIDE:
CALL PRINT
DB ESC,'E',0
RET
;Turn on cursor:
SHOW:
CALL PRINT
DB ESC,'D',0
RET
;Save cursor position:
SAVECU:
RET
;Restore cursor position:
RESCU:
RET
;****************************************************************************
;Service modem interrupt:
MINT:
RET ; Not used by the Sanyo MBC-1200/1250
;Initialise interrupt vectors:
INVEC:
RET ; ditto
;De-initialise interrupt vectors:
DINVEC:
RET ; ditto
;****************** End of user-defined code ********************************
; Do not change anything below here.
;Modem character test for 100 ms
MRD:
PUSH BC ; save bc
LD BC,100 ; set limit
MRD1:
CALL MIRDY ; char at modem?
JR NZ,MRD2 ; yes, exit
LD HL,1 ; else wait 1ms
CALL WAITHLMS
DEC BC ; loop till done
LD A,B
OR C
JR NZ,MRD1
LD HL,0 ; none there, result=0
XOR A
MRD2:
POP BC
RET
; Inline print routine: destroys A and HL
PRINT:
EX (SP),HL ; get address of string
PLOOP:
LD A,(HL) ; get next
INC HL ; bump pointer
OR A ; done if zero
JR Z,PDONE
CALL COUT ; else print
JR PLOOP ; and loop
PDONE:
EX (SP),HL ; restore return address
RET ; and quit
;Output a character in A to the console
COUT:
PUSH BC ; save regs
PUSH DE
PUSH HL
LD E,A ; character to E
LD C,2
CALL BDOS ; print it
POP HL
POP DE
POP BC
RET
; Wait(seconds)
WAIT:
LD HL,2
ADD HL,SP
EX DE,HL ; get delay size
CALL GETPARM
; fall thru to..
; Wait seconds in HL
WAITHLS:
PUSH BC ; save bc
PUSH DE ; de
PUSH IX ; and ix
LD IX,0 ; then point ix to 0
; so we don't upset memory-mapped i/o
; Calculate values for loop constants. Need to have two loops to avoid
; 16-bit overflow with clock speeds above 9 MHz.
OUTERVAL EQU (CLKSPD / 10) + 1
INNERVAL EQU (6667 / OUTERVAL) * CLKSPD
WAIT10:
LD B,OUTERVAL
WAIT11:
LD DE,INNERVAL
WAIT12:
BIT 0,(IX) ; time-wasters
BIT 0,(IX)
BIT 0,(IX) ; 20 T-states each
BIT 0,(IX)
BIT 0,(IX)
BIT 0,(IX)
DEC DE
LD A,E
LD A,D
OR E
JR NZ,WAIT12 ; 150 T-states per inner loop
DJNZ WAIT11 ; decrement outer loop
DEC HL ; ok, decrement count in hl
LD A,H
OR L
JR NZ,WAIT10
POP IX ; done -- restore ix
POP DE ; de
POP BC ; and bc
RET
; Wait milliseconds
MSWAIT:
LD HL,2
ADD HL,SP
EX DE,HL ; get delay size
CALL GETPARM
; fall thru to..
; Wait milliseconds in HL
WAITHLMS:
PUSH DE
W1MS0:
LD DE,39 * CLKSPD
W1MS1:
DEC DE
LD A,D
OR E
JR NZ,W1MS1
DEC HL
LD A,H
OR L
JR NZ,W1MS0
POP DE
RET
; Get next parameter from (de) into hl
GETPARM:
EX DE,HL ; get address into hl
LD E,(HL) ; get lo
INC HL
LD D,(HL) ; then hi
INC HL ; bump for next
EX DE,HL ; result in hl, address still in de
RET
;
;Get address of user-defined variables
;
GETVARS:
LD HL,USERVARS
RET
USERVARS:
DW OVERDRIVE ; .OVR etc. drive/user
DW OVERUSER
USED: EQU ($ - USERDEF)
UNUSED: EQU OVSIZE - USED
IF ($ - USERDEF) GT OVSIZE
TOOBIG: JP ERRVAL ; Overlay too large!
ENDIF
END