diff --git a/m770/77as.frm b/m770/77as.frm
new file mode 100755
index 000000000..86527e363
--- /dev/null
+++ b/m770/77as.frm
@@ -0,0 +1,154 @@
+USE 12
+JOIN 9 INTO CODDITTA=CODDITTA
+JOIN 6 INTO TIPOA=TIPOASOC CODANAGR=CODANAGRSO
+JOIN 8 TO 6 ALIAS 108 INTO CODANAGR=CODANAGR
+JOIN 13 TO 108@ ALIAS 113 INTO COM==COMNASC
+END
+
+DESCRIPTION
+BEGIN
+  12->* "Soci"
+  9->* "Ditte"
+  6->* "Anagrafica persone fisiche e giuridiche"
+  108@->* "Anagrafica persone fisiche"
+  113@->* "Comuni (nascita)"
+END
+
+GENERAL
+BEGIN
+  OFFSET 0 0
+  FONT "Courier New"
+  SIZE 11
+  CARATTERE "X"
+  INIZIO_POS 1 1
+  FINE_POS 131
+  GRID "+++++++++-|"
+END
+
+SECTION HEADER FIRST 9
+
+STRINGA 1
+BEGIN
+   KEY "INTESTAZIONE 1"
+   PROMPT 1 1 "MOD. 770/96      DICHIARAZIONE DEL SOSTITUTO D'IMPOSTA: DENOMINAZIONE SOSTITUTO"
+END
+
+STRINGA 2
+BEGIN
+   KEY "INTESTAZIONE 2"
+   PROMPT 1 3 "                       ELENCO NOMINATIVO DEGLI AMMINISTRATORI E DEI COMPONENTI DEL COLLEGIO SINDACALE"
+END
+
+STRINGA 3
+BEGIN
+   KEY "INTESTAZIONE 3"
+   PROMPT 1 4 "                                   O DI ALTRO ORGANO DI CONTROLLO DELLA SOCIETA' O ENTE"
+END
+
+STRINGA 4
+BEGIN
+   KEY "INTESTAZIONE 4"
+   PROMPT 1 5 "           (o, in mancanza, dei soggetti che rispondono personalmente delle obbligazioni della societa' o ente)"
+END
+
+STRINGA 5
+BEGIN
+   KEY "INTESTAZIONE 5"
+   PROMPT 1 7 "-----------------------------------------------------------------------------------------------------------------------------------"
+END
+
+STRINGA 6
+BEGIN
+   KEY "INTESTAZIONE 6"
+   PROMPT 1 8 "N.ord.  Cognome e nome                                       Sesso  Comune di nascita     Prov.    Data     Codice fiscale    Qual."
+//                                                                                                                11111111111111111111111111111111
+//                      11111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111222222222233
+//             12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901
+//             12345   123456789012345678901234567890 123456789012345678901   1    12345678901234567890   12    12/12/123  1234567890123456   1
+END
+
+STRINGA 7
+BEGIN
+   KEY "INTESTAZIONE 7"
+   PROMPT 1 9 "-----------------------------------------------------------------------------------------------------------------------------------"
+END
+
+STRINGA 8
+BEGIN
+ KEY "RAGIONE SOCIALE"
+ //PROMPT 31 2 ""
+ PROMPT 82 1 ""
+ FIELD 9->RAGSOC
+ FIELD 9->RAGSOC
+END
+
+END
+
+SECTION BODY ODD 1
+
+NUMERO 1
+BEGIN
+   KEY "N.ORD"
+   PROMPT 1 1 ""
+   PICTURE "#####"
+END
+
+STRINGA 2
+BEGIN
+ KEY "COGNOME"
+ PROMPT 9 1 ""
+ FIELD 6->RAGSOC[1,30]
+END
+
+STRINGA 3
+BEGIN
+ KEY "NOME"
+ PROMPT 40 1 ""
+ FIELD 6->RAGSOC[31,50]
+END
+
+STRINGA 4
+BEGIN
+ KEY "SESSO"
+ PROMPT 64 1 ""
+ FIELD 108@->SESSO
+END
+
+STRINGA 5
+BEGIN
+ KEY "COMUNE DI NASCITA"
+ PROMPT 69 1 ""
+ FIELD 113@->DENCOM[1,20]
+END
+
+STRINGA 6
+BEGIN
+ KEY "PROV. DI NASCITA"
+ PROMPT 92 1 ""
+ FIELD 113@->PROVCOM
+END
+
+STRINGA 7
+BEGIN
+ KEY "DATA DI NASCITA"
+ PROMPT 98 1 ""
+ FIELD 108@->DATANASC
+END
+
+STRINGA 8
+BEGIN
+ KEY "CODICE FISCALE"
+ PROMPT 109 1 ""
+ FIELD 6->COFI
+END
+
+STRINGA 9
+BEGIN
+ KEY "QUALIFICA"
+ PROMPT 128 1 ""
+ FIELD 12->RICQUAL
+END
+
+END
+
+END
diff --git a/m770/77stas.cpp b/m770/77stas.cpp
new file mode 100755
index 000000000..d9bf0ac8e
--- /dev/null
+++ b/m770/77stas.cpp
@@ -0,0 +1,99 @@
+// stampa allegato soci
+#include "77stba.h"
+#include "soci.h"
+
+bool AlleSoci_filter_function(const TRelation* rel)
+{ 
+  TString qual(3);               
+  qual = rel->lfile(LF_SOCI).get(SOCI_RICQUAL); 
+  return (qual=="A" || qual=="B" || qual=="C");
+}
+
+long TAlleSoci::filtra(const long codditta)
+{
+  TString filtro(24); 
+  _codditta=codditta;
+  
+  TLocalisamfile& fl = cursor()->file(LF_SOCI);
+  TRectype da(fl.curr());
+  TRectype a(fl.curr());   
+  da.zero();
+  a.zero();
+  da.put(SOCI_CODDITTA, codditta);
+  da.put(SOCI_ATTPREC, "A");
+  da.put(SOCI_TIPOASOC, "F");
+  a.put(SOCI_CODDITTA, codditta);
+  a.put(SOCI_ATTPREC, "A");
+  a.put(SOCI_TIPOASOC, "F");
+  cursor()->setregion(da, a);
+
+  cursor()->set_filterfunction(AlleSoci_filter_function);
+  const long items = cursor()->items();
+  return items;
+}
+
+void TAlleSoci::set_testata(TPrinter& pr)
+{
+  TPrint_section& header = section('H', first_page);
+  header.update();
+  const int header_righe = header.height();
+  for (int i = 0; i < header_righe; i++)
+  	pr.setheaderline(i, header.row(i));	
+}
+
+void TAlleSoci::stampa_corpo(TPrinter& pr)
+{
+  TPrint_section& body = section('B', odd_page);
+	_nprog++;  
+  TForm_item& item_nprog = body.find_field(1);
+  TString snprog(5);
+  snprog << _nprog;
+  item_nprog.set(snprog);
+  
+  body.update();       
+  const int body_righe = body.height();
+  for (int i = 0; i < body_righe; i++)
+  {
+    pr.print(body.row(i));
+    _RigaCorr++;
+  }
+  if (usa_progind())
+    progind()->addstatus(1);
+}
+ 
+bool TAlleSoci::print(const long codditta, const long NumFis, const long NumNoFis)
+{  
+  TCursor* cur = cursor();
+  TPrinter& pr = printer();
+  
+  const long numsoci = filtra(codditta);
+  if (numsoci <= 11)
+  	return FALSE;
+
+  (*cur)=0L;  
+	set_testata(pr);  	
+  	
+  _RigaCorr=0;
+  _nprog=0;
+
+  for ((*cur)=0L; cur->ok(); ++(*cur))
+  	stampa_corpo(pr);       
+	pr.formfeed();
+  close_print();                                      
+  return TRUE;
+}
+
+bool TStampaAlleSoci::user_create()
+{
+	_form = new TAlleSoci("77AS", quadro());
+	_form->set_cursor(_form->TForm::cursor());
+	_cur = _form->cursor();
+	_rel = _form->relation();
+	return TRUE;
+}  
+
+bool TStampaAlleSoci::user_destroy()
+{
+	delete _form;
+	return TRUE;
+}
\ No newline at end of file
diff --git a/m770/77stba.h b/m770/77stba.h
index ebb56f878..a32c54989 100755
--- a/m770/77stba.h
+++ b/m770/77stba.h
@@ -323,5 +323,40 @@ class TStampaQuadroAggN : public TStampaQuadro
     virtual ~TStampaQuadroAggN() { }
 };
 
