title 'M7-C1670 (MDM) 1670 or HAYES overlay for C128 31 Oct 85' ; M7-C1670.ASM -- Commodore 128 overlay file for MDM7xx. ; ; overlay setup by Von Ertwine for C128 using 1670 modem ; or the 1011A (RS232 converter) ; 10/31/85 ; ; build new system by using to following: ; ; MAC M7-C1670 $pz-s ; MLOAD MDM7x0.com=MDM7x0.COM,M7-C1670.HEX ; ; = = = = = = = = = = = = = = = = = = page $*MACRO ; only show code produced by MAC not MACRO expansion ; eom equ 00h ; end of message bell equ 07h ; bell lf equ 0Ah ; linefeed cr equ 0Dh ; carriage return esc equ 1Bh ; escape no equ 0 yes equ not(no) page ; ; C128 info ; dev$no: equ 6 XxD$config: equ 0fd4Eh ; bit 7 0=no parity 1=parity ; bit 6 0=mark/space 1=odd/even ; bit 5 0=space/even 1=mark/odd ; bit 1 0=1 stop bit 1=2 stop bits ; bit 0 0=7 data bits 1=8 data bits RS232$status: equ XxD$config+1 ; bit 7 1=send data, 0=no data ; bit 6 1=sending data now ; bit 5 1=recv que active ; bit 4 1=parity error ; bit 3 1=framing error ; bit 2 not used ; bit 1 receiving data now ; bit 0 data byte ready xmit$data: equ RS232$status+1 recv$data: equ xmit$data+1 ; MODRCVB: EQU 01H ; bit to test for receive MODRCVR: EQU 01H ; value when receive ready MODSNDB: EQU 80H ; bit to test for send MODSNDR: EQU 00H ; value when send ready data$port$a equ 0DD00h ; bit 2 TxD Data (output) data$port$b equ data$port$a+1 data$port$b$dir equ data$port$b+2 ; bit 7 Data Set Ready (input) ; bit 6 Clear to Send (input) ; bit 5 Place Phone On Hook (active low output) ; bit 4 Carrier Detect (active low input) ; bit 3 Ring Indicator (active low input) ; bit 2 Data Terminal Ready (active hi output) ; bit 1 Request to Send (active hi output) ; bit 0 Received Data (input) page ; setb macro ?N,?R db 0cbh,?N*8+?R+0C0h endm res macro ?N,?R db 0cbh,?N*8+?R+80h endm @chk macro ?DD if (?DD GT 7Fh) and (?DD LT 0FF80h) 'Displacement Error' endif endm jr macro ?N db 18h,?N-$-1 @chk ?N-$ endm jrz macro ?N db 28h,?N-$-1 @chk ?N-$ endm jrnz macro ?N db 20h,?N-$-1 @chk ?N-$ endm jrc macro ?N db 38h,?N-$-1 @chk ?N-$ endm jrnc macro ?N db 30h,?N-$-1 @chk ?N-$ endm inp macro ?R db 0EDh,?R*8+40h endm outp macro ?R db 0EDh,?R*8+41h endm page ORG 100H DS 3 ;(for "JMP START" instruction) ; PMMIMODEM: DB NO ;yes=PMMI S-100 Modem 103H SMARTMODEM: DB yes ;yes=HAYES Smartmodem, no=non-PMMI 104H TOUCHPULSE: DB 'T' ;T=touch, P=pulse (Smartmodem-only) 105H CLOCK: DB 11 ;clock speed in MHz x10, 25.5 MHz max. 106H ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc. 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 BBS. CRDLY: DB 5 ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H ;default time for extra wait after CRLF ;in terminal mode file transfer NOOFCOL: DB 5 ;number of DIR columns shown 10AH SETUPTST: DB YES ;yes=user-added Setup routine 10BH SCRNTEST: DB yes ;Cursor control routine 10CH ACKNAK: DB YES ;yes=resend a record after any non-ACK 10DH ;no=resend a record after a valid NAK BAKUPBYTE: DB yes ;yes=change any file same name to .BAK 10EH CRCDFLT: DB YES ;yes=default to CRC checking 10FH TOGGLECRC: DB YES ;yes=allow toggling of CRC to Checksum 110H CONVBKSP: DB no ;yes=convert backspace to rub 111H TOGGLEBK: DB YES ;yes=allow toggling of bksp to rub 112H ADDLF: DB YES ;no=no LF after CR to send file in 113H ;terminal mode (added by remote echo) TOGGLELF: DB YES ;yes=allow toggling of LF after CR 114H TRANLOGON: DB YES ;yes=allow transmission of logon 115H ;write logon sequence at location LOGON SAVCCP: DB no ;yes=do not overwrite CCP 116H LOCONEXTCHR: DB NO ;yes=local command if EXTCHR precedes 117H ;no=external command if EXTCHR precedes TOGGLELOC: DB YES ;yes=allow toggling of LOCONEXTCHR 118H LSTTST: DB no ;yes=printer available on printer port 119H XOFFTST: DB YES ;yes=check for XOFF from remote while 11AH ;sending a file in terminal mode XONWAIT: DB NO ;yes=wait for XON after CR while 11BH ;sending a file in terminal mode TOGXOFF: DB YES ;yes=allow toggling of XOFF checking 11CH IGNORCTL: DB no ;yes=CTL-chars above ^M not displayed 11DH EXTRA1: DB 0 ;for future expansion 11EH EXTRA2: DB 0 ;for future expansion 11FH BRKCHR: DB 'V'-40H ;^V(^@) = Send a 300 ms. break tone 120H NOCONNCT: 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 UNSAVE: DB 'R'-40H ;^R = Close input text buffer 124H TRANCHR: DB 'T'-40H ;^T = Transmit file to remote 125H SAVECHR: DB 'Y'-40H ;^Y = Open input text buffer 126H EXTCHR: DB 'O'-40H ;^O(^^) = Send next character 127H ; ; DS 2 ; used by PMMI 128H IN$MODCTL1: ; get the status bits 12AH lda RS232$status ret ; ; TABLE OF BAUDRATE PARAMETERS ; BAUD$TABLE: db 0 ; 0 110 (not used) db 6 ; 1 300 db 0 ; 2 450 (not used) db 7 ; 3 600 db 0 ; 4 710 (not used) db 8 ; 5 1200 ; ; ; OUT$MODDATP: ;out modem data port 134H sta xmit$data push h lxi h,RS232$status jmp out$c128$cont IN$MODDATP: ;in modem data port 13EH lda recv$data push h lxi h,RS232$status jmp in$c128$cont ANI$MODRCVB: ANI MODRCVB ! RET ;bit to test for receive ready 148H CPI$MODRCVR: CPI MODRCVR ! RET ;value of receive bit when rdy 14BH ANI$MODSNDB: ANI MODSNDB ! RET ;bit to test for send ready 14EH CPI$MODSNDR: CPI MODSNDR ! RET ;value of send bit when ready 151H ; PMMI Modem Vectors (not used by C128) ; DS 6 ; 154H ; ; used for C128 (no PMMI modem) (6 bytes) ; out$c128$cont: ; 154H setb 7,m db 21h ; LXI H,(res 0,m) ; in$c128$cont: ; 157H res 0,m pop h OUT$MODCTL1: ret ! nop ! nop ;out modem control port 15AH OUT$MODCTL2: ret ! nop ! nop ;out modem status port 15DH ; LOGONPTR: DW LOGON ;for user message. 160H jmp$dial ds 3 ; 162H jmp$disconnect ds 3 ; 165H JMP$GOODBYE: JMP GOODBYE ; 168H JMP$INITMOD: JMP INITMOD ;go to user written routine 16BH RET ! NOP ! NOP ;(by-passes PMMI routine) 16EH RET ! NOP ! NOP ;(by-passes PMMI routine) 171H RET ! NOP ! NOP ;(by-passes PMMI routine) 174H JMP$SETUPR: JMP SETUPR ; 177H JMP$SPCLMENU: JMP SPCLMENU ; 17AH JMP$SYSVER: JMP SYSVER ; 17DH JMP$BREAK: JMP SENDBRK ; 180H ; ; ; Do not change the following six lines. ; JMP$ILPRT: DS 3 ; 183H JMP$INBUF: DS 3 ; 186H JMP$INLNCOMP: DS 3 ; 189H JMP$INMODEM DS 3 ; 18CH JMP$NXTSCRN: DS 3 ; 18FH JMP$TIMER: DS 3 ; 192H ; ; ; Clear sequences -- CLREOS is clear to end of screen, CLRSCRN is clear ; entire screen. Last entry must be 0. Any other 0's act as NOP's. ; CLREOS: CALL JMP$ILPRT ; 195H DB esc,'Y',eom SPCLMENU: ret db 0,0 ; 19DH ; CLRSCRN: CALL JMP$ILPRT ; 19EH DB 'Z'-40h,eom ret db 0,0,0 ; 1A6H ; ; ; SYSVER: CALL JMP$ILPRT ; 1A7H DB 'C-128 Ver. for 1670 or 1011A ',cr,lf,eom RET ;..... ; ; ;----------------------------------------------------------------------- ; ; NOTE: You can change the SYSVER message to be longer or shorter. The ; end of your last routine should terminate by 0400H (601 bytes ; available after start of SYSVER) if using the Hayes Smartmodem ; or by address 0C00H (2659 bytes) otherwise. ; ;----------------------------------------------------------------------- ; ;..... ; ; ; C128 initialization -- set baudrate. ; INITMOD: mvi a,1 ; set default to 8 bits no parity sta XxD$config call set$default ; set default to 1200 baud lxi b,data$port$b$dir mvi a,6h outp a mvi c,low(data$port$b) inp a ori 6 ; set DTR bit (active hi) outp a ret ; ; This routine sends a 300 ms. break tone and sets DTR low for the same ; length of time to disconnect some modems such as the Bell 212A, etc. ; GOODBYE: ; TURN OFF DTR push b lxi b,data$port$b inp a ani not(6) ; clear DTR and CTS bits outp a call sendbrk ; send 300ms break inp a ori 6 ; set DTR and CTS bits outp a pop b mvi a,6 ; set BAUD RATE back to 300 jmp reset$baud ; ..so the system runs faster ; call/ret ; ; ; This routine allows a 300 ms. break tone to be sent to reset some ; time-shar computers. ; SENDBRK: di ; system will run faster without push b ; ..interrupts lxi b,data$port$a inp a ani 0FBh ; send a break tone will be cleared outp a ; ..when interrupts turned on mvi b,3 ; WAIT at least 300 MS. call jmp$timer ; ..(system running fast) pop b ei ; re-enable interrupts. will ret ; ..clear break. ; ; Setup routine to allow changing modem speed with the SET command. ; SETUPR: CALL JMP$ILPRT ; the 1011A is an RS232 card DB 'Device Type (1670,1011A) ',0 call read$buffer CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB '1011',0 jnc set$1011 ; Cy=0 if match CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB '1670',0 jrc setupr set$T$P: call JMP$ILPRT db 'Touch or Pulse (T,P) ',0 call read$buffer CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'T',0 lxi h,'T'*256+YES jrnc set$rate CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'P',0 jrc set$T$P set$pluse: lxi h,'P'*256+YES set$rate: shld SMARTMODEM ; L=smartmodem, H=touch/pluse mvi a,1 sta XxD$config ; set 8 bits no parity set$rate$loop: CALL JMP$ILPRT DB 'Baud Rate (300,1200) ',0 call read$buffer CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB '300',0 lxi h,17+100h ; clock=1.7, mspeed=1 JRNC set$baud ; CALL JMP$INLNCOMP DB '600',0 lxi h,15+300h ; clock=1.5, mspeed=3 JRNC set$baud CALL JMP$INLNCOMP DB '1200',0 JRC set$rate$loop set$default: lxi h,11+500h ; clock=1.1, mspeed=5 ; set$baud: shld CLOCK ; L=CLOCK, H=MSPEED mov e,h MVI D,0 LXI H,BAUD$TABLE DAD D MOV A,M ; get BAUD RATE byte reset$baud: push psw mvi e,3ch ; offset to jmp devtbl call vector$1 ; rets HL=char device table start lxi d,dev$no*8+7 ; offset to RS232 baud rate dad d ; point to RS232 baud rate byte pop psw mov m,a ; change baud rate mvi c,dev$no ; init RS232 baud rate mvi e,3fh ; offset to jmp ?cinit vector$1: lhld 01 mov l,e ipchl: pchl ; (call/ret) set$1011: lxi h,'P'*256+NO call set$rate set$num$bits: CALL JMP$ILPRT DB 'Number Bits (7,8) ',0 call read$buffer CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB '7',0 mvi l,0 JRNC set$7 ; MATCH found CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB '8',0 JRC set$num$bits ; wait for valid input inr l ; L=1 set$7: bad$parity: CALL JMP$ILPRT DB 'Parity (None,Odd,Even,Mark,Space) ',0 call read$buffer CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'N',0 mvi a,00000000b JRNC set$parity ; CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'O',0 mvi a,11100000b JRNC set$parity ; CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'E',0 mvi a,11000000b JRNC set$parity ; CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'M',0 mvi a,10100000b JRNC set$parity ; CALL JMP$INLNCOMP ; compare to BAUDBUF+2 DB 'S',0 JRC bad$parity ; mvi a,10000000b set$parity: ora l ; add in the number of bits sta XxD$config ret read$buffer: LXI D,BAUDBUF ; point to new input buffer CALL JMP$INBUF inx d inx d ret ; ; ; BAUDBUF: DB 10,0 DS 10 ; You can put in a message at this location which can be called up with ; CTL-O if TRANLOGON has been set TRUE. You can put in several lines if ; desired. End with a 0. ; ; LOGON: DB ' C128 running MDM under CP/M 3.0 ',CR,LF,0 ; ; ; ; NOTE: MUST TERMINATE PRIOR TO 0400H (with Smartmodem) ; 0C00H (without Smartmodem) ; END ;