home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MEMTEST / BRAINWSH.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  37KB  |  1,133 lines

  1. ;BBBB    RRRR     AAA     III    N   N   W   W    AAA     SSS    H   H
  2. ;B   B   R   R   A   A     I     NN  N   W   W   A   A   S   S   H   H
  3. ;B   B   R   R   A   A     I     N N N   W   W   A   A    S      H   H
  4. ;BBBB    RRRR    A   A     I     N  NN   W W W   A   A     S     HHHHH
  5. ;B   B   R R     AAAAA     I     N   N   W W W   AAAAA      S    H   H
  6. ;B   B   R  R    A   A     I     N   N   W W W   A   A   S   S   H   H
  7. ;BBBB    R   R   A   A    III    N   N    WWW    A   A    SSS    H   H
  8. ;
  9. ;
  10.         ;A Z80 PROGRAM TO TEST MEMORY RIGOROUSLY AND QUICKLY
  11.         ;RUN WITH NO M1 WAIT STATES TO FIND SLOW CHIPS
  12. ;
  13. ;last modified 8 jun 1981 at nosc hawaii to configure for that system
  14.  
  15. ;
  16. ;A SERIALIZED CIPHER IS HIDDEN IN THIS PROGRAM BY WHICH IT MAY BE
  17. ;TRACED TO THE SOURCE OF ITS RELEASE.
  18. ;
  19. ;
  20.         ORG     0100H
  21. CR      EQU     0DH
  22. LF      EQU     0AH
  23. TCR     EQU     8DH             ;WITH BIT 7 SET FOR TERMINATING STRINGS
  24. TLF     EQU     8AH
  25. TSP     EQU     0A0H
  26. MAXADR  EQU     0FFFFH          ;64K IF NO MEMORY MAPPED IO
  27. START   JR      ST1             ;JUMP AROUND DATA AREA
  28.  
  29. GIL     equ     1               ;home system configuration
  30. ZOBEX   equ     0               ;nosc configuration
  31.  
  32. ;USER'S JUMP TABLE GOES HERE
  33.  
  34.         ORG     106H
  35.  
  36. INIT:   JP      INITX
  37. CHKIN:  JP      CHKINX
  38. CRTO:   JP      CRTOX
  39. PRTO:   JP      PRTOX
  40. FREEMEM:DEFW    ENDOFIT
  41.  
  42. PBYTE:  JP      CRTOX           ;SWITCH FOR PRINTER OR CRT
  43.  
  44. FIRST   DEFW    0               ;FIRST ADDR TO TEST
  45. LAST    DEFW    0               ;LAST ADR TO TEST
  46. NEX1K   DEFW    0               ;NEXT 1K CHUNK FOR XTALK
  47. END1K   DEFW    0               ;END OF 1K CHUNK
  48. NBYTES  DEFW    0               ;LAST - FIRST +1
  49. ITER    DEFB    0               ;NO OF TIMES TO DO TEST
  50. CTR     DEFB    0               ;COUNTER FOR ITERATIONS
  51. ERCTR   DEFW    0               ;ERROR COUNTER
  52. TYCTR   DEFB    0               ;COUNTS ADDRESS TYPEOUTS IN XTALK
  53. TESTAD  DEFW    0               ;CURRENT ADR FOR IBUS TEST
  54. BYTCNT  DEFW    0               ;# BYTES LEFT TO TEST
  55. LONGI:  DEFB    0FFH            ;FF IF LONG TEST NOT WANTED, 0 IF IT IS
  56. XTLK:   DEFB    0FFH            ;FF IF XTALK TESTS NOT WANTED
  57. CONTMD: DEFB    0FFH            ;FF IF CONTINUOUS MODE NOT WANTED
  58.  
  59. ST1     LD      SP,STACK        ;GIVE STACK 64 BYTES OF ROOM
  60.         XOR     A               ;CLEAR A
  61.         LD      DE,STAKBAK
  62.         LD      HL,STACK-3      ;LEAVE ROOM FOR THE CALL
  63.         CALL    SADEHL          ;ZERO STACK AREA
  64.         CALL    INIT            ;DO WHATEVER HOUSEKEEPING IS NEEDED
  65.         LD      HL,HITHERE
  66.         CALL    GETANS
  67.         JP      NZ,ST2
  68.         LD      HL,(PRTO+1)     ;GET PRINTER ADDRESS
  69.         JP      ST3
  70. ST2:    LD      HL,(CRTO+1)     ;GET CRT ADDRESS
  71. ST3:    LD      (PBYTE+1),HL    ;PUT CRT OR PRT ADR IN VECTOR
  72.         LD      HL,NOTMSG
  73.         CALL    TYPMSG
  74.         LD      HL,START
  75.         CALL    TYPSHL           ;TYPE BEGIN OF PROGRAM
  76.         LD      HL,(FREEMEM)    ;DON'T TEST BELOW END PROGRAM
  77.         CALL    TYPSHL
  78.         LD      HL,ENTMSG
  79.         CALL    TYPMSG            ;TYPE ENTRY MESSAGE
  80.         CALL    GETHEX           ;GET FIRST ADDRESS
  81.         LD      (FIRST),HL      ;STORE FIRST ADDRESS
  82.         CALL    GETHEX           ;GET LAST ADDRESS
  83.         LD      (LAST),HL       ;STORE LAST ADDRESS
  84.         LD      HL,(LAST)       ;COMPUTE NBYTES
  85.         LD      BC,(FIRST)
  86.         AND     A               ;CLEAR CARRY FLAG
  87.         SBC     HL,BC           ;DO SUBTRACT
  88.         INC     HL              ;ADD ONE
  89.         LD      (NBYTES),HL     ;STORE NBYTES TO TEST
  90. ;
  91.         LD      HL,ITMSG
  92.         CALL    TYPMSG            ;TYPE ITERATIONS MESSAGE
  93.         CALL    GETHEX           ;GET FROM TERMINAL
  94.         LD      A,L
  95.         LD      (ITER),A        ;MAX IS FF
  96.         LD      HL,LNGMSG
  97.         CALL    GETANS          ;ASK IF WANT LONG IBUS TEST
  98.         LD      (LONGI),A       ;STORE 0 IF YES, FF IF NO
  99.         LD      HL,XTKMSG
  100.         CALL    GETANS          ;ASK IF WANT CROSSTALK TESTS
  101.         LD      (XTLK),A
  102.         LD      HL,CONMSG
  103.         CALL    GETANS          ;ASK IF WANT TO TEST FOREVER
  104.         LD      (CONTMD),A
  105.         LD      HL,0
  106.         LD      (ERCTR),HL      ;CLEAR ERROR COUNTER
  107. ;NOW BEGIN TESTING
  108. ;
  109. ;                      ZEROES AND ONES TEST
  110. ;
  111. ;
  112. ;             STORE ALL ZEROES THRU AREA
  113. ;
  114. ;             READ BACK AND TEST
  115. ;
  116. ;
  117. ;             STORE ALL ONES THRU AREA
  118. ;
  119. ;             READ BACK AND TEST
  120. ;
  121. ;
  122. ;             RECYCLE N ITERATIONS
  123. ;
  124. ;
  125. ;DO ZEROES AND ONES TEST FIRST
  126. BIGLP:  CALL    SETCNT          ;SET CTR TO ITERATIONS
  127.         LD      HL,ZMSG
  128.         CALL    TYPMSG
  129. T1      LD      A,0             ;START WITH ZEROES
  130.         CALL    STR             ;STORE IN WHOLE AREA
  131.         CALL    RD              ;CHECK FOR ERRORS
  132.         LD      A,0FFH          ;NOW DO ALL ONES
  133.         CALL    STR
  134.         CALL    RD
  135.         CALL    NTERUP          ;SEE IF ANYTHING TYPED
  136.         CALL    CKCNT           ;SEE IF CTR IS ZERO YET
  137.         JR      NZ,T1           ;GO BACK AND DO IT AGAIN
  138. ;
  139. ;                      INCREMENTING BYTE TEST
  140. ;
  141. ;
  142. ;             STORE 1 TO FF (NEVER 00) IN CONSECUTIVE BYTES
  143. ;
  144. ;               (USE CPI TO VERIFY STORED CORRECTLY)
  145. ;
  146. ;             REPEAT TIL END OF AREA
  147. ;
  148. ;
  149. ;             READ BACK AND TEST FOR KNOWN VALUES
  150. ;
  151. ;             RECYCLE N ITERATIONS
  152. ;
  153. ;
  154. ;DO ROTATING PATTERN TEST
  155.         CALL    SETCNT          ;SET CTR FOR INCREMENTING PATTERN TEST
  156.         LD      HL,INCMSG       ;NOW DO INCREMENTING PATTERN
  157.         CALL    TYPMSG            ;TYPE INCREMENTING PATTERN TEST
  158. T2      CALL    STRROT          ;STORE PATTERNS
  159.         CALL    RDROT           ;TEST THEM
  160.         CALL    NTERUP          ;SEE IF BOSS WANTS TO STOP
  161.         CALL    CKCNT           ;SEE IF ITERATIONS DONE
  162.         JR      NZ,T2           ;NOT YET
  163. ;
  164. ;
  165. ;             PART A: (NOP TEST)
  166. ;
  167. ;             STORE FF EVERYWHERE EXCEPT PROGRAM
  168. ;
  169. ;             SET UP 38H TO JP XYZ
  170. ;
  171. ;             STORE NO-OP (00 BYTE)
  172. ;
  173. ;             STORE RST 38H (FF BYTE) IN NEXT BYTE
  174. ;
  175. ;             LOAD REGISTERS WITH KNOWN PATTERN
  176. ;
  177. ;             JP NO-OP
  178. ;
  179. ;
  180. ; XYZ:        TEST TO SEE IF CAME FROM RIGHT PLACE
  181. ;
  182. ;             TEST TO SEE IF REGISTERS CHANGED
  183. ;
  184. ;             SET 00 BYTE TO FF (UNLESS DOING LONG MODE)
  185. ;
  186. ;             INDEX UP ONE BYTE AND REPEAT
  187. ;
  188. ;
  189. ;
  190. ;             PART B: (INSTRUCTION TEST)
  191. ;
  192. ;             SET UP AS FOR PART A
  193. ;
  194. ;
  195. ;             STORE SHORT PROGRAM THAT TRANSFERS DATA AND SHIFTS
  196. ;
  197. ;             SET UP REGISTERS WITH KNOWN PATTERNS
  198. ;
  199. ;             CALL PROGRAM
  200. ;
  201. ;
  202. ;             SEE IF CAME BACK PROPERLY
  203. ;
  204. ;             TEST REGISTERS FOR PROPER VALUES
  205. ;
  206. ;             INDEX TO NEXT BYTE AND REPEAT TO END OF AREA
  207. ;
  208. ;             RECYCLE N ITERATIONS
  209. ;
  210. ;
  211. ;DO INSTRUCTION READUP TESTS
  212. ;THIS TEST IS DEATH ON SLOW MEMORY CHIPS BECAUSE THE Z80 WITH
  213. ;NO M1 WAIT STATES NEEDS MEMORY ACCESS TIME UP TO 130 NS FASTER
  214. ;ON INSTRUCTION READUP THAN IT DOES FOR OPERAND READ/WRITE.
  215. ;THIS TEST WRITES IN ALL RAM MEMORY EXCEPT THE PROGRAM AREA
  216. ;IN ORDER TO DEFEND AGAINST WHAT BAD INSTRUCTION READUP CAN
  217. ;DO TO A PROGRAM.  VERY VERY BAD CHIPS CAN STILL WIPE OUT
  218. ;THE PROGRAM THEORETICALLY, ALTHOUGH IT HAS NOT BEEN OBSERVED
  219. ;SINCE THE LATEST BULLETPROOF STACK CODE HAS BEEN ADDED.
  220. ;
  221. SLOCHIP XOR     A               ;CLEAR TYPEOUT COUNTER
  222.         LD      (TYCTR),A
  223.         CALL    SETCNT          ;PRESET COUNT OF ITERATIONS
  224.         LD      HL,IBUSMS       ;TYPE TEST WE'RE DOING
  225.         CALL    TYPMSG
  226.         LD      A,0FFH          ;STORE FF EVERYWHERE
  227.         LD      DE,0
  228.         LD      HL,START-1
  229.         CALL    SADEHL          ;STORES FF FROM ZERO TO BASE
  230.         LD      DE,(FREEMEM)    ;FIRST BYTE OF FREE MEMORY
  231.         LD      HL,MAXADR       ;END OF ALLOWED RAM SPACE
  232.         CALL    SADEHL          ;FROM END OF PROGRAM TO END OF MEMORY
  233. IBUS:   LD      DE,(FIRST)
  234.         LD      HL,(LAST)
  235.         LD      A,0FFH
  236.         CALL    SADEHL          ;STORE FF IN TEST MEMORY
  237.         LD      HL,(NBYTES)
  238.         LD      BC,LNGTH
  239.         AND     A               ;CLEAR CARRY
  240.         SBC     HL,BC           ;LEAVE ROOM FOR TEST PROGRAM
  241.         LD      (BYTCNT),HL     ;SAVE BYTES LEFT TO TEST
  242.         LD      HL,(FIRST)
  243.         LD      (TESTAD),HL     ;SAVE CURRENT TEST ADDRESS
  244.         LD      (GOTHAR+1),HL   ;IN CASE DO LONG TEST ALWAYS JUMP TO BEGIN
  245. NOPFF:  LD      (HL),00H        ;NO OP
  246.         INC     HL
  247.         LD      (HL),0FFH       ;RESTART 38H
  248.         DEC     HL
  249.         LD      A,(LONGI)       ;GET LONG TEST FLAG
  250.         OR      A               ;IF 0 WE'LL DO IT
  251.         JR      Z,YLI           ;JUMP AROUND STORE OF PLACE TO JUMP
  252.         LD      (GOTHAR+1),HL   ;PRESET JSR
  253. YLI:    LD      A,0C3H          ;JP INST
  254.         LD      (38H),A         ;STORE AT RESTART 38H LOCATION
  255.         LD      HL,TESTO        ;PLACE TO GO
  256.         LD      (39H),HL        ;STORE IT
  257.         CALL    LDEM            ;LOAD UP REGS WITH KNOWN PATTERN
  258. GOTHAR: JP      0               ;PLACE TO GO GETS STORED HERE
  259. ;
  260. ;
  261. TESTO:  LD      IX,NOPMSG       ;MESSAGE OF WHICH TEST FAILED
  262.         CALL    ICHECK          ;SEE IF REGS ARE OK
  263.         POP     HL              ;GET RETURN ADR FROM STACK
  264.         DEC     HL
  265.         DEC     HL
  266.         PUSH    HL              ;SAVE WHERE CAME FROM
  267.         LD      DE,(TESTAD)     ;WHERE WE SHOULD HAVE COME FROM
  268.         AND     A
  269.         SBC     HL,DE
  270.         JR      Z,REAL          ;IF CAME FROM RIGHT PLACE
  271.         LD      HL,LOSTMSG
  272.         CALL    LOSTIT          ;OOPS
  273. ;
  274. ;NOW TRY A FEW REAL INSTRUCTIONS
  275. ;
  276. REAL:
  277.         LD      SP,STACK
  278.         LD      DE,(TESTAD)
  279.         LD      HL,TESTCOD
  280.         LD      BC,LNGTH
  281.         LDIR                    ;BLOCK MOVE PROGRAM TO TEST AREA
  282.         LD      HL,(TESTAD)
  283.         LD      (CALLIT+1),HL   ;THIS TIME WE'LL DO A CALL
  284.         LD      A,0C3H          ;JP
  285.         LD      (38H),A
  286.         LD      HL,WILDBLUE
  287.         LD      (39H),HL        ;IN CASE FLY OFF THE HANDLE SOMEWHERE
  288.         CALL    LDEM            ;LOAD UP REGISTERS
  289. CALLIT  CALL    0               ;HERE WE GO - I HOPE
  290.  
  291. ;SHOULD COME BACK HERE IF CODE IS EXECUTED ANYTHING LIKE RIGHT
  292.  
  293. CUMBAK: LD      SP,STACK        ;IN CASE STACK GOT CLOBBERED BY BAD MEM
  294.         LD      IX,EXMSG        ;TEST THAT FAILED MESSAGE
  295.         CALL    ICHECK          ;SEE IF REGS ARE WHAT THEY SHOULD BE
  296.         LD      HL,(TESTAD)
  297.         LD      A,(HL)
  298.         CP      0AAH            ;SEE IF SWAP GOT DONE RIGHT
  299.         CALL    NZ,ERR9
  300.         INC     HL              ;POINT TO NEXT BYTE
  301.         LD      A,(HL)
  302.         CP      0AAH
  303.         CALL    NZ,ERR9
  304.  
  305. DUNONE: CALL    NTERUP          ;SEE IF OP WANTS ANYTHING
  306.         LD      HL,(TESTAD)     ;GET HL BACK
  307.         LD      BC,(BYTCNT)     ;GET BC BACK
  308.         LD      A,(LONGI)       ;0 IF LONG TEST WANTED
  309.         LD      (HL),A          ;SET 00 OR FF WHERE INST WAS
  310.         CPI                     ;HL UP, BC DOWN
  311.         LD      (TESTAD),HL     ;UPDATE TEST ADDRESS
  312.         LD      (BYTCNT),BC     ;UPDATE # BYTES LEFT TO TEST
  313.         JP      PE,NOPFF        ;GO BACK FOR MORE
  314. THRU1:  CALL    NTERUP
  315.         LD      A,(TYCTR)       ;UPDATE TIMES TYPED
  316.         INC     A
  317.         LD      (TYCTR),A
  318.         AND     1FH             ;USE 5 BITS TO COUNT TO 32
  319.         CALL    Z,CRLF          ;THAT'S ENOUGH
  320.         LD      HL,SPIMSG       ;TYPE SPACE I TO INDICATE ONE PASS
  321.         CALL    TYPMSG
  322.         CALL    CKCNT
  323.         JP      NZ,IBUS        ;GO BACK FOR ANOTHER PASS
  324.         JP      GWRT            ;GO TO CROSSTALK TESTS
  325.  
  326. RDYGO:  DEFM    'READY TO LEAP?',CR,LF
  327.  
  328. TESTCOD:NOP
  329.         NOP
  330.         LD      A,E
  331.         RLA
  332.         LD      IX,5555H
  333.         LD      HL,0AAAAH
  334.         LD      SP,(TESTAD)
  335.         INC     SP
  336.         INC     SP              ;SO WILL PUSH TO FIRST TWO BYTES
  337.         PUSH    IX
  338.         EX      (SP),HL         ;HL_5555, (TESTAD)_AAAA
  339.         LD      SP,STACK-2
  340. TESTND: RET                     ;RETURN TO CALLER
  341.  
  342. LNGTH:  EQU     TESTND-TESTCOD+1
  343.  
  344. ;
  345. ;STORES A FROM ADR IN DE THRU ADR IN HL
  346. SADEHL: AND     A       ;CLEAR CARRY
  347.         SBC     HL,DE
  348.         INC     HL      ;#BYTES TO STORE
  349.         LD      B,H
  350.         LD      C,L     ;TO BYTE COUNTER
  351.         EX      DE,HL   ;GET WHAT WAS IN DE
  352. PUTIT:  LD      (HL),A
  353.         CPI
  354.         JP      PE,PUTIT        ;LOOP BACK TIL DONE
  355.         RET
  356. ;
  357. ;LOADS REGISTERS WITH KNOWN PATTERN
  358. ;
  359. LDEM    LD      A,0B4H          ;AS GOOD A NUMBER AS ANY
  360.         LD      BC,0BBCCH
  361.         LD      DE,0DD5AH
  362.         LD      HL,5555H
  363.         OR      A               ;CLEAR CARRY BIT
  364.         RET
  365. ;
  366. ;CHECKS CONTENTS OF REGISTERS TO SEE THEY ARE WHAT SHOULD BE
  367. ;
  368. ICHECK: JR      C,ERR1          ;CARRY SHOULD NOT BE SET
  369.         CP      0B4H
  370.         JR      NZ,ERR2         ;A SHOULD BE B4
  371.         LD      A,B
  372.         CP      0BBH
  373.         JR      NZ,ERR3
  374.         LD      A,C
  375.         CP      0CCH
  376.         JR      NZ,ERR4
  377.         LD      A,D
  378.         CP      0DDH
  379.         JR      NZ,ERR5
  380.         LD      A,E
  381.         CP      5AH
  382.         JR      NZ,ERR6
  383.         LD      A,H
  384.         CP      55H
  385.         JR      NZ,ERR7
  386.         LD      A,L
  387.         CP      55H
  388.         JR      NZ,ERR8
  389.         RET                     ;NO ERRORS IF GOT THIS FAR
  390.  
  391. ERR1    LD      HL,CBIT
  392.         JR      TYERR
  393. ERR2    LD      HL,ACHNG
  394.         JR      TYERR
  395. ERR3    LD      HL,BCHNG
  396.         JR      TYERR
  397. ERR4    LD      HL,CCHNG
  398.         JR      TYERR
  399. ERR5    LD      HL,DCHNG
  400.         JR      TYERR
  401. ERR6    LD      HL,ECHNG
  402.         JR      TYERR
  403. ERR7    LD      HL,HCHNG
  404.         JR      TYERR
  405. ERR8    LD      HL,LCHNG
  406.         JR      TYERR
  407. ERR9:   LD      HL,EXSP
  408.  
  409. ;ENTERED WITH IX POINTING AT MESSAGE ABOUT WHICH TEST FAILED
  410. ;HL POINTS TO ERROR MESSAGE
  411. ;
  412. TYERR:  CALL    CRLF
  413.         PUSH    HL
  414.         PUSH    IX
  415.         POP     HL              ;GET WHICH TEST FAILED IN HL
  416.         CALL    TYPMSG            ;TYPE IT
  417.         LD      HL,(ERCTR)      ;GET NO OF ERRORS SO FAR
  418.         INC     HL
  419.         LD      (ERCTR),HL      ;UPDATE IT
  420.         CALL    TYPSHL           ;TYPE NO OF ERRORS
  421.         CALL    SPACE
  422.         POP     HL
  423.         CALL    TYPMSG            ;HL POINTS TO MESSAGE
  424.         CALL    SPACE
  425.         LD      A,'@'
  426.         CALL    PBYTE
  427.         LD      HL,(TESTAD)     ;WHERE WE WERE TESTING WHEN THINGS GOT BAD
  428.         CALL    TYPSHL           ;TYPE THIS ADDRESS
  429.         CALL    NTERUP          ;SEE IF STOP AFTER THIS ERROR
  430.         RET
  431. ;
  432. ;TYPES WHERE WE WERE WHEN WE GOT LOST, AND MAYBE
  433. ;WHERE WE GOT TO MORE OR LESS
  434. LOSTIT: CALL    TYERR
  435.         LD      HL,TOMSG        ;TYPE "TO"
  436.         CALL    TYPMSG
  437.         POP     HL              ;PASS BY RETURN ADR ON STACK
  438.         POP     HL              ;GET FROM WHENCE WE WENT TO 38H
  439.         DEC     SP
  440.         DEC     SP
  441.         DEC     SP
  442.         DEC     SP              ;GET STACK BACK IN SHAPE
  443.         CALL    TYPSHL           ;TYPE IT
  444.         CALL    NTERUP
  445.         RET
  446. ;
  447. ;COME HERE FROM INSTRUCTION TEST IF DIDN'T DO NORMAL RETURN
  448. WILDBLUE:       LD      IX,EXMSG        ;TEST WHICH FAILED
  449.         CALL    ICHECK
  450.         LD      HL,LOSTMSG
  451.         CALL    LOSTIT          ;TYPE WHAT LITTLE WE KNOW ABOUT IT
  452.         POP     HL              ;STACK CLEANUP
  453.         POP     HL              ;STACK CLEANUP
  454.         JP      DUNONE          ;GIVE UP ON THIS ADDRESS, GO TO NEXT
  455. ;
  456. ;BEGIN CROSSTALK TESTS (RUNNING TIME GOES UP EXPONENTIALLY)
  457. ;
  458. ;ONLY EXECUTES THESE TWO TESTS ONCE, REGARDLESS OF INTERATION COUNTER
  459. ;BECAUSE THEY ARE SO LONG RUNNING.  WILL NOT DO TEST AT ALL UNLESS AREA
  460. ;IS AT LEAST 400H (1024) IN SIZE.
  461. ;
  462. ;                      EXPONENTIAL WRITE TEST
  463. ;
  464. ;
  465. ;             ZERO THE AREA
  466. ;
  467. ;             CLEAR INDEX 1
  468. ;
  469. ;
  470. ; LOOP1:      STORE FF BYTE (INDEX 1)
  471. ;
  472. ;             CLEAR INDEX 2
  473. ;
  474. ;
  475. ; LOOP2:      STORE 00 (INDEX 2)
  476. ;
  477. ;             SEE IF FF STILL OK
  478. ;
  479. ;             BUMP INDEX 2
  480. ;
  481. ;             LOOP2 TIL END OF AREA
  482. ;
  483. ;
  484. ;             BUMP INDEX 1
  485. ;
  486. ;             LOOP1 TIL END OF AREA
  487. ;
  488. ;             EXIT TO EXPONENTIAL READ TEST
  489. ;
  490. ;
  491. GWRT:   XOR     A               ;CLEAR TYPEOUT COUNTER
  492.         LD      (TYCTR),A
  493.         LD      A,(XTLK)        ;SEE IF WANT TO DO THESE TESTS AT ALL
  494.         OR      A               ;SET FLAGS
  495.         JP      NZ,DONE         ;NOT WANTED
  496. T3      LD      HL,GWRMSG
  497.         CALL    SETUP           ;GET AREA DEFINED, ETC
  498. WLP0:   CALL    COMCOD          ;LOOP HOUSEKEEPING SUBR
  499.         JP      C,STRD          ;DONE IF MINUS
  500.         LD      DE,(NEX1K)      ;DE KEEPS TRACK OF WHERE THE FF IS
  501. WLP2:   CALL    TYPEAD          ;TYPE ADDRESS IF MULTIPLE OF 100H
  502.         LD      HL,(NEX1K)      ;STARTING ADR OF 1K CHUNK
  503.         LD      BC,03FFH        ;ALWAYS 1 K CHUNKS
  504.         LD      A,0FFH
  505.         LD      (DE),A          ;STORE THE FF BYTE
  506. WMLP    XOR     A               ;CLEAR A
  507.         LD      (HL),A          ;STORE A ZERO BYTE WHERE HL IS
  508.         LD      A,(DE)          ;GET SUPPOSED FF BYTE
  509.         CP      0FFH            ;SEE IF IT STILL IS FF
  510.         JR      NZ,WOOPS        ;MAYBE OK, MAYBE NOT
  511.         XOR     A               ;CLEAR A AGAIN
  512. WLP1    CPI                     ;COMPARE A & (HL), DEC BC
  513.         JP      PO,WEND1        ;THRU AREA?
  514.         JR      Z,WMLP          ;CHECK NEXT ADDRESS
  515.         CALL    ERR             ;BYTE WASN'T ZERO
  516.         JR      WMLP
  517. ;
  518. WOOPS   AND     A               ;CLEAR CARRY FLAG
  519.         PUSH    HL              ;SAVE ADDRESS POINTER
  520.         SBC     HL,DE           ;COMPARE TO WHERE FF SUPPOSED TO BE
  521.         POP     HL              ;GET POINTER BACK
  522.         JR      NZ,WERR         ;REAL ERROR, IT WASN'T HERE
  523.         LD      A,0FFH          ;NOW RESTORE THE CLOBBERED FF
  524.         LD      (DE),A
  525.         JR      WLP1            ;KEEP GOING
  526. ;
  527. WERR    INC     HL              ;SIMULATE ACTION OF CPI ON HL
  528.         CALL    ERR             ;TYPE OUT THE ERROR
  529.         JR      WMLP
  530. ;
  531. WEND1   LD      HL,(END1K)      ;SEE IF WE'RE THRU THE AREA YET
  532.         AND     A               ;CLEAR CARRY
  533.         SBC     HL,DE           ;COMPARE
  534.         JR      NZ,KG1          ;NOT DONE YET
  535.         CALL    UPDATE          ;SET NEXT 1K CHUNK
  536.         JR      WLP0            ;CONTINUE TESTING WITH NEXT CHUNK
  537. KG1:    INC     DE              ;UP POINTER TO FF BYTE
  538.         JR      WLP2
  539. ;
  540. ;
  541. ;                     EXPONENTIAL READ TEST
  542. ;
  543. ;
  544. ;             ZERO THE AREA
  545. ;
  546. ;
  547. ; LOOP1:      STORE FF (INDEX 1)
  548. ;
  549. ;             CLEAR INDEX 2
  550. ;
  551. ;
  552. ; LOOP2:      READ BYTE (INDEX 2)
  553. ;
  554. ;             TEST FOR CORRECTNESS
  555. ;
  556. ;             SEE IF FF STILL OK
  557. ;
  558. ;             BUMP INDEX 2
  559. ;
  560. ;             LOOP2 TIL END OF AREA
  561. ;
  562. ;
  563. ;             BUMP INDEX 1
  564. ;
  565. ;             LOOP1 TIL END OF AREA
  566. ;
  567. ;             EXIT
  568. ;
  569. ;
  570. ;EXPONENTIAL READ CROSSTALK TEST
  571. ;
  572. STRD    LD      HL,GRDMSG
  573.         CALL    SETUP
  574. RDLP0:  CALL    COMCOD
  575.         JR      C,DONE          ;YES
  576.         LD      DE,(NEX1K)      ;DE KEEPS TRACK OF FF BYTE
  577. STLP:   CALL    TYPEAD          ;TYPE ADDRESS EVERY 100H
  578.         LD      HL,(NEX1K)      ;BEGIN PASS AT FIRST BYTE
  579.         LD      BC,03FFH        ;ALWAYS TEST 1K
  580.         LD      A,0FFH          ;ALL ONES
  581.         LD      (DE),A          ;STORE FF IN (DE)
  582.         XOR     A               ;CLEAR A
  583. MLP     CPI                     ;SEE IF THIS BYTE IS ZERO
  584.         JP      PO,END1         ;AT END OF AREA IF PO
  585.         JR      Z,MLP           ;KEEP LOOKING FOR FF OR END OF AREA
  586. MAYBE   PUSH    HL              ;SAVE NEXT BYTE TO TEST
  587.         DEC     HL              ;TO GET BACK TO BYTE JUST TESTED
  588.         AND     A               ;CLEAR CARRY FLAG
  589.         SBC     HL,DE           ;SEE IF WHERE FF WAS SUPPOSED TO BE
  590.         JR      NZ,ERROR        ;NO, THIS IS AN ERROR FOR SURE!
  591.         POP     HL
  592.         JR      MLP             ;FF WAS SUPPOSED TO BE HERE
  593. END1:   LD      HL,(END1K)
  594.         AND     A               ;CLEAR CARRY FLAG
  595.         SBC     HL,DE
  596.         JR      NZ,KG2          ;IF NOT DONE WITH 1K CHUNK YET
  597.         CALL    UPDATE
  598.         JR      RDLP0
  599. KG2:    LD      A,(DE)          ;GET THE SUPPOSED FF BYTE
  600.         CP      0FFH            ;SEE IF IT STILL IS FF
  601.         JR      NZ,ERROR        ;LOST THE FF
  602.         XOR     A               ;CLEAR A
  603.         LD      (DE),A          ;CLEAR THE FORMER FF BYTE
  604.         INC     DE
  605.         JR      STLP            ;END OF ONE LOOK, GO STORE FF IN NEXT BYTE
  606. ;
  607. ;
  608. ;END OF ONE PASS OF SAND DUNE TESTS
  609. DONE    LD      HL,DUNMSG
  610.         CALL    TYPMSG
  611.         LD      HL,ERCTR
  612.         LD      A,(ERCTR+1)
  613.         ADD     A,(HL)
  614.         OR      A
  615.         JR      Z,MEMOK         ;ERROR COUNTER WAS ZERO
  616.         LD      HL,BADMSG
  617. D1:     CALL    TYPMSG
  618.         LD      HL,(ERCTR)
  619.         CALL    TYPSHL
  620.         LD      HL,ERSMSG
  621.         CALL    TYPMSG            ;TYPE TOTAL NO OF ERRORS
  622.         LD      A,(CONTMD)      ;SEE IF WANT TO TEST FOREVER
  623.         OR      A
  624.         JP      Z,BIGLP         ;YES, GO ANOTHER ROUND OF INTERATIONS
  625.         JP      START           ;GO BACK AND ASK FOR MORE
  626. MEMOK:  LD      HL,OKMSG
  627.         JR      D1              ;TYPE GOOD MESSAGE
  628. ERROR   POP     HL
  629.         CALL    ERR
  630.         JP      MLP
  631. ; TYPES TEST NAME, CLEARS AREA, SETS FIRST 1K CHUNK ADDRESS
  632. SETUP:  CALL    TYPMSG            ;TYPE TEST NAME
  633.         CALL    CLAREA          ;ZERO THE TEST AREA
  634.         LD      HL,(FIRST)      ;STARTING ADDRESS
  635.         LD      (NEX1K),HL      ;PRESET
  636.         RET
  637. ;CONTROLS TEST AREA IN 1K CHUNKS AT A TIME TO KEEP
  638. ;RUNNING TIME REASONABLE SINCE IT GOES UP AS THE SQUARE
  639. ;OF THE NUMBER OF BYTES TESTED.  RETURNS NEGATIVE FLAG
  640. ;WHEN TOTAL AREA FINISHED.
  641. COMCOD: LD      HL,(NEX1K)      ;GET START OF 1K CHUNK TO TEST
  642.         LD      DE,03FFH
  643.         ADD     HL,DE           ;COMPUTE LAST ADR OF 1K CHUNK
  644.         LD      (END1K),HL      ;SAVE IT
  645.         EX      DE,HL           ;END1K TO DE
  646.         LD      HL,(LAST)
  647.         AND     A               ;CLEAR CARRY
  648.         SBC     HL,DE           ;SEE IF THROUGH TOTAL AREA YET
  649.         RET                     ;RETURN C IF DONE
  650. CLAREA  LD      A,0             ;CLEARS THE TEST AREA TO ZEROES
  651.         CALL    STR
  652.         RET
  653. SETCNT  LD      A,(ITER)        ;GET ITERATIONS DESIRED
  654.         LD      (CTR),A         ;STORE IN CTR
  655.         RET
  656. ;
  657. CKCNT   LD      HL,CTR          ;POINT AT CTR
  658.         DEC     (HL)            ;DECREMENT THE COUNT
  659.         RET                     ;WITH THE FLAGS SET
  660. ;STORE A PATTERN ROUTINE
  661. STR     LD      DE,(FIRST)      ;GET BEGINNING
  662.         LD      HL,(LAST)
  663.         CALL    SADEHL
  664.         RET
  665. ;READ AND TEST PATTERN
  666. RD      LD      HL,(FIRST)
  667.         LD      BC,(NBYTES)
  668. RD1     CPI                     ;SEE IF SAME AS A
  669.         CALL    NZ,ERR
  670.         JP      PE,RD1
  671.         RET
  672. ;TYPE OUT ERROR
  673. ;HL HAS ADDRESS OF FAILURE
  674. ;A HAS GOOD BYTE
  675. ERR     PUSH    HL              ;SAVE WHERE WE'RE AT
  676.         PUSH    AF              ;SAVE A AND FLAGS
  677.         DEC     HL              ;GET ACTUAL ADR WHERE FAILED
  678.         PUSH    HL
  679.         CALL    CRLF
  680.         LD      HL,(ERCTR)     ;# SO FAR
  681.         INC     HL             ;ADD THIS ONE
  682.         LD      (ERCTR),HL     ;STORE IT BACK
  683.         CALL    TYPSHL           ;TYPE # OF ERRORS SO FAR
  684.         POP     HL              ;GET ADDRESS OF FAILURE
  685.         CALL    TYPSHL
  686.         CALL    SPACE
  687.         LD      A,(HL)          ;GET BAD BYTE
  688.         CALL    P2HEX
  689.         LD      HL,SHDBE
  690.         CALL    TYPMSG           ;TYPE SHOULD BE
  691.         POP     AF              ;GET A BACK
  692.         PUSH    AF
  693.         CALL    P2HEX           ;TYPE GOOD BYTE
  694.         CALL    NTERUP          ;SEE IF WANT TO STOP A WHILE
  695.         POP     AF
  696.         POP     HL
  697.         RET
  698. ;STORE INCREMENTING PATTERN
  699. STRROT  LD      A,0
  700.         LD      HL,(FIRST)
  701.         LD      BC,(NBYTES)
  702. ROT1    INC     A
  703.         JR      Z,ROT1          ;NEVER USE ZERO
  704.         LD      (HL),A          ;STORE BYTE
  705.         CPI                     ;CK IT ALREADY
  706.         CALL    NZ,ERR          ;WOOPS
  707.         JP      PE,ROT1
  708.         RET
  709. ;CHECK INCREMENTING PATTERNS
  710. RDROT   LD      A,0
  711.         LD      HL,(FIRST)
  712.         LD      BC,(NBYTES)
  713. RDROT1  INC     A               ;NEXT PATTERN
  714.         JR      Z,RDROT1        ;NEVER ALLOWED ZERO
  715.         CPI
  716.         CALL    NZ,ERR
  717.         JP      PE,RDROT1
  718.         RET
  719. ;UPDATE POINTER TO NEXT 1K CHUNK OF MEMORY TO TEST
  720. ;
  721. UPDATE: LD      HL,(END1K)      ;UPDATE FOR NEXT 1K CHUNK
  722.         INC     HL
  723.         LD      (NEX1K),HL
  724.         RET
  725. ;
  726. ;ROUTINE TO TYPE ADDRESS EVERY 100H (FROM DE)
  727. TYPEAD: LD      A,E
  728.         CP      0               ;SEE IF A MULTIPLE OF 100H
  729.         RET     NZ              ;NO, DON'T BOTHER TO TYPE ADDRESS YET
  730.         CALL    NTERUP          ;SEE IF WANT TO WAIT A BIT
  731.         LD      H,D             ;GET NEXT ADDRESS IN HL
  732.         LD      L,E
  733.         CALL    TYPSHL
  734.         LD      A,(TYCTR)       ;GET NUMBER OF TIMES THIS LINE
  735.         INC     A
  736.         LD      (TYCTR),A       ;UPDATE IT
  737.         AND     0FH             ;ONLY USE LOWER 4 BITS
  738.         RET     NZ              ;LESS THAN 16 TIMES
  739.         CALL    CRLF            ;16 X 5 = 80 AND THAT'S ENUF PER LINE
  740.         RET
  741. ;
  742. ;ROUTINE TO SEE IF ANYTHING BEEN TYPED FROM KEYBOARD.
  743. ;RETURNS IMMEDIATELY IF NOT.  IF C/R, RESTART PROGRAM
  744. ;FROM SQUARE ONE. IF ?, TYPE LOCATION CURRENTLY TESTING,
  745. ;IF ANYTHING ELSE, JUST DELAY TIL
  746. ;ANOTHER KEY STRUCK.
  747. NTERUP: CALL    CHKIN           ;SEE IF ANYTHING BEEN TYPED?
  748.         RET     Z               ;NO
  749.         AND     7FH             ;GET RID OF PARITY BIT IF ANY
  750.         CP      '?'             ;SEE IF WANT TO FIND OUT WHERE
  751.         JP      Z,WHRWE
  752.         CP      0DH             ;SEE IF C/R
  753.         JP      Z,START         ;START ALLL OVER
  754.         LD      HL,INTMSG       ;TYPE "INTERRUPTED"
  755.         CALL    TYPMSG
  756. NTW     CALL    CHKIN           ;WAIT FOR ANOTHER CHARACTER
  757.         RET     NZ              ;GOT ONE
  758.         JR      NTW             ;UNTIL WE GET ANY CHARACTER TO RESTART
  759. WHRWE:  LD      HL,WHRMSG
  760.         CALL    TYPMSG
  761.         LD      HL,(TESTAD)     ;GET ADDRESS CURRENTLY TESTING
  762.         CALL    TYPSHL
  763.         RET
  764.  
  765. ;TYPES MESSAGE POINTED BY HL, GETS A CHARACTER FROM KBD,
  766. ; AND RETURNS WITH A REG =0 IF CHAR WAS A Y, ELSE A=FF
  767. ; Z FLAG WILL BE SET IF YES, NZ SET IF NOT YES
  768.  
  769. GETANS: CALL    TYPMSG            ;TYPE MESSAGE
  770.         CALL    GCHR            ;GET ANSWER FROM KBD
  771.         PUSH    AF              ;SAVE IT
  772.         CALL    CRLF            ;FOR NEATNESS
  773.         POP     AF
  774.         CP      'Y'             ;DID OP TYPE A Y
  775.         JR      Z,GOTYES
  776.         CP      'y'             ;CK FOR LOWER CASE TOO
  777. GOTYES: LD      A,0
  778.         RET     Z               ;ANSWER WAS Y
  779.         LD      A,0FFH
  780.         RET                     ;ANSWER WAS NOT Y
  781.  
  782. ;
  783. ; GET CHARACTER FROM INPUT.
  784. ;
  785. GBYTE:  CALL    CHKIN
  786.         JR      Z,GBYTE         ;NOT READY YET
  787.         AND     7FH             ;STRIP OFF BIT 7?????
  788.         RET
  789. ;
  790. SPACE:  LD      A,20H           ;FALLS THRU TO PCHR
  791. ;
  792. ;PRINTS CHARACTER IN A, PLUS LINEFEED AND 2 NULLS IF
  793. ;CHAR IS A CARRIAGE RETURN.  PRESERVES ALL REGISTERS
  794. ;
  795. PCHR:   PUSH    AF
  796.         PUSH    HL
  797.         AND     7FH
  798.         CALL    PBYTE           ;PRINT THE CHAR
  799.         LD      HL,LFNN
  800.         CP      CR              ;WAS IT A C/R?
  801.         CALL    Z,TYPMSG          ;PRINT LINE FEED AND 2 NULLS
  802.         POP     HL
  803.         POP     AF
  804.         RET
  805. ;
  806. LFNN:   DEFB    8AH
  807. ;
  808. ; GET CHARACTER. RETURNS IT IN A.
  809. ; ALTERS F.
  810. ;
  811. GCHR:   CALL    GBYTE
  812.         CALL    PCHR
  813.         JR      Z,GCHR          ;IF NULL DON'T RETURN
  814.         CP      61H             ;SEE IF LOWER CASE
  815.         JR      C,SK2           ;LESS THAN LC A
  816.         CP      7BH             ;SEE IF MORE THAN Z
  817.         JR      NC,SK2          ;NOT A LOWER CASE
  818.         SUB     20H             ;CONVERT TO UPPER CASE
  819. SK2     RET
  820. ;
  821. ;
  822. ; CRLF. ALTERS A ONLY.
  823. ;
  824. CRLF:   LD      A,CR
  825.         JR      PCHR
  826. ;
  827. ;
  828. ; GETS A 4 DIGIT (OR LESS) HEX NUMBER FROM
  829. ; KEYBOARD INTO HL.  IGNORES LEADING SPACES
  830. ; CONTINUES UNTIL A NON-HEX CHARACTER IS TYPED.
  831. ; RETURNS WITH THE LATTER IN A, AND HL SET TO
  832. ; THE LAST 4 HEX DIGITS (OR LESS) TYPED.
  833. ; LOSES AF AND HL
  834. ;
  835. ;
  836. GETHEX: SUB     A
  837. ;
  838. GNHL:   PUSH    BC              ;SAVE
  839.         LD      HL,0            ;CLR BUFFER
  840. ; STRIP LEADING SPACES & GET CHAR
  841.         CALL    SKSG
  842. ; FIRST CHAR MUST BE HEX
  843.         CALL    HEXSH           ;IF HEX, SHIFT INTO HL
  844.         JP      C,HEXERR         ;O/W, HEXERR
  845. GN1:    CALL    GCHR
  846.         CALL    HEXSH           ;IF HEX SHIFT INTO HL
  847.         LD      A,B             ;RESTORE CHAR
  848.         JR      NC,GN1   ;IF HEX, CONTINUE
  849.         POP     BC              ;IF NON-HEX, DONE
  850.         RET
  851. HEXERR  LD      A,'?'
  852.         CALL    PBYTE
  853.         CALL    CRLF
  854.         JR      GETHEX           ;RESTART
  855. ;
  856. ;
  857. ; IF A CONTAINS HEX CHAR, SHIFTS BINARY EQUIVALENT
  858. ; INTO HL. IF NOT HEX, RET WITH CY SET. SAVES
  859. ; ORIGINAL CHAR IN B
  860. ;
  861. HEXSH:  LD      B,A
  862.         SUB     '0'             ; < '0'?
  863.         RET     C
  864.         ADD     A,'0'-'G'
  865.         RET     C
  866.         SUB     'A'-'G'
  867.         JR      NC,HX1          ;OK IF >= 'A'
  868.         ADD     A,07H; 'A'-'9'+1
  869.         RET     C
  870. HX1:    ADD     A,'9'+1-'0'
  871. ; THE A-REG NOW CONTAINS THE HEX DIGIT IN BINARY.
  872. ; (THE HIGH-ORDER NIBBLE OF A IS 0.)
  873. HXSH4:  ADD     HL,HL           ;SHIFT 4 BITS INTO HL
  874.         ADD     HL,HL
  875.         ADD     HL,HL
  876.         ADD     HL,HL
  877.         OR      L
  878.         LD      L,A
  879.         RET
  880. ;
  881. ;
  882. ; RETURNS WITH A NON-SPACE IN THE A-REG.
  883. ; IF ENTERED WITH A-REG CONTAINING A NULL
  884. ; OR A SPACE, GETS NEW CHARS UNTIL FIRST
  885. ; NON-SPACE OCCURS. ALTERS AF.
  886. ;
  887. SKSG0:  SUB     A
  888. ;
  889. SKSG:   OR      A               ;DOES A CONTAIN NULL?
  890. SK1:    CALL    Z,GCHR          ;YES
  891.         CP      20H             ;SPACE?
  892.         JR      Z,SK1           ;YES, KEEP LOOKING
  893.         CP      ','             ;PASS BY COMMAS TOO
  894.         JR      Z,SK1
  895.         CP      CR              ;RETURNS ZFLAG IF CR
  896.         RET
  897. ;
  898. ;
  899. ; PRINT THE NUMBER IN HL.
  900. ; PRESERVES ALL BUT A.
  901. ;
  902. TYPSHL: CALL    SPACE
  903. ;
  904. PNHL:   LD      A,H
  905.         CALL    P2HEX
  906.         LD      A,L
  907. ;                               ;(CONTINUE BELOW)
  908. ;
  909. ; PRINT THE NUMBER IN THE A-REGISTER.
  910. ; PRESERVES ALL REGISTERS.
  911. ;
  912. P2HEX:  CALL    P1HEX
  913.         RRA
  914. P1HEX:  RRA
  915.         RRA
  916.         RRA
  917.         RRA
  918.         PUSH    AF
  919.         AND     0FH             ;MASK
  920.         CP      10D             ; <= 9?
  921.         JR      C,PH1
  922.         ADD     A,7             ;A THRU F
  923. PH1:    ADD     A,30H           ;ASCII BIAS
  924.         CALL    PCHR             ;PRINT IT
  925.         POP     AF
  926.         RET
  927. ;
  928. ;
  929. ; PRINT MESSAGE. ENTER WITH ADDR OF MSG
  930. ; IN HL.  THE MESSAGE IS TERMINATED
  931. ; AFTER PRINTING A NULL (00) CHARACTER OR ONE WHOSE
  932. ; BIT 7 WAS SET.
  933. ; PRESERVES FLAGS, INCREMENTS HL.
  934. ;
  935. ;
  936. ;
  937. TYPMSG:   PUSH    AF              ;SAVE
  938. PS1:    LD      A,(HL)
  939.         INC     HL
  940.         CALL    PCHR
  941.         OR      A               ;SET FLAGS
  942.         JR      Z,PS2           ;NULL CHARACTER, EXIT
  943.         RLA                     ;LAST CHARACTER?
  944.         JR      NC,PS1          ;IF NOT, LOOP
  945. PS2:    POP     AF
  946.         RET
  947. ;
  948. DUNMSG  DEFB    LF
  949.         DEFB    CR
  950.         DEFB    ' FINISHED'
  951.         DEFB    CR
  952.         DEFB    TLF
  953. ERSMSG: DEFB    ' TOTAL ERRORS'
  954.         DEFB    CR
  955.         DEFB    TLF
  956. SHDBE   DEFB    ' SHOULD BE'
  957.         DEFB    TSP
  958. ENTMSG  DEFB    LF
  959.         DEFB    CR
  960.         DEFB    '"FIRST LAST" ? ?'
  961.         DEFB    TSP
  962. ZMSG    DEFB    'TESTING ZEROES, THEN ONES'
  963.         DEFB    LF
  964.         DEFB    TCR
  965. INCMSG  DEFB    'INCREMENTING BYTE TEST'
  966.         DEFB    LF
  967.         DEFB    TCR
  968. IBUSMS: DEFB    LF
  969.         DEFB    CR
  970.         DEFB    'IBUS TEST'
  971.         DEFB    CR
  972.         DEFB    TLF
  973. NOPMSG: DEFB    'FAILED NOP TEST'
  974.         DEFB    TSP
  975. EXMSG:  DEFB    'FAILED INST TEST'
  976.         DEFB    TSP
  977. GRDMSG  DEFB    LF
  978.         DEFB    CR
  979.         DEFB    'CROSSTALK READ TEST'
  980.         DEFB    LF
  981.         DEFB    TCR
  982. GWRMSG  DEFB    LF
  983.         DEFB    CR
  984.         DEFB    'CROSSTALK WRITE TEST'
  985.         DEFB    LF
  986.         DEFB    TCR
  987. ITMSG   DEFB    'ITERATIONS? (1 TO FF)'
  988.         DEFB    TSP
  989. HITHERE:DEFB    CR
  990.         DEFB    LF
  991.         DEFB    'BRAINWASH 2.3 - Copyright 1979 by Jim Gilbreath'
  992.         DEFB    CR
  993.         DEFB    LF
  994.         DEFM    'OUTPUT TO PRINTER?',CR,LF
  995. NOTMSG: DEFB    'DONT TEST 38-3A OR FRO'
  996.         DEFB    0CDH
  997. INTMSG: DEFB    LF
  998.         DEFB    CR
  999.         DEFB    'INTERRUPTED'
  1000.         DEFB    CR
  1001.         DEFB    TLF
  1002. LOSTMSG DEFB    ' FLEW AWA'
  1003.         DEFB    0D9H
  1004. CBIT:   DEFB    'CARRY GOT SE'
  1005.         DEFB    0D4H
  1006. ACHNG:  DEFB    'A CHANGE'
  1007.         DEFB    0C4H
  1008. BCHNG:  DEFB    'B CHANGE'
  1009.         DEFB    0C4H
  1010. CCHNG:  DEFB    'C CHANGE'
  1011.         DEFB    0C4H
  1012. DCHNG:  DEFB    'D CHANGE'
  1013.         DEFB    0C4H
  1014. ECHNG:  DEFB    'E CHANGE'
  1015.         DEFB    0C4H
  1016. HCHNG:  DEFB    'H CHANGE'
  1017.         DEFB    0C4H
  1018. LCHNG:  DEFB    'L CHANGE'
  1019.         DEFB    0C4H
  1020. EXSP:   DEFM    'EX (SP),HL failed'
  1021. TOMSG:  DEFB    ' T'
  1022.         DEFB    0CFH
  1023. LNGMSG: DEFB    'LONG INST TEST? (Y/N)'
  1024.         DEFB    TSP
  1025. XTKMSG: DEFB    'DO CROSSTALK TESTS? (Y/N)'
  1026.         DEFB    TSP
  1027. CONMSG: DEFB    'TEST FOREVER? (Y/N)'
  1028.         DEFB    TSP
  1029. BADMSG  DEFB    'POOR MEMORY!'
  1030.         DEFB    0ACH            ;COMMA
  1031. OKMSG   DEFB    'GOOD MEMORY'
  1032.         DEFB    0ACH            ;COMMA
  1033. SPIMSG: DEFB    ' '
  1034.         DEFB    0C9H            ;I+80H
  1035. WHRMSG: DEFM    CR,LF,'Testing'
  1036. STAKBAK DEFS    64     ;STACK BETTER NOT GET ANY LOWER THAN THIS
  1037. STACK:  DEFB    0
  1038.  
  1039.  
  1040. ; I/O PACKAGE
  1041.  
  1042.  
  1043.  IF     GIL             ;home configuration
  1044. STAT    EQU     1       ;STATUS PORT
  1045. DATA    EQU     0
  1046. DAV     EQU     2
  1047. TBE     EQU     1
  1048. PRSTAT  EQU     3
  1049. PRDAT   EQU     2
  1050. PRTBE   EQU     1
  1051.  
  1052. INITX:                          ;DO HOUSEKEEPING
  1053.         DI                      ;TURN OFF INTERRUPTS
  1054.         LD      A,1             ;TO DISABLE ROM SO ALL RAM CAN BE TESTED
  1055.         OUT     (1FH),A         ;FOR GILBREATH CPU
  1056.         OUT     (7FH),A         ;FOR SSM ROM BOARD
  1057.         RET
  1058.  ENDIF          ;gil
  1059.  
  1060.  IF     ZOBEX                   ;nosc system
  1061. stat    equ     1               ;crt status port
  1062. data    equ     0               ;crt data port
  1063. dav     equ     1               ;bit mask for kbd input active
  1064. tbe     equ     4               ;bit mask for tx buffer empty
  1065. prstat  equ     3               ;printer status port
  1066. prdat   equ     2               ;printer data port
  1067. prdav   equ     1               ;printer input mask
  1068. prtbe   equ     4               ;printer tx buffer empty bit mask
  1069.  
  1070. initx:                          ;do housekeeping
  1071.         ld      a,1             ;to disable rom so all ram can be tested
  1072.         out     (0ch),a         ;for zobex cpu board
  1073.         ret
  1074.  ENDIF          ;zobex
  1075.  
  1076. ; CHECK INPUT & RETURN WITH DATA IF READY. ONLY REG CHANGE IS A.
  1077. ;
  1078. CHKINX:  IN      A,(STAT)
  1079.         AND     DAV
  1080.         RET     Z               ;DATA NOT READY, RETURN WITH Z FLAG SET
  1081.         IN      A,(DATA)        ;RETURN WITH DATA AND Z FLAG CLEARED
  1082.         RET
  1083. ;
  1084.  
  1085. ; TYPE CHARACTER.  CHANGE NO REGISTERS.
  1086. ;
  1087. CRTOX:  PUSH    AF
  1088. PBY1:   IN      A,(STAT)
  1089.         AND     TBE
  1090.         JR      Z,PBY1
  1091.         POP     AF
  1092.         OUT     (DATA),A
  1093.         RET
  1094.  
  1095.  
  1096. PRTOX:                          ;PRINT CHARACTER, CHANGE NO REGISTERS
  1097.  
  1098.  IF ZOBEX
  1099.  
  1100.         push    af              ;save char
  1101.         in      a,(prstat)      ;get printer port status
  1102.         and     prdav           ;see if got char
  1103.         jr      z,list1         ;no
  1104.         in      a,(prdat)
  1105.         and     7fh
  1106.         cp      'S'-40h         ;see if stop code
  1107.         jr      nz,list1
  1108. plist2: in      a,(prstat)      ;got a stop, wait til next one
  1109.         and     prdav
  1110.         jr      z,plist2                ;loop til get char
  1111.         in      a,(prdat)
  1112.         and     7fh
  1113.         cp      'Q'-40h         ;see if go code
  1114.         jr      nz,plist2       ;loop til get it right
  1115. list1:  in      a,(prstat)
  1116.         and     prtbe           ;ck busy bit
  1117.         jr      z,list1         ;loop til bit goes hi meaning ready
  1118.         pop     af              ;get char to print
  1119.         out     (prdat),a       ;send character
  1120.         ret
  1121.  ENDIF  ;zobex
  1122.  
  1123.  IF GIL
  1124.         ret     ;no printer in here as yet
  1125.  ENDIF; gil
  1126.  
  1127.  
  1128. ENDOFIT:DEFB    0               ;FIRST MEMORY AVAILABLE TO TEST
  1129.  
  1130. SIZE    EQU     ENDOFIT-START   ;NUMBER OF TOTAL BYTE IN PROGRAM
  1131.  
  1132.         END
  1133.