*NAME TMEMTEST        TIME WITH MEMORY TEST PROGRAM
** THIS IS A SAMPLE PROGRAM WHICH WILL TEST THE MEMORY ON A SYM-1.
** AFTER LOADING INTO THE SYM, BEGIN OPERATING AT $0200.
** IT WILL ASK FOR INPUT AND KEEP TRACK OF THE TIME AS IT RUNS.
** WRITTEN BY DALE HOLT, TIJERAS, NM  87059     JANUARY, 1981
*LOCATE $0200
BEGIN   JSR  ACCESS         UN:WRITE:PROTECT
        LDA  $0C            CLEAR SCREEN
        JSR  OUTCHR         
        JSR  BEEP           
        JSR  BEEP           
        JSR  BEEP           
        LDA  'START         LOW ADDRESS
        STA  LNTVEC         INTERRUPT VECTOR
        LDA  "START         HIGH ADDRESS
        STA  HNTVEC         INTERRUPT VECTOR
GETDAY  JSR  CRLF           
        LDA  #0             
        STA  DAYO           
        PRI  MES11          WHICH DAY
        JSR  INCHR          
        AND  $0F            EXTRACT DIGIT FROM ASCII
        LDX  #0             
        SEC                 
        TAY                 
        LDA  #0             
RY      ROL  A              
        PHA                 
        LDA  #3             
        ADC  DAYO           
        STA  DAYO           
        PLA                 
        DEY                 
        BNE  RY             
        STA  DAY            
GETAM   JSR  CRLF           
        PRI  MES9           AM OR PM
        JSR  INCHR          GET ONE CHARACTER
        CMP  @A             
        BEQ  AMSET          
        CMP  @P             
        BEQ  PMSET          
        JMP  GETAM          
AMSET   LDA  $00            
        STA  AMPM           
        JMP  PRINT          
PMSET   LDA  $F0            
        STA  AMPM           
PRINT   JSR  CRLF           
        PRI  MES3           ENTER TIME
GETTIM  JSR  PARM           GET STARTING TIME
        LDA  P1L            GET PARAMETER ONE
        STA  HOURS          STORE IN HOURS
        LDA  P2L            GET PARAMETER TWO
        STA  MINUTE         STORE IN MINUTE
        LDA  P3L            GET PARAMETER THREE
        STA  SECOND         STORE IN SECOND
        JSR  CRLF           PRINT CR,LF
        LDA  $FF            PORT A AS OUTPUT
        STA  DDRA           DDRA
        LDA  $40            SET T1 TO FREE RUN
        STA  ACR            ACR
        LDA  $C0            ENABLE INTERRUPTS
        STA  IER            IER
        LDA  $50            GET DECIMAL 50 000
        STA  T1L:L          STORE IN LOW LATCH
        LDA  $C3            GET REST OF 50 000
        STA  T1L:H          STORE IN HIGH LATCH
        STA  T1C:H          STORE IN HIGH COUNTER
INIT    JMP  WAIT           WAIT FOR INTERRUPT
START   JSR  INTER          GO TO INTERRUPT SUBROUTINE
        RTI                 RETURN TO WAITING
INTER   JSR  SAVER          SAVE ALL REGS
        LDA  IFR            CLEAR INTERRUPT
        STA  IFR            CLEAR INTERRUPT
        INC  TICK           COUNT INTERRUPTS
        LDA  #20            20 TICKS/SEC (BIN MODE ADD)
        CMP  TICK           SET Z=1 IF ZERO
        BEQ  NEXTS          UPDATE THE CLOCK
RETURN  JMP  RESALL         RESTORE ALL REGS & RTS
NEXTS   LDA  #00            GET ZERO
        STA  TICK           SET TICK TO ZERO
        CLC                 CLEAR CARRY
        SED                 SET DECIMAL MODE
        LDA  SECOND         GET SECONDS
        ADC  #01            ADD 1
        STA  SECOND         STORE
        CMP  $60            CHECK FOR 60
        BNE  DISPLA         IF NOT, CHECK DISPLA
        LDA  #00            GET ZERO
        STA  SECOND         CLEAR SECONDS
        LDA  MINUTE         GET MINUTES
        CLC                 FOR ADD
        ADC  #01            ADD 1
        STA  MINUTE         STORE
        CMP  $60            CHECK FOR 60
        BNE  DISPLA         IF NOT, CHECK DISPLA
        LDA  $00            GET ZERO
        STA  MINUTE         CLEAR MINUTES
        CLC                 FOR ADD
        LDA  HOURS          GET HOURS
        ADC  #01            ADD 1
        STA  HOURS          STORE
        CMP  $12            IS IT 12
        BNE  NEXTH          IF NOT,CHECK NEXT
        LDA  AMPM           GET INDICATOR
        EOR  $F0            REVERSE  00=AM  F0=PM
        STA  AMPM           STORE
        BNE  DISPLA         BRANCH IF PM
        CLC                 CLEAR CARRY
        ROL  DAY            INCREMENT DAY
        CLC                 CLEAR CARRY
        CLD                 CLEAR DECIMAL MODE
        LDA  #3             INCREMENT BY 3 PER DAY
        ADC  DAYO           3 * DAY
        STA  DAYO           STORE IT AGAIN
        SED                 SET DECIMAL MODE AGAIN
        LDA  $80            EQUALS DAY 8
        CMP  DAY            COMPARE WITH DAY
        BNE  NEXTH          BRANCH IF NOT SAME
        LDA  #3             
        STA  DAYO           SET TO 3
        LDA  #01            GET A 1
        STA  DAY            STORE
        BNE  DISPLA         BRANCH TO DISPLA
