********************************************** * * * DMA READ MEMORY TEST * * DMARD 1.0 (mod 0) * * * * Copyright 1978 * * Processor Technology Corp. * * All Rights Reserved * * * * A PTDOS COMMAND: * * * * DMARD , * * * * ADRS1=ADDRESS OF 4K BLOCK OF MEMORY AT * * WHICH TO BEGIN TESTING * * E.G. 5 TO BEGIN AT 5000H * * * * ADRS2=ADDRESS OF THE LAST 4K BLOCK TO BE * * TESTED. E.G. 7 TO LOOP AFTER 7FFFH * * * * 0 <= ADRS1 AND ADRS2 <= 7 * * * * PRESS MODE SELECT TO RETURN TO PTDOS * * * ********************************************** COPY NPTDEFS ORG CXBUF XEQ CXBUF * CALL GETP GET FIRST PAGE PARAMETER MOV A,E STA AFRST * RLC RLC RLC RLC MOV H,A MVI L,0 SHLD FADRS * CALL GETP GET LAST PAGE PARAMETER LDA AFRST CMP E JZ LSTOK JC LSTOK * CALL PERR1 LAST CAN'T BE < FIRST * LSTOK MOV A,E ADI '0' STA ALAST * XRA A STA ESTOP SET NO STOP ON ERRORS * LXI D,MSG1 CALL CONO "STOP ON ERRORS ?" * LOOP CALL CONTST WAIT FOR A KEY JNZ LOOP CALL CONIN GET THE KEY CPI 'Y' JNZ BEGIN STA ESTOP SET STOP ON ERRORS IF "Y" * BEGIN XRA A STC . CREATE MASTER PATTERN PUSH PSW POP H MOVE IT TO RAM SHLD PATRN * * MAIN TEST LOOP STARTS HERE * RTST CALL TAINI RTST1 MVI A,9 9 PATTERNS PER PASS STA COUNT RTST2 CALL CONTST TEST FOR KEYPRESS JNZ EXIT LXI D,NAME1 OPEN FILE USING TEST BLOCK AS BUFFER LHLD TADRS CALL SYS DB OPEOP JMP SYSERR STA FNMBR CALL FILL FILL BLOCK WITH PATTERN LHLD TADRS CHECK PATTERN XCHG CALL CHECK JC RERR1 LDA FNMBR WRITE BLOCK TO DISK LXI B,0FFFH LHLD TADRS XCHG CALL SYS DB WBLOP JMP SYSERR LHLD TADRS CHECK PATTERN AGAIN XCHG CALL CHECK JC RERR2 LDA FNMBR CLOSE FILE CALL SYS DB CLOOP JMP SYSERR LXI D,NAME1 OPEN FILE USING KNOWN GOOD BLOCK AS BUFFER LXI H,BUFFER CALL SYS DB OPEOP JMP SYSERR STA FNMBR LXI D,BUFFER CHECK PATTERN CALL CHECK JC RERR3 LXI D,MSG2 OUTPUT DMA SUCCESSFUL MESSAGE CALL CONO LXI D,AADRS CALL CONO LDA FNMBR CLOSE FILE CALL SYS DB CLOOP JMP SYSERR RTST3 CALL PATUP UPDATE PATTERN LDA COUNT UPDATE PASS COUNT DCR A STA COUNT JNZ RTST2 LOOP FOR 9 PATTERNS CALL ADDUP UPDATE BLOCK ADDRESS JNC RTST1 LOOP FOR ALL BLOCKS JMP RTST START OVER AT FIRST BLOCK * RERR1 LXI D,MSG3 JMP RERR4 RERR2 LXI D,MSG4 JMP RERR4 RERR3 MOV A,H ANI 0FH MOV H,A XCHG LHLD TADRS DAD D LXI D,MSG5 RERR4 PUSH H CALL CONO POP H CALL HLCON LXI D,HXBUF CALL CONO MVI A,-1 CALL SYS DB CAOP JMP SYSERR LDA ESTOP ORA A JNZ EXIT1 JMP RTST3 * * ABORT WHEN KEY IS PRESSED * EXIT CALL CONIN GOBBLE CHAR EXIT1 CALL SYS DB RETOP RETURN TO PTDOS * * CHECK LHLD PATRN PUSH H XCHG 4K BLOCK ADDRESS IN DE ON ENTRY LXI D,0FFFH * CHEK1 POP PSW GET MASTER PATTERN PUSH PSW THEN SAVE IT CMP M DOES MEMORY MATCH ? JNZ CHEK2 NO. IT'S WRONG ! * POP PSW GET WORKING PATTERN RAL . NEW WORKING PATTERN PUSH PSW BACK TO STACK * INX H NEXT MEMORY ADDRESS DCX D MOV A,D DONE WITH BLOCK ? ORA E JNZ CHEK1 NOPE * POP PSW NORMAL RETURN STC CMC RET * CHEK2 POP PSW ERROR RETURN STC RET * * SUBROUTINES * PATUP LHLD PATRN UPDATE PATTERN PUSH H POP PSW RAL . NEW MASTER PUSH PSW POP H SHLD PATRN RET ** SYSERR CALL SYS DB ABTOP ** TAINI LHLD FADRS FIRST ADRS INR H DCR H JNZ TAIN1 IF NOT BLOCK 0 * INX H IF BLOCK 0, ADRS=N001 * TAIN1 SHLD TADRS * LDA AFRST ADI '0' STA AADRS ASCII ADRS RET ** ADDUP LHLD TADRS LXI D,1000H * MVI L,0 IF NOT BLOCK 0, ADRS=N000 * DAD D SHLD TADRS * LDA AADRS INR A STA AADRS MOV B,A LDA ALAST CMP B RET * * GET PARAMETER VIA PSCAN * GETP MVI A,PSV LXI D,PBUFF CALL PSCAN JC PERR0 JZ PERR0 * INR D DCR D JNZ PERR1 * MOV A,E ANI 0F8H JNZ PERR1 CAN'T BE >7 * RET . DE HAS VALID PARAM. * PERR0 MVI A,ERVAX EXP'D ADRS JMP PERR2 * PERR1 MVI A,ERIAD ADRS RANGE * PERR2 POP H CLEAN UP STACK LXI H,-1 CALL SYS DB ABTOP ** FILL LHLD PATRN GET MASTER PATTERN PUSH H ONTO STACK LHLD TADRS GET ADDRESS OF BLOCK TO BE FILLED LXI B,1000H * FILL1 POP PSW GET WORKING PATTERN MOV M,A TO MEMORY * RAL . NEW PATTERN PUSH PSW BACK TO STACK * INX H NEXT MEMORY ADDRESS DCX B MOV A,B ORA C JNZ FILL1 * POP PSW CLEAN UP STACK RET * * CONOUT MESSAGE HANDLER * CONO MVI A,1 LXI B,500 MAXIMUM MSG. LENGTH MVI L,0 NULL IS DELIMITER CALL SYS DB DWROP JMP SYSERR RET * * MESSAGES * MSG1 ASC "STOP ON ERRORS (Y/N) ? " DB 0DH DB 0 * MSG2 ASC "GOOD DMA READ FROM BLOCK AT " DB 0 * MSG3 ASC "MEMORY ERROR AT ADDRESS " DB 0 * MSG4 ASC "DMA BUFFER MODIFIED AT ADDRESS " DB 0 * MSG5 ASC "DMA READ ERROR AT ADDRESS " DB 0 * * * CONV. HL TO ASCII HEX IN A BUFFER * HLCON LXI D,HXBUF THE BUFFER MOV A,H HI BYTE FIRST CALL HEXA CONV. TO HEX MOV A,L LO BYTE NEXT CALL HEXA CONV. TO HEX RET * HEXA MOV C,A SAVE VALUE RRC RRC RRC . SWAP NIBBLES RRC CALL HEXA1 CONVERT HI NIBBLE MOV A,C * HEXA1 ANI 0FH CONVERT LO NIBBLE ADI 48 ADD ASCII BIAS CPI 58 GREATER THAN 9 ? JC HEXA2 NOPE ADI 7 YES. CONVERT TO A-F HEXA2 STAX D PUT IN BUFFER INX D BUMP BUFFER POINTER RET * AADRS DS 1 ASC "000H" DB 0DH DB 0 * HXBUF DS 4 DB 'H' DB 0DH DB 0 * PATRN DS 2 PATTERN COUNT DS 1 PATTERN COUNTER FNMBR DS 1 FILE # FADRS DS 2 FIRST ADRS IN HEX AFRST DS 1 " " IN ASCII ALAST DS 1 LAST ADRS+1 IN ASCII ESTOP DS 1 STOP ON ERROR IF NZ TADRS DS 2 4K BLOCK ADRS * PBUFF DS 20 PSCAN BUFFER * NAME1 ASC "DMA.2" DB 0 * ORG 8000H DISK READ BUFFER BUFFER DS 1000 * ** END OF DMA READ TEST ** *