Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » bootbare Systemdisk gesucht... » Themenansicht

Autor Thread - Seiten: -1-
000
14.03.2015, 18:40 Uhr
holm

Avatar von holm

Ich habe hier von Felge Dateien von einer Diskette ungefähr folgenden Inhalts:

Quellcode:

@sys5122.com    ddt.com         lflo200.rom     rafquick.com    tpdruck.ovr
@sysma56.com    dinit.com       lo.mac          raftest.com     tpht.ovr
asm.com         du.com          m80.com         ri.mac          tpins.com
bamo.mac        dump.com        md.mac          sdir.com        tpovly1.ovr
bdosbios.doc    ed.com          moskurz.doc     setfd.com       um.mac
bios2710.mac    eprom.com       mrsuni-1.mac    stat.com        umsys.com
check.com       eq.mac          mrsuni-1.rom    stat_rob.com    xsub.com
ci.mac          fl.mac          mrsuni-2.rom    submit.com      zap.com
cinit.com       it.mac          pip_dr15.com    t80.com         zreroms.rom
co.mac          km.mac          power.com       t80.sub         zsid.com
copydisk.com    kmbtr.com       power_e.com     td.mac
cpmnarva.com    l80.com         promc.com       tlsout.com
cref80.com      lflo200.mac     pu.mac          tp.com



..ungefähr deshalb, weil ich aus dem Listing ein Bisschen was verschwinden lassen habe das offensichtlich nicht zu diesem Paket dazu gehört.
Es handelt sich um ein CP/M von der HU Berlin, Manfred Krzikalla.
Ich habe mir die Quellen angesehen und einen Rechner damit gebaut, CPU K2521, K5122 im WAIT Betrieb, 90K RAM und 2K BWS ab 08000h.
Die Bankumschalterei funktioniert wie im File um.mac angegeben:


Quellcode:

; Legende Speichersteuerung
; -------------------------
;
; System-PIO Port A
;
; |7|6|5|4|3|2|1|0|
;  | | | | | | | |
;  | | | | | | | +---  /MEMDI1 ZRE
;  | | | | | | +-----  negiert /MEMDI1 0 RAM und 4000 RAM (CP/M)
;  | | | | | +-------  /MEMDI1 4000 RAM (Hintergr.verzeichnisse)
;  | | | | +---------  frei
;  | | | +-----------  /MEMDI1 8000 ABS
;  | | +-------------  /MEMDI2 8000 RAM
;  | +---------------  /MEMDI  C000 RAM
;  +-----------------  frei



..bis auf den Unterschied das in Wirklichkeit mit dem CPU PIO Port B umgeschaltet wird, nicht wie hier angegeben mit PORT A, das steht im File falsch drin, ist aber im Endeffekt egal und Beides möglich.

Existiert diese Diskette bei irgend Jemandem als Image oder in Physikalischer Form, eventuell Systemspuren enthaltend? Wenn ja, dann hätte ich die gerne per Mail, wenn nein, muß ich sehen wie ich die Mimik an den Haaren aus dem Sumpf ziehen kann, das wird ziemlich aufwändig...

Ich habe die 3 Kilobyte mrsuni-2.rom Datei in 3 gleiche Scheiben geschnitten, auf EPROMS gebrannt und diese auf die CPU gesteckt, die Mimik klappert angeschlossene Floppies nach was Bootbarem ab..

Ohne Bootdiskette wird es blöd..

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
14.03.2015, 20:25 Uhr
felge1966
Default Group and Edit


Die Disk war von robbi. Die habe ich auch als *.TD0 Image liegen. Ich muss sie morgen mal raussuchen und dir schicken.

Gruss Joerg
--
http://felgentreu.spdns.org/bilder/jacob120.gif
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
14.03.2015, 21:07 Uhr
holm

Avatar von holm

Ok. Dann vertage ich mich mal auf morgen und werde die Dos-Kiste für die Floppyscheiberei ausgraben...

Irgendwie liegen die Dateien in einem Directory Namens "cpm1520/12_800.td0" .. wenn das wirtschaften helfen sollte..

Erwartungsvoll,

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 14.03.2015 um 21:07 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
17.03.2015, 20:09 Uhr
holm

Avatar von holm

[...danke Felge!]
Ok, hier ein aktueller Zwischenstand:

Ich habe einen Bootloader geschrieben der über die V.24 Schnittstelle einer ATS K7028 eines der auf der Diskette ursprünglich vorhandenen @sysma56.com (umgewandelt als Intel Hex File) reinzieht und damit die Kiste an den Haaren aus dem Sumpf befördert. BNis dahin hatte ich einige Hürden zu überwinden, z.B. herauszubekommen dass man vom Koppelbus der ATS das /UINT Signal für die Tastaturschnittstelle mit dem CLK/TRG3 der ZVE-CTC brücken muß...
Die Floppyarbeit klappt soweit bis auf die Tatsache das ich die seltsame TPA Disk A deren aktueller freier Platz 0 Kbyte beträgt nicht zu handeln weiß und das sich das Programm DINIT ständig weghängt (an unterschiedlichen Stellen). Mit ist es aber gelungen damit eine Diskette zu formatieren die sich auch lesen läßt (als das Programm gerade mal nicht abgestürzt ist).
Ich habe derzeit noch keine Ahnung ob das an meiner Hardware liegt oder ob das eine SW Macke ist.
Es sind 3 Laderoms dabei die erstens den Bootvorgang von einer 200K Diskette bewerkstelligen (habe kein solches LW mehr, das Letzte hatte ich wohl mal Rüdiger geschickt) und die dieses ROBOTRON BAMOS Kassettenmodul enthalten. Das habe ich noch nicht getestet. Für den Floppy-Laderteil liegt eine Quelle vor, so daß sich das Ding anpassen lassen sollte (ich habe es nicht so mit DPHs ..)
Die Kassettenlaufwerke habe ich schlicht nicht hier, aber das ist eine andere Baustelle.
Die auf den Disketten befindlichen Systemdateien enthalten zumindest zum Teil im Floppytreiber neueren Code als er in der Quelle vorhanden ist, aufgefallen ist mir das in der Kaltstartinitialisierung. Es gibt da Änderungen und der Code im Systemfile ähnelt dem in den CP/A Quellen wie ein Ei dem Anderen, offensichtlich fand da ein reger Austausch zwischen HU Berlin und AdW statt. Ich denke das sich die Änderungen auf Grund dieser Umstände in die Quelle "rückportieren" lassen.

Ich denke das ich zum Treffen ein laufendes System mitbringen kann..

@Holger: Falls Du Langeweile haben solltest, gib Bescheid, ich schicke Dir dann das dinit.com zum disassemblieren :-)

Hat sonst noch Jemand Ambitionen mit zu basteln?

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
17.03.2015, 22:18 Uhr
ambrosius



@holm

immer her damit - gerne!

Beste Grüße
Holger
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
17.03.2015, 23:01 Uhr
holm

Avatar von holm

http://www.tiffe.de/Robotron/krzikalla/dinit.com

:-)

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
18.03.2015, 02:31 Uhr
jde

Avatar von jde

Erster RAZ80 Reassemblierungsversuch, könnte schon fast mit M80 zu assemblieren gehen...

www.2jo.de/robotron/DINIT.RAZ

Bitte beachten: der Reassembler hat die vielen NOP's Opcode=00 für die Wartezyklen im Code zusammengefasst als "ds <Anzahl>,0".

viel Spaß...
Jonny

Dieser Beitrag wurde am 18.03.2015 um 02:35 Uhr von jde editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
18.03.2015, 09:09 Uhr
holm

Avatar von holm

Huh...was machst'n Du Nachts?

Danke einstweilen, aber die ganzen Kommentare fehlen noch :-)

Mal ne Frage an die CP/M Gurus:

Der Loader-Code der beiliegenden ROMs versucht beim Start 14 256Byte Blöcke vom ersten Sektor an von der Diskette auf 0c000 zu laden und untersucht dann ob er eine Kennung @SYS.. darin findet. Wenn ja, springt er den geladenen Code an.

Im Bürocomputer A5120 bzw. seinen Verwandten passiert das durch den V0.9 Lader auf der ZRE der von sich aus nur 26x128 formatierte Sektoren laden kann. Das entspricht 26*128*4 = 3400h Bytes.
Ich weiß nun, das CP/A einige Klimmzüge veranstaltet da das eigentliche System größer ist als diese 3400 Bytes. Es wird aus den Systemspuren nur ein Lader geladen der in der Lage ist auf der Diskette im Filesystem die Datei @os.com zu finden und diese zu laden. Dabei ist es egal wo auf der Diskette sich diese Datei befindet. Der Lader muß also mit dem Dateisystem von CP/M 2.2 umgehen können.. und was kann Sowas? ..Das BDOS. Der primäre Lader von CP/A auf dem Bürocomputer enthält ein BDOS das auf ein abgerüstetes BIOS zurück greift das seinerseits die Services des Robotron Bootloaders verwendet. ..Wahnsinn.

Beim PC1715 ist der primäre Laderom intelligenter und kann größere Sektoren lesen, weshalb die beiden IBM-Format Systemspuren wegfallen und eine Bootdiskette trotzdem 800K Kapazität haben kann.
Ich erinnere mich trübe das die Ladesoftware da irgendwie "im Directory versteckt" ist... wie auch immer.


Der nun hier vorliegende Ladercode heißt LFLO200.MAC, er residiert in den maximal 25fh Bytes im ersten Eprom, der Rest des ROMs wird für dieses Robotron-Kassettenlademodul benutzt.
Offensichtlich kommt dieser Lader (200K-Disketten) mit dem Format 5*1024 klar und 14 Blöcke a 256 Bytes sind 3800h.
Auf den Disketten(inhalten) im 800K Format die ich von Felge bekommen habe befinden sich diverse @sys* Dateien, momentan boote ich mit einem eigenen seriellen Loader die Datei @sysma56.com nach c800, schalte den Speicher um, schaufele sie wieder runter nach 0100 und starte dort das Ganze was zum booten führt. Speziell diese Datei, weil deren Konfiguration die freundlicherweise als Text im Binary zu lesen ist halbwegs zu dem paßt was ich hier zusammenstecken konnte. (Anzahl Floppies, Speicherumschaltung etc.). Das System arbeitet danach und kann eingelegte Floppies lesen/schreiben.

