NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR $2000
				.TF	BIN/DEV/ASM
*---------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
*---------------------------------------
ZPPtr1			.EQ ZPBIN
ZPPtr2			.EQ ZPBIN+2

ZPLineBuf		.EQ ZPBIN+4
ZPLinePtr		.EQ ZPBIN+6
ZPNameBuf		.EQ ZPBIN+8
ZPGlobalBuf		.EQ ZPBIN+10
ZPLookupBuf		.EQ ZPBIN+12

ZPMacroBuf		.EQ ZPBIN+14
ZPCtxBuf		.EQ ZPBIN+16

ZPAMPtr			.EQ ZPBIN+18
ZPRPtr			.EQ ZPBIN+20
ZPOpsPtr		.EQ ZPBIN+22
ZPOpDefPtr		.EQ ZPBIN+24

ZPTmpBuf		.EQ ZPBIN+16
*---------------------------------------
* Symbols
*---------------------------------------
SYM.F.PENDING		.EQ %10000000
SYM.F.RW			.EQ %01000000
*---------------------------------------
SYMG.TYPE		.EQ 0					1,2,3,4
SYMG.TYPE.S			.EQ $ff				String
SYMG.F			.EQ 1
SYMG.V			.EQ 2
*
SYMG.SIZE		.EQ 6 					DWORD
*---------------------------------------
SYML.ID			.EQ 0					1..255
SYML.F			.EQ 1
SYML.V			.EQ 2					DWORD
*
SYML.SIZE		.EQ 6
*---------------------------------------
MCTX.LEN		.EQ 0
MCTX.PTR		.EQ 1
MCTX.ID			.EQ 2
MCTX.ARGS		.EQ 4
*---------------------------------------
ASM.T.AM		.EQ 0
ASM.T.R			.EQ 2
ASM.T.O			.EQ 4
*---------------------------------------
DO.MAXDEPTH		.EQ 8
IN.MAXDEPTH		.EQ 7
MA.MAXDEPTH		.EQ 8
*---------------------------------------
ERR.INV.ARGS		.EQ $80
ERR.INV.T.FILE		.EQ $81
ERR.SRC.INV.TYPE	.EQ $90
ERR.SRC.TOO.MANY.IN	.EQ $91
ERR.SRC.UNEXP.EOF	.EQ $92
ERR.SYNTAX.ERROR	.EQ $A0
ERR.SYM.TOO.LONG	.EQ $A1
ERR.VAL.TOO.BIG		.EQ $A2
ERR.LINE.TOO.LONG	.EQ $A3
ERR.INV.LABEL		.EQ $A4
ERR.INV.DIR			.EQ $A5
ERR.INV.OPCODE		.EQ $A6
ERR.INV.AM.SYN		.EQ $A7
ERR.INV.AM			.EQ $A8
ERR.INV.AM.4.OC		.EQ $A9
ERR.RANGE			.EQ $AA
ERR.UNDEF.SYMBOL	.EQ $AB
ERR.SYMBOL.REDEF	.EQ $AC
ERR.TOO.MANY.DO		.EQ $AD
ERR.ELSE.WITHOUT.DO	.EQ $AE
ERR.TOO.MANY.LOCAL	.EQ $AF
ERR.MISSING.EXP		.EQ $B0
ERR.EXP.SYN.ERROR	.EQ $B1
ERR.MACRO.INV.DEF	.EQ $E0
ERR.MACRO.TOO.BIG	.EQ $E1
ERR.MACRO.INV		.EQ $E2
ERR.MACRO.TOO.MANY	.EQ $E3
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61			6502,Level 1 (65c02)
				.DA #1				BIN Layout Version 1
				.DA #S.PS.F.EVENT		S.PS.F
				.DA #0
				.DA CS.END-CS.START		CS
				.DA DS.END-DS.START		DS
				.DA #0					SS
				.DA #32					ZP
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.MSG.HELP		.DA MSG.HELP
L.MSG.OUT0		.DA MSG.OUT0
				.DA MSG.OUT1
				.DA MSG.OUT2
				.DA MSG.OUT3
L.MSG.EQU0		.DA MSG.EQU0
				.DA MSG.EQU1
				.DA MSG.EQU2
				.DA MSG.EQU3
				.DA MSG.EQU4
