ASMB,R,L,C
HED RTE MICRO-ASSEMBLER -- PASS 1
NAM MICRO,3 92061-16001 REV.2013 800131
SUP
*
*
* *********************************************************
* * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. *
* * *
* * THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT *
* * A TIME AND SHALL NOT OTHERWISE BE RECORDED, *
* * TRANSMITTED OR STORED IN A RETRIEVAL SYSTEM. COPYING *
* * OR OTHER REPRODUCTION OF THIS PROGRAM EXCEPT FOR *
* * ARCHIVAL PURPOSES IS PROHIBITED WITHOUT THE PRIOR *
* * WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. *
* *********************************************************
*
*
HEADR ASC 15,PAGE .... RTE MICRO-ASSEMBLER
ASC 10,REV.2013 800131
TIME BSS 16
*
EXT EXEC
EXT C.SOR,C.TTY,C.LST,C.BIN CMPLR LIB FCB
EXT SUP.C,OPN.C,PRM.C,GMM.C,WRT.C,RWN.C CMPLR LIB
EXT RUN.C,END.C,SPC.C,EOF.C,RED.C CMPLR LIB
*
*
******************************
*
* PASS 1 STARTS HERE.
*
* HERE WE GET THE PARAMETERS, IF ANY, FROM THE
* USER'S RUN COMMAND:
* :RU,MICRO, ,,,
*
MICRO NOP
JSB SUP.C
DEF TIME
JMP ABRT ERROR RTN
JSB PRM.C
DEF .3
SZA
JSB PUNCH
LDA PRMPT SET A = "]_"
JSB OPN.C
DEF C.SOR
JMP ABRT ERROR RTN
JSB OPN.C
DEF C.LST
JMP ABORT ERROR RTN
JSB PRM.C
DEF .4
SZA,RSS
LDA .56 DEFAULT
STA LPP LINES PER PAGE FOR MXREF
CMA -((LPP-3)+1): REMAINING
STA LINE3 LINES+1 AFTER HEADER
JSB EJECT PRINT HEADER
JSB EXEC SWAP WHOLE DISC PARTITION
DEF *+3 (NO SUCH FUNCT IN CMPLR LIB)UNLESS AUTO
DEF .22
DEF .3
JSB GMM.C GET FWA,LWA
DEF .0
STA @SYMB
STA @SYMT
ADA .4
STA @VAL
INA
STA @TAG
CMB
STB LWA -LWA-1
*
* INPUT AND EXAMINE A RECORD.
*
JSB MIC GET MICMX OR MICMXE COMMAND
INPUT JSB LSTR? LIST PRIOR LINE IF ERROR
ISZ LINE#
JSB RDCRD READ CARD
LDB @FLD1 EXAMINE 1ST BYTE
JSB LOADB
CPA ASTER =*?
JMP INPUT YES, IGNORE.
CPA "$" =$?
JMP CNTRL CONTROL STATE.
LDA .10 CHECK FOR EQU,ORG,ALGN
LDB @FLD2
JSB $SRCH
SSA
JMP INP0 NOT PSEUDO-OP
AND =B77
ADA *+2
JMP A,I
DEF *,I ONE-ORIGINED BRANCH TABLE
DEF INP4 EQU STMT
DEF INP0 DEF STMT
DEF INP0 ONES STMT
DEF INP0 ZERO STMT
DEF INP3 ALGN STMT
DEF INP2 ORG STMT
DEF END1 END STMT
*
* NORMAL STATEMENT. PROCESS LABEL IF ANY
*
INP0 JSB ORGD? ENSURE WE HAVE AN ORIGIN
JSB LBL?
JMP INP1
LDA PCNTR ENTER INTO SYMTAB
CLE NON-EQU LABEL
JSB SYMAD
INP1 JSB POVF?
LDA PCNTR
INA
JSB SETP
JMP INPUT
*
* ORG STATEMENT
*
INP2 LDA @FLD2 DISALLOW LABEL
LDB @FLD1
JSB BLNK?
JMP *+2 LABEL PRESENT
JMP INP21
LDA ERR24
JSB ERROR
INP21 JSB ORIG
JMP BAD.3
JMP INPUT
*
* ALGN STATEMENT
*
INP3 LDA @FLD2 DISALLOW LABEL
LDB @FLD1
JSB BLNK?
JMP *+2 LABEL PRESENT
JMP INP31
LDA ERR24
JSB ERROR
INP31 JSB ORGD? ENSURE WE HAVE ORIGIN
JSB ALGN
JMP INPUT
*
* EQU STATEMENT
*
INP4 LDA @FLD6 FIND ADDR EXPRESSION
LDB @FLD3
JSB BLNK?
NOP
JSB NUM (CHECKED IN NUM)
SOC
JMP BAD.2
STA SAVA SAVE EXPR VALUE
JSB LBL?
JMP INPUT
LDA SAVA RESTORE EXPR VALUE
CCE EQU FLAG
JSB SYMAD
JMP INPUT
*
* CONTROL CARD PROCESSOR
* B= BPTR TO COMMAND
*
CNTRL JSB PSRCH
DBL CTBL
DEC 10
CPA .7 $CODE COMMAND?
JMP FDESG YES
SZA
JMP INPUT NO: IGNORE COMMAND IN PASS1
*
* BAD CONTROL STATEMENT OR PSEUDO-OP
*
LDA ERR18 BAD COMMAND
JMP *+2
BAD.2 LDA ERR19 BAD LABEL EXPRESSION
BAD.3 JSB ERROR
JMP INPUT
*
* $CODE PARAMETERS ARE NOW INCLUDED IN RUN STRING
FDESG LDA ERR12 $CODE -> RUN STRING
LDB ANYER
STB TEMP
JSB ERROR
LDB TEMP
STB ANYER RESTORE FLAG
JMP INPUT
TEMP BSS 1
*
*
******************************
*
* END STATEMENT
*
END1 LDA SYFLG SYMBOL TABLE
SZA,RSS WANTED?
JMP PASS2 NO, SO GO TO PASS 2.
LDA @SYMT YES. GET
STA PNTR START OF TABLE
CPA @SYMB END?
JMP PASS2 YES. GO TO PASS2.
LDA ANYER PAGE EJECT IF ERROR
SZA
JSB EJECT
LDA .2
JSB SPACE
LDA .M12
JSB PRINT
DEF HED1
LDA .2
JSB SPACE
PR1 LDA .9 FILL THE PERTINENT PART OF
LDB @CARD ASCII OUTPUT BUFFER WITH
JSB CLEAN SPACES.
* NOW WE STORE THE SYMBOL (LABEL) IN THE
* INPUT BUFFER, WHICH WE ARE USING AS PART OF OUR
* ASCII OUTPUT BUFFER.
LDA PNTR,I
STA CARD
ISZ PNTR
LDA PNTR,I
STA CARD+1
ISZ PNTR
LDA PNTR,I
STA CARD+2
ISZ PNTR
LDA PNTR,I
STA CARD+3
* NOW PICK UP OCTAL LOCATION (IE., VALUE) OF SYMBOL.
ISZ PNTR
LDA PNTR,I
ISZ PNTR
* CONVERT TO ASCII AND STORE IN
* NEXT LOCATION IN OUTPUT BUFFER.
LDB @FLD1
ADB .15
STB SAVB SAVE BYTE ADDRESS.
JSB OCTAL
DEC 6
LDA BLNK
LDB PNTR,I PICK UP TAG
SZB
LDA "X" APPEND "X" FOR EXTERNAL (EQU)
LDB SAVB GET BYTE ADDR OF VALUE.
INB INC PAST VALUE
JSB STORB STORE SPACE OR 'X' THERE.
LDA BLNK2
STA CARD-1
LDA .18
JSB PRINT
DEF CARD
ISZ PNTR POINT
LDA PNTR TO
CPA @SYMB NEXT ENTRY. END?
JMP *+2
JMP PR1 NO, GO DO NEXT.
HED RTE MICRO-ASSEMBLER -- PASS 2
*
* PASS 2 STARTS HERE.
*
*
*
* INITIALIZATION FOR PASS 2.
*
PASS2 JSB FINI PRINT END-PASS-1 MSG
LDA FILE? OUTPUT TO FILE?
SZA,RSS
JMP OK NO.
*
* OPEN BINARY FILE
*
JSB OPN.C
DEF C.BIN
RSS ERROR RTN
JMP OK NORMAL RTN
CLA
STA FILE? RESET OUTPUT FLAGS
STA FILE
LDA ERR13
JSB ERROR
*
* INITIALIZE FLAGS, COUNTERS, ETC, FOR 2ND PASS.
* GENERATE LEADER.
*
OK LDA BASE RESET ORIGINAL ORG
STA PCNTR
JSB RWN.C
DEF C.SOR
JMP ABORT ERROR RTN
ISZ PASS#
CLA
STA LINE#
*
* READ A SOURCE RECORD.
*
JSB EJCT?
JSB MIC
P21 ISZ LINE#
JSB RDCRD READ CARD
LDB @FLD1 NO. CHECK
JSB LOADB BYTE.
CPA ASTER =*?
JMP P21A YES,IGNORE BUT PRINT
CPA "$" =$?
JMP *+2
JMP P21C NO, GOOD CODE.
JSB PSRCH
DBL CTBL
DEC 10
ADA *+2
JMP A,I
DEF *+1,I ZERO-ORIGINED JUMP TABLE
DEF P21A ERROR: IGNORE IN PASS2
DEF $PAGE
DEF $TITL $PAGE=
DEF $LST
DEF $NOLS
DEF $PNCH
DEF $NOPN
DEF P21A $CODE
*
*
* $PAGE= AND $PAGE
*
$TITL LDA .M37
STA COUNT MAX CHAR COUNT
LDA @HFD2
STA @DEST
P.GET JSB LOADB MOVE TITLE INTO HEADER
STB @INP
LDB @DEST
JSB STORB
STB @DEST
LDB @INP
ISZ COUNT
JMP P.GET
*
*
$PAGE JSB EJCT?
JMP P21 DON'T LIST COMMAND
*
* $NOLIST: LIST RECORD, THEN TURN OFF LISTING
*
$NOLS CLA
JSB LSTR2
CLA
STA LIST?
JMP P21
*
* $NOPUNCH: TURN OFF PUNCHING
*
$NOPN CLA
STA FILE?
JMP P21A
*
* $LIST: TURN ON LISTING
*
$LST JSB $LIST ENABLE LISTING
JMP P21A
*
* $PUNCH: TURN ON PUNCHING AND SET LEADER FLAG
*
$PNCH LDA FILE
STA FILE?
*
P21A CLA LIST WITHOUT CODE
JSB LSTR2
JMP P21 GO BACK.
*
* DETERMINE STATEMENT TYPE.
*
P21C LDB @FLD2 GET FIELD 2 STARTING BYTE ADR.
CLA,INA GO GET AN
JSB $SRCH 'OPCODE' BINARY OPCODE.
SSA,RSS BAD CODE?
JMP P21D NO.
LDA ERR2 YES. OUTPUT
JSB ERROR MESSAGE.
JSB DEFLT
DEC 1
P21D STA OPTKN
AND =B77 ISOLATE OPCODE
STA FLD2
LDA OPTKN ISOLATE INSTR TYPE
AND =B170000
ALF
ADA *+2
JMP A,I
DEF *+1,I ZERO-ORIGINED BRANCH TABLE
DEF P21E
DEF TYPE1
DEF TYPE2
DEF TYPE3
DEF TYPE4
DEF TYPE0
*
* DISTINGUISH TYPE3 & TYPE4 BY "CNDX"
*
P21E LDA .2 GET SPECIAL FIELD
LDB .3
JSB CODE
LDA FLD3
ALF,RAR
CMA,SSA,SLA BIT 12 OR 13 SET?
JMP TYP3A NO: WORD-TYPE-3 SPECIAL (CNDX)
LDA OPTKN
CPA RTN
JMP TYP1A
JMP TYP4A
*
*
******************************
*
*
* PROCESS PSEUDO-OPS
*
TYPE0 LDA FLD2
ADA *+2
JMP A,I
DEF *,I ONE-ORIGINED BRANCH TABLE
DEF TY0.3 IGNORE EQU THIS PASS
DEF DEFST
DEF ONEST
DEF ZERST
DEF ALNST
DEF ORGST
DEF END2
*
* ZERO STATEMENT
*
ZERST CLA
STA INST1
JMP TY0.2
*
* DEF STATEMENT
*
DEFST LDA @FLD6 FIND EXPRESSION
LDB @FLD3
JSB BLNK?
NOP
JSB NUM
SOS
JMP TY0.1
LDA ERR19
JSB ERROR
CLA
TY0.1 STA INST1
CLA
JMP TY0.2
*
* ONES STATEMENT
*
ONEST CCB
STB INST1
LDA =B377
*
TY0.2 STA INST2
JSB OUTPT
JMP P21
*
* ALGN STATEMENT
*
ALNST JSB ALGN
JMP TY0.3
*
* ORG STATEMENT
*
ORGST JSB ORIG
NOP
*
TY0.3 CLA
JSB LSTR2 LIST WITHOUT CODE
JMP P21
*
*
******************************
*
*
* CREATE A WORD TYPE 1 INSTRUCTION.
*
* FIRST, CHECK MNEMONICS AND COLLECT THE BINARY
* CODES FOR EACH FIELD.
*
TYPE1 LDA .2 GO GET A 'SPECIAL' CODE
LDB .3 FROM FIELD 3.
JSB CODE
LDA FLD3
ALF,SLA ALLOWED IN TYPE-1 INSTRUCTION?
JMP TYP1A YES.
LDA ERR16 PRINT ERROR MESSAGE.
JSB ERROR
JSB DEFLT
DEC 2
STA FLD3
TYP1A LDA .4 GO GET AN 'ALU' CODE
LDB .4 FROM FIELD 4.
JSB CODE
LDA .6 GO GET A 'STORE' CODE
LDB .5 FROM FIELD 5.
JSB CODE
LDA .7 GO GET AN 'S-BUS' CODE
LDB .6 FROM FIELD 6.
JSB CODE
*
* NOW PUT TOGETHER THE FIELDS OF THE TYPE 1 WORD.
*
LDB FLD3 SPECIAL FIELD
LSR 5
LDB FLD5 STORE FIELD
LSR 5
LDB FLD6 SBUS FIELD
LSR 5
LDB FLD4 ALU FIELD
LSR 1
JMP EMIT1
*
*
******************************
*
*
* CREATE A WORD TYPE 2 INSTRUCTION.
* FIRST, CHECK MNEMONICS AND COLLECT BINARY CODES
* FOR EACH FIELD.
*
TYPE2 LDA .2 GET A 'SPECIAL' CODE
LDB .3 FROM FIELD 3.
JSB CODE
LDA FLD3
ALF,SLA ALLOWED IN TYPE-2 INSTRUCTION?
JMP TY2.0 YES.
LDA ERR16
JSB ERROR
JSB DEFLT
DEC 2
STA FLD3
TY2.0 LDA .5 GO GET AN MODIFIER CODE
LDB .4 FROM FIELD 4.
JSB CODE
LDA .6 GO GET A 'STORE' CODE
LDB .5 FROM FIELD 5.
JSB CODE
LDB @FLD6 GET FLD 6 STARTING BYTE ADDRESS.
JSB NUM CONVERT FIELD TO BINARY.
SOS ANY PROBLEMS?
JMP TY2.2 NO.
TY2.1 LDA ERR11 PRINT ERROR MESSAGE.
JSB ERROR
CLA MAKE FIELD 6 = 0.
TY2.2 STA FLD6
AND =B177400 IS # 8 BITS OR LESS?
SZA
JMP TY2.1 NO, SO ERROR.
*
* NOW PUT TOGETHER THE FIELDS OF THE TYPE 2 WORD.
*
LDB FLD3 SPECIAL FIELD
LSR 5
LDB FLD5 STORE FIELD
LSR 5
LDB FLD6 OPND FIELD
LSR 6
STA INST1
CLA
LSR 2 HI BITS OF OPND
IOR FLD4 MODIFIER
RAR,RAR
JMP EMIT2
*
*
******************************
*
*
* CREATE A WORD TYPE 3 INSTRUCTION.
* FIRST, CHECK MNEMONICS AND COLLECT BINARY CODES.
*
TYPE3 LDA .2 GET SPECIAL FIELD
LDB .3
JSB CODE
LDA FLD3
ALF,RAR
CMA,SSA,SLA BIT 12 OR 13 SET?
JMP TYP3A NO: WORD-TYPE-3 SPECIAL
LDA ERR15
JSB ERROR
JSB DEFLT
DEC 2
STA FLD3
TYP3A LDA .3 GO GET A 'CONDITION' CODE
LDB .4 FROM FIELD 4.
JSB CODE
LDA .9 GET SENSE CODE (STORE FIELD)
LDB .5 FROM FIELD 5
JSB CODE
LDA OPTKN
CPA RTN
JMP TY3.4
LDB @FLD6 GET ADDRESS FIELD
JSB NUM
SOS
JMP TY3.2
LDA ERR19
TY3.0 JSB ERROR
LDA PCNTR DEFAULT TO ADDR 0 IN CURRENT BLK
INA OR BLK+1 IF PCNTR=XXX777
AND =B177000
TY3.2 STA FLD6
LDB PCNTR IS IT IN SAME BLK OR
INB BLK+1 IF PCNTR=XXX777
XOR B
AND =B177000
SZA,RSS
JMP TY3.3 YES
LDA ERR23 OUT OF RANGE IN FIELD 6
JMP TY3.0
TY3.4 LDB @FLD6 ENSURE: NO EXPR FOR RTN OP
JSB LOADB
CPA BLNK
JMP TY3.3
LDA ERR33 EXPR NOT ALLOWED
JMP TY3.0
*
* NOW PUT TOGETHER FIELDS OF TYPE 3 WORD
*
TY3.3 LDB FLD3 SPECIAL FIELD
LSR 5
LDB FLD6 OPND FIELD
LSR 9 MODULO 512
IOR FLD5 RJS SENSE
RAR
LDB FLD4 CONDITION FIELD
LSR 1
JMP EMIT1
*
*
******************************
*
*
* CREATE A WORD TYPE 4 INSTRUCTION.
* WE ALREADY HAVE CODES FROM FIELDS 2 AND 3.
*
TYPE4 LDA .8
LDB .3
JSB CODE
TYP4A LDA FLD3 GET SPECIAL FIELD
LDB MX?
CPA SPBLK+1 MX BLANK?
SZB,RSS
JMP TY4.3
LDA UNCD YES: CHANGE TO UNCD
STA FLD3
TY4.3 ALF,RAR
SLA BIT 13 SET?
JMP TY4.0 YES: WORD-TYPE-4 SPECIAL
LDA ERR17
JSB ERROR
JSB DEFLT
DEC 8
STA FLD3
TY4.0 LDA @FLD6 ENSURE: EMPTY FIELDS 4 & 5
LDB @FLD4
JSB BLNK?
JMP *+2
JMP TY4.4 YES: B=@FLD6
LDA ERR25
JSB ERROR
LDB @FLD6
TY4.4 JSB NUM
SOS
JMP TY4.1
LDA ERR19
JSB ERROR
CLA DEFAULT TO 0
TY4.1 STA FLD6
AND MXAD1
SZA,RSS
JMP TY4.2
XOR FLD6 MODULO MAX ADDR
STA FLD6
LDA ERR23 OUT OF RANGE IN FIELD 6
JSB ERROR
*
* NOW PUT TOGETHER THE FIELDS OF THE TYPE 4 WORD.
*
TY4.2 LDB FLD3
LSR 5
LDB FLD6
LSR 11
EMIT1 STA INST1
CLA
LSR 4
EMIT2 IOR FLD2
ALF
STA INST2
JSB OUTPT
JMP P21
*
*
******************************
*
*
* WE COME HERE AFTER READING AN '$END' RECORD
* IN PASS 2.
*
END2 JSB $LIST ENABLE LISTING
CLA LIST $END IF NOT OURS
LDB NOEND
SZB,RSS
JSB LSTR2
JSB DONE CLEAN UP
LDB .6 WRITE CONSOLE END MSG
LDA ANYER
SZA
LDB .12
STB BLEN
JSB WRT.C
DEF C.TTY
DEF ENDMS
DEF BLEN
JMP ABORT ERROR RTN
LDA XREF? CROSS-REF OPTION?
SZA,RSS
JMP STOP
JSB XREF YES: SCHEDULE MXREF
JMP STOPX SKIP PAGE EJECT (DONE BY MXREF)
*
* ABORT MICRO-ASSEMBLER
*
ABORT JSB DONE CLEAN UP
JSB WRT.C PRINT ABORT MSG
DEF C.TTY
DEF AEND
DEF .8
NOP ERROR RTN
STOP JSB SPC.C EJECT PAGE
DEF C.LST
DEF .M2
NOP ERROR RTN
LDA .M10
STA TEMP
STOPX JSB END.C
DEF ANYER
ISZ TEMP TRY AGAIN FOR A WHILE
JMP STOPX
JMP 12 MP ABORT IF WE CAN'T QUIT NICE
SPC 2
ABRT JSB WRT.C
DEF C.TTY
DEF AEND
DEF .8
NOP
JMP STOPX
HED RTE MICRO-ASSEMBLER -- SUBROUTINES
SKP
******************************
*
* A L G N
*
* ENTRY:
* JSB ALGN
*
* EFFECTS THE "ALGN" PSEUDO-OP BY ADJUSTING
* PCNTR TO A HEX BOUNDARY. NOTE THAT WE
* DO NOT FLAG P-OVERFLOW HERE (ANALOGOUS
* TO "ORG" PROCESSING).
*
ALGN NOP
LDA PCNTR
ADA =B17
AND =B177760
JSB SETP
JMP ALGN,I
*
*
******************************
*
* B L N K ?
*
* ENTRY:
* LDA
* LDB
* JSB BLNK?
*
*
*
* EXIT:
* B= BPTR TO CHAR FOLLOWING LAST BLANK
*
* SKIPS CONTIGUOUS BLANKS UP TO (BUT NOT INCLUDING)
* CHAR POINTED TO IN A-REG. IF ALL BLANKS, RETURNS
* TO "TRUE" EXIT...OTHERWISE, RETURNS TO "FALSE" EXIT.
*
BLNK? NOP
STA BTMP
LDA BLNK
JSB SKIP SKIP ALL BLANKS
LDA BTMP @NEXT>=LIMIT?
CMA,INA
ADA B
SSA
JMP BLNK?,I NO: B=BPTR TO NEXT
LDB BTMP YES: SET B=BPTR TO LAST+1
ISZ BLNK?
JMP BLNK?,I
BTMP BSS 1
*
*
******************************
*
* C L E A N
*
* 'CLEAN' FILLS A BUFFER WITH A GIVEN CHAR.
*
* CALLING SEQUENCE:
* LDB
*
* LDA <+ NO. OF WORDS IN BUFFER>
*
* JSB CLEAN
* ASC 1,
*
CLEAN NOP
CMA,INA
STA COUNT
LDA BLNK2 BRING IN BLANKS
CLE0 STA B,I
INB
ISZ COUNT
JMP CLE0
JMP CLEAN,I
*
*
******************************
*
* C M P B
*
* ENTRY:
* LDA
* LDB
* JSB CMPB
* DEC
*
* EXIT:
* A<0 -- LEFT < RIGHT
* =0 -- LEFT = RIGHT
* >0 -- LEFT > RIGHT
* B= NUMBER OF EQUAL CHARACTERS
*
* COMPARISON OF TWO STRINGS.
*
CMPB NOP
STA CBINP
STB CBDST
LDA CMPB,I COMPUTE -COUNT
CMA,INA
STA COUNT
SZA,RSS CHECK FOR ZERO LENGTH
JMP CMPB2
CMPB1 LDB CBINP GET CHAR FROM LEFT STRING
JSB LOADB
STB CBINP
STA CLFT
LDB CBDST GET CHAR FROM RIGHT STRING
JSB LOADB
STB CBDST
CMA,INA LEFT >= RIGHT?
ADA CLFT
SZA
JMP CMPB2
ISZ COUNT LEFT=RIGHT
JMP CMPB1
CMPB2 LDB CMPB,I MAX - RESIDUAL = # EQUAL CHARS
ADB COUNT
ISZ CMPB SKIP COUNT
JMP CMPB,I
CBDST BSS 1
CBINP BSS 1
CLFT BSS 1
*
*
******************************
*
* C N V R T
*
* ASCII TO BINARY CONVERSION ROUTINE.
*
* CALLING SEQUENCE:
* A REG SHOULD BE 0 IF STRING OF OCTAL
* ASCII DIGITS IS TO BE CONVERTED TO BINARY;
* #0 IF STRING OF DECIMAL ASCII DIGITS.
* B REG SHOULD CONTAIN THE STARTING BYTE ADDRESS
* OF THE STRING OF ASCII DIGITS TO BE
* CONVERTED.
* JSB CNVRT
*
* ON RETURN RESULT IN A REG.
* OVERFLOW SET ON ERROR
* B= BPTR TO NEXT CHAR (EXCEPT WHEN OVERFLOW IS SET).
*
CNVRT NOP
STB TMPC1 SAVE BYTE ADDRESS
LDB .8 PUT OCTAL BASE IN B.
SZA WAMT DECIMAL?
LDB .10 YES, PUT DECIMAL BASE INB.
STB TMPC2 SAVE BASE.
CLA CLEAR TEMPORARY
STA TMPC3
STA CFLG
CN1 LDB TMPC1 LOAD
JSB LOADB BYTE.
ADA .M48 VALUE OF BYTE
SSA <@60?
JMP CN4 YES
STA TMPC4 NO,SAVE BYTE.
LDA TMPC2 IS
CMA,INA BUTE
ADA TMPC4 NON LEGAL
SSA,RSS DIGIT?
JMP CN4 YES
LDA TMPC3 COMPUTE NEXT
MPY TMPC2 TEMPORARY RESULT.
SZB OVERFLOW?
JMP CN2 YES
CLO NO, CLEAR O-BIT.
ADA TMPC4 ADD IN NEW DIGIT
SOC OVERFLOW?
JMP CNVRT,I YES RETURN
STA TMPC3 SAVE INTERMEDIATE RESULT
ISZ CFLG SET GOOD DIGIT FLAG.
ISZ TMPC1 BUMP BYTE ADDRESS.
JMP CN1
CN4 LDA CFLG ILLEGAL DIGIT FOUND
LDB TMPC1 PUT BYTE ADDRESS IN B
SZA,RSS DID WE GET ANYTHING?
STO NO, SET ERROR CONDITION
LDA TMPC3 PUT RESULT IN A-REG
JMP CNVRT,I
CN2 STO OVERFLOW
JMP CNVRT,I
*
*
******************************
*
* C O D E
*
* "CODE" OBTAINS THE BINARY CODE EQUIVALENT FOR
* THE MNEMONIC IN A GIVEN FIELD, AND STORES IT IN
* THE APPROPRIATE FIELD STORAGE LOCATION, EG. "FLD1", ETC.
* IT PRINTS AN ERROR MESSAGE IF THE MNEMONIC WAS INVALID.
*
* CALLING SEQUENCE:
* LDA
* LDB
* JSB CODE
*
* CALLED FOR TYPES 2 THROUGH 9.
* UPON RETURN: THE CODE WILL BE IN THE FIELD STORAGE
* LOCATION; A AND B REGS ARE NOT SIGNIFICANT.
*
CODE NOP
STA CSAVA
STB CSAVB
ADB @FADR GET STARTING BYTE ADDRESS OF
LDB B,I FIELD.
JSB $SRCH GO GET BINARY CODE.
SSA
JMP C06
LDB CSAVA MNEMONIC TYPE
CPB .6
JMP C01
CPB .7
JMP *+2
JMP C07
* VERIFY THAT IT'S OK IN S-BUS FIELD
LDB A
BLF,SLB
JMP C07 OK
JMP C06
* VERIFY THAT IT'S OK IN STORE FIELD
C01 LDB A
BLF,RBR
SLB
JMP C07 OK
C06 LDA CSAVA
ADA CERR
LDA A,I
JSB ERROR PRINT ERROR MESSAGE.
JSB DEFLT
CSAVA BSS 1 TABLE TYPE
C07 LDB CSAVB STORE CODE IN PROPER
ADB @FLDS FIELD WORD.
STA B,I
JMP CODE,I
CERR DEF *-1,I 2-ORIGINED TABLE
DEF ERR3
DEF ERR4
DEF ERR5
DEF ERR6
DEF ERR7
DEF ERR8
DEF ERR3
DEF ERR9
*
*
******************************
*
* C O N ?
*
* ENTRY:
* LDB
* JSB CON?
*
*
*
* EXIT (OK EXIT):
* A= VALUE
* B= BPTR TO NEXT CHAR (AFTER NUMERIC STRING)
*
* ROUTINE CONVERTS A NUMERIC STRING OF THE FORM:
* [+/-] [B]
*
CON? NOP
CCA
STA POS?
JSB LOADB
CPA MINUS
ISZ POS? CLEAR FLAG & SKIP
CPA PLUS
JMP *+2 SKIP SIGN
ADB .M1 BACK-UP OVER FIRST CHAR
JSB OCT? TRAILING "B"?
JMP C.DEC NO
CLO YES: CONVERT B-FORM OCTAL
JSB CNVRT
SOC C
JMP CON?,I INVALID NUMBER
INB SKIP "B"
JMP C.CV1
C.DEC CCA CONVERT DECIMAL VALUE
CLO
JSB CNVRT
SOC C
JMP CON?,I INVALID NUMBER
C.CV1 STB CTMP SAVE POINTER
LDB POS? CORRECT SIGN
SZB,RSS
CMA,INA POS?=0 ==> NEGATE
LDB CTMP RESET B=BPTR TO NEXT CHAR
ISZ CON?
JMP CON?,I
CTMP BSS 1
*
*
******************************
*
* D E C M L
*
* ENTRY:
* LDA
* LDB
* JSB DECML
* EXIT:
* B= BYTE POINTER TO BYTE PRECEDING MOST-SIGNIFICANT
* DIGIT
*
* ROUTINE CONVERTS NON-NEGATIVE NUMBER (IE., SIGN=0)
* TO 4-DIGIT DECIMAL ASCII STRING
*
DECML NOP
STA BINRY
LDA .M4 NUMBER OF DIGITS
STA DGITS
DEC0 STB @DEST
CLB
LDA BINRY
DIV .10
STA BINRY BINRY/10
LDA B BINRY MOD 10
ADA =B60
LDB @DEST
JSB STORB
ADB .M2 BPTR TO NEXT MOST-SIG DIGIT
ISZ DGITS
JMP DEC0
JMP DECML,I
*
*
******************************
*
* D E F L T
*
* ENTRY:
* JSB DEFLT
* DEC
*
* EXIT:
* A= DEFAULT FIELD ENTRY FOR TABLE TYPE
*
* TABLE TYPE MUST BE ON [1,9]
*
DEFLT NOP
LDA DEFLT,I
ISZ DEFLT
ADA @DFLT
LDA A,I
JMP DEFLT,I
*
@DFLT DEF *,I ONE-ORIGINED XE TABLE
DEF OPBLK
DEF SPBLK
DEF ALZ
DEF ALBLK
DEF HIGH
DEF STBLK
DEF SBBLK
DEF SPBLK
DEF SNBLK
@MXD DEF *,I ONE-ORIGINED MX TABLE
DEF OPBLK+1
DEF SPBLK+1
DEF CDBLK+1
DEF ALBLK+1
DEF HIGH+1
DEF STBLK+1
DEF SBBLK+1
DEF UNCD
DEF SNBLK+1
*
*
******************************
*
* D O N E
*
* ENTRY:
* JSB DONE
*
* FOR PASS2 COMPLETION ONLY. DUMP CURRENT BUFFER AND
* CLOSE OBJECT FILE. ALSO PRINT PASS-COMPLETION
* MESSAGE.
*
DONE NOP
ISZ END?
LDA FILE RESET FILE STATE
LDB FMGR IGNORE IF FILE ERROR
SZB,RSS
STA FILE?
JSB EMBUF DUMP RECORD & WRITE END RECORD
JSB FINI WRITE END-PASS MSG
JMP DONE,I
*
*
******************************
*
* E J E C T
* E J C T ?
*
* ENTRY:
* JSB EJECT -OR- JSB EJCT?
*
* EJECTS PAGE AND PRINTS HEADING. IF ENTRY IS THROUGH
* EJCT?, WE IGNORE REQUEST IF LISTING IS NOT ENABLED.
* WE DON'T PAGE EJECT IF WE ARE ALREADY POSITIONED AT
* TOP OF FORM.