********************************************** * * * DMA WRITE MEMORY TEST * * DMAWR 1.0 (mod 0) * * * * Copyright 1978 * * Processor Technology Corp. * * All Rights Reserved * * * * A PTDOS COMMAND: * * * * DMAWR , * * * * ADRS1=ADDRESS OF 4K BLOCK OF MEMORY TO * * BEGIN TESTING AT. IE. 5 TO BEGIN * * AT 5000H. * * * * ADRS2=ADDRESS OF THE LAST 4K BLOCK * * TESTED. IE. 7 TO LOOP AFTER 7FFFH. * * * * 0 <= ADRS1 AND ADRS2 <= 7 * * * * STRIKE 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 * WTST CALL TAINI INIT. BLOCK ADRS * WTST0 LXI D,NAME1 LHLD TADRS BUFFER CALL SYS DB OPEOP OPEN PATTERN FILE JMP ERROR STA FNMBR MVI A,9 STA COUNT 9 PATTERNS PER PASS ** WTST2 CALL CHECK CHECK DATA AT 4000H CALL PATUP UPDATE PATTERN LDA COUNT DCR A 9 PATTERNS CHECKED ? STA COUNT JNZ WTST3 NOT YET ** MVI A,-1 IF 9 PATTERNS CHECKED CALL SYS DB CAOP CLOSE FILE JMP ERROR CALL ADDUP UPDATE BLOCK ADRS JC WTST START OVER AT FIRST BLOCK JMP WTST0 TEST NEXT BLOCK ** WTST3 LDA FNMBR GET HERE TO LOAD NEXT PATTERN LXI B,1000H MVI D,1 FORWARD CALL SYS DB SPAOP SPACE TO NEXT PATTERN JMP ERROR * CALL CONTST CHECK FOR ANY KEY JZ WTST2 IF NO KEY KEEP TESTING * * ABORT WHEN KEY IS PRESSED * CALL CONIN GOBBLE CHAR * BYE MVI A,-1 CALL SYS DB CAOP CLOSE DMA.1 JMP ERROR CALL SYS DB RETOP RETURN TO PTDOS * * CHECK LHLD PATRN PUSH H LHLD TADRS 4K BLOCK ADRS LXI D,0FFFH * CHEK1 POP PSW GET MASTER PATTERN PUSH PSW THEN SAVE IT CMP M DOES MEMORY MATCH ? JNZ CKER 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 * LXI D,MSG3 CALL CONO LXI D,AADRS CALL CONO * RDONE POP PSW CLEAN UP STACK RET * CKER PUSH H LXI D,MSG2 PROCESS MEMORY ERROR CALL CONO * POP H CALL HLCON LXI D,HXBUF PRINT ERROR ADDRESS CALL CONO * LDA ESTOP ORA A JNZ BYE STOP IF ESTOP<>0 * JMP RDONE GIVE UP READING * * SUBROUTINES * PATUP LHLD PATRN UPDATE PATTERN PUSH H POP PSW RAL . NEW MASTER PUSH PSW POP H SHLD PATRN RET ** ERROR 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 ** DISKW LDA FNMBR LXI D,0 LXI B,0FFFH CALL SYS DB WBLOP JMP ERROR RET ** FILL LHLD PATRN GET MASTER PATTERN PUSH H ONTO STACK LXI H,0 FILL MEMORY FROM 0 TO 0FFF (4K) * WRITE POP PSW GET WORKING PATTERN MOV M,A TO MEMORY * RAL . NEW PATTERN PUSH PSW BACK TO STACK * INX H NEXT MEMORY ADDRESS MOV A,L INR A L=FF ? JNZ WRITE NOPE MOV A,H CPI 0FH H=0F JNZ WRITE * 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 ERROR RET * * MESSAGES * MSG1 ASC "STOP ON ERRORS (Y/N) ? " DB 0DH DB 0 * MSG2 ASC "DMA WRITE ERROR AT ADDRESS " DB 0 * MSG3 ASC "GOOD DMA WRITE TO BLOCK AT " 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.1" DB 0 * * ** END OF DMA WRITE TEST ** *