home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol016 / mnemon21.asm < prev    next >
Assembly Source File  |  1984-04-29  |  28KB  |  1,129 lines

  1. ;*******************************************************************
  2. ;
  3. ;    MNEMONIC - A MULTI-PASS MEMORY TESTER FOR CP/M
  4. ;
  5. ;        COPYRIGHT 1978, BY
  6. ;        WILLIAM T. PRECHT & ASSOCIATES
  7. ;        1102 S. EDSON
  8. ;        LOMBARD, IL  60148
  9. ;
  10. ;********************************************************************
  11. ;MODIFIED 1/11/81 BY CHARLES H. STROM FOR OPERATION WITH MEMORY-
  12. ;MAPPED CONSOLE I/O AND WITHOUT A FRONT PANEL. SEE CONDITIONAL
  13. ;SWITCHES BELOW.
  14. ;********************************************************************
  15. ;
  16.     ORG    100H    ; ORG FOR CP/M TPA
  17. ;
  18. ; USER MODIFIABLE EQUATES FOLLOW
  19. ;
  20. MEMMAP    EQU    0    ;TRUE FOR MEMORY-MAPPED CONSOLE
  21. PANEL    EQU    1    ;TRUE FOR FRONT PANEL
  22. ;
  23. EXITA    EQU    0F800H    ; COLD BOOT ADDR
  24. CONSD    EQU    04H    ; CONSOLE DATA PORT OR MEMORY LOCATION
  25. CONST    EQU    05H    ; CONSOLE STATUS PORT OR MEMORY LOCATION
  26. CONSI    EQU    02H    ; READY BIT FOR KYBD (ACTIVE HIGH)
  27. CONSO    EQU    01H    ; READY BIT FOR CONSOLE OUTPUT (ACTIVE HIGH)
  28. SSWD    EQU    20H    ; SENSE SW 5 = DETAIL ERROR LIST
  29. SSWS    EQU    10H    ; S.S. 4 = DO SLOW TEST
  30. ;
  31. ;END OF USER MODIFIABLE EQUATES
  32. ;
  33. STAK    EQU    1000H    ; STACK ADDR - PRESERVE THIS
  34. STAKH    EQU    10H    ; STACK H/O ADDR - USED TO COMPARE TO PARMS
  35. ;
  36. ;*******************************************************************
  37. ;
  38.     JMP    START    ; BYPASS JUMP TABLE
  39. ;
  40. EXIT    JMP    EXITA    ; EXIT JUMP - GO TO COLD BOOT ADDR
  41. KEYIN    JMP    ZKEYIN    ; CUSTOM CONSOLE INPUT
  42. KSTAT    JMP    ZKSTAT    ;   "       "    READY TEST
  43. TYPE    JMP    ZTYPE    ;   "       "    OUTPUT
  44. ;
  45. ;********************************************************************
  46. ;
  47. ;        CONSOLE KEYBOARD INPUT ROUTINE
  48. ;
  49. ;********************************************************************
  50. ;
  51. ZKEYIN    EQU    $
  52.     CALL    KSTAT    ; TEST CHAR READY
  53.     JNC    KEYIN    ;  NOT READY, LOOP
  54.     IF    MEMMAP
  55.     LDA    CONSD
  56.     ENDIF
  57.     IF    NOT MEMMAP
  58.     IN    CONSD    ; READ CONSOLE DATA
  59.     ENDIF
  60.     ANI    7FH    ; STRIP PARITY
  61.     CALL    TYPE    ; ECHO IT TO TERMINAL
  62.     IF    NOT PANEL
  63.     CPI    'S'    ;S FOR SLOW/FAST TOGGLE
  64.     JNZ    XCOMP
  65.     LDA    SLOWTOGL
  66.     XRI    1
  67.     STA    SLOWTOGL
  68.     RET
  69. XCOMP    CPI    'X'    ;X FOR DETAILED/NORMAL LIST TOGGLE
  70.     RNZ
  71.     LDA    XAMTOGL
  72.     XRI    1
  73.     STA    XAMTOGL
  74.     RET
  75.     ENDIF
  76.     RET
  77. ;
  78. ZKSTAT    EQU    $
  79.     IF    MEMMAP
  80.     LDA    CONST
  81.     ENDIF
  82.     IF    NOT MEMMAP
  83.     IN    CONST    ; READ CONSOLE STATUS PORT
  84.     ENDIF
  85.     ANI    CONSI    ;  TEST INPUT READY BIT
  86.     RZ        ;  NOPE, RET
  87.     STC        ;  YUP, SET CARRY
  88.     RET
  89. ;
  90. ;********************************************************************
  91. ;
  92. ;        CONSOLE OUTPUT ROUTINE
  93. ;
  94. ;********************************************************************
  95. ;
  96. ZTYPE    EQU    $
  97.     CALL    TYPEC    ; TYPE CHAR
  98.     CPI    0DH    ; Q. CARR RTN?
  99.     RNZ        ;  NO, RETURN
  100.     MVI    A,0AH    ; GET LINE FEED
  101.     CALL    TYPEC    ;  SEND IT
  102.     RET
  103. ;
  104. TYPEC    EQU    $
  105.     PUSH    PSW    ; SAVE CHAR 2B TYPED
  106. TYPEL    IF    MEMMAP
  107.     LDA    CONST
  108.     ENDIF
  109.     IF    NOT MEMMAP
  110.     IN    CONST    ; READ CONSOLE STATUS
  111.     ENDIF
  112.     ANI    CONSO    ; TEST OUTPUT READY BIT
  113.     JZ    TYPEL    ;  NOPE, LOOP
  114.     POP    PSW    ;  ELSE, GET CHAR
  115.     IF    MEMMAP
  116.     STA    CONSD
  117.     ENDIF
  118.     IF    NOT MEMMAP
  119.     OUT    CONSD    ;  TYPE IT
  120.     ENDIF
  121.     RET
  122. ;
  123. ;
  124. ;*******************************************************************
  125. ;
  126. ;        START - PROGRAM BEGINS; DO INIT
  127. ;
  128. ;*******************************************************************
  129. ;
  130. START    EQU    $
  131.     LXI    SP,STAK    ; GET STACK ADDR
  132.     CALL    PMSG1    ; TYPE VERSION MSG
  133.     JMP    SPARM    ; BYPASS CONTINUOUS TEST 1ST TIME
  134. ;
  135. ;*******************************************************************
  136. ;
  137. ;        MAIN PROGRAM LOOP
  138. ;
  139. ;********************************************************************
  140. ;
  141. LOOP    EQU    $
  142.     CALL    KSTAT    ; TEST CONSOLE READY
  143.     JNC    CONTIN    ;  NO, LOOP TILL INTERRUPTED
  144.     IF    MEMMAP
  145.     LDA    CONSD
  146.     ENDIF
  147.     IF    NOT MEMMAP
  148.     IN    CONSD    ;  CLEAR INTERRUPTING DATA
  149.     ENDIF
  150. SPARM    EQU    $
  151.     CALL    GPARM    ; GET ADDRS TO TEST
  152.     JC    SPARM    ;  LET'S TRY GETTING THOSE PARMS AGAIN
  153.     CALL    QUICK    ; DO QUICK TEST FOR MEM PRESENT
  154. CONTIN    EQU    $
  155.     CALL    RANDS    ; SAVE RANDOM SEED
  156.     CALL    GPATT    ; GEN RANDOM PATTERNS IN EACH LOC
  157.     CALL    KSTAT    ; TEST KYBD READY
  158.     JC    LOOPP    ;  YES, PRINT MATRIX AND EXIT
  159.     CALL    RANDR    ; RESET RAND TO SEED
  160.     CALL    TPATT    ; TEST PATTERNS
  161.     CALL    KSTAT    ; TEST KYBD READY
  162.     JC    LOOPP    ;  YES, PRINT MATRIX AND EXIT
  163.     CALL    SLOW    ; DO SUPER-SLOW MEM TEST
  164.     CALL    KSTAT    ; TEST KYBD READY
  165.     JC    LOOPP    ;  YES, PRINT MATRIX AND EXIT
  166.     LHLD    PASSC    ; GET 16-BIT PASS COUNTER
  167.     INX    H    ;  PLUS 1
  168.     SHLD    PASSC    ;   AND STORE IT BACK
  169.     CALL    PRTPASS    ; PRINT PASS COUNT
  170.     JMP    LOOPX    ;  ELSE, GO TO LOOP EXIT
  171. ;
  172. LOOPP    EQU    $
  173.     CALL    PRMAT    ; PRINT ERROR MATRIX
  174. ;
  175. LOOPX    EQU    $
  176.     JMP    LOOP    ; LOOP TILL INTERRUPTED
  177. ;
  178. ;
  179. ;********************************************************************
  180. ;
  181. ;        GPARM - GET ADDRESS PARAMETERS
  182. ;
  183. ;********************************************************************
  184. ;
  185. GPARM    EQU    $
  186.     CALL    INIT    ; INIT ERROR MATRIX
  187.     CALL    GTSTA    ; GET START ADDR
  188.     RC        ;  CARRY=ERROR, SO RETURN
  189.     CALL    GTEND    ; GET END ADDR
  190.     RC        ;  CARRY, PROBLEM
  191.     RET
  192. ;
  193. ;********************************************************************
  194. ;
  195. ;        GPATT - GET RANDOM PATTERN TO ADDRESS SPACE
  196. ;
  197. ;********************************************************************
  198. ;
  199. GPATT    EQU    $
  200.     LHLD    AEND    ; GET END ADDR TO H-L
  201.     XCHG        ;  SWAP IT TO D-E
  202.     LHLD    ASTRT    ; GET STARTING ADDR TO H-L
  203. GPAT2    EQU    $
  204.     CALL    KSTAT    ; TEST KYBD READY
  205.     RC        ;  YUP, EXIT
  206.     CALL    RANDB    ; GET RANDOM BYTE
  207.     CALL    STNDX    ; STORE CHAR, BUMP INDEX
  208.     JC    GPAT2    ;  LT MAX, LOOP
  209.     RET
  210. ;
  211. ;********************************************************************
  212. ;
  213. ;        TPATT - TEST RANDOM PATTERN PREVIOUSLY GENERATED
  214. ;
  215. ;********************************************************************
  216. ;
  217. TPATT    EQU    $
  218.     LHLD    AEND    ; GET END ADDR TO H-L
  219.     XCHG        ;  SWAP IT TO D-E
  220.     LHLD    ASTRT    ; GET STARTING ADDR
  221. TPAT2    EQU    $
  222.     CALL    RANDB    ; GET RANDOM BYTE
  223.     MOV    B,M    ; GET CHAR FROM MEM TO B
  224.     CMP    B    ; TEST EXPECTED TO ACTUAL
  225.     JZ    TPAT3    ;  EQ, ON
  226.     CALL    TYPEA    ; RECORD ADDR AND FAILURE
  227.     CALL    STMAT    ;  AND STORE IN ERROR MATRIX
  228. ;
  229. TPAT3    EQU    $
  230.     CALL    KSTAT    ; TEST KYBD STATUS
  231.     RC        ;  YES, EARLY EXIT
  232.     CALL    INDEX    ; BUMP MEM PTR
  233.     JC    TPAT2    ;  LT MAX, LOOP
  234.     RET
  235. ;
  236. ;********************************************************************
  237. ;
  238. ;        STNDX - STORE BYTE IN MEMORY, BUMP INDEX
  239. ;
  240. ;********************************************************************
  241. ;
  242. STNDX    EQU    $
  243.     MOV    M,A    ; STORE CHAR IN MEM
  244.     JMP    INDEX    ;  BUMP MEM PTR AND EXIT
  245. ;
  246. ;********************************************************************
  247. ;
  248. ;        INDEX - BUMP H-L, COMPARE TO D-E (ENDING ADDR)
  249. ;
  250. ;********************************************************************
  251. ;
  252. INDEX    EQU    $
  253.     MOV    A,H    ; GET H/O OF CURR ADDR
  254.     CMP    D    ; TEST TO H/O OF END
  255.     JC    INXIT    ;  LT, ONWARD
  256.     JNZ    INXIT    ;  NOT ZERO, END
  257.     MOV    A,L    ; TEST L/O
  258.     CMP    E    ;  TO L/O OF END
  259.     JC    INXIT    ;  LT, ON
  260. ;
  261. ;        H-L = D-E
  262. ;            RESET ZERO AND CARRY FLAGS
  263. ;
  264.     MVI    A,0    ; GET ZERO
  265.     DCR    A    ; RESET ZERO FLAG
  266.     ORA    A    ;  AND CARRY
  267.     RET
  268. ;
  269. INXIT    EQU    $
  270.     INX    H    ; BUMP MEM PTR
  271.     RET
  272. ;
  273. ;********************************************************************
  274. ;
  275. ;        STMAT - STORE BIT DIFFERENCES IN ERROR MATRIX
  276. ;
  277. ;********************************************************************
  278. ;
  279. STMAT    EQU    $
  280.     PUSH    PSW    ; SAVE CHAR
  281.     PUSH    H    ; SAVE H-L
  282.     PUSH    D    ;  AND
  283.     PUSH    B    ;   REST
  284.     MOV    B,A    ; MOVE BYTE READ TO B
  285.     MOV    C,M    ; MOVE BYTE WRITTEN TO C
  286.     MOV    A,H    ; GET H/O ERROR ADDR
  287.     PUSH    PSW    ; SAVE H/O
  288.     LHLD    ASTRT    ; STARTING TEST ADDR
  289.     MOV    A,H    ; GET H/O TO ACC
  290.     ANI    0FCH    ; STRIP L/O 2 BITS
  291.     MOV    H,A    ; REPLACE H/O
  292.     POP    PSW    ; RESTORE H/O ERR ADDR
  293.     SUB    H    ; 256-BYTE DIFF
  294.     ANI    0FCH    ; CLEAR L/O 2 BITS
  295.     MVI    H,0    ; SETUP H-L
  296.     MOV    L,A    ;  TO FORM
  297.     DAD    H    ;   K INDEX TO MATRIX
  298.     DAD    H    ;    AGAIN
  299.     LXI    D,MATRX    ; MATRIX START
  300.     DAD    D    ; FORM K INDEX
  301.     SHLD    MINDX    ; STORE MATRIX INDEX
  302.     LHLD    ERRCT    ; GET ERROR COUNT
  303.     INX    H    ;  PLUS 1
  304.     SHLD    ERRCT    ;   AND STORE IT BACK
  305.     LXI    D,8    ; BIT COUNT TO D
  306. STMA2    EQU    $
  307.     MOV    A,B    ; GET BYTE READ
  308.     RRC        ; SHIFT L/O INTO CARRY
  309.     MOV    B,A    ; RETURN BYTE READ
  310.     MOV    A,C    ; GET BYTE WRITTEN
  311.     JC    STMC1    ; BIT WAS SET IN READ - SEE IF WRITTEN
  312.     RRC        ; SHIFT BYTE WRITTEN L/O BIT INTO CARRY
  313.     MOV    C,A    ; RETURN BYTE WRITTEN
  314.     JNC    STMCO    ;  NOT CARRY, BIT MATCHES
  315.     JMP    STMBT    ;  CARRY, FLAG ERR
  316. STMC1    EQU    $
  317.     RRC        ; SHIFT WRITTEN BIT INTO CARRY
  318.     MOV    C,A    ; RETURN BYTE WRITTEN
  319.     JC    STMCO    ;  CARRY, BIT MATCHES
  320. STMBT    EQU    $
  321.     PUSH    D    ; SAVE ERR CTR
  322.     MVI    H,0    ; SETUP
  323.     MOV    L,E    ;  H-L
  324.     DCR    L    ; TAKE BIT COUNT - 1
  325.     DAD    H    ;  * 2
  326.     XCHG        ; SWAP TO D-E
  327.     LHLD    MINDX    ; MATRIX K INDEX
  328.     DAD    D    ;  DISPLACE BIT LOC
  329.     MOV    E,M    ; GET L/O OF ERROR CTR
  330.     INX    H    ; BUMP PTR
  331.     MOV    D,M    ; GET H/O 
  332.     INX    D    ; INCR DBL CTR
  333.     MOV    M,D    ; REPLACE H/O
  334.     DCX    H    ; DECR MEM PTR
  335.     MOV    M,E    ; REPLACE L/O
  336.     POP    D    ; RESTORE D-E
  337. ;
  338. STMCO    EQU    $
  339.     DCR    E    ; MINUS BIT COUNTER
  340.     JNZ    STMA2    ;  LOOP TILL ALL BITS TESTED
  341.     POP    B    ; RESTORE
  342.     POP    D    ;  ALL
  343.     POP    H    ;   REGS
  344.     POP    PSW    ;    AND CHAR
  345.     RET
  346. ;
  347. ;********************************************************************
  348. ;
  349. ;        PMSG1 - TYPE VERSION MESSAGE AND INSTRUCTIONS
  350. ;
  351. ;********************************************************************
  352. ;
  353. PMSG1    EQU    $
  354.     LXI    H,MSG1    ; GET VERSION MESSAGE
  355.     CALL    LINE    ; TYPE LINE
  356.     RET
  357. ;
  358. MSG1    DB    0DH
  359.     DB    'WTP&A MNEMONIC  - VERSION 2.1',0DH
  360.     DB    0DH
  361.     DB    'ANY MEMORY FROM 1000H TO FFFFH CAN BE TESTED.',0DH
  362.     DB    'TEST WILL RUN CONTINUOUSLY '
  363.     DB    'UNTIL A KEY IS STRUCK.',0DH
  364. IF PANEL
  365.     DB    'TURN ON S.S. 5 TO GET DETAILED ERROR LIST;',0DH
  366.     DB    ' S.S. 4 TO DO SUPER-SLOW TEST.',0DH
  367. ENDIF
  368. IF NOT PANEL
  369.     DB    'AT "START ADDRESS" PROMPT ENTER;',0DH
  370.     DB    'S - To toggle test SPEED normal/super slow;',0DH
  371.     DB      'X - To toggle normal/detailed EXAMINATION of errors'
  372. ENDIF
  373.     DB    0DH,0DH
  374.     DB    'WHEN A KEY IS STRUCK, ALL CUMULATIVE ERRORS',0DH
  375.     DB    ' WILL BE SUMMARIZED BY BIT POSITION',0DH
  376.     DB    ' WITHIN 1K BOUNDARIES.',0DH
  377.     DB    0DH
  378.     DB    '(ALL INPUTS AND OUTPUTS ARE IN HEX.)',0DH
  379.     DB    0DH
  380.     DB    00
  381. ;
  382. ;********************************************************************
  383. ;
  384. ;        PMSGS - PRINT STARTING ADDR REQ MSG
  385. ;
  386. ;********************************************************************
  387. ;
  388. PMSGS    EQU    $
  389.     LXI    H,MSGS    ; GET START ADDR REQ MSG
  390.     CALL    LINE    ; TYPE LINE
  391.     RET
  392. ;
  393. MSGS    DB    'START ADDR (HEX) ?',0DH,00
  394. ;
  395. ;********************************************************************
  396. ;
  397. ;        PMSGE - TYPE ENDING ADDR REQ MSG
  398. ;
  399. ;********************************************************************
  400. ;
  401. PMSGE    EQU    $
  402.     LXI    H,MSGE    ; GET ENDING ADDR REQ MSG
  403.     CALL    LINE    ; TYPE LINE
  404.     RET
  405. ;
  406. MSGE    DB    'END ADDR (HEX) ?',0DH,00
  407. ;
  408. ;********************************************************************
  409. ;
  410. ;        LINE - TYPE A LINE TERMINATED BY X'00'
  411. ;
  412. ;********************************************************************
  413. ;
  414. LINE    EQU    $
  415.     MOV    A,M    ; GET CHAR FROM MSG
  416.     CPI    00    ; Q. MSG END?
  417.     JZ    LINEX    ;  YUP, WRAP UP
  418.     CALL    TYPE    ;  ELSE, TYPE CHAR
  419.     INX    H    ; BUMP PTR
  420.     JMP    LINE    ;   LOOP TILL MSG END
  421. ;
  422. LINEX    EQU    $
  423.     RET
  424. ;
  425. ;********************************************************************
  426. ;
  427. ;        GTSTA - GET MEMORY STARTING ADDRESS
  428. ;
  429. ;********************************************************************
  430. ;
  431. GTSTA    EQU    $
  432.     CALL    PMSGS    ; SEND STARTING REQ MSG
  433.     CALL    RDADR    ; READ ADDR FROM CONSOLE
  434.     JC    GTSTA    ;  CARRY=ERROR, SO REPROMPT
  435.     CALL    PACKA    ; PACK ADDR INTO ADDRH
  436.     LHLD    ADDRH    ; GET PACKED ADDR
  437.     SHLD    ASTRT    ;  SAVE IT IN STARTING ADDR
  438.     MOV    A,H    ; GET H/O OF START ADDR
  439.     CPI    STAKH    ; TEST TO STACK ADDR
  440.     RET
  441. ;
  442. ;********************************************************************
  443. ;
  444. ;        GTEND - GET ENDING ADDRESS
  445. ;
  446. ;********************************************************************
  447. ;
  448. GTEND    EQU    $
  449.     CALL    PMSGE    ; SEND ENDING REQ MSG
  450.     CALL    RDADR    ; READ ADDR FROM CONSOLE
  451.     JC    GTEND    ;  CARRY=ERROR, SO REPROMPT
  452.     CALL    PACKA    ; PACK ADDR INTO ADDRH
  453.     LHLD    ADDRH    ; GET PACKED ADDR
  454.     SHLD    AEND    ;  SAVE IT IN ENDING ADDR
  455.     XCHG        ; SWAP TO D-E
  456.     LHLD    ASTRT    ; GET STARTING ADDR TO H-L
  457.     MOV    A,D    ; GET H/O OF ENDING ADDR
  458.     CMP    H    ; TEST TO H/O OF START
  459.     RC        ;  LT, ERROR
  460.     RNZ        ;  NOT ZERO, GO ON
  461.     MOV    A,E    ; GET L/O OF END
  462.     CMP    L    ; TEST TO L/O OF START
  463.     RC        ;  LT, ERROR
  464.     ORA    A    ; CLEAR CARRY
  465.     RET
  466. ;
  467. ;********************************************************************
  468. ;
  469. ;        RDADR - READ 4-BYTE ADDRESS FROM CONSOLE,
  470. ;            CONVERT IT TO HEX AND STORE IT.
  471. ;
  472. ;********************************************************************
  473. ;
  474. RDADR    EQU    $
  475.     LXI    H,NRAND    ; RANDOMLY CREATE NRAND
  476.     LXI    D,ADDRA    ; ADDR TO FILL
  477.     MVI    B,4    ; CHAR COUNT
  478. ;
  479. RDSTA    EQU    $
  480.     CALL    KSTAT    ; TEST KYBD STATUS
  481.     JC    RDBYT    ;  CARRY= CHAR READY
  482.     INR    M    ;  ELSE, ADD TO NRAND DIGIT
  483.     JMP    RDSTA    ;  LOOP TILL CHAR
  484. ;
  485. RDBYT    EQU    $
  486.     CALL    KEYIN    ; READ CHAR
  487.     CALL    TESTK    ; TEST VALIDITY
  488.     JC    RDERR    ;  NG, RESTART
  489.     STAX    D    ;  OK, STORE CHAR
  490.     INX    D    ; BUMP ADDRA PTR
  491.     INX    H    ;  AND NRAND PTR
  492.     DCR    B    ; MINUS LTH COUNTER
  493.     JNZ    RDSTA    ;  LOOP TILL DONE
  494.     MVI    A,0DH    ; CARR RTN
  495.     CALL    TYPE    ;  TYPE IT
  496.     RET
  497. ;
  498. RDERR    EQU    $
  499.     PUSH    H    ; SAVE H-L (NRAND DIGIT)
  500.     LXI    H,MSGKE    ; GET ERR MSG ADDR
  501.     CALL    LINE    ; TYPE LINE
  502.     POP    H    ; RESTORE H-L
  503.     STC        ; SHOW ERROR
  504.     RET
  505. ;
  506. MSGKE    DB    0DH
  507. IF PANEL    
  508.     DB    'YOU WANTA TRY THAT AGAIN?',0DH
  509. ENDIF
  510.     DB    00
  511. ;
  512. ;********************************************************************
  513. ;
  514. ;        TESTK - TEST KEYIN CHARACTER.
  515. ;            IF CTL-C, DO COLD BOOT
  516. ;
  517. ;********************************************************************
  518. ;
  519. TESTK    EQU    $
  520.     CPI    03H    ; CTL-C?
  521.     JZ    EXIT    ;  YUP, GET OUT
  522.     CPI    '0'    ; NUMERIC
  523.     JC    TSKNG    ;  NOPE, ERR
  524.     CPI    '9'+1    ; REALLY NUMERIC?
  525.     JNC    TSKAF    ;  NO, TEST A-F
  526.     SUI    30H    ; ADJUST TO BINARY
  527.     ORA    A    ; RESET CARRY
  528.     RET
  529. ;
  530. TSKAF    EQU    $
  531.     CPI    'A'    ; TEST "A"
  532.     JC    TSKNG    ;  LT, ERR
  533.     CPI    'F'+1    ; TEST "F"
  534.     JNC    TSKNG    ;  GT F, ERR
  535.     SUI    37H    ; SUBTRACT 55
  536.     ORA    A    ; RESET CARRY
  537.     RET
  538. ;
  539. TSKNG    EQU    $
  540.     STC
  541.     RET
  542. ;
  543. ;********************************************************************
  544. ;
  545. ;        PACKA - PACK ADDRESS KEYED-IN
  546. ;
  547. ;********************************************************************
  548. ;
  549. PACKA    EQU    $
  550.     LXI    H,ADDRA    ; GET PARTIALLY-CONVERTED ADDR
  551.     CALL    PACKB    ; PACK A BYTE
  552.     MOV    D,A    ; PUT IT OVER THERE FOR THE NONCE
  553.     CALL    PACKB    ; PACK 2ND BYTE
  554.     MOV    E,A    ; COMBINE
  555.     XCHG        ;  THEM INTO H-L
  556.     SHLD    ADDRH    ; SAVE THEM IN ADDRH
  557.     RET
  558. ;
  559. PACKB    EQU    $
  560.     MOV    A,M    ; GET CHAR FROM INPUT
  561.     RLC        ; ROTATE
  562.     RLC        ;  IT
  563.     RLC        ;   TO
  564.     RLC        ;    H/O
  565.     ANI    0F0H    ; CLEAR L/O
  566.     MOV    B,A    ; SAVE IT IN B
  567.     INX    H    ; BUMP MEM PTR
  568.     MOV    A,M    ; GET NEXT CHAR
  569.     ORA    B    ;  OR ON H/O FROM B
  570.     INX    H    ;  BUMP MEM PTR AGAIN
  571.     RET
  572. ;
  573. ;********************************************************************
  574. ;
  575. ;        RANDS - SAVE RANDOM NUMBER FOR LATER RESTORATION
  576. ;
  577. ;********************************************************************
  578. ;
  579. RANDS    EQU    $
  580.     LXI    H,NRAND+3    ; PT TO L/O OF 4-BYTE RANDOM NUMBER
  581.     MVI    A,01        ; ENSURE
  582.     ORA    M        ;  THAT L/O OF NRAND
  583.     MOV    M,A        ;   ENDS IN 1
  584.     LXI    D,NRNDS+3    ;  POINT D TO RAND SAVE
  585.     JMP    RNDS2        ; GO TO COMMON MOVE RTN
  586. ;
  587. RANDR    EQU    $
  588.     LXI    H,NRNDS+3    ; FROM ADDR = RAND SAVE
  589.     LXI    D,NRAND+3    ;  TO ADDR = RANDOM NUMBER
  590. ;
  591. RNDS2    EQU    $
  592.     MVI    B,4    ; COUNT = 4
  593. ;
  594. RNDSL    EQU    $
  595.     MOV    A,M    ; GET CHAR FROM SOURCE
  596.     STAX    D    ; COPY IT TO DEST
  597.     DCX    D    ; DECR
  598.     DCX    H    ;  BOTH PTRS
  599.     DCR    B    ; MINUS COUNT
  600.     JNZ    RNDSL    ;  LOOP TILL DONE
  601.     RET
  602. ;
  603. ;
  604. ;********************************************************************
  605. ;
  606. ;        DATA AREAS
  607. ;
  608. ;********************************************************************
  609. ;
  610. NRAND    DS    4    ; PSEUDO-RANDOM NUMBER
  611. NRNDS    DS    4    ; RAND SAVE AREA
  612. ;
  613. MLTPR    DW    0A5A5H    ; RANDOM MULTIPLIER
  614. ;
  615. PRDAD    DW    0    ; PARTIAL PRODUCT A*D
  616. PRDBD    DW    0    ;   "        "    B*D
  617. PRDBC    DW    0    ;   "        "    B*C
  618. ;
  619. ADDRA    DS    4    ; ADDR INPUT
  620. ADDRH    DS    2    ; HEX EQUIV. OF ADDRA
  621. ;
  622. ASTRT    DS    2    ; HEX STARTING ADDR
  623. AEND    DS    2    ; HEX ENDING ADDR
  624. ATEST    DS    2    ; HEX TEST ADDR FOR "SLOW"
  625. ;
  626. MINDX    DW    0    ; K INDEX TO ERROR MATRIX
  627. ;
  628. PASSC    DW    0    ; PASS COUNTER
  629. ERRCT    DW    0    ; ERROR COUNTER
  630. ;
  631.     DS    2
  632. MATRX    DS    1024    ; ERROR MATRIX (64K * 16)
  633.     DS    2
  634. SLOWTOGL    DB    0    ;SLOW TEST TOGGLE
  635. XAMTOGL        DB    0    ;DETAILED LIST TOGGLE
  636. ;
  637. ;
  638. ;********************************************************************
  639. ;
  640. ;        GENERATE RANDOM BYTE
  641. ;
  642. ;********************************************************************
  643. ;
  644. RANDB    EQU    $
  645.     PUSH    D    ; SAVE
  646.     PUSH    H    ;   REGS
  647.     LDA    MLTPR+1    ; GET MULTIPLIER L/O
  648.     MOV    C,A    ;  SAVE IN C
  649.     LDA    NRAND+3    ; GET NRAND L/O
  650.     MOV    B,A    ;  SAVE IN B
  651.     CALL    MULT    ; GET 16-BIT PRODUCT IN H-L
  652.     SHLD    PRDBD    ;  STORE 1ST PARTIAL PRODUCT
  653.     LDA    MLTPR+1    ; GET MULTIPLIER H/O
  654.     MOV    C,A    ;  SAVE IN C
  655.     LDA    NRAND+2    ; GET NRAND DIG
  656.     MOV    B,A    ;  SAVE IN B
  657.     CALL    MULT    ; DO MULTIPLICATION
  658.     SHLD    PRDBC    ;  SAVE PARTIAL PRODUCT
  659.     LDA    MLTPR    ; GET MULTIPLIER L/O
  660.     MOV    C,A    ;  SAVE IN C
  661.     LDA    NRAND+3    ; GET NRAND L/O
  662.     MOV    B,A    ;  SAVE IN B
  663.     CALL    MULT    ; DO MULTIPLICATION
  664.     SHLD    PRDAD    ;  SAVE 3RD PARTIAL PROD
  665.     LDA    PRDBD    ; GET NEW L/O DIGIT
  666.     STA    NRAND+3    ;  UPDATE NRAND L/O
  667.     LXI    H,0    ; GET CLEAR SUM
  668.     MVI    B,0    ; CLEAR H/O OF ADDEND
  669.     LDA    PRDBD+1    ; GET H/O OF PROD BD
  670.     MOV    C,A    ;  TO L/O OF ADDEND
  671.     DAD    B    ; ADD INTO SUM
  672.     LDA    PRDBC    ; GET L/O OF PROD BC
  673.     MOV    C,A    ;  TO L/O OF ADDEND
  674.     DAD    B    ; ADD INTO SUM
  675.     LDA    PRDAD    ; GET L/O OF PROD AD
  676.     MOV    C,A    ;  TO L/O OF ADDEND
  677.     DAD    B    ; ADD INTO SUM
  678.     MOV    A,L    ; GET L/O OF SUM
  679.     STA    NRAND+2    ; UPDATE NRAND TO NEW VALUE
  680.     POP    H    ; RESTORE
  681.     POP    D    ;  REGS
  682.     RET
  683. ;
  684. ;********************************************************************
  685. ;
  686. ;        MULT B * C = PROD IN H-L
  687. ;
  688. ;********************************************************************
  689. ;
  690. MULT    EQU    $
  691.     PUSH    D    ; SAVE D-E
  692.     MOV    A,B    ; COPY MULTIPLICAND TO A
  693.     MVI    B,0    ; CLEAR UPPER ADDEND
  694.     LXI    H,0    ; INIT PRODUCT TO ZERO
  695.     MVI    D,8    ; MULTIPLIER BIT COUNT
  696. MULT2    EQU    $
  697.     DAD    H    ; SHIFT PRODUCT LEFT
  698.     RLC        ; MULTIPLIER BIT TO CARRY
  699.     JNC    MULTC    ;  SKIP IF BIT ZERO
  700.     DAD    B    ;  ELSE, ADD MPCND TO PARTIAL PRODUCT
  701. MULTC    EQU    $
  702.     DCR    D    ; DECR BIT COUNT
  703.     JNZ    MULT2    ;  LOOP TILL DONE
  704.     POP    D    ; RESTORE D-E
  705.     RET
  706. ;
  707. ;********************************************************************
  708. ;
  709. ;        PRMAT - PRINT ERROR BIT MATRIX
  710. ;
  711. ;********************************************************************
  712. ;
  713. PRMAT    EQU    $
  714.     CALL    PRTPASS    ; PRINT PASS COUNT
  715.     LHLD    ERRCT    ; GET ERROR COUNT
  716.     MOV    A,H    ; GET H/O
  717.     ORA    A    ; Q. 0?
  718.     JNZ    PRMAH    ;  NO, GO THRU MATRIX
  719.     MOV    A,L    ; GET L/O
  720.     ORA    A    ; Q. ZERO?
  721.     JZ    PRMAX    ;  YES, BYPASS MATRIX SEARCH
  722. PRMAH    EQU    $
  723.     LXI    H,MSGBH    ; GET BIT ERR MSG HEADER
  724.     CALL    LINE    ;  TYPE IT
  725.     LHLD    ASTRT    ; GET STARTING ADDR
  726.     MOV    A,H    ; GET H/O
  727.     ANI    0FCH    ; MASK OFF L/O 2 BITS
  728.     MOV    H,A    ;  AND MOVE IT BACK
  729.     XCHG        ;  MOVE TO D-E
  730.     LXI    H,MATRX    ; POINT TO ERROR MATRIX
  731.     MVI    B,64    ; COUNT OF K'S TO SEARCH
  732. PRMA3    EQU    $
  733.     MVI    C,8    ; # OF BIT COUNTERS PER K
  734.     PUSH    H    ; SAVE CURRENT K INDEX TO MATRIX
  735. PRMA4    EQU    $
  736.     MOV    A,M    ; GET BIT COUNTER
  737.     ORA    A    ; Q. ZERO?
  738.     JNZ    PRMA5    ;  NO, MUST PRINT THIS K
  739.     INX    H    ;  ELSE, BUMP TO NEXT BIT CTR
  740.     MOV    A,M    ; GET H/O OF BIT CTR
  741.     ORA    A    ; TEST ZERO
  742.     JNZ    PRMA5    ;  NO, PRINT K
  743.     INX    H    ;  YES, BUMP MEM PTR
  744.     DCR    C    ; MINUS BIT COUNTER
  745.     JNZ    PRMA4    ;  NOT DONE TESTING THIS K, LOOP
  746.     JMP    PRMA7    ;  ELSE, TRY NEXT K
  747. PRMA5    EQU    $
  748.     POP    H    ; RESTORE STARTING K INDEX
  749.     MVI    C,8    ; RESTART BIT COUNTER
  750.     XCHG        ; GET CURR K ADDR
  751.     PUSH    H    ;  SAVE IT
  752.     MVI    L,0    ; PRINT K ADDR ON EVEN BOUNDARY
  753.     MVI    A,' '    ; BLANK FOR SPACING
  754.     CALL    TYPE    ;  TYPE IT
  755.     CALL    TYPEB    ; TYPE IT
  756.     LXI    H,MSG2B    ; 2 BLANKS
  757.     CALL    LINE    ;  TYPE THEM
  758.     POP    H    ; RESTORE K ADDR
  759.     XCHG        ;  THEN SWAP BACK
  760. PRMA6    EQU    $
  761.     PUSH    D    ; SAVE TARGET ADDR
  762.     MOV    E,M    ; GET 1ST BYTE TO E
  763.     INX    H    ; BUMP MEM PTR
  764.     MOV    D,M    ; GET 2ND BYTE
  765.     XCHG        ; SWAP TO H-L
  766.     CALL    TYPEB    ; TYPE CTR AS THO ADDR
  767.     XCHG        ; SWAP BACK
  768.     POP    D    ; RESTORE D-E
  769.     INX    H    ; BUMP MEM PTR
  770.     DCR    C    ; MINUS COUNT
  771.     JNZ    PRMA6    ;  LOOP TILL DONE
  772.     MVI    A,0DH    ; CARR RTN
  773.     CALL    TYPE    ; TYPE IT
  774.     JMP    PRMA8    ;  AND GO TEST NEXT MATRIX LVL
  775. ;
  776. PRMA7    EQU    $
  777.     POP    H    ; RESTORE H-L
  778.     PUSH    B    ; SAVE COUNTERS
  779.     LXI    B,16    ; GET OFFSET TO NEXT K
  780.     DAD    B    ; BUMP H-L
  781.     POP    B    ; RESTORE COUNTERS
  782. PRMA8    EQU    $
  783.     DCR    B    ; MINUS K COUNTER
  784.     JZ    PRMAX    ; ZERO, DONE
  785.     XCHG        ; GET START ADDR
  786.     PUSH    B    ; SAVE BIT COUNTERS
  787.     LXI    B,400H    ; GET K BOUNDARY
  788.     DAD    B    ; ADJUST START ADDR
  789.     XCHG        ; SWAP BACK
  790.     POP    B    ; RESTORE BIT COUNTERS
  791.     JMP    PRMA3    ;  LOOP TILL DONE
  792. ;
  793. PRMAX    EQU    $
  794.     RET
  795. ;
  796. MSGBH    DB    'K ADDR   B7   B6   B5   B4'
  797.     DB    '   B3   B2   B1   B0'
  798.     DB    0DH,00
  799. ;
  800. ;********************************************************************
  801. ;
  802. ;        PRTPASS - PRINT PASS COUNTER AND TOTAL ERRORS
  803. ;
  804. ;********************************************************************
  805. ;
  806. PRTPASS    EQU    $
  807.     LXI    H,MSGPC    ; GET PASS COUNT MSG ADDR
  808.     CALL    LINE    ; TYPE IT
  809.     LHLD    PASSC    ; GET PASS COUNTER
  810.     CALL    TYPEB    ;  TYPE IT
  811.     LXI    H,MSGER    ; ERROR COUNT MESSAGE
  812.     CALL    LINE    ; TYPE LINE
  813.     LHLD    ERRCT    ; GET ERROR COUNTER
  814.     CALL    TYPEB    ;  TYPE COUNT OF ERRORS
  815.     MVI    A,0DH    ; CARR RTN
  816.     CALL    TYPE    ;  END LINE
  817.     RET
  818. ;
  819. MSGPC    DB    'PASSES COMPLETED = ',00
  820. MSGER    DB    '; COUNT OF ERROR BYTES = ',00
  821.     DB    00
  822. ;
  823. ;********************************************************************
  824. ;
  825. ;        TYPEH - TYPE A BYTE IN 2-DIGIT HEX
  826. ;
  827. ;********************************************************************
  828. ;
  829. TYPEH    EQU    $
  830.     PUSH    B    ; SAVE COUNT
  831.     MOV    B,A    ; SAVE CHAR IN B
  832.     ANI    0F0H    ; STRIP L/O
  833.     RRC        ; SHIFT
  834.     RRC        ;  TO
  835.     RRC        ;   L/O
  836.     RRC        ;    4 BITS
  837.     CALL    TYPHH    ; TYPE HEX
  838.     MOV    A,B    ; GET CHAR BACK
  839.     ANI    0FH    ; NOW STRIP H/O
  840.     CALL    TYPHH    ; TYPE HEX
  841.     POP    B    ; RESTORE COUNT
  842.     RET
  843. ;
  844. TYPHH    EQU    $
  845.     ADI    90H    ; DO
  846.     DAA        ;  HEX TO ASCII
  847.     ACI    40H    ;   ADJUSTMENT
  848.     DAA        ;    TRICK
  849.     CALL    TYPE    ; TYPE ADJUSTED HEX CHAR
  850.     RET
  851. ;
  852. ;********************************************************************
  853. ;
  854. ;        QUICK - DO QUICK TEST OF MEMORY RANGE
  855. ;            USING X'FF' AND X'00'
  856. ;
  857. ;********************************************************************
  858. ;
  859. QUICK    EQU    $
  860.     MVI    C,0FFH    ; USE FOXES FIRST
  861.     CALL    QTEST    ; DO QUICK TEST
  862.     CALL    KSTAT    ; TEST KYBD READY
  863.     RC        ;  YES, EXIT
  864.     MVI    C,00H    ; NOW USE ZEROS
  865.     CALL    QTEST    ; DO QUICK TEST AGAIN
  866.     RET
  867. ;
  868. QTEST    EQU    $
  869.     LHLD    AEND    ; GET END ADDR TO H-L
  870.     XCHG        ;  SWAP IT TO D-E
  871.     LHLD    ASTRT    ; GET STARTING ADDR
  872. QTES2    EQU    $
  873.     CALL    KSTAT    ; TEST KYBD READY
  874.     RC        ;  YES, EXIT
  875.     MOV    A,C    ; GET STORING VALUE
  876.     CALL    STNDX    ; STORE CHAR IN MEM, BUMP INDEX
  877.     JC    QTES2    ;  LT, MORE
  878.     LHLD    ASTRT    ; GET START ADDR AGAIN
  879. QTES3    EQU    $
  880.     CALL    KSTAT    ; TEST KYBD READY
  881.     RC        ;  YES, EXIT
  882.     MOV    A,C    ; GET STORED VALUE
  883.     MOV    B,M    ;  GET CHAR FROM MEM
  884.     CMP    B    ;  TEST EACH DIGIT AGAINST EXPECTED
  885.     JZ    QTES4    ;  EQ, ON
  886.     CALL    TYPEA    ;  ELSE, TYPE ERR VALS
  887.     CALL    STMAT    ; STORE BIT ERRORS IN MATRIX
  888. QTES4    EQU    $
  889.     CALL    INDEX    ; BUMP INDEX
  890.     JC    QTES3    ;  LT, AGAIN
  891.     RET
  892. ;
  893. ;********************************************************************
  894. ;
  895. ;        SLOW - DO SUPER-SLOW MEM TEST.
  896. ;            FIRST, MARCH A 1 BIT THRU A FLD OF ZEROS,
  897. ;            TESTING EACH OTHER BYTE IN THE RANGE FOR
  898. ;            A CHANGE.
  899. ;            THEN, MARCH A ZERO BIT THRU A FLD OF ONES,
  900. ;            TESTING AS ABOVE.
  901. ;
  902. ;********************************************************************
  903. ;
  904. SLOW    EQU    $
  905.     IF    PANEL
  906.     IN    255    ; READ SENSE SWS
  907.     ANI    SSWS    ; TEST SLOW SELECTED
  908.     ENDIF
  909.     IF     NOT PANEL
  910.     LDA    SLOWTOGL
  911.     ANI    01    ;DO SLOW TEST IF SLOWTOGL=1
  912.     ENDIF
  913.     RZ
  914.     MVI    B,00    ; ZEROS TO MEM FOR 1ST PHASE
  915.     CALL    SETMEM    ;  CLEAR ADDR SPACE
  916.     MVI    C,01    ; BIT REG
  917. SLOW2    EQU    $
  918.     CALL    SLOWT    ; DO SLOW TEST
  919.     CALL    KSTAT    ; TEST FOR INTERRUPTION
  920.     RC        ;  YES, GO
  921.     MOV    A,C    ; GET BIT REG
  922.     RLC        ; SHIFT BIT
  923.     JC    SLOW3    ; WHEN BIT REACHES CARRY, DONE
  924.     MOV    C,A    ; REPLACE BIT
  925.     JMP    SLOW2    ;  NOT DONE, CONTINUE
  926. SLOW3    EQU    $
  927.     MVI    B,0FFH    ; ALL ONES
  928.     CALL    SETMEM    ;  TO ADDR SPACE
  929.     MVI    C,0FEH    ; BIT REG TO A L/O ZERO
  930. SLOW4    EQU    $
  931.     CALL    SLOWT    ; DO SLOW TEST
  932.     CALL    KSTAT    ; TEST FOR INTERRUPTION
  933.     RC        ;  YES, GO
  934.     MOV    A,C    ; GET BIT REG
  935.     RLC        ; SHIFT 0 BIT LEFTWARDS
  936.     JNC    SLOW5    ; WHEN ZERO REACHES CARRY, DONE
  937.     MOV    C,A    ; REPLACE BIT REG
  938.     JMP    SLOW4    ;  NOT DONE, CONTINUE
  939. ;
  940. SLOW5    EQU    $
  941.     MVI    B,08    ; COUNT OF BELLS
  942. SLOWB    EQU    $
  943.     MVI    A,07H    ; BELL CHAR
  944.     CALL    TYPE    ;  SOUND IT
  945.     CALL    KSTAT    ; TEST KYBD READY
  946.     JC    SLOWX    ;  YES, CLEANUP
  947.     LXI    H,0    ; LONG WAIT
  948. SLOW6    EQU    $
  949.     DCR    L    ;
  950.     JNZ    SLOW6    ;
  951.     DCR    H    ;
  952.     JNZ    SLOW6    ;
  953.     DCR    B    ; MINUS BELL COUNT
  954.     JNZ    SLOWB    ;  NOT DONE, RING AGAIN
  955. SLOWX    EQU    $
  956.     MVI    A,0DH    ; CR
  957.     CALL    TYPE    ; TYPE IT
  958.     RET
  959. ;
  960. SLOWT    EQU    $
  961.     LHLD    ASTRT    ; GET STARTING ADDR FOR TEST
  962.     SHLD    ATEST    ; STORE IT AT TEST ADDR
  963. SLOWT2    EQU    $
  964.     LHLD    ATEST    ; GET TEST ADDR
  965.     MOV    M,C    ; STORE BIT REG AT TEST BYTE
  966.     LHLD    AEND    ; ENDING ADDR TO H-L
  967.     XCHG        ;  SWAP IT TO D-E
  968.     LHLD    ASTRT    ; GET STARTING ADDR
  969. SLOWS2    EQU    $
  970.     MOV    A,M    ; GET BYTE FROM MEM
  971.     CMP    B    ; TEST TO EXPECTED
  972.     JZ    SLOWS5    ;  EQ, ON
  973.     PUSH    B    ; SAVE B-C
  974.     MOV    C,A    ;  SAVE CHAR READ (ERROR)
  975.     XCHG        ; CURRENT ADDR TO D-E
  976.     LHLD    ATEST    ; GET TEST ADDR TO H-L
  977.     MOV    A,H    ; GET H/O ADDR OF TEST BYTE
  978.     CMP    D    ;  TEST TO D
  979.     JNZ    SLOWS3    ;   NOT EQ, ON
  980.     MOV    A,L    ; GET L/O
  981.     CMP    E    ;  TEST L/O OF TEST ADDR
  982.     JNZ    SLOWS3    ;  NOT EQUAL, PRT ERROR
  983.     JMP    SLOWS4    ;  AND BYPASS ERROR PRT
  984. SLOWS3    EQU    $
  985.     MOV    A,B    ; SWAP EXPECTED TO ACC
  986.     MOV    B,C    ; INSERT VALUE READ IN ERROR
  987.     CALL    TYPEA    ; TYPE ADDR
  988.     CALL    STMAT    ; STORE IN ERR MATRIX
  989. SLOWS4    EQU    $
  990.     POP    B    ; RESTORE B-C
  991.     LHLD    AEND    ; GET ENDING ADDR
  992.     XCHG        ; CURRENT ADDR BACK TO H-L
  993. SLOWS5    EQU    $
  994.     INX    H    ; BUMP MEM PTR
  995.     MOV    A,H    ; GET H/O OF CURR ADDR
  996.     CMP    D    ; TEST TO H/O OF END ADDR
  997.     JC    SLOWS2    ;  LT, CONTINUE
  998.     MOV    A,L    ; GET L/O OF CURR ADDR
  999.     CMP    E    ; TEST TO L/O OF END ADDR
  1000.     JC    SLOWS2    ;  LT, ON
  1001. SLOWSX    EQU    $
  1002.     CALL    KSTAT    ; TEST FOR INTERRUPTION
  1003.     RC        ;  YES, GO
  1004.     LHLD    ATEST    ; GET TEST ADDR
  1005.     MOV    M,B    ; REPLACE TEST BYTE
  1006.     INX    H    ; BUMP TEST ADDR
  1007.     SHLD    ATEST    ;  AND RESAVE IT
  1008.     XCHG        ; SWAP TEST ADDR TO D-E
  1009.     LHLD    AEND    ; GET END ADDR TO H-L
  1010.     MOV    A,D    ; GET H/O OF TEST ADDR
  1011.     CMP    H    ; TEST TO H/O OF END ADDR
  1012.     JC    SLOWT2    ;  LT, ON
  1013.     JNZ    SLOWTX    ;  NOT EQ, DONE
  1014.     MOV    A,E    ; GET L/O OF TEST ADDR
  1015.     CMP    L    ;  TEST TO L/O OF END ADDR
  1016.     JC    SLOWT2    ;  LT, ON
  1017.     JZ    SLOWT2    ;  EQ, 1 MORE TIME
  1018. SLOWTX    EQU    $
  1019.     RET
  1020. ;
  1021. ;********************************************************************
  1022. ;
  1023. ;        SETMEM - SET ADDR SPACE TO VALUE IN B
  1024. ;
  1025. ;********************************************************************
  1026. ;
  1027. SETMEM    EQU    $
  1028.     LHLD    AEND    ; GET ENDING ADDR
  1029.     XCHG        ;  TO D-E
  1030.     LHLD    ASTRT    ; GET STARTING ADDR
  1031. SETM2    EQU    $
  1032.     MOV    M,B    ; FILL MEM BYTE
  1033.     CALL    INDEX    ; BUMP PTR
  1034.     JC    SETM2    ;  LT, LOOP
  1035.     RET
  1036. ;
  1037. ;********************************************************************
  1038. ;
  1039. ;        INIT - SETUP MATRIX
  1040. ;
  1041. ;********************************************************************
  1042. ;
  1043. INIT    EQU    $
  1044.     LXI    H,MATRX    ; GET ERROR MATRIX ADDR
  1045.     LXI    B,1024    ;  GET MATRIX LENGTH
  1046.     XRA    A    ; GET ZERO
  1047. INIT2    EQU    $
  1048.     MOV    M,A    ; STORE ZERO IN ERROR MATRIX BYTE
  1049.     INX    H    ; BUMP MEM PTR
  1050.     DCR    C    ; MINUS L/O OF COUNT
  1051.     JNZ    INIT2    ; INNER LOOP
  1052.     DCR    B    ; MINUS COUNT
  1053.     JNZ    INIT2    ;  LOOP TILL DONE
  1054.     LXI    H,0    ; ZEROS TO
  1055.     SHLD    PASSC    ;  PASS COUNTER
  1056.     SHLD    ERRCT    ;   AND ERROR COUNTER
  1057.     RET
  1058. ;
  1059. ;********************************************************************
  1060. ;
  1061. ;        TYPEA - TYPE ERROR ADDR, WROTE, READ
  1062. ;
  1063. ;********************************************************************
  1064. ;
  1065. TYPEA    EQU    $
  1066.     PUSH    PSW    ; SAVE CHAR 2B TYPED
  1067.     IF    PANEL
  1068.     IN    255    ; READ SENSE SWS
  1069.     ANI    SSWD    ; TEST DETAIL LIST SENSE SW
  1070.     ENDIF
  1071.     IF    NOT PANEL
  1072.     LDA    XAMTOGL
  1073.     ANI    01    ; DO DETAILED LIST IF XAMTOGL=1
  1074.     ENDIF
  1075.     JZ    TYPAX    ;  YES, DON'T DETAIL ERRS
  1076.     PUSH    H    ; SAVE ADDR OF ERROR
  1077.     LHLD    ERRCT    ; GET ERROR COUNTER
  1078.     MOV    A,H    ; GET H/O
  1079.     ORA    A    ; Q. ZERO?
  1080.     JNZ    TYPA2    ;  NO, ALREADY PRINTED HEADER
  1081.     MOV    A,L    ; GET L/O
  1082.     ORA    A    ; Q. ZERO?
  1083.     JNZ    TYPA2    ;  NO, BYPASS
  1084.     LXI    H,MSGEH    ; GET ERROR HEADER MSG
  1085.     CALL    LINE    ;  TYPE IT
  1086. TYPA2    EQU    $
  1087.     POP    H    ; RESTORE ERROR ADDR
  1088.     CALL    TYPEB    ; CONVERT AND TYPE H-L
  1089.     PUSH    H    ; SAVE H-L AGAIN
  1090.     LXI    H,MSG2B    ; 2 BLANKS
  1091.     CALL    LINE    ;  TYPE IT
  1092.     POP    H    ; RESTORE H-L
  1093.     POP    PSW    ; GET CHAR
  1094.     PUSH    PSW    ;  RESAVE IT
  1095.     CALL    TYPEH    ; TYPE IT
  1096.     PUSH    H    ; SAVE H-L AGAIN
  1097.     LXI    H,MSG3B    ; 3 BLANKS
  1098.     CALL    LINE    ;  TYPE IT
  1099.     POP    H    ; RESTORE H-L
  1100.     MOV    A,B    ; GET CHAR READ
  1101.     CALL    TYPEH    ; TYPE IT
  1102.     MVI    A,0DH    ; CARR RTN
  1103.     CALL    TYPE    ;  SEND IT
  1104. TYPAX    EQU    $
  1105.     POP    PSW    ; RESTORE CHAR
  1106.     RET
  1107. ;
  1108. MSGEH    DB    'ADDR WROTE READ',0DH
  1109.     DB    00
  1110. MSG3B    DB    ' '
  1111. MSG2B    DB    '  ',00
  1112. ;
  1113. ;********************************************************************
  1114. ;
  1115. ;        TYPEB - TYPE 2-BYTE ADDRESS IN H-L
  1116. ;
  1117. ;********************************************************************
  1118. ;
  1119. TYPEB    EQU    $
  1120.     MOV    A,H    ; GET H/O OF ADDR
  1121.     CALL    TYPEH    ; TYPE IT
  1122.     MOV    A,L    ; GET L/O
  1123.     CALL    TYPEH    ;  TYPE IT
  1124.     MVI    A,' '    ; BLANK
  1125.     CALL    TYPE    ;  FOR SEPARATION
  1126.     RET
  1127. ;
  1128.     END
  1129.