Jump to content

HAL9000

User
  • Content Count

    16
  • Joined

  • Last visited

About HAL9000

  • Rank
    Pong

Profiel

  • Geslacht
    Array
  • Locatie
    Array
  • Console
    Array
  • Twitter
    Array

Profile Fields

  • Interesses
    Array

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. 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);
  2. Deze code was ik ook al op gestuit, in de inlees routine, had ik even geparkeerd. Mooi dat jij die uit elkaar hebt geplozen... Iets verderop wordt DE (checksum dus op dat moment!) weer gebruikt: ; data handling routine 'read payload' ; it stores the data byte at destination. ; HL, BC, DE contain dest, count and data ; not sure yet what DE means here ?? when all bytes were read (DE == 0) ???? ; ????? read_payload: exx ; save databyte, destination and count, get DE ; next byte a filler or payload? ld a,d ; DE contains ????? or e ; jr nz,set_carry ; DE not zero ex af,af' ; get load control flags (P, C) xor a ; Set Z flag, set P, clear carry jp store_byte set_carry: ex af,af' ; get load control flags (P, C) scf ; Set Carry rla ; shift in A or a ; NZ, Set P store_byte: exx ; get data byte, dest and count ld (hl),d ; store data byte cpi ; inc HL, dec BC P <- 0 when BC == 0 ; this triggers next len, dest and handler retrieval ; after finishing the data block exx ; save dest, count jr get_next_byte
  3. Mooi werk!!! Kleine aanvulling: volgens mij (en mijn disassembly) telt de P2000 geen bits, maar seconden: ; cas_Rewind (address 0x0bb4) ; rewinds tape for a maximum duration of 103 seconds. ; a verified data tape rewinds within 90-something seconds ; if EOT is not reached within 103 seconds, the tape is either broken ; or too long (not a supported tape) ; inputs: none ; outputs: Cassette error contains no error, 'A' or 'I' cas_Rewind: call write_disabled ; writing? ret nz ; yes! so don't rewind ld a,KBIEN|REV ; start rewinding out (CPOUT),a ; ld b,103 ; wait max 103 seconds (1m 43s) _rew_wait_loop: call wait_1second ; this routine returns NZ when tape ejected or EOT is reached jr nz,_EOT_or_Ejected ; EOT is what we want check this djnz _rew_wait_loop ; keep rewinding for one more second ld a,'I' ; still no eot after 103 seconds: Error 'I' means time out during rewind ld (cassette_error),a ; ld c,00fh ; not sure why this is... ???? ; status from wait_1_second can be: ; 0x41 = 'A' no tape ; 0x45 = 'E' end of tape (during write) _EOT_or_Ejected: ld a,(cassette_error) ; get error cp 'E' ; equal to end of tape? jr nz,_was_ejected ; no, other problem ld a,0 ; no error, because EOT is what we wanted here ld (cassette_error),a ; ld hl,cassette_status ; set 4,(hl) ; set begin of tape flag res 0,(hl) ; and start mark found (bit 0 == 0) _was_ejected: ld h,'g' ; error code to write to comm port jp cas_motor_off ; turn motor off and send h to comm (if this is enabled)
  4. Mooi! dit helpt enorm alles beter te begrijpen... Ik vond ook nog deze (bijlage) philips_8920_405_10601_mdcr_sm.pdf
  5. Geen hardware, klopt! Ik had eerder geschreven dat ik vermoedde dat de motor meteen uitgezet zou worden. Ik had voor de waarde van de out &h44 gelezen en niet &h4, wat @pokowaka schreef. Bij waarde &h44 wordt de motor wel meteen door de interrupt, als bijwerking van het (weer) aanzetten van KBIEN, uitgezet. Dat heb ik net even getest. 2000M: Ik heb een complete set, 2 kasten en in de monitorkast met daarin 2 drives, een stapel floppen en wat kopieën van handleidingen erbij, zie fotootje. En je hebt gelijk, het is een inbouw- en niet een insteekkaart
  6. Nee, helaas... Ik heb wel een P2000M staan. Hopelijk is die interface vergelijkbaar met de insteekkaart voor de P2000T...
  7. Ik zat als een havik op te letten en heb meteen het deurtje opengedaan, motor bleef draaien zonder dat de tape m tegenhield. En Pokowaka heeft geen hardware, anders had ik die testjes niet hoeven doen denk ik... Ik zal eens kijken of er een controller in een van mijn apparaten zit... is dat aan de buitenkant te zien?
  8. jouw testjes: dec hex binair -------------------- print inp(&h20) zonder cassette : 187 0xBB 1011 1011 print inp(&h20) cassette zonder stopje: 171 0xAB 1010 1011 print inp(&h20) cassette met stopje : 163 0xA3 1010 0011 ^ ^ CIP_| |_ WEN CIP is blijkbaar ook 'inverted', en 0 als er een cassette is en 1 als er geen cassette is. WEN = 0 als er geschreven kan worden en 1 als dat niet zo is (inverted) Was dus fout in mijn analyse. Super, weer wat geleerd! en 10 PRINT peek(&H6010)INP(&H20):GOTO 10 leverde een mooi oplopende eerste waarde en een constante waarde van 163 op voor de tweede Dat is conform wat we verwachtten op basis van mijn eerdere beschrijving van hoe het clock-bit zich gedraagt. tot slot, OUT &H10, &H4 spoelt de hele tape terug, en als de tape is teruggespoeld blijft de motor aan (geen EOT detectie actief die de motor uitzet) Waarschijnlijk komt dit doordat de 0x04 op port 20 ook bit 6, KBIEN, uitzet en daarmee de interrupt. we worden nog weleens wijs! laatste test: bij geen cartridge en een tape in de recorder verschijnt er een knipperende 'T' op de bovenste regel. De tape wordt teruggespoeld, en dan opgestart in een poging de eerste file te laden. Ik had er een lege tape in gezet, dus er werd niks op tape gevonden Vervolgens bleef de P2000T eindeloos proberen dat eerste block te vinden met die T bovenin beeld.
  9. Wedervraag: welke bronnen gebruik jij? en aan allen: Ik zoek documentatie/informatie over de floppy drives die je op de P2000T kon aansluiten... Mijn P2000T heb ik op de kop getikt zonder drives/floppen iemand?
  10. We zijn elkaar ook al tegengekomen op Circuits Online. Ik wil best wel jouw testjes doen Ik kan ook alvast wat van mijn eigen bevindingen delen, want ik ben ook aan het uitzoeken hoe de P2000 een data blok van cassette leest. Hoe het schrijven gaat staat voor daarna op de planning. Allereerst: de Monitor ROM routines die met de cassette werken zetten de interrupt uit, om te voorkomen dat de interrupt de cassette control lijnen reset. Wanneer je dus vanuit de prompt of in BASIC de cassette aanstuurt werkt dat ook alleen maar als je de interrupt uitzet... Tijdens mijn analyses en testjes heb ik kunnen afleiden dat de clock, Bit 6 van inp(&H20), wisselt wanneer een (nieuw) data bit is gelezen en aanwezig is op Bit 7. Op beide flanken, dus zowel hoog-laag als laag-hoog. Wanneer er geen data op de tape staat (lege tape of gedurende de gaps tussen Markers en Datablokken) wisselt de clock niet. De cassetteroutine om een block te lezen werkt grofweg als volgt, voor zover ik heb kunnen uitvogelen: Aanname is dat de cassette of is teruggespoeld, of is gestopt na het lezen of schrijven van een data block. Dan staat de leeskop op een GAP (lege tape) en zou een Marker moeten komen. een Marker bestaat uit 4 bytes. - preamble (&HAA of binary 10101010) - &H00 - &H00 - postamble (&HAA) De motor wordt gestart, en de code kijkt continu of het clock bit wisselt. Bij de eerste wissel neemt de code aan dat dit bit 1 is van de preamble van de marker, en gaat na het verwerken van de preamble, door met bytes lezen, tellen en weggooien, tot er in een periode van ~5ms geen bit meer binnen komt. Dan neemt de code aan dat Marker voorbij is en de volgende Gap bereikt. Waren er meer of minder dan 3 bytes (nul, nul en postamble) geteld voordat de timeout kwam (kan komen doordat het een Datablock was, of lezen begon middenin een Mark of datablock) dan wordt een nieuwe poging gedaan de Marker te vinden. Wanneer succesvol een Marker is gelezen dan staat de leeskop (dus) op de Gap tussen Marker en Data, en volgt (als het goed is ) een datablock: - preamble (&HAA of binary 10101010) - Header (32 bytes) - Payload (1024 bytes) - postamble (&HAA) Nu wordt weer op een eerste clock flip/data bit gewacht, en (als het goed is) het preamble byte ingelezen en weggegooid. Meteen daarna worden de header, gevolgd door de data, ingelezen. Daarna worden weer bytes gelezen, geteld en weggegooid tot er een timeout is op het lezen van het volgende bit. ... Klaar! Niet helemaal: er volgt nog wat boekhouding om te bepalen of het een valide datablock was en berekend met hoeveel de klokteller moet worden opgehoogd om te corrigeren voor het feit dat de interrupt die niet kon ophogen. Hoe dat allemaal gaat ben ik momenteel aan het uitzoeken, dus meer details heb ik nog niet. Ferenc toevoeging: dit zijn mijn aantekeningen bij in(0x20): INPUT port 0x20-0x2f cassette and printer -------------------- bit description 7 RDA Data bit from cassette 6 RDC ReaD Clock (goes High-Low or Low-High when a databit is ready) 5 BET (N) Begin/End of tape signal 1= tape ok, 0 = begin/end 4 CIP Cassette In Position = 1, no cassette = 0 3 WEN (N) Write Enable 1=protected 0=can write 2 STRAP (N) printer type (Daisy/Matrix) 1 READY printer ready connected to printer port pin 20 0 PRI printer data in connected to printer port pin 2
  11. Ik heb nog ergens een andere monochrome monitor liggen. Kijken of ik een verloopkabeltje kan maken. Niet zo mooi als een nwe beeldbuis, maar dan kan je wel lezen wat er staat...
  12. Monitor heeft display rot, maar verder werkt alles...
  13. Ja, dat topic had ik ook gevonden, alsnog bedankt voor de hulp.
  14. Ik kan die PDF niet vinden bij cancoms profiel. Iemand een tip waar ik moet kijken?
×