Meine Frage an die CP/M Insider ist nun wie man es bewerkstelligt das die Datei @sysma56.com bei intaktem 800K Diskettenformat auf den ersten Sektoren der Diskette (ab Sektor 1) zu liegen kommt und trotzdem ein funktionierendes Directory auf der Disk ist...
Genau die selbe "Mechanik" scheint beim CP/A des PC1715 zum Einsatz zu kommen.

Ich habe mich in die Materie noch nicht wirklich eingelesen, gibts hier Jemanden der sich damit auskennt?

Ein Programm "Sysgen" oder ähnlich zum Erzeugen von Systemdisketten scheint bei den Daten
die ich bekommen habe nicht dabei zu sein. Die Funktion sollte aber analog dem Programm vom PC1715 sein..vielleicht funktioniert dieses ja..

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
18.03.2015, 15:07 Uhr
holm

Avatar von holm

Mit der Abstürzerei von dinit.com bin ich etwas weiter gekommen, auf der K2521 war die Interruptprioritätskette noch falsch gewickelt, ganz weg ist das Phänomen aber noch nicht.
Offensichtlich hat das was mit der Interruptbehandlung zu tun, also wenn der FDC aktiv ist
und was Anderes dazwischen hagelt. Die Anzahl der erfolgreichen Formatierversuche ist
aber deutlich angestiegen.

Dann habe ich ne Telno gefunden bei der sich Frau Krzikalla am anderen Ende gemeldet hat
und meine das sich Ihr Mann sicherlich über einen Anruf heute Abend freuen würde...

Schaunmermal..

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
18.03.2015, 16:37 Uhr
felge1966
Default Group and Edit


...nur mal so gefragt, den FDC hast du aber schon von DMA auf WAIT umgebaut?

Gruß Jörg
--
http://felgentreu.spdns.org/bilder/jacob120.gif
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
18.03.2015, 19:12 Uhr
holm

Avatar von holm

Felge...Mönnnsch Felge!

BTW: die Diskette kam nicht von robbi, kennt er nicht.

Hast Du eigentlich was dagegen das ich den Kram auf meiner "Halde" ablade?

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 18.03.2015 um 19:17 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
18.03.2015, 20:17 Uhr
felge1966
Default Group and Edit


Warum sollte ich was dagegen haben? Ich habe es vor langer Zeit mal von robbi bekommen. Er hatte irgendwelche Disketten, aus unbekannter Quelle, zur Weitergabe gehabt. Da es aber noch weitere Interessenten gab hatte er die Disketten temporär auf seinem Server. Die ist aber schon ein paar Jahre her.

Das mit dem Waitbetrieb oben hatte ich überlesen.
Gruß Jörg
--
http://felgentreu.spdns.org/bilder/jacob120.gif

Dieser Beitrag wurde am 18.03.2015 um 20:18 Uhr von felge1966 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
18.03.2015, 21:24 Uhr
holm

Avatar von holm

Ich wäre nicht so weit gekommen Disketten lesen zu können wenn ich die Dinger nicht richtig gewickelt hätte. Mit robbi hatte ich vorhin telefoniert, kam ihm jedenfalls nicht bekannt vor.
Gerade eben habe ich mit Dr. M. Krzikalla auch telefoniert und ihn auch auf die Seite hier hingewiesen.
Einen Rechner der 30 Jahre nicht gelaufen ist hat er noch in Keller und er schaut mal was er an Disketten noch findet :-). War ein nettes Gespräch.

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
18.03.2015, 22:14 Uhr
ManfredK



Ich habe im Keller 2 10er-Schachteln mit CP/M-Disketten gefunden. Laut ausgedrucktem Inhaltsverzeichnis enthalten sie so etliche Quellen, die ich damals fabriziert habe. Die kann ich gern samt Rechner weitergeben.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
18.03.2015, 22:34 Uhr
holm

Avatar von holm

...gleich noch in den Keller gucken gegangen?

Da habe ich aber Trouble verursacht. :-)

Ich nehme die Sachen wie schon am Telefon angedeutet gerne, ich müßte nur irgendwie eine Abholung organisieren..sind 486Km bis hier her :-| aber ich hätte da schon eine Idee... mal sehen, ich muß da telefonieren.

Ich hoffe diese Webseite hier macht etwas Spaß?

Gruß,

Holm

BTW: das Bild links, mein Avatar, ist die CPU von der Elektronika E60...also in etwa eine LSI11/03
--
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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
20.03.2015, 20:44 Uhr
holm

Avatar von holm

Ich habe hier nun einen lader der das CP/M von 800K Disketten holt, ich habe in dem 200K Lader drin herumgepopelt um dem 2-seitige Disks beizubringen.
Einen Haken hat die Sache: wenn ich das CP/M vom Eprom lade stützt nach dem Einloggen der Drives ab und der Laden bootet neu, wenn ich den selben Lader aus dem RAM hochziehe funktioniert das, da bin ich gerade drüber den Fehler zu suchen.
Der Code ist ziemlicher Spaghetticode, da er einerseits offensichtlich auch vor mir schon eine aufgebohrte Variante eines Dissassembler Listings war und andererseits Verschiedenes darn zeitkritisch ist wie z.B, die Routine die nach Marken sucht und die Leseroutine..
Das 2. Problem ist: der Lader ist jetzt zu lang. Wie ich schon vorher angedeutet hatte sitzt im EPROM der ZVE K2521 bei deiser Rechnervariante ab Adresse 0x260 ein Binärhaufen der einen Handler für die Robotron Kassettenlauferke darstellt, den würde ich gerne behalten.
Der Lader geht aber nun bis 0x263 ..und ich muß den Bug noch finden.

Also ich stelle das Machwerk hier mal der Schwarmintelligenz zur Verfügung, evtl. hat ja Jeamand noch eine Idee wo sich was kürzen läßt. Ich habe ein paar Bytes gebraucht um in der Spursuche-routine
das Stepping alle 2 Tracks unterzubringen, eine Diskette hat jetzt also Tracks von 0-159 und ich gucke nach ob die anzuwählende Spur gerade oder ungerade ist und mache davon abhängig ob das Ding steppen soll..vielleicht geht das ja kürzer...

Gruß,

Holm


Quellcode:

; Legende AMF:
;   Port A
;  | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
;    |   |   |   |   |   |   |   |__ A  /WE  0-Schreiben ein
;    |   |   |   |   |   |   |______ A   MK  lesen  0-MFM-A1 Erkennung
;    |   |   |   |   |   |                          1-FM-Mark., MFM-C2 Erkenn.
;    |   |   |   |   |   |               schreiben  0-Takt fuer MFM
;    |   |   |   |   |   |                          1-Marken FM und A1 MFM
;    |   |   |   |   |   |__________ A  /SIDE 0-Kopf Seite 1; 1-Kopf Seite 0
;    |   |   |   |   |        oder   A  /FR   0-Fault reset;  1-kein FR
;    |   |   |   |   |______________ A  /STR 0-AMF aktiv
;    |   |   |   |                           1-AMF ausgeschaltet
;    |   |   |   |__________________ A   MK1 lesen  0-Informationen einlesen
;    |   |   |                                      1-nur 1 einlesen
;    |   |   |                           schreiben  0-FM-Daten schreiben
;    |   |   |                                      1-MFM und FM-Marken schr.
;    |   |   |______________________ A   MR, SD     0-steppen Richtung aussen
;    |   |                                          1-Marke-erkannt loeschen
;    |   |                                            steppen Richtung innen
;    |   |__________________________ A  /HL         0-Kopf geladen
;    |                                              1-Kopf entladen
;    |______________________________ A  /ST         0-Stepsignal an LW ein
;                                                   1-Stepsignal an LW aus
;
;  Port B
;  | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
;    |   |   |   |   |   |   |   |__ E  /RDY  0-Laufwerk bereit
;    |   |   |   |   |   |   |                1-Laufwerk nicht bereit
;    |   |   |   |   |   |   |______ E  /MKE  0-Marke erkannt
;    |   |   |   |   |   |                    1-Marke noch nicht erkannt
;    |   |   |   |   |     oder PC1715  E   MKE  1-Marke erkannt
;    |   |   |   |   |   | u.K5122            0-Marke noch nicht erkannt
;    |   |   |   |   |   |__________ E  /SYN  ???? (K5120)
;    |   |   |   |   |  oder K5122   A  /HF   0-Takt fuer 8" MFM
;    |   |   |   |   |                        1-Takt fuer 5" MFM und 8" FM
;    |   |   |   |   |  oder PC1715: A   MFM  0-FM-Aufzeichnung
;    |   |   |   |   |                        1-MFM-Aufzeichnung
;    |   |   |   |   |______________ A   PRE  0-schreiben ohne Prekompensation
;    |   |   |   |                            1-schreiben mit         "
;    |   |   |   |__________________ E  /FA   0-Fehler in der AMF aufgetreten
;    |   |   |                                1-kein Fehler aufgetreten
;    |   |   |          oder PC1715: A   FO   0-5"-Disketten
;    |   |   |                                1-8"-Disketten
;    |   |   |______________________ E  /WP   0-Schreibschutz ist ein
;    |   |                                    1-kein Schreibschutz
;    |   |__________________________ E  /FW   0-Laufwerk meldete Schreibfehler
;    |                                        1-Laufwerk meldete keinen Fehler
;    |______________________________ E  /T0   0-Kopf steht auf Spur 0
;                                             1-Kopf steht nicht auf Spur 0
;------------------------------------------------------------------------
;
; Legende Speichersteuerung
; -------------------------
;
; System-PIO Port A
;
; |7|6|5|4|3|2|1|0|
;  | | | | | | | |
;  | | | | | | | +---  /MEMDI1 ZRE
;  | | | | | | +-----  negiert /MEMDI 0 RAM und 4000 RAM (CP/M) -
;  | | | | | +-------  /MEMDI1 4000 RAM (Hintergr.verzeichnisse)
;  | | | | +---------  frei
;  | | | +-----------  /MEMDI1 8000 ABS
;  | | +-------------  /MEMDI2 8000 RAM    -
;  | +---------------  /MEMDI  C000 RAM    -
;  +-----------------  frei
;------------------------------------------------------------------------


