mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 17:04:19 +00:00
186 lines
4.8 KiB
Plaintext
186 lines
4.8 KiB
Plaintext
$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;
|
||
|