L.MSG.LSYMBOL	.DA MSG.LSYMBOL
L.MSG.SRCLINE	.DA MSG.SRCLINE
L.MSG.ERROR		.DA MSG.ERROR
L.MSG.SYMBOLS	.DA MSG.SYMBOLS
L.MSG.PSTRCRLF	.DA MSG.PSTRCRLF
L.MSG.PSTR		.DA MSG.PSTR
L.MSG.CRLF		.DA MSG.CRLF
L.MSG.SUMMARY	.DA MSG.SUMMARY
L.MSG.PASS		.DA MSG.PASS
L.MSG.SRC.FILE	.DA MSG.SRC.FILE
L.MSG.OBJ.FILE	.DA MSG.OBJ.FILE
L.MSG.T.FILE	.DA MSG.T.FILE
L.SRC.AM.StrBuf	.DA SRC.AM.StrBuf
L.ASM.6502		.DA ASM.6502
L.ASM.T.FILENAME	.DA ASM.T.FILENAME
L.FIO.Stat		.DA FIO.Stat
L.T.DIRECTIVES	.DA T.DIRECTIVES
J.DIRECTIVES	.DA DIR.AC
				.DA DIR.AS
				.DA DIR.AT
				.DA DIR.AZ
				.DA DIR.BS
				.DA DIR.DA
				.DA DIR.DO
				.DA DIR.DU
				.DA DIR.DU
				.DA DIR.ED
				.DA DIR.EL
				.DA DIR.EM
				.DA DIR.EN
				.DA DIR.EP
				.DA DIR.EQ
				.DA DIR.FI
				.DA DIR.HS
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.IN
				.DA DIR.LI
				.DA DIR.LI
				.DA DIR.MA
				.DA DIR.OP
				.DA DIR.OR
				.DA DIR.PG
				.DA DIR.PH
				.DA DIR.SE
				.DA DIR.TA
				.DA DIR.TF
				.DA DIR.TI
				.DA DIR.US
L.T.LI			.DA T.LI
J.LI			.DA DIR.LI.ON
				.DA DIR.LI.OFF
				.DA DIR.LI.CON
				.DA DIR.LI.COFF
				.DA DIR.LI.MON
				.DA DIR.LI.MOFF
				.DA DIR.LI.XON
				.DA DIR.LI.XOFF
J.EXP.MOD		.DA EXP.MOD.8.1		#/^<>
				.DA EXP.MOD.8.2
				.DA EXP.MOD.8.3
				.DA EXP.MOD.24
				.DA EXP.MOD.32
J.EXP.OP		.DA EXP.OP.EOR 		^!|&<=>+-*/
				.DA EXP.OP.ORA
				.DA EXP.OP.ORA
				.DA EXP.OP.AND
				.DA EXP.OP.LOW
				.DA EXP.OP.EQU
				.DA EXP.OP.GRT
				.DA EXP.OP.ADD
				.DA EXP.OP.SUB
				.DA EXP.OP.MUL
				.DA EXP.OP.DIV	
				.DA 0
*---------------------------------------
CS.INIT			ldy #S.PS.ARGC
				lda (pPs),y
				beq .99
				
				lda #1
				>SYSCALL ArgV
				>SYSCALL RealPath
				
				txa
				ldy #SRC.hFILENAME
				sta (pData),y
				
				jsr FIO.Init
				bcs .9

				jsr SYM.Init
				bcs .9

				jsr MAC.Init
				bcs .9
				
				jsr OUT.Init

				>LDYAI 256
				>SYSCALL getmem
				bcs .9
				>STYA ZPLineBuf
				txa
				>STA.G SRC.hLineBuf

				>LDYAI 256
				>SYSCALL getmem
				bcs .9
				>STYA ZPTmpBuf
				txa
				>STA.G SRC.hTmpBuf
				
				clc
				rts
				
.99				>PUSHBI 0
				>LDYA L.MSG.HELP
				>SYSCALL printf
				lda #ERR.INV.ARGS
				sec
.9					rts
*--------------------------------------
CS.RUN			>SYSCALL GetChar
				bcs .13					no char
			
				cmp #$03				Ctrl-C
				beq .99					Abort....beq=CS
					
				cmp #$13				Ctrl-S
				bne .11

				>LDA.G bPause
				eor	#$ff
				sta (pData),y
			
				bpl .12
				clc
				rts
				
.13				>LDA.G bPause
				bpl .11
				clc
				rts
				