ladadr        equ    0b000h        ; Ladeadresse
ladlen        equ    5000h
reclen        equ    1024
startad        equ    0c885h
secanz        equ    5        ; Anzahl der phys. Sektoren pro Spur
spber        equ    0A000h
side        equ    spber
dev         equ    spber+1        ; 0,3 -Kassette; 1-5"Floppy; 2-8"Floppy
solsec         equ    spber+2        ; Soll-Spurnr.
soltrk         equ    spber+3        ; Soll-Sektornr.
isttrk         equ    spber+4        ; aktuelle Spur
;
sidpuf:        equ    spber+5        ; Bereich fuer zu lesendes Sektor-ID 8 Bytes
;
datpuf:        equ    spber+13    ; Bereich fuer zu lesendes Daten-ID 1027 Bytes

;

ats        equ    0e0h
atsctc0        equ    ats+18h
atsctc1        equ    ats+19h
atsctc2        equ    ats+1ah
atsctc3        equ    ats+1ah

zvectc0        equ    080h
zvectc1        equ    zvectc0+1
zvectc2        equ    zvectc0+2
zvectc3        equ    zvectc0+3

atssioad    equ    0f0h
atssioas    equ    0f1h
atssiobd    equ    0f2h
atssiobs    equ    0f3h
zrepioad    equ    084h
zrepiobd    equ    085h
zrepioas    equ    086h
Zrepiobs    equ    087h

cr        equ    0dh
lf        equ    0ah
qatd        equ    0c00h

    org    0

bsloe:    di            ;Interrupt aus

;------------------------------------------------------------------------
;    ld    a,0cfh        ; Speicherumschaltung initialisieren
    out    (87h),a
    ld    a,067h
    out    (85h),a
    ld    a,080h
    out    (87h),a
;------------------------------------------------------------------------
    ld    a,3        ; Kanalreset
    out    (zvectc0),a
    out    (zvectc1),a
    out    (zvectc2),a
    out    (zvectc3),a

start:    ld    sp,spber
    call    initcs
    xor    a
start1:    LD    (dev),A
    CALL    gettr0        ; ist das Geraet lesebereit?
    OR    A
    JR    Z,laden        ; -> ja
start2:    LD    A,(dev)        ; naechstes Geraet
    INC    A
    JR    start1

; nach ladadr laden von Spur 0/1
;
laden:
    ld    iy,ladadr    ; Ladeadresse
    ld    de,1        ; Nr. des ersten zu ladenden Sektors
    ld    bc,ladlen/reclen ; Anzahl der zu ladenden Sektoren

ladee:    LD    A,B
    OR    C
    JR    Z,test        ; -> Bereich ist vollstaendig geladen
    DEC    BC

; 1.-n. Datensatz lesen
;
    PUSH    DE        ; Sektornummer auf Stack
    PUSH    BC        ; restliche zu ladende Sektoren
    CALL    lesueb
    JR    NZ,start2    ; -> naechstes Geraet abfragen
    ADD    IY,BC
    POP    BC
    POP    DE
    INC    DE
    JR    ladee

; es ist alles geladen
;
test:    CALL    allaus
    ld    hl,ladadr    ; pruefen, ob ein System geladen wurde
    ld    de,kontr
    ld    b,konlen
test1:    ld    a,(de)

    cond    0
    push    af
    push    bc
    call    co
    pop    bc
    pop    af
    endc

    ld    a,(de)
    cp    (hl)
    jr    nz,start2
    inc    hl
    inc    de
    djnz    test1

    cond    1
    call    dumpit
    endc

    ld    c,'A'
    call    co
    ld    c,':'
    call    co
    call    ladr
    call    crlf

    jp    startad        ; geladenes Programm starten
kontr:    defb    0
    defm    "@SYS"
konlen    equ    @-kontr
;------------------------------------------------------------------------
    cond    1

dumpit:    call    crlf
    ld    de,2000h    ; laenge
    ld    hl,0c800h    ; Ausgabeadresse
dumpi0:    call    ladr        ; aktuelle Adr. ausgeben
    ld    c,' '
    call    co
dumpi1:    ld    a,(hl)
    call    lbyte        ; Byte hex
    ld    c,' '
    call    co
    inc    hl
    dec    de
    ld    a,e
    and    0fh
    cp    0
    jr    nz,dumpi1
    call    crlf
    ld    a,d
    or    e
    jr    nz,dumpi0
    ld    c,'-'
    call    co
    call    crlf
    ret

    endc
;------------------------------------------------------------------------

; Lesen und uebertragen
;   IY - Adresse auf die zu lesen ist
;   DE - abs. Sektornr., des Sektors der zu lesen ist
;
lesueb:    PUSH    IY        ; Adresse fur zu lesende Daten
    LD    A,(dev)        ; welches Device
    CALL    lesen
    POP    DE        ; aus Lesepuffer auf Zieladresse uebertragen
    PUSH    BC
    LDIR
    POP    BC
    OR    A
    RET
;-----------------------
; alles ausschalten
;
allaus:    LD    HL,pdaus

; Ausgabe einer Port/Daten-Liste
;   HL zeigt auf Liste: Port,Datum,Port,Datum,...,0
;
outtab:    LD    A,(HL)
    AND    A
    RET    Z
    LD    C,A
    INC    HL
    LD    A,(HL)
    OUT    (C),A
    INC    HL
    JR    outtab

; CRC-Berechnung
;
bercrc:    ex    af,af'
    LD    A,0e5h        ; CRC-Anfangswert
    LD    C,09ah
    PUSH    DE
    ex    af,af'
bcrc1:    ex    af,af'
bcrc2:    LD    E,A
    INC    HL
    RLCA
    RLCA
    RLCA
    RLCA
    AND    0FH
    XOR    E
    LD    E,A
    RRCA
    RRCA
    RRCA
    LD    D,A
    AND    0E0H
    XOR    (HL)
    XOR    E
    LD    E,A
    LD    A,D
    AND    1FH
    XOR    C
    LD    C,A
    LD    A,D
    RRCA
    AND    0F0H
    XOR    C
    LD    C,E
    DJNZ    bcrc2
    ex    af,af'
    dec    a
    ld    b,80h
    jr    nz,bcrc1
    ex    af,af'
    OR    C
    POP    DE
    RET
;-----------------------

; Lesen eines mit Sektors von soltrk,solsec
;   in DE absolute Sektornr.
;  Out H Spur (solsec+1=soltrk) , L Sektor (solsec)
;
lesen:    PUSH    DE        ; Sektornummer
    call    setix
    POP    HL        ; Sektornummer nach HL

    XOR    A        ; aus abs. Sektornr. Spur/Sektor machen
    LD    D,A
    LD    E,secanz    ; Anzahl der Sektoren pro Spur
    DEC    HL
    LD    B,0FFH
I013A:    INC    B
    SBC    HL,DE
    JR    NC,I013A
    ADD    HL,DE
    INC    L
    LD    H,B
    LD    (solsec),HL

; Laufwerksbereitschaft 5"Floppy ermitteln
;   bei Rueckkehr: z - ready; nz - not ready
;
ready5:    LD    DE,0
    LD    A,0BFH        ; Kopf laden
    OUT    (10H),A
I0225:    IN    A,(12H)
    BIT    0,A        ; /RDY?
    jr    z,I0226        ; ja
    DEC    DE
    LD    A,D
    OR    E
    JR    NZ,I0225    ; warten auf /READY bis DE=0
    JP    I02C2        ; -> nein, nicht bereit

I0226:    CALL    spursu
    CALL    les2id

    cond    0

    push    hl
    push    af
    push    bc
    ld    c,' '
    call    co
    ld    b,8
    ld    hl,sidpuf
iii:    ld    a,(hl)
    call    lbyte
    ld    c,' '
    call    co
    inc    hl
    djnz    iii
    call    crlf
    pop    bc
    pop    af
    pop    hl
    
    endc

I015C:    PUSH    AF
    LD    HL,pdaus0    ; AMF abschalten, Motor laufen lassen
    CALL    outtab
    POP    AF
    LD    HL,datpuf+1
    LD    BC,reclen
    RET
;-----------------------
; Geraet auf Spur 0 fahren
;  in A: LW-Nr.
;
gettr0:    LD    HL,pdinit    ; AMF initialisieren
    PUSH    AF
    CALL    outtab
    POP    AF
    CALL    setix
    LD    A,0
    LD    (isttrk),A
    LD    B,8
    CALL    steps
    LD    B,85
    CALL    trk0
    JP    NZ,I02C2    ; -> Spur 0 nicht gefunden
    LD    A,0        ; Geraet ist bereit zum lesen
    JR    I015C
;-----------------------
; Floppy selektieren und AMF freischiessen
;
setix:    ld    hl,seltab
    and    3
    ld    e,a
    ld    d,0
    add    hl,de
    LD    A,0FFH
    OUT    (10H),A
    LD    A,0
    OUT    (14H),A
    IN    A,(16H)
    LD    A,(HL)
    OUT    (18H),A        ; select Floppy
    ret
;-----------------------
steps:    CALL    stepin
    DJNZ    steps
    RET
;-----------------------
trk0:    LD    c,12H
    IN    A,(C)
    AND    80h
    RET    Z
    LD    HL,stot
    CALL    stepou
    DJNZ    trk0
    INC    B
    RET
;-----------------------
stepin:    LD    HL,stit
stepou:    CALL    outtab
    LD    DE,400h

wait:    DEC    DE
    LD    A,D
    OR    E
    JR    NZ,wait
    RET
;-----------------------
spursu:    ld    a,(soltrk)
    rra
    jr    nc, spger
    ld    a,0bbh
    jr    spsid
spger:    ld    a,0bfh
spsid:    ld    (side),a
    ld    a,(isttrk)
    and    0feh
    ld    b,a
    ld    a,(soltrk)
    and    0feh
    sub    b
    jr    z,spnos
    rra
    ld    b,a
    call    steps