NEXTH   LDA  HOURS          GET HOURS
        CMP  $13            IS IT 13?
        BNE  DISPLA         BRANCH IF NOT
        LDA  #01            GET A 1
        STA  HOURS          SET HOURS TO 1
        BNE  DISPLA         CHECK FOR DISPLA
DISPLA  CLD                 
        JMP  RETURN         RETURN FROM INTERRUPT
** MEMORY TEST PROGRAM
WAIT    LDA  $00            GET ZERO
        STA  ERRCNT         
        STA  ERRCNT+1       
        STA  ERRCNT+2       SET TO ZERO
        STA  CYCLE          
        STA  CYCLE+1        
        STA  CYCLE+2        
        JSR  CRLF           
        PRI  MES1           START AND END 
PARMIN  JSR  PARM           PARM
        LDA  P2H            
        STA  P2HH           
        LDA  P2L            
        STA  P2LL           
        LDA  P3H            
        STA  P3HH           
        LDA  P3L            
        STA  P3LL           
BEEP?   PRC  MES13          
        LDA  $00            
        STA  BEEEP          
        JSR  INCHR          
        CMP  @Y             
        BNE  REPEAT         BRANCH IF NO
        INC  BEEEP          INCREMENT IF YES
REPEAT  JSR  CRLF           
        CLC                 
        JSR  TSTAT          SEE IF BRK KEY DOWN
        BCC  NOPE           
        JSR  BEEP           YES IT IS, SO TELL OPERATOR
BACK    CLC                 
        JSR  TSTAT          
        BCS  BACK           
        JMP  WARM           GO TO MONITOR WHEN RELEASED
NOPE    SED                 INCREMENT CYCLE COUNTER
        CLC                 
        LDA  #1             
        ADC  CYCLE+2        
        STA  CYCLE+2        
        LDA  #0             
        ADC  CYCLE+1        
        STA  CYCLE+1        
        LDA  #0             
        ADC  CYCLE          
        STA  CYCLE          
        CLD                 
        LDA  P2HH           BEGIN HIGH     
        STA  GET+2          
        STA  PUT+2          
        LDA  P2LL           BEGIN LOW        
        STA  PUT+1          
        STA  GET+1          
        LDA  P3HH           END HIGH     
        LDA  P3LL           END LOW
TEST    LDY  $FF            START WITH FF, 256 PATTERNS
        LDA  PUT+1          SAVE AND RESTORE 
        STA  SAVE1+1        ORIGINAL MEM CONTENTS
        STA  SAVE2+1        
        LDA  PUT+2          
        STA  SAVE1+2        
        STA  SAVE2+2        
SAVE1   LDA  $0000          
        STA  SAVE           
        JMP  LUP2           
SAVE    $00 
LUP1    DEY                 
LUP2    TYA                 Y IS THE PATTERN
        STA  MASK           
PUT     STA  $0000          PUT IN MEMORY
GET     LDA  $0000          GET FROM MEMORY
GETN    CMP  MASK           
        BEQ  OK1            
        JMP  ERROR          
OK1     TYA                 
        BNE  LUP1           
INC     CLC                 INCREMENT ADDRESSES
        LDA  GET+1          
        ADC  #1             
        STA  GET+1          
        LDA  GET+2          
        ADC  $00            
        STA  GET+2          
        STA  PUT+2          
        LDA  GET+1          
        STA  PUT+1          
        LDA  SAVE           
SAVE2   STA  $0000          
FINCHK  SEC                 TWO BYTE SUBTRACT
        LDA  P3L            END LOW
        SBC  GET+1          PRESENT LOW
        LDA  P3H            END HIGH
        SBC  GET+2          PRESENT HIGH
        BCC  FIN1           ALL THROUGH
        JMP  TEST           ELSE REPEAT
FIN1    JMP  FINISH         
ERROR   STA  STOR+1         SAVE BAD VALUE
        CMP  GET+2          HIGH BYTE OF ADDRESS?
        BEQ  FURTHR         CHECK FURTHER
        JMP  ERR1           
FURTHR  LDA  GETN           SAVE OP CODE
        STA  RGETN+1        
        LDA  $60            RTS OP CODE
        STA  GETN           
        LDA  $00            TEST WITH ZERO
        JSR  PUT            
        PHA                 
