Jump to content

pokowaka

User
  • Content Count

    12
  • Joined

  • Last visited

About pokowaka

  • Rank
    Pong

Profiel

  • Geslacht
    Array
  • Locatie
    Array
  • Console
    Array

Profile Fields

  • Interesses
    Array
  1. Ja, dat is stukken beter!
  2. W00T! Cassette support is nu in Mame! Het is nog niet helemaal perfect: - Soms onverwachte cassette fout L - Soms lukt het niet om van een laad scherm (piraten avontuur, ghosthunt) de juiste file te laden. Dit zijn waarschijnlijk timing gerelateerde problemen. - Ongerelateerd aan de mini cassette, soms hangt mame voor een paar seconden.
  3. Ik heb de checksum code achterhaald: and 001h ;07ac e6 01 ; DE with checksum is active xor e ;07ae ab ; a = written bit. ld e,a ;07af 5f ; e = e ^ (bit written) and 001h ;07b0 e6 01 jr z,l07d3h ;07b2 28 1f ; through a complex web it will jump to chksum (timing) ld a,002h ;07b4 3e 02 xor e ;07b6 ab ld e,a ;07b7 5f ; e = e ^ 0x02 ld a,040h ;07b8 3e 40 chksum: xor d ;07ba aa ; a = d ^ (0x40 | 0x0) rra ;07bb 1f ; >> 1 rr e ;07bc cb 1b ; >> rotate through DE (i.e. e0 -> d7 etc..) jr c,l07c2h ;07be 38 02 jr l07c4h ;07c0 18 02 l07c2h: or 080h ;07c2 f6 80 ; l07c4h: ld d,a ;07c4 57 In onleesbare c code: void calc_chksum(uint16_t* de, bool bit) { // TODO Cleanup to something readable. uint8_t e = *de & 0xff; uint8_t d = (*de >> 8) & 0xff; e = e ^ (bit ? 1 : 0); if (e & 0x01) { e = e ^ 2; d = d ^ 0x40; } else { d = d ^ 0x00; } bool c = d & 0x01; d >>= 1; bool cp = e & 0x01; e >>= 1; if (c) { e |= 0x80; } if (cp) { d |= 0x80; } *de = (d << 8) | e; } Mame kan nu native de .cas files inlezen. Met echte P2000t snelheid :-).
  4. Dat is volgens mij de terugspoel routine. Ik ontdekte dat er in terug blok (0c61) routine iets vreemds aan de hand was. Hier zijn de stukjes: ;; Read the RDA state and set bit 5 in A ;; RDA_state | BET ;; Note when the tape is moving in reverse this actually gets the RDC bit. get_rda: in a,(cas_inp) ;0cee db 20 and 080h ;0cf0 e6 80 set 5,a ;0cf2 cb ef ret ;0cf4 c9 ;; This seems to read a byte when the tape is moving backwards. ;; Note that RDA <-> RDC when moving backwards. ;; ;; Args: ;; A must contain the current state of RDC & BET ;; D related to time we are willing to wait to see a byte. ;; ;; Returns: ;; Sets the C flag in case of failure (beginning of tape, or tape removed.) ;; Sets (caserror) with the actual error in case C is set read_rev_byte: ld c,008h ;0cbf 0e 08 ; wait for at most 8 bits rev_next_bit: xor 080h ;0cc1 ee 80 ; Flip the expected RDA, we wait for next clock ld h,a ;0cc3 67 l0cc4h: ld b,000h ;0cc4 06 00 ; Max time we are willing to wait for RDA clock signal, we loop 256 times wait_for_rev_bit: ; Keep spinning until we have a bit flip in a,(cas_inp) ;0cc6 db 20 ; and 0b0h ;0cc8 e6 b0 ; RDA, BET, CIP cp h ;0cca bc ; Is the clock state as expected? jr z,rev_bit_available ;0ccb 28 10 djnz wait_for_rev_bit ;0ccd 10 f7 ; Spin until RDA changes. and 030h ;0ccf e6 30 ; mask bet & cip cp 020h ;0cd1 fe 20 ; this checks for errors. jr nz,read_rev_err ;0cd3 20 0d ; Check if we are at the end, or cassette removed. dec d ;0cd5 15 jr nz,l0cc4h ;0cd6 20 ec ld a,h ;0cd8 7c xor 080h ;0cd9 ee 80 inc d ;0cdb 14 ret ;0cdc c9 rev_bit_available: ;; This is called when we have a bit available.. ld a,h ;0cdd 7c dec c ;0cde 0d jr nz,rev_next_bit ;0cdf 20 e0 ret ;0ce1 c9 ; We have read 8 bits.. read_rev_err: ;; This happens when we hit the beginning of the tape, or if we ;; removed the tape while moving backwards. or a ;0ce2 b7 ld a,"E" ;0ce3 3e 45 ; End of tape error jr z,l0ce9h ;0ce5 28 02 ld a,"A" ;0ce7 3e 41 ; No tape l0ce9h: ld (caserror),a ;0ce9 32 17 60 scf ;0cec 37 ; Set the carry flag to indicate failure. ret ;0ced c9 read_rev_byte lijkt alleen maar zinnig als het RDA bit wordt gebruikt als klok signaal. Wat blijkbaar ook het geval is. Mame kan nu in ieder geval wav files schrijven en lezen, en een pull request is al open https://github.com/mamedev/mame/pull/7215. Ik ben bezig met een converter van .cas -> wav zodat mame ook de cas files kan lezen. Helaas bevatten de .cas files niet de checksum
  5. Nog een leuke ontdekking: De P2000 kan zowel vooruit, als achteruit van de MDCR lezen (en doet dit ook) Als de REV bit hoog is en de cassette terugspoelt dan worden RDC en RDA gewisseld. De reden waarom de Cassette fout B optreed is omdat de P2000 bits telt tijdens het terug spoelen en uiteindelijk het begin van de tape bereikt. Het goede nieuws is dat het nu lijkt of alles werkt!
  6. Ik ben weer een klein stukje verder. Blijkt dat er dus een flip-flop achter de RDC van de cassette recorder zit. (tsk, tsk, had ik gemist). Ik krijg nog een cassette fout B tijdens het lezen, maar blokken beginnen herkend to worden:
  7. Dankzij de gebruiksaanwijzing van de cassette recorder begint het de goede kant uit te gaan. De maintenance module slaagt nog niet maar schrijven en (offline) decoderen gaat al wel goed: De file is gemaakt met Maintenance 2 module als volgt: 9 - 1 >> Nu zit je in de debugger; TB; Spoel tape terug F 7100 400 CC; Fill memory region CC F 7100 10 00 ; Fill memory region 16 bytes of 00 F 7110 10 01; etc.. etc.. TW 7100 400; Schrijf memory region 1kb van vanaf address 7100 File: F7100-400-01-02.ok.txt1 aa 0 0 aa [Sync marker] aa [Pre Amble] 0 71 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 [Header] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 a a a a a a a a a a a a a a a a b b b b b b b b b b b b b b b b c c c c c c c c c c c c c c c c d d d d d d d d d d d d d d d d e e e e e e e e e e e e e e e e f f f f f f f f f f f f f f f f cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc [Data] a5 70 [Checksum] aa [Post Amble] De data wordt in ieder geval goed weg geschreven. Probleem is nu uitzoeken hoe de klok precies werkt, want de write-skipback-read test slaagt nog niet.
  8. Pull request is er nu. Ik heb de pdf's van @HAL9000 ook toegevoegd.
  9. Ik geloof dat ik ondertussen documentatie voor de mdcr heb gevonden: https://github.com/pokowaka/documentation/blob/master/hardware/micro-cass.pdf
  10. @HAL9000 bedankt! Wij zijn in ieder geval een stap verder met de bits! @cancom bedankt voor het verwijzen naar de Maintenance module. Die had ik inderdaad gemist. De maintenance module zal het uitzoek werk waarschijnlijk een stuk makkelijker maken! Ik heb al inderdaad al 30 jaar (of meer?) geen P2000 meer. Mijn kleinere ik had ooit een goed plan om het toetsenbord schoon te maken en toen waren er ineens geen toetsen meer
  11. Bedankt! Dat is erg bruikbaar. Ik heb een assembly dump gemaakt van de rom en ben langzaam documentatie aan het toevoegen. Zie hier https://github.com/pokowaka/documentation/blob/master/programming/p2000.asm. Een vork van https://github.com/p2000t/documentation waar veel documentatie is te vinden. Hier is een stukje assembly wat suggereert dat WEN = 1 als write enabled is (stopje present) castest: in a,(cas_inp) ;0b83 db 20 ; read port 20 and 018h ;0b85 e6 18 ; mask CIP WEN (0001 1000) ret z ;0b87 c8 ; if (!CIP && !WEN) return cp 018h ;0b88 fe 18 ; ret z ;0b8a c8 ; if (CIP && WEN) return ld a,"G" ;0b8b 3e 47 ; Geen stopje error? (!WEN || !CIP), invariant?: WEN -> CIP ld (caserror),a ;0b8d 32 17 60 ret ;0b90 c9 Ik heb tot nu toe alleen het volgende aan mame toegevoegd: - Fake cassette (memory blob) - Fake rdc clock (volledig fout na het lezen van jou bericht). - Ik doe nog niet het juiste met de lees vlaggen. - Het "Maintenance" document https://github.com/pokowaka/documentation/blob/master/hardware/Maintenance.pdf benoemt een aantal test programma's. Het zou mooi zijn als iemand die nog zou hebben. Mame is overigens niet erg stabiel . Veelal bevriest de emulator. Mame klaagt over mijn SAA rom, dus misschien dat het daaraan ligt.
  12. Ik ben aan het kijken of ik de P2000 cassette emulatie aan de praat kan krijgen in Mess. Het probleem is dat: 1. De documentatie niet lijkt te kloppen, of erg onduidelijk is. 2. Ik geen fysieke P2000 heb. Om alles aan de praat te krijgen moet ik begrijpen wat er allemaal gebeurt in port &H20 (0x20). Volgens verschillende handleidingen ziet de poort er als volgt uit: cas_inp: equ 20h ; input port for cassette ; bit 0 - Printer input ; bit 1 - Printer ready ; bit 2 - Strap N (daisy/matrix) ; bit 3 - Cassette write enabled (WEN) ; bit 4 - Cassette in position (CIP) ; bit 5 - Begin/end of tape (BET) ; bit 6 - Cassette read clock (RDC) ; bit 7 - Cassette read data (RDA) Het gaat mij vooral om bit 3, 4, 5 en 6. Zou iemand het volgende willen draaien op een echt P2000? Verwijder cassette: PRINT INP(&H20) Plaats cassette: PRINT INP(&H20) Dit bevestigd of CIP bit hoog of laag is als de cassette aanwezig is. Hetzelfde voor een cassette met en zonder "stopje" Cassette met het stopje verwijdert (schrijven naar cassette onmogelijk) PRINT INP(&h20) Cassette zonder stopje: PRINT INP(&h20) Bevestigd of de WEN bit hoog of laag is als het stopje wel of niet aanwezig is. Het RDC bit zou gebruikt moeten worden voor het kloksignaal. Het is mij niet duidelijk uit de handleiding hoe vaak de bit wisselt. Ik weet niet zeker of de resultaten hier zinvol zullen zijn: 10 PRINT peek(&H6010)INP(&H20):GOTO 10 Ik ben benieuwd of dit verschillende waardes oplevert voor de 2e kolom, of altijd dezelfde. Om de 20ms zendt de P2000 een signaal naar port 10 (cassette, printer en toetsenbord). Veelal om het toetsenbord actief te maken. Ik vraag me of of dit ook resulteert in het uitzetten van de cassette motor tijdens het terugspoelen. Een eenvoudige test is: OUT &H10, &H4 Dit zet bit 3 en zet de terug spoel motor aan. Vraag is: Blijft de motor aan, of stopt hij meteen? Stopt het terugspoelen aan het begin van de cassette of blijft het doorgaan? Als er geen rom in de P2000T steekt dan probeert de P2000t iets van cassette te laden (er verschijnt een T op het scherm). Kan iemand bevestigen of dit werkt?
×