.11				>STZ.G bPause

.12				>LDA.G SRC.COUNT		root file is already opened?
				bne .10 
				
				>LDA.G ASM.PASS
				inc
				>PUSHA
				>PUSHBI 1
				>LDYA L.MSG.PASS
				jsr OUT.Print

				ldy #SRC.hFILENAME
				lda (pData),y
				
				>SYSCALL GetMemPtr
				
				jsr FIO.OpenFile
				bcs .99
				
				jsr DIR.Reset
				jsr SYM.Reset
				jsr MAC.Reset
				
.10				jsr FIO.ReadLine
				bcc .2
				cmp #$4C				End Of File?
				bne .9
				
				jsr FIO.FileClose
				
				ldy #SRC.COUNT		end of root file ?
				lda (pData),y
				bne .8				no continue back to previous file
				
				jsr SYM.FlushGlobal	Store last Symbol, if any....
				bcs .9
				
				>LDA.G ASM.PASS		End of pass #2 ??
				bne .1
				inc
				sta (pData),y
				clc
.99				rts
				
.1				jsr SYM.Dump
				>PUSHW ZPLinePtr
				>PUSHBI 2
				>LDYA L.MSG.SUMMARY
				jsr OUT.Print
				
				lda #0				End of assembly, exit with no error
				sec		
				rts
				
.2				jsr SRC.ParseLine
				bcs .9
				
				jsr OUT.PrintLine
				
.8				clc
				rts

.9				pha
				jsr OUT.PrintLineErr
				jsr SYM.Dump
				pla
				sec
				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			jsr FIO.FileClose
				bne CS.QUIT 

				jsr MAC.Quit
				jsr SYM.Quit
				
				>LDA.G ASM.T.hMem
				beq .1
				
				>SYSCALL FreeMem
				
.1				>LDA.G SRC.hFILENAME
				beq .2
				
				>SYSCALL FreeMem
				
.2				>LDA.G SRC.hLineBuf
				beq .3
				
				>SYSCALL FreeMem
				
.3				>LDA.G SRC.hTmpBuf
				beq .8
				
				>SYSCALL FreeMem
			
.8				clc
				rts
*---------------------------------------
				.INB USR/SRC/BIN/ASM.S.DIR
				.INB USR/SRC/BIN/ASM.S.EXP
				.INB USR/SRC/BIN/ASM.S.FIO
				.INB USR/SRC/BIN/ASM.S.MAC
				.INB USR/SRC/BIN/ASM.S.OUT
				.INB USR/SRC/BIN/ASM.S.SRC
				.INB USR/SRC/BIN/ASM.S.SYM
*---------------------------------------
CS.END
T.DIRECTIVES	>PSTR "AC"
				>PSTR "AS"
				>PSTR "AT"
				>PSTR "AZ"
				>PSTR "BS"
				>PSTR "DA"
				>PSTR "DO"
				>PSTR "DU"
				>PSTR "DUMMY"
				>PSTR "ED"
				>PSTR "ELSE"
				>PSTR "EM"
				>PSTR "EN"
				>PSTR "EP"
				>PSTR "EQ"
				>PSTR "FIN"
				>PSTR "HS"
				>PSTR "IN"
				>PSTR "INB"
				>PSTR "INB1"
				>PSTR "INB2"
				>PSTR "INB3"
				>PSTR "INB4"
				>PSTR "INB5"
				>PSTR "INB6"
				>PSTR "INB7"
				>PSTR "INB8"
				>PSTR "INB9"
				>PSTR "LI"
				>PSTR "LIST"
				>PSTR "MA"
				>PSTR "OP"
				>PSTR "OR"
				>PSTR "PG"
				>PSTR "PH"
				>PSTR "SE"
				>PSTR "TA"
				>PSTR "TF"
				>PSTR "TI"
				>PSTR "US"
				.HS 00
*---------------------------------------
T.LI			>PSTR "ON"
				>PSTR "OFF"
				>PSTR "CON"
				>PSTR "COFF"
				>PSTR "MON"
				>PSTR "MOFF"
				>PSTR "XON"
				>PSTR "XOFF"
				.HS 00
