SECTION "CG8"
GET "CGHDR"
LET OUTPUTSECTION() BE
$(1 LET RL = REFLIST
LET R = 0
UNTIL RL=0 DO // FILL IN LABEL REFS
$( LET L = H2!RL
AND A = H3!RL
LET LABVAL = 0
TEST L>0
THEN R := R+1
ELSE L := -L
LABVAL := LABV!L
IF LABVAL=-1 DO
CGERROR("LABEL L%N UNSET", FALSE, L)
ADDABO(STV, A, LABVAL)
RL := !RL $)
SELECTOUTPUT(CODESTREAM)
$( OBJWORD(T.HUNK)
OBJWORD((STVP+1)>>1)
OBJWORD(DSIZE)
//*<3032
WRITEWORDS(STV, (STVP+1)>>1)
/*3032>*/
/*<8086
MWRITEWORDS(STV, (STVP+1)>>1)
/*8086>*/
IF R>0 DO // OUTPUT RELOCB BLOCK
$( OBJWORD(T.RELOCB)
OBJWORD(R)
RL := REFLIST
UNTIL RL=0 DO
$( IF H2!RL>0 DO OBJWORD(H3!RL)
RL := !RL $)
$)
OBJWORD(T.END)
$)
SELECTOUTPUT(VERSTREAM)
$)1
/*<8086
AND MWRITEWORDS(V, N) BE
$(
FOR I = 0 TO N-1 DO
V!I := ((V!I)<<8) | ((V!I)>>8)
WRITEWORDS(V, N)
$)
/*8086>*/
//*<3032
AND ASKII(C) = C!TABLE
/*3032>*/
/*<8086 /* EBCDIC 00-07 */ #000, #001, #002, #003, 0, #011, 0, #177,
/*<8086 /* EBCDIC 08-0F */ 0, 0, 0, #013, #014, #015, #016, #017,
/*<8086 /* EBCDIC 10-17 */ #020, #021, #022, #023, 0, 0, #010, 0,
/*<8086 /* EBCDIC 18-1F */ #030, #031, 0, 0, #034, #035, #036, #037,
/*<8086 /* EBCDIC 20-27 */ 0, 0, 0, 0, 0, #012, #027, #033,
/*<8086 /* EBCDIC 28-2F */ 0, 0, 0, 0, 0, #005, #006, #007,
/*<8086 /* EBCDIC 30-37 */ 0, 0, #026, 0, 0, 0, 0, #004,
/*<8086 /* EBCDIC 38-3F */ 0, 0, 0, 0, #024, #025, 0, #032,
/*<8086 /* EBCDIC 40-47 */ #040, 0, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC 48-4F */ 0, 0, 0, #056, #074, #050, #053, #174,
/*<8086 /* EBCDIC 50-57 */ #046, 0, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC 58-5F */ 0, 0, #041, #044, #052, #051, #073, #176,
/*<8086 /* EBCDIC 60-67 */ #055, #057, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC 68-6F */ 0, 0, 0, #054, #045, #137, #076, #077,
/*<8086 /* EBCDIC 70-77 */ 0, #136, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC 78-7F */ 0, #140, #072, #043, #100, #047, #075, #042,
/*<8086 /* EBCDIC 80-87 */ 0, #141, #142, #143, #144, #145, #146, #147,
/*<8086 /* EBCDIC 88-8F */ #150, #151, 0, #173, 0, 0, 0, 0,
/*<8086 /* EBCDIC 90-97 */ 0, #152, #153, #154, #155, #156, #157, #160,
/*<8086 /* EBCDIC 98-9F */ #161, #162, 0, #175, 0, 0, 0, 0,
/*<8086 /* EBCDIC A0-A7 */ 0, 0, #163, #164, #165, #166, #167, #170,
/*<8086 /* EBCDIC A8-AF */ #171, #172, 0, 0, 0, #133, 0, 0,
/*<8086 /* EBCDIC B0-B7 */ 0, 0, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC B8-BF */ 0, 0, 0, 0, 0, #135, 0, 0,
/*<8086 /* EBCDIC C0-C7 */ 0, #101, #102, #103, #104, #105, #106, #107,
/*<8086 /* EBCDIC C8-CF */ #110, #111, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC D0-D7 */ 0, #112, #113, #114, #115, #116, #117, #120,
/*<8086 /* EBCDIC D8-DF */ #121, #122, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC E0-E7 */ #134, 0, #123, #124, #125, #126, #127, #130,
/*<8086 /* EBCDIC E8-EF */ #131, #132, 0, 0, 0, 0, 0, 0,
/*<8086 /* EBCDIC F0-F7 */ #060, #061, #062, #063, #064, #065, #066, #067,
/*<8086 /* EBCDIC F8-FF */ #070, #071, 0, 0, 0, 0, 0, #134
AND ISEVEN() = (STVP&1)=0
AND GETVBYTE(V, P) = VALOF
$( LET OT = P/2
IF (P&1)=0 RESULTIS (V!OT𫓸)>>8
RESULTIS V!OT & 255
$)
AND PUTVBYTE(V, P, W) BE
$( LET OT=P/2
TEST (P&1)=0 DO V!OT := (V!OT&255) + ((W&255)<<8)
OR V!OT := (V!OT𫓸) + (W&255)
$)
//*<3032
AND OBJWORD(W) BE
$( LET X = (W>>8) | ((W&255)<<8)
WRITEWORDS(@X, 1)
$)
/*3032>*/
/*<8086
AND OBJWORD(W) BE WRITEWORDS(@W, 1)
/*8086>*/
//*<3032
AND WRITEWORDS(V, N) BE
FOR I = 0 TO N-1 DO
$( IF WRITEWCOUNT >= 16 DO
$( NEWLINE()
WRITEWCOUNT := 0
$)
WRITEHEX(V!I, 4)
WRITEWCOUNT := WRITEWCOUNT + 1
$)
AND DBOUTPUT() BE
$(1 LET NL = "*N "
WRITEF("OP=%N PNDOP=%N SSP=%N LOC=%X4*NSTACK ",
OP,PENDINGOP,SSP,STVP)
FOR P=ARG1 TO TEMPV BY -3 DO
$( IF (ARG1-P) REM 30 = 27 DO WRITES(NL)
WRKN(H1!P,H2!P) $)
WRITES("*NBREFS ")
FOR P=BREFV TO BREFP-2 BY 2 DO
$( IF P-BREFV REM 10 = 8 DO WRITES(NL)
WRITEF("L%N %X4 ",P!0,P!1) $)
WRITES("*NREGS ")
FOR R=R0 TO R4 DO UNLESS REG.K!R=K.NONE DO
$( WRITEF("R%N=",R)
WRKN(REG.K!R,REG.N!R) $)
NEWLINE()
$)1
AND WRKN(K,N) BE
$(1 LET S = VALOF
SWITCHON K INTO
$( DEFAULT: RESULTIS "?"
CASE K.NUMB: RESULTIS "N"
CASE K.LOC: RESULTIS "P"
CASE K.GLOB: RESULTIS "G"
CASE K.LAB: RESULTIS "L"
CASE K.MLOC: RESULTIS "ML"
CASE K.MGLOB: RESULTIS "MG"
CASE K.MLAB: RESULTIS "ML"
CASE K.LVLOC: RESULTIS "@P"
CASE K.LVGLOB: RESULTIS "@G"
CASE K.LVLAB: RESULTIS "@L"
CASE K.REG: RESULTIS "R"
CASE K.XBX: RESULTIS "XBX "
CASE K.XSI: RESULTIS "XSI "
$)
WRITEF("%S%N ",S,N)
$)1
// LIST INSTRUCTIONS
AND LISTGEN(F, K1, N1, K2, N2) BE IF CGLISTING DO
$( LISTCHAN := TRUE
WRITEF("*N%X4 %S", STVP, F)
FOR I = 0 TO 6-GETBYTE(F, 0) DO WRCH('*S')
UNLESS K1=0 DO
$( WRITEOP(K1, N1)
UNLESS K2=0 DO
$( WRCH(',')
WRITEOP(K2, N2)
$)
$)
$)
AND WRITEOP(M, V) BE
SWITCHON M INTO
$( CASE M.REG:
WRITES(REGSTRING(V))
ENDCASE
CASE M.GLOB: M := TRANR(R.DI); GOTO PO
CASE M.LOC: M := TRANR(R.BP); GOTO PO
CASE M.BX: M := TRANR(R.BX); GOTO PO
CASE M.SI: M := TRANR(R.SI)
PO: WRITEF("%N(", V)
WRITEOP(M.REG, M)
WRCH(')')
ENDCASE
CASE M.IMM:
WRITEF("!#X%X4", V)
ENDCASE
CASE M.LAB:
WRITEF("L%N", V)
ENDCASE
DEFAULT:
CGERROR("BAD TYPE IN WRITEOP %N", FALSE, M)
$)
AND LISTAT(T, V) BE IF CGLISTING DO
$( LISTCHAN := TRUE
SWITCHON T INTO
$( CASE S.DATALAB:
LISTLAB(V)
ENDCASE
CASE S.ITEML:
WRITEF("*N%X4 DW L%N", STVP, V)
ENDCASE
CASE S.ITEMN:
WRITEF("*N%X4 DW %X4", STVP, V)
ENDCASE
DEFAULT:
CGERROR("BAD TYPE IN LISTAT %N", FALSE, T)
$)
$)
AND LISTL(S, A, B, C, D, E) BE IF CGLISTING DO
$( LISTCHAN := TRUE
WRITEF("*N%X4 ", STVP)
WRITEF(S, A, B, C, D, E)
$)
AND STRINGRB(T) = VALOF
SWITCHON T INTO
$( CASE 0: RESULTIS "AL"
CASE 1: RESULTIS "CL"
CASE 2: RESULTIS "DL"
CASE 3: RESULTIS "BL"
CASE 4: RESULTIS "AH"
CASE 5: RESULTIS "CH"
CASE 6: RESULTIS "DH"
CASE 7: RESULTIS "BH"
DEFAULT: RESULTIS "BADREG"
$)
AND SF(F) = VALOF
SWITCHON F INTO
$( CASE F.XOR: RESULTIS "XOR"
CASE F.OR: RESULTIS "OR"
CASE F.AND: RESULTIS "AND"
CASE F.ADD: RESULTIS "ADD"
CASE F.SUB: RESULTIS "SUB"
CASE F.CMP: RESULTIS "CMP"
CASE F.MOVIMMTRM:
CASE F.MOVRTRM:
CASE F.MOVIMMTR: RESULTIS "MOV"
CASE F.LEA: RESULTIS "LEA"
CASE F.CWD: RESULTIS "CWD"
CASE F.JMP: RESULTIS "JMP"
CASE F.JGE: RESULTIS "JGE"
CASE F.JG: RESULTIS "JG"
CASE F.JLE: RESULTIS "JLE"
CASE F.JL: RESULTIS "JL"
CASE F.JE: RESULTIS "JE"
CASE F.JNE: RESULTIS "JNE"
CASE F.NEG: RESULTIS "NEG"
CASE F.NOT: RESULTIS "NOT"
CASE F.SHL: RESULTIS "SHL"
CASE F.SHR: RESULTIS "SHR"
CASE F.SAR: RESULTIS "SAR"
CASE F.NOP: RESULTIS "NOP"
DEFAULT: RESULTIS "UNKNOWN"
$)
AND LISTLAB(L) BE IF CGLISTING DO
$( LISTCHAN := TRUE
WRITEF("*N%X4 L%N EQU $", STVP, L)
$)
AND REGSTRING(R) = VALOF
SWITCHON R INTO
$( CASE 3: RESULTIS "BX"
CASE 0: RESULTIS "AX"
CASE 1: RESULTIS "CX"
CASE 2: RESULTIS "DX"
CASE 6: RESULTIS "SI"
CASE 5: RESULTIS "BP"
CASE 4: RESULTIS "SP"
CASE 7: RESULTIS "DI"
DEFAULT: RESULTIS "BADREG"
$)
/*3032>*/