/* SNMA to CED interface by MM $VER: 1.4

Usage:
- with OBJECT argument - assemble as o. linkable file
- with DEBUG argument - assemble as executable with symbol data hunk
- without argument (default) - assemble as normal executable
*/

VARSAVE = "ENV:SNMA_Save.dir" /* directory of last assembled file */
RECENT = "Actual:assem/SNMA_Recent.file" /* path of recently assembled source */
SNMAL = "Utilities:Dock/Debug/SNMA" /* location of SNMA */

OPTIONS RESULTS
ADR = address()

arg MODE

retc=20
temp=0

SIGNAL ON SYNTAX
SIGNAL ON BREAK_C
SIGNAL ON HALT

DM 'Welcome to SNMA<->CED by MM'
LOCKGUI
STATUS RESTNAME
FN=RESULT
STATUS NUMCHANGES
CI=RESULT
IF FN = "" THEN SIGNAL .load
STATUS FILENAME
SN = RESULT

.main:
PUBS = "" /* set default pubscreen to empty string */
STATUS PUBSCREENNAME
IF RESULT = 0 THEN SIGNAL .skip
PUBS=RESULT

.skip:
TAGZ='rt_pubscrname='PUBS 'rt_reqpos=reqpos_centerscr'

IF SHOW('L',"rexxreqtools.library") THEN SIGNAL .lib_ok
call addlib('rexxreqtools.library',0,-30,0)

.lib_ok:
IF EXISTS(VARSAVE) = ~0 THEN
	DO
		CALL OPEN(.dir, VARSAVE, 'R')
		SAVEDIR = readln(.dir)
		CALL CLOSE(.dir)
	END
ELSE SAVEDIR = "T:" /* default directory for assembled files */

IF CI > 0 THEN SIGNAL .save

SUFIX=LASTPOS('.',FN)
IF SUFIX = 0 THEN SIGNAL .req
EXE=DELSTR(FN,SUFIX)

.req:
IF MODE = "OBJECT" THEN EXE=INSERT(EXE,'.o')

.req2:
FN2=rtfilerequest(SAVEDIR , EXE , "Save executable:", , TAGZ,)
IF FN2 = "" THEN
	DO
	'OKAY1 Assembling cancelled!' ; SIGNAL .exit
	END

PATH = LASTPOS('/',FN2)
IF PATH = 0 THEN PATH = INDEX(FN2,':')
IF PATH = 0 THEN SIGNAL .exit
PATH = PATH+1
PATH = DELSTR(FN2,PATH)

CALL OPEN(.dir, VARSAVE, 'W')
CALL writeln(.dir, PATH)
CALL CLOSE(.dir)

ADDRESS COMMAND 'Run "'SNMAL'" AREXX PORTNAME SNMA<->CED'
ADDRESS COMMAND 'SYS:Rexxc/WaitForPort SNMA<->CED'
ADDRESS 'SNMA<->CED'

'SET OF=ON' /* enable msg output */

/* if DEBUG arg present, assemble with debug info */

IF MODE = "DEBUG" THEN 'SET S=ON'

/* if OBJECT arg present, assemble as object linkable file */

IF MODE = "OBJECT" THEN 'SET EXE=OFF S=ON'
ELSE 'SET EXE=ON'

'ASM "'SN'" O "'FN2'"'

INFO A
IF A.ERRORS > 0 THEN
	DO
	GETERR STEM E
	ADDRESS VALUE ADR
	IF E.FILENAME = 'user macro' THEN
		DO
		'OKAY1 Error in macro file 'E.FILENAME'' ; SIGNAL .out
		END
	JUMPTO E.LINENUM E.COLUMN
	'DM 'E.ERRNUM'/'A.ERRORS': "'E.ERRTXT'"'
	END

.out:
ADDRESS 'SNMA<->CED' QUIT
/*IF temp ~= 0 THEN
	ADDRESS COMMAND 'DELETE "'temp'" QUIET'*/
retc = 0 ; SIGNAL .exit

.load:
IF CI > 0 THEN SIGNAL .save
	IF EXISTS(RECENT) ~= 0 THEN
		DO
		CALL OPEN(.recent, RECENT, 'R')
		SN = readln(.recent)
		CALL CLOSE(.recent)
		IF EXISTS(SN) = ~0 THEN SIGNAL .load2
			'OKAY1 ERROR!: Cannot locate source file "'SN'"'; SIGNAL .exit

			.load2:
			OPEN SN ; retc = 0 ; SIGNAL .exit
		END
	ELSE 'OKAY1 ERROR!: Recent file not found!' ; SIGNAL .exit


.save:
'OKAY2 Source file not saved! Save it?'
IF RESULT = 0 THEN SIGNAL .stemp
	SAVE
	IF RESULT = 0 THEN SIGNAL .save
		STATUS FILENAME
		SN = RESULT
		IF EXISTS(RECENT) = 0 THEN SIGNAL .write
		CALL OPEN(.recent, RECENT, 'R')
		RF = readln(.recent)
		CALL CLOSE(.recent)
		IF SN=RF THEN SIGNAL .skip2
.write:		CALL OPEN(.recent, RECENT, 'W')
		CALL writeln(.recent, SN)
		CALL CLOSE(.recent)
.skip2:
		CI = 0
		STATUS RESTNAME
		FN = RESULT
		SIGNAL .main

.stemp:
temp=max(lastpos(':',SN),lastpos('/',SN))+1
temp=substr(SN,temp)
temp=insert('T:',temp)
SAVE AS temp 1
IF RESULT = 0 THEN SIGNAL .exit
	CI = 0
	SN=temp
	SIGNAL .main

SYNTAX:
.exit:
halt:
break_c:
ADDRESS VALUE ADR
'UNLOCKGUI'
TAB SIZE 7
exit retc
