Ga naar inhoud

pokowaka

Users
  • Aantal items

    12
  • Registratiedatum

  • Laatst bezocht

Berichten die geplaatst zijn door pokowaka

  1. On 9/15/2020 at 12:28 AM, HAL9000 said:

    Leesbaarder:

     

    
                
    de ^= bit;
    if (de & 0x01) de ^= 0x4002;
    // we rotate the bits, and lo bit of de wraps to hi bit
    uint16_t hibit = (de & 0x01) ? 0x8000 : 0;
    de = hibit|(de>>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 :-). 

    Screen Shot 2020-09-14 at 12.35.35 AM.png

  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:

    1. De P2000 kan zowel vooruit, als achteruit van de MDCR lezen (en doet dit ook)
    2. 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:

     

     

    Screen Shot 2020-09-11 at 11.57.52 AM.png

  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. @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 🙂

  9. 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. 

     

  10. 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?

    1. Verwijder cassette:  PRINT INP(&H20)
    2. 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"

    1. Cassette met het stopje verwijdert (schrijven naar cassette onmogelijk) PRINT INP(&h20)
    2. 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:

    1. Blijft de motor aan, of stopt hij meteen? 
    2. 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?

     

     

     

     

     

×
×
  • Nieuwe aanmaken...