000
26.01.2014, 20:24 Uhr
holm
|
Ich habe doch ein Bisschen an dem Z80 Emuf der mir in die Hänmde gefalle nist dran herumgefriemt. Das Ding hat jetzt 64K Byte RAM und 32KByte Rom, eine CTC und eine SIO zusätzlich und läuft mit 6,144 Mhz..
Um da aus lauter dummdödelei was drauf zu bringen habe ich mir den Zapple-Monitor und das Zapple-Basic hervorgekramt. Beide erfordern einen Macroassembler so das der von mir sonst verwendete asz80 aus der Frankenstein Suite ausfällt, das kann er nicht. Ich habe in Bisschen gegoogelt und bin über das Ding hier :
http://www.villehelin.com/wla.html
gestolpert, habe es mir aus dem Git Repository gezogen und auf mein BSD portiert. '(Seltsam, viele Leute können gute Software schreiben aber bei Makefiles scheitern sie :-) ) Die Sourcen scheinen sehr sauber zu sein, der gcc hat trotz -pedantic nicht genörgelt.
Jetzt zum Problem, der Assembler unterstützt eine für mich noch schleierhafte Art der Definition mit Rombanks und Memorymaps durch das ich noch nicht recht durchgestiegen bin. .MEMORYMAP DEFAULTSLOT 0 SLOTSIZE $200 SLOT 0 $0000 SLOT 1 $0200 .ENDME
.ROMBANKMAP BANKSTOTAL 10 BANKSIZE $200 BANKS 10 .ENDRO
Das Stammt wohl daher, das der Assembler auch z.B. die CPU des Gameboy, welche ja eine abgerüstete Z80 ist und einige Andere von SpielKonsolen unterstützt.
Hat hier schon mal einer mit dem Ding herumgefummelt?
Die nächste Hürde war ein Listing zu erzeugen, das Listing kommt nicht aus dem Assembler, sondern aus dem Linker aber auch nur dann, wenn man seine Quelle mist .SECTION "foo" force und .ENDS eingeklammert hat. Gewöhnungsbedürftig, aber im Endeffekt scheint das zu funktionieren.. es kommt dann Sowas raus:
Quellcode: | ; ;-LIST DEVICE CONFIGURATION .EQU LTTY 0 ;TELEPRINTER PRINTER .EQU LCRT 40H ;C.R.T. SCREEN .EQU LINE 80H ;LINE PRINTER (EXTERNAL ROUTINE) .EQU LUSER 0C0H ;USER DEFINED ; ; ; VECTOR FOR USER DEFINED ROUTINES ; ;.LOC: USER $FF $FF $FF CILOC: .DSB 3,0ffh ;CONSOLE INPUT $FF $FF $FF COLOC: .DSB 3,0ffh ;CONSOLE OUTPUT $FF $FF $FF RPTPL: .DSB 3,0ffh ;HIGH-SPEED READER $FF $FF $FF RULOC: .DSB 3,0ffh ;USER DEFINED STORAGE (INPUT) $FF $FF $FF PTPL: .DSB 3,0ffh ;HIGH-SPEED PUNCH $FF $FF $FF PULOC: .DSB 3,0ffh ;USER DEFINED STORAGE (OUTPUT) $FF $FF $FF LNLOC: .DSB 3,0ffh ;LINE PRINTER $FF $FF $FF LULOC: .DSB 3,0ffh ;USER DEFINED PRINTER $FF $FF $FF CSLOC: .DSB 3,0ffh ;CONSOLE INPUT STATUS ROUTINE ;J: =. ; ; PROGRAM CODE BEGINS HERE ; ; ;.LOC: BASE $C3 $4C $F0 JP BEGIN ;GO AROUND VECTORS ; ; <VECTOR FOR CALLING PROGRAMS> ;
|
Ein Bisschen stört mich daran noch da die Adressen nicht mit ausgegeben werden wie es sich IMHO gehöhrt, evtl. gibts ja da auch noch einen Schalter..
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;} |