; V1A Edit #9 1-Jun-81 Autoren: G.Maier/-tf- File: SELIN.MAC .TITLE SELIN: FILETRANSFERPROGRAMM (SERIELL) ;------------------------------------------ ;HYBRIDRECHENZENTRUM ETHZ .IDENT /gmtf01/ .NLIST BEX,ME,MD ; SELIN Filetransferprogramm fuer serielles 8-Bit Interface ; Bedienung: siehe Beschreibung fuer WIPO .SBTTL KONSTANTEN, .MCALL'S ;-------------------------- LF=12 CR=15 BLANK=40 BELL=7 DEL=177 ERRBYT=52 .MCALL .PRINT,.TTYINR,.TTYIN,.TTYOUT .MCALL .CSTAT,.READW,.WRITW .MCALL .EXIT,.GTLIN,.CSIGEN,.CLOSE .MCALL .DEVICE,.PROTECT,.INTEN .NLIST .SBTTL MACRO DEFINITIONEN ;------------------------ ; ; .MACRO WAITF FLAG,?LAB LAB: TST FLAG BEQ LAB .ENDM WAITF ; ; .MACRO TEST A,LOW,HIGH,LABEL,?L,?N CMP A,LOW BGE L N: JMP LABEL L: CMP A,HIGH BGT N .ENDM TEST ; ; .MACRO INPUT ANZ,BUFADR .IF NB .IF DIF ,R0 MOV ANZ,R0 ;R0: ANZAHL ZU LESENDE WORTE .ENDC .ENDC .IF NB .IF DIF ,R1 MOV BUFADR,R1 ;R1: BUFFERADRESSE .ENDC .ENDC JSR PC,INPT .ENDM INPUT ; ; ; .MACRO OUTPUT ANZ,BUFADR .IF NB .IF DIF ,R0 MOV ANZ,R0 ;R0: ANZAHL ZU LESENDE WORTE .ENDC .ENDC .IF NB .IF DIF ,R1 MOV BUFADR,R1 ;R1: BUFFERADRESSE .ENDC .ENDC JSR PC,OUTPT .ENDM OUTPUT ; ; .MACRO RECEIV BUFADR .IF NB .IF DIF ,R1 MOV BUFADR,R1 ;R1: BUFFERADRESSE .ENDC .ENDC JSR PC,RECEI .ENDM RECEIV ; ; .MACRO SEND ANZ,BUFADR .IF NB .IF DIF ,R0 MOV ANZ,R0 ;R0: ANZAHL ZU LESENDE WORTE .ENDC .ENDC .IF NB .IF DIF ,R1 MOV BUFADR,R1 ;R1: BUFFERADRESSE .ENDC .ENDC JSR PC,SENDE .ENDM SEND .LIST .SBTTL RUHEZUSTAND ;----------------- START:: JSR PC,INITIO ;INPUT-OUTPUT INITIALISIEREN .PRINT #SIP RESTAR: JSR PC,RESET .GTLIN #INBUF,#PRMPTC CMPB INBUF,#'M BNE 1$ JMP MASTER ;MASTER AKTIVIEREN 1$: CMPB INBUF,#'S BNE 2$ JMP SLAVE ;SLAVE AKTIVIEREN 2$: .PRINT #EMSG ;FEHLERMELDUNG BR RESTAR ; FEHLER BEIM SYNCHRONISIEREN ;---------------------------- SYNERR::.PRINT #ERRMSG BR RESTAR .SBTTL MASTER ;------------ ; ; MASTER:: JSR PC,MASYN ; SYNCHRONISIEREN BCS SYNERR ; ; ; MASTER FUER EINEN NEUEN BEFEHL BEREIT ;-------------------------------------- SYNMAS:: .NLIST .GTLIN #INBUF,#MAS MOV #1,GEPUEX ;GET-PUT-EXIT FLAG ; CMPB INBUF,#'G BEQ 1$ ;GET: GEPUEX=1 ; CMPB INBUF,#'P BNE 2$ MOV #-1,GEPUEX ;PUT: GEPUEX=-1 BR 1$ ; 2$: CMPB INBUF,#'W BNE 3$ CLR GEPUEX ;EXIT: GEPUEX=0 ; 1$: SEND #1,#GEPUEX ; TST GEPUEX BNE INFIL ;GET/PUT .PRINT #MASWA .EXIT ; EXIT MASTER TO RT11 ; ; ; 3$: CMPB INBUF,#'K BNE 4$ SEND #1,#INBUF ;KILL SELIN .EXIT ; 4$: CMPB INBUF,#'C BNE 5$ JMP MCOMM ;COMMAND ; 5$: .PRINT #ERMAS ;FEHLERMELDUNG BR SYNMAS ;NEUER BEFEHL ; ; ;INPUTFILE OEFFNEN ;----------------- INFIL:: .GTLIN #INBUF+1,#FROM ;ENTER COMMANDLINE MOVB #'=,INBUF ;MARKE FUER DEN CSI: NUR INPUTFILE(S) TST GEPUEX ;GET ODER PUT? BGT GETFIL ;GET: COMMANDLINE SENDEN ; ;PUT MOV SP,STACK ;SP SPEICHERN .CSIGEN #DEVSPC,#DEFEXT,#INBUF MOV STACK,SP ; MOV #-1,R3 ;ERRORCODE=-1: KEIN FEHLER BCC TESTIE MOVB @#ERRBYT,R3 ;ERRORCODE BR TESTIE ; ;GET GETFIL: SEND #42.,#INBUF ;COMMANDLINE SENDEN BCC 1$ ;KEIN UEBERTRAGUNGSFEHLER JMP MASERR ; 1$: RECEIV #OUTBUF ;ERRORCODE EMPFANGEN BCC 2$ ;KEIN UEBERTRAGUNGSFEHLER JMP MASERR ; 2$: MOV OUTBUF,R3 ;ERRORCODE TESTIE: TST R3 BLT OUTFIL ;KEIN FEHLER ; .PRINT #CSIER ;FEHLERMELDUNG ASL R3 .PRINT CSI(R3) BR INFIL ;NEUE COMMANDLINE ; ; ;OUTPUTFILESTRING ;---------------- OUTFIL:: .GTLIN #OUTBUF,#TO ;ENTER COMMANDLINE ; ; ;ERSTER INPUTFILESPECIFIER SUCHEN MOV #INBUF,R1 1$: INC R1 ;R1: INPUTSTRINGPOINTER CMPB (R1),#BLANK ;BLANKS UND KOMMAS UEBERLESEN BEQ 1$ CMPB (R1),#', BEQ 1$ ; ; ;OUTPUTFILESPECIFIER BEARBEITEN ;------------------------------ MOV #OUTBUF,R2 ;R2: OUTPUTSTRINGPOINTER OSPEC: TSTB (R2) BEQ INSPEC ;LEERZEILE --> INPUTSTRING UEBERNEHMEN CMPB (R2)+,#BLANK ;BLANKS UEBERLESEN BEQ OSPEC ; ; ':' SUCHEN MOV R2,R0 ;R0: HILFSPOINTER 1$: TSTB (R0) BEQ 3$ ;ZEILENENDE, KEIN ':' VORHANDEN CMPB (R0)+,#': ;':' MERKMAL EINER DEVICE ANGABE BNE 1$ ;':' GEFUNDEN 2$: TSTB (R0) BEQ DEV ;NUR DEVICE ANGEGEBEN ; --> FILENAME VOM INPUTSTRING UEBERNEHMEN CMPB (R0)+,#BLANK BEQ 2$ ;BLANKS UEBERLESEN ; ; '.' SUCHEN 3$: MOV R2,R0 ;R0: HILFSPOINTER 4$: TSTB (R0) BEQ EXT ;ZEILENENDE, KEIN '.' ; --> EXTENSION VOM INPUTSTRING CMPB (R0)+,#'. ;'.' MERKMAL EINER EXTENSION BNE 4$ BR OCONT ;'.' GEFUNDEN --> OUTPUTFILESPECIFIER VOLL- ;STAENDIG, KEINE ERGAENZUNG NOTWENDIG ; ; DEV: MOV R0,R2 ;R2: OUTPUTSTRINGPOINTER MOV R1,R0 1$: TSTB (R0) BEQ INSPEC ;ZEILENENDE, KEINE DEV: ANGABE CMPB (R0),#', BEQ INSPEC ;KOMMA " " CMPB (R0)+,#': ;EV. VORHANDENE DEV: ANGABE IM INPUTSTRING ;UEBERLESEN BNE 1$ MOV R0,R1 ;':' GEFUNDEN BR INSPEC ; ; EXT: MOV R0,R2 ;R2: OUTPUTSTRINGPOINTER MOVB #'.,(R2)+ ;'.' ANHAENGEN MOV R1,R0 1$: TSTB (R0) BEQ 2$ ;ZEILENENDE CMPB (R0),#', BEQ 2$ ;KOMMA CMPB (R0)+,#'. ;FILENAME IM INPUTSTRING UEBERLESEN BNE 1$ 2$: MOV R0,R1 ;'.' ODER ENDE DES INPUTFILESPEC GEFUNDEN ; ; INSPEC: ;REST DES INPUTFILESPEC AUF DEN OUTPUTSTRING KOPIEREN TSTB (R1) BEQ 1$ ;ZEILENENDE CMPB (R1),#', BEQ 1$ ;ENDE DES INPUTFILESPEC MOVB (R1)+,(R2)+ BR INSPEC 1$: CLRB (R2) ;ENDMARKE OUTPUTSTRING ; ;PRUEFEN, OB NUR DAS 1. OUTPUTFILE ANGEGEBEN WURDE OCONT: MOV #OUTBUF,R1 1$: CMPB (R1),#', ;KEIN KOMMA --> BNE 2$ ; NUR DAS 1. OUTPUTFILE IST ZULAESSIG .PRINT #OFILER BR OUTFIL ;NEUE COMMANDLINE ; 2$: TSTB (R1)+ ;ZEILENENDE SUCHEN,DIESES BNE 1$ CLRB (R1) ; NEU SETZEN UND MOVB #'=,-(R1) ; '=' ANHAENGEN ; ; ;OUTPUTFILE OEFFNEN ;------------------ TST GEPUEX ;GET ODER PUT? BLT PUTFIL ;COMMANDLINE SENDEN ; ;GET MOV SP,STACK ;SP SPEICHERN .CSIGEN #DEVSPC,#DEFEXT,#OUTBUF MOV STACK,SP ; MOV #-1,R3 ;ERRORCODE=-1: KEIN FEHLER BCC TESTOE ;KEIN FEHLER MOVB @#ERRBYT,R3 ;ERRORCODE BR TESTOE ; ;PUT PUTFIL: SEND #42.,#OUTBUF ;COMMANDLINE SENDEN BCC 1$ ;KEIN UEBERTRAGUNGSFEHLER JMP MASERR ; 1$: RECEIV #INBUF ;ERRORCODE EMPFANGEN BCC 2$ JMP MASERR ; 2$: MOV INBUF,R3 ;ERRORCODE TESTOE: TST R3 ;FEHLER BEIM OEFFNEN DES OUTPUTFILES? BLT MTRANS ;KEIN FEHLER .PRINT #CSIER ;FEHLERMELDUNG ASL R3 .PRINT CSI(R3) JMP OUTFIL ;NEUE COMMANDLINE ; ; ;TRANSFER ;-------- MTRANS: TST GEPUEX BGT 1$ JSR PC,QUELLE ;PUT: MASTER IST DATENQUELLE BR 2$ ; 1$: JSR PC,SENKE ;GET: MASTER IST DATENSENKE 2$: CMP R3,#77 BNE 3$ JMP MASERR ;UEBERTRAGUNGSFEHLER ; 3$: ASL R3 .PRINT TR(R3) TST R3 BEQ 4$ ;KEIN FEHLER WAEHREND DES TRANSFERS ASL R4 .PRINT RWER(R4) ;READ/WRITE FEHLERMELDUNG ; 4$: JMP SYNMAS ;MASTER BEREIT FUER EINEN ;WEITEREN BEFEHL ; ; ;COMMAND STRING SENDEN (C-BEFEHL) ;-------------------------------- MCOMM:: SEND #1,#INBUF .GTLIN #INBUF,#COMPRT ;GET COMMAND STRING SEND #42.,#INBUF .EXIT .LIST .SBTTL SLAVE ;----------- ; ; SLAVE:: JSR PC,SLSYN ;SYNCHRONISIEREN BCC SYNSLA JMP SYNERR ; ; SLAVE FUER EINEN NEUEN BEFEHL BEREIT ;------------------------------------- SYNSLA:: .NLIST .PRINT #SLA RECEIV #GEPUEX ;GEPUEX-FLAG EMPFANGEN BCC 1$ ;KEIN UEBERTRAGUNGSFEHLER JMP SLAERR ; 1$: CMPB GEPUEX,#'K BNE 2$ .EXIT ;KILL SELIN ; 2$: CMPB GEPUEX,#'C BNE 3$ JMP SCOMM ;COMMAND ; 3$: TST GEPUEX ;GET, PUT ODER EXIT-MASTER-MODE? BNE FILE ;GET/PUT JSR PC,RESET .PRINT #SLAWA JMP SLAVE ; WAIT AS SLAVE ; ; ;FILE OEFFNEN ;------------ FILE: RECEIV #INBUF ;COMMANDLINE EMPFANGEN BCC 1$ ;KEIN UEBERTRAGUNGSFEHLER JMP SLAERR ; 1$: MOV SP,STACK ;SP SPEICHERN .CSIGEN #DEVSPC,#DEFEXT,#INBUF MOV STACK,SP ; MOV #-1,INBUF ;ERRORCODE=-1: KEIN FEHLER BCC 2$ MOVB @#ERRBYT,INBUF ;ERRORCODE CLRB INBUF+1 2$: SEND #1,#INBUF ;ERRORCODE SENDEN BCC 3$ ;KEIN UEBERTRAGUNGSFEHLER JMP SLAERR ; 3$: TST INBUF ;FEHLER? BGE FILE ;JA, NEUE COMMANDLINE ; ; ;TRANSFER ;-------- TST GEPUEX BGT 4$ ;GET JSR PC,SENKE ;PUT: SLAVE IST DATENSENKE BR 5$ 4$: JSR PC,QUELLE ;GET: SLAVE IST DATENQUELLE 5$: CMP R3,#77 BNE 6$ JMP SLAERR ;UEBERTRAGUNGSFEHLER ; 6$: JMP SYNSLA ;SLAVE FUER NEUEN BEFEHL BEREIT ; ; ; ;UEBERTRAGUNGSFEHLER ;------------------- MASERR:: SLAERR:: .PRINT #UEBERR .EXIT ; ; ;COMMAND STRING EMPFANGEN UND .EXIT VORBEREITEN ;---------------------------------------------- SCOMM:: RECEIV #512 CLR @#510 MOV #512,R0 1$: INC @#510 TSTB (R0)+ BNE 1$ BIS #4000,@#44 CLR R0 .EXIT .SBTTL DATENQUELLE UND -SENKE ;---------------------------- ; ; ;INPUTPAR.: KEINE ;OUTPUTPAR.: R3: INFORMATION UEBER AUFGETRETENE FEHLER ; =0: KEIN FEHLER ; =1: WRITE-ERROR ; =-1: READ-ERROR ; =77: UEBERTRAGUNGSFEHLER ; R4: ERRORCODE (NUR FUER R3=1,R3=-1) ; =0: EOF ; =1: HARD ERROR ; =2: CHANAL NOT OPEN ;VERAENDERTE REG.: R0,R1,R3,R4 ; ; ;SUBROUTINE QUELLE ;----------------- QUELLE:: CLR R3 ;KEIN FEHLER MOV #3,CHAN ;1. INPUTKANAL ; NXCHAN: .CSTAT #AREA,CHAN,#INBUF;PRUEFEN, OB KANAL OFFEN IST BCS QCLOS ;KANAL NICHT OFFEN ; ;EIN KANAL LEEREN: CLR BLKCNT ;BLOCKZAEHLER QREP: .READW #AREA,CHAN,#INBUF,#256.,BLKCNT ;256. WORTE LESEN BCS QREADE ;READ-ERROR ; MOV R0,WCNT ;WORTZAEHLER INC BLKCNT ;BLOCKZAEHLER SEND #1,#WCNT ;ANZAHL GELESENE WORTE SENDEN BCC QL1 QUEBER: MOV #77,R3 ;UEBERTRAGUNGSFEHLER BR QCLOS ; QL1: SEND WCNT,#INBUF ;DATEN SENDEN BCS QUEBER ;UEBERTRAGUNGSFEHLER RECEIV #INBUF ;QUITTUNG EMPFANGEN BCS QUEBER ; TST INBUF BLT QREP ;KEIN WRITE-ERROR INC R3 ;WRITE-ERROR MOVB INBUF,R4 ;ERRORCODE BR QCLOS ; ;READ-ERROR QREADE: MOVB @#ERRBYT,R4 ;ERRORCODE BEQ QCLOS ;EOF DEC R3 ;READ-ERROR ; ;KANAL SCHLIESSEN QCLOS: .CLOSE CHAN INC CHAN ;NAECHSTER KANAL CMP CHAN,#10 BGT QENDE ;ALLE KANAELE BEARBEITET TST R3 BEQ NXCHAN ;KEIN FEHLER --> KANAL LEEREN BR QCLOS ;FEHLER --> KANAL SCHLIESSEN ; QENDE: CLR INBUF TST R3 BGT 2$ ;WRITE- ODER UEBERTRAGUNGSFEHLER BEQ 1$ ;KEIN FEHLER MOV R4,INBUF NEG INBUF 1$: SEND #1,#INBUF ;EOF RESP. ERRORCODE SENDEN ; 2$: RTS PC ; ; ; ; ;SUBROUTINE SENKE ;---------------- SENKE:: CLR R3 ;KEIN FEHLER CLR BLKCNT ;BLOCKZAEHLER CLR CHAN ;KANAL 0 ; SREP: RECEIV #WCNT ;WORTZAEHLER, EOF RESP. READ-ERROR ;CODE EMPFANGEN BCC SL1 SUEBER: MOV #77,R3 ;UEBERTRAGUNGSFEHLER BR SCLOS ; SL1: TST WCNT BEQ SCLOS ;EOF BGT 2$ ;KEIN READ-ERROR MOV WCNT,R4 NEG R4 ;READ-ERROR CODE DEC R3 ;READ-ERROR BR SCLOS ; 2$: RECEIV #INBUF ;DATEN EMPFANGEN BCS SUEBER ;UEBERRAGUNGSFEHLER ; .WRITW #AREA,CHAN,#INBUF,WCNT,BLKCNT BCS SWRITE ;WRITE-ERROR INC BLKCNT ;BLOCKZAEHLER MOV #-1,INBUF SEND #1,#INBUF ;QUITTUNG: KEIN FEHLER BR SREP ; ;WRITE-ERROR SWRITE: INC R3 MOVB @#ERRBYT,R4 ;WRITE-ERROR CODE MOV R4,INBUF SEND #1,#INBUF ;QUITTUNG: WRITE-ERROR ; ;CLOSE OUTPUTFILES SCLOS: MOV #2,R1 1$: .CLOSE R1 DEC R1 BGE 1$ RTS PC ; ; ;LOKALE VARIABLEN (QUELLE, SENKE) WCNT:: 0 BLKCNT: 0 CHAN: 0 AREA: .BLKW 5 .LIST .SBTTL SEND UND RECEIV ;----------------------- ; ; ;SUBROUTINE SEND ;--------------- ;INPUTPAR.: R0: ANZAHL ZU SENDENDE WORTE ; R1: BUFFERADRESSE ;OUTPUTPAR.: C-BIT: 0 KEIN FEHLER ; 1 FATALER UEBERTRAGUNGSFEHLER ;VERAENDERTE REGISTER: R0,R1 ; ;DIE UEBERTRAGUNG WIRD DURCH EINE CHECKSUM KONTROLLIERT. ;BEI EINEM FEHLER WIRD DER TRANSFER EINMAL WIEDERHOLT. ;TRITT ERNEUT EIN FEHLER EIN, WIRD DAS C-BIT GESETZT. ; ; SENDE:: JSR PC,SNDINI ;SYNCHRONISIEREN AUF SERIELLEN LINK BCS SEER ;FEHLER ;INITIALISIEREN MOV R0,ANZ ;PARAMETER SPEICHERN MOV R1,BUF MOV #-3,FLAG ;FLAG FUER EINE EINMALIGE WIEDER- ;HOLUNG DES TRANSFERS ;CHECKSUM BERECHNEN REPSE: INC FLAG MOV ANZ,R0 MOV R0,CHECK ;CHECKSUM:=ANZAHL WORTE MOV BUF,R1 1$: ADD (R1)+,CHECK ;CHECK:=CHECK+WORT SOB R0,1$ ;TRANSFER OUTPUT #1,#ANZ OUTPUT ANZ,BUF OUTPUT #1,#CHECK WAITF READY ;QUITTUNG KONTROLLIEREN INPUT #3,#BFFR WAITF DONE ;WARTEN AUF DIE QUITTIERUNG MOV BFFR,R0 ;DREI ZAHLEN ADD BFFR+2,R0 ADD BFFR+4,R0 ;DIE SUMME MUSS NULL SEIN BNE 2$ ;FEHLER CLC ;C-BIT=0: KEIN FEHLER RTS PC ; ;UEBERTRAGUNGSFEHLER 2$: INC ERRSE ;FEHLERZAHL AUFSUMMIEREN .PRINT #CHECKS TST FLAG BLE REPSE ;VERSUCH FEHLERHAFT --> ;TRANSFER WIEDERHOLEN SEER: SEC ;C-BIT=1: FATAL ERROR RTS PC ;SUBROUTINE RECEIV ;----------------- ;INPUTPAR.: R1: BUFFERADRESSE ;OUTPUTPAR.: R0: ANZAHL EMPFANGENER WORTE ; C-BIT: 0 KEIN FEHLER ; 1 FATALER UEBERTRAGUNGSFEHLER ;VERAENDERTE REGISTER: R0,R1 ; ; RECEI:: JSR PC,RCVINI ;SYNCHRONISIEREN AUF SERIELLEN LINK BCS REER ;FEHLER ;INITIALISIEREN MOV R1,BUF ;BUFFERADRESSE MOV #-3,FLAG ;FLAG FUER EINE WIEDERHOLUNG DES TRANSFERS ;TRANSFER REPRE: INC FLAG INPUT #1,#ANZ WAITF DONE INPUT ANZ,BUF INPUT #1,#CHECK WAITF DONE ;CECKSUM KONTROLLIEREN MOV ANZ,R0 SUB R0,CHECK ;CHECK:=CHECK-ANZAHL WORTE MOV BUF,R1 1$: SUB (R1)+,CHECK ;CHECK:=CHECK-WORT SOB R0,1$ ;QUITTIEREN MOV CHECK,R0 ;KEIN FEHLER --> CHECK=0 MOV R0,BFFR MOV R0,BFFR+2 ;FEHLER --> DREI ZAHLEN, DEREN SUMME MOV R0,BFFR+4 ;VERSCHIEDEN VON 0 IST, ALS QUITTUNG OUTPUT #3,#BFFR WAITF READY MOV ANZ,R0 ;OUTPUTPARAMETER TST CHECK BNE 2$ ;CHECKSUM ERROR CLC ;C-BIT=0: KEIN FEHLER RTS PC ; ;UEBERTRAGUNGSFEHLER 2$: INC ERRRE ;FEHLERZAHL AUFSUMMIEREN .PRINT #CHECKS TST FLAG BLE REPRE ;VERSUCH FEHLERHAFT --> ; TRANSFER WIEDERHOLEN REER: SEC ;C-BIT=1: FATALER UEBERTRAGUNGSFEHLER RTS PC ; ; ; ;LOKALE VARIABLEN FUER SEND UND RECEIVE ANZ:: 0 BUF: 0 FLAG: 0 CHECK: 0 ERRSE: 0 ERRRE: 0 BFFR: .BLKW 3 ;SBTTL SYNCHRONISATION DES SERIELLEN INTERFACES ;---------------------------------------------- .ENABL LC MASTEF= 1 SLAVEF =-1 MASYN: TSTB @OUTCS ;OUTPUT BEREIT? BPL MASYN MOVB #'M,@OUTDB ;SENDE 'M' 1$: TSTB @INCS ;INPUT BEREIT? BPL 1$ 2$: TSTB @OUTCS BPL 2$ CMPB @INDB,#'S ;EMPFANGE 'S' (=SLAVE) BNE 10$ 4$: MOVB #'m,@OUTDB ;SENDE QUITTUNG 3$: TSTB @INCS BPL 3$ CMPB @INDB,#'s ;EMPFANGE QUITTUNG BNE 11$ MOV #MASTEF,SYNCH ;SYNCHRONISATION ERFOLGREICH CLC RTS PC 10$: TSTB @INCS BPL 10$ CMPB @INDB,#'S ;NOCH EIN VERSUCH BEQ 4$ MOVB #DEL,@OUTDB ;SENDE 'DELETE' ; --> SYNCHRONISATIONS FEHLER 11$: SEC RTS PC SLSYN: TSTB @OUTCS ;OUTPUT BEREIT? BPL SLSYN MOVB #'S,@OUTDB ;SENDE 'S' 1$: TSTB @INCS ;INPUT BEREIT? BPL 1$ 2$: TSTB @OUTCS BPL 2$ CMPB @INDB,#'M ;EMPFANGE 'M' (=MASTER) ;; BNE 10$ BNE SLSYN 4$: MOVB #'s,@OUTDB ;SENDE QUITTUNG 3$: TSTB @INCS BPL 3$ CMPB @INDB,#'m ;EMPFANGE QUITTUNG BNE 11$ MOV #SLAVEF,SYNCH ;SYNCHRONISATION ERFOLGREICH CLC RTS PC 10$: TSTB @INCS BPL 10$ CMPB @INDB,#'M ;NOCH EIN VERSUCH BEQ 4$ MOVB #DEL,@OUTDB ;SENDE 'DELETE' ; --> SYNCHRONISATIONS FEHLER JMP SLSYN ;* NEU VON -tf- 11$: SEC RTS PC ;SYNCHRONISATION VOR EINEM TRANSFER ;---------------------------------- SNDINI::MOV R0,-(SP) MOV #'S,R0 ;'S' FUER SENDEN SNDRCV: TST SYNCH BMI 5$ ;SLAVE IST AKTIV ;MASTER 1$: TSTB @OUTCS BPL 1$ MOVB R0,@OUTDB 2$: TSTB @INCS BPL 2$ CMPB @INDB,#'O ;EMPFANGE 'O' (=OKAY) BNE 10$ ;FEHLER CLC BR 20$ ;SLAVE 5$: TSTB @INCS BPL 5$ 6$: TSTB @OUTCS BPL 6$ CMPB R0,#'S ;SEND ODER RECEIV? BEQ 8$ MOV #'S,R0 ;SLAVE IST IN RECEIV BR 9$ 8$: MOV #'R,R0 ;SLAVE IST IN SEND 9$: CMPB @INDB,R0 BNE 7$ ;FEHLER MOVB #'O,@OUTDB CLC BR 20$ 7$: MOVB #DEL,@OUTDB ;ERROR QUITTUNG 10$: SEC 20$: MOV (SP)+,R0 RTS PC RCVINI::MOV R0,-(SP) MOV #'R,R0 ;'R' FUER RECEIV BR SNDRCV .SBTTL SERIAL INPUT-OUTPUT ;------------------------- ;GERAETEREGISTER UND VEKTOREN ;---------------------------- ;DL-INTERFACE: DLICS=176560 DLIDB=DLICS+2 DLOCS=DLICS+4 DLODB=DLICS+6 DLVEK=160 ;GT-INTERFACE: GTICS=176550 GTIDB=GTICS+2 GTOCS=GTICS+4 GTODB=GTICS+6 GTVEK=170 PRIO=4 INTEN=100 ;INITIALISIEREN (WELCHES INTERFACE, VEKTOREN ETC.) ;------------------------------------------------ INITIO:: .GTLIN #INBUF,#MESSAGE CMPB INBUF,#'D ;'D' FUER DL-INTERFACE BNE 1$ ;DL-INTERFACE MOV #DLICS,INCS MOV #DLIDB,INDB MOV #DLOCS,OUTCS MOV #DLODB,OUTDB MOV #DLVEK,VEK BR CONT 1$: CMPB INBUF,#'G ;'G' FUER GT-INTERFACE BNE INITIO ;GT-INTERFACE MOV #GTICS,INCS MOV #GTIDB,INDB MOV #GTOCS,OUTCS MOV #GTODB,OUTDB MOV #GTVEK,VEK CONT: .PROTECT #OUTBUF,VEK BCC 1$ .PRINT #PROMSG .EXIT 1$: MOV VEK,R0 MOV #ININTR,(R0)+ ;INPUT INTERRUPT VEKTOR MOV #340,(R0)+ MOV #OUTINT,(R0)+ ;OUTPUT INTERRUPT VEKTOR MOV #340,(R0) MOV INCS,3$ MOV OUTCS,3$+4 .DEVICE #OUTBUF,#3$ ;STOP INPUT UND OUTPUT ; BEI PROGRAMMABBRUCH RTS PC 3$: 0,0,0,0,0 ;FUER .DEVICE ;SUBROUTINE RESET ;---------------- ;DISABLES INTERRUPTS ;SETZT DONE UND READY AUF -1 (FREI) RESET:: CLR @INCS ;STOP INPUT CLR @OUTCS ;STOP OUTPUT CLR SYNCH ;SYNCHRONISIERUNGSFLAG MOV #-1,DONE ;WIPOIN FREI MOV #-1,READY ;WIPOUT FREI RTS PC ;SUBROUTINE INPUT ;---------------- ;INPUTPAR.: R0: ANZAHL ZU LESENDE ZEICHEN ; R1: BUFFERADRESSE ;OUTPUTPAR.: DONE=0 TRANSFER NOCH NICHT BEENDET ; =-1 INPUT BEREIT ;VERAENDERTE REGISTER: KEINE INPT:: WAITF DONE ;SELIN11 FREI FUER INPUT ? ;NEIN ==> WARTEN MOV R0,INWC ;GET WORD COUNT ASL INWC ;ZAEHLER VERDOPPELN MOV R1,INBUPO ;GET BUFFER ADDRESS CLR DONE ;MARK BUSY (INTERN) MOV #INTEN,@INCS ;READY FOR DATA: ENABLE INTERRUPT RTS PC ; ININTR: .INTEN PRIO MOVB @INDB,@INBUPO ;READ DATA INC INBUPO DEC INWC ;COUNT DATA BEQ INFERT ;ALL DONE ? RTS PC ; INFERT: CLR @INCS ;STOP INPUT DEC DONE ;MARK END OF TRANSFER (INTERN) RTS PC ; DONE:: -1 ;-1 FREI; 0 BESETZT INBUPO: 0 ;ZEIGT AUF DATENPUFFER INWC: 0 ;WORD COUNT ; ; ; ; ;SUBROUTINE OUTPUT ;----------------- ;INPUTPAR.: R0: ANZAHL ZU SCHREIBENDE ZEICHEN ; R1: BUFFERADRESSE ;OUTPUTPAR.: READY=0 TRANSFER NOCH NICHT BEENDET ; =-1 OUTPUT BEREIT ;VERAENDERTE REGISTER: KEINE ; OUTPT::WAITF READY ;SELIN11 FREI FUER OUTPUT ;NEIN ==> WARTEN MOV R0,OUTWC ;GET WORD COUNT ASL OUTWC ;ZAEHLER VERDOPPELN MOV R1,OBUPO ;GET BUFFER ADDRESS CLR READY ;MARK BUSY (INTERN) MOV #INTEN,@OUTCS ;WAIT FOR READY RTS PC ; OUTINT: .INTEN PRIO MOVB @OBUPO,@OUTDB ;WRITE DATA DEC OUTWC ;ALL DONE ? BLE OUTFER INC OBUPO RTS PC ; OUTFER: CLR @OUTCS ;STOP OUTPUT DEC READY ;MARK FERTIG (INTERN) RTS PC ; READY:: -1 ;BUSY-FLAG: -1 FREI; 0 BESETZT OUTWC: 0 ;WORD COUNT OBUPO: 0 ;ZEIGT AUF DATENPUFFER .SBTTL VARIABLEN, BUFFERS UND MELDUNGEN ;--------------------------------------- .ENABL LC OUTBUF::.BLKW 258. INBUF:: .BLKW 258. GEPUEX::0 STACK: 0 SYNCH: 0 INCS: 0 INDB: 0 OUTCS: 0 OUTDB: 0 VEK: 0 DEFEXT: .WORD 0,0,0,0 CSI: CSIER0 CSIER1 CSIER2 CSIER3 CSIER4 READER TR: NOER WRITER RWER: RWER0 RWER1 RWER2 PRMPTC: .BYTE '#,200 SIP: .ASCIZ/SELIN-11 V001/ MESSAGE:.ASCII/SELIN serial interface: - DL: TYPE 'D'/ .ASCII/ - GT: " 'G' :/ .BYTE 200 PROMSG: .ASCIZ/?SELIN-F-Protect error/ EMSG: .ASCII/? Illegal Command/ .ASCII/ Type 'S' for Slave or/ .ASCIZ/ 'M' for Master/ ERRMSG: .ASCIZ/Synchronization Error/ MAS: .ASCII/Master: /<200> FROM: .ASCII/From? /<200> TO: .ASCII/To? /<200> COMPRT: .ASCII/Command? /<200> SLA: .ASCIZ/Slave/ MASWA: .ASCIZ /?SELIN-I-Slave is waiting for YOU !!!/ SLAWA: .ASCIZ /?SELIN-I-Waiting as Slave/ ERMAS: .ASCII/?SELIN-W-Illegal Command in Master-Mode/ .ASCII/ Type 'G' for GET a File from the Slave/ .ASCII/ 'P' for PUT a File to the Slave/ .ASCII/ 'W' for Slave WAIT, Master EXIT to RT11/ .ASCII/ 'K' for KILL SELIN (Master and Slave)/ .ASCII/ 'C' for send a Monitor COMMAND Line/ .ASCII/ to the other Computer, kill SELIN/ .ASCIZ/ and execute the COMMAND/ CHECKS: .ASCIZ/Checksum Error (Warning)/ UEBERR: .ASCIZ/?SELIN: Transmission Error/ CSIER: .ASCII/?SELIN-F-CSI Error: /<200> CSIER0: .ASCIZ/Illegal Command/ CSIER1: .ASCIZ/Device not found/ CSIER2: .BYTE 0 CSIER3: .ASCIZ/Directory full/ CSIER4: .ASCIZ/Input File not found/ OFILER: .ASCIZ/? Please only one Output File/ READER: .ASCII/Read Error: / NOER: .BYTE 200 WRITER: .ASCII/Write Error: /<200> RWER0: .ASCIZ/End-of-File/ RWER1: .ASCIZ/Hard Error/ RWER2: .ASCIZ/Channel not open/ .EVEN DEVSPC: .BLKW 1000 ;SPACE FOR DEVICE-HANDLER .END START