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

  1. ;***********************************************************************
  2. ; MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC" VERSION 1.01  (C) 1979
  3. ;***********************************************************************
  4. ;
  5. ;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY:
  6. ;KELLY SMITH, MICROCOSM ASSOCIATES
  7. ;3055 WACO AVENUE
  8. ;SIMI VALLEY, CALIFORNIA, 93065
  9. ;(805) 527-9321 (MODEM, CP/M-NET (TM))
  10. ;(805) 527-0518 (VERBAL)
  11. ;
  12. ;
  13. ;
  14.     ORG    0100H
  15. ;
  16. ;
  17. ;
  18.     DI            ;DISABLE INTERRUPTS
  19.     LXI    SP,STACK    ;SET THE STACK POINTER
  20.     JMP    INIT        ;INITIALIZE
  21. ;
  22. ;
  23. ;
  24. ;
  25. ;
  26. ;
  27. ;DEFINE CONSOLE I/O PARAMETERS FOR ALTAIR 2SI/O BOARD
  28. ;
  29. CCTRL    EQU    010H    ;CONSOLE COMMAND/STATUS PORT
  30. CDATA    EQU    011H    ;CONSOLE DATA PORT
  31. CRRDY    EQU    001H    ;RECEIVER READY BIT
  32. CTRDY    EQU    002H    ;TRANSMITTER READY BIT
  33. ;
  34. ;
  35. ;
  36. ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TO ONE BYTE
  37. ;
  38. NBL:    SUI    '0'
  39.     RC
  40.     ADI    0E9H
  41.     RC
  42.     ADI    6
  43.     JP    NIO
  44.     ADI    7
  45.     RC
  46. NIO:    ADI    10
  47.     ORA    A
  48.     RET
  49. ;
  50. ;
  51. ;
  52. ;SUBROUTINE TO CONVERT A BYTE TO TWO HEX CHARACTERS
  53. ;
  54. LBYTE:    PUSH    PSW
  55.     RRC
  56.     RRC
  57.     RRC
  58.     RRC
  59.     ANI    0FH
  60.     CALL    HXDA
  61.     POP    PSW
  62.     ANI    0FH
  63.     JMP    HXDA
  64. ;
  65. ;
  66. ;
  67. HXDA:    CPI    10
  68.     JM    CNO
  69.     ADI    7
  70. CNO:    ADI    30H
  71.     MOV    C,A
  72.     JMP    CO
  73. ;
  74. ;
  75. ;
  76. ;CONSOLE INPUT ROUTINE
  77. ;
  78. CI:    IN    CCTRL
  79.     ANI    CRRDY
  80.     JZ    CI
  81.     IN    CDATA
  82.     ANI    7FH
  83.     RET
  84. ;
  85. ;
  86. ;
  87. CRLF:    MVI    C,0DH
  88.     CALL    CO
  89.     MVI    C,0AH
  90.     JMP    CO
  91. ;
  92. ;
  93. ;
  94. CONO:    CALL    BYTEO
  95.     CALL    CRLF
  96.     RET
  97. ;
  98. ;
  99. ;
  100. CONI:    PUSH    B
  101.     CALL    BYTEC
  102.     POP    B
  103.     RET
  104. ;
  105. ;
  106. ;
  107. ;CONSOLE OUTPUT ROUTINE
  108. ;
  109. CO:    IN    CCTRL
  110.     ANI    CTRDY
  111.     JZ    CO
  112.     MOV    A,C
  113.     OUT    CDATA
  114.     RET
  115. ;
  116. ;
  117. ;
  118. INIT:    LXI    H,01000H    ;SET DELAY COUNT FOR 6850 SETTLE TIME
  119. DELAY:    DCX    H
  120.     MOV    A,H
  121.     ORA    L
  122.     JNZ    DELAY
  123.     MVI    A,003H    ;RESET 6850 ACIA
  124.     OUT    CCTRL
  125.     MVI    A,015H
  126.     OUT    CCTRL
  127.     LXI    H,MSGN
  128.     CALL    MSG
  129. TOP:    LXI    H,MSG7    ;OUTPUT "TOP OF MEMORY=" TO CONSOLE
  130.     CALL    MSG
  131.     LXI    H,00FFFH    ;SET BASE ADDRESS OF TEST RAM -1
  132. FIND:    INX    H    ;EXAMINE EACH BYTE
  133.     MOV    A,M
  134.     CMA
  135.     MOV    M,A
  136.     CMP    M
  137.     JZ    FIND
  138.     DCX    H
  139.     CALL    HLOUT
  140.     LXI    H,QTMSG    ;OUTPUT "MEMORY QUALIFICATION TEST
  141.             ; IS IN PROGRESS" TO CONSOLE
  142.     CALL    MSG
  143.     LXI    H,01000H    ;SET MEMORY "BOTTOM" ADDRESS
  144.     SHLD    MBOT
  145.     LXI    H,0C000H    ;SET MEMORY "TOP" ADDRESS
  146.     SHLD    MTOP
  147.     LXI    H,TEST    ;SAVE "FUNKY RETURN" ADDRESS
  148.     SHLD    MTEST
  149.     JMP    RNDSL    ;GO DO RANDOM PATTERNS TEST ON 16K BYTE MEMORY
  150. TEST:    LXI    SP,STACK    ;RE-SET THE STACK
  151.     JMP    MEMTS
  152. ;
  153. ;
  154. ;
  155. MNTR:    LXI    SP,STACK
  156.     CALL    CRLF
  157.     MVI    C,'-'    ;OUTPUT PROMPT (- CHARACTER)
  158.     CALL    CO
  159.     CALL    CECHO    ;ECHO KEY-BOARD INPUT OUT TO CONSOLE
  160.     CPI    'M'
  161.     JZ    MEM    ;JUMP TO MEMORY DISPLAY/ALTER,IF "M"
  162.     CPI    'G'
  163.     JZ    GO    ;JUMP TO GO TO MEMORY ADDRESS,IF "G"
  164.     CPI    'T'
  165.     JZ    MEMTS    ;JUMP TO MEMORY TEST START,IF "T"
  166. LER:    CALL    CRLF    ;KEEP IT NEAT
  167.     MVI    C,'?'    ;LINE INPUT ERROR,OUTPUT "?" TO CONSOLE
  168.     CALL    CO
  169.     JMP    MNTR
  170. ;
  171. ;
  172. ;
  173. CECHO:    CALL    CI
  174.     MOV    C,A
  175.     CALL    CO
  176.     RET
  177. ;
  178. ;
  179. ;
  180. GO:    LXI    H,MSG2    ;OUTPUT "GO ADDRESS=" TO CONSOLE
  181.     CALL    MSG
  182.     CALL    PARAM
  183.     CALL    CRLF
  184.     PCHL
  185. ;
  186. ;
  187. ;
  188. PARAM:    LXI    H,0
  189. PARM1:    CALL    CECHO
  190.     CPI    0DH
  191.     RZ
  192.     DAD    H
  193.     DAD    H
  194.     DAD    H
  195.     DAD    H
  196.     JC    LER
  197.     CALL    NBL
  198.     JC    LER
  199.     ORA    L
  200.     MOV    L,A
  201.     JMP    PARM1
  202. ;
  203. ;
  204. ;
  205. BYTEC:    CALL    CECHO
  206. BYTC1:    CALL    NBL
  207.     JC    LER
  208.     RLC
  209.     RLC
  210.     RLC
  211.     RLC
  212.     PUSH    PSW
  213.     CALL    CECHO
  214.     CALL    NBL
  215.     JC    LER
  216.     POP    B
  217.     ORA    B
  218.     RET
  219. ;
  220. ;
  221. ;
  222. BYTEO:    PUSH    PSW
  223.     CALL    BYTO1
  224.     MOV    C,A
  225.     CALL    CO
  226.     POP    PSW
  227.     CALL    BYTO2
  228.     MOV    C,A
  229.     JMP    CO
  230. BYTO1:    RRC
  231.     RRC
  232.     RRC
  233.     RRC
  234. BYTO2:    ANI    0FH
  235.     CPI    0AH
  236.     JM    BYTO3
  237.     ADI    7
  238. BYTO3:    ADI    30H
  239.     RET
  240. ;
  241. ;
  242. ;
  243. HLCO:    CALL    CRLF
  244. HLOUT:    MOV    A,H
  245.     CALL    BYTEO
  246.     MOV    A,L
  247.     CALL    BYTEO
  248.     RET
  249. ;
  250. ;
  251. ;
  252. DSPYM:    CALL    HLCO
  253.     MVI    C,'='
  254.     CALL    CO
  255.     MOV    A,M
  256.     CALL    BYTEO
  257.     MVI    C,20H
  258.     CALL    CO
  259.     RET
  260. ;
  261. ;
  262. ;
  263. MEM:    LXI    H,MSG1    ;OUTPUT "MEMORY ADDRESS=" TO CONSOLE
  264.     CALL    MSG
  265.     CALL    PARAM
  266. MEM1:    CALL    DSPYM
  267.     CALL    CECHO
  268.     CPI    00DH
  269.     JZ    MNTR
  270.     CPI    020H
  271.     JZ    MEM9
  272.     CPI    05EH
  273.     JZ    MEM10
  274.     CALL    BYTC1
  275.     MOV    M,A
  276.     CMP    M
  277.     JZ    MEM9
  278.     MVI    C,' '
  279.     CALL    CO
  280.     MVI    C,'E'
  281.     CALL    CO
  282. MEM9:    INX    H
  283.     JMP    MEM1
  284. MEM10:    DCX    H
  285.     JMP    MEM1
  286. ;
  287. ;
  288. ;
  289. ;KEY-BOARD INTERRUPT ROUTINE,KEYED WITH "SPACE-BAR"
  290. ;
  291. KBINT:    IN    CCTRL
  292.     ANI    CRRDY
  293.     RZ
  294.     IN    CDATA
  295.     ANI    07FH    ;MASK-OFF PARITY BIT
  296.     CPI    020H    ;GOT A "SPACE-BAR"?
  297.     JZ    MNTR    ;GO TO COMMAND MONITOR,IF SO 
  298.     RET
  299. ;
  300. ;
  301. ;
  302. SP5:    MVI    C,20H
  303.     CALL    CO
  304. SP4:    MVI    C,20H
  305.     CALL    CO
  306. SP3:    MVI    C,20H
  307.     CALL    CO
  308. SP2:    MVI    C,20H
  309.     CALL    CO
  310. SP1:    MVI    C,20H
  311.     CALL    CO
  312.     RET
  313. ;
  314. ;
  315. ;
  316. ;
  317. ;
  318. ;
  319. MSGN:    DB    71,0DH,0AH,'MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC"'
  320.     DB    ' VERSION 1.01  (C) 1979'
  321. ;
  322. MSG1:    DB    14,'EMORY ADDRESS='
  323. ;
  324. MSG2:    DB    10,'O ADDRESS='
  325. ;
  326. MSG7:    DB    17,0DH,0AH,0AH,'TOP OF MEMORY='
  327. ;
  328. QTMSG:    DB    43,0DH,0AH,0AH,'MEMORY QUALIFICATION TEST IS IN PROGRESS'
  329. ;
  330. AMMSG:    DB    39,0DH,0AH,0AH,'TEST MEMORY IN "AUTO" MODE (Y OR N)?'
  331. ;
  332. DFMSG:    DB    47,0DH,0AH,0AH,'TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)?'
  333. ;
  334. TPMSG:    DB    20,' TEST IS IN PROGRESS'
  335. ;
  336. TMSG:    DB    17,0DH,0AH,0AH,'TESTING MEMORY'
  337. ;
  338. FMSG:    DB    6,',FROM '
  339. ;
  340. TOMSG:    DB    4,' TO '
  341. ;
  342. PSMSG:    DB    7,0DH,0AH,'PASS='
  343. ;
  344. ERMSG:    DB    15,', TOTAL ERRORS='
  345. ;
  346. PTSG:    DB    25,0DH,0AH,'GALLOPING PATTERNS TEST'
  347. ;
  348. RFMSG:    DB    25,0DH,0AH,'STATIC CHECK CYCLE TEST'
  349. ;
  350. CKMSG:    DB    25,0DH,0AH,'CHECKING DATA RETENTION'
  351. ;
  352. CLMSG:    DB    24,0DH,0AH,'GALLOPING COLUMNS TEST'
  353. ;
  354. RDMSG:    DB    22,0DH,0AH,'RANDOM PATTERNS TEST'
  355. ;
  356. SATSG:    DB    23,0DH,0AH,'WRITE SATURATION TEST'
  357. ;
  358. WMSG:    DB    23,0DH,0AH,'WALKING PATTERNS TEST'
  359. ;
  360. NDMSG:    DB    27,0DH,0AH,0AH,'NO MEMORY BLOCKS DROPPED'
  361. ;
  362. DMMSG:    DB    27,0DH,0AH,0AH,'DROPPED MEMORY BLOCK(S)='
  363. ;
  364. LMMSG:    DB    22,0DH,0AH,0AH,'LOW MEMORY ADDRESS='
  365. ;
  366. HMMSG:    DB    22,0DH,0AH,'HIGH MEMORY ADDRESS='
  367. ;
  368. NAMSG:    DB    24,0DH,0AH,'INVALID MEMORY ADDRESS'
  369. ;
  370. OPMSG:    DB    20,0DH,0AH,0AH,'TEST OPTIONS ARE:'
  371. ;
  372. TMSG1:    DB    30,0DH,0AH,0DH,0AH,'01-GALLOPING PATTERNS TEST'
  373. ;
  374. TMSG2:    DB    27,0DH,0AH,'02-GALLOPING COLUMNS TEST'
  375. ;
  376. TMSG3:    DB    26,0DH,0AH,'03-WALKING PATTERNS TEST'
  377. ;
  378. TMSG4:    DB    25,0DH,0AH,'04-RANDOM PATTERNS TEST'
  379. ;
  380. TMSG5:    DB    26,0DH,0AH,'05-WRITE SATURATION TEST'
  381. ;
  382. TMSG6:    DB    28,0DH,0AH,'06-STATIC CHECK CYCLE TEST'
  383. ;
  384. TMSGN:    DB    44,0DH,0AH,0AH,'ENTER TEST NUMBER (01,02,03,04,05 OR 06)='
  385. ;
  386. EPMSG:    DB    24,0DH,0AH,0AH,'ENTER PATTERN(00-FF)='
  387. ;
  388. REMSG:    DB    29,0DH,0AH,'RETENTION ERROR AT ADDRESS='
  389. ;
  390. EXMSG:    DB    31,0DH,0AH,'EXPECTED "00" DATA,READ BACK '
  391. ;
  392. MRER1:    DB    20,0DH,0AH,'ERROR AT ADDRESS=',0
  393. ;
  394. MRER2:    DB    12,'  READ BACK '
  395. ;
  396. MRER3:    DB    11,' ,EXPECTED '
  397. ;
  398. MRER4:    DB    27,0DH,0AH,'LAST ADDRESS WRITTEN WAS '
  399. ;
  400. MRER5:    DB    14,20H,',PATTERN WAS '
  401. ;
  402. MRER6:    DB    26,0DH,0AH,'ERROR READING OTHER CELL'
  403. ;
  404. MRER7:    DB    25,0DH,0AH,'ERROR READING TEST CELL'
  405. ;
  406. MRER8:    DB    12,0DH,0AH,'TEST CELL='
  407. ;
  408. MRER9:    DB    13,', OTHER CELL='
  409. ;
  410. MER10:    DB    18,20H,20H,'PATTERN STORED=',0
  411. ;
  412. MER11:    DB    16,20H,20H,'PATTERN READ=',0
  413. ;
  414. MER12:    DB    19,0DH,0AH,'BIT(S) IN ERROR=',0
  415. ;
  416. ;
  417. ;
  418. ;
  419. ;
  420. MSG:    PUSH    PSW
  421.     PUSH    B
  422.     MOV    B,M
  423.     INX    H
  424. MSGA:    MOV    C,M
  425.     CALL    CO
  426.     INX    H
  427.     DCR    B
  428.     JNZ    MSGA
  429.     POP    B
  430.     POP    PSW
  431.     RET
  432. ;
  433. ;
  434. ;
  435. ;
  436. ;
  437. ;
  438. ;ROUTINE TO FIND ALL 4K MEMORY BLOCKS AVAILABLE TO SYSTEM
  439. ;
  440. MEMTS:    LXI    H,00000H    ;CLEAR THE PASS AND ERROR COUNTERS
  441.     SHLD    PCTR
  442.     SHLD    ECTR
  443.     LXI    B,MBUF    ;POINT TO MEMORY BUFFER
  444.     MVI    E,1    ;SET-UP BASE RAM 1ST 4K BYTE TEST ADDRESS
  445. STAAD:    MOV    A,E
  446.     STAX    B    ;SAVE IT IN BUFFER
  447.     INX    B
  448. INC4K:    MVI    A,00BH    ;INCREMENT TO NEXT 4K MEMORY BLOCK,STOP IF ALL
  449.             ; MEMORY BLOCKS TRIED,FOR 16 K BYTE MEMORY
  450.     INR    E    ;BUMP FOR NEXT MEMORY BLOCK
  451.     CMP    E    ;ALL DONE?
  452.     JP    STAAD    ;IF NOT,GO TEST THIS NEW MEMORY BLOCK 
  453.     MVI    A,080H    ;YES,TAG WITH "END" IN BUFFER
  454.     STAX    B
  455. AUT:    LXI    H,AMMSG    ;OUTPUT "TEST MEMORY IN "AUTO" MODE (Y OR N)?"
  456.     CALL    MSG
  457.     CALL    CECHO    ;GET THE ANSWER 
  458.     CPI    'Y'
  459.     JZ    AUTO    ;DO AUTO MODE,IF YES
  460.     CPI    'N'
  461.     JZ    SELCT    ;LET OPERATOR SELECT,IF NO
  462.     JMP    AUT    ;OOPS...GAVE HIM TWO CHOICES,AND HE PICKED THIRD 
  463. AUTO:    CALL    KBINT    ;CHECK FOR KEY-BOARD INTERRUPT
  464.     LXI    H,DROP    ;SET-UP DROP LIST POINTER
  465.     SHLD    DROPP    ;SET DROP LIST POINTER TO START
  466.     XRA    A    ;CLEAR DROP COUNT AND ERROR FLAG
  467.     DCX    H
  468.     MOV    M,A
  469.     DCX    H
  470.     MOV    M,A
  471. AUTO0:    LXI    H,MBUF    ;POINT TO MEMORY BUFFER
  472.     SHLD    MEMPT    ;SAVE MEMORY POINTER FOR LOOPING
  473. AUTO1:    LDA    ERFLG    ;GET ERROR FLAG,TO SEE IF WE DROP MEMORY
  474.             ; BLOCK JUST TESTED OR NOT 
  475.     ORA    A
  476.     JZ    AUTO3    ;IF NOT ZERO,DROP THIS BLOCK FROM TEST 
  477.     LHLD    DROPP    ;POINT TO NEXT DROP LIST SLOT
  478.     XCHG
  479.     LHLD    BLKST    ;GET MEMORY BLOCK START ADDRESS
  480.     XCHG        ;AND NOW WE HAVE H&L REGS.AS DROP LIST POINTER,
  481.             ; AND D&E REGS. AS THE BLOCK START 
  482.     MOV    M,E    ;SAVE LOW BYTE OF BLOCK START
  483.     INX    H
  484.     MOV    M,D    ;SAVE HIGH BYTE OF BLOCK START
  485.     INX    H    ;GET H&L REGS. TO POINT TO NEXT DROP LIST SLOT 
  486.     SHLD    DROPP    ;SAVE THE NEW POINTER
  487.     LXI    H,DROPC    ;+1 TO THE DROP COUNT
  488.     INR    M
  489.     LHLD    MEMPT    ;GET THE MEMORY BLOCK POINTER
  490.     DCX    H    ;BACK-UP TO MEMORY BLOCK JUST TESTED,AND LOG IT OUT 
  491.     MVI    M,000H
  492. AUTO3:    MVI    A,9    ;SET ERROR DISPLAY COUNTER TO 8 PLUS 1
  493.     STA    ERCNT
  494.     XRA    A    ;CLEAR ERROR FLAG
  495.     STA    ERFLG
  496.     LHLD    MEMPT    ;GET MEMORY BLOCK AND BLOCK NUMBER
  497.     MOV    A,M
  498.     INX    H    ;UPDATE AND SAVE NEW POINTER
  499.     SHLD    MEMPT
  500.     ORA    A    ;TEST THE MEMORY BLOCK NUMBER
  501.     JM    AUTO0    ;RE-START IF "END" OF BUFFER
  502.     JZ    AUTO3    ;TRY NEXT ONE,IF DROPPED MEMORY BLOCK 
  503.     RLC        ;CONVERT MEMORY BLOCK NUMBER TO 4K BLOCK ADDRESS
  504.     RLC
  505.     RLC
  506.     RLC
  507.     MVI    L,000H    ;ZERO L REG.
  508.     MOV    H,A    ;MAKE A 16 BIT BLOCK ADDRESS OUT OF THIS,
  509.             ; AND SAVE AS BLOCK STARTING ADDRESS
  510.     SHLD    BLKST
  511.     ADI    010H    ;ADD 4K TO START
  512.     MOV    H,A
  513.     SHLD    MEND    ;SAVE AS MEMORY BLOCK END ADDRESS +1
  514.     LXI    H,AUTO1    ;SAVE "AUTO1" FOR LOOPING ADDRESS
  515.     SHLD    AUTOR
  516.     LXI    H,TMSG    ;OUTPUT "TESTING MEMORY " TO CONSOLE
  517.     CALL    MSG
  518.     LXI    H,FMSG    ;OUTPUT ", FROM " TO CONSOLE
  519.     CALL    MSG
  520.     LHLD    BLKST    ;GET THE MEMORY BLOCK STARTING ADDRESS
  521.     CALL    HLOUT
  522.     LXI    H,TOMSG    ;OUTPUT " TO " TO CONSOLE
  523.     CALL    MSG
  524.     LHLD    MEND    ;GET THE MEMORY ENDING ADDRESS
  525.     CALL    HLOUT
  526.     LXI    H,PSMSG    ;OUTPUT "PASS=" TO CONSOLE
  527.     CALL    MSG
  528.     LHLD    PCTR    ;GET THE PASS COUNTER,AND UPDATE IT
  529.     INX    H
  530.     SHLD    PCTR
  531.     CALL    HLOUT
  532.     LXI    H,ERMSG    ;OUTPUT ", ERRORS TOTAL=" TO CONSOLE
  533.     CALL    MSG
  534.     LHLD    ECTR    ;GET THE ERROR COUNTER,AND SHOW IT ALSO 
  535.     CALL    HLOUT
  536.     LXI    H,WRTSAT    ;SAVE "NEXT TEST" ADDRESS
  537.     SHLD    MTEST
  538.     JMP    RANPT    ;GO DO RANDOM PATTERNS MEMORY TEST
  539. ;
  540. ;
  541. ;
  542. ;ROUTINE TO DO WRITE AMPLIFIER SATURATION TEST IN "AUTO MODE"
  543. ;
  544. WRTSAT:    LXI    SP,STACK    ;SET THE STACK POINTER
  545.     LXI    H,SATSG    ;OUTPUT "WRITE SATURATION TEST" TO CONSOLE
  546.     CALL    MSG
  547.     LHLD    BLKST    ;GET MEMORY BLOCK STARTING ADDRESS
  548.     SHLD    MBOT    ;SAVE AS MEMORY BOTTOM ADDRESS
  549.     LHLD    MEND    ;GET MEMORY BLOCK END ADDRESS
  550.     SHLD    MTOP    ;SAVE A MEMORY "TOP" ADDRESS
  551.     MVI    B,100    ;SET-UP FOR 100 WRITE SATURATION PASSES
  552.     XRA    A    ;SATURATE WITH 0'S FIRST
  553.     CALL    SAT    ;WRITE WITH PATTERN,100 TIMES
  554.     MVI    A,0FFH    ;FLIP PATTERN TO 1'S
  555.     CALL    BAKPT    ;WRITE 1 TIME ONLY
  556.     CALL    SATRD    ;DO SATURATION READ
  557.     MVI    B,100    ;AGAIN SET-UP 100 WRITE SATURATION PASSES
  558.     MVI    A,0FFH    ;NOW SATURATE WITH 1'S
  559.     CALL    SAT    ;WRITE WITH PATTERN,100 TIMES
  560.     XRA    A    ;FLIP PATTERN TO 0'S
  561.     CALL    BAKPT    ;WRITE 1 TIME ONLY
  562.     CALL    SATRD    ;DO SATURATION READ
  563.     JMP    GAL    ;GO DO "GALLOPING PATTERNS" MEMORY TEST
  564. ;
  565. ;
  566. ;
  567. ;ROUTINE TO DO WRITE SATURATION TEST IN "SELECT MODE"
  568. ;
  569. WSATT:    MVI    B,100    ;SET-UP FOR 100 WRITE SATURATION PASSES
  570.     CALL    SAT    ;WRITE WITH SELECTED PATTERN,100 TIMES
  571.     CMA        ;WRITE WITH COMPLEMENT,1 PASS
  572.     CALL    BAKPT
  573.     CALL    SATRD    ;READ THE DATA
  574.     LDA    TPATT    ;GET SAVED TEST PATTERN
  575.     MVI    B,100    ;NOW DO COMPLEMENT 100 TIMES
  576.     CALL    SAT    ;....AND WE'RE OFF
  577.     CMA        ;WRITE WITH COMPLEMENT,1 PASS
  578.     CALL    BAKPT
  579.     CALL    SATRD    ;READ THE DATA
  580.     RET
  581. ;
  582. ;
  583. ;
  584. ;SUBROUTINE TO READ 1 PASS "BACKGROUND" PATTERN AS CONTAINED IN A REG.
  585. ;
  586. SATRD:    LHLD    MTOP    ;GET MEMORY "TOP" ADDRESS
  587.     XCHG        ;SWAP H&L REGS. TO D&E REGS.
  588.     LHLD    MBOT    ;TOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS.
  589.     MOV    B,A    ;SAVE PATTERN IN B REG.
  590.     STA    TPATT    ;SAVE DATA PATTERN FOR POSSIBLE ERROR DISPLAY
  591. FSTRD:    CALL    COMP    ;ALL DONE?
  592.     RZ
  593.     MOV    A,M    ;GET A BYTE FROM MEMORY
  594.     CMP    B    ;GOT A MATCH?
  595.     CNZ    SATER    ;INDICATE "WRITE SATURATION" ERROR IF NO MATCH
  596.     INX    H    ;BUMP POINTER FOR NEXT BYTE
  597.     JMP    FSTRD    ;DO FAST READ ON MORE MEMORY
  598. ;
  599. ;
  600. ;
  601. SAT:    PUSH    PSW    ;EXILE THE A REG.
  602.     CALL    KBINT    ;CHECK KEY-BOARD INTERRUPT
  603.     POP    PSW    ;BACK FROM EXILE
  604.     PUSH    B    ;SAVE PASSES ON STACK
  605.     CALL    BAKPT    ;WRITE THE "BACKGROUND" PATTERN
  606.     POP    B    ;GET PASS COUNT
  607.     DCR    B    ;DE-BUMP THE PASS COUNT
  608.     JNZ    SAT    ;CONTINUE WRITING 'TILL 100 PASSES COMPLETED
  609.     RET
  610. ;
  611. ;
  612. ;
  613. ;SUBROUTINE TO INDICATE ERROR IN WRITE SATURATION TEST
  614. ;
  615. SATER:    STA    ERPAT    ;SAVE "BAD" BYTE
  616.     MVI    A,0FFH    ;SET ERROR FLAG
  617.     STA    ERFLG
  618.     PUSH    H    ;SAVE BAD BYTE ADDRESS
  619.     LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  620.     INX    H
  621.     SHLD    ECTR
  622.     LDA    ERCNT    ;DONE DISPLAYING ALL ERRORS?
  623.     DCR    A
  624.     JZ    PTX    ;DON'T DISPLAY ANY MORE ERRORS,IF SO
  625.     STA    ERCNT
  626.     LXI    H,MRER1    ;OUTPUT " ERROR AT ADDRESS=" TO CONSOLE
  627.     CALL    MSG
  628.     POP    H    ;GET BAD BYTE ADDRESS,BUT DON'T
  629.             ; CHANGE THE STACK
  630.     PUSH    H
  631.     CALL    HLOUT
  632.     LXI    H,MRER2    ;OUTPUT "  READ BACK " TO CONSOLE
  633.     CALL    MSG
  634.     LDA    ERPAT    ;GET ERROR PATTERN
  635.     CALL    BYTEO    ;SHOW IT
  636.     LXI    H,MRER3    ;OUTPUT " , EXPECTED " TO CONSOLE
  637.     JMP    SATX    ;DISPLAY EXPECTED DATA PATTERN AND EXIT
  638. ;
  639. ;
  640. ;
  641. ;ROUTINE TO DO STATIC CHECK CYCLE TEST IN "SELECT MODE"
  642. ;
  643. STATT:    MVI    A,0FFH    ;ALL 1'S PATTERN FOR FIRST PORTION OF TEST
  644.     PUSH    PSW    ;SAVE THE PATTERN
  645.     CALL    BAKPT    ;WRITE IT
  646.     LXI    B,500*5    ;DO 5 MINUTE DELAY "DO NOTHING"
  647.     CALL    LOOP1
  648.     POP    PSW    ;GET PATTERN
  649.     CALL    SATRD    ;READ AFTER DELAY TIME
  650.     XRA    A    ;ALL 0'S PATTERN FOR SECOND PORTION OF TEST
  651.     PUSH    PSW    ;SAVE THE PATTERN
  652.     CALL    BAKPT    ;WRITE IT
  653.     LXI    B,500*5    ;DO 5 MINUTE DELAY "DO NOTHING"
  654.     CALL    LOOP1
  655.     POP    PSW    ;GET PATTERN
  656.     CALL    SATRD    ;CHECK DATA AFTER 5 MINUTE DELAY
  657.     RET
  658. ;
  659. ;
  660. ;
  661. ;ROUTINE TO DO "GALLOPING" MEMORY TEST IN 256 BYTE CHUNKS
  662. ; (MEMORY DATA WILL BE FF HEX AND THEN 00 HEX)
  663. ;
  664. GAL:    LXI    H,PTSG    ;OUTPUT "GALLOPING PATTERN MEMORY TEST" TO CONSOLE
  665.     CALL    MSG
  666.     LHLD    BLKST    ;GET MEMORY BLOCK STARTING ADDRESS
  667. GAL1:    SHLD    MBOT    ;SAVE AS "CHUNK" START
  668.     INR    H    ;ADD 256
  669.     MVI    L,000H    ;CLEAN-UP L REG.
  670.     SHLD    MTOP    ;SAVE AS "CHUNK" END +1
  671.     MVI    A,0FFH    ;ALL ONES BACK-GROUND PATTERN
  672.     CALL    GALPT    ;TEST THE "CHUNK" WITH 1'S
  673.     XRA    A    ;ALL ZEROS BACK-GROUND PATTERN
  674.     CALL    GALPT    ;TEST THE "CHUNK" WITH 0'S
  675.     LHLD    MEND    ;GET "CHUNK" AND MEMORY BLOCK END
  676.     CALL    COMP    ;HAVE WE DONE ALL 16 "CHUNKS" IN THE MEMORY BLOCK?
  677.     JZ    STATIC    ;IF DONE,GO DO 1 MINUTE STATIC TEST
  678.     XCHG        ;OH...GO DO NEXT "CHUNK" IN SAME MEMORY BLOCK
  679.     JMP    GAL1
  680. ;
  681. ;
  682. ;
  683. STATIC:    LXI    H,RFMSG    ;OUTPUT "STATIC CHECK CYCLE" TO CONSOLE
  684.     CALL    MSG
  685.     LXI    B,500
  686.     CALL    LOOP1    ;DO ONE MINUTE DELAY FOR STATIC CHECK
  687.     LXI    H,CKMSG    ;OUTPUT "CHECKING DATA RETENTION" TO CONSOLE
  688.     CALL    MSG
  689.     LHLD    MEND    ;GET MEMORY BLOCK END
  690.     XCHG        ;SWAP TO D&E REGS.
  691.     LHLD    BLKST    ;GET MEMORY BLOCK STARTING ADDRESS
  692.     XRA    A    ;MAKE A 0'S BYTE FOR COMPARE
  693. LOOP3:    CMP    M    ;TEST "GALLOPING PATTERN" RESULT BYTE
  694.     CNZ    RFERR    ;IF IT DIDN'T SURVIVE,REPORT RETENTION ERROR 
  695.     INX    H    ;BUMP FOR NEXT TEST BYTE
  696.     CALL    COMP    ;HAVE WE CHECKED THE WHOLE MEMORY BLOCK?
  697.     JC    LOOP3    ;IF NOT,DO IT   
  698.     LXI    H,CLMSG    ;OUTPUT "GALLOPING COLUMN MEMORY TEST" TO CONSOLE
  699.     CALL    MSG
  700.     LHLD    BLKST    ;GET MEMORY BLOCK START
  701.     SHLD    MBOT    ;SAVE IT FOR FUTURE USE IN "GALLOPING COLUMN"
  702.     LHLD    MEND    ;GET MEMORY BLOCK END
  703.     SHLD    MTOP    ;SAVE FOR FUTURE USE IN "GALLOPING COLUMN"
  704.     MVI    A,0FFH    ;SET-UP ALL ONES PATTERN
  705.     CALL    GALCL    ;DO "GALLOPING COLUMN"
  706.     XRA    A    ;SET-UP ALL ZEROS PATTERN
  707.     CALL    GALCL    ;TEST THE MEMORY BLOCK AGAIN 
  708. ;
  709. ;
  710. ;
  711. ;ROUTINE TO WALK PATTERNS THRU THE MEMORY BLOCK IN 256 BYTE "CHUNKS",
  712. ; (WRITES 1'S,WALKS 0'S,THEN WRITES 0'S,AND THEN WALKS 1'S)
  713. ;
  714. WALK:    LXI    H,WMSG    ;OUTPUT "WALKING PATTERNS MEMORY TEST" TO CONSOLE
  715.     CALL    MSG
  716.     LHLD    BLKST    ;GET MEMORY BLOCK STARTING ADDRESS
  717. WALK1:    SHLD    MBOT    ;SAVE AS "CHUNK" STARTING ADDRESS
  718.     INR    H    ;ADD 256
  719.     MVI    L,000H    ;SCRUB L REG. 
  720.     SHLD    MTOP    ;SAVE RESULT AS "CHUNK" END +1
  721.     MVI    A,0FFH    ;MAKE AN ALL 1'S PATTERN BYTE
  722.     CALL    WALKT    ;LET'S GO FOR A WALK 
  723.     XRA    A    ;MAKE AN ALL 0'S PATTERN BYTE
  724.     CALL    WALKT    ;MAYBE WE COULD JOG FOR AWHILE?
  725.     LHLD    MEND    ;GET "CHUNK" AND BLOCK END
  726.     CALL    COMP    ;ALL THE "CHUNKS" DONE IN THE BLOCK?
  727.     JZ    TEND    ;IF ZERO,GO TO NEXT MEMORY BLOCK IN AUTO SEQUENCE
  728.     XCHG        ;NO? GET NEW "CHUNK" START ADDRESS
  729.     JMP    WALK1    ;GO TEST NEW "CHUNK"   
  730. TEND:    CALL    CDROP    ;SHOW ANY "DROPPED BLOCKS"
  731.     LHLD    AUTOR    ;GET "AUTO1" RETURN ADDRESS
  732.     PCHL        ;GO FOR IT   
  733. ;
  734. ;
  735. ;
  736. ;ROUTINE TO DO RANDOM MEMORY TEST IN "SELECT MODE"
  737. ;
  738. RNDSL:    LHLD    MTOP    ;GET OPERATOR SELECTED MEMORY "TOP" ADDRESS
  739.     MOV    B,H    ;SAVE IT IN B&C REGS.
  740.     MOV    C,L
  741.     DCX    B    ;DE-BUMP B&C REGS. TO GET PROPER "TOP"
  742.             ; MEMORY BOUNDRY ADDRESS
  743.     LHLD    MBOT    ;GET OPERATOR SELECTED MEMORY "BOTTOM" ADDRESS
  744.     JMP    RANST    ;GO TO RANDOM PATTERNS TEST START 
  745. ;
  746. ;
  747. ;
  748. ;ROUTINE TO DO RANDOM PATTERNS MEMORY TEST IN "AUTO MODE"
  749. ;
  750. RANPT:    LXI    H,RDMSG    ;OUTPUT "RANDOM PATTERNS MEMORY TEST" TO CONSOLE
  751.     CALL    MSG
  752. RANMT:    LHLD    MEND    ;GET MEMORY BLOCK END ADDRESS INTO B&C REGS.
  753.     MOV    B,H
  754.     MOV    C,L
  755.     DCX    B    ;DE-BUMP B&C REGS. TO GET PROPER BLOCK END
  756.             ; BOUNDRY ADDRESS
  757.     DCX    B
  758.     DCX    B
  759.     LHLD    BLKST    ;GET MEMORY BLOCK START ADDRESS INTO H&L REGS.,
  760.             ; AND D&E REGS.
  761. RANST:    MOV    D,H
  762.     MOV    E,L
  763.     SPHL        ;STUFF H&L REGS. INTO SP REG.
  764.     LXI    H,1    ;MAKE A STARTING "SEED" FOR FIRST RANDOM PATTERN
  765. ;
  766. ;
  767. ;
  768. ;"STORR", STORES RANDOM NUMBERS THROUGHOUT THE MEMORY TEST AREA BY
  769. ;USING RANDOM NUMBERS,CAUSING MOST PATTERN SENSITIVE AND ADDRESSING
  770. ;PROBLEMS TO BE CAUGHT.THE NUMBERS ARE STORED USING THE
  771. ;8080/8085 "PUSH" COMMAND WHICH STORES TWO ADJACENT BYTES IN THE
  772. ;FASTEST MANNER POSSIBLE.
  773. ;
  774. STORR:    INX    SP    ;BUMP STACK POINTER BY 2'S
  775.     INX    SP
  776.     PUSH    H    ;STUFF THE RANDOM DATA BYTE INTO MEMORY
  777.     POP    H
  778.     LXI    H,0    ;SCRUB H&L REGS.
  779.     DAD    SP    ;GET THE CURRENT TEST CELL ADDRESS
  780.     MOV    A,C    ;GET LOW BYTE OF MEMORY TOP ADDRESS
  781.     SUB    L    ;SUBTRACT LOW BYTE OF TEST CELL
  782.     MOV    A,B    ;GET HIGH BYTE OF MEMORY TOP ADDRESS,
  783.             ; AND SAVE CARRY ONLY
  784.     SBB    H    ;SUBTRACT HIGH BYTE OF TEST CELL ADDRESS
  785.     JC    DONE1    ;IF WE GOT THE CARRY,WERE DONE   
  786.     DCX    SP    ;NO,NOT DONE YET
  787.     DCX    SP
  788.     POP    H
  789.     MOV    A,L    ;MAKE MORE "HASH" FOR MEMORY PATTERNS
  790.     ADD    A
  791.     MOV    L,A
  792.     MOV    A,H
  793.     RAL
  794.     MOV    H,A
  795.     MVI    A,0
  796.     ADC    L
  797.     MOV    L,A
  798.     MOV    A,H
  799.     RLC
  800.     RLC
  801.     RLC
  802.     XRA    L
  803.     RRC
  804.     RRC
  805.     ANI    1
  806.     XRA    L
  807.     MOV    L,A
  808.     JMP    STORR
  809. ;
  810. ;
  811. ;
  812. ;"DONE1" CHECKS THE FIRST TWO BYTES FOR ERRORS AND ALSO CHECKS
  813. ;TO SEE WHICH PASS-THROUGH THE PROGRAM IS ON.
  814. ;
  815. DONE1:    MOV    L,E
  816.     MOV    H,D
  817.     MVI    A,1
  818.     CMP    M
  819.     JNZ    CHECK
  820.     DCR    A
  821.     INX    H
  822.     CMP    M
  823.     JNZ    ERROR
  824.     JMP    CHKR
  825. ;
  826. ;
  827. ;
  828. CHECK:    MVI    A,0FEH
  829.     CMP    M
  830.     MVI    A,1
  831.     JNZ    ERROR
  832.     DCR    A
  833.     DCR    A
  834.     INX    H
  835.     CMP    M
  836.     JNZ    ERROR
  837. ;
  838. ;
  839. ;
  840. ;"CHKR" GOES BACK AND CHECKS TO SEE IF WHAT IS STORED
  841. ;THROUGHOUT MEMORY,IS STILL THE SAME AS WHEN IT WAS STORED.
  842. ;
  843. CHKR:    MOV    A,M
  844.     RAL
  845.     DCX    H
  846.     MOV    A,M
  847.     RAL
  848.     MOV    M,A
  849.     INX    H
  850.     MOV    A,M
  851.     RAL
  852.     MOV    M,A
  853.     INX    H
  854.     MOV    A,C
  855.     SUB    L
  856.     MOV    A,B
  857.     SBB    H
  858.     JC    DONE2
  859.     DCX    H
  860.     MOV    A,M
  861.     RLC
  862.     RLC
  863.     RLC
  864.     DCX    H
  865.     XRA    M
  866.     RRC
  867.     RRC
  868.     ANI    1
  869.     XRA    M
  870.     INX    H
  871.     INX    H
  872.     CMP    M
  873.     JNZ    ERROR
  874.     INX    H
  875.     MOV    A,C
  876.     SUB    L
  877.     MOV    A,B
  878.     SBB    H
  879.     JC    DONE2
  880.     DCX    H
  881.     DCX    H
  882.     MOV    A,M
  883.     INX    H
  884.     INX    H
  885.     CMP    M
  886.     JNZ    ERROR
  887.     JMP    CHKR
  888. ;
  889. ;
  890. ;
  891. ;"DONE2" CHECKS TO SEE WHICH TEST HAS JUST BEEN DONE.  IF IT WAS
  892. ;THE FIRST TEST THEN IT SETS UP TO TEST THE COMPLIMENT, ELSE IT
  893. ;SETS UP FOR THE FINAL FOUR TESTS
  894. ;
  895. DONE2:    MOV    L,E
  896.     MOV    H,D
  897.     SPHL
  898.     LXI    H,0FFFEH
  899.     LDAX    D
  900.     CPI    2
  901.     JZ    STORR
  902.     MOV    L,E
  903.     MOV    H,D
  904.     LXI    D,0AA55H
  905. ;
  906. ;
  907. ;
  908. ;"STOAL" STORES THE TWO BYTES IN THE D&E REGISTERS (AA HEX AND 55 HEX)
  909. ;THROUGHOUT THE TEST AREA
  910. ;
  911. STOAL:    MOV    M,D
  912.     INX    H
  913.     MOV    M,E
  914.     INX    H
  915.     MOV    A,C
  916.     SUB    L
  917.     MOV    A,B
  918.     SBB    H
  919.     JNZ    STOAL
  920.     LXI    H,0
  921.     DAD    SP
  922. ;
  923. ;
  924. ;
  925. ;"CHKAL" TEST TO SEE IF THE DATA STORED THROUGHOUT MEMORY IS THE
  926. ;SAME AS THE D&E REGISTERS
  927. ;
  928. CHKAL:    MOV    A,D
  929.     MOV    D,E
  930.     MOV    E,A
  931.     CMP    M
  932.     JNZ    ERROR
  933.     INX    H
  934.     MOV    A,C
  935.     SUB    L
  936.     MOV    A,B
  937.     SBB    H
  938.     JNZ    CHKAL
  939. ;
  940. ;
  941. ;
  942. ;THIS ROUTINE FINDS OUT WHICH PASS THE TEST IS ON,
  943. ;AND THEN SETS UP TO DO THE NEXT TEST
  944. ;
  945.     LXI    H,0
  946.     DAD    SP
  947.     LXI    D,055AAH
  948.     MOV    A,M
  949.     CPI    0AAH
  950.     JZ    STOAL
  951.     LXI    D,0FFFFH
  952.     CPI    055H
  953.     JZ    STOAL
  954.     LXI    D,0
  955.     INR    A
  956.     JZ    STOAL
  957.     LHLD    MTEST    ;GO DO NEXT MEMORY TEST,WERE DONE HERE 
  958.     PCHL
  959. ;
  960. ;
  961. ;
  962. ;THIS ROUTINE PRINTS OUT WHAT IS POINTED TO IN MEMORY BY
  963. ;THE B&C REGISTERS UNTIL A ZERO BYTE IS FOUND.
  964. ;
  965. MSGOUT:    LDAX    B
  966.     ANA    A
  967.     JNZ    AR1    ;CHECKS FOR '0' END OF MESSAGE FLAG
  968.     PCHL
  969. AR1:    IN    CCTRL
  970.     ANI    CTRDY
  971.     JZ    AR1    ;CHECK IF CONSOLE READY
  972.     LDAX    B
  973.     OUT    CDATA
  974.     INX    B    ;OUTPUT CHARACTER
  975.     JMP    MSGOUT
  976. ;
  977. ;
  978. ;
  979. ;THE "ERROR" ROUTINE PRINTS OUT THAT THERE HAS BEEN AN ERROR AT
  980. ;THE ADDRESS IN THE H&L REGISTERS.IT THEN TELLS THAT THE TEST
  981. ;BYTE IS THE BYTE IN THE ACCUMULATOR AND THE ERROR BYTE IS THE
  982. ;BYTE POINTED TO BY THE H&L REGISTERS.FINALLY IT PRINTS OUT THE
  983. ;BITS THAT ARE IN DISAGREEMENT IN THE TWO BYTES.
  984. ;
  985. ERROR:    SPHL
  986.     MVI    A,0FFH    ;SET ERROR FLAG
  987.     STA    ERFLG
  988.     LDA    ERCNT    ;DONE SHOWING 8 ERRORS?
  989.     DCR    A
  990.     JZ    ER9
  991.     STA    ERCNT
  992.     LXI    H,ER1
  993.     MOV    D,A
  994.     LXI    B,MRER1    ;OUTPUT "ERROR AT ADDRESS=" TO CONSOLE
  995.     JMP    MSGOUT
  996. ;
  997. ER1:    LXI    H,0
  998.     DAD    SP
  999.     MOV    B,D
  1000.     XCHG
  1001.     LXI    H,ER2
  1002.     JMP    OUTER
  1003. ;
  1004. ER2:    MOV    D,E
  1005.     LXI    H,ER3
  1006.     JMP    OUTER
  1007. ;
  1008. ER3:    MOV    D,B
  1009.     LXI    B,MER10    ;OUTPUT "PATTERN STORED=" TO CONSOLE
  1010.     LXI    H,ER4
  1011.     JMP    MSGOUT
  1012. ;
  1013. ER4:    LXI    H,ER5
  1014.     JMP    OUTER
  1015. ;
  1016. ER5:    LXI    B,MER11    ;OUTPUT "PATTERN READ=" TO CONSOLE
  1017.     LXI    H,ER6
  1018.     JMP    MSGOUT
  1019. ;
  1020. ER6:    LXI    H,0
  1021.     DAD    SP
  1022.     MOV    E,D
  1023.     MOV    D,M
  1024.     LXI    H,ER7
  1025.     JMP    OUTER
  1026. ;
  1027. ER7:    LXI    B,MER12    ;OUTPUT "BITS IN ERROR=" TO CONSOLE
  1028.     LXI    H,ER8
  1029.     JMP    MSGOUT
  1030. ;
  1031. ER8:    MVI    D,0
  1032.     MVI    B,1
  1033.     LXI    H,0
  1034.     DAD    SP
  1035.     MOV    A,E
  1036.     XRA    M
  1037.     MOV    E,A
  1038. ;
  1039. LOP:    INR    D
  1040.     MOV    A,E
  1041.     RAR
  1042.     MOV    E,A
  1043.     JNC    NOERR
  1044. ;
  1045.     DCR    B
  1046.     JZ    LOPE
  1047. LUPE:    IN    CCTRL
  1048.     ANI    CTRDY
  1049.     JZ    LUPE
  1050.     MVI    A,','
  1051.     OUT    CDATA
  1052. LOPE:    IN    CCTRL
  1053.     ANI    CTRDY
  1054.     JZ    LOPE
  1055.     MOV    A,D
  1056.     ADI    2FH
  1057.     OUT    CDATA
  1058. NOERR:    MOV    A,D
  1059.     CPI    8
  1060.     JNZ    LOP
  1061. ER9:    LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1062.     INX    H
  1063.     SHLD    ECTR
  1064.     LHLD    MTEST    ;RETURN
  1065.     PCHL
  1066. ;
  1067. ;
  1068. ;
  1069. OUTER:    IN    CCTRL
  1070.     ANI    CTRDY
  1071.     JZ    OUTER
  1072.     MOV    A,D
  1073.     RLC
  1074.     RLC
  1075.     RLC
  1076.     RLC
  1077.     ANI    0FH
  1078.     CPI    0AH
  1079.     JC    OUTR1
  1080.     ADI    7
  1081. OUTR1:    ADI    '0'
  1082.     OUT    CDATA
  1083. OUTR2:    IN    CCTRL
  1084.     ANI    CTRDY
  1085.     JZ    OUTR2
  1086.     MOV    A,D
  1087.     ANI    0FH
  1088.     CPI    0AH
  1089.     JC    OUTR3
  1090.     ADI    7
  1091. OUTR3:    ADI    '0'
  1092.     OUT    CDATA
  1093.     PCHL
  1094. ;
  1095. ;
  1096. ;
  1097. ;
  1098. ;
  1099. ;
  1100. ;ROUTINE TO SHOW THE "DROP LIST" TO THE OPERATOR
  1101. ;
  1102. CDROP:    LDA    DROPC    ;GET THE DROP COUNT 
  1103.     ORA    A    ;DID WE LOSE ANYBODY?
  1104.     JNZ    PDROP
  1105.     LXI    H,NDMSG    ;OUTPUT "NO MEMORY BLOCKS DROPPED" TO CONSOLE
  1106.     CALL    MSG
  1107.     RET
  1108. PDROP:    LXI    H,DROP    ;POINT TO START OF THE DROP LIST
  1109. EDROP:    PUSH    PSW    ;SAVE THE DROP COUNT
  1110.     PUSH    H    ;SAVE THE DROP POINTER
  1111.     LXI    H,DMMSG    ;OUTPUT "DROPPED MEMORY BLOCK(S)=" TO CONSOLE
  1112.     CALL    MSG
  1113.     POP    H    ;GET THE DROP POINTER BACK
  1114.     MOV    E,M
  1115.     INX    H
  1116.     MOV    D,M
  1117.     INX    H    ;WERE NOW POINTING TO THE NEXT DROP LIST SLOT
  1118.     XCHG        ;GET THE ADDRESS OF THE DROPPED MEMORY BLOCK
  1119.     CALL    HLOUT
  1120.     XCHG        ;SWAP'EM
  1121.     POP    PSW    ;GET THE DROP COUNT
  1122.     DCR    A    ;DE-BUMP IT 
  1123.     JNZ    EDROP    ;DO THEM ALL 
  1124.     RET
  1125. ;
  1126. ;
  1127. ;
  1128. ;"SELECT" MODE ROUTINE (OPERATOR DEFINES ADDRESS RANGE,PATTERN,AND TEST)
  1129. ;
  1130. SELCT:    MVI    A,0FFH    ;SET ERROR DISPLAY COUNT TO 256
  1131.     STA    ERCNT
  1132.     LXI    H,SELCT    ;MAKE A RETURN ADDRESS FOR END OF TEST
  1133.     SHLD    MTEST
  1134. MENU:    LXI    H,DFMSG    ;OUTPUT "TEST "ALL","SELECT",OR "MONITOR" (Y OR N)?"
  1135.             ; TO CONSOLE
  1136.     CALL    MSG
  1137.     CALL    CECHO    ;GET THE ANSWER
  1138.     CPI    'A'    ;"ALL" CHOSEN?
  1139.     JZ    ALL
  1140.     CPI    'S'    ;"SELECT" CHOSEN?
  1141.     JZ    SEL
  1142.     CPI    'M'    ;"MONITOR" CHOSEN?
  1143.     JZ    MNTR
  1144.     JMP    MENU    ;OOPS...NONE OF THE ABOVE,TRY AGAIN
  1145. ALL:    LXI    H,01000H    ;SET MEMORY "BOTTOM"
  1146.     SHLD    MBOT
  1147.     LXI    H,0C000H    ;SET MEMORY "TOP"
  1148.     SHLD    MTOP
  1149.     JMP    SEL1    ;TEST "ALL".....
  1150. SEL:    LXI    H,LMMSG    ;OUTPUT "LOW MEMORY ADDRESS=" TO CONSOLE
  1151.     CALL    MSG
  1152.     CALL    PARAM    ;GET IT FROM OPERATOR 
  1153.     MOV    A,H    ;IS THE REQUESTED ADDRESS <1000 HEX?
  1154.     CPI    010H
  1155.     JNC    SEL0
  1156.     LXI    H,NAMSG    ;OOPS...NOT ALLOWED,OUTPUT "INVALID
  1157.             ; MEMORY ADDRESS" TO CONSOLE
  1158.     CALL    MSG
  1159.     JMP    SEL    ;GIVE'M ANOTHER CHANCE
  1160. SEL0:    SHLD    MBOT    ;SAVE IT AS MEMORY "BOTTOM" ADDRESS
  1161.     LXI    H,HMMSG    ;OUTPUT "HIGH MEMORY ADDRESS=" TO CONSOLE
  1162.     CALL    MSG
  1163.     CALL    PARAM    ;GET IT FROM OPERATOR
  1164.     XCHG        ;SWAP TO D&E REGS.
  1165.     MOV    A,D    ;GET THE HIGH BYTE OF "TOP" MEMORY ADDRESS
  1166.     LHLD    MBOT    ;GET MEMORY "BOTTOM" ADDRESS
  1167.     CMP    H    ;IS THE TOP < BOTTOM?
  1168.     JNC    STOTOP    ;IF NOT,STORE THE "TOP" FOR SAFE KEEPING
  1169.     LXI    H,NAMSG    ;ARE YOU POSSIBLY ATTEMPTING TO TRY MY PATIENCE?
  1170.     CALL    MSG
  1171.     JMP    SELCT    ;TRY AGAIN,AND AGAIN,AND AGAIN,AND.......
  1172. STOTOP:    XCHG        ;GET THE "TOP" BACK TO H&L REGS.
  1173.     INX    H    ;GO ONE PAST THE END,AND SAVE IT
  1174.     SHLD    MTOP
  1175. SEL1:    LXI    H,OPMSG    ;OUTPUT "TEST OPTIONS ARE:" TO CONSOLE
  1176.     CALL    MSG
  1177.     LXI    H,TMSG1    ;OUTPUT " 01-GALLOPING PATTERNS TEST" TO CONSOLE
  1178.     CALL    MSG
  1179.     LXI    H,TMSG2    ;OUTPUT " 02-GALLOPING COLUMNS TEST" TO CONSOLE
  1180.     CALL    MSG
  1181.     LXI    H,TMSG3    ;OUTPUT " 03-WALKING PATTERNS TEST" TO CONSOLE
  1182.     CALL    MSG
  1183.     LXI    H,TMSG4    ;OUTPUT " 04-RANDOM PATTERNS TEST" TO CONSOLE
  1184.     CALL    MSG
  1185.     LXI    H,TMSG5    ;OUTPUT " 05-WRITE SATURATION TEST" TO CONSOLE
  1186.     CALL    MSG
  1187.     LXI    H,TMSG6    ;OUTPUT " 06-STATIC CHECK CYCLE TEST" TO CONSOLE
  1188.     CALL    MSG
  1189.     LXI    H,TMSGN    ;OUTPUT " ENTER TEST NUMBER(01,02,03,04,05 OR 06)="
  1190.     CALL    MSG
  1191.     CALL    CONI    ;GET THE ANSWER 
  1192.     CPI    000H    ;HMMMM....DID HE PICK 00 HEX?
  1193.     JZ    SEL1    ;IF SO,START HIM ALL OVER AGAIN 
  1194.     CPI    007H    ;TEST NUMBER SELECTED >6?
  1195.     JNC    SEL1    ;IF YES,GIVE THE JERK ANOTHER CHANCE 
  1196.     MOV    B,A    ;SAVE THE TEST NUMBER IN B REG.
  1197.     LXI    H,EPMSG    ;OUTPUT "ENTER PATTERN(00-FF)=" TO CONSOLE
  1198.     CALL    MSG
  1199.     CALL    CONI    ;GET THE REQUESTED PATTERN
  1200.     MOV    C,A    ;SAVE IT IN C REG.
  1201.     PUSH    B    ;EXILE THE TEST NUMBER
  1202.     LXI    H,TPMSG    ;OUTPUT "  TEST IS IN PROGRESS" TO CONSOLE
  1203.     CALL    MSG
  1204.     POP    B    ;FROM WHENCE THY CAME...
  1205.     LXI    D,SELCT    ;GO BACK TO "SELECT MODE" AFTER TEST COMPLETION
  1206.     PUSH    D
  1207.     DCR    B    ;ADJUST THE TEST NUMBER FOR THE TABLE JUMP
  1208.     MOV    A,B
  1209.     RLC
  1210.     ADD    B
  1211.     MOV    E,A
  1212.     MVI    D,000H    ;MAKE A 16 BIT INDEX
  1213.     LXI    H,BTAB    ;GET THE TABLE BASE
  1214.     MOV    A,C    ;GET BACK THE SAVED PATTERN
  1215.     DAD    D    ;GET H&L REGS. TO EQUAL THE ADRESS OF THE JUMP 
  1216.     PCHL        ;GO FOR IT   
  1217. BTAB:    JMP    GALPT    ;GO DO "GALLOPING PATTERNS TEST"
  1218.     JMP    GALCL    ;GO DO "GALLOPING COLUMNS TEST"
  1219.     JMP    WALKT    ;GO DO "WALKING PATTERNS TEST"
  1220.     JMP    RNDSL    ;GO DO "RANDOM PATTERNS TEST"
  1221.     JMP    WSATT    ;GO DO "WRITE SATURATION TEST"
  1222.     JMP    STATT    ;GO DO "STATIC CHECK CYCLE TEST"
  1223.     RET        ;THIS SHOULD'NT GET USED   
  1224. ;
  1225. ;
  1226. ;
  1227. ;SUBROUTINE TO INDICATE RETENTION ERROR (GALLOPING PATTERN BAD AFTER 1 MINUTE)
  1228. ;
  1229. RFERR:    CMA        ;MAKE ERROR FLAG NON-ZERO
  1230.     STA    ERFLG
  1231.     CMA
  1232.     PUSH    H    ;SAVE ERROR BYTE ADDRESS
  1233.     LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1234.     INX    H
  1235.     SHLD    ECTR
  1236.     LDA    ERCNT    ;DONE DISPLAYING ALL ERRORS?
  1237.     DCR    A
  1238.     JZ    RFX
  1239.     STA    ERCNT
  1240.     LXI    H,REMSG    ;OUTPUT " RETENTION ERROR AT ADDRESS="
  1241.     CALL    MSG
  1242.     POP    H    ;GET THE ERROR BYTE ADDRESS
  1243.     CALL    HLOUT
  1244.     PUSH    H    ;SAVE ERROR BYTE ADDRESS FOR EXIT
  1245.     CALL    MSG
  1246.     LXI    H,EXMSG    ;OUTPUT "EXPECTED "00" DATA,READ BACK " TO CONSOLE
  1247.     CALL    MSG
  1248.     POP    H    ;RESTORE POINTER TO BAD BYTE ADDRESS,
  1249.             ; BUT DON'T CHANGE THE STACK 
  1250.     PUSH    H
  1251.     MOV    A,M    ;GET THE BAD BYTE
  1252.     CALL    BYTEO    ;SHOW IT 
  1253.     CALL    CRLF
  1254. RFX:    POP    H    ;GET THE ERROR ADDRESS BACK FOR EXIT
  1255.     RET        ;EXIT,AND CONTINUE TESTING
  1256. ;
  1257. ;
  1258. ;
  1259. ;SUBROUTINE TO INDICATE ERROR IN WALKING PATTERN
  1260. ;
  1261. PTERR:    PUSH    H    ;SAVE BAD BYTE ADDRESS
  1262.     LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1263.     INX    H
  1264.     SHLD    ECTR
  1265.     LDA    ERCNT    ;DONE DISPLAYING ERRORS?
  1266.     DCR    A
  1267.     JZ    PTX
  1268.     STA    ERCNT
  1269.     LXI    H,MRER1    ;OUTPUT " ERROR AT ADDRESS=" TO CONSOLE
  1270.     CALL    MSG
  1271.     POP    H    ;GET THE BAD BYTE ADDRESS ,BUT DON'T
  1272.             ;CHANGE THE STACK 
  1273.     PUSH    H
  1274.     CALL    HLOUT
  1275.     LXI    H,MRER2    ;OUTPUT "  READ BACK " TO CONSOLE
  1276.     CALL    MSG
  1277.     POP    H    ;GET THAT ADDRESS AGAIN 
  1278.     PUSH    H
  1279.     MOV    A,M    ;GET THE ERROR BYTE
  1280.     CALL    BYTEO    ;SHOW IT 
  1281.     LXI    H,MRER3    ;OUTPUT " , EXPECTED " TO CONSOLE
  1282.     CALL    MSG
  1283.     LDA    ERPAT    ;GET THE "GOOD" DATA BYTE
  1284.     CALL    BYTEO    ;SHOW IT ALSO 
  1285.     LXI    H,MRER4    ;OUTPUT "LAST ADDRESS WRITTEN WAS" TO CONSOLE
  1286.     CALL    MSG
  1287.     LHLD    LASTW    ;GET THE LAST ADDRESS WRITTEN
  1288.     CALL    HLOUT
  1289.     LXI    H,MRER5    ;OUTPUT " PATTERN WAS " TO CONSOLE
  1290. SATX:    CALL    MSG
  1291.     LDA    TPATT    ;GET THE TEST PATTERN AND OUTPUT IT TO CONSOLE
  1292.     CALL    BYTEO
  1293.     CALL    CRLF    ;KEEP IT NEAT
  1294.     MVI    A,0FFH    ;SET THE ERROR FLAG
  1295.     STA    ERFLG
  1296.     CALL    KBINT    ;CHECK FOR KEY-BOARD INTERRUPT
  1297. PTX:    POP    H    ;RESTORE THE "BAD" ADDRESS
  1298.     RET        ;CONTINUE TESTING
  1299. ;
  1300. ;
  1301. ;
  1302. ;SUBROUTINE TO HANDLE ERRORS IN "GALLOPING PATTERN/COLUMN TESTS
  1303. ;
  1304. ERR1:    PUSH    H
  1305.     LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1306.     INX    H
  1307.     SHLD    ECTR
  1308.     LDA    ERCNT    ;DONE DISPLAYING ERRORS?
  1309.     DCR    A
  1310.     JZ    COMEX
  1311.     STA    ERCNT
  1312.     LXI    H,MRER6    ;OUTPUT "ERROR READING OTHER CELL" TO CONSOLE
  1313.     CALL    MSG
  1314.     POP    H
  1315.     JMP    COMER    ;GO TO COMMON ERROR PROCESSING
  1316. ;
  1317. ;
  1318. ;
  1319. ERR2:    PUSH    H
  1320.     LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1321.     INX    H
  1322.     SHLD    ECTR
  1323.     LDA    ERCNT    ;DONE DISPLAYING ERRORS?
  1324.     DCR    A
  1325.     JZ    COMEX
  1326.     STA    ERCNT
  1327.     LXI    H,MRER7    ;OUTPUT "ERROR READING TEST CELL" TO CONSOLE
  1328.     CALL    MSG
  1329.     POP    H
  1330. COMER:    PUSH    H    ;PROTECT THE INNOCENT 
  1331.     PUSH    D
  1332.     PUSH    B
  1333.     PUSH    PSW
  1334.     PUSH    H
  1335.     LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1336.     INX    H
  1337.     SHLD    ECTR
  1338.     LXI    H,MRER8    ;OUTPUT "TEST CELL=" TO CONSOLE
  1339.     CALL    MSG
  1340.     POP    H
  1341.     PUSH    H
  1342.     XCHG
  1343.     CALL    HLOUT
  1344.     XCHG
  1345.     POP    H
  1346.     PUSH    H
  1347.     LXI    H,MRER9    ;OUTPUT ", OTHER CELL=" TO CONSOLE
  1348.     CALL    MSG
  1349.     POP    H
  1350.     CALL    HLOUT
  1351.     PUSH    H
  1352.     LXI    H,MER10    ;OUTPUT "PATTERN STORED=" TO CONSOLE
  1353.     CALL    MSG
  1354.     POP    H    ;BLOW-AWAY H&L REGS. TO ADJUST THE STACK 
  1355.     MOV    A,B
  1356.     CALL    BYTEO    ;SHOW IT 
  1357.     LXI    H,MER11    ;OUTPUT "PATTERN READ=" TO CONSOLE
  1358.     CALL    MSG
  1359.     LDA    TPATT
  1360.     CALL    BYTEO    ;SHOW IT ALSO 
  1361.     CALL    CRLF    ;KEEP IT NEAT
  1362.     MVI    A,0FFH    ;SET THE ERROR FLAG
  1363.     STA    ERFLG
  1364.     POP    PSW    ;EVERYBODY BACK FROM EXILE 
  1365.     POP    B
  1366.     POP    D
  1367. COMEX:    POP    H
  1368.     RET
  1369. ;
  1370. ;
  1371. ;
  1372. LOOP1:    CALL    KBINT    ;CHECK FOR KEY-BOARD INTERRUPT
  1373.     LXI    D,10000
  1374. LOOP2:    DCX    D
  1375.     MOV    A,D
  1376.     ORA    E
  1377.     JNZ    LOOP2
  1378.     DCX    B
  1379.     MOV    A,B
  1380.     ORA    C
  1381.     JNZ    LOOP1
  1382.     RET
  1383. ;
  1384. ;
  1385. ;
  1386. ;ROUTINES FOR MEMORY TEST
  1387. ;
  1388. GALPT:    MOV    B,A    ;SAVE THE PATTERN
  1389.     CALL    BAKPT    ;WRITE THE "BACKGROUND" PATTERN
  1390. GALST:    LHLD    MBOT    ;GET THE TEST CELL ADDRESS
  1391.     XCHG        ;SWAP FOR MEMORY TOP INTO H&L REGS.
  1392. PNCEL:    PUSH    D    ;SAVE TEST CELL ADDRESS
  1393.     LHLD    MBOT    ;GET ADDRESS OF OTHER CELL
  1394.     LDAX    D    ;GET CONTENTS OF TEST CELL
  1395.     CMA        ;FLIP IT OVER 
  1396.     STAX    D    ;STORE IT BACK
  1397. GPLOP:    CALL    KBINT    ;CHECK KEY-BOARD INTERRUPT
  1398.     POP    D    ;GET BACK ADDRESS OF TEST CELL
  1399.     PUSH    D
  1400.     CALL    COMP    ;SEE IF TEST ADDRESS EQUALS OTHER ADDRESS
  1401.     JZ    SKIP    ;IF YES,SKIP TESTING 
  1402.     MOV    A,M    ;GET THE OTHER CELL
  1403.     STA    TPATT    ;SAVE IT JUST IN CASE IT'S WRONG   
  1404.     CMP    B    ;EQUAL TO PATTERN?
  1405.     LDAX    D    ;READ BACK THE TEST CELL
  1406.     CNZ    ERR1    ;OOPS....REPORT THE ERROR 
  1407.     CMA        ;BACK TO ORIGINAL STATE......... 
  1408.     STA    TPATT    ;SAVE IT 
  1409.     CMP    B    ;STILL EQUAL TO PATTERN?
  1410.     CNZ    ERR2    ;OOPS....WRONG HERE ALSO 
  1411. SKIP:    INX    H    ;BUMP THE OTHER ADDRESS
  1412.     XCHG        ;MEMORY TO D&E REGS.
  1413.     LHLD    MTOP
  1414.     XCHG
  1415.     CALL    COMP    ;AT TOP OF MEMORY BLOCK?
  1416.     JNZ    GPLOP    ;IF NOT,CONTINUE "GALLOPING PATTERN" LOOP 
  1417.     POP    D    ;WHOOPIE...TOP OF MEMORY BLOCK,GET BACK TEST ADDRESS
  1418.     LDAX    D    ;GET THE TEST CELL
  1419.     CMA        ;BACK TO ORIGINAL,AND SAVE IT
  1420.     STAX    D
  1421.     INX    D    ;BUMP FOR NEXT TEST ADDRESS
  1422.     CALL    COMP    ;TOP OF BLOCK YET?
  1423.     JNZ    PNCEL    ;IF NOT,GET THE NEXT CELL FOR TEST 
  1424.     RET
  1425. ;
  1426. ;
  1427. ;
  1428. GALCL:    MOV    B,A    ;SAVE THE PATTERN
  1429.     CALL    BAKPT    ;WRITE BACKGROUND
  1430.     LHLD    MBOT
  1431. CNCEL:    PUSH    H    ;SAVE TEST CELL ADDRESS
  1432.     MOV    A,M    ;GET CONTENTS OF TEST CELL
  1433.     CMA        ;FLIP IT 
  1434.     MOV    M,A    ;CRAM IT BACK
  1435. CLOOP:    CALL    KBINT    ;CHECK FOR KEY-BOARD INTERRUPT
  1436.     MVI    E,64    ;GOLLY,A DECIMAL NUMBER 
  1437.     MVI    D,000H    ;SCRUB D REG.
  1438.     DAD    D
  1439.     XCHG        ;NOW D&E REGS. EQUAL H&L REGS.+64 
  1440.     LHLD    MTOP
  1441.     CALL    COMP
  1442.     XCHG
  1443.     JM    CINCR    ;BUMP THE TEST CELL ADDRESS IF < MEMORY TOP ADDRESS
  1444.     JZ    CINCR
  1445.     POP    D    ;GET AND SAVE THE TEST CELL
  1446.     PUSH    D
  1447.     LDAX    D
  1448.     CMA        ;FLIP IT 
  1449.     STA    TPATT    ;SAVE IT IN CASE IT'S WRONG 
  1450.     CMP    B    ;EQUAL TO,PATTERN?
  1451.     CNZ    ERR1    ;IF NOT,REPORT ERROR
  1452.     MOV    A,M    ;TEST OTHER CELL
  1453.     STA    TPATT    ;SAVE IT 
  1454.     CMP    B    ;EQUAL TO PATTERN?
  1455.     CNZ    ERR2    ;IF NOT,REPORT ERROR
  1456.     JMP    CLOOP    ;TRY NEXT OTHER CELL
  1457. CINCR:    POP    H    ;GET TEST CELL ADDRESS
  1458.     MOV    A,M    ;GET CONTENTS
  1459.     CMA        ;FLIP BACK TO ORIGINAL
  1460.     MOV    M,A    ;RESAVE
  1461.     CALL    INC64    ;BUMP TEST ADDRESS MODULO 64
  1462.     MOV    A,M    ;EQUAL TO PATTERN?
  1463.     STA    TPATT    ;SAVE IT IN CASE IT'S WRONG 
  1464.     CMP    B
  1465.     CNZ    ERR1
  1466.     CALL    INC64
  1467.     MOV    A,M
  1468.     STA    TPATT
  1469.     CMP    B
  1470.     CNZ    ERR1
  1471.     CALL    INC64
  1472.     ANI    63
  1473.     RZ        ;RETURN IF WRAPPED AROUND TO START ADDRESS 
  1474.     JMP    CNCEL
  1475. ;
  1476. ;
  1477. ;
  1478. WALKT:    CALL    BAKPT    ;WRITE FULL BACKGROUND PATTERN
  1479.     LHLD    MBOT    ;POINT TO FIRST BYTE OF BLOCK ADDRESS
  1480.     PUSH    H    ;SAVE FOR INSTANT RESET
  1481.     CMA        ;FLIP BACKGROUND PATTERN FOR TEST PATTERN
  1482.     STA    TPATT    ;SAVE IT 
  1483. WPAT:    CALL    KBINT    ;CHECK FOR KEY-BOARD INTERRUPT
  1484.     LDA    TPATT    ;GET THE TEST PATTERN
  1485.     MOV    M,A    ;STUFF PATTERN INTO MEMORY
  1486.     PUSH    H    ;SAVE "LAST WRITTEN" ADDRESS
  1487.     SHLD    LASTW
  1488.     INX    H
  1489.     CMA        ;FLIP TO BACKGROUND PATTERN
  1490. CPAT1:    CALL    COMP    ;TEST BACKGROUND PATTERN FROM "LAST WRITTEN+1",
  1491.             ; TO "END OF BLOCK"
  1492.             ;TESTED ALL REMAINING BACKGROUND?
  1493.     JZ    WKSET    ;IF YES,GO TEST PATTERN BYTES
  1494.     CMP    M    ;NO...TEST BACKGROUND BYTE 
  1495.     CNZ    PTERR    ;IF BAD BYTE,REPORT ERROR
  1496.     INX    H    ;BUMP THE POINTER
  1497.     JMP    CPAT1    ;GO FOR MORE 
  1498. WKSET:    XCHG        ;SET-UP FOR NEXT SECTION,H&L REGS. EQUAL
  1499.             ; LAST ADDRESS IN BLOCK+1
  1500.     POP    D    ;D&E REGS. EQUAL "LAST WRITTEN" ADDRESS
  1501.     XTHL        ;H&L REGS. EQUAL FIRST ADDRESS IN BLOCK
  1502.     PUSH    D    ;JAM-ON "LAST WRITTEN" TO STACK
  1503.     CMA        ;GET TEST PATTERN BACK
  1504. CPAT2:    CMP    M    ;TEST PATTERN BYTES FROM START OF BLOCK,
  1505.             ; TO "LAST WRITTEN"
  1506.     CNZ    PTERR    ;ERROR IN "WALKED" BYTE?
  1507.     CALL    COMP    ;NO,THEN ARE WE DONE?
  1508.     INX    H
  1509.     JNZ    CPAT2    ;GO FOR MORE IF NOT DONE YET 
  1510.     POP    H    ;SET-UP FOR NEXT PATTERN BYTE,H&L REGS. EQUAL
  1511.             ; "LAST WRITTEN" ADDRESS
  1512.     POP    D    ;D&E REGS. EQUAL LAST ADDRESS IN BLOCK+1
  1513.     INX    H    ;BUMP FOR NEXT ADDRESS TO WRITE
  1514.     CALL    COMP    ;DONE THE WHOLE THING?
  1515.     RZ    
  1516.     PUSH    H    ;NO,PUT A COPY OF MEMORY BOTTOM ON THE STACK
  1517.     LHLD    MBOT
  1518.     XTHL
  1519.     JMP    WPAT    ;GO DO SOME MORE 
  1520. ;
  1521. ;
  1522. ;
  1523. ;SUBROUTINE TO GENERATE BACKGROUND PATTERN AS CONTAINED IN A REG.
  1524. ;
  1525. BAKPT:    LHLD    MTOP
  1526.     XCHG
  1527.     LHLD    MBOT    ;TOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS.
  1528. BAKGR:    CALL    COMP    ;WE DONE?
  1529.     RZ
  1530.     MOV    M,A    ;STORE THE BACKGROUND PATTERN
  1531.     INX    H    ;BUMP FOR NEXT ADDRESS
  1532.     JMP    BAKGR    ;GO DO MORE 'TILL WE HIT TOP 
  1533. ;
  1534. ;
  1535. ;
  1536. ;SUBROUTINE TO INCREMENT H&L REGS. MODULO 64
  1537. ;
  1538. INC64:    INX    H    ;TEST FOR WRAP-AROUND
  1539.     MOV    A,L
  1540.     ANI    63
  1541.     RNZ
  1542.     MOV    A,L
  1543.     SUI    64
  1544.     MOV    L,A
  1545.     RNC
  1546.     DCR    H    ;BORROW IF NEEDED 
  1547.     RET
  1548. ;
  1549. ;
  1550. ;
  1551. ;SUBROUTINE TO COMPARE H&L REGS. TO D&E REGS. FOR BLOCK COMPLETION
  1552. ;
  1553. COMP:    PUSH    B
  1554.     MOV    B,A
  1555.     MOV    A,H
  1556.     SUB    D
  1557.     JNZ    COMP1
  1558.     MOV    A,L
  1559.     SUB    E
  1560. COMP1:    MOV    A,B
  1561.     POP    B
  1562.     RET
  1563. ;
  1564. ;
  1565. ;
  1566. ;STORAGE FOR VARIABLES AND STACK POINTERS
  1567. ;
  1568.     DS    16    ;16 BYTE STACK POINTER STORAGE AREA
  1569. STACK:    DS    000H
  1570. ERPAT:    DS    1    ;STORAGE FOR ERROR PATTERN
  1571. ERFLG:    DS    1    ;STORAGE FOR BLOCK ERROR FLAG
  1572. DROPC:    DS    1    ;STORAGE FOR NUMBER OF "DROPPED" BLOCKS
  1573. DROP:    DS    28    ;DROP BUFFER
  1574. DROPP:    DS    2    ;POINTER TO NEXT FREE SLOT IN DROP LIST
  1575. MBUF:    DS    15    ;MEMORY BLOCK BUFFER
  1576.     DB    080H    ;TERMINATOR FOR MEMORY BLOCK BUFFER POINTER
  1577. MEMPT:    DS    2    ;STORAGE FOR MEMORY BUFFER POINTER
  1578. BLKST:    DS    2    ;STORAGE FOR MEMORY BLOCK START ADDRESS
  1579. MEND:    DS    2    ;STORAGE FOR MEMORY BLOCK END ADDRESS
  1580. MBOT:    DS    2    ;STORAGE FOR 256 "CHUNK" START ADDRESS
  1581. MTOP:    DS    2    ;STORAGE FOR 256 "CHUNK" END ADDRESS
  1582. TPATT:    DS    1    ;STORAGE FOR LAST PATTERN WRITTEN
  1583. LASTW:    DS    2    ;STORAGE FOR LAST ADDRESS WRITTEN
  1584. MTEST:    DS    2    ;STORAGE FOR MEMORY TEST POINTER
  1585. AUTOR:    DS    2    ;STORAGE FOR "AUTO1" RETURN ADDRESS FOR LOOPING
  1586. PCTR:    DS    2    ;STORAGE FOR "PASS" COUNTER
  1587. ECTR:    DS    2    ;STORAGE FOR "ERROR" COUNTER
  1588. ERCNT:    DS    1    ;STORAGE FOR ERROR DISPLAY COUNTER
  1589. ;
  1590. ;
  1591. ;
  1592.     END
  1593.