spnos:    ld    a,(soltrk)
    ld    (isttrk),a    ; aktuellen Track sichern

    cond    0

    push    hl
    push    bc
    push    af
    ld    c,    'T'
    call    co
    ld    c,    ':'
    call    co
    pop    af
    push    af
    call    lbyte
    ld    c,    ':'
    call    co
    ld    a,(side)
    call    lbyte
    pop    af
    pop    bc
    pop    hl

    endc

    LD    C,10H        ; Kopf laden
    ld    a,(side)    ; Seiteninfo nach A
    OUT    (C),A
    LD    DE,1000H
    JP    wait

;-----------------------
; Lesen eines Sektor-ID und eines Daten-ID nach sidpuf und datpuf
;
les2id:    LD    E,0FFH
I0264:    LD    C,16H        ; Datenport Eingabe
    LD    D,27        ; Gaplaenge
    LD    HL,sidpuf
    LD    B,7
    ld    a,1        ; 1x7 byte lesen
    PUSH    DE
    LD    DE,900H
    CALL    mrksu        ; ID lesen
    POP    DE
    CP    0FEH        ; Sektor-ID?
    JR    NZ,I02BB    ; -> nein

    LD    B,D
I027D:    IN    A,(C)        ; gap ueberlesen
    NOP
    NOP
    DJNZ    I027D

    LD    HL,datpuf
    LD    B,83H
    ld    a,reclen/128    ; x*80h byte
    PUSH    DE
    LD    DE,250H
    CALL    mrksu        ; ID lesen
    POP    DE
    CALL    setber

    LD    HL,sidpuf-1    ; Sektor-ID-CRC richtig?
    LD    B,7
    ld    a,1        ; 1x80h
    CALL    bercrc
    JR    NZ,I02BE    ; -> nein, weiter versuchen

    LD    A,(sidpuf+1)    ; richtige Spurnr.?
    LD    HL,soltrk
    CP    (HL)
;    JR    NZ,I02C2    ; -> nein, abbrechen
    nop
    nop

    LD    A,(sidpuf+3)    ; richtige Sektornr.?
    DEC    HL
    CP    (HL)
    JR    NZ,I02BE    ; -> nein, weiter versuchen

    LD    HL,datpuf-1    ; Daten-ID-CRC richtig?
    LD    B,83H
    ld    a,reclen/128    ; x*80h
    CALL    bercrc
    JR    NZ,I02BE    ; -> nein, weiter versuchen

    xor    a        ; alles ok.
    ret

I02BB:    CALL    setber
I02BE:    DEC    E
    JR    NZ,I0264

I02C2:    CALL    allaus
    LD    A,0FFH
    JP    I015C
;-----------------------
; Floppy ruecksetzen (bereit machen)
;
setber:    LD    A,0A5H
    OUT    (10H),A
;    LD    A,0BBH
    ld    a,(side)
    OUT    (10H),A
    IN    A,(16H)
    RET
;-----------------------
; Marke suchen (FE/FB bei Floppy, AA bei Kassette) und Daten dahinter lesen
;   in  DE - timeout-Zeit beim Markensuchen
;       HL - Pufferadresse
;   out A  - Marke
;
mrksu:    ex    af,af'
    LD    (HL),0
    CALL    setber
I0314:    ld    a,(side)
    cp    0bfh
    jr    nz,mrk01
    LD    A,85H        ; Markenerkennung ein
    jr    mrk02
mrk01:    ld    a,081h
mrk02:    OUT    (10H),A
I0318:    DEC    D        ; auf Marke warten
    JR    Z,I0312        ; -> time out; es kam keine
I031B:    DEC    E
    JR    Z,I0318
    IN    A,(12H)
    AND    2
    JR    NZ,I031B
    IN    A,(C)
    LD    D,0
    CP    0A1H
    JR    NZ,I0312    ; -> es kam falsche Marke
    IN    A,(C)
    CP    0A1H
    JR    NZ,I0312    ; -> es kam nach A1 nicht weiteres A1
    IN    A,(C)
    CP    0A1H
    JR    NZ,I0312    ; -> es kam nicht das 3. A1

I0309:    IN    D,(C)        ; FE/FB lesen
    LD    (HL),D
    INC    HL
    ini
    ex    af,af'
I030D:    nop
I030E:    INI            ; Datensatz einlesen
    JR    NZ,I030D
    ld    b,80h
    ini
    dec    a
    jr    nz,I030E
I0312:    LD    A,D
    RET

;-----------------------
; Befehle fuer Schrittausfuehrung
;
stit:    defb    10H,0bfh
    defb    10H,03fh
    defb    10H,0bfh
    defb    0

stot:    defb    10H,9fh
    defb    10H,1fh
    defb    10H,9fh
    defb    0

seltab:    defb    0EEH,0DDH,0BBH,77H    ; Floppy

pdinit:    defb    15H,0FH         ; AMF initialisieren
    defb    17H,4FH
    defb    11H,0FH
    defb    10H,0FFH
    defb    13H,0CFH
    defb    13H,0F7H
    defb    12H,0F7H
    defb    18H,0FFH
    defb    16H,0FFH
    defb    14H
    defb    0

pdaus:    defb    18H,0FFH    ; alles ausschalten
pdaus0:    defb    10H,0FFH
    defb    12H,0FFH
    defb    0



;------------------------------------------------------------------------
    cond    0
    

greet:    defm  "Hello"
    defb    0
grend    equ    @

    endc
;
;------------------------------------------------------------------------
    cond    0

comc:    ex    (SP),hl
    ld    c,(HL)
    inc    hl
    ex    (SP),hl
    jp    co

str:    ld    a,(HL)
    ld    c,a
    inc    hl
    or    a
    ret    z
    call    co
    jr    str

    endc

;------------------------------------------------------------------------
    cond    0

read:    ;dec    c
    ld    de,0c800h        ; Offset c800
    ;call    expr            ; Eingabe Offset
    push    de            ; offset auf stack
    ld    hl,    msg0
    call    str
    call    crlf
red0:    call    ci
    cp    ':'
    jr    nz,red0            ; warten auf ":"
    xor    a
    ld    d,a
    call    ibyte            ; Recordlaenge
    jr    z,red3            ; Recordlaenge = 0
    ld    e,a
    call    ibyte            ; Recordadresse
    ld    h,a
    call    ibyte
    ld    l,a
    call    ibyte            ; Datentyp
    ld    c,e
    push    hl
    ld    hl,0ff00h
    add    hl,sp            ; 100h unterhalb Stack
red1:    call    ibyte            ; Information lesen
    ld    (hl),a            ; zwischenspeichern
    inc    hl            ; naechster Wert
    dec    e            ; Recordlaenge -1
    jr    nz,red1            ; fertig?
    call    ibyte            ; Checksumme
    jp    nz,error        ; Checksumme falsch
    pop    de            ; Offset holen
    ex    (sp),hl            ;
    ex    de,hl
    add    hl,de
    ld    b,0
    add    hl,bc
    ex    de,hl
    ex    (sp),hl            ; Laden des gelesenen Records
red2:    dec    hl
    dec    de
    lddr
    push    bc
    ld    c,'X'
    call    co
    pop    bc
    jr    red0

red3:    ld    hl,ploc+1        ; Laden der Startadresse
    call    ibyte
    ld    (hl),a
    dec    hl
    call    ibyte
    ld    (hl),a
    call    ibyte
    call    ibyte
    pop    hl
    ret

error:    ld    hl,    msg1
    call    str
    call    crlf
    jr    read

msg0:    defm    "Read:"
    defb    0
msg1:    defm    "Checksum Error"
    defb    0
msg2:    defm    "Starting Test"
    defb    0

    endc

;------------------------------------------------------------------------
;Programmierung CTC fuer SIO Kanal A (9600 Baud)

    cond    1

tbctc0:    defb    03h
    defb      07h
        defb      01h
lctc0:    equ     @-tbctc0
tbctc1:    defb    03h
    defb      07h
        defb      01h
lctc1:    equ     @-tbctc1
tbctc2:    defb    03h
    defb      07h
        defb      01h
lctc2:    equ     @-tbctc2
;Programmierung SIO fuer ASCII
tsioa:    defb    18h
    defb      04h        ; WR4
        defb      01000100b    ; 84h Taktmode 16, 1Stopb
        defb      1        ; WR1
        defb      0        ; Ints gesperrt
        defb      3        ; WR3
        defb      11100001b    ; e1h 8Bits, Empf. enabled
        defb      5        ; WR5
        defb      11101010b    ; eah DTR,8Bit,Senderfreigabe, RTS
lsioa:    equ     @-tsioa

;------------------------------------------------------------------------

initcs:    ld      b,lctc0
        ld      c,atsctc0
        ld      hl,tbctc0
        otir
    ld      b,lctc1
        ld      c,atsctc1
        ld      hl,tbctc1
        otir
    ld      b,lctc2
        ld      c,atsctc2
        ld      hl,tbctc2
        otir
        ld      b,lsioa
        ld      c,atssioas
        otir
        ret

    endc

;------------------------------------------------------------------------
    cond    1

conv:    and    0fh
    add    a,90h
    daa
    adc    a,40h
    daa
    ld    c,a
    ret

    endc
;------------------------------------------------------------------------
    cond    1

ladr:    ld    a,h
    call    lbyte
    ld    a,l

lbyte:    push    af
    rrca
    rrca
    rrca
    rrca
    call    conv
    call    co
    pop    af
    call    conv
    jp    co

    endc
;------------------------------------------------------------------------
    cond    0

nible:    sub    '0'
    ret    c
    add    a,0e9h
    jr    c,nib1
nib0:    add    a,6
    jp    p,ni0
    add    a,7
    ret    c
ni0:    add    a,10
    or    a
    ret
nib1:    sub    0e9h
    sub    020h
    add    a,0e9h
    ret    c
    jr    nib0

    endc
;------------------------------------------------------------------------
    cond    0

