; ************************* ; * * ; * DMARAM TEST. * ; * * ; ************************* ; ORG 0100H JMP START ; BASE DB 0 ;SPECIAL EQU'S AND RESERVED MEMORY SIZE EQU 516 ;SECTOR SIZE SBADR DW 0000 ENABLE DB 0 ;THIS FLAG > 0 WILL DISABLE ERROR CHECK SPAG DB 0 EPAG DB 0 CPAG DB 12 HIN DB 0 INCH DB 0 ERADDR DW 0FFFFH ERWRIT DB 00 ERREAD DB 00 ; BCXTR DW 0000 ;MEMORY RESERVED FOR TEMPORARY REGISTER STORAGE DEXTR DW 0000 HLXTR DW 0000 AFXTR DW 0000 CH DB 00 ;STORAGE FOR CHAR RETURNED IN A FROM BIOS CALLS ; BIOS EQU 0005H ;STANDARD EQU ASSIGNMENTS CR EQU 13 LF EQU 10 BELL EQU 7 TAB EQU 9 X EQU '$' BREAK EQU 27 ;CONTROL-C X0 EQU 90H ; ; PROMPT MESSAGES M0 DB BELL,LF,CR,TAB,'KONAN DMARAMS TEST',LF,CR DB TAB,'RELEASE 1, REVISION 1 - 01/02/80',LF,LF,CR DB TAB,'ANY KEY WILL BEGIN OPERATION,',LF,CR DB TAB,'BUT CONTROL-P WILL DISABLE ERROR PRINTING ',LF,CR DB TAB,'AN ESCAPE WILL END TEST AT ANY TIME .',LF,LF,CR,X M1 DB LF,LF,CR,'STARTING MEMORY PAGE: 00',8,8,8,8,X M2 DB LF,CR,'ENDING MEMORY PAGE : 00',8,8,8,8,X M3 DB 'PASS ',X M9 DB CR,LF,X ; ; ERROR MESSAGES E1 DB LF,CR,'OVERRUN ERROR ',X E2 DB LF,CR,'UNDEFINED ERROR',LF,CR,X E3 DB CR,LF,' ( ERROR: ADDRESS,WRITTEN,READ )',TAB,X ; ; CONSOLE ROUTINES: FUNC CALL SHOVE CALL BIOS STA CH CALL GRAB RET CHIN MVI C,1 ;INPUT CHAR FROM KEYB. & RETURN IT IN A CALL FUNC LDA CH RET CHOUT CALL SHOVE MVI C,2 ;PRINT CHAR IN E ON THE TUBE JMP FUNC+3 MESSG CALL SHOVE MVI C,9 ;PRINT STRING WHOSE ADDR IS IN D/E ON TUBE JMP FUNC+3 CHSTAT MVI C,11 CALL BIOS STA CH RET ; ; (DISK ROUTINES WOULD GO HERE IF NEEDED) ; ; SPECIAL ROUTINES: SHOVE SHLD HLXTR ;PLACE ALL REG. IN STORAGE (NON-DESTRUCTIVELY) XCHG SHLD DEXTR PUSH B POP H SHLD BCXTR PUSH PSW POP H SHLD AFXTR GRAB LHLD AFXTR ;RESTORE REGISTERS AFTER A SHOVE PUSH H POP PSW LHLD BCXTR PUSH H POP B LHLD DEXTR XCHG LHLD HLXTR RET ; HEXOUT PUSH A ;OUTPUT A AS ASCII-HEXOUT NUMBER ANI 0F0H RRC RRC RRC RRC CALL H1 POP A ANI 00FH H1 CPI 10 JM H2 ADI 7 H2 ADI 48 MOV E,A MVI C,2 CALL BIOS RET HEXIN CALL CONTC ;INPUT HEXBYTE TO A VIA TWO ASCII CHARS CALL CHIN LDA CH CALL MAKBYT STA HIN CALL CHIN LDA CH CALL MAKBYT MOV B,A LDA HIN RLC RLC RLC RLC ADD B STA HIN RET MAKBYT SUI 30H ;CONVERT ASCII HEX CHAR. TO NUMERIC EQUIV. CPI 0AH RM SUI 07H RET ; CONTC NOP CALL CHSTAT ;WARM BOOT IF 'BREAK' KEY WAS HIT LDA CH ORA A JZ RETURN CALL CHIN CPI BREAK JZ 0000 RETURN NOP RET ; ; ; START LXI D,M0 ;SIGN ON MESSAGE CALL MESSG XRA A STA ENABLE ;SETTING ENABLE FLAG IF ^P STARTED TEST CALL CHIN CPI 16 JNZ AGAIN STA ENABLE ; AGAIN NOP LXI D,M1 ;ENTER STARTING MEMORY PAGE (MSB) CALL MESSG CALL HEXIN STA SPAG LXI D,M9 CALL MESSG LXI D,M2 ;ENTER ENDING MEMORY PAGE CALL MESSG CALL HEXIN ORA A JZ AGAIN ;REJECT 00 AS MSB DCR A STA EPAG MOV B,A LDA SPAG CMP B JNC AGAIN ;REJECT ENDING PAGE LESS THAN STARTING PAGE DEFLT LXI D,M9 LDA SPAG STA CPAG ;SET CURRENT PAGE TO STARTING PAGE ONE LXI B,SIZE LDA CPAG MOV H,A ;START OF CURRENT PAGE MVI L,00 ;LSB OF WRITE PAGE INITIALLY ZERO LDA BASE XX MOV M,A ;LOAD BYTE INTO PAGE INR A ;INCREMENT BYTE DCX B ;DECREMENT SIZE COUNT INX H ;INCREMENT PAGE LOCATION MOV D,A ;TEMP.STORE A IN D MOV A,B ;CHECKING TO SEE IF DONE... ORA C JZ BFDN ;IF DONE GOTO BFDN NEXT MOV A,D ;GET A BACK FROM D JMP XX ;CONTINUE LOOPING UP UNTIL DONE WRITING BFDN LDA CPAG ;SET PAGE FOR DMA TO CURRENT PAGE OUT X0+6 XRA A OUT X0+5 OUT X0+7 ;RESET SECT.BUFF. MVI A,02H ;DMA WRITE COMMAND OUT X0+2 LDA CPAG ;GET READY FOR OFFSET TEST: MOV H,A ; GOING TO READ S.B. INTO RAM OUT X0+6 ; AT A 31H BYTE OFFSET TO INSURE MVI A,31H ; TEST INTEGRITY. MOV L,A OUT X0+5 LXI D,SIZE ;PLACING TWO TEST BYTES JUST BEYOND DAD D ; WHERE S.B. WILL BE READ INTO MVI M,0AAH ; RAM. THIS IS FOR INX H ; OVERFLOW TEST MVI M,055H OUT X0+7 ;RESET S.B. MVI A,04H ;AND READ S.B. INTO RAM OUT X0+2 LDA CPAG ;GETTING READY TO TEST THE OFFSET RAM BYTES MOV H,A MVI L,31H LXI B,SIZE LDA BASE MOV D,A TNXT MOV A,M ;TEST EACH BYTE CMP D CNZ ERROR ;DISPLAY ERROR IF ANY INR D INX H DCX B MOV A,B ORA C JNZ TNXT ;LOOP TO NEXT BYTE UNTIL DONE MOV A,M ;NOW CHECK TO SEE IF THE OVERFLOW-CHECK SUI 0AAH CNZ OVRUN ;DISPLAY OVERFLOW ERROR IF ANY INX H MOV A,M SUI 055H CNZ OVRUN ;DISPLAY OVERFLOW ERROR IF ANY LDA CPAG ;GETTING READY FOR NEXT PAGE MOV B,A LDA EPAG CMP B JZ MEMFUL ;JUMP TO NEXT PAGE IF CURRENT PAGE MOV A,B ; IS EQUAL TO END PAGE INR A STA CPAG INCBS LDA BASE ;OTHERWISE, INCREMENT BASE FOR NEXT TRY INR A STA BASE JMP TOONE MEMFUL LDA SPAG ;NEXT PAGE STA CPAG LDA BASE INR A STA BASE PASS LDA ENABLE ORA A JNZ TOONE LXI D,M3 ; PASS MESSAGE. IT WILL CALL MESSG ; PRINT AFTER EVERY PAGE HAS TOONE CALL CONTC ; BEEN TESTED JMP ONE OVRUN CALL SHOVE ;OVERRUN MESSAGE LXI D,E1 MVI C,9 LDA ENABLE ORA A JNZ WAYDOWN CALL BIOS CALL CONTC CALL GRAB RET ERROR CALL SHOVE SHLD ERADDR STA ERREAD MOV A,D STA ERWRIT LDA ENABLE ORA A JNZ WAYDOWN LXI D,E3 MVI C,9 CALL BIOS CALL CONTC LHLD ERADDR MOV A,H CALL HEXOUT LHLD ERADDR MOV A,L CALL HEXOUT MVI E,32 MVI C,2 CALL BIOS LDA ERWRIT CALL HEXOUT MVI E,32 MVI C,2 CALL BIOS LDA ERREAD CALL HEXOUT WAYDOWN CALL GRAB RET