054
23.08.2009, 13:21 Uhr
holm
|
Ich habe mal an der "CTC-Karte" weiter experimentiert und versucht den CTC interrupten zu lassen. Es funktioniert nicht.
Weil das nicht funktionierte, habe ich mit dem selben Programm den Kanal 1 des CTC1 auf der Hauptplatine programmiert, das funzt einwandfrei.
Bei meinem eigenen Aufbau wird die ISR das erste mal abgearbeitet, der CTC nimmt /INT wieder weg aber IEO geht nicht wieder auf High, das heißt also, das er kein RETI bekommen hat. Ich habe also den Logikanalyzer angeklemmt und mit 3D24 Anschluß 11 (diese offene RETINT Anschluß) getriggert. Das Ding wird Low, wenn die CPU auf RETI_P (0xFFE1) etwas ausgibt, der Draht an und für sich wird aber nicht benötigt.
Die Ursache dafür das mein CTC den Interrupt nicht beendet liegt daran, das in diesem Interruptquittierungszyklus (0xED, 0x4D) augenscheinlich die Datenbustreiber der Hauptplatine nicht aktiv sind und das 0xED und 0x4D nicht auf dem Speicherbus mitzulesen sind! Der Logikanalyzer zeigt mir in dem Moment wo RETINT von 3D24 aktiv ist nur 0xFF auf dem BUS an. Das ist ein Designfehler von EAW, warscheinlich die Stelle an der die von "eingeschränkter Verwendbarkeit" reden.
Der Einzige Peipheriebaustein der Z80 Serie der so zu benutzen währe ist die SIO, da man deren Interruptstatus durch setzten eines Registerbits zurücksetzen kann, also nicht auf RETI angewiesen ist. Nicht Z80 Bausteine können das zwar auch, liefern aber unfreundlicherweise nicht den erforderlichen Vektor wenn /IORQ und /M1 aktiv sind. Man müßte also ein Latch oder sowas für den Vektor extra implementieren :-(
Die Ursache des Fehlers dafür liegt augenscheinlich in der Mimik um 1D11 begründet, der dieses NON_BD Signal erzeugt. Dieses Signal müßte bei RETINT auch aktiv werden, damit sich dieses ED 4D auf dem Bus lesen läßt. Die einfachste Möglichkeit währe jetzt wohl die Logik des 16Bit Boards entsprechend zu verändern, aber wer will das schon..
Hat Jemand Lust da mal mit drüber zu gucken?
BTW: Ich habe diese LOAD Mimik im Monitor ausprobiert und experimentiere hier mit einem einzelnen 16BIT Board herum, das über eine serielle Schnittstelle mit einem Terminal verbunden ist (Consolen Port) und über die obere Schnittstelle (SIO0/0) mit einem beliebigen Port meiner P8000. Wenn man im Monitor QUIT eingibt, schaltet der Monitor das Terminal zur P8000 durch, man kann sich dann einloggen und beliebig den Pfad wechseln. Nachdem man das getan hat, kommt man zurück in den Monitor, in dem man am 16Bit Board einen NMI auslöst (X3 B5, aber ein Reset tut es auch). Danach kann man mit "LOAD Dateiname" ein a.out File von Wega in den Speicher des 16 Bit Boards holen :
U8000-Softwaremonitor Version 3.1 - Press NMI LOAD it .... ENTRY POINT 8000 *G 8000 und starten. Der Lader lehnt programme ab, die auf Adressen unterhalb 0x8000 gebunden sind, ab 0x8000 fängt im Segment <80> bzw <00> der DRAM an. (/bin/ld -b 0x8000 -o it it.o)
Damit kann man also auf der P8000 Programme in Assembler, C oder weis der Teufel was erstellen und auf ein einzelnes 16Bit board laden und testen.
Die 16Bit Boards gibts ja wie Sand am Meer... :-)
Hier mal noch mein aktuelles Programm, wie schon geschrieben es funktioniert wenn ich CTC auf SCTC1 setze:
Quellcode: | plzasm 1.6 LOC OBJ CODE STMT SOURCE STATEMENT
1 !****************************************************************************** 2 CTC Interrupt Test auf Speicherbus 3 CTC @ 0xef01 4 ******************************************************************************! 5 6 ctctest module 7 8 9 CONSTANT 10 SC_SEGV := %01 11 SC_NSEGV := %02 12 RETI_P := %FFE1 !RETI-Port fuer Schaltkreise des U880-Systems! 13 MYCTC := %EF01 !CTC auf Buskarte! 14 SCTC1 := %FFB1 !CTC 1 auf Hauptplatine! 15 CTC := MYCTC 16 PSAREA := %4400 !Program Status Area! 17 VI_TAB_REST := %447c !first free Entry in VI Tab! 18 MZ := %9000 !Merkzelle! 19 20 $SECTION RAM 21 22 GLOBAL 0000 23 CTC_T procedure 24 entry 0000 7F02 25 sc #SC_NSEGV 0002 4D05 447E 26 ld VI_TAB_REST+2, #CTCT_ISR 0006 0038' 0008 4D05 4482 27 ld VI_TAB_REST+6, #CTCT_ISR 000C 0038' 000E 4D05 4486 28 ld VI_TAB_REST+10, #CTCT_ISR 0012 0038' 0014 4D05 448A 29 ld VI_TAB_REST+14, #CTCT_ISR 0018 0038' 001A 4D05 9000 30 ld MZ, #%FFFF !Merkzelle loeschen! 001E FFFF 0020 C820 31 ldb rl0, #%20 0022 3A86 EF01 32 outb CTC, rl0 0026 C887 33 ldb rl0, #%87 0028 3A86 EF03 34 outb CTC+2, rl0 002C C83F 35 ldb rl0, #%3f 002E 3A86 EF03 36 outb CTC+2, rl0 0032 7F01 37 sc #SC_SEGV 0034 7C05 38 ei vi 0036 E8FF 39 loop: jr loop 0038 40 end CTC_T 41 42 43 44 45 GLOBAL 0038 46 CTCT_ISR procedure 47 entry 0038 7C01 48 di vi 003A 93F0 49 push @r15, r0 003C 2100 ED4D 50 ld r0, #%ED4D !U880-RETI ausgeben! 0040 3A06 FFE1 51 outb RETI_P, rh0 0044 3A86 FFE1 52 outb RETI_P, rl0 0048 97F0 53 pop r0, @r15 004A 4D05 9000 54 ld MZ, #%55AA !Kennzeichen f. Interrupt! 004E 55AA 0050 7C05 55 ei vi 0052 7F01 56 sc #SC_SEGV 0054 8D07 57 nop 0056 7B00 58 iret 0058 59 end CTCT_ISR 60 end ctctest
0 errors Assembly complete
|
Gruß,
Holm -- float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v; {s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+ (r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&& (A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;} Dieser Beitrag wurde am 23.08.2009 um 13:25 Uhr von holm editiert. |