+class TAlleSoci : public TDicForm
+{ 
+		long _codditta;
+		int _nprog;
+	protected:		
+    void stampa_corpo(TPrinter& pr);  
+    void set_testata(TPrinter& pr);
+    virtual long filtra(const long codditta);
+  public:                 
+    virtual bool  print(const long codditta, const long NumFis = 0, const long NumNoFis = 0);
+    TAlleSoci(const char* sNomeForm, const char* quadro) : TDicForm(sNomeForm, quadro)  {}
+    virtual ~TAlleSoci() {}
+		
+};
+
+class TStampaAlleSoci : public TStampaQuadro
+{
+  private:
+    TAlleSoci*  _form;
+    TRelation*  _rel;
+    TCursor*    _cur;
+    
+  protected:    
+    virtual bool conta_tipi_per()    const { return FALSE; }
+    
+    virtual TDicForm* get_form()     const { return _form; }
+    virtual TCursor*  get_cursor()   const { return _cur; }
+    
+    virtual bool user_create();
+    virtual bool user_destroy();
+
+  public:
+    TStampaAlleSoci(const char* quadro, char liv):TStampaQuadro(quadro, liv) {}
+    virtual ~TStampaAlleSoci() { }
+};
 
 #endif
diff --git a/m770/soci.h b/m770/soci.h
new file mode 100755
index 000000000..82e4cc102
--- /dev/null
+++ b/m770/soci.h
@@ -0,0 +1,16 @@
+// campi archivio SOCI
+
+
+#define SOCI_CODDITTA    "CODDITTA"
+#define SOCI_ATTPREC     "ATTPREC"
+#define SOCI_TIPOASOC    "TIPOASOC"
+#define SOCI_CODANAGRSO  "CODANAGRSO"
+#define SOCI_DATAAGG     "DATAAGG"
+#define SOCI_CODCAR      "CODCAR"
+#define SOCI_SCADCAR     "SCADCAR"
+#define SOCI_NQUOTEAZ    "NQUOTEAZ"
+#define SOCI_PERCQUAZ    "PERCQUAZ"
+#define SOCI_PERCAZREDD  "PERCAZREDD"
+#define SOCI_PERCAZPERD  "PERCAZPERD"
+// MANCANO DEI CAMPI
+#define SOCI_RICQUAL     "RICQUAL"