title 'MXO-C128.ASM -- Commodore 128 overlay for MEX 19 Nov 85' $*MACRO ; only show code produced by MAC not MACRO expansion ; ; You will want to look this file over carefully. There are a number of ; options that you can use to configure the program to suit your taste. ; ; Edit this file for your preferences then follow the "TO USE:" example ; shown below. ; ; Use the "SET" command to change the baudrate when desired. It starts ; out at 1200 baud when the program is first called up. ; ; = = = = = = = = = = = = = = = = = = ; 11/13/85 - MEXified overlay - Von Ertwine ; = = = = = = = = = = = = = = = = = = ; ; 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 ; ; MEX service processor stuff ; MEX EQU 0D00h ;address of the service processor ESCCHR EQU 0D1Fh ;Terminal Mode escape char (1Bh=ESC) XSIZE EQU 0D23h ;transfer buffer size QUEUE EQU 0D51h ;enable/disable queueing (1/0) 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 ; PRINT EQU 9 ;MEX/BDOS print-string function call page ; bit macro ?N,?R db 0cbh,?N*8+?R+040h endm 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 ; ; ; Change the clock speed to suit your system ; DS 3 ;(for "JMP START" instruction) ; local$config: db 01h ; default to 8 bit no parity 1 stop 103H mdm$tp: db 8Ah ; bit (default 1670 with 1200 or 300) 104H ; 7 (1670 if set) ; 6 (1650 or 1660 if set) ; 5 (1660 if set) ; 4 (supports CD if clear {1650,1660}) ; 3 (set if 1200 baud is supported) ; 2 (set if 600 baud is supported) ; 1 (set if 300 baud is supported) ; 0 (set if 110 baud is supported) TPULSE: DB 'T' ;T=touch, P=pulse (Smartmodem-only) 105H CLOCK: DB 13 ;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 COLUMS: DB 5 ;number of DIR columns shown 10AH SETFLG: DB YES ;yes=user-added Setup routine 10BH SCRTST: DB YES ;Cursor control routine 10CH DB YES ;yes=resend a record after any non-ACK 10DH ;no=resend a record after a valid NAK BAKFLG: DB NO ;yes=change any file same name to .BAK 10EH CRCDFL: DB YES ;yes=default to CRC checking 10FH TOGCRC: DB YES ;yes=allow toggling of CRC to Checksum 110H CVTBS: DB no ;yes=convert backspace to rub 111H TOGLBK: 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) TOGLF: DB YES ;yes=allow toggling of LF after CR 114H DB NO ;yes=allow transmission of logon 115H ;write logon sequence at location LOGON SAVCCP: DB YES ;yes=do not overwrite CCP 116H DB NO ;yes=local command if EXTCHR precedes 117H ;no=external command if EXTCHR precedes DB YES ;yes=allow toggling of LOCONEXTCHR 118H LSTTST: DB no ;yes=allow toggling of printer on/off 119H XOFTST: DB YES ;yes=chcks for XOFF from remote while 11AH ;sending a file in terminal mode XONWT: DB NO ;yes=wait for XON after CR while 11BH ;sending a file in terminal mode TOGXOF: DB YES ;yes=allow toggling of XOFF checking 11CH IGNCTL: DB no ;yes=CTL-chars above ^M not displayed 11DH EXTRA1: DB 0 ;for future expansion 11EH EXITCHR: DB 'E'-40H ;^E = Exit to main menu 11FH BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone 120H NOCONN: 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 TRNCHR: DB 'T'-40H ;^T = Transmit file to remote 125H SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer 126H EXTCHR: DB '^'-40H ;^^ = Send next character 127H ; ; DS 2 ; 128H INCTL1: lda RS232$status ;get the status bits 12Ah ret show$baud: ; 12Eh jmp disp$rate ;display current baud rate ds 3 ; OTDATA: ;out modem data port 134H sta xmit$data push h lxi h,RS232$status jmp out$c128$cont INPORT: ;in modem data port 13EH lda recv$data push h lxi h,RS232$status jmp in$c128$cont MASKR: ani modrcvb ;bit to test for receive ready 148H ret TESTR: cpi modrcvr ;value of receive bit when rdy 14BH ret MASKS: ani modsndb ;bit to test for send ready 14EH ret TESTS: cpi modsndr ;value of send bit when ready 151H ret ds 6 ; 154H OUTMODCT1: ret ! nop ! nop ;out modem control port 15AH OUTMODCT2: ret ! nop ! nop ;out modem status port 15DH ; ; DS 2 ;Not used by MEX 160H DS 6 ; 162H GOODBV: JMP GOODBY ; 168H INMODV: JMP NITMOD ;go to user written routine 16BH NEWBDV: JMP NEWBAUD ;Change baudrate 16EH RET ! NOP ! NOP ;(by-passes PMMI routine) 171H RET ! NOP ! NOP ;(by-passes PMMI routine) 174H SETUPV: JMP SETCMD ; 177H DS 3 ; 17AH VERSNV: JMP SYSVER ; 17DH BREAKV: JMP SBREAK ; 180H ; ; ; Do not change the following six lines. ; ILPRTV: DS 3 ; 183H INBUFV: DS 3 ; 186H ILCMPV: DS 3 ; 189H INMDMV: DS 3 ; 18CH DS 3 ; 18FH TIMERV: DS 3 ; 192H ; ; Clear sequences -- CLREOS is clear to end of screen, CLRSCRN is clear ; entire screen. ; CLREOS: mvi c,ILP call mex db esc,'Y',eom RET ; CLS: mvi c,ILP call mex db 'Z'-40h,eom ret nop ; ; SYSVER: mvi c,ILP ; 1A7H call mex db 'Version for Commodore 128' db cr,lf,eom ret ; ; out$c128$cont: setb 7,m pop h ret ; ; in$c128$cont: res 0,m pop h ret page ; ; ; This routine allows a 300 ms. break tone to be sent to reset some ; time-shar computers. ; SBREAK: lda rs232$status ani 01000010b ; any RS232 activity now? jrnz SBREAK ; yes, wait until done. di ; prevent intterupts from push b ; ..resetting break lxi b,data$port$a inp a ani 0FBh ; send a break tone will be cleared outp a ; ..when interrupts turned on mvi b,8 ; time flies with-out intterrupts on mvi c,TIMER call mex pop b ei 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. ; GOODBY: ; TURN OFF DTR push b lxi b,data$port$b inp a ani not(6) ; clear DTR and CTS bits outp a call sbreak ; send 300ms break inp a ori 6 ; set DTR and CTS bits outp a pop b mvi a,6 ; set back to 300 baud jmp reset$baud ; ..so system does not run slow ; call/ret page ; ; C128 initialization -- set baudrate. ; NITMOD: lda local$config ; set default to 8 bits no parity sta XxD$config lda mspeed call new$baud ; set default BAUD rate lxi b,data$port$b$dir mvi a,6 outp a mvi c,low(data$port$b) inp a ori 6 ; set DTR and CTS bits (active hi) outp a ret page ; ; Setup routine to allow changing modem speed with the SET command. ; SETCMD: mvi c,SBLANK ; Any arguments? call mex jrc tell ; If not, go display baud lxi d,cmdtbl mvi c,LOOKUP call mex ; Parse argument cnc ipchl ; If we have one, go set it ; tell: push psw ; save carry flag call disp$rate pop psw ; recover carry flag jrnc skip$tell$baud ; ..(prt following if Cy=1) mvi c,ILP call mex ; Print current baud rate db cr,lf,'The following ' db 'Baud rate(s) are legal: ',eom mvi b,1 call prt$rate db '110 ',eom mvi b,2 call prt$rate db '300 ',eom mvi b,4 call prt$rate db '600 ',eom mvi b,8 call prt$rate db '1200 ',eom skip$tell$baud: mvi c,ILP call mex db cr,lf,eom ret ; ; ; disp$rate: mvi c,ILP call mex ; Print current baud rate db cr,lf,'Baud rate is' db ' now: ',eom lda mspeed mvi c,prbaud call mex lda XxD$config lxi b,'7'*256+'1' ; B='7' C='1' bit 0,a ; bit 0=1 if 8 bits jrz dsp$7 inr b dsp$7: bit 1,a ; bit 1=1 if 2 stop bits jrz dsp$1 inr c dsp$1: lxi h,byte$type$tbl+1-3 ani 11100000b ; only test the parity tst$nxt: inx h inx h inx h cmp m jrnz tst$nxt dcx h ; byte before is the type mov a,m lxi h,msg$ptr mov m,b ; save the word length inx h mov m,a ; save the parity inx h mov m,c ; save the stop bits mvi c,ilp call mex db ' (' msg$ptr: db '8' db 'N' db '1)',cr,lf,eom ret ; ; ; prt$rate: lda mdm$tp ana b mvi c,ilp jnz mex pop h scan$prt$rate: mov a,m inx h ora a jrnz scan$prt$rate ipchl: pchl ; ; cmdtbl: db '11','0'+80h dw ok110 db '30','0'+80H dw ok300 db '60','0'+80h dw ok600 db '120','0'+80H dw ok1200 db 0 ok110: xra a db 21h ; lxi h,mvi a,1 ok300: mvi a,1 db 21h ; lxi h,mvi a,3 ok600: mvi a,3 db 21h ; lxi h,mvi a,5 ok1200: mvi a,5 push psw call set$nxt$parm pop psw NEW$BAUD: cpi 5+1 ; make sure not greater cmc ; ..then 1200 baud (5) rc ; return with carry set mov b,a ; ..if bad baud rate add b ; 2X add b ; 3X mov e,a mvi d,0 ; three bytes per table entry lxi h,baud$table dad d lda mdm$tp ; 4 lsb's tell baud supported ana m ; mask with desired rate cmc rz ; exit if bad baud rate (with Cy set) mov a,b sta mspeed ; set Modem Speed inx h mov a,m ; get speed byte sta clock inx h mov a,m ; get baud rate byte reset$baud: push psw mvi e,3ch ; offset to jmp devtbl call vector$1 ; returns 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 call vector$1 ana a ; Cy cleared, baud rate set OK ret vector$1: lhld 01 mov l,e pchl ; ; ; set$nxt$parm: mvi c,gnc call mex ; any arguments? rc ori 20h ; make lower case lxi h,byte$type$tbl chk$next: cmp m ; match table entry? inx h ; point to the mask mov b,m ; get OR value (new data) inx h ; point to the new value (to add in) jrz change$type ; yes, go change type inx h ; no, scan to next entry mov b,m inr b ; next entry a -1? jrnz chk$next ; no, check next table entry jr set$nxt$parm ; yes, skip this entry get the next one. change$type: mov a,m ; get mask value lxi h,XxD$config ; point to system (RS232) config byte ana m ; mask out old value ora b ; OR in new value mov m,a ; update config byte sta local$config ; update boot value jr set$nxt$parm ; see if any other parameters have changed ; ; ; byte$type$tbl: ; or'ed value , MASK db 'n',00000000b,00011111b db 'o',11100000b,00011111b db 'e',11000000b,00011111b db 'm',10100000b,00011111b db 's',10000000b,00011111b db '7',00000000b,11111110b db '8',00000001b,11111110b db '1',00000000b,11111101b db '2',00000010b,11111101b db -1 ; ; ; TABLE OF BAUDRATE PARAMETERS ; baud$table: db 1,20,3 ; 0 110 db 2,19,6 ; 1 300 db 0,0,0 ; 2 450 (not used) db 4,17,7 ; 3 600 db 0,0,0 ; 4 710 (not used) db 8,13,8 ; 5 1200 ; ; baudbuf: db 10,0 ds 10 ; ; NOTE: MUST TERMINATE PRIOR TO 0B00H (with Smartmodem) ; 0D00H (without Smartmodem) ; org escchr ; change the ESC character to ESC db esc org xsize ; reduce buffer size (slow disk drives) db 4 org queue ; turn off queueing (system db 0 ; ..has 48 byte buff) end