009
23.06.2013, 16:11 Uhr
timetube
|
Also wenn das Projekt in eclipse (oder mit make) gebaut wird, sollte die folgenden Ausgaben erscheinen.
Quellcode: | 15:44:22 **** Build of configuration Debug for project libZ80 **** make all Building file: ../disas.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"disas.d" -MT"disas.d" -o "disas.o" "../disas.cpp" Finished building: ../disas.cpp Building file: ../sim1.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim1.d" -MT"sim1.d" -o "sim1.o" "../sim1.cpp" Finished building: ../sim1.cpp Building file: ../sim2.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim2.d" -MT"sim2.d" -o "sim2.o" "../sim2.cpp" Finished building: ../sim2.cpp Building file: ../sim3.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim3.d" -MT"sim3.d" -o "sim3.o" "../sim3.cpp" Finished building: ../sim3.cpp Building file: ../sim4.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim4.d" -MT"sim4.d" -o "sim4.o" "../sim4.cpp" Finished building: ../sim4.cpp Building file: ../sim5.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim5.d" -MT"sim5.d" -o "sim5.o" "../sim5.cpp" Finished building: ../sim5.cpp Building file: ../sim6.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim6.d" -MT"sim6.d" -o "sim6.o" "../sim6.cpp" Finished building: ../sim6.cpp Building file: ../sim7.cpp Invoking: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"sim7.d" -MT"sim7.d" -o "sim7.o" "../sim7.cpp" Finished building: ../sim7.cpp Building target: libZ80.a Invoking: GCC Archiver ar -r "libZ80.a" ./disas.o ./sim1.o ./sim2.o ./sim3.o ./sim4.o ./sim5.o ./sim6.o ./sim7.o ar: creating libZ80.a Finished building target: libZ80.a
15:44:23 Build Finished (took 1s.226ms)
|
und für's CP/M und HostInterface
Quellcode: | 15:44:23 **** Build of configuration Default for project cpm22 **** make all ~/bin/zasm -vw2b -i "./src/bios.asm" -o "./obj/bios.bin" -l ./obj/bios.lst zasm: "./src/bios.asm", "./obj/bios.bin", "./obj/bios.lst" zasm: no errors. echo SECTS equ \(\( `sed -ne 's/BEGDAT[^=]\+[^0-9]\+\([0-9]\+\)/\1/p' ./obj/bios.lst` - CPMSTART + 127 \) \/ 128 \) > src/boot.inc ~/bin/zasm -vw2b -i "./src/cpm22.asm" -o "./obj/cpm22.bin" -l ./obj/cpm22.lst zasm: "./src/cpm22.asm", "./obj/cpm22.bin", "./obj/cpm22.lst" zasm: no errors. ~/bin/zasm -vw2b -i "./src/boot.asm" -o "./obj/boot.bin" -l ./obj/boot.lst zasm: "./src/boot.asm", "./obj/boot.bin", "./obj/boot.lst" zasm: no errors. cp ./obj/boot.bin cpm22.img head --bytes=5632 ./obj/cpm22.bin >> cpm22.img cat ./obj/bios.bin >> cpm22.img echo cpm22.img done cpm22.img done head --bytes=6656 cpm22.img > tmp.sys dd if=disks/drivea.cpm of=tmp.dat bs=1 skip=6656 249600+0 records in cat tmp.sys tmp.dat > tmp.dsk 249600+0 records out 249600 bytes (250 kB) copied, 0.354184 s, 705 kB/s mv disks/drivea.cpm disks/drivea.cpm.bak mv tmp.dsk disks/drivea.cpm g++ -c -pipe -g -Wall -I ../libZ80 -o "./obj/Z80CPM.o" "./src/Z80CPM.cpp" g++ -o CPM22 ./obj/Z80CPM.o -L ../libZ80/Debug -lZ80 -lpthread
|
Danach sollte es ein Diskimage disks/drivea.cpm geben, welches das gerade gebaute CP/M 2.2 mit Bootloader und CBIOS auf den Systemspuren enthällt. Das System wird (noch) für ein 64k Emulator gebaut.
Nach dem Starten des ebenfalls mitgebauten Hostconsole und Diskemulator CPM22, sollte die folgende Ausgabe auf der Console erscheinen.
Quellcode: | Shared z80 CPU port 2007-2012 V 2.3 by JSievers@NADINE-Software.com / based on Z80SIM V 1.8 Copyright (C) 1987-2006 by Udo Munk CP/M 2.2 Emulation 2010 by J.Sievers <jsievers@NADINE-Software.com> (Uses the original CP/M 2.2 Sources) RS CBIOS V1.0b
A>dir dir A: ED COM : DUMP COM : DDT COM : PIP COM A: MOVCPM COM : BYE COM : LS COM : CREF80 COM A: DDTZ COM : L80 COM : M80 COM : SID COM A: WM COM : WM HLP : ZSID COM : MAC COM A: Z80 LIB : Z80 DOC : ZTRAN COM : LIB80 COM A: M SUB : ZAP COM : SYSGEN COM : Z80ASM COM A: CLS COM : HIST UTL : TRACE UTL : D COM A: STAT COM : ASM COM : XSUB COM : LOAD COM A: SUBMIT COM A> A>zap
SuperZap 5.2
^H Cursor left N Next directory page D Change Drive ^L Cursor right P Previous directory page S Select track/Sector ^K Cursor up M Set directory Mask E Edit file ^J Cursor down U Change User number T Type file TAB Next file (current: 0) Z Exit from SuperZap
Directory List - A:????????.???
> ASM .COM > BYE .COM > CLS .COM > CREF80 .COM > D .COM > DDT .COM > DDTZ .COM > DUMP .COM > ED .COM > HIST .UTL > L80 .COM > LIB80 .COM > LOAD .COM > LS .COM > M .SUB > M80 .COM > MAC .COM > MOVCPM .COM > PIP .COM > SID .COM > STAT .COM > SUBMIT .COM > SYSGEN .COM > TRACE .UTL > WM .COM > WM .HLP > XSUB .COM > Z80 .DOC > Z80 .LIB > Z80ASM .COM > ZAP .COM > ZSID .COM
|
Wie geht das?
Ganz einfach.
Der Z80 schickt immer 1 Commando-token und einen Parameter an den PC. Der sendet den Kommandotoken und wenn nötig die angeforderten daten an den Z80. Die Kommandos sind selbsterklärend, hoffe ich.
Was ist nun zu tun?
1. Der Simulator greift direkt die Port-IOs auf den RS232 Beustein ab und tut so, indem er die Buffer-Empty/Full Flags simuliert, als sei da eine RS232 Übertragung zwischen dem Z80-CPU-Thread und der Disk und Terminal emulation gelaufen.
2. Es gibt keinerlei Fehlerbehandlung, was bei einer echten fehlerbehaftete RS232 Communikation natürlich so nicht geht. Hier sollte die Hardware wenigstens Parity und Framing error auswerten und ein echtes mini-protocoll implementiert werden. Weningstens für die 128byte DiskSectorBlöcke. Achtung, der Bootloader hat nur 128Byte (liest ja aber nur) und das CBIOS sollten wir auch nicht unendlich aufblähen.
3. Die Defines für die Ports und die Masken für die Statusbits müssen angepasst werden an die Hardware. 4. Im CBIOS wie im Bootloader muss die Hardware auf eine feste Baudrate initialisiert werden. Ich würde mich da hoch tasten 4800, 9600 .... 15k was noch erträglich geht. ))
Ich werde meine HARDWARE mit dem #define EZ80F91 einbinden. Das heißt, alle Hardwarespezifischen Sachen werden conditional nur dann aktive, wenn dieses Define gesetzt bist. Wenn ihr das für Eure Hardware auch so macht, können wir, wenn wir gut und kooperative zusammen arbeiten, hinterher EIN Projekt haben, das nur über diese defines für unsere verschiedenen Plattformen erstllbar bleibt. Es ist dann für Andere ein Leichtes ihre Hardware da zu intergrieren.
So, nun ist Wochenende ) viel Spass beim Einarbeiten in meinen Codes und nicht verzweifeln, es ist nur ein Freizeit-Hack, der keinerlei Anspruch auf eine professionelle vorgehensweise erhebt und erfüllt.
cio J.
PS: Habt ihr jabba oder twitter -- "Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt." Ein Stein. Dieser Post wurde am 23.06.2013 um 16:33 Uhr von timetube editiert. |