  hÓ Ó ;***************************************** ;*       ATARI MEMORY TEST PROGRAM       *  ;*       FOR ANALOG COMPUTING # 11       *% ;*            BY TONY MESSINA            *0 ;*****************************************5 ;@ ;**********************E ;*  EQUATES FOR PROG  *P ;**********************U ;* FIRST PG0 LOCATIONS*� ;**********************e ;p TSTPTR     .DE $CD              ; POINTER TO TEST AREAu ITCNT      .DE $CF              ; SCRN ADDR OF ITCNT VAL  ASCICNT    .DE $D1              ; ASCII NUMBER IT CNTê SAVEX      .DE $D2              ; X STORE LOCÓ TOTAL_CNT  .DE $D3              ; # TIMES THRU LOOP CNT TOGGLE     .DE $D4              ; XR LOCATION ¹TESNUM     .DE $D5              ; ODD BYTE CNTê¹START_PAGE .DE $D6              ; STRT PG OF TST AREAÓ¹END_PAGE   .DE $D7              ; END PG OF TST AREA¹TEST_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¹;**********************�¹;e¹PUTCHR    .DE $F6A4  ; CHAR IN A TO SCREENp¹WRITE_MSG  .DE $F385            ; WRITE A LINE TO SCREENu¹MOTCNTL    .DI $D302            ; MOTOR CNTL LOC ¹;ê¹;*********************Ó¹;* END ROM LOCATIONS *¹;********************* ;*   MISC EQUATES    *ê;*********************Ó;CR         .DI $9B              ; CARRIGE RETURN CLS        .DI $7D            ; CLEAR SCREEN%BELL       .DI $FD            ; RING BUZZER0SPACE      .DI $20            ; SPACE CHAR5TAB        .DI $7F            ; TAB CHAR@MEMLO      .DE $02E7            ; LOW START ADDREMEMHI      .DE $02E5            ; HI MEM ADDRPSCRADR     .DE $58            ; PTR TO 1ST SCREEN LOCUCURON     .DE $02F0       ; CURSOR ON/OFF TOGGLE ADDR�NULL      .DI $00 ; NULL BYTEeCASOFF    .DI $3C ; MOTOR OFFpMARLFT    .DE $52 ; LFT MARGIN LOCuDOSINI    .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Œ;pŒSET_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 CURSORêDRAW_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ê;UêDO_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;pTEST_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 * ;****************%;0OUTER_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 ITuWRITE_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 PNTRpÓTEST_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 VAL ¥BYPASS2   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Ê;5ÊNOGO       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 ITUœPROG_END   LDY #H,END_MSG       ; LOAD END�œ          LDX #L,END_MSGeœ          JSR WRITE_MSG ; WRITE ITpœDONE       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;**********************@;ECONVERT   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 #6ELT9       ADC #$30P          RTS ; RETURNU;************************�;* MESSAGE AREA FOLLOWS *e;************************p;uTITLE1            .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->$'0ÆTVALAD    .BY 'XX' SPACE 'AVAL->$'5ÆAVALAD    .BY 'XX' CR@Æ;EÆEND_MSGPÆ           .BY TAB TAB 'TEST  DONE' CRUÆLAST_INS   .EN 