ti:    push    bc
    call    ci
    ld    c,a
    call    co
    ld    a,c
    bit    6,a
    jr    z,ti1
    res    5,a
ti1:    pop    bc
    ret

    endc
;------------------------------------------------------------------------
    cond    0

pchk:    call    ti

p2c:    cp    ' '
    ret    z
    cp    ','
    ret    z
    cp    cr
    scf
    ret    z
    ccf
    ret

    endc
;------------------------------------------------------------------------
    cond    0

ibyte:    push    bc
    call    ci
    call    nible
    rlc    a
    rlc    a
    rlc    a
    rlc    a
    ld    c,a
    call    ci
    call    nible
    or    c
    ld    c,a
    add    a,d
    ld    d,a
    ld    a,c
    pop    bc
    ret

    endc
;------------------------------------------------------------------------
    cond    1

crlf:    ld    c,    0dh
    call    co
    ld    c,    0ah
    call    co
    ret

    endc
;------------------------------------------------------------------------
    cond    1

co:    ; Console Output Reg c
aas:    res     7,c
aas1:    in      a,(atssioas)
        and     4
        jr      z,aas1
        ld      a,c
        out     (atssioad),a
        ret

    endc

;------------------------------------------------------------------------
    cond    0

ci:    ;Console Output reg a
aes:    in      a,(atssioas)
        rrca
        jr      nc,aes
        in      a,(atssioad)
        and     7fh
        ret
    endc
;------------------------------------------------------------------------

;    org    0260h


end



...das ist noch eine Baustelle..anhybschen kann ich später...

Hier das File naoch mal als File:

http://www.tiffe.de/other/lflo800.mac

Der von mir benutze Assembler versteht kein .phase oder .dephase, es ist der Z80-asm unter Unix.
Code der zwischen cond 0 und endc liegt ist nicht aktiv und quasi auskommentiertm das ist wie #if0 und #endif. Der ganze Ausgabekram co,ci, read, lbyte, crlf,laddr usw. sowie die Sio/ATS Geschichte sind Debugging Kram..das fliegt wieder raus.

Ich habe Nix besserers gefunden und unter CP/M entwickeln.. so viel Zeit hab ich nicht :-)
Immerhin ist er in seiner Syntax ähnlich dem M80, ausnahmsweise mal eine gute Microsoft Software..

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 20.03.2015 um 20:56 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
016
21.03.2015, 14:06 Uhr
jde

Avatar von jde

10 Bytes lassen sich auf den 1. Blick hier sparen:

Quellcode:

initcs:
;        ld      b,lctc0
;        ld      c,atsctc0
        ld      bc,256*lctc0+atsctc0
        ld      hl,tbctc0
        otir
;        ld      b,lctc1
;        ld      c,atsctc1
;        ld      hl,tbctc1  ; weg
        ld      bc,256*lctc1+atsctc2
        otir
;        ld      b,lctc2
;        ld      c,atsctc2
;        ld      hl,tbctc2    ; weg
        ld      bc,256*lctc2+atsctc2
        otir
;        ld      b,lsioa
;        ld      c,atssioas
        ld      bc,256*lsioa+atssioas
        otir
        ret


Adressen der Init Tabellen liegen genau hintereinander

Dieser Beitrag wurde am 21.03.2015 um 14:14 Uhr von jde editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
017
21.03.2015, 20:31 Uhr
holm

Avatar von holm

...der Kram ist im eigentlichen Loader gar nicht enthalten.
Ich kämpfe derzeit mit merkwürdigen Effekten und denke das ich evtl. ein Hardwareproblem habe,
habe schon ein defektes Pin in der Rückverdrahtung des Systembusses gefunden, aber eine Umwegleitung behebt das Problem auch nicht. Wenn ich das gefunden habe und der Loader sauber funktioniert entrümpele ich den und komme noch mal mit dem Problem...


Falls Jemand eine K2521, eine 64K RAM Karte (K3526), eine 16K RAM Karte (K3525), ein ATSK7028.20,
eine K5122 oder K5120, eine ABS K7024, 2 Floppies, einen Einschub und eine K7634 da hat und das auch zusammenstecken möchte um zu experimentieren, bitte Bescheid geben. Ich erzähle dann mal vorab was wie gewickelt werden muß und lege ROM Inhalte und Floppy Images auf den FTP Server...
Immerhin ist das ja schon zum booten zu bewegen.

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 21.03.2015 um 20:55 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
018
22.03.2015, 10:02 Uhr
holm

Avatar von holm

So, seit gestern Abend bootet das Ding auch alleine von Diskette, ich weiß nur nicht warum es diese
Version tut und Andere nicht.
Die Speicheraufteilung des Rechners ist oben in der Legende beschrieben, der Hauptspeicher läßt sich durch /MEMDI Signale in 2 Gruppen schalten: 0-7fff, 8000-bfff und c000 bis ffff.
Die ROMs und das 1K RAM auf der ZVE werden auch abgeschaltet und es gibt noch 16 "Hintergrundspeicher" ab 4000 sowie den Bildwiderholspeicher ab 8000.
Der Lader reloziert sich nach dem Start selbst auf c100, schaltet den ZVE Speicher ab und den unteren 32K Hauptspeicherblock ein, worauf hin er wieder auf 0100 reloziert wird und dann dort gestartet.
danach werden 5000h Bytes von der Diskette eingelesen, nachgesehen ob die Kennung @SYS im geladenen Code zu finden ist und wenn ja 0c885 angesprungen im geladenen Code.

Das ist ziemlicher Kuddelmuddel und die Sache mit dem Bamos habe ich mir damit erst einmal aus dem Kopf schlagen können, aber immerhin startet der Rechner.
Wenn ich den ganzen Umladekram am Anfang weg lasse startet der Rechner das geladene CP/M auch, allerdings stürzt dieses ab und der Bootvorgang beginnt von vorne.
Es scheint so, als ob das CP/M file von irgendwelchem zufällig entstehendem Speicherinhalt abhängig ist, habe das aber noch nicht gefunden mit dem Disassembler.
Ich habe ja bisher immer nur das zufällig vorgefundene Betriebssystem von der Diskette gestartet, noch nichts selber gebautes, damit will ich mich nun als nächstes befassen.

Quellcode:

; Legende AMF:
;   Port A
;  | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
;    |   |   |   |   |   |   |   |__ A  /WE  0-Schreiben ein
;    |   |   |   |   |   |   |______ A   MK  lesen  0-MFM-A1 Erkennung
;    |   |   |   |   |   |                          1-FM-Mark., MFM-C2 Erkenn.
;    |   |   |   |   |   |               schreiben  0-Takt fuer MFM
;    |   |   |   |   |   |                          1-Marken FM und A1 MFM
;    |   |   |   |   |   |__________ A  /SIDE 0-Kopf Seite 1; 1-Kopf Seite 0
;    |   |   |   |   |        oder   A  /FR   0-Fault reset;  1-kein FR
;    |   |   |   |   |______________ A  /STR 0-AMF aktiv
;    |   |   |   |                           1-AMF ausgeschaltet
;    |   |   |   |__________________ A   MK1 lesen  0-Informationen einlesen
;    |   |   |                                      1-nur 1 einlesen
;    |   |   |                           schreiben  0-FM-Daten schreiben
;    |   |   |                                      1-MFM und FM-Marken schr.
;    |   |   |______________________ A   MR, SD     0-steppen Richtung aussen
;    |   |                                          1-Marke-erkannt loeschen
;    |   |                                            steppen Richtung innen
;    |   |__________________________ A  /HL         0-Kopf geladen
;    |                                              1-Kopf entladen
;    |______________________________ A  /ST         0-Stepsignal an LW ein
;                                                   1-Stepsignal an LW aus
;
;  Port B
;  | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
;    |   |   |   |   |   |   |   |__ E  /RDY  0-Laufwerk bereit
;    |   |   |   |   |   |   |                1-Laufwerk nicht bereit
;    |   |   |   |   |   |   |______ E  /MKE  0-Marke erkannt
;    |   |   |   |   |   |                    1-Marke noch nicht erkannt
;    |   |   |   |   |     oder PC1715 E   MKE  1-Marke erkannt
;    |   |   |   |   |   | u.K5122            0-Marke noch nicht erkannt
;    |   |   |   |   |   |__________ E  /SYN  ???? (K5120)
;    |   |   |   |   |  oder K5122   A  /HF   0-Takt fuer 8" MFM
;    |   |   |   |   |                        1-Takt fuer 5" MFM und 8" FM
;    |   |   |   |   |  oder PC1715: A   MFM  0-FM-Aufzeichnung
;    |   |   |   |   |                        1-MFM-Aufzeichnung
;    |   |   |   |   |______________ A   PRE  0-schreiben ohne Prekompensation
;    |   |   |   |                            1-schreiben mit         "
;    |   |   |   |__________________ E  /FA   0-Fehler in der AMF aufgetreten
;    |   |   |                                1-kein Fehler aufgetreten
;    |   |   |          oder PC1715: A   FO   0-5"-Disketten
;    |   |   |                                1-8"-Disketten
;    |   |   |______________________ E  /WP   0-Schreibschutz ist ein
;    |   |                                    1-kein Schreibschutz
;    |   |__________________________ E  /FW   0-Laufwerk meldete Schreibfehler
;    |                                        1-Laufwerk meldete keinen Fehler
;    |______________________________ E  /T0   0-Kopf steht auf Spur 0
;                                             1-Kopf steht nicht auf Spur 0
;------------------------------------------------------------------------
;
; Legende Speichersteuerung
; -------------------------
;
; System-PIO Port A
;
; |7|6|5|4|3|2|1|0|
;  | | | | | | | |
;  | | | | | | | +---  /MEMDI1 ZRE
;  | | | | | | +-----  negiert /MEMDI 0 RAM und 4000 RAM (CP/M) -
;  | | | | | +-------  /MEMDI1 4000 RAM (Hintergr.verzeichnisse)
;  | | | | +---------  frei
;  | | | +-----------  /MEMDI1 8000 ABS
;  | | +-------------  /MEMDI2 8000 RAM    -
;  | +---------------  /MEMDI  C000 RAM    -
;  +-----------------  frei
;------------------------------------------------------------------------


