TITLE MODEM SUBTTL Terminal interface to a MODEM .Z80 WBOOT EQU 0 BDOS EQU 5 SPORT EQU 6 ;STATUS PORT DPORT EQU 7 ;DATA PORT IMASK EQU 80H OMASK EQU 1 CR EQU 0DH LF EQU 0AH CTRLZ EQU "Z"-40H MODEM: LD (CCPSP),SP LD SP,STACK LD HL,(WBOOT+1) INC HL INC HL INC HL LD DE,JPVEC LD BC,6 LDIR LD HL,(BDOS+1) LD DE,-0C00H ADD HL,DE LD (ENDBUF),HL STCHEK: IN A,(SPORT) AND IMASK JR Z,OUTCHK CALL PORTIN JR STCHEK OUTCHK: CALL CONST OR A JR Z,OUTCK1 CALL CONIN CP "A"-40H JR NZ,NOTPFX CIWAIT: IN A,(SPORT) AND IMASK JR Z,OUTCK2 CALL PORTIN JR CIWAIT OUTCK2: CALL CONST OR A JR Z,CIWAIT CALL CONIN CP "R" JP Z,MREAD CP "W" JP Z,MWRITE CP "C" JP Z,MCLOSE CP "X" JP Z,EXIT CP "P" JP Z,CHGPPT CP "B" JP Z,WRTBFR CP "A" JP Z,ABTRD NOTPFX: LD (CONCHR),A OUTCK1: IN A,(SPORT) AND OMASK JR NZ,STCHEK LD HL,CONCHR LD A,(RDFLAG) OR A JP P,NOREAD LD A,(HL) OR A JP M,NOIRPT LD (HL),80H LD HL,RDFLAG LD (HL),1 JR OUTBYT NOIRPT: ATPRMT: CALL GETCHR JR NZ,NOTEOF EOF: LD DE,EOFMSG CALL PRINT$ XOR A LD (RDFLAG),A LD HL,CONCHR JR NOREAD NOTEOF: CP "P"-40H JR NZ,NOTCHP CALL GETCHR JR Z,EOF LD (PROMPT),A JR ATPRMT NOTCHP: CP "B"-40H JP Z,WRTBFR JR OUTBYT NOREAD: LD A,(HL) OR A JP M,STCHEK LD (HL),80H OUTBYT: OUT (DPORT),A JP STCHEK PORTIN: IN A,(DPORT) OR A RET Z LD IX,LSTCHR LD B,(IX) LD (IX+1),B LD (IX),A PUSH AF LD A,(WRFLAG) OR A JP P,NOWRT LD HL,(WRTPOS) LD DE,(ENDBUF) SBC HL,DE JR C,ENDOK LD DE,OVMSG CALL PRINT$ CALL WRTBF1 ENDOK: LD HL,(WRTPOS) POP AF LD (HL),A INC HL LD (WRTPOS),HL PUSH AF NOWRT: POP AF LD E,A JP CONOUT MREAD: LD A,(RDFLAG) OR A JR NZ,READON LD DE,RDMSG CALL PRINT$ LD C,10 ;Input buffer LD DE,FILBUF CALL BDOS LD HL,RDFCB PUSH HL CALL PARSE POP DE JR Z,MREAD LD HL,ENDSRC LD (SRCPOS),HL XOR A LD (RDFCB+12),A LD (RDFCB+32),A LD C,15 ;Open file CALL BDOS INC A JR NZ,FILXIS LD DE,NFMSG FILERR: CALL PRINT$ JP STCHEK FILXIS: CALL CRLF READON: LD A,81H LD (RDFLAG),A JP STCHEK MWRITE: LD A,(WRFLAG) OR A JR NZ,TOGWRT LD DE,WRMSG CALL PRINT$ LD C,10 ;Input buffer LD DE,FILBUF CALL BDOS LD HL,WRFCB PUSH HL CALL PARSE POP DE JR Z,MWRITE LD HL,WRBUFF LD (WRTPOS),HL XOR A LD (WRFCB+12),A LD (WRFCB+32),A PUSH DE LD C,19 ;Delete file CALL BDOS POP DE LD C,22 ;Make file CALL BDOS INC A LD DE,DFOMSG JR Z,FILERR CALL CRLF LD A,0FEH LD (WRFLAG),A JP STCHEK TOGWRT: CPL LD (WRFLAG),A OR A LD DE,DEMSG JP M,ENABLE LD DE,DDMSG ENABLE: CALL PRINT$ JP STCHEK CRLF: LD E,LF CALL CONOUT LD E,CR CONOUT: LD C,2 JP BDOS PARSE: PUSH HL PUSH HL LD HL,FILBUF+1 LD C,(HL) LD B,0 ADD HL,BC INC HL LD (HL),0 LD DE,FILBUF+2 POP HL SCHNSP: LD A,(DE) OR A JR Z,EMPTY CP " " JR NZ,TXTFND INC DE JR SCHNSP TXTFND: SUB "A"-1 LD B,A INC DE LD A,(DE) INC DE CP ":" LD A,B JR Z,DRVFND DEC DE DEC DE LD B,0 DRVFND: LD (HL),B LÄ B,¸ ;MAXIMUÍ NUMBEÒ OÆ BYTEÓ IÎ FILÅ NAME NXTCR2: CALL DLMCHK JR C,CMDERR JR Z,DLMFND INC HL LD (HL),A INC DE DJNZ NXTCR2 FNDDLM: CALL DLMCHK JR C,CMDERR JR Z,GETTYP INC DE JR FNDDLM DLMFND: INC HL LD (HL)," " DJNZ DLMFND GETTYP: LD B,3 ;MAXIMUM NUMBER OF BYTES IN FILE TYPE CP "." JR NZ,ENDTYP INC DE NXTCR4: CALL DLMCHK JR C,CMDERR JR Z,ENDTYP INC HL LD (HL),A INC DE DJNZ NXTCR4 FNDDM1: CALL DLMCHK JR Z,ZERFP INC DE JR FNDDM1 ENDTYP: INC HL LD (HL)," " DJNZ ENDTYP ZERFP: POP HL LD B,11 NXTCR5: INC HL LD A,(HL) CP "?" JR Z,AMBERR NOTQST: DJNZ NXTCR5 RET AMBERR: LD DE,AMBMSG CALL PRINT$ XOR A RET EMPTY: CALL CRLF POP AF POP AF JP STCHEK CMDERR: LD DE,CTLMSG CALL PRINT$ POP AF XOR A RET DLMCHK: LD A,(DE) OR A RET Z CP "." RET Z CP " " RET GETCHR: LD HL,(SRCPOS) LD DE,ENDSRC OR A SBC HL,DE CALL Z,READNR RET Z LD HL,(SRCPOS) LD A,(HL) CP CTRLZ RET Z INC HL LD (SRCPOS),HL RET READNR: LD DE,RDBUFF LD C,26 ;Set DMA address CALL BDOS LD DE,RDFCB LD C,20 ;Read sequential CALL BDOS OR A JR NZ,CMDERR INC A LD HL,RDBUFF LD (SRCPOS),HL RET WRTBFR: CALL WRTBUF JP STCHEK WRTBUF: LD A,(WRFLAG) OR A LD DE,WNOMSG JR Z,PRINT$ WRTBF1: LD HL,WRBUFF NXTSEC: PUSH HL LD DE,7FH ADD HL,DE LD DE,(WRTPOS) OR A SBC HL,DE POP DE JR NC,ENDWRT PUSH DE CALL WRITNR POP HL JR NZ,CLOSE1 LD DE,80H ADD HL,DE JR NXTSEC ENDWRT: LD HL,(WRTPOS) SBC HL,DE LD B,H LD C,L LD H,D LD L,E LD DE,WRBUFF LD A,B OR C JR Z,NOMOV LDIR NOMOV: LD (WRTPOS),DE LD DE,WDMSG PRINT$: PUSH DE CALL CRLF POP DE LD C,9 ;Print string JP BDOS WRITNR: LD C,26 ;Set DMA address CALL BDOS LD DE,WRFCB LD C,21 ;Write sequential CALL BDOS OR A RET Z LD DE,DFWMSG CALL PRINT$ LD A,0FFH OR A RET MCLOSE: CALL CLOSE JP STCHEK EXIT: CALL CLOSE LD SP,(CCPSP) RET CLOSE: CALL WRTBUF LD A,(WRFLAG) OR A RET Z LD HL,WRBUFF+80H LD DE,(WRTPOS) OR A SBC HL,DE LD A,L CP 80H JR Z,CLOSE1 PUSH HL POP BC PUSH DE POP HL INC DE LD (HL),CTRLZ LDIR LD DE,WRBUFF CALL WRITNR CLOSE1: XOR A LD (WRFLAG),A LD DE,WRFCB LD C,16 ;Close file CALL BDOS INC A RET NZ LD DE,CEMSG JR PRINT$ CHGPPT: LD DE,CPMSG CALL PRINT$ LD C,1 ;Console input CALL BDOS LD (PROMPT),A CALL CRLF JP STCHEK ABTRD: XOR A LD (RDFLAG),A LD DE,IFAMSG CALL PRINT$ JP STCHEK DEFRVB MACRO STRING .XLIST IRPC CHAR, DEFB "&CHAR" XOR 80H ENDM .LIST ENDM RDMSG: DEFRVB DEFB "$" WRMSG: DEFRVB DEFB "$" CPMSG: DEFRVB DEFB "$" DFWMSG: DEFRVB DEFB LF,CR,"$" CEMSG: DEFRVB DEFB LF,CR,"$" AMBMSG: DEFRVB DEFB LF,CR,"$" CTLMSG: DEFRVB DEFB LF,CR,"$" NFMSG: DEFRVB DEFB LF,CR,"$" DFOMSG: DEFRVB DEFB LF,CR,"$" OVMSG: DEFRVB DEFB LF,CR,"$" EOFMSG: DEFRVB DEFB LF,CR,"$" IFAMSG: DEFRVB DEFB LF,CR,"$" WDMSG: DEFRVB DEFB LF,CR,"$" WNOMSG: DEFRVB DEFB LF,CR,"$" DDMSG: DEFRVB DEFB LF,CR,"$" DEMSG: DEFRVB DEFB LF,CR,"$" PROMPT: DEFB "?" RDFLAG: DEFB 0 WRFLAG: DEFB 0 LSTCHR: DEFB 0,0 CONCHR: DEFB 80H FILBUF: DEFB 20 END: DEFS 21 CCPSP: DEFS 2 ENDBUF: DEFS 2 JPVEC: DEFS 6 CONST EQU JPVEC CONIN EQU JPVEC+3 RDFCB: DEFS 33 WRFCB: DEFS 33 RDBUFF: DEFS 80H ENDSRC: SRCPOS: DEFS 2 WRTPOS: DEFS 2 DEFS 30H STACK: WRBUFF: ORG END END MODEM