> AsmZ80 4.02  Z80 Assembler, from a file & Based on RAW's Amstrad assembler ( Can do Basic or Text file 2: <""RAW/JGH Assembler v4.02 BBC" F3Init:ln%=0:l_flg%=0:org%=-1:P%=-1:in%=0:out%=0 P";maxlabs;" labels available"' Z :Close:: d?"Input file: "in$:in%=(in$):in%=0:"'"in$"' not found": n "Output file: "out$:errs%=0 x/pass=1 2:#in%=0:inside%=:"Pass ";pass Vpass=2:out$<>"":"Save "+out$+" 0+"+~(P%-org%)+" "+~E%+" "+~org%:out%=(out$) -DoLine:#in% errs%>99::errs%:pass=2 !errs%=100:"Too many errors" Y:out%:#out%:out%=0:$name%=out$:!X%=name%:X%!2=org%:A%=2:&FFDD:X%!6=E%:A%=3:&FFDD #in%:in%=0:errs%=0:t@L  : Init maxlabs=(--2000)40 >numl=0: type$(69),label$(maxlabs),value(maxlabs),cond$(7) + ctrl% 31,name% 127:X%=ctrl%:Y%=X%256 # DXL:i%=0 69: type$(i%): " DlL:i%=0 7: cond$(i%):  : 3err(A$):19);left$;:right$<>"":",";right$; "''A$" at line ";ln%:errs%=errs%+1: ,: 6"Close:in%:A%=in%:in%=0:#A% @out%:A%=out%:out%=0:#A% J T: ^;DoLine:textl$=readL:textr$="":right$="":textl$="": haI%=textl$," "):textl$,I%+1,1)=" "::textl$=textl$,I%)+textl$,I%+2):textl$,I%+1,1)<>" " r&textr$="":";\",textl$,1)):DDB |l_flg%:;ln%;5); inside%:outside: textl$,1)="]":inside%=: &P%=-1:errs%=100:err("Origin?"): 0byte1=-1:byte2=-1:byte3=-1:byte4=-1:index=-1  pass=2:"000"+~P%,4)": "; =i%=textl$+" "," "):textl$=up(textl$,i%))+textl$,i%+1) i%=-1:j%=69 0 -1 $textl$,type$(j%))=1:i%=j%:j%=0 $:i%=-1:err("Bad statement"): i%<36: i% DzH,drH,dNI,djF,DVI,t~E,tZF,TRG,dBF,dBF,dBF,dBF,tZF,tZF,TVH,tZF,TJE,tZF,tzD,tZF,tZF,ThE,DZE,TVH,dBF,dBF,dBF,dBF,TbF,dpE,DzC,dBF,dBF,dBF,dBF i%>35:i%=i%-35: i% dBF,tZF,T\G,dBF,dBF,tLE,dBF,dBF,TtC,TtC,DjI,DrF,dBF,dBF,thG,tZF,tZF,t^G,dBF,t|G,tZF,trG,tZF,dBF,TVC,d^H,tZF,DtI,DvG,tJG,tTG,d~F,THG,trB index>-1:out(index) byte1>-1:out(byte1) byte2>-1:out(byte2) byte3>-1:out(byte3) byte4>-1:out(byte4) &1I%=textl$," "):I%=0 textl$,3)="DEF":DDB 03J%=1:z%=I% (textl$):textl$,z%,1)=" ":J%=z% :7:textl$=textl$,I%-1)+" ",4)+" "+textl$,J%+1) Dln%=line%:pass=1: N+19);left$;:right$="": ",";right$ X b: l outside vtextl$,1)="[":inside%=: textl$,"=")=0: $textl$>126 textl$,"$")<>0: ?left$="."+left$: DzH:left$,4)=".P%=":P%=x:org%=P%:E%=P%  :  -----DEF----- 3textl$,4,1)="S":x$=left$,6): TbK:P%=P%+x: Ffrst=left$,""""):frst=0:frst=6:last=(left$):dZB frst=frst+1 @last=left$,"""",frst+1):last=0:last=(left$) last=last-1 ?textl$,4,1)="M":j%=frst last:out((left$,j%,1))):: \textl$,4,1)="N":j%=frst last-1:out((left$,j%,1)))::out((left$,last1))&80): $x$=textl$,left$," ")+1): TbK 8textl$,4,1)="B":byte1=x dHJ:byte1=lb:byte2=hb   :  -----RST-----  -x$=textl$,5):x=(x$)&38:byte1=&C7 x: *: 4 -----PUSH/POP----- >x$=textl$,2) HAx$="IX" x$="IY":index=-&DD*(x$="IX")-&FD*(x$="IY"):x$="HL" R?x$="AF":byte1=-&F5*(textl$,"U")>0)-&F1*(textl$,"O")>0): \N THL:textl$,"POP"):byte1=&C1 16*("&"+x$) byte1=&C5 16*("&"+x$) f p: z -----LD----- textr$=readR *textl$,"IX")+textr$,"IX"):index=&DD *textl$,"IY")+textr$,"IY"):index=&FD 4textl$,"(")+textr$,"(")=0:D`D: no brackets &textl$,"("):TFD: left bracket @textr$="(HL)" x$=textl$,1):d`K:byte1=&46 8*("&"+x$): Lx$=textr$:x$="(BC)" x$="(DE)":byte1=-&A*(x$="(BC)")-&1A*(x$="(DE)"): etextl$,"HL")+textl$,"I"):byte1=&2A:x$=right$,2,(right$)-2): TbK: dHJ:byte2=lb:byte3=hb: itextr$,"I"):x$=textl$,1): d`K:byte1=&46 8*("&"+x$):x$=right$,5,(right$)-5): TbK:byte2=x: Ztextl$,2)=" A":byte1=&3A:x$=textr$,2,(textr$)-2): TbK: dHJ:byte2=lb:byte3=hb: ="A" x$<="L": d`K:byte1=&70 ("&"+x$): Bbyte1=&36: TbK:byte2=x: Lltextr$>"A" textr$<"L":x$=textr$: d`K:byte1=&70 ("&"+x$):x$=left$,8,(left$)-8): TbK:byte2=x: VObyte1=&36:x$=left$,8,(left$)-8): TbK:byte2=x:x$=right$: TbK:byte3=x: `Utextl$,1)="I" textr$="I":byte1=&ED:byte2=-&57*(textr$="I")-&47*(textr$="A"): jUtextl$,1)="R" textr$="R":byte1=&ED:byte2=-&5F*(textr$="I")-&4F*(textr$="A"): tGtextl$,"I"):byte1=&21:x$=textr$: TbK: dHJ:byte2=lb:byte3=hb: ~-textr$="HL" textr$,1)="I":byte1=&F9: ytextl$,(textl$)-1,1)>" ":x$=textl$,2): THL:byte1=&01 16*("&"+x$):x$=right$: TbK: dHJ:byte2=lb:byte3=hb: x$=textl$,1): d`K atextr$>="A" textr$<="L":byte1=&40 8*("&"+x$):x$=textr$: d`K:byte1=byte1 ("&"+x$): 6byte1=&06 8*("&"+x$):x$=right$: TbK:byte2=x: :  ---- EX ---- textr$=readR textr$="IX":index=&DD textr$="IY":index=&FD textl$,"S"):byte1=&E3: &textr$="HL":byte1=&EB byte1=&08  :   ---- DJNZ ---- >byte1=&10:x$=left$,left$," ")+1): TbK: dpJ:byte2=x: : ( ---- IM ---- 2byte1=&ED:x=(textl$,1)) <(byte2=-&46*(x=0)-&56*(x=1)-&5E*(x=2) F P: Z ---- IN ---- dtextr$=readR nZtextr$="(C)" textr$="(BC)":byte1=&ED:x$=textl$,1): d`K:byte2=&40 8*("&"+x$): x;byte1=&DB:x$=right$,2,right$,")")-2): TbK:byte2=x: :  ---- OUT ---- textr$=readR Ztextl$,"(C)") textl$,"(BC)"):byte1=&ED:x$=textr$: d`K:byte2=&41 8*("&"+x$): ;byte1=&D3:x$=textl$,6,textl$,")")-6): TbK:byte2=x: :  ---- CALL ---- x$=textl$,2): tBJ Bx=-1:x$=left$,6): TbK: dHJ:byte1=&CD:byte2=lb:byte3=hb: Obyte1=&C4 (8*x):textr$=readR:x$=right$: TbK: dHJ:byte2=lb:byte3=hb: :  ---- JR ---- x$=textl$,2): tBJ 8x=-1:x$=left$,4): TbK: dpJ:byte1=&18:byte2=x: Ebyte1=&20 (8*x):textr$=readR:x$=right$: TbK: dpJ:byte2=x: : " ---- JP ---- ,textl$,"X"):index=&DD 6textl$,"Y"):index=&FD @textl$,"("):byte1=&E9: Jx$=textl$,2): tBJ TBx=-1:x$=left$,4): TbK: dHJ:byte1=&C3:byte2=lb:byte3=hb: ^Obyte1=&C2 (8*x):textr$=readR:x$=right$: TbK: dHJ:byte2=lb:byte3=hb: h: r ---- RET ---- |Dtextl$="RET":byte1=&C9 x$=textl$,2): tBJ:byte1=&C0 (8*x)  :  ---- ODDS & ENDS ---- x$=textl$:byte1=-&1F*(x$="RRA")-&F*(x$="RRCA")-&37*(x$="SCF")-&3F*(x$="CCF")-&2F*(x$="CPL")-&27*(x$="DAA")-&F3*(x$="DI")-&FB*(x$="EI")-&D9*(x$="EXX")-&76*(x$="HALT")-&17*(x$="RLA")-&7*(x$="RLCA")  : x$=textl$:x=-&A9*(x$="CPD")-&67*(x$="RRD")-&B9*(x$="CPDR")-&A1*(x$="CPI")-&B1*(x$="CPIR")-&AA*(x$="IND")-&BA*(x$="INDR")-&A2*(x$="INI")-&B2*(x$="INIR")-&A8*(x$="LDD")-&B8*(x$="LDDR")-&A0*(x$="LDI")-&B0*(x$="LDIR") ̉byte2=x-&44*(x$="NEG")-&BB*(x$="OTDR")-&B3*(x$="OTIR")-&AB*(x$="OUTD")-&A3*(x$="OUTI")-&4D*(x$="RETI")-&45*(x$="RETN")-&6F*(x$="RLD") byte1=&ED: :  ---- AND/SUB/XOR ---- byte=&A6: TpG: and byte=&96: TpG: sub byte=&AE: TpG: xor .byte=&BE:textl$="CP "+textl$,3):TpG: cp .byte=&B6:textl$="OR "+textl$,3):TpG: or &: 0textl$,"I"):DXG :textl$,"HL"):byte1=byte: D_x$=textl$,1):(x$>="A" x$<="L") textl$,"&")=0: d`K:byte1=(byte &F8) ("&"+x$): N3byte1=byte &40:x$=textl$,5): TbK:byte2=x: X(textl$,"IX"):index=&DD index=&FD b:byte1=byte:x$=left$,9,left$,")")-9): TbK:byte2=x: l: v* ---- SLA/SRA/SRL/RLC/RL/RRC/RR ----- byte=&26: dPG: sla byte=&2E: dPG: sra byte=&3E: dPG: srl byte=&06: dPG: rlc /byte=&16:textl$="RL "+textl$,3): dPG: rl byte=&0E: dPG: rrc /byte=&1E:textl$="RR "+textl$,3): dPG: rr : textl$,"I"): dxG  byte1=&CB textl$,"HL"):byte2=byte: Lx$=textl$,1):x$>="A" x$<="L": d`K:byte2=(byte &F8) ("&"+x$): (textl$,"IX"):index=&DD index=&FD Dbyte1=&CB:x$=left$,9,left$,")")-9): TbK:byte2=x:byte3=byte:  :  ---- INC/DEC ----  textl$,"I",3):DRH *byte=-1*(textl$<"I") 4%textl$,"(H"):byte1=&34 byte: >Ktextl$,2)<"!":x$=textl$,1): d`K:byte1=byte (&04 8*("&"+x$)): HQbyte=-8*(textl$<"I"):x$=textl$,2): THL:byte1=byte (&03 16*("&"+x$)): R(textl$,"IX"):index=&DD index=&FD \ctextl$,"("):byte=-1*(textl$<"I"):byte1=&34 byte:x$=left$,9,left$,")")-9): TbK:byte2=x: f+byte=-8*(textl$<"I"):byte1=&23 byte: p: z ---- LABEL ---- !k%=-1:x$=left$,2):x$>126: "x$,"=")>0:x$=x$,x$,"=")-1) %j%=0 numl:x$=label$(j%):k%=j%  :k%=-1:k%=numl:numl=numl+1 +numl>maxlabs:err("Too many labels"): 3label$(k%)=x$:left$,"=")=0:x=P%:value(k%)=x: /x$=left$,left$,"=")+1): TbK:value(k%)=x  :  ---- SBC/ADC ---- byte=&9E: d|H: sbc byte=&8E: d|H: adc textr$=readR [textl$,"HL"):x$=textr$: THL:byte1=&ED:byte2=(&42 16*("&"+x$))+(8 textl$<"S"): Vtextr$>="A" textr$<="L":byte=byte &F8:x$=textr$: d`K:byte1=byte+("&"+x$): textr$="(HL)":byte1=byte: $textr$,"I"): TxI ./byte1=byte &40:x$=right$: TbK:byte2=x: 8(textr$,"IX"):index=&DD index=&FD B="A" textr$<="L":x$=textr$: d`K:byte1=&80+("&"+x$): textr$="(HL)":byte1=&86: )textr$,"I"): ThJ: adc a,(ix/iy+n) (byte1=&C6:x$=right$: TbK:byte2=x: ('textr$,"Y"):index=&FD index=&DD 2;byte1=&86:x$=right$,5,right$,")")-5): TbK:byte2=x: <: Fout(x):P%=P%+1:pass=1: Pout%:#out%,x Z>16:'6; d"0"+~x,2);" "; n x: . ---- GET CODE FOR CONDITION x$ -> x ---- x=-1 j%=0 7 x$=cond$(j%):x=j%   : # ---- X -> lowbyte,hibyte ---- lb=x 255:hb=x 256  :  ---- CALCULATE JUMP ---- >x>255:x=x-P%-2:x>255:err("Too far for relative jump"): x<0:x=x+256  : "+ ---- x$,number/label -> x,number ---- ,xf=0: PRINT"#"x$"#" 6,x$,1)="<":x$=x$,2): TbK:x=x 255: @,x$,1)=">":x$=x$,2): TbK:x=x 256: J$x$<"!"::x$=x$,2):x$+"#">="!" T#ins=x$,"+"):xx=0:ins=0: tPK ^ xx$=x$,ins+1):x$=x$,ins-1) h1xx$,1)="&":xx=(xx$)-65536*((xx$)<0):tPK r0xx$,1)>="0" xx$,1)<="9":xx=(xx$):tPK |3xx$,1)="%":xx=(xx$):tPK: **** binary **** -err("Illegal index. Must be a number"): ,x$,1)="&":x=xx+(x$)-65536*((x$)<0): +x$,1)>="0" x$,1)<="9":x=xx+(x$): 0x$,1)="%":x=xx+(xx$):: **** binary **** Cx=-1:j%=0 numl:label$(j%)=x$:x=xx+value(j%):j%=numl+1:xf=-1 :xf:pass=1:x=P%: 7xf:err("No such label"):errs%=errs%+(inside%):  : , ----- x$,register -> x$,hex code ----- 4x$=~((x$)-66-8*(x$="A")+2*(x$="H")+5*(x$="L"))  :  x$,reg pair -> x$,hex code x$="BC":x$="0" x$="DE":x$="1" &'x$="HL" x$="IX" x$="IY":x$="2" 0x$="SP":x$="3" : D: N ----- CLASSES ----- X END,.,ADC,ADD,AND,BIT,CALL,CCF,CP,CPD,CPDR,CPI,CPIR,CPL,DAA,DEC,DI,DJNZ,EI,EX,EXX,HALT,IM,IN,INC,IND,INDR,INI,INIR,JP,JR,LD,LDD,LDDR,LDI,LDIR,NEG,NOP,OR,OTDR,OTIR b~ OUT,OUTD,OUTI,POP,PUSH,RES,RET,RETI,RETN,RL,RLA,RLCA,RLC,RLD,RR,RRA,RRC,RRCA,RRD,RST,SBC,SCF,SET,SLA,SRA,SRL,SUB,XOR,DEF l% NZ," Z",NC," C",PO,PE," P"," M" v:  ---- LABELS USED ---- '"Labels defined:" a=0 numl-1 Jlabel$(a)+6," ."),12-label$(a)),12)"&""0000"+~value(a),4)" "; ::  : Rݤup(A$):A%:A%=1A$:A$,A%,1)>"`":A$=A$,A%-1)+(A$,A%,1)&DF)+A$,A%+1) :=A$ : )ݤreadL:left$=exp(read):=up(left$) %ݤreadR:right$=read:=up(right$) ݤread: A$,B$,C$:C$=",:" 5:B$=bget:A$=A$+B$:B$="""" ";\",A$,1)):C$=0 &B$=13 C$,B$) B$="" B$=":" 3B$=13:line%=256*bget+bget:B$=bget:B$=13 =A$,A$-B$) *ݤbget:#in%:="" 4 =#in% >: Hݤexp(A$):A$="":="" R6 A,B$,C$::A=A+1:A$,A,1)>"~" A>A$:A>A$:=A$ \A=1 A$:B$=A$,A,1) fB$=128:B$="AND" pB$=132:B$="OR" zB$=151:B$="ASC" B$=214:B$="CALL" B$=221:B$="DEF" B$=224:B$="END" C$=C$+B$::=C$