ladadr        equ    0b000h        ; Ladeadresse
ladlen        equ    5000h
reclen        equ    1024
startad        equ    0c885h
secanz        equ    5        ; Anzahl der phys. Sektoren pro Spur
spber        equ    0A000h
side        equ    spber
dev         equ    spber+1        ; 0,3 -Kassette; 1-5"Floppy; 2-8"Floppy
solsec         equ    spber+2        ; Soll-Spurnr.
soltrk         equ    spber+3        ; Soll-Sektornr.
isttrk         equ    spber+4        ; aktuelle Spur
;
sidpuf:        equ    spber+5        ; Bereich fuer zu lesendes Sektor-ID 8 Bytes
;
datpuf:        equ    spber+13    ; Bereich fuer zu lesendes Daten-ID 1027 Bytes

;
bws        equ    08000h
ramst        equ    0c00h

ats        equ    0e0h
atsctc0        equ    ats+18h
atsctc1        equ    ats+19h
atsctc2        equ    ats+1ah
atsctc3        equ    ats+1ah

zvectc0        equ    080h
zvectc1        equ    zvectc0+1
zvectc2        equ    zvectc0+2
zvectc3        equ    zvectc0+3

atssioad    equ    0f0h
atssioas    equ    0f1h
atssiobd    equ    0f2h
atssiobs    equ    0f3h
zrepioad    equ    084h
zrepiobd    equ    085h
zrepioas    equ    086h
zrepiobs    equ    087h

cr        equ    0dh
lf        equ    0ah
qatd        equ    0c00h
offset        equ    0c000h


    org    0
    ld    a,0cfh
    out    (zrepiobs),a
    ld    a,067h
    out    (zrepiobd),a
    ld    a,080h
    out    (zrepiobs),a    ; ZRE Speicher, 8000-FFFF an

    ld    hl,resta
    ld    de,offset+resta
    ld    bc,restae-resta
    ldir

    ld    hl,relo
    ld    de,relo+offset
    ld    bc,relend-relo
    ldir
    jp    resta+offset

resta    ld    a,060h
    out    (zrepiobd),a
    ld    hl,relo+offset
    ld    de,0100h
    ld    bc,relend-relo
    ldir
    jp    0100h

restae    equ    @

    org    0100h

relo:    di            ;Interrupt aus
start:    ld    sp,spber
    xor    a
start1:    LD    (dev),A
    CALL    gettr0        ; ist das Geraet lesebereit?
    OR    A
    JR    Z,laden        ; -> ja
start2:    LD    A,(dev)        ; naechstes Geraet
    INC    A
    JR    start1

; nach ladadr laden von Spur 0/1
;
laden:
    ld    iy,ladadr    ; Ladeadresse
    ld    de,1        ; Nr. des ersten zu ladenden Sektors
    ld    bc,ladlen/reclen ; Anzahl der zu ladenden Sektoren

ladee:    LD    A,B
    OR    C
    JR    Z,test        ; -> Bereich ist vollstaendig geladen
    DEC    BC

; 1.-n. Datensatz lesen
;
    PUSH    DE        ; Sektornummer auf Stack
    PUSH    BC        ; restliche zu ladende Sektoren
    CALL    lesueb
    JR    NZ,start2    ; -> naechstes Geraet abfragen
    ADD    IY,BC
    POP    BC
    POP    DE
    INC    DE
    JR    ladee

; es ist alles geladen
;
test:    CALL    allaus
    ld    hl,ladadr    ; pruefen, ob ein System geladen wurde
    ld    de,kontr
    ld    b,konlen
test1:    ld    a,(de)
    cp    (hl)
    jr    nz,start2
    inc    hl
    inc    de
    djnz    test1

    jp    startad        ; geladenes Programm starten
    jr    @
kontr:    defb    0
    defm    "@SYS"
konlen    equ    @-kontr
;------------------------------------------------------------------------
; Lesen und uebertragen
;   IY - Adresse auf die zu lesen ist
;   DE - abs. Sektornr., des Sektors der zu lesen ist
;
lesueb:    PUSH    IY        ; Adresse fur zu lesende Daten
    LD    A,(dev)        ; welches Device
    CALL    lesen
    POP    DE        ; aus Lesepuffer auf Zieladresse uebertragen
    PUSH    BC
    LDIR
    POP    BC
    OR    A
    RET
;-----------------------

; alles ausschalten
;
allaus:    LD    HL,pdaus

; Ausgabe einer Port/Daten-Liste
;   HL zeigt auf Liste: Port,Datum,Port,Datum,...,0
;
outtab:    LD    A,(HL)
    AND    A
    RET    Z
    LD    C,A
    INC    HL
    LD    A,(HL)
    OUT    (C),A
    INC    HL
    JR    outtab

; CRC-Berechnung
;
bercrc:    ex    af,af'
    LD    A,0e5h        ; CRC-Anfangswert
    LD    C,09ah
    PUSH    DE
    ex    af,af'
bcrc1:    ex    af,af'
bcrc2:    LD    E,A
    INC    HL
    RLCA
    RLCA
    RLCA
    RLCA
    AND    0FH
    XOR    E
    LD    E,A
    RRCA
    RRCA
    RRCA
    LD    D,A
    AND    0E0H
    XOR    (HL)
    XOR    E
    LD    E,A
    LD    A,D
    AND    1FH
    XOR    C
    LD    C,A
    LD    A,D
    RRCA
    AND    0F0H
    XOR    C
    LD    C,E
    DJNZ    bcrc2
    ex    af,af'
    dec    a
    ld    b,80h
    jr    nz,bcrc1
    ex    af,af'
    OR    C
    POP    DE
    RET
;-----------------------
; Lesen eines mit Sektors von soltrk,solsec
;   in DE absolute Sektornr.
;  Out H Spur (solsec+1=soltrk) , L Sektor (solsec)
;
lesen:    PUSH    DE        ; Sektornummer
    call    setix
    POP    HL        ; Sektornummer nach HL

    XOR    A        ; aus abs. Sektornr. Spur/Sektor machen
    LD    D,A
    LD    E,secanz    ; Anzahl der Sektoren pro Spur
    DEC    HL
    LD    B,0FFH
I013A:    INC    B
    SBC    HL,DE
    JR    NC,I013A
    ADD    HL,DE
    INC    L
    LD    H,B
    LD    (solsec),HL

; Laufwerksbereitschaft 5"Floppy ermitteln
;   bei Rueckkehr: z - ready; nz - not ready
;
ready5:    LD    DE,0
    LD    A,0BFH        ; Kopf laden
    OUT    (10H),A
I0225:    IN    A,(12H)
    BIT    0,A        ; /RDY?
    jr    z,I0226        ; ja
    DEC    DE
    LD    A,D
    OR    E
    JR    NZ,I0225    ; warten auf /READY bis DE=0
    JP    I02C2        ; -> nein, nicht bereit

I0226:    CALL    spursu
    CALL    les2id

I015C:    PUSH    AF
    LD    HL,pdaus0    ; AMF abschalten, Motor laufen lassen
    CALL    outtab
    POP    AF
    LD    HL,datpuf+1
    LD    BC,reclen
    RET
;-----------------------
; Geraet auf Spur 0 fahren
;  in A: LW-Nr.
;
gettr0:    LD    HL,pdinit    ; AMF initialisieren
    PUSH    AF
    CALL    outtab
    POP    AF
    CALL    setix
    LD    A,0
    LD    (isttrk),A
    LD    B,8
    CALL    steps
    LD    B,85
    CALL    trk0
    JP    NZ,I02C2    ; -> Spur 0 nicht gefunden
    LD    A,0        ; Geraet ist bereit zum lesen
    JR    I015C
;-----------------------
; Floppy selektieren und AMF freischiessen
;
setix:    ld    hl,seltab
    and    3
    ld    e,a
    ld    d,0
    add    hl,de
    LD    A,0FFH
    OUT    (10H),A
    LD    A,0
    OUT    (14H),A
    IN    A,(16H)
    LD    A,(HL)
    OUT    (18H),A        ; select Floppy
    ret
;-----------------------
steps:    CALL    stepin
    DJNZ    steps
    RET
;-----------------------
trk0:    LD    c,12H
    IN    A,(C)
    AND    80h
    RET    Z
    LD    HL,stot
    CALL    stepou
    DJNZ    trk0
    INC    B
    RET
;-----------------------
stepin:    LD    HL,stit
stepou:    CALL    outtab
    LD    DE,400h

wait:    DEC    DE
    LD    A,D
    OR    E
    JR    NZ,wait
    RET
;-----------------------
spursu:    ld    a,(soltrk)
    rra
    jr    nc, spger
    ld    a,0bbh
    jr    spsid
spger:    ld    a,0bfh
spsid:    ld    (side),a
    ld    a,(isttrk)
    and    0feh
    ld    b,a
    ld    a,(soltrk)
    and    0feh
    sub    b
    jr    z,spnos
    rra
    ld    b,a
    call    steps
spnos:
spusu2:    LD    A,(soltrk)
    LD    (isttrk),A    ; aktuellen Track sichern
    LD    C,10H        ; Kopf laden
    ld    a,(side)    ; Seiteninfo nach A
    OUT    (C),A
    LD    DE,1000H
    JP    wait

;-----------------------
; Lesen eines Sektor-ID und eines Daten-ID nach sidpuf und datpuf
;
les2id:    LD    E,0FFH
I0264:    LD    C,16H        ; Datenport Eingabe
    LD    D,27        ; Gaplaenge
    LD    HL,sidpuf
    LD    B,7
    ld    a,1        ; 1x7 byte lesen
    PUSH    DE
    LD    DE,900H
    CALL    mrksu        ; ID lesen
    POP    DE
    CP    0FEH        ; Sektor-ID?
    JR    NZ,I02BB    ; -> nein

    LD    B,D
