;************************************************************* ; ; P8000 KOPPELSOFTWARE ; MODUL: UDOS-DATEI E/A ; (angepasste REMOTE-Software) ; VERSION: 2.0 ; ;************************************************************* EXTERNAL BUF EXTERNAL WAIT LODNET SNDNET EXTERNAL SNDACK UEB16 GLOBAL LOAD SEND GLOBAL ACTFLG 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 S0BC EQU 27H S0BD EQU 26H SYSTEM: EQU 1003H DATE: EQU 0FA2H BTOHEX EQU 0BDFH ;AUS PROM-TEIL 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 ;ZEITGETEILTER FLOPPY-ZUGRIFF DISK: CALL SYSTEM DLOOP: CALL UEB16 LD A,(IY+10) BIT 7,A JR Z,DLOOP BIT 6,A DEND: RET ;AUSGABE AUF CONSOLE OUTAS: LD A,(HL) LD B,A INC HL SFREE IN A,(S0BC) BIT 2,A ;SENDEPUFFER LEER JR Z,SFREE ;NEIN LD A,(HL) ;ZEICHEN OUT (S0BD),A ;AUSGEBEN INC HL DJNZ SFREE RET ERROR: LD HL,ERMSG1 CALL OUTAS LD HL,NAMLEN CALL OUTAS LD A,(IY+10) LD HL,ERNR CALL BTOHEX LD HL,ERMSG2 CALL OUTAS RET ERMSG1 DEFB 5 DEFM 'File ' ERMSG2 DEFB 11 DEFM ' Error ' ERNR: DEFW 2020H DEFB 0DH DEFB 0AH NETSND: LD A,(HL) CP 80H RET Z INC HL PUSH HL CALL SNDNET POP HL JR NETSND WLODNET CALL LODNET JR Z,WLODNET RET TRNBYT: CALL LODNET JR Z,TRNBYT RET MSKTRN: CALL WLODNET AND 7FH RET WAITAK: CALL WLODNET AND 7FH CP ACK RET ;ZERO IF ACK,NONZERO IF NOT ;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 LOAD: RES 2,(HL) 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 (IX+01),01 ;OPEN FOR OUTPUT LD HL,RL ;RECORD LENGTH CALL OPNFIL JR Z,REDTRN ;WITH NO ERROR READY FOR TRANSFER CALL ERROR ;THERE OCCURED ANOTHER ERROR JP CANCEL ;SEND THE CANCEL-REQUEST 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,(ABUF) LD BC,(ABFRLEN) LD (HL),A INC HL DEC BC ;INCREMENT POINTER,REDUCE COUNT LD (ABUF),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 OUTAS POP AF JR PUTB1 ;++++++++++ ;WRITE DESCRIPTOR RECORD WRTDES: LD HL,(BUF) 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 OUTAS XOR A INC A JR PUTB1 WRTD1: LD DE,(BUF+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,BUF+12 LD BC,74H LDIR LD DE,DATE LD HL,BUF+18H LD BC,8 LDIR LD A,(BUF+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 DISK 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,BUF LD (ABUF),HL LD DE,BUF+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 HL,NEWLN ; CALL OUTAS LD IY,FILCLS LD (IY+4),74H CALL SYSTEM CALL SNDACK ;SEND THE ACKNOWLEDGE FOR READY JP WAIT ;****************************************************** ;SEND REQUEST SEND: RES 1,(HL) 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,BUF 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 DISK 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 OUTAS NEWR0: LD HL,(RDVLEN) NEWR1: LD (BFCNT),HL LD DE,BUF 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 CLOSE ;++++++++++ ;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 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 JP CLOSE ;++++++++++ ;CANCEL SEND CANCL: LD A,CAN CALL SNDNET CALL WAITAK CANIN: LD IY,FILCLS LD (IY+4),74H CALL DISK CALL SNDACK JP WAIT ;****************************************************** ;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 OUTAS 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 OUTAS JP CANCL FRAMSG: DEFB 36 ;LENGTH OF MSG DEFM 'RECORD - FRAMING ERROR IN FILENAME' DEFB 0DH DEFB 0AH ;***************************** ;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 OPN0: PUSH IX LD IY,FILASV ;ASSIGN REQUEST CALL SYSTEM POP IX 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: 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 FILVEC: ;FILE WRITE BIN DEFB 05 DEFB 0FH DEFW BUF FILDL: DEFS 2 DEFW DEND DEFW DEND DEFB 0 DEFW 0 FILRDV: ;FILE READ BIN DEFB 05 DEFB 0BH DEFW BUF RDVLEN: DEFS 2 DEFW DEND DEFW DEND 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 74H DEFW 0 DEFW 0 DEFB 0 DEFW FILSPV FILOK1: DEFB 7 DEFB 0DH DEFB 0AH 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 24 DEFM ' IS OPEN FOR TRANSFER ' DEFB 0DH DEFB 0AH PUNKT: DEFB 1 DEFM '.' NEWLN: DEFB 2 DEFB 0DH DEFB 0AH LOGOUT: DEFM 'logout' DEFB 0AH DEFB 80H NODES: DEFB NODESL DEFM 'INVALID DESCRIPTOR' DEFB 0DH DEFB 0AH NODESL: EQU $-NODES-1 NORL: DEFB NORLL DEFM 'RECORD LENGTH TO LARGE' DEFB 0DH DEFB 0AH 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 ABUF DEFS 2 ABFRLEN DEFS 2 CHKBFR: DEFS XFERSZ+1