; 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