h;****************************************;* ATARI MEMORY TEST PROGRAM ;* FOR ANALOG COMPUTING # 11 %;* BY TONY MESSINA 0;****************************************5@;*********************E;* EQUATES FOR PROG P;*********************U;* FIRST PG0 LOCATIONS`;*********************epTSTPTR .DE $CD ; POINTER TO TEST AREuITCNT .DE $CF ; SCRN ADDR OF ITCNT VÀASCICNT .DE $D1 ; ASCII NUMBER IT CNԅSAVEX .DE $D2 ; X STORE LOÐTOTAL_CNT .DE $D3 ; # TIMES THRU LOOP CNԕTOGGLE .DE $D4 ; XR LOCATIOTESNUM .DE $D5 ; ODD BYTE CNSTART_PAGE .DE $D6 ; STRT PG OF TST AREEND_PAGE .DE $D7 ; END PG OF TST ARETEST_VAL .DE $D8 ; VALUE TO TES HIHEX .DE $D9 ; HEX NUM STORE AREA HI NYBL%LOHEX .DE $DA ; HEX NUM STORE LO NYBL05;*********************@;* END PG 0 LOCATIONS E;*********************P;* NOW ROM LOCATIONS U;*********************`ePUTCHR .DE $F6A4 ; CHAR IN A TO SCREEpWRITE_MSG .DE $F385 ; WRITE A LINE TO SCREEuMOTCNTL .DI $D302 ; MOTOR CNTL LOÀ;********************;* END ROM LOCATIONS ;********************;* MISC EQUATES ;********************CR .DI $9B ; CARRIGE RETUR CLS .DI $7D ; CLEAR SCREE%BELL .DI $FD ; RING BUZZE0SPACE .DI $20 ; SPACE CHA5TAB .DI $7F ; TAB CHA@MEMLO .DE $02E7 ; LOW START ADDEMEMHI .DE $02E5 ; HI MEM ADDPSCRADR .DE $58 ; PTR TO 1ST SCREEN LOUCURON .DE $02F0 ; CURSOR ON/OFF TOGGLE ADD`NULL .DI $00 ; NULL BYTeCASOFF .DI $3C ; MOTOR OFpMARLFT .DE $52 ; LFT MARGIN LOuDOSINI .DE $0A ; DOS VECTOҀ;*********************;* ASSEMBLY CONTROL ;********************* .PR "TYPE 1 FOR CAS, 0 FOR DISK.CASS_FL .IN CASS_FL  .BA $0480 ; ASSEMBLE FOR $048% .MC $A000 ; STORE AT $A000; .LS ; GIMME LISTIN5 .OS ; STORE OBJ COD@E;*********************P;* PROGRAM STARTS HEREU;*********************` IFN CASS_FLep;*** DON'T ASSEMBLE THE FOLLOWING **u;*** IF CASS_FLG = 0 **HEADER .BY  .BY  .SI HEADE .SI INI CL RT %INIT LDA #CASOFF ; OFF VA0 STA MOTCNTL ; DO I5 LDA #L,SET_SCREE@ STA *DOSINI ; SWAP RESTARE LDA #H,SET_SCREEP STA *DOSINI+1 ; VECTOU RTS ; AND RETUR` *** ; END CONDITIONAepSET_SCREEu LDX # STX *MARLFT ; MAKE 40 COLӅ LDY #H,TITLE1 ; GET LO ADDҐ LDX #L,TITLE1 ; GET HI ADDҕ JSR WRITE_MSG ; PUT IT U LDX #38 ; LOAD COUN STX CURON ; ZAP CURSODRAW_BA  LDA #'= ; LOAD AN % STX *SAVEX ; SAVE X RE0 JSR PUTCHR ; PRINT THE 5 LDX *SAVEX ; RESTORE COUN@ DEX ; DEC THE COUNE BPL DRAW_BAR ; DO IT 39 TIMEPUDO_TITLE` LDY #H,TITLE2 ; LO ADDe LDX #L,TITLE2 ; HI ADDp JSR WRITE_MSG ; WRITE Iu;************************;* FIND SCREEN ADDRESSES ;************************GET_ADDR LDA *SCRADR ; GET 1ST LO CLC ; CLR CARR ADC #180 ; ADD OFFSE  STA *ITCNT ; STORE L% LDA *SCRADR+1 ; GET H0 ADC #0 ; ADD CARRY TOO5 STA *ITCNT+1 ; STUFF H@E;*************************P;* GET AREA OF MEMORY TO U;* TEST... `;*************************epTEST_RANGu LDA #7 ; START AT PG  STA *START_PAGE ; STORŅ LDA MEMHI+1 ; GET HI Pǐ SEÕ SBC #1 ; SUBTRACT 1 PAG STA *END_PAGE ;STORE I;***************;* SET LOOP CNT ;***************%0OUTER_LOO5 LDA #9 ; 9 TIMES THR@ STA *TOTAL_CNT ; STUFE LDA #16 ; LOAD START CNT ASCIP STA *ASCICNT ; STORE IU IFE CASS_FL` RTS ; END OF INIT SEGMENe *** ; END CONDITIONApu;********************************PROG_STARԕ LDA #0 ; ZERO TO  TAY ; SAVE IN STA *TOGGLE ; CLR TOGGL STA *TESNUM ; AND TESNU STA *TSTPTR ; ZAP LO PG PT MAIN_LOO% STA *TOGGLE ; MEM FILL/TST VA0 LDX #2 ; LOAD TEST LOOP COUN5 STX *TESNUM ; AND STORE I@PASS_LOOE LDA *START_PAGE ; GET STRT PG# OF AREP STA *TSTPTR+1 ; STORE IN POINTEU LDX *END_PAGE ; GET END PAGE OF TEST ARE` LDA *TOGGLE ; LOAD VALUe EOR #$FF ; MAKE CURENT TST VAp STA *TEST_VAL ; AND STORE IuWRITE_VÀ STA (TSTPTR),Y ; WRITE VAL INTO TEST ARE INY ; INC LO PAGE COUNԐ BNE WRITE_VAL ; DO THIS WHOLE PǕ INC *TSTPTR+1 ; INC NEXT PAG CPX *TSTPTR+1 ; DONE WITH TST AREA BCS WRITE_VAL ; GO BACK IF NOT> EN  ;******************************* ;* TEST AREA IS NOW FILLED WITH % ;* THE TEST VALUE.NEXT WE STUFF 0 ;* AN ODD VALUE IN 1 OF EVERY 3 5 ;* BYTES IN THE TEST AREA. @ ;*******************************E P LDX *TESNUM ; GET ODD BYTE PTU LDA *START_PAGE ; RESET TEST ARE` STA *TSTPTR+1 ; POINTEe ZERO_FILL LDA *TOGGLE ; GET TOGGLE VAp DOIT DEX ; DEC TEST COUNu BPL BYPASS ; IF POSITIVE BRANCȀ LDX #2 ; ELSE STORE ODD VA̅ STA (TSTPTR),Y ; SO STUFF IԐ BYPASS INY ; INC LO PNTR THIS PǕ BNE DOIT ; DO ENTIRE PAG INC *TSTPTR+1 ; AND INC TO NXT P LDA *END_PAGE ; GET END PG VA CMP *TSTPTR+1 ; WE DONE BCS ZERO_FILL ; IF NO..PLEASE CONTINU %0;******************************5;* AT THIS POINT THE TEST AREA @;* IS SET UP..NOW TEST IT.... E;******************************PU LDA *START_PAGE ; RESET PG0 POINTE` STA *TSTPTR+1 ; TO START OF TST AREe LDX *TESNUM ; LOAD ODD BYTE PNTpTEST_RAu LDA *TEST_VAL ; LOAD TESTING VÀ DEX ; DEC PNTR OF ODD VA̅ BPL BYPASS2 ; IF <> ODD CK TEST VA̐ LDX #2 ; ELSE RESET COUNTEҕ LDA *TOGGLE ; AND CK ODD VABYPASS2 CMP (TSTPTR),Y ; THIS LOCATION MATCH BNE NOGO ; NOPE!!!BOO BOO! INY ; YES..INC POINTER L BNE TEST_RAM ; AND DO WHOLE PAG  INC *TSTPTR+1 ; INC PAGE H% LDA *END_PAGE ; LOAD ENDING PAG0 CMP *TSTPTR+1 ; WE DONE5 BCS TEST_RAM ; NO..FINISH THIS P@E;*******************************P;* THIS PASS WAS OK..FLIP THE U;* VALUES AND DO IT AGAIN SAM `;*******************************ep DEC *TESNUM ; DEC TEST NUMBEu BPL PASS_LOOP ; IF >=0 GO BACˀ LDA *TOGGLE ; GET OUR TOGGLŅ EOR #$FF ; FLIP IԐ BMI MAIN_LOOP ; RPT IF VAL IN A=$Fƕ DEC *TOTAL_CNT ; DEC # OF TESTS CN BPL NEXT_TEST ; DO TEST 9 TIME JMP PROG_END ; THEN WE DON;******************************* ;* COME HERE IF MEMORY ERROR %;*******************************05NOGO STY *TSTPTR ; STORE LSB ERROR ADD@ JSR CONVERT ; CONVERT TO HEE STA TVALAD+1 ; STORE LP LDA *HIHEX ; GET HI HEU STA TVALAD ; STORE HI TST VA` LDY #NULL ; ZAP e LDA (TSTPTR),Y ; GET ACTUAL VALUp JSR CONVERT ; CONVERT IT TO HEu STA AVALAD+1 ; STUFF Lπ LDA *HIHEX ; GET HI HE؅ STA AVALAD ; STUF IԐ LDA *TSTPTR ; GET LSB ADDR OF FAILED ME͕ JSR CONVERT ; CONVERT I STA ERRAD+3 ; STORE LO HEX MS LDA *HIHEX ; GET *HIHEX LS STA ERRAD+2 ; STUF LDA *TSTPTR+1 ; GET MSB ADDR OF MEM FAI  JSR CONVERT ; TO HE% STA ERRAD+1 ; STUFF LO MS0 LDA *HIHEX ; GET HI MS5 STA ERRAD ; STUF@ LDY #H,ERRMSG ; GET MSG ADDE LDX #L,ERRMSG ; HI/LP JSR WRITE_MSG ; DISPLAY IUPROG_END LDY #H,END_MSG ; LOAD EN` LDX #L,END_MSe JSR WRITE_MSG ; WRITE IpDONE JMP DONE ; INFINITE LOOu;** COME HERE TO INC ITERATION *;** COUNT AND RESET FOR NXT TST*NEXT_TEST LDY # INC *ASCICNT ; INC CNT LDA *ASCICNT ; LOAD VA STA (ITCNT),Y ; STUFF I JMP PROG_STAR !%;*********************0;* BIN TO HEX CONVERT 5;*********************@ECONVERT PHA ; SAVE P LSR U LSR ` LSR e LSR p JSR CONASC ; CONVERu STA *HIHE؀ PL JSR CONASÐ STA *LOHEؕ RTS ; RETUR;*******************;* ACTUAL HEX CON ;******************* %CONASC AND #$00 CMP #$05 BMI LT@ ADC #ELT9 ADC #$3P RTS ; RETURU;***********************`;* MESSAGE AREA FOLLOWS e;***********************puTITLE .BY CLS TAB ' ATARI MEMORY TEST' TAB TA… .BY TAB TAB ' by AWM ANALOG #11' TAB TAB CҐ .BY TAB TAB TAB TAB TAB TAB TAB TAB TAB TAB CҕTITLE .BY TAB TAB TAB 'ITERATIONS' TAB TA .BY TAB TAB TAB SPACE SPACE SPACE SPAC .BY SPACE '0' C ERRMSG .BY 'ERROR @->$%ERRAD .BY 'XXXX' SPACE 'TVAL->$0TVALAD .BY 'XX' SPACE 'AVAL->$5AVALAD .BY 'XX' C@EEND_MSP .BY TAB TAB 'TEST DONE' CULAST_INS .E