I027D:    IN    A,(C)        ; gap ueberlesen
    NOP
    NOP
    DJNZ    I027D

    LD    HL,datpuf
    LD    B,83H
    ld    a,reclen/128    ; x*80h byte
    PUSH    DE
    LD    DE,250H
    CALL    mrksu        ; ID lesen
    POP    DE
    CALL    setber

    LD    HL,sidpuf-1    ; Sektor-ID-CRC richtig?
    LD    B,7
    ld    a,1        ; 1x80h
    CALL    bercrc
    JR    NZ,I02BE    ; -> nein, weiter versuchen

    LD    A,(sidpuf+1)    ; richtige Spurnr.?
    LD    HL,soltrk
    CP    (HL)
;    JR    NZ,I02C2    ; -> nein, abbrechen
    nop
    nop

    LD    A,(sidpuf+3)    ; richtige Sektornr.?
    DEC    HL
    CP    (HL)
    JR    NZ,I02BE    ; -> nein, weiter versuchen

    LD    HL,datpuf-1    ; Daten-ID-CRC richtig?
    LD    B,83H
    ld    a,reclen/128    ; x*80h
    CALL    bercrc
    JR    NZ,I02BE    ; -> nein, weiter versuchen

    xor    a        ; alles ok.
    ret

I02BB:    CALL    setber
I02BE:    DEC    E
    JR    NZ,I0264

I02C2:    CALL    allaus
    LD    A,0FFH
    JP    I015C
;-----------------------
; Floppy ruecksetzen (bereit machen)
;
setber:    LD    A,0A5H
    OUT    (10H),A
;    LD    A,0BBH
    ld    a,(side)
    OUT    (10H),A
    IN    A,(16H)
    RET
;-----------------------
; Marke suchen (FE/FB bei Floppy, AA bei Kassette) und Daten dahinter lesen
;   in  DE - timeout-Zeit beim Markensuchen
;       HL - Pufferadresse
;   out A  - Marke
;
mrksu:    ex    af,af'
    LD    (HL),0
    CALL    setber
I0314:    ld    a,(side)
    cp    0bfh
    jr    nz,mrk01
    LD    A,85H        ; Markenerkennung ein
    jr    mrk02
mrk01:    ld    a,081h
mrk02:    OUT    (10H),A
I0318:    DEC    D        ; auf Marke warten
    JR    Z,I0312        ; -> time out; es kam keine
I031B:    DEC    E
    JR    Z,I0318
    IN    A,(12H)
    AND    2
    JR    NZ,I031B
    IN    A,(C)
    LD    D,0
    CP    0A1H
    JR    NZ,I0312    ; -> es kam falsche Marke
    IN    A,(C)
    CP    0A1H
    JR    NZ,I0312    ; -> es kam nach A1 nicht weiteres A1
    IN    A,(C)
    CP    0A1H
    JR    NZ,I0312    ; -> es kam nicht das 3. A1

I0309:    IN    D,(C)        ; FE/FB lesen
    LD    (HL),D
    INC    HL
    ini
    ex    af,af'
I030D:    nop
I030E:    INI            ; Datensatz einlesen
    JR    NZ,I030D
    ld    b,80h
    ini
    dec    a
    jr    nz,I030E
I0312:    LD    A,D
    RET

;-----------------------
; Befehle fuer Schrittausfuehrung
;
stit:    defb    10H,0bfh
    defb    10H,03fh
    defb    10H,0bfh
    defb    0

stot:    defb    10H,9fh
    defb    10H,1fh
    defb    10H,9fh
    defb    0

seltab:    defb    0EEH,0DDH,0BBH,77H    ; Floppy

pdinit:    defb    15H,0FH         ; AMF initialisieren
    defb    17H,4FH
    defb    11H,0FH
    defb    10H,0FFH
    defb    13H,0CFH
    defb    13H,0F7H
    defb    12H,0F7H
    defb    18H,0FFH
    defb    16H,0FFH
    defb    14H,0
;    defb    87h,0cfh    ; Speicherumschaltung initialisieren
;    defb    85h,67h
;    defb    87h,80h
;    defb    0

pdaus:    defb    18H,0FFH    ; alles ausschalten
pdaus0:    defb    10H,0FFH
    defb    12H,0FFH
    defb    0

;    org    0260h

;    INCLUDE "bamost1.mac"
relend    equ    @

end


:
Das Quellfile hier habe ich aktualisiert http://www.tiffe.de/other/lflo800.mac
Alles hinter dem Label start ist der eignetliche Lader der immer noch um ein paar Bytes gekürzt werden müßte..

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 22.03.2015 um 10:06 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
019
24.03.2015, 12:03 Uhr
holm

Avatar von holm

..hat keiner Mehr eine Ide zum Kürzen zwischen "start:" und "relend" ?

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 24.03.2015 um 12:15 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
020
24.03.2015, 12:56 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

brauchst du wirklich die CRC-Prüfung? Lass die doch weg ...
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
021
24.03.2015, 17:48 Uhr
holm

Avatar von holm

Die war mir als mögliche "Ersparnis" auch schon ins Auge gestochen, das ist aber die letzte Variante...
ich würde die ungern rausnehmen.

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
022
24.03.2015, 18:14 Uhr
jde

Avatar von jde

reichen 14 Bytes weniger?


Quellcode:

***** LFLO800O.MAC
        djnz    test1

        jp      startad         ; geladenes Programm starten
        jr      $
kontr:  defb    0
***** LFLO800B.MAC
        djnz    test1
        jp      startad         ; geladenes Programm starten
;
;       jr      $
kontr:  defb    0
*****

***** LFLO800O.MAC
        INC     HL
        LD      A,(HL)
        OUT     (C),A
        INC     HL
        JR      outtab
***** LFLO800B.MAC
        INC     HL
;       LD      A,(HL)
;       OUT     (C),A
;       INC     HL
        outi
        JR      outtab
*****

***** LFLO800O.MAC
        CALL    setix
        LD      A,0
        LD      (isttrk),A
***** LFLO800B.MAC
        CALL    setix
;       LD      A,0
        xor     a
        LD      (isttrk),A
*****

***** LFLO800O.MAC
        JP      NZ,I02C2        ; -> Spur 0 nicht gefunden
        LD      A,0             ; Geraet ist bereit zum lesen
        JR      I015C
***** LFLO800B.MAC
        JP      NZ,I02C2        ; -> Spur 0 nicht gefunden
; ld a,0 berflssig, a ist schon 0
;       LD      A,0             ; Geraet ist bereit zum lesen
        JR      I015C
*****

***** LFLO800O.MAC
        OUT     (10H),A
        LD      A,0
        OUT     (14H),A
***** LFLO800B.MAC
        OUT     (10H),A
;       LD      A,0
        xor     a
        OUT     (14H),A
*****

***** LFLO800O.MAC
        rra
        jr      nc, spger
        ld      a,0bbh
        jr      spsid
spger:  ld      a,0bfh
spsid:  ld      (side),a
***** LFLO800B.MAC
        rra
        ld      a,0bfh
        jr      nc,spsid
        ld      a,0bbh
spsid:  ld      (side),a
*****

***** LFLO800O.MAC
        ld      a,(isttrk)
        and     0feh
        ld      b,a
***** LFLO800B.MAC
        ld      a,(isttrk)
        srl     a
        ld      b,a
*****

***** LFLO800O.MAC
        ld      a,(soltrk)
        and     0feh
        sub     b
***** LFLO800B.MAC
        ld      a,(soltrk)
        srl     a
        sub     b
*****

***** LFLO800O.MAC
        jr      z,spnos
        rra
        ld      b,a
***** LFLO800B.MAC
        jr      z,spnos
        ld      b,a
*****

***** LFLO800O.MAC
les2id: LD      E,0FFH
I0264:  LD      C,16H           ; Datenport Eingabe
        LD      D,27            ; Gaplaenge
        LD      HL,sidpuf
        LD      B,7
        ld      a,1             ; 1x7 byte lesen
***** LFLO800B.MAC
les2id: LD      E,0FFH
I0264:  LD      HL,sidpuf
;       LD      B,7
;       LD      C,16H           ; Datenport Eingabe
        ld      bc,716h
        LD      D,27            ; Gaplaenge
        ld      a,1             ; 1x7 byte lesen
*****

***** LFLO800O.MAC
        JR      NZ,I02BE        ; -> nein, weiter versuchen

        xor     a               ; alles ok.
        ret
***** LFLO800B.MAC
        JR      NZ,I02BE        ; -> nein, weiter versuchen
; berflssig, A ist schon 0
;       xor     a               ; alles ok.
        ret
*****

***** LFLO800O.MAC
I02C2:  CALL    allaus
        LD      A,0FFH
        JP      I015C
***** LFLO800B.MAC
I02C2:  CALL    allaus
;       LD      A,0FFH
        dec     a
        JP      I015C
*****




Gruß Jonny
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
023
24.03.2015, 18:51 Uhr
holm

Avatar von holm

Genial, ich werde es ausprobieren.

Ich wollte eigentlich hier Bescheid geben da bei mir gerade ein Paket mit 4 Schachteln Disketten
von Manfred Krzikalla aufgeschlagen ist, er hatte Bedenken das die noch lesbar sind, ich hatte versucht ihn zu beruhigen und es ist auch so, bisher kein Problem :-)
Schon auf der 1. Diskette gibts Systemquellen und auch die eines 800K Laders, allerdings steht da auch schon im Quellfile das der BAMOS Modul keinen Platz mehr hat, evtl. helfen Deine Änderungen da auch.
14 Bytes reichen,die verteiben das Problem das ich hatte mit dem BAMOS und es bleibt sicher noch was übrig um eine Einschaltmeldung auf den Schirm zu produzieren.

Weiter auf der Diskette befindet sich die Quelle für die Kommunikation mit einer 8086 Karte für MSDOS,
und einem OMTI HD Controller (dürfte sehr ähnlich der GIDE zu bedienen sein, aber ich denke ich habe auch so einen Controller noch). Die BIOS Quelle unterstützt K2521 und K2526 in Zusammenarbeit mit
K5120 K5122 und K5126 (hat Jemand so ein Ding?).

Schon diese Diskette ist Gold wert!

Ich werde mich mal mit der Generierung eines etwas abgerüsteten Systems befassen das in einen 5er Einschub paßt...

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
024
24.03.2015, 20:20 Uhr
jde

