h;*****************************************;* ATARI MEMORY TEST PROGRAM * ;* FOR ANALOG COMPUTING # 11 *%;* BY TONY MESSINA *0;*****************************************5;@;**********************E;* EQUATES FOR PROG *P;**********************U;* FIRST PG0 LOCATIONS*;**********************e;pTSTPTR .DE $CD ; POINTER TO TEST AREAuITCNT .DE $CF ; SCRN ADDR OF ITCNT VALASCICNT .DE $D1 ; ASCII NUMBER IT CNTSAVEX .DE $D2 ; X STORE LOCTOTAL_CNT .DE $D3 ; # TIMES THRU LOOP CNTTOGGLE .DE $D4 ; XR LOCATIONTESNUM .DE $D5 ; ODD BYTE CNTSTART_PAGE .DE $D6 ; STRT PG OF TST AREAӹEND_PAGE .DE $D7 ; END PG OF TST AREATEST_VAL .DE $D8 ; VALUE TO TEST HIHEX .DE $D9 ; HEX NUM STORE AREA HI NYBLE%LOHEX .DE $DA ; HEX NUM STORE LO NYBLE0;5;**********************@;* END PG 0 LOCATIONS *E;**********************P;* NOW ROM LOCATIONS *U;**********************;ePUTCHR .DE $F6A4 ; CHAR IN A TO SCREENpWRITE_MSG .DE $F385 ; WRITE A LINE TO SCREENuMOTCNTL .DI $D302 ; MOTOR CNTL LOC;;*********************ӹ;* END ROM LOCATIONS *;*********************;* MISC EQUATES *;*********************;CR .DI $9B ; CARRIGE RETURN CLS .DI $7D ; CLEAR SCREEN%BELL .DI $FD ; RING BUZZER0SPACE .DI $20 ; SPACE CHAR5TAB .DI $7F ; TAB CHAR@MEMLO .DE $02E7 ; LOW START ADDREMEMHI .DE $02E5 ; HI MEM ADDRPSCRADR .DE $58 ; PTR TO 1ST SCREEN LOCUCURON .DE $02F0 ; CURSOR ON/OFF TOGGLE ADDRNULL .DI $00 ; NULL BYTEeCASOFF .DI $3C ; MOTOR OFFpMARLFT .DE $52 ; LFT MARGIN LOCuDOSINI .DE $0A ; DOS VECTOR;;**********************;* ASSEMBLY CONTROL *;**********************; .PR "TYPE 1 FOR CAS, 0 FOR DISK."CASS_FLG .IN CASS_FLG .BA $0480 ; ASSEMBLE FOR $0480% .MC $A000 ; STORE AT $A0000; .LS ; GIMME LISTING5 .OS ; STORE OBJ CODE@;E;**********************P;* PROGRAM STARTS HERE*U;********************** IFN CASS_FLGe;p;*** DON'T ASSEMBLE THE FOLLOWING ***u;*** IF CASS_FLG = 0 ***;HEADER .BY 0 .BY 4 .SI HEADER .SI INIT;ӌ CLC RTS ;%INIT LDA #CASOFF ; OFF VAL0 STA MOTCNTL ; DO IT5 LDA #L,SET_SCREEN@ STA *DOSINI ; SWAP RESTARTE LDA #H,SET_SCREENP STA *DOSINI+1 ; VECTORU RTS ; AND RETURN *** ; END CONDITIONALe;pSET_SCREENu LDX #0 STX *MARLFT ; MAKE 40 COLS LDY #H,TITLE1 ; GET LO ADDRӌ LDX #L,TITLE1 ; GET HI ADDR JSR WRITE_MSG ; PUT IT UP; LDX #38 ; LOAD COUNT STX CURON ; ZAP CURSORDRAW_BAR LDA #'= ; LOAD AN =% STX *SAVEX ; SAVE X REG0 JSR PUTCHR ; PRINT THE =5 LDX *SAVEX ; RESTORE COUNT@ DEX ; DEC THE COUNTE BPL DRAW_BAR ; DO IT 39 TIMESP;UDO_TITLE2 LDY #H,TITLE2 ; LO ADDRe LDX #L,TITLE2 ; HI ADDRp JSR WRITE_MSG ; WRITE ITu;;*************************;* FIND SCREEN ADDRESSES *;*************************;GET_ADDR1 LDA *SCRADR ; GET 1ST LOC CLC ; CLR CARRY ADC #180 ; ADD OFFSET  STA *ITCNT ; STORE LO% LDA *SCRADR+1 ; GET HI0 ADC #0 ; ADD CARRY TOO!5 STA *ITCNT+1 ; STUFF HI@;E;**************************P;* GET AREA OF MEMORY TO *U;* TEST... *;**************************e;pTEST_RANGEu LDA #7 ; START AT PG 7 STA *START_PAGE ; STORE LDA MEMHI+1 ; GET HI PG SEC SBC #1 ; SUBTRACT 1 PAGE STA *END_PAGE ;STORE IT;;****************;* SET LOOP CNT * ;****************%;0OUTER_LOOP5 LDA #9 ; 9 TIMES THRU@ STA *TOTAL_CNT ; STUFFE LDA #16 ; LOAD START CNT ASCIIP STA *ASCICNT ; STORE ITU IFE CASS_FLG RTS ; END OF INIT SEGMENTe *** ; END CONDITIONALp;u;*********************************;;PROG_START LDA #0 ; ZERO TO A TAY ; SAVE INY STA *TOGGLE ; CLR TOGGLE STA *TESNUM ; AND TESNUM STA *TSTPTR ; ZAP LO PG PTR MAIN_LOOP% STA *TOGGLE ; MEM FILL/TST VAL0 LDX #2 ; LOAD TEST LOOP COUNT5 STX *TESNUM ; AND STORE IT@PASS_LOOPE LDA *START_PAGE ; GET STRT PG# OF AREAP STA *TSTPTR+1 ; STORE IN POINTERU LDX *END_PAGE ; GET END PAGE OF TEST AREA LDA *TOGGLE ; LOAD VALUEe EOR #$FF ; MAKE CURENT TST VALp STA *TEST_VAL ; AND STORE ITuWRITE_VAL STA (TSTPTR),Y ; WRITE VAL INTO TEST AREA INY ; INC LO PAGE COUNT BNE WRITE_VAL ; DO THIS WHOLE PG INC *TSTPTR+1 ; INC NEXT PAGE CPX *TSTPTR+1 ; DONE WITH TST AREA? BCS WRITE_VAL ; GO BACK IF NOT> END ; ;******************************** ;* 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 PTRU LDA *START_PAGE ; RESET TEST AREA STA *TSTPTR+1 ; POINTERe ZERO_FILL LDA *TOGGLE ; GET TOGGLE VALp DOIT DEX ; DEC TEST COUNTu BPL BYPASS ; IF POSITIVE BRANCH LDX #2 ; ELSE STORE ODD VAL STA (TSTPTR),Y ; SO STUFF IT BYPASS INY ; INC LO PNTR THIS PG BNE DOIT ; DO ENTIRE PAGE INC *TSTPTR+1 ; AND INC TO NXT PG LDA *END_PAGE ; GET END PG VAL CMP *TSTPTR+1 ; WE DONE? BCS ZERO_FILL ; IF NO..PLEASE CONTINUE ;%;0;*******************************5;* AT THIS POINT THE TEST AREA *@;* IS SET UP..NOW TEST IT.... *E;*******************************P;U LDA *START_PAGE ; RESET PG0 POINTER STA *TSTPTR+1 ; TO START OF TST AREAe LDX *TESNUM ; LOAD ODD BYTE PNTRpTEST_RAMu LDA *TEST_VAL ; LOAD TESTING VAL DEX ; DEC PNTR OF ODD VAL BPL BYPASS2 ; IF <> ODD CK TEST VAL LDX #2 ; ELSE RESET COUNTER LDA *TOGGLE ; AND CK ODD VALBYPASS2 CMP (TSTPTR),Y ; THIS LOCATION MATCH? BNE NOGO ; NOPE!!!BOO BOO!!ӥ INY ; YES..INC POINTER LO BNE TEST_RAM ; AND DO WHOLE PAGE INC *TSTPTR+1 ; INC PAGE HI% LDA *END_PAGE ; LOAD ENDING PAGE0 CMP *TSTPTR+1 ; WE DONE?5 BCS TEST_RAM ; NO..FINISH THIS PG@;E;********************************P;* THIS PASS WAS OK..FLIP THE *U;* VALUES AND DO IT AGAIN SAM *;********************************e;p DEC *TESNUM ; DEC TEST NUMBERu BPL PASS_LOOP ; IF >=0 GO BACK LDA *TOGGLE ; GET OUR TOGGLE EOR #$FF ; FLIP ITӥ BMI MAIN_LOOP ; RPT IF VAL IN A=$FF DEC *TOTAL_CNT ; DEC # OF TESTS CNT BPL NEXT_TEST ; DO TEST 9 TIMES JMP PROG_END ; THEN WE DONE;;******************************** ;* COME HERE IF MEMORY ERROR *%;********************************0;5NOGO STY *TSTPTR ; STORE LSB ERROR ADDR@ JSR CONVERT ; CONVERT TO HEXE STA TVALAD+1 ; STORE LOP LDA *HIHEX ; GET HI HEXU STA TVALAD ; STORE HI TST VAL LDY #NULL ; ZAP Ye LDA (TSTPTR),Y ; GET ACTUAL VALUEp JSR CONVERT ; CONVERT IT TO HEXu STA AVALAD+1 ; STUFF LO LDA *HIHEX ; GET HI HEX STA AVALAD ; STUF IT LDA *TSTPTR ; GET LSB ADDR OF FAILED MEM JSR CONVERT ; CONVERT IT STA ERRAD+3 ; STORE LO HEX MSB LDA *HIHEX ; GET *HIHEX LSBӜ STA ERRAD+2 ; STUFF LDA *TSTPTR+1 ; GET MSB ADDR OF MEM FAIL JSR CONVERT ; TO HEX% STA ERRAD+1 ; STUFF LO MSB0 LDA *HIHEX ; GET HI MSB5 STA ERRAD ; STUFF@ LDY #H,ERRMSG ; GET MSG ADDRE LDX #L,ERRMSG ; HI/LOP JSR WRITE_MSG ; DISPLAY ITUPROG_END LDY #H,END_MSG ; LOAD END LDX #L,END_MSGe JSR WRITE_MSG ; WRITE ITpDONE JMP DONE ; INFINITE LOOPu;;** COME HERE TO INC ITERATION **;** COUNT AND RESET FOR NXT TST**Ӝ;NEXT_TEST LDY #0 INC *ASCICNT ; INC CNTR LDA *ASCICNT ; LOAD VAL STA (ITCNT),Y ; STUFF IT JMP PROG_START ;!;%;**********************0;* BIN TO HEX CONVERT *5;**********************@;ECONVERT PHA ; SAVE AP LSR AU LSR A LSR Ae LSR Ap JSR CONASC ; CONVERTu STA *HIHEX PLA JSR CONASC STA *LOHEX RTS ; RETURN;;********************;* ACTUAL HEX CON *;******************** ;%CONASC AND #$0F0 CMP #$0A5 BMI LT9@ ADC #6ELT9 ADC #$30P RTS ; RETURNU;************************;* MESSAGE AREA FOLLOWS *e;************************p;uTITLE1 .BY CLS TAB ' ATARI MEMORY TEST' TAB TAB .BY TAB TAB ' by AWM ANALOG #11' TAB TAB CR .BY TAB TAB TAB TAB TAB TAB TAB TAB TAB TAB CR;TITLE2 .BY TAB TAB TAB 'ITERATIONS' TAB TAB .BY TAB TAB TAB SPACE SPACE SPACE SPACE .BY SPACE '0' CR ERRMSG .BY 'ERROR @->$'%ERRAD .BY 'XXXX' SPACE 'TVAL->$'0TVALAD .BY 'XX' SPACE 'AVAL->$'5AVALAD .BY 'XX' CR@;EEND_MSGP .BY TAB TAB 'TEST DONE' CRULAST_INS .EN