mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 01:44:21 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
$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;
|
||||
|
||||
Reference in New Issue
Block a user