*---------------------------------------
ASM..T.			.AZ ".T."
ASM.6502		.AZ "6502"
MSG.HELP		.AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\r\n"
MSG.PASS		.AZ "*** Pass:#%d\r\n"
MSG.SRC.FILE	.AZ "*** Reading SRC File:%s\r\n"
MSG.OBJ.FILE	.AZ "*** Writing OBJ File:%s, Type=%02x\r\n"
MSG.T.FILE		.AZ "*** Loading CPU File:%s\r\n"
MSG.OUT0		.AZ "%H-        "
MSG.OUT1		.AZ "%H-%h      "
MSG.OUT2		.AZ "%H-%h %h   "
MSG.OUT3		.AZ "%H-%h %h %h"
MSG.EQU0		.AZ "   [       ?]"
MSG.EQU1		.AZ "   [      %h]"
MSG.EQU2		.AZ "   [    %h%h]"
MSG.EQU3		.AZ "   [  %h%h%h]"
MSG.EQU4		.AZ "   [%h%h%h%h]"
MSG.LSYMBOL		.AZ ", .%d=%h%h%h%h"
MSG.SRCLINE		.AZ " %05D %s\r\n"
MSG.ERROR		.AZ "*** Fatal Error $%h "
MSG.SYMBOLS		.AZ "Symbol Table:"
MSG.PSTRCRLF	.AZ " %S\r\n"
MSG.PSTR		.AZ " %S"
MSG.CRLF		.AZ " \r\n"
MSG.SUMMARY		.AZ "\r\nSymbol Table Size : %5D Bytes.\r\nEnd Of Assembly.\r\n"
SRC.MOD.RESERVED	>PSTR "#/^<>"
SRC.EXP.RESERVED	>PSTR "^!|&<=>+-*/"
SRC.AM.RESERVED		>PSTR "[](),"
*---------------------------------------
ASM.T.FILENAME	.BS 65

FIO.Stat		.BS S.STAT

SRC.ACC.SIZE	.BS 1
SRC.ACC			.BS 4

SRC.ARG.SIZE	.BS 1
SRC.ARG			.BS 4

SRC.ACCTMP		.BS 4
SRC.AM.StrBuf	.BS 32
*--------------------------------------
				.DUMMY
				.OR 0
DS.START		
bPause			.BS 1

SRC.hFILENAME	.BS 1
SRC.hLineBuf	.BS 1
SRC.hTmpBuf		.BS 1

SRC.COUNT		.BS 1
SRC.hFILES		.BS IN.MAXDEPTH
SRC.hFILETYPES	.BS IN.MAXDEPTH

SRC.LINENUM		.BS 2
SRC.AMID		.BS 1

DST.hFILENAME	.BS 1
DST.hREFNUM		.BS 1
DST.hBUFFER		.BS 1
DST.hFILETYPE	.BS 1

DIR.Word		.BS 2
DIR.Byte		.BS 1

EXP.Modifier	.BS 1
EXP.Prefix		.BS 1
EXP.Operator	.BS	1

ASM.T.hMem		.BS 1

ASM.PASS		.BS 1

ASM.DO.ON		.BS 1
ASM.DO.StackPtr	.BS 1
ASM.DO.Stack	.BS DO.MAXDEPTH

ASM.DU.ON		.BS 1
ASM.PH.ON		.BS 1

ASM.LI.ON		.BS 1
ASM.LI.CON		.BS 1
ASM.LI.MON		.BS 1
ASM.LI.XON		.BS 1

ASM.MA.ON		.BS 1
ASM.MA.StackPtr	.BS 1
ASM.MA.Stack	.BS MA.MAXDEPTH

ASM.PC			.BS 4
ASM.PC.PH		.BS 4
ASM.PC.DU		.BS 4

SYM.hGlobalList	.BS 1
SYM.hNameBuf	.BS 1
SYM.hGlobalBuf	.BS 1
SYM.GlobalID	.BS 2

SYM.hLookupBuf	.BS 1

SYM.LocalID		.BS 2

MAC.hMacroList	.BS 1
MAC.hMacroBuf	.BS 1
MAC.hCtxList	.BS 1
MAC.hCtxBuf		.BS 1
MAC.CtxID		.BS 2

OUT.PC			.BS 4
OUT.Buf			.BS 4
OUT.bEquate		.BS 1
OUT.LineCnt		.BS 1

DS.END			.ED
*---------------------------------------
				.DO DS.END-DS.START>$FF
				ERROR:DS too big
				.FIN
*---------------------------------------
MAN
SAVE USR/SRC/BIN/ASM.S
ASM
