REV EQU 1 ;overlay revision number LVL EQU 'D' ;overlay level ( as in Revision 0.1A ) ; ; Overlay for the Spectrum +3 running CP/M Plus from Locomotive Software ; and fitted with the Spectre Comms Pack modem interface (optional). ; ; This overlay is a .zsm file and needs to be assembled with the ZSM ; assembler. Use the following procedure: ; 1: Assemble:- ZSM QTSCP01D.@@@ (for default drives.) ; 2: Now patch the file over QTERM.COM with MLOAD or similar ; eg. MLOAD QTERMSCP=QTERM.COM,QTSCP01D.HEX ; ; Author F.T.Gowen, based upon his version of a MEX overlay and R.Marks' ; ZCN patch file. ; Last Revision: 0.1D 28/11/1995 FTG - Fixed Mode Table (Handshake ; always on) & FIND_FID implemented ; 0.1C 22/11/1995 FTG - Selectable Baud & Mode Tables ; 0.1B 20/11/1995 FTG - Baud & Mode setting added ; 0.1A 19/11/1995 FTG ; BELL EQU 07H ;bell LF EQU 0AH ;linefeed CR EQU 0DH ;carriage return ESC EQU 1BH ;escape QESC EQU 1CH ;QTERM escape (to command) ; YES EQU 0FFH NO EQU 0 BREAK EQU 0FFH DELAY EQU 0FEH ; ; Spectrum definitions ; BDOS EQU 0005H ;standard BDOS BUFFER EQU 0080H ; BDOS calls: CONIN EQU 1 CONOUT EQU 2 AUXIN EQU 3 AUXOUT EQU 4 AXINST EQU 7 ;Not CP/M 80 - deduced from ZCN usage AXOTST EQU 8 ; " - " PRINT EQU 9 ; CDSAINIT EQU 00B6H CDSABAUD EQU 00B9H CDSAPARM EQU 00BCH FIND_FID EQU 00ECH COMMON EQU 0C000H ;Bottom of Common Memory Area ; SERIAL EQU 0 ;SERIAL port, ie. Spectre Comms Pack SIO EQU 8 ;SIO port. ; ; QTERM calls SCROUT EQU 0109H DECOUT EQU 010CH ILPRMT EQU 027CH ; ORG 110H MODIST: PUSH BC LD C,AXINST CALL BDOS POP BC AND A RET ; ORG 120H MODIN: LD C,AUXIN JP BDOS ; Make use of unused space FIDSTR: DEFB 'SERIAL $' ; ORG 130H MODOST: PUSH BC LD C,AXOTST CALL BDOS POP BC AND A RET ; ORG 140H MODOUT: LD C,AUXOUT LD E,A JP BDOS ; Make use of unused space again USERF: JP USERF ;patched by INITMOD! DEVICE: DEFW SIOPAR ; ; No break for now! ORG 150H SBREAK: RET ; ORG 160H EBREAK: RET ; ; Hang-up a Hayes Compatible Modem ORG 170H DTROFF: RET DEFB S1E-S1S S1S: DEFB DELAY DEFB DELAY DEFB '+++' DEFB DELAY DEFB DELAY DEFB 'ATH0' DEFB CR S1E: ; ; Set the baud-rate via USER Function CDSABAUD ORG 190H SETBD: LD H,A LD L,H PUSH BC CALL USERF CDSB: DEFW CDSABAUD ;Default SIO: SERIAL's patched via FIND_FID POP BC RET ; ORG 1A0H BAUDTB: DEFB 0,NO ;38400 DEFB 0,NO ;19200 DEFB 0EH,YES ; 9600 DEFB 0CH,YES ; 4800 DEFB 0AH,YES ; 2400 DEFB 08H,YES ; 1200 DEFB 07H,YES ; 600 DEFB 06H,YES ; 300 ; ; Decode and set the mode via USER Function CDSAINIT ORG 1B0H SETMOD: LD D,A LD A,0FFH ;Handshake always on PUSH AF LD A,D AND 0F0H ;Tx & Rx bits RRA RRA RRA RRA LD H,A LD L,A JP SETMOD2 ; ORG 1C0H ; Mode table for both SIO & SERIAL MODETB: DEFB 70H ;7N1 DEFB 80H ;8N1 DEFB 78H ;7N2 DEFB 88H ;8N2 DEFB 72H ;7E1 DEFB 72H ;8E1 - NOT SUPPORTED --> 7E1 DEFB 7AH ;7E2 DEFB 7AH ;8E2 - NOT SUPPORTED --> 7E2 DEFB 71H ;7O1 DEFB 71H ;8O1 - NOT SUPPORTED --> 7O1 DEFB 79H ;7O2 DEFB 79H ;8O2 - NOT SUPPORTED --> 7O2 ; ORG 1CDH XFERSZ: DB 4 ;4 K disk transfers SPEED: DB 4 ;3.6 MHz clock ESCAPE: DB QESC ;Q-term's escape char. SIGNON: DEFB 'ZX+3 & S.C.P. (' DEFB REV/10+'0','.',REV .MOD. 10+'0',LVL DEFB ')',CR,LF,0 ; ORG 1F0H CLRS: DEFB ESC,'H',ESC,'E',0 ; ORG 200H MOVETO: PUSH HL LD C,ESC CALL SCROUT LD C,'Y' CALL SCROUT POP HL PUSH HL LD A,H CALL POFF POP HL LD A,L POFF: ADD A,20H LD C,A JP SCROUT ; ; Make use of spare space! INITDEV:CALL USERF CDSI: DEFW CDSAINIT ;Default SIO: SERIAL's patched via FIND_FID RET MSG1: DEFB 'NOT ' MSG2: DEFB 'FOUND',CR,LF,'$' ; BBRIT EQU 00H ;Not available BDIM EQU 00H ;Not available BDLLN EQU 04H BINLN EQU 08H BDLCH EQU 10H BINCH EQU 00H ;Not available BCLEL EQU 40H BCLES EQU 80H ; ORG 22FH TCBITS: DEFB BBRIT+BDIM+BDLLN+BINLN+BDLCH+BINCH+BCLEL+BCLES ; ORG 230H BRITES: DEFB 0 ; ORG 238H DIMS: DEFB 0 ; ORG 240H DLSTR: DEFB ESC,'M',0 ; ORG 248H ILSTR: DEFB ESC,'L',0 ; ORG 250H DCSTR: DEFB ESC,'N',0 ; ORG 258H ICSTR: DEFB 0 ; ORG 260H CEOL: DEFB ESC,'K',0 ; ORG 268H CEOS: DEFB ESC,'J',0 ; ORG 270H ENTRY: JP INITMOD EXIT: JP GOODBYE USER: JP GETDEV KBMAP: RET ; ORG 280H GOODBYE: ;Set DTR low to disconnect some modems LD A,80H ;drop DTR CALL INITDEV LD BC,000FH LOOP1: LD B,C LOOP2: DJNZ LOOP2 DEC C JR NZ,LOOP1 LD A,7FH ;raise DTR CALL INITDEV LD C,PRINT LD DE,BYESTR ;return to normal screen mode etc. JP BDOS ; INITMOD: ;initialisation LD HL,(0001H) ;address of WBOOT LD DE,87 ;offset of USERF ADD HL,DE LD DE,USERF LD BC,3 LDIR ;copy to where we can use it easily LD C,PRINT LD DE,INISTR ;set screen mode 2 etc. CALL BDOS LD HL,COMMON LD DE,SAVCOM LD BC,8 LDIR ;Save used area of Common Memory LD DE,FIDSTR PUSH DE LD C,PRINT CALL BDOS POP HL LD DE,COMMON LD BC,8 LDIR ;Copy FIDSTR ("SERIAL ") into Common Memory LD DE,COMMON ;Now attempt to find SERIAL.FID AND A ;Clear carry flag CALL USERF DEFW FIND_FID JR NC,NOTFND ;SERIAL.FID not found, print error message PUSH HL LD C,PRINT LD DE,MSG2 CALL BDOS POP HL LD DE,32 ;FID's private jumpblock offset ADD HL,DE ;HL --> JP CDSAINIT for SERIAL LD (SCDSI),HL INC HL INC HL INC HL ;HL --> JP CDSAPARM for SERIAL LD (SCDSP),HL INC HL INC HL INC HL ;HL --> JP CDSABAUD for SERIAL LD (SCDSB),HL JR RCVRCOM NOTFND: LD C,PRINT LD DE,MSG1 CALL BDOS RCVRCOM:LD HL,SAVCOM LD DE,COMMON LD BC,8 LDIR ;ReCoVeR saved COMmon memory data DEFAULT:LD BC,SIOPAR ;point to default pars. for SIO device NEWDEV: LD HL,DEVICE ;save device code LD (HL),C INC HL LD (HL),B LD A,(BC) ;Fetch parameters - Device Code (DEVLST Offset) INC BC PUSH BC LD HL,DEVLST LD E,A LD D,0 ADD HL,DE LD E,(HL) INC HL LD D,(HL) INC HL PUSH HL EX DE,HL LD DE,BAUDTB LD BC,16 LDIR ;Copy Baud rate table POP HL LD E,(HL) INC HL LD D,(HL) INC HL LD (CDSI),DE LD E,(HL) INC HL LD D,(HL) LD (CDSB),DE POP BC LD A,(BC) ; - Mode CALL SETMOD INC BC LD A,(BC) ; - Baud Rate (Tx & Rx) JP SETBD ; SETMOD2:LD A,D AND 03H LD E,A ;Parity LD A,D AND 0CH SRL A SRL A LD D,A ;Stop bits POP AF ;Handshake PUSH BC CALL INITDEV POP BC RET ; GETDEV: CALL ILPRMT DEFB ESC,'H',ESC,'E' ;Clear screen DEFB 'Select Option:',CR,LF DEFB CR,LF DEFB '1 - AUX:=SERIAL,',CR,LF DEFB CR,LF DEFB '2 - AUX:=SIO.',CR,LF DEFB 0 LD HL,BUFFER RDCHAR: LD A,(HL) CP ' ' ;space JR NZ,NOTSPC ;found 1st. non-space char. INC HL JR RDCHAR NOTSPC: CP '3' RET NC ;> 2, do nothing CP '1' RET C ;< 1, do nothing JR NZ,NOTSER LD BC,SERPAR JP NEWDEV NOTSER: CP '2' JP Z,DEFAULT RET ; INISTR: DEFB ESC,'0',ESC,'32',ESC,'41',ESC,'51' DEFB ESC,'H',ESC,'E$' ; BYESTR: DEFB ESC,'1',ESC,'32',ESC,'40',ESC,'50' DEFB ESC,'H',ESC,'E$' ; SAVCOM: DEFS 8 ; ; Default device paramaters SERPAR: DEFB SERIAL,80H,08H ;DEVLST offset, 8N1, 1200 Baud ; SIOPAR: DEFB SIO,80H,0EH ;DEVLST offset, 8N1, 9600 Baud ; DEVLST: DEFW SERBDT SCDSI: DEFW CDSAINIT ;Overwritten with the correct SCDSB: DEFW CDSABAUD ;addresses if the call to FIND_FID SCDSP: DEFW CDSAPARM ;is successful DEFW SIOBDT DEFW CDSAINIT DEFW CDSABAUD DEFW CDSAPARM ; ; Baud rate tables SERBDT: DEFB 0,NO ;38400 DEFB 0,NO ;19200 DEFB 0,NO ; 9600 DEFB 0CH,YES ; 4800 DEFB 0,NO ; 2400 DEFB 08H,YES ; 1200 DEFB 0,NO ; 600 DEFB 06H,YES ; 300 ; SIOBDT: DEFB 0,NO ;38400 DEFB 0,NO ;19200 DEFB 0EH,YES ; 9600 DEFB 0CH,YES ; 4800 DEFB 0AH,YES ; 2400 DEFB 08H,YES ; 1200 DEFB 07H,YES ; 600 DEFB 06H,YES ; 300 ; ; NOTE: MUST TERMINATE PRIOR TO 04FFH; END