**************************************************************** * * CRC TEST OF SOLOS * CRCTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,CRCMSG PRINT OUT START MESSAGE CALL PRINT * CRCT0 LXI H,0C000H START OF SOLOS MVI C,0 START CLEAN * CRCT1 MOV A,C SUB M DCR A MOV C,A INX H MOV A,H CPI 0C8H JNZ CRCT1 * * WE NOW HAVE CRC, LET'S PRINT IT OUT! * MOV A,C FIRST HIGH NYBBLE RRC . RRC . RRC . RRC . CALL ASCII LXI H,0CE4CH MOV M,A INX H MOV A,C CALL ASCII MOV M,A * CALL ESCTEST USER WANT OUT? RZ . YES JMP CRCT0 START CRC TEST OVER * * ASCII ANI 0FH ADI '0' CPI '9'+1 RC . ADI 'A'-'9'-1 RET . * CRCMSG ASC " Solos CRC test\" ASC "\\\CRC should be:\\" ASC " 2F for Solos ROM's.\" ASC " 8A for BOOT ROM's.\" ASC "\ CRC is: " DB 0 * * * MEMORY TEST * MEMTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,MEM1MSG PRINT MESSAGE CALL PRINT * * FIRST TEST SYSTEM RAM * LXI H,0C800H IT MUST BE SAVED FIRST CALL SAVE XRA A STA EBUF START CLEAN * MEMT1 LXI H,0C800H NOW DO THE TEST SHLD BDADR CALL MTEST LXI H,0CD50H OUTPUT RESULTS TO SCREEN LDA EBUF CALL BOUT CALL STEST CHECK FOR 'S', DEL, ESC JZ DONM1 BACK TO COMMAND INTERPRETER IF DEL JNC MEMT1 REPEAT TEST TILL 'S' KEY IS TYPED * LXI H,0C800H TEST OVER, RESTORE CONTENTS OF MEMORY CALL RESTORE * * NOW TEST VDM RAM * LXI D,MEM2MSG PRINT OUT SECOND MESSAGE LXI H,0CE00H PUT IT HERE ON SCREEN CALL PRINT CALL DELAY GIVE USER TIME TO SEE WHAT'S HAPPENING CALL DELAY LXI H,0CC00H FIRST SAVE CONTENTS OF SCREEN CALL SAVE XRA A STA EBUF START CLEAN * MEMT2 LXI H,0CC00H NOW DO THE TEST SHLD BDADR CALL MTEST CALL ESCTEST RZ . BACK TO COMMAND INTERPRETER IF DEL JNC MEMT2 OVER AND OVER TILL 'S' KEY IS TYPED LXI H,0CC00H CALL RESTORE * LXI H,0CE90H OUTPUT RESULTS TO SCREEN LDA EBUF CALL BOUT MEMT3 CALL ESCTEST WAIT TILL USER TYPES ESC KEY JNZ MEMT3 RET . THEN GO BACK TO COMMAND LEVEL * * THE MEMORY TEST * MTEST XRA A STC . PUSH PSW MASTER PUSH PSW WORKER MTST1 LHLD BDADR FIRST ADRS. * MTST2 POP PSW MOV M,A WRITE IT RAL . PUSH PSW INX H MOV A,H ANI 3 ORA L 1K WORTH ? JNZ MTST2 NOT YET * POP PSW POP PSW PUSH PSW PUSH PSW LHLD BDADR * MTST3 POP PSW PUSH PSW CMP M CHECK IT CNZ KERR OOPS POP PSW RAL . PUSH PSW INX H MOV A,H ANI 3 ORA L 1K WORTH ? JNZ MTST3 NOPE * POP PSW POP PSW ROTATE MASTER RAL . RC . PUSH PSW PUSH PSW JMP MTST1 * KERR XRA M BAD BITS=1'S MOV B,A TO B REG. LDA EBUF ERROR ACCUMULATOR ORA B NEW ERRORS STA EBUF LOGGED NOW RET * * SAVE 1K BLOCK OF MEMORY * SAVE LXI D,SAFE LXI B,1024 SAVE1 MOV A,M STAX D INX D INX H DCR C JNZ SAVE1 DCR B JNZ SAVE1 RET . * * RESTORE 1K BLOCK OF MEMORY * RESTORE LXI D,SAFE LXI B,1024 REST1 LDAX D MOV M,A INX D INX H DCR C JNZ REST1 DCR B JNZ REST1 RET . * * CHECK KEYBOARD FOR 'S', DEL, OR ESC * USED ONLY FOR MEM TEST 1 SINCE RESTORES MEMORY * STEST MVI A,0 CALL AINP JZ STES1 ANI 7FH CPI 1BH ESC? JZ STES2 YES CPI 7FH DEL? RZ . YES CALL MAP UPSHIFT CPI 'S' 'S' KEY? JNZ STES1 NO ORI 0FFH CLEAR ZERO FLAG STC . RET . STES1 ORI 0FFH RET . STES2 LXI H,0C800H ESC WAS TYPED RETURN BACK TO SOLOS CALL RESTORE BUT FIRST...RESTORE SYSTEM RAM CALL CLEAR AND CLEAR SCREEN JMP RETRN * * RETURN BACK TO COMMAND INTERPRETER FROM MEM TEST 1 * DONM1 LXI H,0C800H BUT FIRST...RESTORE MEMORY CALL RESTORE RET . * * EBUF DB 0 BDADRS DW 0 * MEM1MSG ASC " Memory test.\" ASC "\\Sol system RAM (addresses C800 to CBFF) test.\" DB 0 * MEM2MSG ASC "Sol VDM RAM (addresses CC00 to CFFF) test." DB 0 * SAFE DS 1024 * **************************************************************** * * VIDEO TEST * VIDTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,VIDMSG PRINT MESSAGE CALL PRINT CALL DELAY CALL DELAY * VIDT0 LXI H,0CC00H MVI B,0 * VIDT1 CALL ESCTEST TEST KEYBOARD FOR INPUT RZ . DEL INPUTTED, RETURN TO COMMAND INTERPRETER JC VIDT2 'S' INPUTTED, STOP VIDEO FILL TEST MOV M,B INX H INR B MOV A,H CPI 0D0H JNZ VIDT1 NOT AT END OF SCREEN JMP VIDT0 AT END OF SCREEN...START OVER * VIDT2 CALL CLEAR CLEAR SCREAN XRA A STA SCRPORT RESET MY COPY OF SCROLL PORT LXI D,VID2MSG PRINT SECOND MESSAGE CALL PRINT VIDT3 CALL INN INPUT INSTRUCTION (SCROLL UP,DOWN,ETC) DCX H ERASE CHARACTER ECHOED ON SCREEN MVI M,' ' CPI 17H UP ARROW? JZ SCRUP SCROLL UP CPI 1AH DOWN ARROW? JZ SCRDN SCROLL DOWN CPI 01H LEFT ARROW? JZ WINUP WINDOWSHAD UP CPI 13H RIGHT ARROW? JZ WINDN WINDOWSHAD DOWN JMP VIDT3 MEANINGLESS INPUT TRY AGAIN * SCRUP LDA SCRPORT RRC . RRC . RRC . RRC . ADI 10H RLC . RLC . RLC . RLC . STA SCRPORT OUT 0FEH JMP VIDT3 * SCRDN LDA SCRPORT RRC . RRC . RRC . RRC . SUI 10H RLC . RLC . RLC . RLC . STA SCRPORT OUT 0FEH JMP VIDT3 * WINUP LDA SCRPORT SUI 10H STA SCRPORT OUT 0FEH JMP VIDT3 * WINDN LDA SCRPORT ADI 10H STA SCRPORT OUT 0FEH JMP VIDT3 * * SCRPORT DB 0 * VIDMSG ASC " Video test.\" DB 0 * VID2MSG ASC " 1 Scroll and windowshade test.\" ASC " 2\ 3\ 4\ 5 Type up arrow to scroll up,\" ASC " 6\ 7 down arrow to scroll down,\" ASC " 8\ 9 left arrow to move windowshade up,\" ASC "10\11 and right arrow to move windowshade down.\" ASC "12\13\14\15\16" DB 0 * **************************************************************** * * SERIAL PORT TEST * SERTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,SERMSG PRINT MESSAGE CALL PRINT XRA A STA SERRLOG CLEAR ERROR LOG LXI H,0CF00H SHLD SCRPTR SET SCREEN POINTER LXI H,0CE13H CALL BOUT OUTPUT ERROR LOG IN 0F9H CLEAR STATUS BITS MVI B,0 * SERT1 CALL SSTATS DISPLAY STATUS BITS MVI A,10H SERIAL REQUEST TO SEND (SRTS) OUT 0F8H * LXI H,0400H RESET WAIT COUNT SHLD SWAIT SERT4 CALL ESCTEST RZ . CALL SSTATS DISPLAY STATUS BITS IN 0F8H ANI 80H JNZ SERT5 LHLD SWAIT DCX H SHLD SWAIT MOV A,H ORA L JNZ SERT4 WAITED FOR TBE A LONG TIME? LXI D,TBEMSG YES-TELL THEM WE'RE WAITING FOR TBE CALL WAITMSG JMP SERT4 SERT5 LXI D,NOMSG CLEAR WAIT MESSAGE CALL WAITMSG MOV A,B OUT 0F9H SEND OUT CHARACTER LXI H,0400H RESET WAIT COUNT SHLD SWAIT * SERT3 CALL ESCTEST RZ . CALL SSTATS DISPLAY STATUS BITS IN 0F8H ANI 40H JNZ SERT6 LHLD SWAIT DCX H SHLD SWAIT MOV A,H ORA L JNZ SERT3 WAITED FOR SDR A LONG TIME? LXI D,SDRMSG YES-TELL THEM WE'RE WAITING FOR SDR CALL WAITMSG JMP SERT3 SERT6 LXI D,NOMSG CLEAR WAIT MESSAGE CALL WAITMSG IN 0F9H BRING IT BACK IN CMP B COMPARE IT WITH WHAT WAS SENT OUT CNZ SERR * LHLD SCRPTR MOV M,A MOVE TO SCREEN INR L SHLD SCRPTR LXI H,0CE0AH MOV M,A MOVE TO SECOND POSITION ON SCREEN INR B CALL ESCTEST RZ . JMP SERT1 * * SERR PUSH PSW XRA B GET BAD BITS MOV C,A LDA SERRLOG ORA C STA SERRLOG UPDATE LOG OF ERRORS PUSH H PUSH B LXI H,0CE13H CALL BOUT OUTPUT NEW ERRORS TO SCREEN POP B POP H POP PSW RET . * * WAITMSG PUSH H LXI H,0CE93H CALL PRINT POP H RET . * * OUTPUT STATUS BITS ON SCREEN * SSTATS IN 0F8H INPUT FROM STATUS PORT ANI 20H GET SCTS MOV C,A LDA SOLDSTAT GET PREVIOUS STATUS CMP C ANY CHANGE? RZ . NO MOV A,C STA SOLDSTAT RLC . CONVERT TO ASCII RLC . RLC . ADI '0' STA 0CE32H PUT ON SCREEN RET . * ********** * SERRLOG DB 0 LOG OF ERRORS SCRPTR DW 0CF00H POINTER TO WHERE TO PUT NEXT BYTE ON SCREEN SWAIT DW 0 COUNTER (TIMER) OF WAITS.(ONLY GIVE WAIT MSG WHEN 0) SOLDSTAT DW 0 OLD STATUS STORAGE * SERMSG ASC " Serial port test.\" ASC "\\Insert proper connector in serial port.\" ASC "\\\" ASC "\ SCTS: 0" DB 0 * TBEMSG ASC "Waiting for TBE." DB 0 SDRMSG ASC "Waiting for SDR." DB 0 NOMSG ASC " " DB 0 * **************************************************************** * * PARALLEL PORT TEST * PARTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,PARMSG PRINT MESSAGE CALL PRINT XRA A STA PERRLOG CLEAR ERROR LOG LXI H,0CF00H SHLD SCRPTR SET SCREEN POINTER LXI H,0CE13H CALL BOUT OUTPUT ERROR LOG IN 0FDH CLEAR STATUS BITS MVI B,0 * PERT1 CALL PSTATS DISPLAY STATUS BITS MVI A,40H PARALLEL INPUT ENABLE (PIE) OUT 0FAH * MOV A,B OUT 0FDH SEND OUT CHARACTER * *CALL DELAY IN 0FDH BRING IT BACK IN * CMP B COMPARE IT WITH WHAT WAS SENT OUT *CNZ PERR * LHLD SCRPTR MOV M,A MOVE TO SCREEN INR L SHLD SCRPTR LXI H,0CE0AH MOV M,A MOVE TO SECOND POSITION ON SCREEN INR B CALL ESCTEST RZ . JMP PERT1 * * PERR PUSH PSW XRA B GET BAD BITS MOV C,A *LDA PERRLOG *ORA C *STA PERRLOG UPDATE LOG OF ERRORS PUSH H PUSH B LXI H,0CE13H CALL BOUT OUTPUT NEW ERRORS TO SCREEN POP B POP H POP PSW RET . * * * OUTPUT STATUS BITS ON SCREEN * PSTATS IN 0FAH INPUT FROM STATUS PORT ANI 06H MASK FOR PXDR AND PDR MOV C,A LDA POLDSTAT GET PREVIOUS STATUS CMP C ANY CHANGE? RZ . NO MOV A,C STA POLDSTAT ANI 04H GET PXDR RRC . CONVERT TO ASCII RRC . ADI '0' STA 0CE32H PUT ON SCREEN MOV A,C ANI 02H GET PDR RRC . CONVERT TO ASCII ADI '0' STA 0CE72H PUT ON SCREEN RET . * ********** * PERRLOG DB 0 LOG OF ERRORS POLDSTAT DW 0 OLD STATUS STORAGE * PARMSG ASC " Parallel port test.\" ASC "\\Insert proper connector in parallel port.\" ASC "\ (Note: This test only valid for Rev. E" ASC "\ or updated Rev. D Sol's.)\" ASC "\ PXDR: 0" ASC "\ PDR: 0" DB 0 * **************************************************************** * * ACI TAPE WRITE TEST * TPWTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,TPWMSG PRINT MESSAGE CALL PRINT CALL GETUNIT GET TAPE UNIT/SPEED FROM KEYBOARD JZ WEXIT CALL GETCHR GET CHARACTER TO BE WRITEN JZ WEXIT LDA SPEED OUT 0FAH START YOUR MOTORS.....VAROOOM! * MVI C,128 WRITE OUT A BUNCH OF NULLS XRA A TPWT0 OUT 0FBH DCR C JNZ TPWT0 MVI A,1 FOLLOWED BY A 1 OUT 0FBH * TPWT1 LXI H,0400H RESET WAIT COUNT SHLD WWAIT TPWT4 CALL ESCTEST JZ WEXIT IN 0FAH ANI 80H CHECK FOR TRANSMITTER BUFFER EMPTY (TTBE) JNZ TPWT5 WAS EMPTY LHLD WWAIT DCX H SHLD WWAIT MOV A,H ORA L JNZ TPWT4 WAITED FOR TTBE A LONG TIME? LXI D,TTBEMSG YES-TELL THEM WE'RE WAITING FOR TTBE CALL WAITMSG JMP TPWT4 * TPWT5 LXI D,NOMSG CLEAR WAIT MESSAGE CALL WAITMSG LDA CHAR OUT 0FBH SEND OUT CHARACTER * LXI H,0CE90H MOV M,A ALSO DISPLAY ON SCREEN LXI H,CHRADV WRITING OUT SINGLE OR ALL CHARACTERS? ADD M IF SINGLE CHRADV IS 0, IF ALL CHRADV IS 1.(CUTE EH?) STA CHAR RESAVE CHAR (EITHER THE SAME OR INCREMENTED BY 1) CALL ESCTEST USER WANT OUT? JNZ TPWT1 NOPE * WEXIT XRA A YEP...BUT FIRST STOP TAPE MOTOR OUT 0FAH RET . RETURN BACK TO MENU * ***** * * GET CHARACTER TO BE WRITEN OUT FROM USER * GETCHR LXI D,CHRMSG LXI H,0CE00H CALL PRINT ASK FOR CHARACTER XRA A STA CHRADV ASSUME NOT AUTO-INCREMENT MODE CALL GETNYB GET NYBBLE FROM USER RZ . JC GETC1 USER HIT CR RIGHT AWAY..WANTS AUTO-INCREMENT MODE RLC . MOVE TO HIGH NYBBLE RLC . RLC . RLC . STA CHAR SAVE IT CALL GETNYB GET NEXT NYBBLE RZ . DEL WAS TYPED JC GETCHR CR WAS TYPED...ILLEGAL AS SECOND CHARACTER MOV C,A LDA CHAR ADD C COMBINE THE HIGH AND LOW NYBBLES STA CHAR INR C CLEAR ZERO FLAG RET . * GETC1 XRA A CR HIT RIGHT AWAY USE AUTO-INCREMENT MODE STA CHAR START AT ZERO MVI A,1 INCREMENT ONE EACH TIME STA CHRADV ORA A CLEAR ZERO FLAG RET . * * GET NYBBLE FROM KEYBOARD AND CONVERT TO BINARY * GETNYB DCX H MVI M,' ' BLANK OUT OLD ANSWER, IF ANY CALL INN GET ANSWER FROM THE EVER PATIENT USER RZ . WELL...MAYBE THE USER IS'NT SO PATIENT..HE WANTS OUT CALL DELAY CALL MAP UPSHIFT CPI 0DH CARRAIGE RETURN? JZ GETN2 YES SUI '0' JC GETNYB INVALID CHARACTER CPI 9+1 JNC GETN1 INX H MOVE TO NEXT CHAR POSITION ORA A ZAP CARRY FLAG MVI B,0 INR B ZAP ZERO FLAG RET . * GETN1 SUI 'A'-'0' JC GETNYB ONLY HEX DIGITS ARE ALLOWED! CPI 'F'-'A'+1 JNC GETNYB ABOVE 'F' ADI 10 MAKE IN RANGE 10-15 AND ZAP ZERO AND CARRY FLAGS INX H MOVE TO NEXT CHAR POSITION RET . * GETN2 XRA A INR A CLEAR ZERO FLAG STC . AND SET CARRY TO INDICATE CR WAS TYPED RET . * ******************** * WWAIT DW 0 COUNTER (TIMER) OF WAITS.(ONLY GIVE WAIT MSG WHEN 0) CHAR DB 0 CHARACTER TO BE WRITTEN TO TAPE CHRADV DB 0 FLAG..SHOULD CHAR BE INR AFTER EACH WRITE OR NOT * TPWMSG ASC " ACI tape write test.\" ASC "\\Insert tape into recorder and press record button.\\" DB 0 * CHRMSG ASC "Type hex of character to write " ASC "(CR for auto-increment mode): " DB 0 * TTBEMSG ASC "Waiting for TTBE." DB 0 * ******************** * * GET TAPE UNIT AND SPEED FROM USER * GETUNIT LXI D,UNITMSG ASK FOR UNIT NUMBER CALL PRINT GETU1 DCX H MVI M,' ' BLANK OUT OLD ANSWER, IF ANY CALL INN GET ANSWER RZ . CALL DELAY DELAY A BIT SUI '1' JC GETU1 TOO LOW (MUST BE 1 OR 2) CPI 2 JNC GETU1 TOO HIGH INR A CMA . CONVERT TO FORM CONTROLLER NEEDS ANI 3 RRC . RRC . STA SPEED * LXI D,SPEDMSG CALL PRINT ASK FOR SPEED GETU4 DCX H MVI M,' ' BLANK OUT OLD ANSWER, IF ANY CALL INN GET ANSWER RZ . CALL DELAY CALL MAP UPSHIFT CPI 'H' JNZ GETU2 XRA A HIGH SPEED WANTED SO BIT 5=0 JMP GETU3 GETU2 CPI 'L' JNZ GETU4 BAD ANSWER MVI A,20H LOW SPEED WANTED SO BIT 5=1 GETU3 MOV B,A LDA SPEED ORA B OR TOGEATER UNIT NUMBER AND SPEED STA SPEED INR B CLEAR ZERO FLAG RET . * * SPEED DB 0 TAPE UNIT/SPEED * UNITMSG ASC "Enter tape unit number (1 or 2): " DB 0 SPEDMSG ASC "\Enter H for high speed or L for low speed: " DB 0 * **************************************************************** * * ACI TAPE READ TEST * TPRTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,TPRMSG PRINT MESSAGE CALL PRINT CALL GETUNIT GET TAPE UNIT/SPEED FROM USER JZ REXIT LXI H,0CF00H SHLD SCRPTR SET SCREEN POINTER IN 0FBH CLEAR STATUS BITS LDA SPEED OUT 0FAH START MOTOR * TPRT1 LXI H,0400H RESET WAIT COUNT SHLD RWAIT * TPRT3 CALL ESCTEST JZ REXIT IN 0FAH ANI 40H GET TAPE DATA READY (TDR) JNZ TPRT6 BY GOLLY..IT'S READY LHLD RWAIT DCX H SHLD RWAIT MOV A,H ORA L JNZ TPRT3 WAITED FOR TDR A LONG TIME? LXI D,TDRMSG YES-TELL THEM WE'RE WAITING FOR TDR CALL WAITMSG JMP TPRT3 TPRT6 LXI D,NOMSG CLEAR WAIT MESSAGE CALL WAITMSG * IN 0FBH READ CHARACTER FROM TAPE * LHLD SCRPTR MOV M,A MOVE IT TO SCREEN INR L SHLD SCRPTR LXI H,0CE90H MOV M,A MOVE IT TO SECOND POSITION ON SCREEN CALL ESCTEST DOES USER WANT OUT? JNZ TPRT1 NO * REXIT XRA A YES...BUT STOP MOTOR FIRST OUT 0FAH RET . RETURN TO MENU * * ********** * RWAIT DW 0 COUNTER (TIMER) OF WAITS.(ONLY GIVE WAIT MSG WHEN 0) * TPRMSG ASC " ACI tape read test.\" ASC "\\Insert tape in recorder, rewind it and play it.\" DB 0 * TDRMSG ASC "Waiting for TDR." DB 0 * **************************************************************** * * SENSE SWITHC TEST ROUTINE * SSWTST EQU $ CALL CLEAR CLEAR SCREEN LXI D,SSWMSG PRINT OUT MESSAGE CALL PRINT IN 0FFH INPUT FROM SENSE SWITCHES * SENS1 LXI H,0CDD0H SCREEN ADDRESS OF OUTPUT MVI C,8 EIGHT SWITCHES SENS2 RRC . GET NEXT BIT TO CARRY MVI B,'1' ASSUME IT'S A ONE JC SENS3 MVI B,'0' IT WAS REALLY A ZERO SENS3 MOV M,B PUT ON SCREEN INX H MOVE TO NEXT DISPLAY POSITION INX H INX H INX H DCR C JNZ SENS2 MOV B,A SAVE CURRENT VALUE SENS4 CALL ESCTEST CHECK FOR USER TYPING ESC OF DEL RZ . IN 0FFH INPUT SENSE SWITCHES CMP B HAVE THEY CHANGED? JZ SENS4 NO-LOOP TILL THEY DO JMP SENS1 YES-OUTPUT NEW VALUE * * SSWMSG ASC " Sense switch test.\\" ASC "Set sense switches and observe display.\\\" ASC " 1 2 3 4 5 6 7 8" DB 0 * ****************************************************************