|
|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 53590 (0xd156)
Description: Bits:30001846 Debug-source til ROA640
Types: 8-hole paper tape, TextFileEvenParity
; 1981.05.06 RC3502 DEBUGGER. KNEH.
; LOG: DEBUG 039 - BJ -
;
;
; DATE: 1981-05-06
;
; LISTING : RCSL 52-AA 1046
; SOURCE TAPE : RCSL 52-AA 1047
; ROM NO. : ROA 640
;
; DEBUG CONSOLE PROGRAM TO RC3502 MINICOMPUTER.
; 1981.01.22 KNEH VER0004.
; DEBUG COMMANDS:
; --------------
; R RUN.
; C INSTRUCTION STEP ON CURRENT LEVEL
; C<ANTAL STEP>
; S INSTRUCTION STEP.
; S<ANTAL STEP>
; L<LEVEL> MODIFY LEVEL REGISTER.
; M<MODUL><ADDR>MODIFY MEMORY.
; W<REG-ADDR> MODIFY W-REG.
; Y<ADDR> MODIFY MICROPROCESSOR RAM
; <ESC> TERMINATE CURRENT COMMAND.
;
.TITLE DBU35
; DEBUG MODE SWITCH SET TABLE.
; SWITCH STATE
; 0 , 8 300BPS RUN TEST LOOP
; 1 , 9 1200BPS RUN TEST LOOP
; 2 , A 300BPS SKIP TEST
; 3, B 1200BPS SKIP TEST
; 4 , C 300BPS RUN TEST NO LOOP
; 5 , D 1200BPS RUN TEST NO LOOP
; 6 , E 300BPS SKIP TEST
; 7 , F 1200BPS SKIP TEST
;
; SWITCH STATE 8-F SAME AS 0-7 BUT WITH BLOCKED
; TERMINAL MODE( BELL WILL NOT SWITCH TO DEBUG ).
; RUN TEST MEANS THAT THE BUILT-IN TEST ROUTINES AL-
; WAYS ARE EXECUTED AFTER PUSHING AUTOLOAD.
; SKIP TEST THE BUILT-IN TEST ROUTINES ARE SKIPPED.
; LOOP THE BUILT IN TEST FOREVER.
; NO LOOP EXECUTE 1 PASS.
; TERMINAL MODE:
; 1 START - 8 DATA - NO PARITY - 1 STOP
\f
; OUTPUT INFIRMATION ON THE OPERATOR CONSOLE IF THE
; BUILT-IN TEST DETECT AN ERROR.
; 1 8085 COMMUNICATION TEST.
; OUTPUT: ERR 1 <DUMMY> <DUMMY>
; Y<5D> GIVES 6 XMT DATA
; Y<70> GIVES 6 BYTES RECEIVED DATA
; 3 COMMUNICATION TEST
; L REQUEST TO M
; OBS !!!!! NO CONSOLE OUTPUT
; ONLY ON LAMPS
; 5 WORKING ADDRESS REGISTER TEST.
; OUTPUT: ERR 5 <ADDRESS> <WANTED DATA>
; W<ADDRESS> GIVES READ DATA.
; 7 WORKING REGISTER DATA TEST.
; OUTPUT: ERR 7 <ADDRESS> <WANTED DATA>
; 9 MEMORY ADDRESS TEST.
; OUTPUT: ERR 9 <OFFSET ADDRESS> <WANTED DATA>
; Y<40> GIVES THE MEMORY MODULE NUMBER.
; M<MODULE:OFFSET> GIVES READ DATA.
; B MEMORY DATA TEST. PATTERN: 5555
; OUTPUT: ERR B <OFFSET ADDRESS> <WANTED DATA>
; Y<40> GIVES THE MEMORY MODULE NUMBER.
; M<MODULE,OFFSET> GIVES READ DATA.
; D MEMORY DATA TEST. PATTERN: AAAA
; OUTPUT: ERR D <OFFSET ADDRESS> <WANTED DATA>
; Y<40> GIVES THE MEMORY MODULE NUMBER.
; M<MODULE,OFFSET> GIVES READ DATA.
; RUN CONTROL
; THE EXECUTION OF THE BUILT-IN TEST IS CONTROLLED
; BY THE MODE SWITCH ON THE FRONT PANEL OF CPU201.
; THE BUILT-IN CAN BE SKIPPED OR EXECUTED ONCE .
; OR LOOP FOREVER DURING EXECUTION THE "TM" LAMP IS
; LIT.
; THE 4 LAMPS (TM-LP-RP-OP) GIVES THE TEST PROGRAM
; NUMBER.
;
\f
; DEBUG RAM LAYOUT
;
; 00: RTC ITR-LEVEL
; 01: TTO/WRITE RAM LEVEL
; 02: TTI LEVEL
; 03: TIMER LSB
; 04: TIMER MSB
; 05: WATCH DOG LSB
; 06: WATCH DOG MSB
; 07: TTI INPUT
; 08: TTO OUTPUT
; 09: MICRO PROGRAM VERSION NUMBER
; 0A: SWITCH MIRROR 0-7
; 0B: SWITCH MIRROR 8-15
; 0C: I/O LEVEL 0-7
; 0D: " 8-15
; 0E: " 16-23
; 0F: " 24-31
; 10: " 32-39
; 11: " 40-47
; 12: " 48-55
; 13: " 56-63
; 14: " 64-71
; 15: " 72-79
; 16: " 80-87
; 17: " 88-95
; 18: " 96-103
; 19: " 104-111
; 1A: " 112-119
; 1B: " 120-127
; 1C: RAM CONFIGURATION 0-7
; 1D: " " 8-15
; 1E: PROM " 0-7
; 1F: " " 8-15
.RDXO 16
.RDX 16
; M <----> L COMMUNICATIONS CODES
AUCOM= 35 ; AUTOLOAD
CONCOM= 10 ; SET LEVEL (CONSOLE)
GLCOM= 37 ; GET LEVEL
GMCOM= 3B ; GET MEM
GRCOM= 3F ; GET REG
INILA= 37 ; INIT LAMDA
PMCOM= 39 ; PUT MEM
PRCOM= 3D ; PUT REG
RACOM= 31 ; WRITE DATA TO L VIA FIFO
RDCOM= 30 ; READ COMM M TO L (FIFO)
ROFF= 34 ; REGEISTER OFFSET (TABLE)
RUNB= 80 ; CS7 (RUN COMM.)
SECUR= 3C ; SINGLE STEP ON CURR LEVEL
SEXEC= 38 ; SINGLE STEP
TIMCM= 20 ; SET LEVEL TIMER
TSCOM= 3E ; TEST COMM
TSLEV= 36 ; TEST LEVEL COMM.
TTICOM= 0 ; CONSOLE ITR
WREQC= 33 ; L REQUEST
\f
; MICROPROCESSOR HARDWARE CONFIGURATION.
;
; ADDR. 0- FFF PROM MEMORY.
; ADDR. 4000- 40FF RAM MEMORY.
; I/O DEVICES:
; 40 8155 COMMAND/STATUS.
; 41 8155 A-PORT.
; 42 8155 B-PORT.
; 43 8155 C-PORT.
; 44 8155 LOW ORDER TIMER.
; 45 8155 HIGH ORDER TIMER.
; OUT 0 CLEAR MREQ.
; OUT 10 SET MREQ.
; OUT 30 OUTPUT-REG TO L
; IN 20 INPUT-REG FROM L
RAMB= 4000
COMMX= 40
PORTA= COMMX+1
PORTB= COMMX+2
PORTC= COMMX+3
TIML= COMMX+4
TIMH= COMMX+5
CDO= 30
CDI= 20
CREQ= 0
SREQ= 10
SCR= 10
SPINIT= 4100
COMA= 3E ; A=INPUT,B-C=OUTPUT.
TIMLI= 80
TIMHI= 2+0C0
IMASK= 0D8
REGSP= 1
\f
.LOC 4000
TIMLV: 0 ; TIMER LEVEL.
TTOLV: 0
TTILV: 0
TIMOUT: DWC. 0
WADOG: DWC. 0 ; WATCHDOG. BIT7=0 ENABLE WATCHDOG.
DTIN: 0
DATOUT: 0
VERNO: 0 ; MICRO PROGRAM NUMBER
SWITCH: DWC. 0
.LOC 403E
TIMCOUMT: DWC. 0 ; TIMER COUNT DOWN
RCAB: 0 ; MODULE NUMBER UNDER TEST.
BRATE: 0 ; BAUD RATE. 0=> 300, 1=> 1200
BCOUNT: 0
0
COMM: 0 ; DEBUG COMMAND.
DWC. 0 ; ADD.
DWC. 0 ; DATA0.
DWC. 0 ; DATA1.
DWC. 0 ; DATA2.
DWC. 0 ; DATA3.
DWC. 0 ; DATA4.
DWC. 0 ; DATA5.
DWC. 0 ; DATA6.
DWC. 0 ; DATA7.
INBUF: DWC. 0
DWC. 0
DWC. 0
MBUF: DWC. 0
DWC. 0 ; TRANSFER BUFFER TO RC3502.
DWC. 0
MBASE: DWC. 0
LSAV: DWC. 0 ; SAVE LEVEL.
POINT: 0
0
0
CHSAV: 0
BASA: DWC. 0
BSAV: 0
ITRCOM: 0 ; =1 WANTED 7.5 REQUEST.
SETCOM: 0 ; =1 TIMER/CONSOLE LEVEL REQUEST.
ABUF: DWC. 0
DWC. 0
DWC. 0
DBUF: DWC. 0
FCOM: 0 ; TTY INPUT <NEW>
SCOM: 0 ; TTY INPUT <OLD>
CSUPD: 0 ; SWITCH UPDATE 0 => UPDATE
TIMCX: 0
TSCONT: DWC. 0 ; TEST CONSTANT.
WPATT: DWC. 0 ; WANTED PATTERN.
RPATT: DWC. 0 ; READ PATTERN.
PASSC: 0
UPDAT: 0 ; UPDATE MASK.
XOUTDELAY: 0
OUTPASE: 0
INDELAY: 0
INPASE: 0
XOUTCHAR: 0
INCBUF: 0
XINCHAR: 0
CHARRDY: 0
BHALF: 0
DOHALF: 0
ITEST: 0
TTESX: 0
XAUTO: 0
NUMBER: 0
\f
; CONSTANTS
BELL= 07
BSPACE= 08
CR= 0D
CURR= 20
HOME= 1D
KTS02= 0502
KTS03= 0703
KTS04= 0904
KTS05= 0B05
KTS09= 0D05
LF= 0A
MXLEV= 7F ; MAX LEVEL 127
RAML= 40
ROMCH= 0AA
SSTRT= 80
STOPB= 0C0
STRT= 40
SW0= 10
SW1= 20
TAB= 09
TITRC= 0008 ; ITR FREQUENCY APP 20 MS
TSMON= 5555
TSMIN= 0AAAA
US= 1F
XCR= 60
XSPACE= 20
ZEZE= 3030
ESC= 1B ; ESCAPE VALUE.
\f
.RDX 8
.LOC 0
JMP INIT
TTYTXT: CR ; BUSTIMER
LF
"T
CR
LF
0
DBTXT: CR
LF
"D
0
INITX: HOME ; RC350
US
"R
"C
"3
"5
"0
0
INITY: 40 ; DEBUG VER0
"M
"I
"C
"R
"O
40
"V
"E
"R
"0
0
CRTXT: CR ; CR
LF
0
.LOC 44
JMP TRAP
TXTC: CR ; *
LF
"*
0
ERRTXT: CR ; ERR
LF
"E
"R
"R
0
CONTB: 200
100
40
20
10
4
2
1
.LOC 74
JMP INT75
\f
; FUNCTION: CI.
; INPUTS: NONE.
; CALLS: FBIT,HBIT.
; DESTROY'S: A,F/F'S.
; DESCRIPTION: CI WAITS UNTIL A CHARACTER HAS BEEN
; ENTERED AT THE DEBUG TERMINAL AND THEN RETURNS THE
; CHARACTER,VIA THE A REGISTER,TO THE CALLING ROUTINE.
CI: PUSH H ; SAVE HL.
CI01: LXI H,CHARRDY
MOV A,M
ORA A
JZ CI02 ; CHARACTER NOT READY.
MVI M,0
DCX H
MOV A,M
ANI 177
POP H
RET
CI02: LXI H,ITEST
MOV A,M
ORA A
JNZ ABORT
INX H
MOV A,M
ORA A
CZ ITRBE
INX H
MOV A,M
ORA A
JNZ CI01
ABORT: XRA A
POP H
RET
ITRBE: PUSH HL
PUSH DE
PUSH BC
CALL TIMITR
POP BC
POP DE
POP HL
RET
\f
; FUNCTION: CO.
; INPUTS: C-CHARACTER TO OUTPUT TO TTY.
; OUTPUTS: C-CHARACTER TO OUTPUT TO TTY.
; CALLS: FBIT.
; DESTROY'S: A,F/F'S.
; DESCRIPTION: CO SEND ITS INPUT ARGUMENT TO THE TTY.
CO: LDA TTESX
ORA A
CZ ITRBE
LDA OUTPASE
ORA A
JNZ CO ; JUMP IF NOT READY TO SEND.
MOV A,C
ORI 200
STA XOUTCHAR
MVI A,2
STA OUTPASE
RET
BETJEN: LDA XAUTO
PUSH B
PUSH D
ORA A
CZ AUTOL
LDA TTESX
ORA A
CZ TIMITR
LDA ITEST
ORA A
CNZ WRREQ
POP D
POP B
RET
\f
; FUNCTION: CNVBN.
; INPUTS: C-ASCII CHARACTER '0'-'9','A'-'F'.
; OUTPUTS: A- 0-F.
; DESTROY'S: A,F/F'S.
; DESCRIPTION: CNVBN CONVERTS THE ASCII REPRESENTATION OF
; A HEX NUMBER INTO ITS CORRESPONDING BINARY VALUE.
CNVBN: MOV A,C
SUI "0 ; SUBTRACT "0" FROM ARGUMENT.
CPI 10. ; TEST RESULT FOR 0-9.
RM ; IF SO ALL DONE.
SUI 7
RET
; FUNCTION: PRVAL.
; INPUTS: A-INTEGER,RANGE 0-F.
; OUTPUTS: A AND C-ASCII CHARACTER.
; DESCRIPTION: PRVAL CONVERTS A NUMBER IN THE RANGE 0-F.
; HEX TO THE CORRESPONDING ASCII CHARACTER,0-9,A-F.
; PRVAL DOES NOT CHECK THE VALIDITY OF ITS INPUT ARGUMENT.
PRVAL: ANI 17
CPI 10. ; ARGUMENT IN RANGE 0-9 ?
JC LESS ; YES
SUI 1
ANI 7
ADI 100 ; ADD ACSII BASE+16.
MOV C,A
RET
LESS: ADI 60 ; ADD ASCII BASE
MOV C,A
RET
; FUNCTION: VALDG.
; INPUTS: C-ASCII CHARACTER.
; OUTPUTS: CARRY-1 IF CHAR REPRESENTS VALID HEX DIGIT.
; -0 OTHERWISE.
; DESCRIPTION: VALDG RETURNS SUCCESS IF ITS INPUT ARGUMENT
; IS AN ASCII CHARACTER REPRESENTING A VALID HEX
; DIGIT (0-9,A-F), AND FAILURE OTHERWISE.
VALDG: MOV A,C
CPI "0 ; TEST CHAR AGAINST "0.
JM FRET ; IF ASCII CODE LESS,CANNOT BE
; VALID DIGIT.
CPI "9 ; ELSE SEE IF IN RANGE "0-"9.
JM SRET ; CODE BETWWEEN "0 AND "9.
JZ SRET ; CODE EQUALS "9.
CPI "A ; TRY "A LETTER.
JM FRET ; CODE BETWEEN "9 AND "A.
CPI "G
JM SRET
FRET: STC
CMC ; ZERO TO CARRY
RET
SRET: STC ; ONE TO CARRY
RET
\f
; PROCEDURE TO CALCULATE MICROPROCESSOR RAM ADDRESS.
; INPUT: (COMM-1)= OFFSET
; (COMM+1)= BASE ADDRESS
; OUTPUT: HL= (OFFSET+BASE ADDRESS)&(3F)+4000.
MRAMC: LXI H,COMM-1
PUSH D
PUSH PSW
MOV E,M ; GET OFFSET
MVI D,0
LHLD COMM+1 ; RELATIV ADDR
DAD D ; ADD OFFSET
LXI D,RAMB ; RAM BASE
DAD D ; ADD OFFSET
POP PSW
POP D
RET
; ROUTINE TO OUTPUT 2SPACES TO TTY TERMINAL.
DSPACE: MVI C,XSPACE
CALL CO
JMP CO
; ROUTINE TO OUTPUT A SEQUENCE: CR-LF-*.
DCLEAR: CALL OTXT
DWC. TXTC
RET
; ROUTINE TO MOVE THE CURSOR RIGHT THE NUMBER OF
; POSITIONS SPECIFIED IN A.
CRIGHT: PUSH B
MOV B,A ; B=COUNT.
CRLOP: MVI C,CURR
CALL CO ; OUTPUT CURSOR RIGHT
DCR B ; MORE STEPS ?
JNZ CRLOP ; YES
POP B
RET
\f
; PROCEDURE TO OUTPUT A STRING OF CHARACTERS.
; CALLED BY CALL OTXT
; DWC. <STRING ADDRESS>.
; THE TXT STRING SHOULD BE TERMINATED BY 0.
OTXT: POP H
PUSH H ; HL= TXT ADDRESS
MOV E,M
INX H
MOV D,M
XCHG
OTX02: MOV C,M
MOV A,C
CPI 0 ; TEXT FINISH ?
JZ OTX01 ; YES
CALL CO ; NO
INX H
JMP OTX02
OTX01: POP H
INX H ; RESTORE STACKP.
INX H
PUSH H
RET
; ROUTINE TO OUTPUT CR.
CRCUR: CALL OTXT
DWC. CRTXT
RET
; ROUTINE TO CONVERT THE 4 ASCII CHARS IN INBUF
; TO A 16 BITS INTEGER PLACED IN HL.
CINBF: LXI H,INBUF ; HL=BUFFER POINTER.
MOV C,M
CALL SPCONV ; CONVERT 1 TO BINARY.
MOV D,A ; SAVE LEFT PART IN D
INX H
MOV C,M
CALL CNVBN ; CONVERT 2 TO BINARY
ADD D ; ADD LEFT PART
MOV D,A ; SAVE 1-2 DIGIT I D
INX H
MOV C,M
CALL SPCONV ; CONVERT 3 TO BINARY
MOV E,A ; SAVE LEFT PART IN E
INX H
MOV C,M
CALL CNVBN ; CONVERT 4 TO BINARY
ADD E ; ADD LEFT PART
MOV E,A ; SAVE 3-4 DIGIT IN E
XCHG
RET
\f
; ROUTINE TO PUT DE INTO DATAX
; USING (COMM-1) AS OFFSET.
SVDE: LXI H,COMM+3 ; FIRST DATA.
LDA COMM-1
RAL ; TABLE MODULUS 2
ANI 376
MOV C,A
MVI B,0 ; BC=OFFSET IN TABLE
DAD B
MOV M,E ; SAVE LSB
INX H
MOV M,D ; SAVE MSB
RET
; ROUTINE TO OUTPUT THE CONTENTS OF DE TO THE TTY.
LOUTDE: XCHG
OUTDE: MOV A,D
PUSH B
CALL SPRIGHT
CALL PRVAL ; HEX TO ASCII.
CALL CO ; OUTPUT 1'ST CHAR
MOV A,D
CALL PRVAL ; HEX TO ASCII
CALL CO ; OUTPUT 2'D CHAR
MOV A,E
CALL SPRIGHT
CALL PRVAL ; HEX TO ASCII
CALL CO ; OUTPUT 3'TH CHAR
MOV A,E
CALL PRVAL ; HEX TO ASCII
CALL CO ; OUTPUT 4'TH CHAR
POP B
RET
\f
; ROUTINE TO INPUT MAX 4HEX DIGIT TO CURRENT DATX.
; IF INPUT=SPACE THEN TAKE OLD DIGIT IN DATX.
; IF INPUT=BACKSPACE THEN TAKE OLD.
; IF INPUT=(CR,+,-) THEN TERMINATE THE COMMAND.
DATIN: XRA A
STA INBUF+4 ; RESET DIGIT POINTER.
DAT03: CALL GETDI ; :C = ASCII DIGIT
LXI H,INBUF+4
MOV E,M ; DIGIT POINTER
MVI D,0
LXI H,INBUF
DAD D
MOV M,C ; STORE ASCII CHAR
LXI H,INBUF+4
INR M ; IMCR. DIGIT POINTER
MOV A,M
CPI 4 ; NEXT GROUP ?
JNZ DAT03 ; NO
MVI A,3
STA INBUF+4 ; 3 TO DIGIT POINTER
LDA POINT+2
ORA A
JNZ DAT01
XRA A
STA INBUF+4
DAT01: XRA A
STA POINT+2
CALL CI ; WAIT TTY INPUT
MOV C,A
CPI CR
JZ CREND ; CR <TERMINATION>
CPI "+
JZ PLUSE ; + NEXT 8 GROUP
CPI "-
JZ MINUS ; - PREVIOUS 8 GROUP
CPI ESC
JZ CANCEL ; BACK SPACE
CPI TAB
JZ NTAB ; TABULATION
CPI XSPACE
JZ SPACE ; SPACE
CALL VALDG ; TEST FOR HEX DIGIT.
JNC DAT01 ; NO VALID DIGIT
CALL CO ; ECHO DIGIT
CALL FUPDAT
DAT02: LXI H,INBUF+4
MOV E,M ; FETCH DIGIT POINTER
MVI D,0
LXI H,INBUF
DAD D ; ADD BASE
MOV M,C ; SAVE CHAR.
DAT40: LXI H,INBUF+4
INR M ; INCR. DIGIT POINTER
MOV A,M
CPI 4 ; LAST IN 4 GROUP ?
JZ NEND ; YES
JMP DAT01
\f
SPACE: MVI C,CURR ;
CALL CO ; STEP CURSOR RIGHT
JMP DAT40
CREND: POP H
LXI D,2 ; INCRM. TO RETURN ADDR LCR
DAD D
XEND: MOV E,M ; FETCH LSB RETURN ADDR
INX H
MOV D,M ; FETCH MSB RETURN ADDR
PUSH D
JMP UPBUF
PLUSE: POP H
LXI D,4
DAD D ; INCRM. TO RETURN ADDR LPLUS
JMP XEND
MINUS: POP H
LXI D,6
DAD D ; INCRM. TO RETURN ADDR LMINUS
JMP XEND
NEND: POP H
LXI D,10
DAD D ; INCRM. TO RETURN ADDR DSPACE
PUSH H
JMP UPBUF
\f
; ROUTINE TO GET THE DIGIT INTO C DEFINED BY
; ADDRESS OFFSET IN (COMM-1)
; AND DIGIT POINTER IN (INBUF+4).
GETDI: LXI H,COMM-1
MOV A,M ; GET ADDRESS OFFSET.
MVI D,0
RAL ; 2 BYTE TABLE SPACE
ANI 376
MOV E,A ; :DE
LXI H,COMM+3
DAD D ; :HL POINT TO DATA(X).
LDA INBUF+4
MOV B,A ; SAVE DIGIT POINTER.
RAR ; 2 BYTE EACH DATA(X)
XRI 1
MOV E,A
DAD D ; :HL POINT OUT THE BYTE
MOV E,M ; FETCH BYTE (2 CHAR)
MOV A,B ; RELOAD DIGIT POINTER
ANI 1 ; IS IT LEFT PART ?
JZ LEFT ; YES
MOV A,E
RIGHT: JMP PRVAL ; HEX TO ASCII
LEFT: MOV A,E
CALL SPRIGTH
JMP PRVAL
; ROUTINE TO UPDATE INBUF AFTER TERMINATION AND STORE
; INBUF INTO DATX.
UPBUF:
UPYES: CALL CINBF ; CONVERT INBUF TO BINARY
XCHG
JMP SVDE ; SAVE IT IN DATA(X)
MCALCA: PUSH D
LHLD COMM+1 ; MEM OFFSET
LDA COMM-1
ADD A ; MODULUS 2
MVI D,0
MOV E,A
DAD D ; OFFSET (TOTAL)
POP D
RET ; HL= ADDRESS.
\f
; ROUTINE TO SAVE DAT0-7 INTO RC3502/3 MEMORY.
MSTORE: XRA A
STA COMM-1 ; RESET ADDRESS COUNTER.
MVI A,8.
STA BSAV ; NUMBER OF REG
MM10: LDA COMM-1 ; ADDRESS COUNT.
RAL ; TABLE MODULUS 2
ANI 16
MVI D,0
MOV E,A
LXI H,COMM+3
DAD D ; :HL= ADDR IN DATA(X)
MOV E,M
INX H
MOV D,M ; DE=DATA.
CALL MCALCA ; HL=ADDRESS.
SHLD ABUF+2 ; ADDR TO ABUF+2
XCHG
SHLD DBUF ; DATA TO DBUF
XCHG
LDA UPDAT ; FETCH UPDAT
RAL ; ANY CHANGE ?
STA UPDAT
JNC ML10 ; NO
CALL PMEM ; YES - WRITE NEW CONTENTS IN MEM
ML10: CALL INCCM
JNZ MM10
RET
; ROUTINE TO OUTPUT THE CONTENTS OF A AS
; TWO HEX DIGITS.
CHEX: PUSH PSW
CALL SPRIGHT ; FETCH LEFT PART
CALL PRVAL ; HEX TO ASCII
CALL CO
POP PSW
CALL PRVAL ; HEX TO ASCII
JMP CO
\f
; ROUTINE TO TAKE THE CONTENTS OF
; INBUF,INBUF+1 AND STORE THE VALUE INTO THE
; MICROPROCESSOR RAM.
RCONV: LDA INBUF
MOV C,A
CALL SPCONV ; ASCII TO HEX+SHIFT LEFT <4
MOV E,A ; SAVE LEFT PART
LDA INBUF+1
MOV C,A
CALL CNVBN ; ACSII TO HEX
ANI 17
ADD E ; ADD LEFT + RIGHT
CALL MRAMC
MOV M,A ; STORE RESULT
RET
; ROUTINE TO STORE INTO MICROPROCESSOR RAM.
NSTORE: MOV A,B
CPI 2 ; IS RAM ALREADY STORED ?
RZ ; YES RETURN
ORA A
JZ RCONV ; YES STORE LAST GROUP
VAL1: LDA INBUF ; FETCH FIRST DIGIT
MOV C,A
CALL SPCONV ; ASCII TO HEX+SHIFT LEFT <4
MOV C,A
CALL MRAMC
MOV A,M
ANI 17
ADD C ; ADD 2'D DIGIT
MOV M,A ; STORE
RET
; ROUTINE TO CALCULATE ADDRESS AS
; (COMM-1)+(COMM+1)-->HL.
CALCA: PUSH D
LHLD COMM+1 ; HL=ADDRESS BASE.
LDA COMM-1 ; GET OFFSET.
MVI D,0
MOV E,A
DAD D
POP D ; HL=OFFSET + BASE.
RET
; ROUTINE TO INCREMENT THE CONTENTS OF (COMM-1) AND
; DECREMENT THE CONTENTS OF BSAV.
INCCM: LXI H,COMM-1
INR M ; INCRM. RELATIV NUMBER
LXI H,BSAV
DCR M ; DECRM. NUMBER LEFT
RET
\f
; ROUTINE TO STORE DAT0-7 INTO RC3502/3 W-REG.
LSTORE: XRA A
STA COMM-1 ; RESET W-REG OFFSET.
MVI A,8.
STA BSAV
LST10: LDA COMM-1
RAL
ANI 16
MVI D,0
MOV E,A
LXI H,COMM+3 ; BASE ADDR TO BUFFER DATAX
DAD D
MOV E,M ;
INX H ;
MOV D,M ;
CALL RALCA ; :HL= :DATA(X)
SHLD ABUF ; STORE REG ADDR IN ABUF
XCHG
SHLD DBUF ; STORE DATA IN DBUF
LDA UPDAT
RAL
STA UPDAT
JNC LSI10
CALL PREG ; PUT REG TO L
LSI10: CALL INCCM ; INCR. :COMM-1, DECR. :BSAV
JNZ LST10
RET
; UPDATE CURSOR AFTER TERMINATION.
TERMC: CALL CRCUR
MVI A,4
JMP CRIGHT
\f
; READ AND MODIFY MICROPROCESSOR RAM.
; ADDRESS IN MICROPROCESSOR 4000+0 - 4000+3F.
RMICRO: CALL DCLEAR ; INIT SCREEN.
MVI C,"Y
CALL CO ; OUTPUT COMMAND CODE.
CALL DSPACE
MVI B,2 ; NUMBER OF ADDRESS DIGITS.
LXI H,ZEZE ; 2 X ZERO TO INBUFF
SHLD INBUF
LXI D,INBUF+2
RR01: CALL CI
MOV C,A
CPI ESC
JZ PCANCEL
CALL VALDG ; TEST IF VALID HEX CHAR?
JNC RR01
CALL CO ; ECHO CHAR.
MOV A,C
STAX D ; SAVE ADDREESS DIGIT.
INX D
DCR B
JNZ RR01 ; GET NEXT ADDRESS DIGIT.
CALL CINBF ; HL=ADDRESS
SHLD COMM+1
RC01: XRA A
STA COMM-1 ; RESET ADDRESS COUNT.
MVI A,8. ; NUMBER OF LISTED LOCATIONS.
STA BSAV
RR02: CALL CALCA
CALL DSPACE
LXI D,RAMB ; RAM BASE
DAD D ; ADD OFFSET
MOV A,M ; FETCH BYTE
CALL CHEX ; SPLIT TO 2 HEX DIGIT AND OUTPUT
CALL INCCM ; INCR. ADDR DECR. NUMBER
JNZ RR02 ; GET NEXT ADDRESS.
\f
; MODIFY MICRORAM. THE CURSOR IS RETURNED
; TO THE FIRST DIGIT IN FIRST LOCATIONS.
RR20: CALL CRCUR
MVI A,8.
CALL CRIGHT ; MOVE RIGHT CURSOR 7 POSITIONS.
XRA A
STA COMM-1 ; RESET ADDRESS OFFSET.
MVI A,8.
STA BSAV
RR05: LXI D,INBUF
MVI B,2
RR03: CALL CI ; INPUT CHAR.
MOV C,A ; SAVE INPUT
CPI CR
JZ CRMIC ; CR <TERMINATION>
CPI ESC
JZ PCANCEL
CPI "+
JZ NPLUS ; + NEXT 8 LOCATIONS
CPI "-
JZ NMINUS ; - PREVIOUS 8 LOCATIONS
CPI XSPACE
JZ NSPACE ; SPACE
CALL VALDG
JNC RR03 ; NO VALID COMMAND/DIGIT
CALL CO ; ECHO DIGIT
MOV A,C
STAX D ; STORE IN BUFFER
RR08: INX D
DCR B
JNZ RR03 ; GET NEXT DIGIT
CALL RCONV
CALL DSPACE ; OUTPUT SPACE
CALL INCCM ; INCR. ADDR DECR. NUMBER
JNZ RR05 ; JUMP IF NOT LAST GROUP
MVI B,2
RR06: CALL CI ; INPUT CHAR
CPI CR
JZ CRMIC ; CR <TERMINATION>
CPI ESC
JZ PCANCEL
CPI "+
JZ NPLUS ; + NEXT 8 GROUP
CPI "-
JZ NMINUS ; - PREVIOUS 8 GROUP
JMP RR06 ; NO VALID COMMAND
\f
CRMIC: CALL NSTORE ; STORE LAST GROUP IF NECESS.
LXI H,RAMB+0
MOV A,M ; FETCH TIMER LEVEL
CALL READR ; TRANSFER TO L
LXI H,TTOLV
MOV A,M ; FETCH TTY OUT
CALL READR ; TRANSFER TO L
JMP FORTOL
NSPACE: CALL MRAMC ; CALCULATE RAM ADDR
MOV A,B
CPI 2 ; IS CURSOR UNDER FIRST DIGIT ?
JZ FIRST ; YES
MOV A,M ; NO - UNDER 2'D ?
CALL PRVAL ; HEX TO ASCII
STA INBUF+1 ; STORE DIGIT IN BUFF
JMP ESPACE
FIRST: MOV A,M ; FETCH FIRST DIGIT
CALL SPRIGHT
CALL PRVAL ; HEX TO ASCII
STA INBUF
ESPACE: MVI C,CURR ; CURSOR RIGHT
CALL CO
JMP RR08
NPLUS: CALL NSTORE ; STORE LAST GROUP IF NECESS.
LXI D,8.
LHLD COMM+1
DAD D ; +8 TO RELATIV ADDR
SHLD COMM+1
PLUSX: PUSH H
CALL TERMC ; CURSOR BACK TO ADDR POSITION
POP H
MOV A,L
CALL CHEX ; OUTPUT NEW ADDR
JMP RC01
NMINUS: CALL NSTORE ; STORE LAST GROUP IF NECESS.
LXI D,-8.
LHLD COMM+1
DAD D ; -8 FROM RELATIV ADDR
MVI H,0
SHLD COMM+1 ; ZERO TO OFFSET
JMP PLUSX
\f
; INITIALIZATION.
INIT: LXI SP,SPINIT
OUT CREQ ; CLEAR CR F/F
MVI A,COMA
OUT COMMX ; INIT 8155
IN PORTA ; GET MODE SWITCH
ANI 1
LXI H,BHALF
JNZ B300
MVI M,1.
INX H
MVI M,3.
JMP ENDBR
B300: MVI M,7.
INX H
MVI M,15.
ENDBR: MVI A,TIMLI
OUT TIML
MVI A,TIMHI ; LOAD TIMER
OUT TIMH
MVI A,COMA+300
OUT COMMX ; START TIMER
MVI A,INILA ; INIT LAMDA COMM (GET LEVEL)
OUT PORTB
OUT SREQ ; SET CR F/F
MVI A,IMASK
SIM ; SET 8085 ITR MASK
LXI H,0
SHLD WADOG ; RESET WATCH DOG
SHLD TIMOUT ; RESET TIME OUT
SHLD RAMB+28.
SHLD RAMB+30.
SHLD SWITCH ; ZERO TO SWITCH MIRROR
SHLD XOUTDELAY
SHLD INDELAY
SHLD MBASE ; ZERO TO MODUL BASE
XRA A
STA ITEST ; RESET 7.5 MARK
DCR A ; :A= -1
STA XAUTO ; RESET AUTOLOAD MARK
STA TTESX
MVI B,100
EI
INI10: MVI C,-1.
CALL CO
DCR B
JNZ INI10
CALL WAIT ; WAIT UNTILL CR IS CLEARED
CALL VERSION ; OUTPUT CPU VERSION NUMBER
MVI A,1
STA TIMLV ; SET TIMER LEVEL=1.
XRA A
STA RAMB+3 ; SET CONSOLE LEVEL=0.
STA POINT+2
STA TIMCX ; RESET AUX TIMER
CALL MEMCO ; CONFIGURATE MEM (RAM) 0-15
CALL PROCON ; CONFIGURATE MEM (PROM) 0-15
CALL IOCON ; CONFIGURATE I/O LEVEL 0-127
IN PORTA ; READ MODE SWITCH
ANI 2 ; BUILT-IN TEST WANTED ?
JZ TSRET ; NO
JMP TS00 ; YES
TSRET: MVI A,AUCOM
CALL XCOM
MVI A,-1.
STA XAUTO
LXI H,TITRC ; INTR INTERVAL FOR TIMER.
SHLD TIMOUT ; LOAD TIME CONST.
SHLD TIMCOUNT ; LOAD TIME-ITR CONST.
CALL RESWH ; UPDATE SWITCHES.
CALL UPCOPY ; UPDATE L'S DEBUG IMAGE
CALL DCLEAR ; WRITE * ON THE SCREEN
XRA A
STA FCOM
CALL SLAMP ; SWITCH OFF LAMPS
\f
LXI H,300
SHLD MBASE ; ZERO TO MODUL-BASE
CALL GMEM
CALL SRUN ; SET RUN.
JMP MODSH
XFORTOL: CALL DCLEAR ; WRITE * ON THE SCREEN
XXH: CALL CI ; FETCH INPUT CHAR
ORA A ; IS IT BREAK ?
JZ ZZH ; YES
CPI CR ; IS IT CR ?
JZ OLDCOM ; YES
STA FCOM ; SAVE COMMAND
YYH: CPI "Y
JZ RMICRO ; MODIFY MICRO RAM
CPI "W
JZ RLEVEL ; MODIFY LEVEL-REG
CPI "L
JZ RLEVEL ; MODIFY W-REG
CPI "M
JZ MMODF ; MODIFY MEM
CPI BELL
JZ MODSH ; TTY MODE SHIFT
CPI "C
JZ CSTEP ; SINGLE INSTRUCTION-CURR
CPI "S
JZ SSTEP ; SINGLE INSTRUCTION.
CPI CR
JZ OLDCOM ; REPEAT LAST COMMAND
CPI "R
JZ XSRUN ; RUN
ZZH: CALL RESWH ; UPDATE SWITCHES
CALL BETJEN
JMP XXH
FORTOL: LDA FCOM
STA SCOM ; LAST COMM SAVE
CALL RESWH ; UPDATE SWITCHES
JMP XFORTOL
OLDCOM: CALL RESWH ; UPDATE SWITCHES
LDA SCOM ; FETCH OLD COMMAND
CPI "C ; IS IT "C ?
JZ OLDCS ; YES
CPI "S ; IS IT "S ?
JNZ YYH ; NO
OLDCS: CALL STERM ;
JMP SST02 ;
XSRUN: CALL SRUN
JMP FORTOL
\f
; 7.5 INTERRUPT.
; WHEN A 7.5 INTERRUPT OCCURS THIS ROUTINE
; SET (ITEST):=-1.
INT75: PUSH H
PUSH PSW
LXI H,ITEST
DCR M ; (ITEST):=-1
POP PSW
POP H
EI
RET
BLSET: CALL DSPACE ; SPACE
MVI B,2 ; NUMBER OF DIGIT IN COMM
LXI D,INBUF+2
JMP RL30
\f
; MODIFY REGISTER DEBUG COMMAND.
; CALL RWRITE HL= LEVEL,CODE<6+REGISTER NO.; DE=DATA.
; CALL RREAD HL= LEVEL,CODE<6+REGISTER NO..
; RETURN: DE=DATE.
RLEVEL: CALL DCLEAR ; INIT SCREEN FORMAT.
XRA A
STA UPDAT ; ZERO TO UPDAT
LDA FCOM ; FETCH COMM. L OR W
MOV C,A ;
CALL CO ; OUTPUT COMMAND.
CALL DSPACE
LDA FCOM
CPI "L ; IS IT LEVEL REG
JZ BLSET ; YES
MVI C,CURR
CALL CO
MVI B,3 ; MUNBER OF DIGITS IN COMM.
LXI D,INBUF+1
RL30: LXI H,ZEZE ; 2 ASCII LEADING ZERO
SHLD INBUF
RL01: CALL CI ; INPUT CHAR.
MOV C,A
CPI ESC
JZ PCANCEL
CALL VALDG ; TEST IF VALID HEX
JNC RL01
CALL CO ; ECHO CHAR.
MOV A,C
STAX D ; SAVE LEVEL DIGIT.
INX D
DCR B
JNZ RL01 ; GET NEXT DIGIT.
CALL CINBF ; HL=LEVEL NO.
SHLD LSAV ; SAVE IN LEVEL SAVE
LDA FCOM
CPI "W ; IS IT A W-COMM. ?
JZ RL31 ; YES
MOV A,L ; MOVE LEVEL NUMBER TO A
CALL LCONV ; GET REG-OFFSET FROM L
RL31: SHLD COMM+1 ; SAVE ANSWER
RL05: XRA A
STA COMM-1 ; RESET W-REG COUNTER.
MVI A,8.
STA BSAV ; SAVE NUMBER OF W-REG'S.
RL02: CALL RALCA ; CALCUL. ABSOLUTE ADDR IN ARRAY
SHLD ABUF
CALL GREG ; FETCH CONTENTS OF REG
XCHG
LHLD DBUF ; GET RESULT FROM IN BUFF
XCHG ; RESULT IN DE
CALL SVDE ; SAVE ANSWER I DATAX
CALL DSPACE ; OUTPUT SPACE
CALL OUTDE ; OUTPUT ANSWER
CALL INCCM ; INCR. OFFSET,DECR NO. OF W-REG'S.
JNZ RL02
CALL CRCUR ; CR
MVI A,10.
CALL CRIGHT ; MOVE CURSOR 8 POS. RIGHT.
XRA A
STA COMM-1 ; RESET W-REG OFFSET.
MVI A,8.
STA BSAV ; SET W-REG COUNTER.
\f
RL03: CALL DATIN ; MODIFY DIGIT.
DWC. PCANCEL ; BACK SPACE
DWC. LCR ; CR TERMINATE.
DWC. LPLUS ; PLUS TERMINATE.
DWC. LMINUS ; MINIUS TERMINATE.
CALL DSPACE
CALL INCCM
JNZ RL03
RL04: CALL CI ; INPUT CHAR.
CPI CR
JZ LCR ; CR TERMINATE.
CPI ESC
JZ PCANCEL
CPI "+
JZ LPLUS ; + TERMINATE.
CPI "-
JZ LMINUS ; - TERMINATE.
JMP RL04
LCR: CALL LSTORE ; UPDATE REGISTERS.
JMP FORTOL
LPLUS: CALL LSTORE ; STORE W-REG IN L
LDA FCOM
CPI "W ; WAS IT AN W-COMM ?
JZ RL32 ; YES
LDA LSAV
INR A ; INCR. LEVEL NUMBER
RL34: ANI 177
STA LSAV ; STORE NEW LEVEL NUMBER
CALL LCONV ; GET REG-OFFSET FROM L
SHLD COMM+1 ; SAVE OFFSET
CALL TERMC ; MOVE CURSOR >4
CALL DSPACE ; OUTPUT SP-SP
LDA LSAV
CALL CHEX ; OUTPUT NEW LEVEL NUMBER
JMP RL05
RL32: LHLD COMM+1 ; GET CURRENT W-BASE.
LXI D,10
DAD D ; ADD 8.
RL06: MOV A,H
ANI 7 ; MASK FOR MAX REG ADDR
MOV H,A
SHLD COMM+1 ; STORE NEW W-BASE
CALL TERMC ; MOVE CURSOR >4
LHLD COMM+1
CALL LOUTDE ; OUTPUT NEW W-BASE
JMP RL05 ;
LMINUS: CALL LSTORE ; STORE W-REG IN L
LDA FCOM
CPI "W ; WAS IT AN W-COMM ?
JZ RL33 ; YES
LDA LSAV
DCR A ; DECR. LEVEL
JMP RL34
RL33: LHLD COMM+1
LXI D,-8.
DAD D ; DECR. W-BASE
JMP RL06
\f
; READ AND MODIFY MEMORY COMMAND.
; CALL MREAD HL=ADDRESS, RETURN: DE=DATA.
; CALL MWRITE HL=ADDRESS,DE=DATA.
MMODF: CALL DCLEAR ; INIT SCREEN FORMAT.
XRA A
STA UPDAT
MVI C,"M
CALL CO ; ECHO COMMAND.
CALL DSPACE
MVI B,4 ; NUMBER OF DIGIT IN BASE
LXI D,INBUF
MX10: CALL CI
CPI ": ; : (USE OLD BASE)
JZ MM11
CPI ESC
JZ PCANCEL
MOV C,A
CALL VALDG ; VALID DIGIT ?
JNC MX10 ; NO
CALL CO ; ECHO DIGIT
MOV A,C
STAX D
INX D
DCR B
JNZ MX10 ; GET NEXT BASE ADDRESS CIFFER.
CALL CINBF ; HL= BASE
SHLD ABUF
SHLD MBASE ; SAVE IN M(EM)BASE
MM11: CALL TERMC ; CURSOR BACK TO FIRST POSITION
LHLD MBASE
XCHG
CALL OUTDE ; OUTPUT BASE
MVI C,":
CALL CO ; OUTPUT :
MVI B,4 ; B=NUMBER OF OFFSET
LXI D,INBUF
MM01: CALL CI ; INPUT CHAR.
MOV C,A
CPI ESC
JZ PCANCEL
CALL VALDG ; TEST IF HEX?
JNC MM01
CALL CO ; ECHO CHAR.
MOV A,C
STAX D
INX D
DCR B
JNZ MM01 ; GET NEXT ADDRESS CIFFER.
CALL CINBF ; CONVERT OFFSET (HL)
SHLD COMM+1
MM05: XRA A
STA COMM-1 ; RESET ADDRESS COUNTER.
MVI A,8. ; NUMBER OF MEMORY LOCATIONS.
STA BSAV
MM02: CALL MCALCA ; :HL OFFSET (TOTAL)
SHLD ABUF+2 ; SAVE OFFSET
XCHG
CALL GMEM ; GET MEMORY CONTENTS
XCHG
LHLD DBUF
XCHG
CALL SVDE ; SAVE ANSWER IN DATA(X)
CALL DSPACE ; SP - SP
CALL OUTDE ; OUTPUT CHARACTER
CALL INCCM ; INCR. OFFSET, DECR. NO OF MEM LOCA.
JNZ MM02 ; GET NEXT ADDRESS.
\f
; MODIFY MEMORY. THE CURSOR IS RETURNED TO THE FIRST
; DIGIT IN FIRST ADDRESS.
CALL CRCUR ; CURSOR BACK
MVI A,10.+5
CALL CRIGHT ; MOVE CURSOR 10 POS RIGHT.
MVI A,8.
STA BSAV ; +8 TO DISPLAY LOCATIONS
XRA A
STA COMM-1 ; RESET ADDRESS OFFSET.
MM03: CALL DATIN ; MODIFY CONTENTS.
DWC. PCANCEL ; BACK SPACE
DWC. MCR ; CR TERMINATE.
DWC. MPLUS ; + TERMINATE.
DWC. MMINUS ; - TERMINATE.
CALL DSPACE
CALL INCCM
JNZ MM03
MM04: CALL CI ; INPUT CHARACTER
CPI CR
JZ MCR ; CR TERMINATE.
CPI ESC
JZ PCANCEL
CPI "+
JZ MPLUS ; + TERMINATE.
CPI "-
JZ MMINUS ; MINUS TERMINATE.
JMP MM04
MCR: CALL MSTORE ; DATA(X) TO MEM IF NECESS.
JMP FORTOL
MPLUS: CALL MSTORE ; DATA(X) TO MEM IF NECESS.
LXI D,16.
LHLD COMM+1
DAD D ; INCR. OFFSET TO NEXT 8 GROUP
MM06: SHLD COMM+1
CALL TERMC ; CURSOR BACK
LHLD MBASE
CALL LOUTDE ; OUTPUT BASE
MVI C,":
CALL CO ; OUTPUT :
LHLD COMM+1
CALL LOUTDE ; OUTPUT NEW OFFSET ADDR
JMP MM05
MMINUS: CALL MSTORE ; DATA(X) TO MEM IF NECESS.
LXI D,-16.
LHLD COMM+1
DAD D ; DECR. OFFSET TO PREVIOUS 8 GR
JMP MM06
\f
; PROCEDURE WAIT.
; LOOP UNTILL >CR=1.
WAIT: PUSH PSW
WAIT1: IN PORTA ; READ CR F/F
ANI XCR ;
CPI XCR ; IS F/F CLEARED ?
JNZ WAIT1 ; NO
POP PSW
RET
; PROCEDURE TO SET CS(COMMAND SELECT).
; CALL<SMICC>;A:=CS(6:0);
SMICC: PUSH PSW
PUSH B
ANI 177
MOV B,A
IN PORTB
ANI 200 ; CLEAR ALL EXCEPT RUN
ADD B ; ADD COMMAND
OUT PORTB
POP B
POP PSW
RET
; PROCEDURE TO OUTPUT A NUMBER OF BYTES FROM M(MICRO-
; PROCESSOR) TO L(LAMDA).
; CALL<OUTCHAR>; A(6:0)=NUMBER OF BYTES; HL=BUFFER POINTER;
OUTCHAR: PUSH PSW
PUSH H
PUSH B
MOV B,A ; B=COUNT.
OUTLP: MOV A,M
OUT CDI ; PREPARE BYTE FOR L (FIFO)
MVI A,RDCOM ; SET READ COMM.
CALL XCOM
INX H
DCR B ; FINISH ?
JNZ OUTLP ; NO
POP B ; YES
POP H
POP PSW
RET
; PROCEDURE TO INPUT A NUMBER OF BYTES FROM L(LAMDA) TO
; M(MICROPROCESSOR).
; CALL(INCHAR); A=NUMBER OG BYTES;HL=BUFFER START POINTER;
INCHAR: PUSH PSW
PUSH H
PUSH B
MOV B,A ; B=COUNT
INTLP: MVI A,RDCOM ; READ COMM. TO L
CALL XCOM ; WAIT ANSWER
IN CDO ; READ ANSWER FROM FIFO
MOV M,A ; SAVE IN BUFFER
INX H
DCR B ; FINISH ?
JNZ INTLP ; NO
POP B ; YES
POP H
POP PSW
RET
\f
; PROCEDURE SEND.
; CALL <SEND>
; DWC. PARAM
; PARAM: 2 BYTES BUFFER POINTER
; NUMBER OF BYTES.
; DESTROY HL,DE.
SEND: POP H ; NEXT ADDRESS.
MOV E,M
INX H
MOV D,M ; DE=PARAM ADDRESS.
INX H
PUSH H ; RESTORE STACKP.
LDAX D
MOV L,A
INX D
LDAX D
MOV H,A ; HL=BUFFER POINTER.
INX D
LDAX D ; NUMBER OF BYTES
JMP OUTCHAR ; SEND BLOCK TO L
; PROCEDURE RECEIVE.
; CALL <RECEIVE>
; DWC. PARAM
; PARAM: 2 BYTES BUFFER POINTER
; NUMBER OF BYTES.
RECEIVE: POP H
MOV E,M
INX H
MOV D,M ; DE=PARAM ADDRESS.
INX H
PUSH H ; RESTORE STACKP.
LDAX D
MOV L,A
INX D
LDAX D
MOV H,A ; :HL BUFFER POINTER
INX D
LDAX D ; NUMBER OF BYTES
JMP INCHAR ; READ CHARACTER
\f
; ADDRESS PARAM BLOCK.
PADDR: DWC. ABUF
4
; DATA PARAM BLOCK.
PDATA: DWC. DBUF
2
; SINGLE PARAM BLOCK.
SDATA: DWC. DBUF
1
AREG: DWC. ABUF
1
RREG: DWC. ABUF
2
TOUT: DWC. MBUF
6
TIND: DWC. ABUF
6
; PROCEDURE "GET MEM".
; TRANSFER A WORD FROM L-MEM TO .
; CALL: ABUF=ADDRESS
; RETURN: DBUF=DATA
GMEM: LHLD MBASE ; MEM BASE
MOV A,L
ANI 376
MOV L,A
SHLD ABUF
CALL SEND ; ADDR PARM BLOCK (4) ABUF
DWC. PADDR
MVI A,GMCOM ; LOAD GET MEM COMM.
CALL XCOM
CALL RECEIVE ; RECEIVE ANSWER
DWC. PDATA
RET
; PROCEDURE XCOM. SEND COMMAND
XCOM: CALL SMICC ; SEND COMM TO L
OUT SCR ; ITR TO L
CALL WAIT ; WAIT ANSWER
MVI A,GLCOM ; LOAD GET LEVEL COMM.
JMP SMICC ; SEND COMM TO L
; PROCEDURE "PUT MEM"
; TRANSFER A WORD FROM M TO L-MEM.
PMEM: LHLD MBASE
MOV A,L
ANI 376
MOV L,A
SHLD ABUF
CALL SEND ; ADDR PARM BLOCK (4) ABUF
DWC. PADDR
CALL SEND ; DATA PARM BLOCK (2) DBUF
DWC. PDATA
MVI A,PMCOM ; LOAD PUT MEM COMM
JMP XCOM ; SEND COMM TO L
\f
; PROCEDURE "GET REG"
; TRANSFER A WORD FROM L-REG TO M.
GREG: CALL SEND ; ADDR PARAM. BLOCK (2) ABUF
DWC. RREG
MVI A,GRCOM
CALL XCOM ; READ COMMAND TO L
CALL RECEIVE
DWC. PDATA ; RECEIVE ANSWER IN DBUF
RET
; PROCEDURE "PUT REG"
; TRANSFER A WORD FROM M TO L-REG.
PREG: CALL SEND
DWC. RREG
CALL SEND
DWC. PDATA
MVI A,PRCOM
JMP XCOM
; PROCEDURE TO TRANSFER A M-RAM ADDR +M:RAM BYTE
; FROM M TO L.
; CALL: HL=ADDR; A=DATA.
READR: PUSH B
PUSH PSW
MOV A,L
OUT CDI ; OUTPUT LSB ADDR
MVI A,RDCOM
CALL XCOM ; INPUT TO FIFO
POP PSW
OUT CDI ; OUTPUT DATA
MVI A,RDCOM
CALL XCOM ; INPUT TO FIFO
MVI A,RACOM
CALL XCOM ; WRITE INTO L-IMAGE
POP B
RET
; TIMER INTERRUPT.
; COMMAND L TO SET LEVEL SPECIFIED IN MEM(COPY+0).
TIMITR: MVI A,TIMCM
CALL XCOM ; SEND TIMER ITR TO L
MVI A,-1.
STA TTESX ; RESET TIMER MARK
RET
\f
; AUTOLOAD.
; START LEVEL 127 IN FIRST BYTE OF FIRST PROM.
AUTOL: CALL SSTOP
MVI A,AUCOM
CALL XCOM ; SEND AUTOLOAD REQ TO L
MVI A,-1.
STA XAUTO ; RESET AUTOLOAD MARK
JMP SRUN
; REQUEST CODES FROM L TO M.
; FETCH THE REQUEST CODE INITIATED BY A 7.5 INTERRUPT.
WRREQ: XRA A
STA ITEST ; RESET ITR MARK
MVI A,WREQC
CALL XCOM ; SEND ITR ACKN.
IN CDO ; READ COMM FROM L
MOV B,A ; SAVE COMM IN B
ANI 300
CPI 200 ; IS IT WRITE COMM ?
JZ WRBYTE ; YES
CPI 100 ; IS IT READ COMM ?
JZ XMRR ; YES
RET
XMRR: MOV A,B
ANI 77 ; IS IT ERROR ?
JZ UPCOPY ; NO
JMP MEMERR
.DO .PASS
.MSG I'M RUNNING APP. 4 MIN LEFT
.ENDC
\f
; WRITE BYTE. L REQUESTS M TO WRITE A BYTE IN RAM
; :CS2-7 = ADDR. FIFO = DATA.
WRBYTE: MOV A,B ; FETCH SAVED BYTE
ANI 77 ; MASK COMMAND AWAY
MOV L,A ; RELATIV ADDR
MVI H,0
LXI D,RAMB
DAD D ; ADD RAM BASE
MVI A,RDCOM
CALL XCOM
IN CDO ; READ DATA (FIFO)
MOV M,A ; STORE BYTE IN RAM
MOV A,L
CPI 8. ; WAS IT RAM CELL 8. ?
JNZ CONITR ; NO
MOV C,M ; FETCH CHARACTER
CALL CO ; OUTPUT CHARACTER
CONITR: MVI A,CONCOM
JMP XCOM ; SEND CONSOLE ITR
; UPDATE COPY.
UPCOPY: MVI B,RAML ; NUMBER OF BYTES TO L
LXI H,RAMB
NUPA: MOV A,M
CALL READR ; MOVE BYTE TO L
INX H
DCR B ; FINISH ?
JNZ NUPA ; NO
RET ; YES
RALCA: PUSH D
LHLD COMM+1 ; LOAD RELATIV REG NUMBER
LXI D,REGSP ; REG SPACE IN ARRAY
LDA COMM-1 ; OFFSET IN BUFFER
ORA A ; FIRST ?
JZ RALED ; YES
RALCP: DAD D ; ADD BASE + X TIMES OFFSET
DCR A
JNZ RALCP
RALED: POP D
RET
\f
; ROUTINE TO GET CURRENT LEVEL
; AND PRINT W0-W7 BELONGING TO THIS LEVEL.
RCURR: CALL SSTOP ; STOP CPU
PUSH PSW ; SAVE LEVEL
MVI H,0
MOV L,A
SHLD ABUF ; STORE LEVEL IN ABUF
CALL LOUTDE ; OUTPUT LEVEL NUMBER
MVI A,8.
STA BSAV
POP PSW
PUSH PSW
CALL LCONV ; GET OFFSET FROM TABLE
SHLD ABUF
XEG01: CALL DSPACE
CALL GREG ; GET REGISTER
LHLD DBUF
CALL LOUTDE ; OUTPUT CONTENTS
LXI D,REGSP
LHLD ABUF
DAD D ; ADD LEVEL+OFFSET
SHLD ABUF ; NEW BASE
LXI H,BSAV
DCR M ; DECR. DISPLAYED NUMBER
JNZ XEG01 ; FINISH
POP PSW
RET
; ROUTINE TO SET RUN MODE.
SRUN: MVI A,RUNB+GLCOM
OUT PORTB ; RUN + GET LEVEL COMM
LDA CHSAV
ORI 8.
CALL SLAMP ; SWITCH ON RUN-LAMP
OUT SCR ; REQUEST L
CALL WAIT ; WAIT ACCEPT ON STARTED
MVI C,"R
JMP CO ; WRITE "R" ON THE SCREEN
; ROUTINE TO SET STOP MODE.
SSTOP: MVI A,GLCOM ; REMOVE RUN CONDITION
OUT PORTB
LDA CHSAV
ANI 27
CALL SLAMP ; SWITCH OFF RUN LAMP
OUT SCR ; REQUEST L
CALL WAIT ; WAIT ACCEPT ON STOPPED
IN CDO ; READ LEVEL
RET
STERM: LDA POINT
MOV C,A
CALL CO ; OUTPUT BUFF CHAR.
JMP DSPACE ; OUTPUT SP-SP
\f
; EXECUTE SINGLE INSTRUCTION.
SSTEP: MVI A,"S
STA POINT ; "S TO OUTPUT BUFF
MVI A,SEXEC
SST03: STA POINT+1 ; SINGLE STEP COMM
CALL STERM ; OUTPUT "S OR "C + SP-SP
CALL GVALU ; GET NUMBER OF STEPS (OPERATOR)
SHLD MBUF
SST02: LDA POINT+1
CALL XCOM ; SEND COMMAND TO L
CALL RCURR
LHLD MBUF ; NUMBER OF STEPS
MOV A,H
ORA L ; FINISH
JZ FORTOL
DCX H ; DECR. NUMBER OF STEPS
SHLD MBUF
CALL DCLEAR
CALL STERM ; OUTPUT "S OR "C + SP-SP
JMP SST02
; EXECUTE ON CURRENT LEVEL.
CSTEP: MVI A,"C
STA POINT ; "C TO OUTPUT BUFF
MVI A,SECUR ; CURRENT STEP COMM
JMP SST03
SUBSW: MOV C,A
ANI 17
MOV D,A ; :D = 2-1-8-4
ANI 3
RLC
RLC
MOV E,A
MOV A,D
RRC
RRC
ADD E ; :A = 8-4-2-1
CALL SPCO1
MOV H,A ; SAVE LEFT PART
MOV A,C
CALL SPRIGHT
MOV D,A ; :D = 1-8-2-4
RAR
MOV C,A
RAR
MOV E,A
ANI 1
MOV B,A ; :B = *-*-*-8
MOV A,D
RAR
MOV A,B
RAL
\f
MOV B,A ; :B = *-*-8-4
MOV A,C
RAR
MOV A,B
RAL
MOV B,A ; :B = *-8-4-2
MOV A,E
RAR
RAR
MOV A,B
RAL ; :A = 8-4-2-1
ADD H ; ADD LEFT PART
MOV D,A ; RESULT I D
RET
; ROUTINE TO READ SWITCHES 0-3
; IF ANY CHANGE IN RELATION TO LAST READ
; THE MEW SWITCH PICTURE IS SEND TO L
RESWH: IN SW0 ; READ SWITCH 0 AND 1
CALL SUBSW ; CONVERT SWITCH
LDA SWITCH
CMP D
MVI A,0
STA CSUPD ; ZERO TO SW UPDATE
JZ NEXTW ; NO UPDATE
MVI A,-1.
STA CSUPD ; ALL ONES TO SW CHANGE
MOV A,D
STA SWITCH ; STORE NEW SWITCH P.
NEXTW: IN SW1 ; READ SWITCH 2 AND 3
CALL SUBSW ; CONVERT SWITCH
LDA SWITCH+1
CMP D
JZ SWDATE ; NO CHANGE
MVI A,-1.
STA CSUPD ; ALL ONES TO SW UPDATE
MOV A,D
STA SWITCH+1 ; STORE NEW SWITCH P.
SWDATE: LDA CSUPD ; FETCH SW UPDATE
CPI 0 ; ANY CHANGE AT ALL ?
RZ ; NO
LXI H,SWITCH
MOV A,M
CALL READR ; UPDATE L IMAGE
INX H
MOV A,M
JMP READR ; UPDATE L IMAGE
\f
; TRAP INTERRUPT.
TRAP: PUSH H
PUSH PSW
LXI H,XOUTDELAY
MOV A,M
ORA A
JZ OTABEL
DCR M
INX H
INTEST: INX H
MOV A,M
ORA A
JZ ITABEL
DCR M
XYTEST:
ROTIM: LXI H,TIMCX ; *5 COUNTER.
DCR M
MOV A,M
CPI 6
JZ XRTRAP
CPI 0
JNZ RTRAP ; NO
MVI M,12. ; YES
LHLD TIMCOUNT
MOV A,L
ORA H ; IS TIMER STOPPED ?
JZ GOAG1 ; YES
DCX H
SHLD TIMCOUNT
MOV A,L
ORA H ; IS IT ZERO NOW ?
JNZ RTRAP ; NO
STA TTESX ; SET TIMER ITR
GOAG1: LHLD TIMOUT
SHLD TIMCOUNT ; RELOAD
POP PSW
POP H
EI
RET
XRTRAP: LHLD WADOG
MOV A,L
ORA H ; IS WATCH DOG ALIVE ?
JZ RTRAP ; NO
DCX H ; DECREMENT
SHLD WADOG
MOV A,L
ORA H ; IS THE DOG BARKING ?
JNZ RTRAP ; NO
STA XAUTO ; SET AUTOLOAD MARK
RTRAP: POP PSW ;
POP H
EI
RET
\f
CANCEL: POP H
PCANCEL: CALL OTXT
DWC. PCTXT
JMP FORTOL
PCTXT: "<
"E
"S
"C
">
0
\f
; ROUTINE TO INPUT A RIGHT JUSTIFIED
; 4 DIGIT VALUE FOR <STEP) IN THE S AND C COMMAND.
; RETURN: HL=VALUE.
GVALU: LXI D,INBUF
MVI B,4
S20: CALL CI
MOV C,A
CPI ESC
JZ PCANCEL
CPI CR ; IS IT CR <TERMINATION> ?
JZ SSEXD ; YES
CALL VALDG ; VALID DIGIT ?
JNC S20 ; NO
CALL CO ; YES - ECHO DIGIT
MOV A,C
STAX D ; STORE DIGIT IN BUFF.
INX D
DCR B ; FINISH
JNZ S20 ; NO - GET NEXT DIGIT
CALL DCLEAR
CALL STERM
CALL CINBF ; CONVERT TO 4 HEX IN HL
RET
SSEXD: LXI H,0 ; ZERO TO HL SINGLE STEP
RET
; TABULATION ROUTINE.
NTAB: POP H
LXI D,10
DAD D
PUSH H
XUPBUF: LDA INBUF+4
CPI 4
JZ UPYES
MVI C,CURR
CALL CO
LXI H,INBUF+4
INR M
JMP XUPBUF
; ROUTINE TO GET LEVEL ARRAY START ADDRESS
; IN THE WORKING REGISTER ARRAY (TABLE)
; WHEN CALLED: A=LEVEL.
; RETURN: HL=WORKING REGISTER ADDRESS.
LCONV: OUT CDI
MVI A,ROFF ; REG OFFSET COMM.
CALL XCOM
CALL RECEIVE ; GET ANSWER
DWC. PDATA
LHLD DBUF ; :HL ANSWER
RET
\f
; ROUTINE TO OUTPUT ERROR MESSAGE
; AND THE CONTENTS OF MBUF.
OUTERR: CALL OTXT ; OUTPUT "ERR"
DWC. ERRTXT
LDA CHSAV ; FETCH ERROR NUMBER
CALL CHEX ; OUTPUT ERROR NUMBER
CALL DSPACE ; SPACE
LHLD MBUF+1
CALL LOUTDE ; OUTPUT 1'ST PARM PART
CALL DSPACE ; SPACE
LHLD MBUF+3
CALL LOUTDE ; OUTPUT 2'D PARM PART
CALL DSPACE ; SPACE
LDA MBUF
CALL CHEX ; OUTPUT 3'TH PARM PART
XRA A
STA ITEST
IN PORTA
CMA
ANI 4
JZ TS00
JMP XFORTOL
; DECODING OF COMMANDS IN CONSOLE MODE.
; WAIT INPUT CHAR;IF CHAR=BELL THEN SHIFT TO DEBUG MODE
; ELSE SEND CHAR TO MICROPROGRAM.
MODSH: CALL OTXT ; OUTPUT T MODE TEXT
DWC. TTYTXT
MODS1: CALL CI ; WAIT INPUT CHAR.
MOV C,A
ORA A
JZ SPTES
CPI BELL ; IS IT MODE SHIFT
JZ SPT1 ; YES
NOSHIFT: LXI H,DTIN
MOV M,C
CALL READR ; UPDATE DATIN.
TTIITR: MVI A,TTICOM
CALL XCOM ; CONSOLE ITR TO L
SWTES: CALL RESWH ; TEST SWITCHES.
JMP MODS1 ; RETURN.
SPTES: CALL BETJEN
JMP SWTES
SPT1: IN PORTA
CMA
ANI 8.
JNZ NOSHIFT
CALL OTXT ; OUTPUT D MODE TEXT
DWC. DBTXT
JMP XFORTOL
SPCONV: CALL CNVBN ; CONVERT TO HEX
SPCO1: RAL
RAL
RAL
RAL
ANI 360 ; SHIFT TO LEFT
RET
SPRIGHT: RAR ; SHIFT TO RIGHT
RAR
RAR
RAR
ANI 17
RET
\f
; FUNCTION: SLAMP- SET LAMPS.
; DESCRIPTION: SET THE LAMPS ON THE FRONT PANEL
; OF CPU201 IN ACCORDANCE TO THE CONTENTS OF "CHSAV".
SLAMP: PUSH B ; TM= 1
STA CHSAV ; RP= 2
MOV B,A ; LP= 4
ANI 5 ; OP= 8
MOV C,A
MOV A,B
ANI 2
JNZ SLAM1
SLAM3: MOV A,B
ANI 8.
JNZ SLAM2
SLAM4: MOV A,C
CMA
RAL
RAL
OUT PORTC
POP B
RET
SLAM1: MOV A,C
ADI 8.
MOV C,A
JMP SLAM3
SLAM2: MOV A,C
ADI 2
MOV C,A
JMP SLAM4
; DISPLAY THE PARITY ERROR.
MEMERR: CALL SSTOP
METEX: MOV A,B
ANI 6 ; MASK PARITY LAMPS
CALL SLAMP ; SET LP/RP LAMP(S)
CALL RECEIVE ; FETCH ERROR BUFFER
DWC. TOUT
MVI C,"P
CALL CO ; OUTPUT "P"
CALL DSPACE ; OUTPUT SP-SP
LHLD MBUF
CALL LOUTDE ; OUTPUT BASE
MVI C,":
CALL CO ; OUTPUT ":"
LHLD MBUF+2
CALL LOUTDE ; OUTPUT ADDR.
\f
CALL DSPACE ;
LDA CHSAV ; FETCH ERROR
RRC ;
CPI 3 ; BOTH L AND R ERROR ?
JZ MTEX1 ; YES
CPI 1 ; R ERROR
JZ MTEX2 ; YES
MVI C,"L ;
CALL CO ; OUTPUT L
JMP DCLEAR
MTEX1: MVI C,"L ;
CALL CO ; OUTPUT L
MTEX2: MVI C,"R ;
CALL CO ; OUTPUT R
JMP DCLEAR
; UPDATE FLAG ADMINISTRATION.
FUPDAT: PUSH PSW
PUSH B
PUSH H
LDA COMM-1
MOV C,A
CALL BITCO
LXI H,UPDAT
ORA M
MOV M,A ; UPDATE BIT IN FUPDAT
POP H
POP B
POP PSW
RET
; CONFIGURATION TABLE.
; ROUTINE TO CONVERT A BINARY NUMBER(0-7)
; IN C TO A BIT MASK.
BITCO: PUSH H
PUSH B
LXI H,CONTB ; BASE TO MASK TABLE
MVI B,0
DAD B ; ADD OFFSET
MOV A,M ; GET MASK BIT
POP B
POP H
RET
\f
; MEMORY CONFIGURATION.
; WHEN CALLED :
; MBUF= INDIRECT CONFI ADDRESS
; HL= START ADDRESS.
RAMCO: SHLD MBASE
MVI B,10
REPEAT: LXI H,100000
MVI A,20
RA22: SHLD ABUF+2
STA NUMBER
CALL GMEM
MOV A,L
MOV L,H
MOV H,A
LDA NUMBER
DCR A
JNZ RA22
RA20: LXI H,TSMON ; TEST PATTERN
SHLD DBUF
CALL PMEM ; STORE PATTERN
CALL GMEM ; RE-READ PATTERN
LHLD DBUF
MOV A,L
ANA H ;
CPI 125 ; EXIST MEM ?
JZ EXIST ; YES
RA21: LHLD MBASE ; NO
INX H
INX H
SHLD MBASE ; NEXT MEM
DCR B ; FINISH WITH 8 BLOCK ?
JNZ REPEAT ; NO
RET ; YES
EXIST: LHLD ABUF ; FETCH MEM BASE
MOV A,L
RAR
ANI 7
MOV C,A
CALL BITCO ; CONVERT TO BIT MASK
LHLD MBUF
ADD M
MOV M,A ; ADD BIT TO MASK
JMP RA21
; MEMORY CONFIGU.
MEMCO: LXI H,RAMB+28.
SHLD MBUF
LXI H,300
CALL RAMCO ; CONFIGURATE 0-7
LXI H,MBUF
INR M
LXI H,320
JMP RAMCO ; CONFIGURATE 8-15
\f
; ROUTINE TO OUTPUT CPU NO. AND MICROPROGRAM
; VERSION NUMBER.
VERSION: MVI A,RDCOM ; TRANF A BYTE TO M
CALL XCOM
IN CDO ; READ ANSWER "CPU"-"MIC"
PUSH PSW
CALL OTXT ; SEND OUTPUT "RC 350"
DWC. INITX
POP PSW ; FETCH BYTE FROM L
PUSH PSW
CALL SPRIGHT
CALL PRVAL ; CONVER TO ASCII
CALL CO ; OUTPUT CPU NUMBER
CALL OTXT ; OUTPUT CPU NUMBER
DWC. INITY
POP PSW ; FETCH BYTE FROM L
ANI 17
STA VERNO ; SAVE VER. NO IN RAM
CALL PRVAL ; CONVERT TO ASCII
CALL CO ; OUTPUT MICROPROGRAM VERSION
CALL DCLEAR
CALL OTXT
DWC. TEC70
RET
TEC70: 40
"D
"E
"B
"U
"G
40
"V
"E
"R
"0
"2
0
\f
; 8085 MICROPROGRAM COMMUNICATION TEST.
; TEST OF COMMUNICATION FIFO.
TS00: MVI A,1
CALL SLAMP
MVI A,-1.
LXI H,MBUF ; START PATTERN GEN
TSB01: MVI B,6
TS001: MOV M,A
INX H
DCR A
DCR B
JNZ TS001
CALL SEND ; SEND BLOCK TO L
DWC. TOUT
CALL RECEIVE ; GET ANSWER
DWC. TIND
LXI H,MBUF
LXI B,ABUF
MVI D,6
TS002: LDAX B
CMP M ; ERROR ?
JNZ OUTERR ; YES
INX H
INX B
DCR D ; FINISH ?
JNZ TS002 ; NO
LXI H,MBUF
MOV A,M
ORA A ; IS ALL PATTERN TESTED ?
JZ TS01 ; YES
STC
CMC
RAL
JMP TSB01
\f
; TEST THAT THE MICROPROGRAM CAN INTERRUPT THE 8085.
TS01: MVI A,3
CALL SLAMP ; 3 TO LAMP
XRA A
STA ITEST
MVI A,1
OUT CDI ; OUTPUT TEST NUMBER
MVI A,RDCOM
CALL XCOM ; INPUT TO FIFO
MVI A,TSCOM ; SEND TEST COMM.
CALL XCOM
TS010: LDA ITEST
ORA A ; L-ITR MARK?
JZ TS010 ; NO
XRA A
STA ITEST ; RESET REQ MARK
JMP TS02
; TEST PROCEDURE.
; WHEN CALLED : H=LAMP NO. AND L=TEST NO.
TPROC: MOV A,H
CALL SLAMP ; TESTNUMBER TO LAMP
MOV A,L
OUT CDI ; OUTPUT TEST NUMBER
MVI A,RDCOM
CALL XCOM ; INPUT TO FIFO
MVI A,TSCOM ; SEND TEST COMM. TO L
CALL XCOM
CALL RECEIVE ; GET ANSWER
DWC. TOUT
RET
; WORKING ADDRESS REGISTER TEST.
TS02: LXI H,KTS02
CALL TPROC ; START TEST IN L
LXI H,MBUF
MOV A,M ; READ ANSWER
ORA A ; ERROR ?
JZ TS03 ; NO
JMP OUTERR
; WORKING REGISTER DATA TEST.
TS03: LXI H,TSMON
SHLD ABUF ; STORE TESTPATTERN
CALL SEND
DWC. RREG
LXI H,KTS03
CALL TPROC ; START TEST IN L
LXI H,MBUF
MOV A,M ; READ ANSWER
ORA A ; ERROR ?
JZ TS04 ; NO
JMP OUTERR
\f
; WORKING REGISTER DATA TEST.
; PATTERN: 125252.
TS04: LXI H,TSMIN
SHLD ABUF ; STORE TESTPATTERN
CALL SEND
DWC. RREG
LXI H,KTS03
CALL TPROC ; START TEST IN L
LXI H,MBUF ;
MOV A,M ; READ ANSWER
ORA A ; ERROR ?
JZ TS05 ; NO
JMP OUTERR
; ROUTINE TO GET NEXT MEMORY MODUL.
; CALL: PASSC= MASK AND RCAB=LAST MODUL NO.
; RETURN: C=1 IF FINISH ELSE C=0.
; NAME: "GMODU".
GMODU: LDA PASSC ; GET MASK
ORA A
JNZ NMODL ; GET NEXT
STC
RET ; RETURN C=1
NMODL: LXI H,RCAB
LDA PASSC
STC
CMC
RAL
STA PASSC
INR M
INR M
JNC GMODU
STC
CMC
RET ; RETURN C=0.
\f
; MEMORY ADDRESS TEST.
; ALL MODULE POINTED OUT IN "RAMB+28." AND
; "RAMB+29" IS TESTED.
TS05: MVI A,276 ;
STA RCAB ;
LDA RAMB+28. ;
CALL TS06 ;
MVI A,316 ;
STA RCAB ;
LDA RAMB+29. ;
CALL TS06 ;
JMP TS07 ;
TS06: STA PASSC ; SAVE LAST MODUL TESTED
TS05X: CALL GMODU
RC ; FINISH
MVI H,0
LDA RCAB
MOV L,A
SHLD ABUF
CALL SEND
DWC. RREG
LXI H,KTS04
CALL TPROC
LXI H,MBUF
MOV A,M
ORA A
JNZ POUTERR
LDA ITEST
ORA A
CNZ WRREQ
JMP TS05X
\f
; MEMORY DATA TEST MODULE: "RAMB+28." AND "RAMB+29."
; PATTERN: 52525
TS07: MVI A,276 ;
STA RCAB ;
LDA RAMB+28. ;
CALL TS08 ;
MVI A,316 ;
STA RCAB ;
LDA RAMB+29. ;
CALL TS08 ;
JMP TS09 ;
TS08: STA PASSC ;
TS07X: CALL GMODU
RC
LXI H,TSMON
SHLD ABUF
MVI H,0
LDA RCAB
MOV L,A
SHLD ABUF+2
CALL SEND
DWC. PADDR
LXI H,KTS05
CALL TPROC
LXI H,MBUF
MOV A,M
ORA A
JNZ POUTERR
LDA ITEST
ORA A
CNZ WRREQ
JMP TS07X
; MEMORY DATA TEST.
; TEST MODULES SELECTED IN RAMB+28. AND RAMB+29.
; PATTERN: 125252.
TS09: MVI A,276 ;
STA RCAB ;
LDA RAMB+28. ;
CALL TS10 ;
MVI A,316 ;
STA RCAB ;
LDA RAMB+29. ;
CALL TS10 ;
JMP TS11 ;
TS10: STA PASSC ;
TS09X: CALL GMODU
RC
LXI H,TSMIN
SHLD ABUF
MVI H,0
LDA RCAB
MOV L,A
SHLD ABUF+2
CALL SEND
DWC. PADDR
LXI H,KTS09
CALL TPROC
LXI H,MBUF
MOV A,M
ORA A
JNZ POUTERR
LDA ITEST
ORA A
CNZ WRREQ
JMP TS09X
POUTERR: POP H
JMP OUTERR
\f
; RETURN FROM BUILT-IN TEST.
; IF MODE SWITCH 4=0 THEN LOOP ELSE STOP.
TS11: IN PORTA ; READ MODE SWITCH
CMA
ANI 4 ; LOOP ?
JZ TS00 ; YES
XRA A
CALL SLAMP ; SWITCH OFF THE LAMPS
JMP TSRET
; ROUTINE TO SET I/O CONFIGURATION MAP.
; FROM "RAMB+12." TO "RAMB+27."
IOCONF: MVI A,127.
STA PASSC
IONEX: LDA PASSC
CPI -1.
RZ
OUT CDI ; SEND I/O NUMBER TO L
MVI A,TSLEV
CALL XCOM ; SEND WAIT ANSWER
IN CDO ; READ ANSWER
ORA A ; EXIST LEVEL ?
JZ NEXIST ; NO
LXI H,RAMB+12.
LDA PASSC
CALL SPRIGHT+1
MOV C,A
MVI B,0
DAD B ; CALCULATE REL ADDR
MOV A,M
STC ; 1 TO BIT MASK
IOREP: RAR
MOV M,A
LXI H,PASSC
DCR M
JMP IONEX
NEXIST: LXI H,RAMB+12.
LDA PASSC
CALL SPRIGHT+1
MOV C,A
MVI B,0
DAD B ; CALCULATE REL. ADDR.
MOV A,M
STC
CMC ; 0 TO BIT MASK
JMP IOREP
\f
; PROM CONFIGURATION. PATTERN IN FIRST ADDRESS:AAAA.
PROCON: LXI H,376 ; LAST PROM.
SHLD MBASE
PRONEX: LDA MBASE
CPI 336
RZ
LXI H,0
SHLD ABUF+2
CALL GMEM ; READ FROM PROM.
LXI H,RAMB+28.
LDA MBASE
RAR
RAR
RAR
RAR
ANI 3
MOV C,A
MVI B,0 ; CALCULATE OFFSET IN TABLE
DAD B
LDA DBUF
CPI ROMCH ; CHECK PATTERN
JZ PEXIST
STC
CMC ; 0 TO BIT MASK
PROREP: MOV A,M
RAR
MOV M,A
LXI H,MBASE
DCR M
DCR M
JMP PRONEX ; TEST NEXT.
PEXIST: STC ; 1 TO BIT MASK
JMP PROREP
\f
.RDX 16
.LOC 0F26
.RDX 8
OUTTAB: DWC. ODUMMY
DWC. OSTART
DWC. ODATA
DWC. ODATA
DWC. ODATA
DWC. ODATA
DWC. ODATA
DWC. ODATA
DWC. ODATA
DWC. ODATA
DWC. OSTOP
DWC. XOSTOP
OSTART: MVI A,STRT
JMP OTXEND
ODATA: LDA XOUTCHAR
RAR
STA XOUTCHAR
MVI A,SSTRT
RAR
OTXEND: SIM
LXI H,OUTPASE
INR M
INR M
JMP INTEST
OSTOP: MVI A,STOPB
JMP OTXEND
XOSTOP: MVI A,STOPB
SIM
LXI H,OUTPASE
MVI M,0
ODUMMY: LXI H,OUTPASE
JMP INTEST
\f
OTABEL: LDA DOHALF
MOV M,A
INX H
MOV A,M
LXI H,OUTTAB
ADD L
MOV L,A
MOV L,M
PCHL
ITABEL: INX H
MOV A,M
LXI H,INTAB
ADD L
MOV L,A
MOV L,M
PCHL
\f
INTAB: DWC. WSTART
DWC. WHALF
DWC. IDATA
DWC. IDATA
DWC. IDATA
DWC. IDATA
DWC. IDATA
DWC. IDATA
DWC. IDATA
DWC. IDATA
DWC. WFULL
DWC. IEND
WSTART: RIM
RAL
JC XYTEST
BSTART: LDA BHALF
STA INDELAY
JMP INXEND
WHALF: LDA DOHALF
STA INDELAY
JMP INXEND
IDATA: RIM
RAL
LDA INCBUF
RAR
STA INCBUF
INYEND: LDA DOHALF
STA INDELAY
INXEND: LXI H,INPASE
INR M
INR M
JMP XYTEST
WFULL: LDA INCBUF
STA XINCHAR
MVI A,1
STA CHARRDY
JMP INYEND
IEND: LDA DOHALF
STA INDELAY
XRA A
STA INPASE
JMP XYTEST
\f
\f