home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug018.ark
/
MILMON80.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
24KB
|
1,177 lines
;
; 8 0 8 0 M I L M O N I T O R
;
ORG 0
;
L0: MVI A,1 ;IDLE TTY
OUT 24Q
JMP LA0 ;CONTINUE ELSEWHERE
NOP
PUSH H ;SAVE H,L RST 010-BRK PT EXEC
LXI H,LA023 ;SET TO PRINT BUFFER(PB)
MOV M,A ;ACC TO PB
JMP L3160 ;CONT ELSEWHERE
CALL L357 ;SAVE RST 020
LHLD LA100 ;INDIRECT JUMP TO LOC POINTER
PCHL ;BY CONTENT OF LA100,LA101
NOP
CALL L357 ; RST 030
LHLD LA102 ;IND. JMP POINTED BY
PCHL ;LA102,LA103
NOP
CALL L357 ; RST 040
LHLD LA104
PCHL
NOP
CALL L357 ; RST 050
LHLD LA106
PCHL
NOP
CALL L357 ; RST 060
LHLD LA110
PCHL
NOP
CALL L357 ; RST 070
LHLD LA112
PCHL
NOP
LA0: OUT 26Q ;DISABLE R.C., STOP PROGRAMMER
LXI H,LA100 ;SET SP
SPHL
MVI A,0 ;CLEAR TTY I/O PRG.
STA LA010 ;EXCEPTION FLAGS
STA LA011
STA LA016
MVI A,'-' ;O/P ------
MVI B,6
CALL L3260
CALL L1355 ;CR/LF
L133: CALL L3277 ;I/P NONBLANK, FIRST LETTER
JZ L133
ANI 77Q ;MASK
MOV C,A ;STORE IN C
CALL L3277 ;I/P ALPHABETIC, SECOND LETTER
JNC L6070
ANI 77Q ;MASK
MOV D,A ;STORE IN D
CALL L3277 ;I/P ALHPABETIC, THIRD LETTER
JNC L250
ANI 77Q
MOV E,A ;STORE IN E
CALL L3277 ;I/P ALPHABETIC, FOURTH LETTER
JNC L221
CALL L3277 ;I/P NON-ALPHABETIC
JC L6070
LXI H,L3321 ;SET H,L TO 4 LET. TABLE 4 LETTER
MVI B,13Q ;INSTR COUNT DEC
L207: CALL L5166 ;SWEEP 4 LETTER TABLE CONTROLLER
INX H ;NO MATCH, GO TO NEXT
JNZ L207 ;SET OF BYTES
JMP L6070 ;END OF 4 LET TABLE, ERROR
L221: LXI H,L4111 ;SET H,L TO BEG OF COMMAND TABLE
MVI B,16Q ;SET UP COUNT
L226: CALL L270 ;CALL 3 LET MATCH
INX H ;IF NO MATCH GO TO NEXT BYTE
JNZ L226 ;NOT END OF TABLE, TRY AGAIN
MVI B,65Q ;NOT COMMAND, SET COUNT TO 3 LET INST
L237: CALL L300 ;CALL 3 LET INST MATCH
JNZ L237 ;NOT END, TRY AGAIN
JMP L6070 ;END OF TABLE, ERROR
L250: LXI H,L4010 ;SET H,L TO 2 LET TABLE
MVI B,17Q ;SET UP COUNT
MOV E,D ;SHIFT
MOV D,C
L257: CALL L306 ;CALL 2 LET MATCH
JNZ L257 ;NO MATCH, TRY AGAIN
JMP L6070 ;END OF TABLE, ERROR
L270: CALL L314 ;CALL 3 LET MATCH EXECUTE
MOV E,M ;MATCH FOUND, LOAD GIVEN
INX H ;JUMP ADDR TO D,E COMMAND
MOV D,M
XCHG ;INDIRECT JUMP
PCHL
L300: CALL L314 ;CALL 3 LET MATCH
JMP L5143 ;MATCH FOUND, CONT ELSEWHERE
L306: CALL L323 ;2 LET MATCH
JMP L5175 ;MATCH FOUND, CONT ELSEWHERE
L314: CALL L352 ;MASK, INCREMENT H,L
CMP C ;THIRD LETTER EQUAL TO TAB?
JNZ L343 ;NO, JUMP
L323: CALL L352 ;YES, GO TO SECOND LETTER
CMP D ;SECOND LETTER EQUAL?
JNZ L344 ;NO
CALL L352 ;YES, GO TO FIRST LETTER
CMP E ;LAST LETTER EQUAL?
JNZ L345 ;NO
MOV E,M ;YES, MOVE CODE TO E
RET
L343: INX H
L344: INX H
L345: INX H
INX SP ;SET SP
INX SP
DCR B ;COUNT INSTR
RET
L352: MVI A,77Q ; MASK
ANA M ; SUBROUTINE
INX H
RET
L357: SHLD LA014 ;SAVE H,L TEMPORARILY
XTHL ;EXCH H,L AND TOP OF STACK
PUSH PSW ;SAVE REGISTERS
PUSH B
PUSH D
PUSH H
LHLD LA014 ;RESTORE H,L
RET
L373: POP H ; RESTORE
POP D ; SUBROUTINE
POP B
POP PSW
XTHL
RET
LA01: CALL L357 ;SAVE REG I/P TTY
LDA LA010 ;TTY I/P? SUBR
CPI 0
JNZ L0
MVI C,-9 ;BIT COUNT
INR A ;ENABLE R.C.
OUT 26Q
LA21: IN 0 ;WAIT FOR START PULSE
RRC
JNC LA21
MVI A,0 ;DISABLE R.C.
OUT 26Q
LXI H,1040Q ;SET TIME CONSTANT (T.C.)
CALL L1117 ;TIMEOUT 4.05 MSEC
DAD H ;DOUBLE T.C.
LA42: IN 0 ;I/P BIT
CMA
OUT 24Q ;ECHO
RAR ;ROTATE INTO POSITION
MOV A,B
RAR
MOV B,A
CALL L1117 ;TIMEOUT 9.1 MSEC
INR C ;COUNT BIT
JNZ LA42 ;NOT LAST, LOOP
MVI A,1 ;IDLE TTY
OUT 24Q
DAD H ;DOUBLE TC
CALL L1117 ;TIMEOUT 18.2 MSEC
MOV A,B ;MASK PARITY
ANI 177Q
STA LA013 ;PUT INTO TEMP STORE
CALL L373 ;RESTORE REG
LDA LA013 ;TEST FOR TAPE LEADER
CPI 0
JZ LA01
CPI 1 ;TEST FOR CTRL A
RNZ
RST 0 ;IF CTRL A, GO TO BEG OF MONITOR
L1117: PUSH H ; TIMING
INR H ; LOOP
L1121: DCR L
JNZ L1121
DCR H
JNZ L1121
POP H
RET
L1133: CALL L357 ;SAVE REG TTY O/P
MVI C,-8 ;COUNTER
STA LA013 ;MOVE TO I/O BUFFER
LDA LA010 ;TTY I/P TEST
CPI 0
JNZ L0
OUT 24Q ;START TTY
LXI H,1040Q ;SET TC
DAD H ;DOUBLE TC
LDA LA013 ;RESTORE ACC
L1164: CALL L1117 ;TIMEOUT 9.1 MSEC
OUT 24Q ;O/P BIT
RAR ;ROTATE
INR C ;COUNT
JNZ L1164 ;CONTINUE OUTPUTTING
CALL L1117 ;TIMEOUT 9.1 MSEC
MVI A,1 ;IDLE TTY
OUT 24Q
DAD H ;TIMEOUT 18.2 MSEC
CALL L1117
CALL L373 ;RESTORE REG
RET
L1215: CALL LA01 ; I/P WITH
L1220: MOV B,A ; OCTAL TEST
ANI 370Q ; INTO B
CPI '0'
RET
L1226: CALL LA01 ; I/P WITH
CPI 177Q ; RUBOUT
RNZ ; TEST
MVI A,'_' ;PRINT _
JMP L1133
L1241: CALL L357 ;SAVE REG I/P BYTE
L1244: CALL L1215 ;I/P OCTAL TO MEMORY
L1247: JNZ L1244
L1252: MOV A,B ;ROTATE, SAVE IN B
RRC
RRC
ANI 300Q
MOV B,A
L1260: CALL L1226 ;I/P ASCII WITH RUBOUT TEST
JZ L1244
ANI 7 ;MASK, ROTATE, SAVE IN C
RLC
RLC
RLC
MOV C,A
CALL L1226 ;I/P ASCII WITH RUBOUT TEST
JZ L1260
ANI 7 ;MASK, COMBINE
ORA B
ORA C
MOV M,A ;MOVE TO MEMORY
CALL L373 ;RESTORE REG
RET
L1313: PUSH PSW ; O/P BLANK
MVI A,' '
CALL L1133
POP PSW
RET
L1323: CALL L1313 ;O/P BLANK O/P MEMORY
L1326: MOV A,M ;O/P FIRST DIGIT BYTE
RLC
RLC
ANI 3
CALL L1350
MOV A,M ;O/P SECOND DIGIT
RRC
RRC
RRC
CALL L1346
MOV A,M ;O/P LAST DIGIT
L1346: ANI 7
L1350: ORI '0'
JMP L1133
L1355: PUSH PSW ; O/P CRLF
MVI A,15Q ;CR
CALL L1133
MVI A,12Q ;LF
CALL L1133
POP PSW
RET
L1372: PUSH PSW ; O/P /(SLASH)
MVI A,'/'
CALL L1133
POP PSW
RET
LB02: LHLD LA000 ;SET TO CLP SET H,L TO CLP
LDA LA016 ;TEST FOR PRG.
CPI 1
RNZ
MOV A,L ;YES, PRG SET TO PRG BUFFER
LXI H,LA007
OUT 20Q ;O/P ADDRESS
IN 2 ;I/P BYTE
MOV M,A ;MOVE TO BUFFER
RET
LB25: CALL LB02 ;SET H,L TO CLP O/P CLP
LXI H,LA001 ;SET TO MS BYTE OF CLP
JNZ LB46 ;NOT PRG, JUMP
MVI A,120Q ;O/P P (PROGRAMMER)
CALL L1133
JMP LB51
LB46: CALL L1323 ;PRINT MS BYTE OF ADDRESS
LB51: DCX H
JMP L1326 ;PRINT LS BYTE OF ADDRESS
LB55: CALL L1355 ; O/P CLP/
CALL LB25
JMP L1372
LB66: CALL LB02 ; O/P MEMORY AT CLP
JMP L1323
LB74: LHLD LA000 ; INCREMENT CLP
INX H
SHLD LA000
JMP LB02
LC06: LHLD LA000 ; DECREMENT CLP
DCX H
SHLD LA000
JMP LB02
LC20: LHLD LA000 ; COMPARE CLP
XCHG ; AND UPPER LIMIT
LHLD LA002
MOV A,D
CMP H
RNZ
MOV A,E
CMP L
RET
LC35: CALL LC20 ;COMPARE CLP AND UL RANGE CONTROL
JNZ LB74 ;NOT ZERO, INCR CLP
RST 0 ;END OF PROGRAM, GO TO BEG
LC44: CALL L1355 ; O/P CLP*
MVI A,'*'
CALL L1133
LC54: CALL L1313 ;O/P BLANK I/P ADDR
CALL LA01 ;I/P ASCII TO MEMORY
CPI 'P' ;=P?
JZ L2210 ;YES, SET PRG FLAG
LXI B,L2204 ;NO, SET UP NEXT ADDR-I/P MS BYTE
PUSH B
CALL L357 ;SAVE REG
CALL L1220 ;I/P OCTAL
JMP L1247
L2204: DCX H ;I/P BYTE TO MEM-I/P LS BYTE
JMP L1241
L2210: MVI A,1 ;SET PROGRAMMER FLAG
STA LA016
MOV M,A ;STORE P
JMP L2204 ;I/P WORD
L2221: LXI H,LA007 ;I/P LOC WHERE PROG I/P LIMITS
CALL LC44 ;IS NOW
L2227: LXI H,LA005 ;I/P NEW LOC
CALL LC44
L2235: CALL L2251 ;O/P CRLF*, I/P NEW CLP
LXI H,LA003 ;O/P BL, I/P UPPER L.
CALL LC54
JMP L1355 ;O/P CRLF, RET
L2251: LXI H,LA001 ;SET H,L TO CLP
JMP LC44 ;O/P CRLF*,I/P CLP
DPO: CALL L2235 ;I/P UPPER L., O/P CRLF
L2262: MVI C,8 ;SET UP COUNT
CALL LB55 ;O/P CLP/
CALL LB02 ;SET H,L TO CLP
L2272: CALL L1323 ;O/P MEMORY BYTE
CALL LC35 ;INCR CLP
DCR C ;COUNT
JNZ L2272 ;LOOP
JMP L2262 ;NEW LINE
LDO: CALL L2235 ;I/P CLP, UPPER L., O/P CRLF
L2312: CALL LA01 ;I/P ASCII, TEST
CPI '/' ;WAIT FOR /
JNZ L2312
CALL LB02 ;SET H,L TO CLP
L2325: CALL LA01 ;I/P ASCII, TEST
CPI 15Q ;FOR CRLF
JZ L2312
CALL L1241 ;I/P BYTE TO MEM
CALL LC35 ;RANGE CONTROL (END?)
JMP L2325 ;LOOP
EDT: CALL L2251 ;I/P CLP OCTAL
L2351: CALL LB55 ;O/P CLP EDITOR
CALL LB02 ;SET H,L TO CLP
CALL L2365 ;PROCESS LINE
JMP L2351 ;LOOP
L2365: CALL LA01 ;I/P ASCII EDITING
L2370: CPI 'R' ;R? ROUTINES
JZ L0 ;YES, GO TO BEG
CPI '*'
JZ L2251 ;YES, GO TO I/P CLP ROUTINE
CPI '@'
JZ L3073 ;YES, GO TO XQT
CPI '^'
JZ LC06 ;YES, GO TO DECR CLP
CPI ' '
JZ L3042 ;YES, PRINT OCTAL BYTE
CALL L1220 ;TEST FOR OCTAL
RNZ ;NOT OCTAL
LXI D,L3037 ;I/P BYTE TO MEM
PUSH D
CALL L357
JMP L1252
L3037: JMP L3045
L3042: CALL LB66 ;O/P MEM AT CLP
L3045: CALL LA01 ;I/P ASCII
CPI '_' ;BACK ARROW?
JNZ L3063 ;NO, JUMP
CALL L1241 ;YES, I/P ANOTHER BYTE
JMP L3045 ;LOOP
L3063: CPI ' '
JZ LB74 ;YES, INCR CLP AND RET
JMP L2370 ;NO, LOOP
XQT:
L3073: CALL L1355 ;CRLF XQT
CALL L2251 ;I/P ADDRESS TO H,L
LHLD LA000
PCHL ;INDIRECT JUMP
SBP: CALL L3135 ;CLEAR BKPT SET BREAKPOINT
LXI H,LA020 ;SET H,L TO BKPT ADDR BUFFER
CALL LC44 ;I/P BKPT ADDR TO MEMORY
LHLD LA017 ;SAVE PROG BYTE
MOV A,M
STA LA021
MVI M,317Q ;INSERT RST 010 INTO PROG
MVI A,1 ;SET BKPT FLAG
STA LA022
RST 0
L3135: LDA LA022 ;TEST FOR BKPT CLEAR BKPT
CPI 1
RNZ
LHLD LA017 ;LOAD H,L WITH BKPT ADDR
LDA LA021 ;MOV PROG BYTE TO ACC
MOV M,A ;MOV BACK INTO PROG
MVI A,0 ;CLEAR BKPT FLAG
STA LA022
RET
L3160: PUSH PSW ;SAVE ACC, FLAGS EXECUTE BKPT
CALL L1323 ;O/P ACC
MOV M,B
CALL L1323 ;O/P B
MOV M,C
CALL L1323 ;O/P C
MOV M,D
CALL L1323 ;O/P D
MOV M,E
CALL L1323 ;O/P E
POP B ;RESTORE FLAGS, ACC TO B,C
POP D ;RESTORE H,L TO D,E
MOV M,D
CALL L1323 ;O/P H
MOV M,E
CALL L1323 ;O/P L
XCHG
CALL L1323 ;O/P MEM
MOV A,C ;FLAGS TO ACC
CALL L3250 ;O/P CARRY
CALL L3244 ;O/P PARITY
CALL L3244 ;O/P CY1 (CARRY BETWEEN D3,D4)
CALL L3244 ;O/P ZERO
MOV A,C
CALL L3246 ;O/P SIGN
RST 0
L3244: MOV A,C ; SHIFT AROUND
RRC ; FLAG BYTE
L3246: RRC
MOV C,A
L3250: ANI 1
CALL L1313
JMP L1346
L3260: CALL L1355 ;CRLF O/P WITH
L3263: CALL L1133 ;O/P ASCII COUNT LOOP
DCR B ;COUNT
RZ
JMP L3263 ;LOOP
CBP: CALL L3135 ;CLEAR BKPT
RST 0
L3277: CALL LA01 ;I/P ASCII I/P NUMERIC
CPI ' ' ;BLANK? ALPHABETIC,BLANK
PUSH B ;SAVE B,C TEST
MOV B,A
RLC ;ROTATE MS BIT INTO CARRY
RLC
MOV A,B
POP B ;RESTORE B,C
RET
L3313: MVI A,77Q ; ERROR,O/P ?
CALL L1133 ; AND RESTART
RST 0
;
L5143: MOV A,M ;RST? RST TEST FOR
CPI 377Q ; LOAD SYMBOLIC
JNZ L5174 ;NO, GO TO ARG I/P
LXI H,LA024 ;YES, SET H,L TO RST BUFFER
CALL L1241 ;I/P
MOV A,M ;MASK INTO 377
ORI 307Q
MOV E,A
JMP L5354 ;CONTINUE IN ARG I/P
L5166: CALL L314 ;CALL 3 LETTER MATCH LOAD SYMB.
INX H ;LOAD MASKED INSTR ROUTINES (CONT)
MOV E,M ;CODE INTO E
DCX H ;GO TO FIRST BYTE
L5174: DCX H
L5175: DCX H
DCX H
MOV A,M ;MASK, ROTATE, TO GET ARG BITS
ANI 300Q
RLC
RLC
INX H ;GO TO SECOND BYTE
JZ L5302 ;NO ARG, GO TO INP DATA
DCR A ;1 ARG DEST, GO TO I/P
JZ L5271
DCR A ;2 ARG, GO TO I/P
JZ L5255
L5220: CALL L5371 ;ASSUME 1 ARG SOURCE
ANA E ;MASK ARG INTO INSTR BYTE
MOV E,A
JMP L5274 ;GO TO DATA I/P
L5230: INX H ; DEST. SUBSTITUTE
CALL L5371 ;I/P ARG
MOV B,A ;EXCEPTION TEST
MOV A,M
ANI 100Q
MOV A,B
JZ L5246
ORI 1
L5246: RLC ;ROTATE MASK INTO BYTE
RLC
RLC
ANA E
MOV E,A
DCX H ;SET H,L TO BYTE WITH DATA CODE
RET
L5255: CALL L5230 ;I/P DEST ARG I/P DEST,
L5260: CALL L3277 ;WAIT FOR NON-ALPHABETIC SOURCE ARG
JC L5260
JMP L5220 ;I/P SOURCE
L5271: CALL L5230 ;I/P DEST I/P DEST ARG
L5274: CALL L3277 ;WAIT FOR NON-ALPHABETIC
JC L5274
L5302: MOV A,M ;I/P BYTE WITH DATA CODE I/P DATA
LXI H,LA023 ;SET H,L TO DATA I/P BUFFER
ANI 300Q ;MASK
JZ L5354 ;NO DATA JUMP
RLC ;1 DATA JUMP
JNC L5362
CALL L5335 ;ASSUME 2 DATA BYTES
MOV M,D ;I/P MS BYTE
CALL LB74
L5326: MOV M,C ;I/P LS BYTE
CALL LB74
JMP L6041 ;GO TO NEXT LINE
L5335: CALL L1241 ;I/P BYTE TO BUFFER 2 DATA I/P
MOV C,M ;MOVE TO C SUBR
L5341: CALL L1241 ;I/P BYTE TO D
MOV D,M
L5345: CALL LB02 ;SET H,L TO CLP
MOV M,E ;MOVE INSTR BYTE TO MEM
JMP LB74 ;INCR CLP, RET
L5354: CALL L5345 ;NO DATA, MOVE INSTR
JMP L6041 ;BYTE TO MEM, GO TO NEXT LINE
L5362: CALL L5341 ;1 DATA BYTE
MOV C,D
JMP L5326
L5371: CALL L3277 ;WAIT FOR MATCH ARG
JNC L5371 ;ALPHABETIC LETTER
PUSH B ;SAVE B,C
LXI B,L4065 ;SET TO ARG TABLE
CALL L6012 ;SWEEP TABLE TO FIND CODE
INX B ;GO TO ARG CODE BYTE
LDAX B ;MOVE TO ACC
POP B ;RESTORE B,C
RET
L6012: PUSH D ;SAVE D,E SWEEP ARG
MVI E,10 ;SET COUNT TABLE SUBR
MOV D,A ;SAVE ACC IN D
L6016: LDAX B ;COMPARE BYTES
CMP D
JNZ L6025 ;NO GOOD, JUMP
POP D ;FOUND, RESTORE D,E
RET
L6025: DCR E
JZ L6067 ;END OF TABLE, ERROR
INX B ;GO TO NEXT ARG
INX B
JMP L6016 ;LOOP
LOC: CALL L2251 ;LOC PRINT CLP/
L6041: CALL L1355 ;CRLF
LXI H,LA000 ;O/P LS BYTE OF CLP AND /
CALL L1323
CALL L1372
POP PSW ;RESET STACK
JMP L133 ;GO TO BEG OF LOAD SYMBOLIC
DLP: CALL LB25 ;O/P CLP
JMP L6041
L6067: POP PSW ;RESET STACK ERROR ROUTINE
L6070: MVI A,77Q ;O/P
CALL L1133
JMP L133 ;GO TO BEG OF LOAD SYMBOLIC
DPS: CALL L2235 ;I/P RANGE DPS ROUTINE
L6103: SUB A ;CLEAR EXCEPTION FLAG MAIN PROG
STA LA011
CALL LB55 ;O/P CLP/
CALL LB66 ;O/P MEM AT CLP
CALL L7062 ;MATCH TEST PLUS RST TEST
CALL L7310 ;EXCEPTION TEST
CALL L1313 ;O/P BLANK
MVI B,6 ;SET MNEMONIC FIELD
CALL L7010 ;O/P MNEMONIC
MVI A,' ' ;FINISH MNEM. FIELD
CALL L3263 ;WITH BLANK
MVI B,3 ;SET ARG FIELD
CALL L7107 ;O/P ARG
CALL LC35 ;PRINTING FINISHED? IF NO, INCR CLP
LDA LA026 ;DATA BYTE TEST
ANA A
JZ L6103
PUSH PSW ;SAVE ACC DATA O/P
MVI A,' ' ;FINISH ARG FIELD
CALL L3263 ;WITH BLANK
POP PSW ;RESTORE ACC
DCR A ;1,2 DATA BYTE TEST
JZ L6217
CALL LB74 ;INCR CLP
CALL L1323 ;O/P MEM AT CLP
CALL LC06 ;DCR CLP
CALL L1326 ;O/P MEM AT CLP
CALL LB74 ;INCR CLP
L6211: CALL LC35 ;FINISHED? INCR CLP
JMP L6103 ;NEW LINE
L6217: CALL L1313 ;O/P BLANK
CALL L1326 ;O/P MEM AT CLP
JMP L6211 ;NEW LINE
L6230: LXI D,L4010 ;SET D,E TO BET FOR 2 BYTE TABLE MATCH
MVI A,2 ;SET TABLE FLAG (T.F.) TEST
L6235: STA LA030
MOV B,A ;SAVE ACC
CALL L6333 ;ARG TEST
MOV A,B ;RESTORE ACC
ADD E ;INCR D,E
MOV E,A
JNC L6253
INR D
L6253: LDAX D ;LOAD CODE INTO ACC
CMP C ;COMPARE WITH MEM
RZ
CALL L6265 ;END OF TABLE?
MOV A,B ;LOAD ACC WITH T.F.
JMP L6235 ;LOOP
L6265: CPI 363Q ;2 LETTER END END OF TABLE TEST
JZ L6325
CPI 351Q ;4 LETTER END
JZ L6320
CPI 377Q ;3 LETTER END
JZ L6313
CPI 343Q ;4 LETTER SECOND HALF
JZ L3313 ;ERROR, CODE NOT FOUND
INX D
RET
L6313: INR B ;SET T.F. TO 4
LXI D,L3321 ;D,E TO BEGINNING OF 4 LET TABLE
RET
L6320: DCR B ;SET T.F. TO 3
LXI D,L4217 ;SET D,E TO BEG OF 3 LET TABLE
RET
L6325: INR B ;SET T.F. TO 4
INR B
LXI D,L3376 ;SET D,E TO SEC HALF OF 4 LET TABLE
RET
L6333: LDAX D ;1 LET TO ACC ARG TEST
RLC ;ARG FLAG
RLC ;INTO LA027
ANI 3
STA LA027
JNZ L6350
MOV C,M ;NO ARG, C HOLDS INSTR
RET
L6350: DCR A ;1 OR 2 ARG
JNZ L6361
MOV A,M ;1 ARG DEST
ORI 70Q ;MODIFY INSTR
MOV C,A
RET
L6361: DCR A ;2 ARG OR 1 ARG SOURCE
JNZ L6372
MOV A,M ;2 ARG; MODIFY INSTR
ORI 77Q
MOV C,A
RET
L6372: MOV A,M ;1 ARG SOURCE
ORI 7
MOV C,A
RET
L6377: LDA LA030 ;T.F. TO ACC GO TO 1 LET SUBR
L7002: DCX D ;LOOP UNTIL D,E
DCR A ;POINT TO 1 LETTER
JNZ L7002
RET
L7010: CALL L6377 ;GO TO FIRST LETTER PRINT
LDA LA030 ;T.F. TO C MNEM. FIELD
MOV C,A
CALL L7050 ;PRINT FIRST LETTER
INX D ;SET CONDITION FOR SECOND LETTER
DCR C
LDAX D ;GENERATE DATA FLAG
ANI 300Q ;AND STORE AT LA026
RLC
RLC
STA LA026
CALL L7050 ;PRINT SECOND LETTER
L7037: DCR C ;END?
RZ
INX D ;NO, PRINT THE REST
CALL L7050
JMP L7037
L7050: LDAX D ;LOAD LET TO ACC PRINT ROUT
ANI 77Q ;CONVERT TO ASCII
ORI 100Q
L7055: CALL L1133 ;O/P
DCR B ;FIELD COUNT
RET
L7062: MOV A,M ;CHECK RST TEST
ANI 307Q ;FOR RST
CPI 307Q
JNZ L6230 ;NO
LXI D,L5142 ;YES, SET D,E AND TF
MVI A,3
STA LA030
RAR ;SET ARG FLAG
STA LA027
RET
L7107: LDA LA027 ;TEST FOR ARG PRINT ARG
ANA A
RZ ;NO
DCR A ;1 ARG DEST
JZ L7144
DCR A ;2 ARG
JZ L7243
L7124: MOV A,M ;ASSUME 1 ARG SOURCE
ORI 370Q
L7127: PUSH B ;SAVE B,C
LXI B,L4066 ;B,C POINT TO BEG OF ARG TABLE
CALL L6012 ;SWEEP ARG TABLE
DCX B ;LOAD ACC WITH LETTER IN ARG TABLE
LDAX B
POP B ;RESTORE B,C
JMP L7055 ;PRINT CONTENTS OF ACC
L7144: MOV A,M ;1 ARG DEST
ANI 307Q ;RST?
CPI 307Q
JNZ L7176 ;NO
MVI A,' ' ;YES, FINISH ARG FIELD
MVI B,4 ;WITH BLANK
CALL L3263
MOV A,M ;INSTR INTO ACC
ANI 70Q ;CONVERT TO OCTAL AND
LXI H,LA027 ;SEND TO MEM
MOV M,A
CALL L1326 ;PRINT OCTAL BYTE
RET
L7176: MOV A,M ;SP TEST
ANI 365Q
CPI 61Q
JZ L7255 ;PRINT SP
ANI 361Q ;PSW TEST
CPI 361Q
JZ L7270 ;PRINT PSW
MOV C,M ;EXCEPTION TEST
LDA LA011
CPI 367Q
JNZ L7230 ;NO EXCEPTION
ANA C ;YES, EXCEPT DECR ARG CODE BY 1
MOV C,A
L7230: MVI A,70Q ;GENERATE ARG CODE
ANA C
RRC
RRC
RRC
ORI 370Q
JMP L7127 ;GO TO PRINT
L7243: CALL L7176 ;DEST 2 ARG PRINT
CALL L1313 ;PRINT BLANK
DCR B ;FIELD COUNT
JMP L7124 ;SOURCE
L7255: MVI A,'S' ; PRINT "SP"
CALL L1133
MVI A,'P'
CALL L1133
RET
L7270: MVI A,'P' ; PRINT "PSW"
CALL L1133
MVI A,'S'
CALL L1133
MVI A,'W'
CALL L1133
RET
L7310: ADI 305Q ;EXCEPT EXCEPTION TEST
JZ L7325 ;SUSPECT
INR A
JZ L7325
INR A
JNZ L7350 ;NO EXCEPT. HALT TEST
L7325: MOV A,M ;NO EXCEPT
CPI 72Q
RZ
ANI 10Q ;NO EXCEPT
RZ
MVI A,367Q ;YES,EXCEPT.
STA LA011 ;SET EXECPT. FLAG
L7341: LDA LA030 ;INCR D,E TO
ADD E ;NEXT INSTR IN TABLE
MOV E,A
INX D
RET
L7350: MOV A,M ;HLT TEST
CPI 166Q
RNZ
SUB A ;HLT, SET ARG FLAG
STA LA027 ;AND INCR D,E TO NEXT INSTR
JMP L7341
;
LB000: CALL L2227 ;FORMAT CPY ROUT
LDA LA016 ;PROGRAMMER?
CPI 1
JNZ LB051 ;NO
LDA LA000 ;YES, LOWER LIMIT TO ACC
MOV D,A ;L.L TO D
LDA LA002 ;UPPER LIMIT TO ACC
SUB D ;UL-LL TO ACC
MOV C,A ;(UL-LL) TO C
LHLD LA004 ;NEW RANGE TO H,L
LB027: MOV A,D ;LL TO ACC
OUT 20Q ;DATA TO ACC
IN 2
MOV M,A ;DATA TO MEM
INX H ;INCR H,L
INR D ;LL=LL+1
DCR C ;COUNT
MVI A,377Q ;TEST
CMP C
JZ L0 ;FINISHED
JMP LB027 ;REPEAT
LB051: LHLD LA004 ;NO PRG, NEW RANGE TO H,L
LDA LA000 ;(LL-NR) TO B,C
SUB L
MOV C,A
LDA LA001
SBB H
MOV B,A
RET
LB067: JNC LB104 ;(LL-NR) > 0?
MOV A,C ;MOVES UP; TWO'S COMPL OF (LL-NR)
CMA
MOV C,A
MOV A,B
CMA
MOV B,A
INX B
JMP LB146
LB104: LXI H,LA000 ;MOVES DOWN
MOV A,M ;SUBTRACT (LL-NR) FROM LL
SUB C
MOV E,A
INR L
MOV A,M
SBB B
MOV D,A
LHLD LA000 ;COPY DATA
LB121: MOV A,M ;TO NEW LOCATION
STAX D
INX H
INX D
LDA LA002
CMP L
JNZ LB121
MOV A,M
STAX D
LDA LA003
CMP H
JNZ LB121
RET
LB146: LXI H,LA002 ;MOVES UP; (LL-NR) PLUS
MOV A,M ;UL INTO D,E
ADD C
MOV E,A
INR L
MOV A,M
ADC B
MOV D,A
LHLD LA002 ;COPY DATA TO NEW LOC
LB163: MOV A,M
STAX D
DCX H
DCX D
LDA LA000
CMP L
JNZ LB163
MOV A,M
STAX D
LDA LA001
CMP H
JNZ LB163
RET
CPY: CALL LB000 ;CPY ROUTINE STARTS HERE
CALL LB067
RST 0
;
; TABLE CONTAINING CODES FOR
; SHLD LHLD STA LDA LXI
;
LB217: DB 042Q,052Q,062Q,072Q,071Q
;
LB224: LHLD LA000 ;LL INTO H,L
CALL LB246 ;CALCULATION
RM
LHLD LA002 ;UL INTO H,L
CALL LB246 ;CALCULATION
RP
POP H ;MOVE UP STACK
JMP LC024 ;CHANGE THE ADDRESS
LB246: XCHG ;CALCULATE; SUBTRACT LL, UL
LHLD LA023 ;FROM JMP ADDRESS
INX H
MOV A,M
SUB E
INX H
MOV A,M
SBB D
RET
LB261: LHLD LA012 ;MMM PLUS (UL-LL) END
XCHG ;INTO D,E OF PROG?
LHLD LA023 ;POINTER INTO H,L
MOV A,L ;POINTER-[MMM-(UL-LL)]>0?
SUB E
MOV A,H
SBB D
RET
TRN: CALL L2221 ;TRN ROUTINE STARTS HERE TRN ROUT
CALL LB051 ;UP OR DOWN?
JNC LB324 ;MOVES UP
MOV A,C ;TWO'S COMPL OF LL-NR
CMA
MOV C,A
MOV A,B
CMA
MOV B,A
INX B
SUB A ;MOVES UP FLAG
STA LA014
JMP LB331
LB324: MVI A,1 ;MOVES DOWN
STA LA014
LB331: CALL LC103 ;CALCULATE MMM + (UL-LL)
LB334: SHLD LA023 ;POINTER INTO H,L
PUSH B ;SAVE B
CALL L6230 ;MATCH ROUT
CALL L7310 ;EXCEPTION ROUT
POP B
LDAX D ;CODE TO LA016
STA LA016
CALL L6377 ;FIRST LETTER SUBR
INR E ;SECOND LETTER
LDAX D ;DATA BYTE TEST
MVI E,300Q
ANA E
CPI 0 ;NO DATA BYTE
JZ LC100
CPI 100Q ;1 DATA BYTE
JZ LC077
LDA LA016 ;ASSUME 2 DATA BYTES
LXI H,LB217 ;IS IT SHLD,LHLD,STA,LDA,LXI?
MVI E,5
LC005: CMP M
JZ LC073 ;YES, NO CHANGE
INR L
DCR E
JNZ LC005
CALL LB224 ;OUT OF RANGE?
JMP LC073 ;YES, NO CHANGE
LC024: LHLD LA023 ;CHANGE
INX H
LDA LA014 ;MOVES DOWN?
ANA A
JNZ LC061
MOV A,M ;MOVES UP; ADD(LL-NR)
ADD C ;TO ADDR OF JUMP
MOV M,A
INX H
MOV A,M
ADC B
MOV M,A
LC046: INX H
SHLD LA023 ;INCREMENTED POINTER TO LA023
CALL LB261 ;END OF PROG?
JM LB334 ;NO, NEW LINE
RST 0
LC061: MOV A,M ;MOVES DOWN; SUBTRACT
SUB C ;(LL-NR) FROM ADDR
MOV M,A
INX H
MOV A,M
SBB B
MOV M,A
JMP LC046 ;NEW LINE
LC073: LHLD LA023 ;NO CHANGE
INX H
LC077: INX H
LC100: JMP LC046
LC103: PUSH B ;SAVE B,C
LHLD LA002 ;UL-LL
XCHG
LHLD LA000
MOV A,E
SUB L
MOV E,A
MOV A,D
SBB H
MOV D,A
LHLD LA006 ;MMM PLUS (UL-LL)
MOV A,E
ADD L
MOV L,A
MOV A,D
ADC H
MOV H,A
SHLD LA012
LHLD LA006
POP B ;RESTORE B,C
RET
PRG: CALL L2235 ;I/P LL, UL PRG ROUTINE
CALL L1355 ;CRLF
MVI A,'%' ;O/P %
CALL L1133
CALL LA01 ;I/P LETTER
RLC
RLC
MOV E,A
LHLD LA000 ;LL INTO H,L
LC166: MOV A,L ;COMPARE ROM WITH MEM
OUT 20Q
IN 2
CMP M
CNZ LC225 ;PROGR IF NOT EQUAL
LDA LA002 ;END OF PROGRAM?
CMP L
JNZ LC221
LDA LA003
CMP H
JNZ LC221
CALL LC225 ;YES, PROGR LAST
RST 0
LC221: INX H ;NEW BYTE
JMP LC166
LC225: MVI B,1 ;PROGR 4 TIMES LONGER
CALL LC252
MOV A,B
RLC
RLC
MOV B,A
LC236: CALL LC252
DCR B
JNZ LC236
MOV A,B ;OUTPUT NULL CHAR
CALL L1133
RET
LC252: MOV A,M ;PROGRAM UNTIL ROM
CMA ;BYTE HOLDS DESIRED
OUT 22Q ;DATA; MAX 255 PULSES
MVI A,4
OUT 26Q
XRA A
OUT 26Q
MOV C,E
LC266: MVI D,350Q
LC270: DCR D
JNZ LC270
DCR C
JNZ LC266
IN 2
CMP M
RZ
INR B
JNZ LC252
CALL LB25
MVI A,77Q
CALL L1133
RST 0
;
L3321: DB 003Q,201Q,214Q,014Q,315Q,120Q,025Q,223Q
DB 010Q,375Q,030Q,003Q,210Q,007Q,353Q,023Q
DB 210Q,214Q,004Q,042Q,014Q,210Q,214Q,004Q
DB 052Q,123Q,024Q,201Q,030Q,072Q,114Q,004Q
DB 301Q,030Q,072Q,030Q,003Q,210Q,007Q,353Q
DB 030Q,024Q,210Q,014Q,343Q
L3376: DB 023Q,020Q,210Q
DB 014Q,371Q,020Q,003Q,210Q,014Q,351Q
L4010: DB 012Q
DB 203Q,332Q,012Q,232Q,312Q,012Q,220Q,362Q
DB 012Q,215Q,372Q,003Q,203Q,334Q,003Q,232Q
DB 314Q,003Q,220Q,364Q,003Q,215Q,374Q,022Q
DB 003Q,330Q,022Q,032Q,310Q,022Q,020Q,360Q
DB 022Q,015Q,370Q,011Q,116Q,333Q,005Q,011Q
DB 373Q,004Q,011Q,363Q
L4065: DB 102Q
L4066: DB 370Q,103Q,371Q
DB 104Q,372Q,105Q,373Q,110Q,374Q,114Q,375Q
DB 115Q,376Q,123Q,376Q,120Q,376Q,101Q,377Q
L4111:
DB 'XQT'
DW XQT
DB 'LOC'
DW LOC
DB 'DPO'
DW DPO
DB 'LDO'
DW LDO
DB 'DLP'
DW DLP
DB 'EDT'
DW EDT
DB 'SBP'
DW SBP
DB 'CBP'
DW CBP
DB 'DPS'
DW DPS
DB 'CPY'
DW CPY
DB 'TRN'
DW TRN
DB 'PRG'
DW PRG
DB 0,0,0
DW 0
DB 0,0,0
DW 0
L4217: DB 003Q,015Q
DB 003Q,077Q,215Q,017Q,026Q,177Q,010Q,014Q
DB 024Q,166Q,115Q,126Q,011Q,076Q,111Q,016Q
DB 022Q,074Q,104Q,003Q,022Q,075Q,301Q,004Q
DB 004Q,207Q,301Q,004Q,003Q,217Q,323Q,025Q
DB 002Q,227Q,323Q,002Q,002Q,237Q,301Q,016Q
DB 001Q,247Q,330Q,022Q,001Q,257Q,317Q,022Q
DB 001Q,267Q,303Q,015Q,020Q,277Q,001Q,104Q
DB 011Q,306Q,001Q,103Q,011Q,316Q,023Q,125Q
DB 011Q,326Q,023Q,102Q,011Q,336Q,001Q,116Q
DB 011Q,346Q,030Q,122Q,011Q,356Q,017Q,122Q
DB 011Q,366Q,003Q,120Q,011Q,376Q,022Q,014Q
DB 003Q,007Q,022Q,022Q,003Q,017Q,022Q,001Q
DB 014Q,027Q,022Q,001Q,022Q,037Q,012Q,215Q
DB 020Q,303Q,012Q,216Q,003Q,322Q,012Q,216Q
DB 032Q,302Q,012Q,220Q,005Q,352Q,012Q,220Q
DB 017Q,342Q,003Q,216Q,003Q,324Q,003Q,216Q
DB 032Q,304Q,003Q,220Q,005Q,354Q,003Q,220Q
DB 017Q,344Q,022Q,005Q,024Q,311Q,022Q,016Q
DB 003Q,320Q,022Q,016Q,032Q,300Q,022Q,020Q
DB 005Q,350Q,022Q,020Q,017Q,340Q,017Q,125Q
DB 024Q,323Q,014Q,204Q,001Q,072Q,120Q,017Q
DB 020Q,371Q,023Q,224Q,001Q,062Q,114Q,230Q
DB 011Q,071Q,104Q,001Q,104Q,071Q,111Q,016Q
DB 030Q,073Q,104Q,003Q,130Q,073Q,003Q,015Q
DB 001Q,057Q,023Q,024Q,003Q,067Q,004Q,001Q
DB 001Q,047Q,016Q,017Q,020Q,000Q,122Q,023Q
DB 024Q
L5142: DB 377Q
;
;
LA000: DS 1
LA001: DS 1
LA002: DS 1
LA003: DS 1
LA004: DS 1
LA005: DS 1
LA006: DS 1
LA007: DS 1
LA010: DS 1
LA011: DS 1
LA012: DS 1
LA013: DS 1
LA014: DS 2
LA016: DS 1
LA017: DS 1
LA020: DS 1
LA021: DS 1
LA022: DS 1
LA023: DS 1
LA024: DS 2
LA026: DS 1
LA027: DS 1
LA030: DS 50Q
LA100: DS 2
LA102: DS 2
LA104: DS 2
LA106: DS 2
LA110: DS 2
LA112: DS 2
END