RGETN   LDA  $00            RESTORE OP CODE
        STA  GETN           
        PLA                 
        CMP  GET+2          HIGH BYTE OF ADDRESS
        BEQ  NOMEM          
        JMP  ERR1           
NOMEM   JSR  CRLF           
        PRI  MES2           
        LDA  GET+2          
        JSR  OUTBYT         
        LDA  GET+1          
        JSR  OUTBYT         
        PRI  MES12          TEST ABORTED
        JSR  CRLF           
        LDA  GET+1          
        STA  P3LL           
        LDA  GET+2          
        STA  P3HH           
        JMP  FINISH         
        JMP  OK1            
ERR1    CLC                 INCREMENT ERROR COUNT
        LDA  STOR+1         GET BAD DATA
        SED                 
        LDA  #1             
        ADC  ERRCNT+2       
        STA  ERRCNT+2       
        LDA  #0             
        ADC  ERRCNT+1       
        STA  ERRCNT+1       
        LDA  #0             
        ADC  ERRCNT         
        STA  ERRCNT         
        CLD                 
        JSR  CRLF           
ERRMES  TYA                 
        PHA                 
        PRI  MES6           PRINT ERROR MESSAGE
        LDA  GET+2          
        JSR  OUTBYT         
        LDA  GET+1          
        JSR  OUTBYT         
        PRI  MES4           
        LDA  MASK           
        JSR  OUTBYT         
        JSR  SPACE          
        LDA  @V             
        JSR  OUTCHR         
        JSR  SPACE          
STOR    LDA  $00            MODIFIED BY ERROR
        JSR  OUTBYT         
        PLA                 
        TAY                 
        JMP  OK1            
FINISH  LDA  BEEEP          GET FLAG
        BEQ  QUIET          IF ZERO KEEP QUIET
        JSR  BEEP           IF ONE , MAKE SOUND
QUIET   JSR  CRLF           PRINT FINISH MESSAGE           
        PRI  MES8           PRINT TIME           
        LDA  HOURS          
        JSR  OUTBYT         
        LDA  @:             
        JSR  OUTCHR         
        LDA  MINUTE         
        JSR  OUTBYT         
        LDA  @:             
        JSR  OUTCHR         
        LDA  SECOND         
        JSR  OUTBYT         
        JSR  SPACE          
        LDA  AMPM           
        BEQ  AMPR           
        LDA  @P             
        JSR  OUTCHR         
        JMP  MPR            
AMPR    LDA  @A             
        JSR  OUTCHR         
MPR     LDA  @M             
        JSR  OUTCHR         
        JSR  SPACE          
DAYPR   LDY  DAYO           
        LDA  DAYL,Y         
        JSR  OUTCHR         
        LDA  DAYL-1,Y       
        JSR  OUTCHR         
        LDA  DAYL-2,Y       
        JSR  OUTCHR         
        JSR  CRLF           
        PRI  MES10          'MEMORY '
        LDA  P2HH           START HIGH
        JSR  OUTBYT         
        LDA  P2LL           START LOW
        JSR  OUTBYT         
        LDA  @-             
        JSR  OUTCHR         
        LDA  P3HH           END HIGH
        JSR  OUTBYT         
        LDA  P3LL           END LOW
        JSR  OUTBYT         
        PRI  MES5           PRINT FINISH MESSAGE
        LDA  ERRCNT         
        JSR  OUTBYT         
        LDA  ERRCNT+1       
        JSR  OUTBYT         
        LDA  ERRCNT+2       
        JSR  OUTBYT         
        PRI  MES7           PRINT CYCLE NUMBER
        LDA  CYCLE          
        JSR  OUTBYT         
        LDA  CYCLE+1        
        JSR  OUTBYT         
        LDA  CYCLE+2        
        JSR  OUTBYT         
        JSR  CRLF           
J2      JMP  REPEAT         REPEAT THE TEST
** MESSAGE TEXTS
MES1    @START & END ADDRESSES? @
MES2    @NO MEMORY AT $@
MES3    @ENTER TIME (HH-MM-SS):@
MES4    @' WITH PATTERN @
MES5    @ TESTED.  CUM ERRORS: @
MES6    @ERROR AT '$@
MES7    @ CYCLE #@
MES8    @TIME @
MES9    @AM OR PM (A/P)? @
MES10   @MEMORY @
MES11   @WHICH DAY (1-7)? @
MES12   @.  TEST ABORTED HERE.@
MES13   @DO YOU WISH FOR THE BEEPER TO SOUND FOR EACH PASS (Y/N)? @
** VARIABLES
BEEEP   $00   0=NO, 1=YES
MASK    $00
ERRCNT  $00 00 00
CYCLE   $00 00 00
P2HH    #00
P2LL    #00
P3HH    #00
P3LL    #00
TICK    $00             0:19 
SECOND  $00             0:59
MINUTE  $00             0:59
HOURS   $00             1:12
AMPM    $00             AM=00,PM=F0
DAY     $01             =2^(X-1) WHERE X=DAY OF WEEK
DAYL    @SATFRITHUWEDTUEMONSUN@
DAYO    #0
*END
