*P 84 ;REM.ACT.S ;ALL THE FILE-ACTIONS ARE IN THIS MODULE ;EXTERNE GROESSEN AUS DEM GERAETESPEZ. TEIL: EXTERNAL DATE SYSTEM SNDTTY LODTTY INIPTY ;EXTERNE GROESSEN AUS DEM TERMINAL-EMULATOR-MODUL: EXTERNAL LOOP NETSND LODNET SNDNET EXTERNAL PUTSTR PUTMSG ERROR RETURN EXTERNAL CHAR1 CHAR2 CHAR3 GLOBAL ACTION GLOBAL ACTNOW ACTFLG MORACT XFERSZ: EQU 64 BFRLEN: EQU 1000H RL: EQU 200H ;RL=0 = DEFAULT RL BINARY: EQU 0 QUERY: EQU 1 FILDES: EQU 2 EXEC: EQU 4 MAGIC: EQU 0D607H SOH: EQU 01H STX: EQU 02H ETX: EQU 03H EOT: EQU 04H ACK: EQU 06H NAK: EQU 15H ;CTRL-U CAN: EQU 18H ESC: EQU 1BH ACTION: POP AF LD (CHAR1),A SET 0,(HL) JP LOOP MORACT: POP AF LD (CHAR2),A SET 1,(HL) JP LOOP ACTNOW: POP AF LD (CHAR3),A RES 0,(HL) RES 1,(HL) AND 7FH CP 'Q' JP Z,GOLOCL CP 'K' JP Z,GIVLGO CP 'S' JP Z,SENDRQ CP 'L' JP Z,LOADRQ LD A,(CHAR1) ;SOH CALL SNDTTY LD A,(CHAR2) ;ESC CALL SNDTTY LD A,(CHAR3) CALL SNDTTY ;IGNORE THE INVALID REQUEST AND JP LOOP TTYBYT: CALL LODTTY RET Z ;NO BYTE AND 7FH CP ESC JR Z,TTYB1 CP CAN JR NZ,TTYBYT TTYB1: PUSH AF CALL SNDNET ;TO REMOTE TTYB2: CALL LODTTY JR NZ,TTYB2 POP AF OR A RET WLODNET CALL LODNET JR Z,WLODNET RET TRNBYT: CALL TTYBYT CALL LODNET JR Z,TRNBYT RET MSKTRN: CALL WLODNET AND 7FH RET SNDACK: LD A,ACK CALL SNDNET RET WAITAK: CALL WLODNET AND 7FH CP ACK RET ;ZERO IF ACK,NONZERO IF NOT ;****************************************************** ;CURRENT RETURN TO UDOS GOLOCL: CALL SNDACK XOR A JP RETURN ;****************************************************** ;LOGOUT AND RETURN TO UDOS GIVLGO: CALL SNDACK CALL WAITAK LD HL,LOGOUT CALL NETSND XOR A DEC A JP RETURN ;RETURN TO UDOS ;****************************************************** ;START REQUEST STRTRQ: CALL SNDACK CALL WLODNET LD (FLGBYT),A ;WAIT FOR THE FLAGBYTE CALL SNDACK ;ACKNOWLEDGE IF GOT CALL FILNAM LD IX,FLP LD (IX),0 LD A,(FLGBYT) BIT BINARY,A JR Z,ASCTYP BIT EXEC,A JR Z,BINTYP SET 7,(IX) ;SET PROCEDURE TYPE-FILE RET BINTYP: SET 4,(IX) RET ASCTYP: SET 5,(IX) RET ;****************************************************** ;LOAD REQUEST LOADRQ: CALL STRTRQ BIT FILDES,A JR Z,LOAD1 CALL CLRBUF ;DESCRIPTOR EINLESEN LD HL,80H LD (ABFRLEN),HL ;NEW LENGTH LD HL,ACTFLG SET 7,(HL) LD DE,DARRAY LD HL,(DATE) LD BC,8 LDIR CALL SNDACK JR WAISTX LOAD1: LD A,(FLGBYT) BIT QUERY,A JR Z,NOQUES LD (IX+01),02 ;OPEN NEW-FILE TO RECOVER DUPLICATE LD HL,RL ;RECORD LENGTH CALL OPNFIL PUSH AF CP 0D0H ;WAS IT A DUPLICATE FILE ERROR ? JR Z,DUPLIC POP AF JR Z,REDTRN ;WITH NO ERROR READY FOR TRANSFER CALL ERROR ;THERE OCCURED ANOTHER ERROR JP CANCEL ;SEND THE CANCEL-REQUEST DUPLIC: POP AF LD HL,RPLMSG CALL PUTSTR LD HL,NAMLEN CALL PUTSTR LD HL,QUEMSG CALL PUTSTR ;REPLACE THE FILENAME ...... (Y/N) ? WAITAN: CALL LODTTY JR NZ,WAITAN WAIT: CALL LODTTY JR Z,WAIT AND 05FH ;MASK PARITY AND LOWER CP 'Y' ;THE FILENAME SHOULD BE REPLACED PUSH AF LD A,'N' CALL NZ,SNDTTY POP AF PUSH AF LD A,0DH CALL NZ,SNDTTY POP AF JR NZ,NOQUES LD HL,NAMQUE ;PLEASE ENTER ANOTHER FILENAME >>> CALL PUTSTR CALL RDCON ;IF FILENAME LENGTH ZERO CANCEL THE REQUEST NOQUES: LD IX,FLP LD HL,RL LD (IX+01),01 ;OPEN FOR DESTRUCTIVE OUTPUT CALL OPNFIL PUSH AF CALL NZ,ERROR POP AF JP NZ,CANCEL REDTRN: CALL CLRBUF CALL SNDACK ;ACKNOWLEDGE FOR A GOOD FILE WAISTX: CALL MSKTRN CP STX JR Z,STXFON CP CAN JP Z,CANCIN CP ESC JP Z,CANCIN JR WAISTX STXFON: LD HL,CHKSUM LD (HL),0 CALL TRNBYT ;BLOCK LENGTH LD D,A PUSH DE CALL TRNBYT POP DE LD E,A PUSH DE ;COUNT LD HL,CHKBFR MORCHR: PUSH DE PUSH HL CALL TRNBYT POP HL POP DE LD C,A LD A,(CHKSUM) XOR C LD (CHKSUM),A LD (HL),C INC HL DEC DE LD A,D OR E JR NZ,MORCHR LOKETX: CALL MSKTRN CP ETX JR NZ,LOKETX CALL WLODNET LD C,A LD A,(CHKSUM) CP C LD HL,CHKBFR POP DE ;COUNT JR Z,PUTBUF LD A,NAK CALL SNDNET JR WAISTX PUTBUF: LD A,(HL) CALL PUTBFR JP NZ,CANCEL DEC DE INC HL LD A,D OR E JR NZ,PUTBUF GIVACK: CALL SNDACK JR WAISTX ;++++++++++ ;CANCEL LOAD CANCEL: LD A,CAN CALL SNDNET CALL WAITAK ;WAIT FOR THE BACK-CANCEL JP CLOSE CANCIN: JP CLOSEW ;WAIT FOR THE NEXT ACTIONS ;++++++++++ ;WRITE DATA BYTES TO BUFFER ;WRITE TO DISK WHEN BUFFER FULL PUTBFR: PUSH HL PUSH BC PUSH DE LD HL,(AFILBFR) LD BC,(ABFRLEN) LD (HL),A INC HL DEC BC ;INCREMENT POINTER,REDUCE COUNT LD (AFILBFR),HL LD (ABFRLEN),BC LD A,B OR C JR Z,PUTBFW ;IF BUFFER FULL WRITE IT TO THE FILE XOR A PUTB1: POP DE POP BC POP HL RET PUTBFW: LD A,(ACTFLG) BIT 7,A RES 7,A LD (ACTFLG),A JR NZ,WRTDES CALL WRTFIL PUSH AF CALL CLRBUF LD HL,PUNKT CALL PUTSTR POP AF JR PUTB1 ;++++++++++ ;WRITE DESCRIPTOR RECORD WRTDES: LD HL,(FILBFR) LD A,L LD L,H LD H,A LD DE,MAGIC OR A SBC HL,DE JR Z,WRTD1 LD HL,NODES ;ERROR NO DESCRIPTOR WRTD0: CALL PUTSTR XOR A INC A JR PUTB1 WRTD1: LD DE,(FILBFR+15) ;RL LD HL,BFRLEN OR A SBC HL,DE LD HL,NORL JR C,WRTD0 ;RL TO LARGE LD DE,FILPRM ;MOVE LD HL,FILBFR+12 LD BC,74H LDIR LD DE,(DATE) LD HL,FILBFR+18H LD BC,8 LDIR LD A,(FILBFR+13H) LD (PROP),A POP DE POP BC POP HL POP HL ;RET FROM PUTBFR JP LOAD1 ;+++++++++ ;WRITE A BUFFER TO DISK WRTFIL: LD HL,BFRLEN LD BC,(ABFRLEN) AND A SBC HL,BC RET Z ; IF THERE IS NOTHING TO WRITE DO NOTHING LD (FILDL),HL LD A,(FLGBYT) BIT FILDES,A JR NZ,WF0 EX DE,HL LD HL,(FILSMT+2) ADD HL,DE LD (FILSMT+2),HL DEC HL LD (HIGADR),HL EX DE,HL WF0: LD DE,(FILRL) WF1: OR A SBC HL,DE JR Z,WF2 JR NC,WF1 WF2: ADD HL,DE LD A,(FLP) BIT 5,A JR Z,WF3 DEC HL ;ASCII FILE, EOF NOT COUNT WF3: LD (FILST1),HL ;NUMBER OF BYTES IN LAST RECORD LD IY,FILVEC CALL SYSTEM BIT 6,(IY+0AH) RET Z ;IF NO ERRORS RETURN CALL ERROR ;IF THERE WAS ONE DISPLAY IT XOR A INC A RET ;NONZERO RETURN SHOWS ERROR ;++++++++++ ;CLEAR BUFFER CLRBUF: LD HL,FILBFR LD (AFILBFR),HL LD DE,FILBFR+1 LD BC,BFRLEN LD (ABFRLEN),BC DEC BC LD (HL),-1 LDIR RET ;****************************************************** ;CLOSE FILE CLOSEW: LD A,(FLP) BIT 5,A ;ASCII ? JR Z,CLOSE1 LD A,-1 ;EOF - MARK CALL PUTBFR CLOSE1: CALL WRTFIL LD A,(FLGBYT) BIT FILDES,A JR Z,CLOSE LD DE,(DATE) LD HL,DARRAY LD BC,8 LDIR LD A,(PROP) LD (FILPRP),A CLOSE: LD IY,FILCLS LD (IY+4),74H CALL SYSTEM CALL SNDACK ;SEND THE ACKNOWLEDGE FOR READY CLS1: CALL LODTTY JR NZ,CLS1 ;CLEAR TTY INPUT BUFFER JP LOOP ;****************************************************** ;SEND REQUEST SENDRQ: CALL STRTRQ LD (IX+01),0 ;OPEN FOR INPUT LD HL,0 ;DEFAULT RL CALL OPNFIL PUSH AF CALL NZ,ERROR ;NZ IST ERROR-RETURN POP AF JP NZ,CANCL ;CANCEL THIS FILEREQUEST ;READY FOR TRANSFER CALL SNDACK ;FOR FILENAME IS OPEN OK LD IY,FILRDV LD (IY+0AH),0 LD HL,0 LD (BFCNT),HL LD A,(FLGBYT) BIT FILDES,A JR Z,REDLOP SNDDESC: ;SEND DESCRIPTOR RECORD LD HL,FILBFR LD (BUFPOI),HL LD B,6 LD DE,MAGIC SNDD1: LD (HL),D INC HL LD (HL),E INC HL DJNZ SNDD1 EX DE,HL LD HL,FILPRM LD BC,74H LDIR LD HL,80H LD (BFCNT),HL REDLOP: LD HL,ACTFLG BIT 5,(HL) RES 5,(HL) JP NZ,DONRED LD HL,(BFCNT) LD DE,(BUFPOI) LD IX,CHKBFR LD BC,XFERSZ LD (CCOUNT),BC LDLOP: LD A,H OR L JR Z,NEWRED PUSH HL AND A ;RESET CARRY SBC HL,BC ;BUFCNT-XFERSZ > 0 ? POP HL CALL C,CHKS ;SET ACTUAL COUNT INSTEAD OF XFERSZ LD A,(FLP) BIT 5,A JR Z,OVCHK1 LD A,(DE) CP 0FFH ;IS THERE ASCII-EOF ? JR Z,ASCEOF OVCHK1: LD A,(DE) INC DE DEC HL LD (BFCNT),HL LD (BUFPOI),DE LD (IX),A DEC BC INC IX LD A,B OR C JP Z,SNDREC JR LDLOP ASCEOF: LD HL,(CCOUNT) AND A SBC HL,BC ;ACTUAL COUNT FOR RECORD LD (CCOUNT),HL LD HL,ACTFLG SET 5,(HL) JP SNDREC ;++++++++++ ;READ FROM DISK TO BUFFER NEWRED: LD A,(ACTFLG) RES 6,A LD (ACTFLG),A LD IY,FILRDV LD A,(IY+0AH) CP 0C9H JR Z,DONRED LD HL,BFRLEN LD (RDVLEN),HL CALL SYSTEM LD A,(IY+0AH) CP 0C9H JR Z,NEWEND BIT 6,A PUSH AF CALL NZ,ERROR POP AF JP NZ,CANCL CALL SUBREC JR Z,NEWEND LD HL,PUNKT CALL PUTSTR NEWR0: LD HL,(RDVLEN) NEWR1: LD (BFCNT),HL LD DE,FILBFR LD (BUFPOI),DE JP REDLOP NEWEND: LD (IY+0AH),0C9H LD HL,(FILST1) LD A,L OR H JR Z,NEWR0 ;NUMBER OF BYTES IN LAST ;RECORD NOT USED PUSH DE LD DE,(FILRL) LD HL,(RDVLEN) LD A,L AND 7FH JR NZ,NEWR0 SBC HL,DE LD DE,(FILST1) ADD HL,DE POP DE JR NEWR1 ;++++++++++ ;END FILE TRANSFER DONRED: LD A,EOT CALL SNDNET JP CANIN ;++++++++++ ;SET ACTUELL TRANSFER BLOCK LENGTH TO NUMBER OF LAST CHARACTERS CHKS: LD A,(ACTFLG) BIT 6,A RET NZ LD B,H LD C,L LD (CCOUNT),BC SET 6,A LD (ACTFLG),A RET ;++++++++++ ;DECREMENT RECORD COUNT SUBREC: LD DE,(FILRL) LD HL,BFRLEN LD BC,0 SUBR1: INC BC OR A SBC HL,DE JR NZ,SUBR1 LD HL,(FILPRM+1) OR A SBC HL,BC LD (FILPRM+1),HL RET ;++++++++++ ;SEND A BLOCK TO NET SNDREC: LD HL,(CCOUNT) LD A,H OR L JP Z,REDLOP CALL TTYBYT JR NZ,CANIN ;MANUAL CANCEL LD A,STX CALL SNDNET LD BC,(CCOUNT) LD A,B PUSH BC CALL SNDNET POP BC LD A,C CALL SNDNET LD DE,CHKBFR LD HL,CHKSUM LD (HL),0 LD BC,(CCOUNT) TRALOP: LD A,(DE) INC DE DEC BC PUSH AF XOR (HL) LD (HL),A POP AF PUSH BC PUSH DE PUSH HL CALL SNDNET POP HL POP DE POP BC LD A,B OR C JR NZ,TRALOP LD A,ETX CALL SNDNET LD A,(CHKSUM) CALL SNDNET CALL WAITAK JP Z,REDLOP CP NAK ;WAS IT A NAK JR Z,SNDREC ;TRY IT AGAIN JR CANIN ;++++++++++ ;CANCEL SEND CANCL: LD A,CAN CALL SNDNET CALL WAITAK CANIN: JP CLOSE ;****************************************************** ;GET FILENAME FILNAM: CALL MSKTRN CP STX JR NZ,FRAMER XOR A LD (CHKSUM),A ;INITIALIZE CHECKSUM LD C,A ;INITIALIZE NAME-LENGTH COUNTER LD HL,NAMBUF MORNAM: PUSH BC PUSH HL CALL MSKTRN ;ONLY ASCII-CHARACTERS FOR FILENAME POP HL POP BC LD B,A CP ETX ;HAVE WE REACHED THE END ? JR Z,ENDNAM INC C LD A,32 CP C JR C,MORN1 ;ONLY 32 CHARACTERS FOR FILENAME ALLOWED LD (HL),B INC HL MORN1: LD A,(CHKSUM) XOR B LD (CHKSUM),A JR MORNAM ENDNAM: LD (HL),0DH CALL WLODNET LD B,A LD A,(CHKSUM) CP B JR NZ,SUMERR ;CHECKSUMERROR IN FILENAME ! RET ;++++++++++ ;FILENAME ERROR SUMERR: LD HL,SUMEMS CALL PUTMSG LD A,NAK CALL SNDNET ;GIVE A NONACKNOWLEDGE FOR THE WRONG FILENAME JR FILNAM ;TRY IT AGAIN TO GET THE NAME CORRECT SUMEMS: DEFB 28 DEFM 'CHECKSUM ERROR IN FILENAME ' DEFB 0DH FRAMER: POP HL ;FROM ROUTINE FILNAM POP HL ;FROM ROUNTINE STRTRQ CP CAN JP Z,CANIN LD HL,FRAMSG CALL PUTMSG JP CANCL FRAMSG: DEFB 35 ;LENGTH OF MSG DEFM 'RECORD - FRAMING ERROR IN FILENAME' DEFB 0DH ;****************************************************** ;OPEN FILE OPNFIL: LD A,(FLGBYT) BIT FILDES,A JR NZ,OPNF LD (FILRL),HL LD (FILST1),HL LD HL,0 LD (LOWADR),HL LD (HIGADR),HL LD (STKSIZ),HL LD (FILSMT),HL LD (FILSMT+2),HL LD (FILSMT+4),HL LD (FILSMT+6),HL OPNF: XOR A LD (FILSPV),A LD (FILPRP),A CALL ISNAME RET NZ LD A,(IX+1) OR A JR Z,OPN0 PUSH IX LD IY,FILINI ;I REQUEST BEI WRITE CALL SYSTEM POP IX BIT 6,(IY+0AH) RET NZ OPN0: PUSH IX LD IY,FILASV ;ASSIGN REQUEST CALL SYSTEM POP IX BIT 6,(IY+0AH) RET NZ LD A,'*' LD (FILSPV+1),A LD IY,FILOPN ;OPEN REQUEST LD A,(IX+1) LD (FILSPV),A LD A,(FLGBYT) BIT FILDES,A JR Z,OPN1 BIT BINARY,A ;DESCRIPTOR TRANSFER ONLY JR Z,OPN3 ;TYPE BINARY JR OPN2 OPN1: LD A,(IX) LD (FILPRM),A OPN2: LD (IY+4),74H CALL SYSTEM LD A,(FLGBYT) BIT FILDES,A JR NZ,OPN4 LD A,(FLP) AND 20H LD B,A LD A,(FILPRM) LD (FLP),A AND 20H CP B JR Z,OPN4 OPN3: LD (IY+0AH),48H ;INVALID FILE TYPE OPN4: LD A,(IY+0AH) BIT 6,A JR Z,FILOKM CP 0D0H ;DUPLICATE FILE ERROR ? RET ;++++++++++ ;FILE OK FILOKM: LD HL,FILOK1 CALL PUTSTR ;"FILE " LD HL,NAMLEN CALL PUTSTR ; "..(NAME).." LD HL,FILOK2 ; " OF TYPE " CALL PUTSTR LD IX,FLP LD HL,PROTYP BIT 7,(IX) JR NZ,PUTTYP LD HL,ASTYP BIT 5,(IX) JR NZ,PUTTYP LD HL,BNTYP PUTTYP: CALL PUTSTR LD HL,OPENED CALL PUTSTR XOR A RET ;++++++++++ ;FILE NAME OK ? ISNAME: LD HL,NAMBUF LD C,0 ;COUNT LD A,(HL) CP 0DH JR Z,NAMERR NAMLOP: LD A,(HL) CP 0DH ;CR ERREICHT JR Z,ENDLEN CP ';' JR Z,NAMERR CP ' ' JR Z,NAMERR CP 09H JR Z,NAMERR INC HL INC C LD A,C CP 33 JR NZ,NAMLOP LD (HL),0DH ENDLEN: LD HL,NAMLEN LD (HL),C INC HL ;NAMBUF XOR A RET NAMERR: LD A,46H ;INVALID FILE NAME OR A RET ;****************************************************** ;READ CON RDCON: LD HL,33 LD (CONLEN),HL LD IY,CONVEC CALL SYSTEM CALL INIPTY RET ;****************************************************** ;VECTORS FOR SYSTEM CALLS CONVEC: ;READ CON DEFB 01 DEFB 0CH DEFW NAMBUF CONLEN: DEFS 2 DEFW 0 DEFW 0 DEFB 0 DEFW 0 FILVEC: ;FILE WRITE BIN DEFB 05 DEFB 0EH DEFW FILBFR FILDL: DEFS 2 DEFW 0 DEFW 0 DEFB 0 DEFW 0 FILRDV: ;FILE READ BIN DEFB 05 DEFB 0AH DEFW FILBFR RDVLEN: DEFS 2 DEFW 0 DEFW 0 DEFB 0 DEFW 0 FILCLS: ;FILE CLOSE DEFB 05 DEFB 06 DEFW FILPRM DEFW 74H DEFW 0 DEFW 0 DEFB 0 DEFW 0 FILINI: ;DOS INIT DEFB 05 DEFB 00 DEFW 0 DEFW 0 DEFW 0 DEFW 0 DEFB 0 DEFW 0 FILASV: ;FILE ASSIGN DEFB 05 DEFB 02 DEFW NAMBUF DEFW 0 DEFW 0 DEFW 0 DEFB 0 DEFW FILSPV FILOPN: ;FILE OPEN DEFB 05 DEFB 04 DEFW FILPRM DEFW 0074H DEFW 0 DEFW 0 DEFB 0 DEFW FILSPV RPLMSG: DEFB 24 DEFB 0DH DEFM 'REPLACE THE FILENAME : ' QUEMSG: DEFB 13 DEFM ' (Y/N) ? >>> ' NAMQUE: DEFB 35 DEFB 'Y' DEFB 0DH DEFB 0DH DEFM 'ENTER THE NEW FILENAME HERE >>> ' FILOK1: DEFB 6 DEFB 0DH DEFM 'FILE ' FILOK2: DEFB 9 DEFM ' OF TYPE ' PROTYP: DEFB 9 DEFM 'PROCEDURE' ASTYP: DEFB 5 DEFM 'ASCII' BNTYP: DEFB 6 DEFM 'BINARY' OPENED: DEFB 23 DEFM ' IS OPEN FOR TRANSFER ' DEFB 0DH PUNKT: DEFB 1 DEFM '.' LOGOUT: DEFM 'logout' DEFB 0AH DEFB 80H NODES: DEFB NODESL DEFM 'INVALID DESCRIPTOR' DEFB 0DH NODESL: EQU $-NODES-1 NORL: DEFB NORLL DEFM 'RECORD LENGTH TO LARGE' DEFB 0DH NORLL: EQU $-NORL-1 ;****************************************************** ;FILE DESCRIPTOR FILPRM: DEFB 0 DEFW 0 FILRL: DEFW 0 FILSTO: DEFS 2 FILPRP: DEFS 1 FILSA: DEFW 0 FILST1: DEFS 18 FILSMT: DEFS 82 LOWADR: DEFS 2 HIGADR: DEFS 2 STKSIZ: DEFS 2 PROP: DEFS 1 DARRAY: DEFS 8 ;****************************************************** ACTFLG: DEFS 1 CHKSUM: DEFS 1 FLGBYT: DEFS 1 FLP: DEFS 2 BUFPOI: DEFS 2 BFCNT: DEFS 2 CCOUNT: DEFS 2 NAMLEN: DEFS 1 NAMBUF: DEFS 33 FILSPV: DEFS 35 AFILBFR DEFS 2 ABFRLEN DEFS 2 CHKBFR: DEFS XFERSZ+1 FILBFR: DEFS BFRLEN