Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

186 lines
4.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

$title ('ASM86 MAIN PROGRAM')
mainp:
do;
/*
This is the main program of the CP/M 8086
assembler. This module activates the i/o
modules and goes through the source text
in 3 passes. The module then for each source
line calls the external subroutine DECODELINE
to perform assembly of each line;
*/
/*
modified 3/25/81 R. Silberstein
modified 3/28/81 R. Silberstein
modified 3/30/81 R. Silberstein
modified 4/7/81 R. Silberstein
modified 4/20/81 R. Silberstein
modified 6/16/81 R. Silberstein
modified 7/24/81 R. Silberstein
modified 7/27/81 R. Silberstein
modified 8/21/81 R. Silberstein
*/
$include (:f1:macro.lit)
$include (:f1:struc.lit)
$include (:f1:equals.lit)
$include (:f1:dev.lit)
$include (:f1:ermod.lit)
$include (:f1:subr2.ext)
$include (:f1:io.ext)
$include (:f1:files.ext)
$include (:f1:outp.ext)
$include (:f1:scan.ext)
$include (:f1:print.ext)
$include (:f1:symb.ext)
$include (:f1:ermod.ext)
$include (:f1:mglob.ext)
$include (:f1:text.ext)
$include (:f1:dline.ext)
DECLARE ASM86 LABEL PUBLIC;
closefiles: procedure;
call close$source;
call close$print;
call close$symbol;
call close$hex;
end closefiles;
open$output$files: procedure;
CALL OPENPRINT;
CALL OPENHEX;
CALL OPENSYMBOL;
end open$output$files;
userbreak: proc byte; /* test if keyboard break from user */
if not constat then return false; /* test console status */
if readconsole then; /* skip first break key */
do forever;
call outtext(.usbreaktext); /* USER BREAK. OK (Y/N)? */
i=upper(readconsole);
call crlf;
if i = yes then return true;
if i = no then return false;
end$forever;
end userbreak;
varinit: proc;
CALL FILL (0, .PRINT$ON-.CIP, .CIP);
errors=0;
printswitchoff,includeon=false;
IFLEVEL = 0;
IFLIST = TRUE;
csegtype=rcs;
end varinit;
pass0init: proc; /* initialize pass 0 */
simform=false;
maxcol=119;
if printdevice=console then maxcol=79;
call symbinit; /* initialize symbol table */
print$on=false;
call varinit;
end pass0init;
pass1init: proc; /* initialize for pass 1 */
call varinit;
end pass1init;
pass2init: proc; /* initialize for pass 2 (last pass) */
print$on=true;
call varinit;
call emitinit;
end pass2init;
pass0terminate: proc; /* terminate pass 0 */
call outtext(.pass0text); /* End of pass 0 */
end pass0terminate;
pass1terminate: proc; /* terminate pass 1 */
print$on=false; /* dummy */
call outtext(.pass1text); /* End of pass 1 */
end pass1terminate;
pass2terminate: proc; /* terminate pass 2 (last pass) */
DECLARE USEFACT BYTE;
USEFACT = (FREEPT-.MEMORY) / ((ENDOFSYMBTAB-.MEMORY) / 100 + 1);
errorprinted=false;
call emitterminate; /* terminate hex output module */
call symbterminate; /* print symbols */
if printdevice <> console then call printterminate (USEFACT);
CALL CLOSEFILES;
call outtext(.endtext); /* END OF ASSEMBLY... */
call decout(errors,.help(0)); /* print no of errors */
call outtext(.help(2));
CALL OUTTEXT (.USEFACTOR);
CALL DECOUT (USEFACT, .HELP(0));
CALL OUTTEXT (.HELP(3));
CALL WRITECONSOLE (25H); /* % */
CALL CRLF;
end pass2terminate;
include$close: proc (flag);
declare flag byte;
if eofset and include$on then$do
call close$include;
include$on,eofset=false;
if flag then$do
call scan; /* skip EOF */
call scan; /* prepare for next source line */
end$if;
end$if;
end include$close;
ASM86:
call globalinit; /* initialize some globals */
call outtext(.asm86text); /* CP/M 8086 ASSEMBLER.... */
if not filesetup then$do
call outtext(.parerrtext); /* PARAMETER ERROR */
CALL SYSTEMRESET;
end$if;
CALL OPENSOURCE;
CALL OPENOUTPUTFILES;
pass=0ffh;
do while (pass:=pass+1) < 3;
do case pass;
call pass0init; /* pass 0 */
call pass1init; /* pass 1 */
call pass2init; /* pass 2 */
end$case;
call scaninit;
call scan;
do while not eofset;
if userbreak then$do
eofset=true;
pass=3;
else$do
errorprinted=false;
call decodeline;
call includeclose(false); /* close include file if necessary */
call scan;
call includeclose(true); /* close include file if necessary */
end$if;
end$while;
do case pass;
call pass0terminate; /* pass 0 */
call pass1terminate; /* pass 1 */
call pass2terminate; /* pass 2 */
do; end; /* do nothing if userbreak */
end$case;
end$while;
call system$reset;
end$module mainp;