12307 OUT &H61,(INP(&H61) AND &HDF) 'enable i/o channel check
12310 DEF USR0=VARPTR(MEMCODE%(0))
12500 ME = USR0(IME%):GOSUB 47200:IF ME=0 THEN PRINT".... ";:GOTO 12700 'gosub to normalize NMI
12510 SOUND 60,5
12520 MEM.ERR%(IME%-S.B.+1)=ME:IF CH$<>"A" AND CH$<>"S" THEN Y=CSRLIN:X=POS(0):LOCATE 25,5:PRINT STRING$(60," ");:LOCATE 25,5:COLOR 31:PRINT "Memory Error detected. F10 for visual location.";:COLOR 7:LOCATE Y,X
12600 PRINT FNF$(ME);:EM%=EM%+1
12700 NEXT
12800 PRINT" TOT ERRS=";EM%;
12900 RETURN
40000 '****** VARIABLE RECEIVER *********
40010 'Chaining won't work.
40020 DEF SEG=0
40030 POKE 1050,PEEK(1052) 'Clear keyboard buffer
40040 MEM.SIZE=PEEK(1043)+256*PEEK(1044)
40050 IO.MEM.SIZE=PEEK(1045)+256*PEEK(1046)
40060 IF PEEK(65521)=206 AND PEEK(65522)=216 THEN XM%=PEEK(65524):PM%=PEEK(65525)+256*PEEK(65526):EM%=PEEK(65527)+256*PEEK(65528):S.B.=PEEK(65529):RETURN 10700
40070 DEF SEG
40080 RETURN
41000 '******* PRINT MEMORY TEST MENU ********
41005 LOCATE 1,10:PRINT "Expansion Memory Test"
41020 '* Determine Start Block and Column Length of menu
41022 IF S.B.<>0 THEN 41040
41025 C.L.=7
41031 PRINT
41032 PRINT "How much memory is installed on the PC system board (1-4)?"
47000 '******** FUNCTION KEY 10 INTERRUPT *********
47005 GOSUB 47200 'normalize NMI
47010 IF CH$="A" OR CH$="S" THEN DEF SEG=0:POKE 65521,0:POKE 65522,0:DEF SEG:GOTO 47050 'Re-initialize control variables for restart
47015 IF NO.QUAD.ERR THEN 47050
47020 IF EM%<>0 THEN 60000
47050 CLEAR ,32000
47100 RUN "QUADTEST"
47200 '******** NMI NORMALIZE ********
47210 OUT &H61,(INP(&H61) OR &H20):OUT &H61,(INP(&H61) AND &HDF):OUT &HA0,80
47220 RETURN
48000 '******** ALL FUNCTIONS CHECK VARIABLE PASSER *******
48010 DEF SEG=0:POKE 65521,206:POKE 65522,216:POKE 65523,ASC(CH$):POKE 65524,XM%:POKE 65525,PM% MOD 256:POKE 65526,INT(PM%/256):POKE 65527,EM% MOD 256:POKE 65528,INT(EM%/256):POKE 65529,S.B.:DEF SEG
48050 CLEAR ,32000
48100 RUN "QUADTEST"
60000 '****** MEMORY ERROR VISUAL LOCATER *******
60010 FOR I=1 TO 4:IF MEM.ERR%(I)<>0 THEN QUAD.ERR=TRUE
60020 NEXT I:IF QUAD.ERR<>TRUE THEN GOSUB 65200:RETURN
60035 CLS':PRINT TAB(5);"Quadboard should be started at address";S.B.*64;"K for this routine.":PRINT TAB(5);:LINE INPUT "Press <enter> to continue ";Q1$:CLS
60040 SCREEN 2:CLS
60050 DEF SEG=0:IF (PEEK(&H410) AND &H30)<>&H30 THEN 60300
60100 LOCATE 8,1: PRINT" This routine of the Quadtest program will only function if the IBM color/ graphics adapter or equivalent is installed in the system.": LOCATE 12,1: LINE INPUT "Press <ENTER> ";A$:RETURN
60300 CLS:PRINT TAB(5);"Quadboard should be started at address";S.B.*64;"K for this routine.":PRINT TAB(5);:LINE INPUT "Press <enter> to continue ";Q1$:CLS
60310 SCREEN 2:EM%=0:ER$(0)="PAR":FOR I=1 TO 8:ER$(I)=" D"+RIGHT$(STR$(I-1),1):NEXT I
60400 NA$="n/a"
60600 GOSUB 60800
60610 GOSUB 61800
60700 GOTO 64000
60800 '****** GET PARAMETERS *******
60820 MEMORY=XM%
61100 BOARD=1
61600 RETURN
61700 REM *** display Quadboard screen ***
61800 A=200:B=36:SZ=16:FOR X=A TO A+54*3 STEP 54:FOR Y=B TO B+9*SZ-1 STEP SZ:LINE (X,Y)-(X+50,Y+SZ),,B:NEXT:NEXT
62000 LOCATE 4,27: IF MEMORY>3 THEN PRINT"256k" ELSE PRINT " "NA$
62100 LOCATE 4,34: IF MEMORY>2 THEN PRINT"192k" ELSE PRINT " "NA$
62200 LOCATE 4,41: IF MEMORY>1 THEN PRINT"128k" ELSE PRINT " "NA$
62300 LOCATE 4,48: PRINT"64k"
62400 FOR I=0 TO 8: LOCATE I*2+6,21: PRINT ER$(8-I): LOCATE I*2+6,54:NEXT
62500 RETURN
64000 '***** PAINT BAD CHIPS **********
64050 IF MEMORY>4 THEN LAST.COLUMN=4 ELSE LAST.COLUMN=MEMORY
64100 FOR J=1 TO LAST.COLUMN
64200 IF INT(MEM.ERR%(J)/256)>1 THEN LOCATE 3,25+7*(J-1):PRINT "* ";HEX$(MEM.ERR%(J));:LOCATE 25,62:PRINT "* NON-MEM ERR CODE";:GOTO 64820
64250 IF MEM.ERR%(J)=0 THEN 64820
64300 EC%=MEM.ERR%(J) MOD 256
64310 BCF=FALSE 'Bad Chip Found?
64400 FOR K=0 TO 7
64600 BIT=EC% AND 2^K
64700 IF BIT<>0 THEN GOSUB 65000 'PAINT A CHIP
64800 NEXT K
64810 IF NOT BCF THEN GOSUB 65000 'PAINT A CHIP
64820 NEXT J
64830 BEEP:LOCATE 24,20:PRINT "Bad chip(s) painted in foreground color.";
64840 KEY (10) ON:ON KEY (10) GOSUB 47000:LOCATE 25,14:PRINT "F10 to return to QUADTEST diagnostics main menu.";
64850 GOTO 64850
65000 '******** PAINT A CHIP **********
65010 GOSUB 65100 ;GET.XY
65020 IF TOGGLE=0 THEN PAINT (X,Y),1,1
65030 BCF=TRUE
65040 RETURN
65100 '********* GET.XY **********
65110 K1=(K+1) MOD 9
65120 X=228+(4-J)*56
65130 Y=48+(8-K1)*16
65140 RETURN
65200 '***** Mem error not on Quadboard *****
65205 NO.QUAD.ERR=TRUE
65210 LN=CSRLIN:COL=POS(0)
65250 SOUND 40,8:PRINT:PRINT:PRINT "Quadboard should be started at address";S.B.*64;"K for this routine.":PRINT "No memory error has been detected in that range.":LINE INPUT "Press <ENTER> to continue ";Q1$
65260 LOCATE LN+1,1:FOR K1=1 TO 4:PRINT STRING$(80," ");:NEXT K1:LOCATE LN,COL