| 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.6LOC    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.
 |