You are not logged in.

Dear visitor, welcome to Forum64. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

marco64

Karteileiche mit kleinem Lebensfunken

  • "marco64" is male
  • "marco64" started this thread

Posts: 400

Date of registration: Aug 21st 2005

Location: Berlin

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

1

Wednesday, November 7th 2007, 1:44am

CIA2 $dd00 richtig verstehen

Hallo

Ich brühte seit einem Tag über dem CBM Serial Bus. Wenn ich richtig verstanden habe werden nur 3 Leitungen benutzt (ATN, CLOCK, DATA). Der CIA2 an $dd00 gibt mir aber ATN, Clock_in, Clock_out, Data_in, Data_out. Wie verhalten sich die in's und out's zum wirklichen Signal was auf der CLOCK- oder DATA-Leitung anliegt?

Der Grund für meine Frage ist, weil ich momentan an einem kleinen Emulator bastle.

Gruß
Marco

EDIT:
Nachdem ich meine eigene Frage noch mal gelesen habe kann ich sie mir wahrscheinlich selbst beantworten.

Data_in ist nur ein Leseregister was durch Data_out(Schreibregister) und der Floppy beeinflusst wird? Data_out kann ja 1 sein und Data_in trotzdem 0 weil die Floppy DATA auf 0 setzt.
Bei Clock analog.

Ist das so korrekt?

This post has been edited 4 times, last edit by "marco64" (Nov 7th 2007, 2:08am)


marco64

Karteileiche mit kleinem Lebensfunken

  • "marco64" is male
  • "marco64" started this thread

Posts: 400

Date of registration: Aug 21st 2005

Location: Berlin

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

2

Wednesday, November 7th 2007, 11:37am

Ich habe jetzt $dd00 nach dem obigen muster implementiert. Jetzt kommt ich aber im Kernal nicht weiter.

Source code

1
2
3
4
5
6
7
8
9
10
11
; set serial data line high     (aus c64 Kernal)

EEA0   AD 00 DD   LDA $DD00
EEA3   09 20      ORA #$20
EEA5   8D 00 DD   STA $DD00
EEA8   60         RTS
EEA9   AD 00 DD   LDA $DD00
EEAC   CD 00 DD   CMP $DD00
EEAF   D0 F8      BNE $EEA9
EEB1   0A         ASL
EEB2   60         RTS

Ich verstehe nicht den Grund warum BNE nach $eea9 und nicht nach $eeac springt. Wahrscheinlich habe ich die Arbeitsweise des CIA doch nicht verstanden.

PS: Hätte die beiden post's besser als ASM threats anlegen sollen, egal. :)

3

Wednesday, November 7th 2007, 12:19pm

sieht für mich wie einfaches "Entprellen" aus.
Warten bis zwei direkt hinteinander gelesene Werte gleich sind.
STATT warten bis ein zweiter gelesener Wert einem vorher gelesenen Wert entspricht.
Das ist ein großer Unterschied.

marco64

Karteileiche mit kleinem Lebensfunken

  • "marco64" is male
  • "marco64" started this thread

Posts: 400

Date of registration: Aug 21st 2005

Location: Berlin

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

4

Wednesday, November 7th 2007, 3:34pm

Danke für die Erklärung. Der Fehler lag aber bei mir, ich habe das CMP falsch umgesetz, so das die emu überhaupt nicht erkannt hat das beide werte gleich sind.
(Hurra habe mein erstes READY gesehen :D )

Gruß
marco

strik

Unregistered

5

Wednesday, November 7th 2007, 5:48pm

RE: CIA2 $dd00 richtig verstehen

Quoted

Original von marco64
Data_in ist nur ein Leseregister was durch Data_out(Schreibregister) und der Floppy beeinflusst wird? Data_out kann ja 1 sein und Data_in trotzdem 0 weil die Floppy DATA auf 0 setzt.
Bei Clock analog.

Ist das so korrekt?

Ja. Bedenke aber auch, dass ATN_OUT (PA3), DATA_OUT (PA5) und CLOCK_OUT (PA7) invertiert werden, bevor sie an den Bus rausgehen. DATA_IN und CLOCK_IN zeigen hingegen den tatsächlichen Wert der Leitungen an.

Also:

Wenn DATA_OUT = 1 ist, dann ist die DATA Leitung auf LOW, und DATA_IN liest 0.

Wenn DATA_OUT = 0 ist, dann treibt der C64 nicht die DATA Leitung. Dann ist DATA_IN = 1 (und die DATA Leitung auf High), falls kein Gerät DATA auf low zieht. Zieht doch ein Gerät DATA auf LOW, dann ist DATA_IN = 0.

Entsprechendes gilt für CLOCK.


Und: Enthusi hat recht, es handelt sich hierbei um ein Entprellen. Das gibt es im ROM des C64 (und auch der 1541) dauernd, wenn externe Leitungen gelesen werden.

Gruß,
Spiro