Previous 15994 Revisions Next

r6322 Saturday 7th November, 2009 at 14:30:53 UTC by Wilbert Pol
[TI85_SER] Moved global variables into the device struct.
[src/mess/formats]ti85_ser.c

src/mess/formats/ti85_ser.c
r6321r6322
8888   UINT8   white_out;         /* signal line from machine */
8989   UINT8   red_in;            /* signal line to machine */
9090   UINT8   white_in;         /* signal line to machine */
91   UINT8   *receive_buffer;
92   UINT8   *receive_data;
93   ti85_serial_data   stream;
9194} ti85serial_state;
9295
93static int ti85_serial_transfer_type = TI85_SEND_VARIABLES;
94static UINT8 * ti85_receive_buffer;
95static UINT8 * ti85_receive_data;
96static ti85_serial_data ti85_serial_stream;
9796
98
9997INLINE ti85serial_state *get_token(const device_config *device)
10098{
10199   assert(device != NULL);
r6321r6322
131129}
132130
133131
134static void ti85_free_serial_data_memory (running_machine *machine)
132static void ti85_free_serial_data_memory (const device_config *device)
135133{
136   if (ti85_receive_buffer)
134   ti85serial_state *ti85serial = get_token( device );
135
136   if (ti85serial->receive_buffer)
137137   {
138      free (ti85_receive_buffer);
139      ti85_receive_buffer = NULL;
138      free (ti85serial->receive_buffer);
139      ti85serial->receive_buffer = NULL;
140140   }
141   if (ti85_receive_data)
141   if (ti85serial->receive_data)
142142   {
143      free (ti85_receive_data);
144      ti85_receive_data = NULL;
143      free (ti85serial->receive_data);
144      ti85serial->receive_data = NULL;
145145   }
146146}
147147
148148
149static int ti85_alloc_serial_data_memory (UINT32 size)
149static int ti85_alloc_serial_data_memory (const device_config *device, UINT32 size)
150150{
151   if (!ti85_receive_buffer)
151   ti85serial_state *ti85serial = get_token( device );
152
153   if (!ti85serial->receive_buffer)
152154   {
153      ti85_receive_buffer = (UINT8*) malloc (8*size*sizeof(UINT8));
154      if (!ti85_receive_buffer)
155      ti85serial->receive_buffer = (UINT8*) malloc (8*size*sizeof(UINT8));
156      if (!ti85serial->receive_buffer)
155157         return 0;
156158   }
157159
158   if (!ti85_receive_data)
160   if (!ti85serial->receive_data)
159161   {
160      ti85_receive_data = (UINT8*) malloc (size * sizeof(UINT8));
161      if (!ti85_receive_data)
162      ti85serial->receive_data = (UINT8*) malloc (size * sizeof(UINT8));
163      if (!ti85serial->receive_data)
162164      {
163         free (ti85_receive_buffer);
164         ti85_receive_buffer = NULL;
165         free (ti85serial->receive_buffer);
166         ti85serial->receive_buffer = NULL;
165167         return 0;
166168           }
167169   }
r6321r6322
299301}
300302
301303
302static int ti85_convert_file_data_to_serial_stream (const UINT8* file_data, unsigned int file_size, ti85_serial_data*  serial_data, char* calc_type)
304static int ti85_convert_file_data_to_serial_stream (const device_config *device, const UINT8* file_data, unsigned int file_size, ti85_serial_data*  serial_data, char* calc_type)
303305{
306   ti85serial_state *ti85serial = get_token( device );
304307   UINT16 i;
305308   UINT16 number_of_entries;
306309
r6321r6322
339342
340343   if (file_data[0x3b]==0x1d)
341344   {
342      ti85_serial_transfer_type = TI85_SEND_BACKUP;
345      ti85serial->transfer_type = TI85_SEND_BACKUP;
343346      ti85_backup_read (file_data, file_size, ti85_entries);
344347   }
345348   else
346349   {
347      ti85_serial_transfer_type = TI85_SEND_VARIABLES;
350      ti85serial->transfer_type = TI85_SEND_VARIABLES;
348351      ti85_variables_read (file_data, file_size, ti85_entries);
349352   }
350353   for (i=0; i<number_of_entries; i++)
r6321r6322
515518   ti85serial_state *ti85serial = get_token( device );
516519   static UINT16 variable_number = 0;
517520
518   if (!ti85_alloc_serial_data_memory(7))
521   if (!ti85_alloc_serial_data_memory(device, 7))
519522      ti85serial->status = TI85_SEND_STOP;
520523
521524   switch (ti85serial->status)
522525   {
523526      case TI85_SEND_HEADER:
524         if(!ti85_send_serial(device, ti85_serial_stream.variables[variable_number].header,ti85_serial_stream.variables[variable_number].header_size))
527         if(!ti85_send_serial(device, ti85serial->stream.variables[variable_number].header,ti85serial->stream.variables[variable_number].header_size))
525528         {
526529            ti85serial->status = TI85_RECEIVE_OK_1;
527            memset (ti85_receive_data, 0, 7);
528            logerror ("Header sended\n");
530            memset (ti85serial->receive_data, 0, 7);
531            logerror ("Header sent\n");
529532         }
530533         break;
531534      case TI85_RECEIVE_OK_1:
532         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
535         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
533536         {
534            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
537            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
535538            ti85serial->status = TI85_RECEIVE_ANSWER_1;
536539            logerror ("OK received\n");
537540         }
538541         break;
539542      case TI85_RECEIVE_ANSWER_1:
540         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
543         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
541544         {
542            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
543            switch (ti85_receive_data[1])
545            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
546            switch (ti85serial->receive_data[1])
544547            {
545548               case 0x09:   //continue
546549                  ti85serial->status = TI85_SEND_OK;
r6321r6322
553556         }
554557         break;
555558      case TI85_RECEIVE_ANSWER_2:
556         if(!ti85_receive_serial (device, ti85_receive_buffer+4*8, 1*8))
559         if(!ti85_receive_serial (device, ti85serial->receive_buffer+4*8, 1*8))
557560         {
558            ti85_convert_stream_to_data (ti85_receive_buffer, 5*8, ti85_receive_data);
559            switch (ti85_receive_data[4])
561            ti85_convert_stream_to_data (ti85serial->receive_buffer, 5*8, ti85serial->receive_data);
562            switch (ti85serial->receive_data[4])
560563            {
561564               case 0x01:   //exit
562565               case 0x02:   //skip
r6321r6322
564567                  break;
565568               case 0x03:   //out of memory
566569                  variable_number = 0;
567                  ti85_free_serial_data_memory(device->machine);
570                  ti85_free_serial_data_memory(device);
568571                  ti85serial->status = TI85_SEND_STOP;
569572                  break;
570573            }
571574         }
572575         break;
573576      case TI85_RECEIVE_ANSWER_3:
574         if(!ti85_receive_serial (device, ti85_receive_buffer+5*8, 2*8))
577         if(!ti85_receive_serial (device, ti85serial->receive_buffer+5*8, 2*8))
575578         {
576            ti85_convert_stream_to_data (ti85_receive_buffer, 7*8, ti85_receive_data);
577            switch (ti85_receive_data[4])
579            ti85_convert_stream_to_data (ti85serial->receive_buffer, 7*8, ti85serial->receive_data);
580            switch (ti85serial->receive_data[4])
578581            {
579582               case 0x01:   //exit
580583                  variable_number = 0;
581                  ti85_free_serial_data_memory(device->machine);
584                  ti85_free_serial_data_memory(device);
582585                  ti85serial->status = TI85_SEND_STOP;
583586                  break;
584587               case 0x02:   //skip
r6321r6322
589592         }
590593         break;
591594      case TI85_SEND_OK:
592         if(!ti85_send_serial(device, ti85_serial_stream.variables[variable_number].ok,ti85_serial_stream.variables[variable_number].ok_size))
595         if(!ti85_send_serial(device, ti85serial->stream.variables[variable_number].ok,ti85serial->stream.variables[variable_number].ok_size))
593596         {
594            ti85serial->status = (ti85_receive_data[4]==0x02) ?  ((variable_number < ti85_serial_stream.number_of_variables) ? TI85_SEND_HEADER : TI85_SEND_END) : TI85_SEND_DATA;
595            memset(ti85_receive_data, 0, 7);
597            ti85serial->status = (ti85serial->receive_data[4]==0x02) ?  ((variable_number < ti85serial->stream.number_of_variables) ? TI85_SEND_HEADER : TI85_SEND_END) : TI85_SEND_DATA;
598            memset(ti85serial->receive_data, 0, 7);
596599         }
597600         break;
598601      case TI85_SEND_DATA:
599         if(!ti85_send_serial(device, ti85_serial_stream.variables[variable_number].data,ti85_serial_stream.variables[variable_number].data_size))
602         if(!ti85_send_serial(device, ti85serial->stream.variables[variable_number].data,ti85serial->stream.variables[variable_number].data_size))
600603            ti85serial->status = TI85_RECEIVE_OK_2;
601604         break;
602605      case TI85_RECEIVE_OK_2:
603         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
606         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
604607         {
605608            variable_number++;
606            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
607            ti85serial->status = (variable_number < ti85_serial_stream.number_of_variables) ? TI85_SEND_HEADER : TI85_SEND_END;
609            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
610            ti85serial->status = (variable_number < ti85serial->stream.number_of_variables) ? TI85_SEND_HEADER : TI85_SEND_END;
608611         }
609612         break;
610613      case TI85_SEND_END:
611         if(!ti85_send_serial(device, ti85_serial_stream.end,ti85_serial_stream.end_size))
614         if(!ti85_send_serial(device, ti85serial->stream.end,ti85serial->stream.end_size))
612615         {
613616            logerror ("End sended\n");
614617            variable_number = 0;
r6321r6322
616619         }
617620         break;
618621      case TI85_RECEIVE_OK_3:
619         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
622         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
620623         {
621624            logerror ("OK received\n");
622            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
623            ti85_free_serial_data_memory(device->machine);
625            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
626            ti85_free_serial_data_memory(device);
624627            ti85serial->status = TI85_SEND_STOP;
625628         }
626629         break;
r6321r6322
636639   ti85serial_state *ti85serial = get_token( device );
637640   static UINT16 variable_number = 0;
638641
639   if (!ti85_alloc_serial_data_memory(7))
642   if (!ti85_alloc_serial_data_memory(device, 7))
640643      ti85serial->status = TI85_SEND_STOP;
641644
642645   switch (ti85serial->status)
643646   {
644647      case TI85_SEND_HEADER:
645         if(!ti85_send_serial(device, ti85_serial_stream.variables[variable_number].header,ti85_serial_stream.variables[variable_number].header_size))
648         if(!ti85_send_serial(device, ti85serial->stream.variables[variable_number].header,ti85serial->stream.variables[variable_number].header_size))
646649            ti85serial->status = TI85_RECEIVE_OK_1;
647650         break;
648651      case TI85_RECEIVE_OK_1:
649         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
652         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
650653         {
651            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
654            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
652655            ti85serial->status = TI85_RECEIVE_ANSWER_1;
653656         }
654657         break;
655658      case TI85_RECEIVE_ANSWER_1:
656         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
659         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
657660         {
658            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
659            switch (ti85_receive_data[1])
661            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
662            switch (ti85serial->receive_data[1])
660663            {
661664               case 0x09:   //continue
662665                  ti85serial->status = TI85_SEND_OK;
r6321r6322
668671         }
669672         break;
670673      case TI85_RECEIVE_ANSWER_2:
671         if(!ti85_receive_serial (device, ti85_receive_buffer+4*8, 3*8))
674         if(!ti85_receive_serial (device, ti85serial->receive_buffer+4*8, 3*8))
672675         {
673            ti85_convert_stream_to_data (ti85_receive_buffer, 5*8, ti85_receive_data);
676            ti85_convert_stream_to_data (ti85serial->receive_buffer, 5*8, ti85serial->receive_data);
674677            variable_number = 0;
675            ti85_free_serial_data_memory(device->machine);
678            ti85_free_serial_data_memory(device);
676679            ti85serial->status = TI85_SEND_STOP;
677680         }
678681         break;
679682      case TI85_SEND_OK:
680         if(!ti85_send_serial(device, ti85_serial_stream.variables[variable_number].ok,ti85_serial_stream.variables[variable_number].ok_size))
683         if(!ti85_send_serial(device, ti85serial->stream.variables[variable_number].ok,ti85serial->stream.variables[variable_number].ok_size))
681684            ti85serial->status = TI85_SEND_DATA;
682685         break;
683686      case TI85_SEND_DATA:
684         if(!ti85_send_serial(device, ti85_serial_stream.variables[variable_number].data,ti85_serial_stream.variables[variable_number].data_size))
687         if(!ti85_send_serial(device, ti85serial->stream.variables[variable_number].data,ti85serial->stream.variables[variable_number].data_size))
685688            ti85serial->status = TI85_RECEIVE_OK_2;
686689         break;
687690      case TI85_RECEIVE_OK_2:
688         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
691         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
689692         {
690693            variable_number++;
691            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
692            ti85serial->status = (variable_number < ti85_serial_stream.number_of_variables) ? TI85_SEND_DATA : TI85_SEND_END;
694            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
695            ti85serial->status = (variable_number < ti85serial->stream.number_of_variables) ? TI85_SEND_DATA : TI85_SEND_END;
693696         }
694697         break;
695698      case TI85_SEND_END:
696         if(!ti85_send_serial(device, ti85_serial_stream.end,ti85_serial_stream.end_size))
699         if(!ti85_send_serial(device, ti85serial->stream.end,ti85serial->stream.end_size))
697700         {
698701            variable_number = 0;
699            ti85_free_serial_data_memory(device->machine);
702            ti85_free_serial_data_memory(device);
700703            ti85serial->status = TI85_SEND_STOP;
701704         }
702705         break;
r6321r6322
723726   switch (ti85serial->status)
724727   {
725728      case TI85_RECEIVE_HEADER_1:
726         if(!ti85_receive_serial(device, ti85_receive_buffer+4*8, 3*8))
729         if(!ti85_receive_serial(device, ti85serial->receive_buffer+4*8, 3*8))
727730         {
728            ti85_convert_stream_to_data (ti85_receive_buffer+4*8, 3*8, ti85_receive_data+4);
731            ti85_convert_stream_to_data (ti85serial->receive_buffer+4*8, 3*8, ti85serial->receive_data+4);
729732            ti85serial->status = TI85_PREPARE_VARIABLE_DATA;
730733         }
731734         break;
732735      case TI85_PREPARE_VARIABLE_DATA:
733         var_data = (UINT8*) malloc (ti85_receive_data[2]+2+ti85_receive_data[4]+ti85_receive_data[5]*256+2);
736         var_data = (UINT8*) malloc (ti85serial->receive_data[2]+2+ti85serial->receive_data[4]+ti85serial->receive_data[5]*256+2);
734737         if(!var_data)
735738            ti85serial->status = TI85_SEND_STOP;
736         memcpy (var_data, ti85_receive_data+2, 5);
737         ti85_free_serial_data_memory(device->machine);
738         if (!ti85_alloc_serial_data_memory(var_data[0]-1))
739         memcpy (var_data, ti85serial->receive_data+2, 5);
740         ti85_free_serial_data_memory(device);
741         if (!ti85_alloc_serial_data_memory(device, var_data[0]-1))
739742         {
740743            free(var_data); var_data = NULL;
741744            free(var_file_data); var_file_data = NULL;
r6321r6322
744747         }
745748         ti85serial->status = TI85_RECEIVE_HEADER_2;
746749      case TI85_RECEIVE_HEADER_2:
747         if(!ti85_receive_serial(device, ti85_receive_buffer, (var_data[0]-1)*8))
750         if(!ti85_receive_serial(device, ti85serial->receive_buffer, (var_data[0]-1)*8))
748751         {
749            ti85_convert_stream_to_data (ti85_receive_buffer, (var_data[0]-1)*8, ti85_receive_data);
750            memcpy (var_data+5, ti85_receive_data, var_data[0]-3);
751            ti85_free_serial_data_memory(device->machine);
752            if(!ti85_alloc_serial_data_memory (8))
752            ti85_convert_stream_to_data (ti85serial->receive_buffer, (var_data[0]-1)*8, ti85serial->receive_data);
753            memcpy (var_data+5, ti85serial->receive_data, var_data[0]-3);
754            ti85_free_serial_data_memory(device);
755            if(!ti85_alloc_serial_data_memory (device, 8))
753756            {
754757               free(var_data); var_data = NULL;
755758               free(var_file_data); var_file_data = NULL;
756759               ti85serial->status = TI85_SEND_STOP;
757760               return;
758761            }
759            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85_receive_buffer);
760            ti85_convert_data_to_stream (ti85_pc_continue_packet, 4, ti85_receive_buffer+4*8);
762            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85serial->receive_buffer);
763            ti85_convert_data_to_stream (ti85_pc_continue_packet, 4, ti85serial->receive_buffer+4*8);
761764            ti85serial->status = TI85_SEND_OK_1;
762765         }
763766         break;
764767      case TI85_SEND_OK_1:
765         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
768         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
766769            ti85serial->status = TI85_SEND_CONTINUE;
767770         break;
768771      case TI85_SEND_CONTINUE:
769         if(!ti85_send_serial(device, ti85_receive_buffer+4*8, 4*8))
772         if(!ti85_send_serial(device, ti85serial->receive_buffer+4*8, 4*8))
770773         {
771            ti85_free_serial_data_memory(device->machine);
772            if(!ti85_alloc_serial_data_memory(4))
774            ti85_free_serial_data_memory(device);
775            if(!ti85_alloc_serial_data_memory(device, 4))
773776            {
774777               free(var_data); var_data = NULL;
775778               free(var_file_data); var_file_data = NULL;
r6321r6322
780783         }
781784         break;
782785      case TI85_RECEIVE_OK:
783         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
786         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
784787         {
785            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
786            ti85_free_serial_data_memory(device->machine);
787            if(!ti85_alloc_serial_data_memory(var_data[2]+var_data[3]*256+6))
788            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
789            ti85_free_serial_data_memory(device);
790            if(!ti85_alloc_serial_data_memory(device, var_data[2]+var_data[3]*256+6))
788791            {
789792               free(var_data); var_data = NULL;
790793               free(var_file_data); var_file_data = NULL;
r6321r6322
795798         }
796799         break;
797800      case TI85_RECEIVE_DATA:
798         if(!ti85_receive_serial (device, ti85_receive_buffer, (var_data[2]+var_data[3]*256+6)*8))
801         if(!ti85_receive_serial (device, ti85serial->receive_buffer, (var_data[2]+var_data[3]*256+6)*8))
799802         {
800            ti85_convert_stream_to_data (ti85_receive_buffer, (var_data[2]+var_data[3]*256+6)*8, ti85_receive_data);
801            memcpy (var_data+var_data[0]+2, ti85_receive_data+2, var_data[2]+var_data[3]*256+2);
802            ti85_free_serial_data_memory(device->machine);
803            if(!ti85_alloc_serial_data_memory (4))
803            ti85_convert_stream_to_data (ti85serial->receive_buffer, (var_data[2]+var_data[3]*256+6)*8, ti85serial->receive_data);
804            memcpy (var_data+var_data[0]+2, ti85serial->receive_data+2, var_data[2]+var_data[3]*256+2);
805            ti85_free_serial_data_memory(device);
806            if(!ti85_alloc_serial_data_memory (device, 4))
804807            {
805808               free(var_data); var_data = NULL;
806809               free(var_file_data); var_file_data = NULL;
807810               ti85serial->status = TI85_SEND_STOP;
808811               return;
809812            }
810            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85_receive_buffer);
813            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85serial->receive_buffer);
811814            ti85serial->status = TI85_SEND_OK_2;
812815         }
813816         break;
814817      case TI85_SEND_OK_2:
815         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
818         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
816819         {
817            ti85_free_serial_data_memory(device->machine);
818            if(!ti85_alloc_serial_data_memory(7))
820            ti85_free_serial_data_memory(device);
821            if(!ti85_alloc_serial_data_memory(device, 7))
819822            {
820823               free(var_data); var_data = NULL;
821824               free(var_file_data); var_file_data = NULL;
r6321r6322
826829         }
827830         break;
828831      case TI85_RECEIVE_END_OR_HEADER_1:
829         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
832         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
830833         {
831834            if (variable_number == 0)
832835            {
r6321r6322
862865            var_data = NULL;
863866            variable_number ++;
864867
865            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
866            if (ti85_receive_data[1] == 0x06)
868            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
869            if (ti85serial->receive_data[1] == 0x06)
867870               ti85serial->status = TI85_RECEIVE_HEADER_1;
868871            else
869872            {
870               ti85_free_serial_data_memory(device->machine);
871               if(!ti85_alloc_serial_data_memory (4))
873               ti85_free_serial_data_memory(device);
874               if(!ti85_alloc_serial_data_memory (device, 4))
872875               {
873876                  free(var_data); var_data = NULL;
874877                  free(var_file_data); var_file_data = NULL;
875878                  ti85serial->status = TI85_SEND_STOP;
876879                  return;
877880               }
878               ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85_receive_buffer);
881               ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85serial->receive_buffer);
879882               ti85serial->status = TI85_SEND_OK_3;
880883            }
881884         }
882885         break;
883886      case TI85_SEND_OK_3:
884         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
887         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
885888         {
886            ti85_free_serial_data_memory(device->machine);
889            ti85_free_serial_data_memory(device);
887890            variable_number = 0;
888891            ti85serial->status =  TI85_SEND_STOP;
889892            sprintf (var_file_name, "%08d.85g", var_file_number);
r6321r6322
930933   switch (ti85serial->status)
931934   {
932935      case TI85_RECEIVE_HEADER_2:
933         if(!ti85_receive_serial(device, ti85_receive_buffer+7*8, 8*8))
936         if(!ti85_receive_serial(device, ti85serial->receive_buffer+7*8, 8*8))
934937         {
935            ti85_convert_stream_to_data (ti85_receive_buffer+7*8, 8*8, ti85_receive_data+7);
936            backup_data_size[0] = ti85_receive_data[4] + ti85_receive_data[5]*256;
937            backup_data_size[1] = ti85_receive_data[7] + ti85_receive_data[8]*256;
938            backup_data_size[2] = ti85_receive_data[9] + ti85_receive_data[10]*256;
938            ti85_convert_stream_to_data (ti85serial->receive_buffer+7*8, 8*8, ti85serial->receive_data+7);
939            backup_data_size[0] = ti85serial->receive_data[4] + ti85serial->receive_data[5]*256;
940            backup_data_size[1] = ti85serial->receive_data[7] + ti85serial->receive_data[8]*256;
941            backup_data_size[2] = ti85serial->receive_data[9] + ti85serial->receive_data[10]*256;
939942            backup_file_data = malloc (0x42+0x06+backup_data_size[0]+backup_data_size[1]+backup_data_size[2]+0x02);
940943            if(!backup_file_data)
941944            {
r6321r6322
948951            memset(backup_file_data+0x1f, 0, 0x16);
949952            backup_file_data[0x35] = (backup_data_size[0]+backup_data_size[1]+backup_data_size[2]+0x11)&0x00ff;
950953            backup_file_data[0x36] = ((backup_data_size[0]+backup_data_size[1]+backup_data_size[2]+0x11)&0xff00)>>8;
951            memcpy(backup_file_data+0x37, ti85_receive_data+0x02, 0x0b);
952            ti85_free_serial_data_memory(device->machine);
953            if(!ti85_alloc_serial_data_memory (8))
954            memcpy(backup_file_data+0x37, ti85serial->receive_data+0x02, 0x0b);
955            ti85_free_serial_data_memory(device);
956            if(!ti85_alloc_serial_data_memory (device, 8))
954957            {
955958               free(backup_file_data); backup_file_data = NULL;
956959               backup_variable_number = 0;
957960               ti85serial->status = TI85_SEND_STOP;
958961               return;
959962            }
960            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85_receive_buffer);
961            ti85_convert_data_to_stream (ti85_pc_continue_packet, 4, ti85_receive_buffer+4*8);
963            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85serial->receive_buffer);
964            ti85_convert_data_to_stream (ti85_pc_continue_packet, 4, ti85serial->receive_buffer+4*8);
962965            ti85serial->status = TI85_SEND_OK_1;
963966         }
964967         break;
965968      case TI85_SEND_OK_1:
966         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
969         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
967970            ti85serial->status = TI85_SEND_CONTINUE;
968971         break;
969972      case TI85_SEND_CONTINUE:
970         if(!ti85_send_serial(device, ti85_receive_buffer+4*8, 4*8))
973         if(!ti85_send_serial(device, ti85serial->receive_buffer+4*8, 4*8))
971974         {
972            ti85_free_serial_data_memory(device->machine);
973            if(!ti85_alloc_serial_data_memory(4))
975            ti85_free_serial_data_memory(device);
976            if(!ti85_alloc_serial_data_memory(device, 4))
974977            {
975978               free(backup_file_data); backup_file_data = NULL;
976979               backup_variable_number = 0;
r6321r6322
981984         }
982985         break;
983986      case TI85_RECEIVE_OK:
984         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
987         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
985988         {
986            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
987            ti85_free_serial_data_memory(device->machine);
988            if(!ti85_alloc_serial_data_memory(backup_data_size[backup_variable_number]+6))
989            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
990            ti85_free_serial_data_memory(device);
991            if(!ti85_alloc_serial_data_memory(device, backup_data_size[backup_variable_number]+6))
989992            {
990993               free(backup_file_data); backup_file_data = NULL;
991994               backup_variable_number = 0;
r6321r6322
996999         }
9971000         break;
9981001      case TI85_RECEIVE_DATA:
999         if(!ti85_receive_serial (device, ti85_receive_buffer, (backup_data_size[backup_variable_number]+6)*8))
1002         if(!ti85_receive_serial (device, ti85serial->receive_buffer, (backup_data_size[backup_variable_number]+6)*8))
10001003         {
1001            ti85_convert_stream_to_data (ti85_receive_buffer, (backup_data_size[backup_variable_number]+6)*8, ti85_receive_data);
1004            ti85_convert_stream_to_data (ti85serial->receive_buffer, (backup_data_size[backup_variable_number]+6)*8, ti85serial->receive_data);
10021005            switch (backup_variable_number)
10031006            {
10041007               case 0:
1005                  memcpy(backup_file_data+0x42, ti85_receive_data+0x02, backup_data_size[0]+0x02);
1008                  memcpy(backup_file_data+0x42, ti85serial->receive_data+0x02, backup_data_size[0]+0x02);
10061009                  break;
10071010               case 1:
1008                  memcpy(backup_file_data+0x42+backup_data_size[0]+0x02, ti85_receive_data+0x02, backup_data_size[1]+0x02);
1011                  memcpy(backup_file_data+0x42+backup_data_size[0]+0x02, ti85serial->receive_data+0x02, backup_data_size[1]+0x02);
10091012                  break;
10101013               case 2:
1011                  memcpy(backup_file_data+0x42+backup_data_size[0]+backup_data_size[1]+0x04, ti85_receive_data+0x02, backup_data_size[2]+0x02);
1014                  memcpy(backup_file_data+0x42+backup_data_size[0]+backup_data_size[1]+0x04, ti85serial->receive_data+0x02, backup_data_size[2]+0x02);
10121015                  break;
10131016            }
1014            ti85_free_serial_data_memory(device->machine);
1015            if(!ti85_alloc_serial_data_memory (4))
1017            ti85_free_serial_data_memory(device);
1018            if(!ti85_alloc_serial_data_memory (device, 4))
10161019            {
10171020               free(backup_file_data); backup_file_data = NULL;
10181021               backup_variable_number = 0;
10191022               ti85serial->status = TI85_SEND_STOP;
10201023               return;
10211024            }
1022            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85_receive_buffer);
1025            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85serial->receive_buffer);
10231026            ti85serial->status = TI85_SEND_OK_2;
10241027         }
10251028         break;
10261029      case TI85_SEND_OK_2:
1027         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
1030         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
10281031         {
1029            ti85_free_serial_data_memory(device->machine);
1032            ti85_free_serial_data_memory(device);
10301033            backup_variable_number++;
10311034            if (backup_variable_number<3)
10321035            {
1033               if(!ti85_alloc_serial_data_memory(backup_data_size[backup_variable_number]+6))
1036               if(!ti85_alloc_serial_data_memory(device, backup_data_size[backup_variable_number]+6))
10341037               {
10351038                  free(backup_file_data); backup_file_data = NULL;
10361039                  backup_variable_number = 0;
r6321r6322
10791082   switch (ti85serial->status)
10801083   {
10811084      case TI85_PREPARE_SCREEN_REQUEST:
1082         if(!ti85_alloc_serial_data_memory (4))
1085         if(!ti85_alloc_serial_data_memory (device, 4))
10831086         {
10841087            ti85serial->status = TI85_SEND_STOP;
10851088            return;
10861089         }
1087         ti85_convert_data_to_stream (ti85_pc_screen_request_packet, 4, ti85_receive_buffer);
1090         ti85_convert_data_to_stream (ti85_pc_screen_request_packet, 4, ti85serial->receive_buffer);
10881091         ti85serial->status = TI85_SEND_SCREEN_REQUEST;
10891092         break;
10901093      case TI85_SEND_SCREEN_REQUEST:
1091         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
1094         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
10921095         {
1093            ti85_free_serial_data_memory(device->machine);
1094            if(!ti85_alloc_serial_data_memory (4))
1096            ti85_free_serial_data_memory(device);
1097            if(!ti85_alloc_serial_data_memory (device, 4))
10951098            {
10961099               ti85serial->status = TI85_SEND_STOP;
10971100               return;
r6321r6322
11001103         }
11011104         break;
11021105      case TI85_RECEIVE_OK:
1103         if(!ti85_receive_serial (device, ti85_receive_buffer, 4*8))
1106         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 4*8))
11041107         {
1105            ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data);
1106            ti85_free_serial_data_memory(device->machine);
1107            if(!ti85_alloc_serial_data_memory (1030))
1108            ti85_convert_stream_to_data (ti85serial->receive_buffer, 4*8, ti85serial->receive_data);
1109            ti85_free_serial_data_memory(device);
1110            if(!ti85_alloc_serial_data_memory (device, 1030))
11081111            {
11091112               ti85serial->status = TI85_SEND_STOP;
11101113               return;
r6321r6322
11131116         }
11141117         break;
11151118      case TI85_RECEIVE_DATA:
1116         if(!ti85_receive_serial (device, ti85_receive_buffer, 1030*8))
1119         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 1030*8))
11171120         {
1118            ti85_convert_stream_to_data (ti85_receive_buffer, 1030*8, ti85_receive_data);
1121            ti85_convert_stream_to_data (ti85serial->receive_buffer, 1030*8, ti85serial->receive_data);
11191122            sprintf (image_file_name, "%08d.85i", image_file_number);
11201123            filerr = mame_fopen(SEARCHPATH_IMAGE, image_file_name, OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &image_file);
11211124            if (filerr == FILERR_NONE)
r6321r6322
11231126               image_file_data = malloc (0x49+1008);
11241127               if(!image_file_data)
11251128               {
1126                  ti85_free_serial_data_memory(device->machine);
1129                  ti85_free_serial_data_memory(device);
11271130                  ti85serial->status = TI85_SEND_OK;
11281131                  return;
11291132               }
r6321r6322
11431146               image_file_data[0x44] = 0x03;
11441147               image_file_data[0x45] = 0xf0;
11451148               image_file_data[0x46] = 0x03;
1146               memcpy(image_file_data+0x47, ti85_receive_data+4, 1008);
1149               memcpy(image_file_data+0x47, ti85serial->receive_data+4, 1008);
11471150               image_file_data[1008+0x49-2] = ti85_calculate_checksum(image_file_data+0x37, 1008+0x10)&0x00ff;
11481151               image_file_data[1008+0x49-1] = (ti85_calculate_checksum(image_file_data+0x37, 1008+0x10)&0xff00)>>8;
11491152               mame_fwrite(image_file, image_file_data, 1008+0x49);
r6321r6322
11511154               free(image_file_data);
11521155               image_file_number++;
11531156            }
1154            ti85_free_serial_data_memory(device->machine);
1155            if(!ti85_alloc_serial_data_memory (4))
1157            ti85_free_serial_data_memory(device);
1158            if(!ti85_alloc_serial_data_memory (device, 4))
11561159            {
11571160               ti85serial->status = TI85_SEND_STOP;
11581161               return;
11591162            }
1160            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85_receive_buffer);
1163            ti85_convert_data_to_stream (ti85_pc_ok_packet, 4, ti85serial->receive_buffer);
11611164            ti85serial->status = TI85_SEND_OK;
11621165         }
11631166         break;
11641167      case TI85_SEND_OK:
1165         if(!ti85_send_serial(device, ti85_receive_buffer, 4*8))
1168         if(!ti85_send_serial(device, ti85serial->receive_buffer, 4*8))
11661169         {
1167            ti85_free_serial_data_memory(device->machine);
1170            ti85_free_serial_data_memory(device);
11681171            ti85serial->status = TI85_SEND_STOP;
11691172         }
11701173         break;
r6321r6322
11801183   {
11811184      if (input_port_read(device->machine, "SERIAL") & 0x01)
11821185      {
1183         if(!ti85_alloc_serial_data_memory(15)) return;
1184         if(!ti85_receive_serial (device, ti85_receive_buffer, 7*8))
1186         if(!ti85_alloc_serial_data_memory(device, 15)) return;
1187         if(!ti85_receive_serial (device, ti85serial->receive_buffer, 7*8))
11851188         {
1186            ti85_convert_stream_to_data (ti85_receive_buffer, 7*8, ti85_receive_data);
1187            if (ti85_receive_data[0]!=0x85 || ti85_receive_data[1]!=0x06)
1189            ti85_convert_stream_to_data (ti85serial->receive_buffer, 7*8, ti85serial->receive_data);
1190            if (ti85serial->receive_data[0]!=0x85 || ti85serial->receive_data[1]!=0x06)
11881191            {
11891192               ti85_receive_serial (device, NULL, 0);
11901193               return;
11911194            }
1192            ti85_serial_transfer_type = (ti85_receive_data[6]==0x1d) ? TI85_RECEIVE_BACKUP : TI85_RECEIVE_VARIABLES;
1193            ti85serial->status = (ti85_receive_data[6]==0x1d) ? TI85_RECEIVE_HEADER_2 : TI85_PREPARE_VARIABLE_DATA;
1195            ti85serial->transfer_type = (ti85serial->receive_data[6]==0x1d) ? TI85_RECEIVE_BACKUP : TI85_RECEIVE_VARIABLES;
1196            ti85serial->status = (ti85serial->receive_data[6]==0x1d) ? TI85_RECEIVE_HEADER_2 : TI85_PREPARE_VARIABLE_DATA;
11941197         }
11951198      }
11961199      else
11971200      {
11981201         ti85_receive_serial(device, NULL, 0);
1199         ti85_free_serial_data_memory(device->machine);
1202         ti85_free_serial_data_memory(device);
12001203         if (input_port_read(device->machine, "DUMP") & 0x01)
12011204         {
12021205            ti85serial->status = TI85_PREPARE_SCREEN_REQUEST;
1203            ti85_serial_transfer_type = TI85_RECEIVE_SCREEN;
1206            ti85serial->transfer_type = TI85_RECEIVE_SCREEN;
12041207         }
12051208         return;
12061209      }
12071210   }
12081211
1209   switch (ti85_serial_transfer_type)
1212   switch (ti85serial->transfer_type)
12101213   {
12111214      case TI85_SEND_VARIABLES:
12121215         ti85_send_variables(device);
r6321r6322
12651268
12661269   ti85serial->status = TI85_SEND_STOP;
12671270   ti85serial->transfer_type = TI85_SEND_VARIABLES;
1271   ti85serial->receive_buffer = NULL;
12681272
1269   ti85_free_serial_data_memory(device->machine);
1273   ti85_free_serial_data_memory(device);
12701274   ti85_receive_serial (device, NULL,0);
12711275}
12721276
12731277
1278static DEVICE_STOP( ti85serial )
1279{
1280   ti85_free_serial_data_memory(device);
1281}
1282
1283
12741284static DEVICE_RESET( ti85serial )
12751285{
12761286   ti85serial_state *ti85serial = get_token( device );
12771287
12781288   ti85_receive_serial(device, NULL, 0);
12791289   ti85_send_serial(device, NULL, 0);
1280   ti85_free_serial_data_memory(device->machine);
1290   ti85_free_serial_data_memory(device);
12811291//   ti85_PCR = 0xc0;
12821292   ti85serial->red_in = 0;
12831293   ti85serial->white_in = 0;
r6321r6322
13071317      file_data = auto_alloc_array(image->machine, UINT8, file_size);
13081318      image_fread(image, file_data, file_size);
13091319
1310      if(!ti85_convert_file_data_to_serial_stream(file_data, file_size, &ti85_serial_stream, (char*)image->machine->gamedrv->name))
1320      if(!ti85_convert_file_data_to_serial_stream(image, file_data, file_size, &ti85serial->stream, (char*)image->machine->gamedrv->name))
13111321      {
1312         ti85_free_serial_stream (&ti85_serial_stream);
1322         ti85_free_serial_stream (&ti85serial->stream);
13131323         return INIT_FAIL;
13141324      }
13151325
r6321r6322
13271337{
13281338   ti85serial_state *ti85serial = get_token( image );
13291339
1330   ti85_free_serial_data_memory(image->machine);
1340   ti85_free_serial_data_memory(image);
13311341   ti85serial->status = TI85_SEND_STOP;
1332   ti85_free_serial_stream (&ti85_serial_stream);
1342   ti85_free_serial_stream (&ti85serial->stream);
13331343}
13341344
13351345
r6321r6322
13461356   case DEVINFO_INT_IMAGE_CREATABLE:            info->i = 0;                                                   break;
13471357   case DEVINFO_FCT_START:                     info->start = DEVICE_START_NAME( ti85serial );                           break;
13481358   case DEVINFO_FCT_RESET:                     info->reset = DEVICE_RESET_NAME( ti85serial );                           break;
1359   case DEVINFO_FCT_STOP:                     info->stop = DEVICE_STOP_NAME( ti85serial );                           break;
13491360   case DEVINFO_FCT_IMAGE_LOAD:               info->f = (genf *) DEVICE_IMAGE_LOAD_NAME( ti85serial );                  break;
13501361   case DEVINFO_FCT_IMAGE_UNLOAD:               info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME( ti85serial );                  break;
13511362   case DEVINFO_STR_IMAGE_BRIEF_INSTANCE_NAME:      strcpy(info->s, "ser");                                             break;

Previous 15994 Revisions Next


© 1998-2018 The MESS Team