[abc80] ABC80 kasettrutiner

Anders Jansson andj at hem.utfors.se
Mon Okt 12 11:34:20 PDT 2009


Du har rätt förstås!
Record börjar med 32 byte 0x00, och databuffer börjar med filnumret (0x00), inte som jag skrev.
Recordnr är little endian (LSB först) och checksumman innefattar <ETX> (ABC80 initierar csum=3 från start).

Om jag minns rätt får man inte felmeddelandet "hittar ej filen" förrän efter en stunds tystnad. Om det kommer medan filen spelas 
upp borde det kanske vara fel på interruptet som tar emot data? (Interrupt i en emulator som läser data från vadå? Här känner jag 
mig en aning förvirrad.)

/Anders


----- Original Message ----- 
From: <juhasz at abc.se>
To: "Anders Jansson" <andj at hem.utfors.se>
Cc: <abc80 at abc80.org>
Sent: Monday, October 12, 2009 11:31 AM
Subject: Re: [abc80] ABC80 kasettrutiner


> Nu läste jag ditt svar ordentligt, och jag ser att jag har lite annorlunda
> uppbyggnad av recordarna i mitt program abccas. Frågan är vad som är
> rätt..... Jag har tagit mina uppgifter ur "Mikrodatorns ABC".... Se koden
> nedan (den är testad OK mot en "fysisk" ABC80...)
>
> Robert
>
> void blockout(FILE *f)
> {
> int i,csum;
> for (i=0;i<32;i++) byteout(0,f); // 32 0 bytes
> for (i=0;i<3;i++) byteout(0x16,f); // 3 sync bytes 16H
> byteout(0x2,f); //STX
> for (i=0;i<256;i++) byteout(buffer[i],f); // output the buffer
> byteout(0x3,f); // ETX
> csum=0;
> for (i=0;i<256;i++) csum+=buffer[i]; // calculate the checksum
> csum+=3; // csum includes ETX char!!! (as correctly stated in Mikrodatorns
> ABC)
> byteout(csum & 0xff,f);
> byteout((csum >> 8) & 0xff,f);
> }
>
> void nameblockout(FILE *f)
> {
> int i;
> for (i=0;i<3;i++) buffer[i]=0xff; // Header
> for (i=3;i<11;i++) buffer[i]=name[i-3]; // Name
> for (i=11;i<14;i++) buffer[i]=ext[i-11]; // Ext
> for (i=14;i<256;i++) buffer[i]=0; // zeroes
> blockout(f);
> }
>
> void datablockout(FILE *fin,FILE *fout)
> {
> int blcnt;
> blcnt=0;
> while (!feof(fin))
> {
> buffer[0]=0;
> buffer[1]=blcnt & 0xff;
> buffer[2]=(blcnt >> 8) & 0xff;
> fread(&buffer[3],253,1,fin);
> blockout(fout);
> blcnt++;
> printf("Block out #%d\n",blcnt);
> }
>
> }
>
>> Hej!
>>
>> Skickar du ut signalen till en riktig ABC80 när du testar? Blir det samma
>> sak om du skriver "LOAD CAS:filnamn" ?
>>
>> Jag har Arne Stockmans disassemblering med kommentarer. Om jag förstår
>> kommentarerna rätt för "prepare" och "skriv record" så
>> består kasettfiler av records med följande format (se nedan). Men jag kan
>> ha missuppfattat ett och annat så det är nog bättre jag
>> skickar kopior så får du kolla själv.
>>
>> CAS_record:
>> 1 byte 0x00 (FEL!)
>> 32 byte 0xFF (FEL!)
>> 3 byte 0x16 <SYN>
>> 1 byte 0x02 <STX>
>> 256 bytes Record_buffer
>> 1 byte 0x03 <ETX>
>> 1 byte checksumma
>> 1 byte 0x00
>>
>> Record_buffer för filnamsrecord:
>> 3 byte 0xFF
>> 11 byte filnamn
>> resten 0x00
>>
>> Record_buffer för datarecord:
>> 2 bytes recordnummer (startar på 0x0000)
>> 1 byte 0x00 (filnummer) (FEL! detta är
>> 252 bytes data
>> 1 byte 0x03 <ETX> (ger dubbelt ETX?)
>>
>> Koden för inläsning tycks leta efter record som startar med 3 bytes 0xFF
>> och sedan jämförs filnamnet med angivet filnamn. Om
>> första tecknet i angivet filnamn är ascii(32) utgår filnamnstestet. Detta
>> händer när inget filnamn är angivet, tex LOAD CAS:.
>>
>> Hälsn.
>> Anders
>>
>>
>>
>> ----- Original Message -----
>> From: "Erik Isaksson" <exon at lysator.liu.se>
>> To: <abc80 at abc80.org>
>> Sent: Sunday, October 11, 2009 4:08 PM
>> Subject: [abc80] ABC80 kasettrutiner
>>
>>
>> Hej listan!
>>
>> Är det någon som har bra koll på hur ABC80s kassettrutiner fungerar i
>> detalj? Jag försöker få emulatorn att läsa och skriva via CAS:, men det
>> går inget vidare. 'Mikrodatorns ABC' har en hyfsad beskrivning av
>> elektroniken och formaten, så jag trodde det skulle vara en kakbit att
>> implementera, men någonstans går det fel. Inspelning funkar troligen,
>> jag har fått ut en CAS:-fil i något vi kan kalla raw-format genom att
>> sampla PIO CHB bit 6 i 15,6kHz (en gång per scan-line), och den både ser
>> och låter OK ut. Avspelning funkar däremot inte alls, troligtvis hittar
>> den inte ens SYN-bytarna i början av blocken eftersom jag bara får
>> "HITTAR EJ FILEN" ett tag efter "LOAD CAS:" (annars borde det väl bli
>> checksummefel eller liknande). I princip triggar jag en PIO
>> CHB-interrupt på varje flank i insignalen genom att dra bit 7 låg, och
>> det ser ut som om rutinerna reagerar på rätt sätt och nollställer
>> latchen som de ska. Ibland ser jag dock att jag får en "extra"
>> nollställning utan synbar anledning. Jag har ingen större lust att börja
>> disassemblera kassettrutinerna för att lista ut vad som går fel, så om
>> någon kan komma med lite input vore det trevligt!
>>
>> Tack på förhand
>> / E
>>
>> _______________________________________________
>> ABC80 mailing list
>> ABC80 at abc80.org
>> http://www.abc80.org/mailman/listinfo/abc80
>>
>> _______________________________________________
>> ABC80 mailing list
>> ABC80 at abc80.org
>> http://www.abc80.org/mailman/listinfo/abc80
>> 



More information about the ABC80 mailing list