Avatar von jde

@Holm: schön, dass ich helfen konnte.

Das mit der 8086 Karte und Omti Controller kommt mir sehr bekannt vor. Solche Sachen hatte ich an meiner damaligen Z80 Kiste in der Firma auch dran. War ein umgebautes K8912/K8917 Terminal.
Software und Adapter um einen XT Omti an den Z80 zu hängen hab ich selbst gemacht. Hatte nur Datenblätter mit der Registerbelegung und den Befehlen, PC Busbelegung war ja auch bekannt. Ja GIDE ist sehr ähnlich.
Hab hier noch eine 8086 Karte liegen, die ich an meiner Z80 Kiste dran hatte.
Wurde über 4 I/O Adressen vom Z80 aus angesprochen. Über ein kleines 59 Byte langes Programm wurde vom Z80 aus das Kommunikationsprogramm von der 8086 Karte geladen und gestartet. Über das Kommunikationsprogramm ging der Datenaustausch. Bildschirm, Tastatur und Disketten wurde vom Z80 CP/M benutzt. Es lief darauf ein CP/M-86 Emulator der alle BIOS und BDOS Aufrufe zum Z80 weitergeleitet hat. Programme und Daten waren auf dem Z80 CP/M gespeichert. Turbo86 lief sehr gut damit.

Falls es jemanden interessiert, wie man einen OMTI Controller per Z80 anspricht.
hier ein Ausschnitt aus meinem BIOS:

Quellcode:

;
; Harddisk I/O fuer OMTI Controller (5526)
;
hddata    equ    40h        ; OMTI Datenport
hdstat    equ    hddata+1    ; OMTI Statusport
hdsel    equ    hddata+2    ; OMTI Select
hdmask    equ    hddata+3    ; OMTO Interrupt Maske
;
hdwrit:    ld    a,c        ; Write Type merken
    ld    (wrtype),a
    ld    a,0ebh        ; Richtung Datentransfer aendern
    ld    (hdpat3),a    ; NOP oder EX DE,HL
    call    hdsetp        ; Track Sektor und Head setzen
    call    testbu        ; Pruefen ob Sektor im Buffer
    jr    z,hdwr1        ; Sektor bereits im Buffer
    ld    a,(hdbufw)    ; Buffer geschrieben?
    or    a
    call    nz,wr512    ; alten Buffer schreiben
    xor    a
    ld    (hdbufw),a    ; geschrieben merken
;    ld    a,(wrtype)
;    cp    2
;    call    nz,rd512    ; lesen
    call    rd512
;    ld    hl,cfld        ; neue Parameter setzen
;    ld    de,cfield
;    ld    bc,3
;    ldir
hdwr1:    ld    a,1        ; merken heisse Daten im Buffer
    ld    (hdbufw),a
    call    hdrd7        ; Daten in Buffer schreiben
    ld    a,(wrtype)
    cp    1        ; DIR Write?
    ld    a,0        ; kein Fehler annehmen
    ret    nz        ; nein
    ld    (hdbufw),a    ; Write Flag ruecksetzen
    call    wr512        ; Sektor schreiben
    xor    a        ; kein Fehler annehmen
    ret
;
hdread:    xor    a
    ld    (hdpat3),a
    call    hdsetp
    call    testbu
    jr    z,hdrd7        ; bereits im Buffer
    ld    a,(hdbufw)    ; Buffer geschrieben?
    or    a
    call    nz,wr512    ; alten Buffer schreiben
    xor    a
    ld    (hdbufw),a    ; geschrieben merken
    call    rd512        ; lesen
hdrd7:    ld    hl,hdbuf-128
    ld    de,128
    ld    a,(sec)
    and    3
    inc    a
    ld    b,a
hdrd3:    add    hl,de
    djnz    hdrd3
    ld    de,(dad)
    ld    bc,128
hdpat3:    nop            ; NOP oder EX DE,HL
    ldir
    ld    c,3
    ld    hl,cfield
    ld    de,hdbufp
    ldir
    xor    a
    ret
;
hdsetp:    ld    a,(sec)        ; Track, Sector und Head berechnen
    srl    a
    srl    a
    ld    b,0
hdsp2:    sub    17
    jr    c,hdsp1
    inc    b
    jr    hdsp2
;
hdsp1:    add    a,17
    ld    c,a
    ld    a,b
    ld    (cfld),a    ; Head+Unit 0
    ld    a,(tra+1)    ; Track high
    rrca
    rrca
    or    c
    ld    (cfld+1),a    ; Track high+Sector
    ld    a,(tra)
    ld    (cfld+2),a    ; Track low
    ret
;
testbu:    ld    hl,hdbufp    ; Pruefen ob Sektor schon im Buffer
    ld    de,cfld
    ld    b,3
testb1:    ld    a,(de)
    cp    m
    ret    nz
    inc    hl
    inc    de
    djnz    testb1
    ret
;
wcr:    in    a,(hdstat)    ; Wait for controller ready
    bit    0,a
    jr    z,wcr
    ret
;
; Kommandoausgabe HD-Controller
;
hdscmd:    out    (hdsel),a
    call    wcr
    ld    a,c
    out    (hddata),a
nxbhd:    call    wcr
    ld    a,m
    out    (hddata),a
    inc    hl
    djnz    nxbhd
    ret
;
; Schreiben / Lesen 512 Bytes Sektor von Festplatte
;
wr512:    ld    a,0b3h        ; otir
    ld    c,0ah        ; Write command
    jr    rw512
;
rd512:    ld    hl,cfld        ; neue Parameter setzen
    ld    de,cfield
    ld    bc,3
    ldir
    ld    a,0b2h        ; inir
    ld    c,8        ; read command
rw512:    ld    (hdpat1+1),a    ; patch inir/otir
    ld    (hdpat2+1),a
    ld    hl,cfield
    ld    b,5        ; Anzahl weiterer Kommandobytes
    call    hdscmd        ; Kommandoausgabe
    call    wcr        ; waten auf rdy
    in    a,(hdstat)
    bit    2,a
    ret    nz        ; Fehler
    call    wcr
    ld    hl,hdbuf    ; Adresse Buffer
    ld    bc,hddata    ; Laenge=256, IO=Adresse Datenport
hdpat1:    inir            ; byte 1-256
hdpat2:    inir            ; byte 257-512
    call    wcr        ; Warten auf Ende Kommando
    in    a,(hddata)    ; Status lesen
    and    2        ; Command error bit maskieren
    ret
;
hdinit:    xor    a
    out    (hdstat),a
    out    (hdmask),a
    ld    bc,50ch
    ld    hl,drvprm
    call    hdscmd
    ld    b,8
    call    nxbhd
    call    wcr
    in    a,(hddata)
    ret

;
cfield:    db    0,0,0,1,2    ; Kommandobytes HD-Controller
hdbufw:    db    0        ; Schreibflag HD-Sektorbuffer
hdbufp:    ds    3,-1        ; Track/Head/Sector fuer Buffer
cfld:    ds    3,0        ; Track/Head/Sector neue r/w Operation
drvprm:    db    0,0,0,0,0,2,64h,3,0,0,0,80h,0    ; Harddisk Drive Parameter




Gruß
Jonny

Dieser Beitrag wurde am 24.03.2015 um 20:27 Uhr von jde editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
025
24.03.2015, 20:37 Uhr
holm

Avatar von holm

Ja Jonny so was findet sich auch in den letzten CP/A Quellen von Willi Dames an der AdW.
Meiner Meinung nach war da früher auch mal in der MC etwas zu lesen (wir haben die in der Unibibliothek damals "gefressen" wenn ein neues Heft da war...
Kurz nach der Wende lief mir mal ein A5120 zu in dem eine 8086 Karte mit Harddisk neben dem CP/A werkelte und das CP/A als IO Prozessor für Bildschirm (MDA) und die Floppies nutzte.
Ja, Turbopascal, Nortoncommander, Dbase usw. liefen alle unter MSDOS auf dem Ding.
Der Rechner ist leider verschollen.

Ich habe gerade mit Manfred telefoniert, ich habe grünes licht für den Upload der CP/M Sachen von ihm.

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;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
026
24.03.2015, 20:50 Uhr
jde

Avatar von jde

die CP/M Sachen würden mich auch interessieren. Hab zwar nicht viel Zeit für sowas, aber mal sehen.
Mein Interesse liegt eher bei Sachen von DEC als bei robotron.
Hab den DEC Kram zu Ostzeiten repariert.
Einiges an PDP-8, PDP-11 und VAX Sachen habe ich hier rumstehen.
Natürlich auch noch einige Z80 Systeme und nen P8000C.
Vieles davon auch lauffähig.

Gruß
Jonny

Dieser Beitrag wurde am 24.03.2015 um 20:51 Uhr von jde editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
027
24.03.2015, 22:14 Uhr
holm

Avatar von holm

Ich war indessen nebenan unterwegs und habe mir die Finger wund gehebelt.
Eine 11/83 steht hier unterm Tisch neben einer VS4000/90 (von Micha).
Eine echte DEC habe ich zu DDR Zeiten nie gesehen :-) SM1420 und SM4 aber schon.
Einen Vaxstation II - Verschnitt aka Applicon Workstation habe ich kurz
nach der Wende repariert, das Ding hat dann mit NetBSD noch sein Gandenbrot
als FTP Server an der Uni verdient..
Irgendwie wurde ich von Motorola in München angerufen ob wir das haben wollen,
ich hatte erst mal ja gesagt. Hatte tüchtigen Trouble mit dem Emulex Controller
und dem NetBSD damals. Da das Ding eine Unibus Bridge hatte habe ich da einen
UDA50 reingesteckt und bin damit gefahren. VMS kam mir dasmals ziemlich
vergriesgnaddelt vor und das hat sich bei heute nicht verändert.

Ich habe auch einzelne Russenprozessoren da mit denen ich gerne mal
einen Einplatinenrechner bauen würde (K1801VM2 und VM3)
Eine E60 (11/03) steht hier auch noch.
Ich werde morgen was auf den Webserver laden, bitte um Geduld..

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 24.03.2015 um 22:19 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek