Welcome to my personal webpage.     |   home
Matrix code   |   Matrix Schematics
Matrix code
*EE 324 LAB 3B
*NIMA MOSHTAGH & RYAN SWANSON
*SEC 6 GROUP #20
*DATE: 3/19/02

*Table Data Lookup

     ORG     $0000
TEMP0     RMB     $1
TEMP1     RMB     $1
KEYDAT1     RMB     $1
KEYDAT2     RMB     $1
TOGGLE     RMB     $1
RESULT     RMB     $1

TABLE     EQU     *
     FCB     $A     ;A
     FCB     $3     ;3
     FCB     $2     ;2
     FCB     $1     ;1
     FCB     $B     ;B
     FCB     $6     ;6
     FCB      $5     ;5
     FCB     $4     ;4
     FCB     $C     ;C
     FCB     $9     ;9
     FCB     $8     ;8
     FCB     $7     ;7
     FCB     $D     ;D
     FCB     $E     ;#
     FCB     $0     ;0
     FCB     $F     ;*


TABLE2     EQU     $B600
PORTB     EQU     $1004
PORTC     EQU     $1003

COLCT     RMB     $1     ;RESERVE COLUMN COUNTER
************INITIALIZE******************************
     ORG     $0100
     LDAA     #$80     
     STAA     $1026          ;SET PA7 TO OUTPUT
    
    LDAA    #$FF    
    STAA    $1007         ;MAKE PORTC AN OUTPUT
    
    LDAA    #$FF
    STAA    COLCT        ;INITIALIZE COLUMN COUNTER
    CLR    TOGGLE        ;INITIALIZE FIRST ENTRY
    CLR    TEMP0    
    CLR     TEMP1
**************************************************************
**********************MAIN PROGRAM****************************
**************************************************************

START    EQU    *
    JSR    CHGCOL            ;JUMP TO CHANGE COLUMN
    JSR    READKEY            ;JUMP TO READ KEY
    
    LDAA    KEYDAT1            ;CHECK IF KEY IS PRESSED
    CMPA    #$FF            
    BNE    PRESSED            ;IF A IS NOT = $FF, THEN A KEY IS PRESSED
    JSR    GETFORM            ;OTHERWISE DISPLAY THE OLD SHAPE
    BRA    START            ;START OVER AGAIN
    
PRESSED    STAA    KEYDAT2            ;STORE VALUE PRESSED
    JSR    BLDIDX            ;IF KEY IS PRESSED BUILD INDEX AND STORE DATA
    JSR    W5MS            ;JUMP TO 5 MS DELAY
READ    JSR    READKEY        
    LDAA    KEYDAT1    
    CMPA    KEYDAT2            ;COMPARE DATA TO PREVIOUS READ
    BEQ    READ            ;READ AGAIN IF SAME DATA

    JSR    W5MS            ;JUMP TO 5 MS DELAY
    LDAA    TOGGLE            ;CHECK WHICH NUMBER
    BRSET    TOGGLE #$01 SAVE2

SAVE1    LDAB    RESULT            ;GET RESULT
    STAB    TEMP0            ;STORE FIRST NUMBER    
    COMA    
    STAA    TOGGLE            ;TOGGLE TOGGLE
    TBA                ;PUT ASCII CHARACTER INTO A
    BRA    START            ;BRANCH NEXT

SAVE2    LDAB    RESULT            ;GET RESULT
    STAB    TEMP1            ;STORE FIRST NUMBER    
    CLRA    
    STAA    TOGGLE            ;TOGGLE TOGGLE
    BRA    START            ;RETURN TO START

****************************************************************
***********************SUB ROUTINES*****************************
****************************************************************


************************READKEY********************************

READKEY    EQU    *
    LDAB    #$10            ;LOAD INITIAL COLUM
    LDAA    COLCT            ;LOAD COLUMN COUNTER
SHIFT   CMPA    #$0            ;SEE IF SHIFT IS NEEDED
    BEQ    ONCOL            ;IF SHIFT DONE, SET COLUMN HI
    LSLB                ;SHIFT B
    DECA                ;DECREMENT A
    BRA    SHIFT            ;BRANCH BACK TO SHIFT

ONCOL    STAB    $1000            ;SET COLUMN HI IN PORT A

    LDY    #$100A
    LDAA    #$00
    BRSET    0,Y $10 ROW0
    BRSET    0,Y $20 ROW1
    BRSET    0,Y $40 ROW2
    BRSET    0,Y $80 ROW3
    LDAA    #$FF
    STAA    KEYDAT1            ;NO KEY PUSHED
    BRA    EXIT2
ROW3    INCA
ROW2    INCA
ROW1    INCA
ROW0    STAA    KEYDAT1
EXIT2    RTS                ;RETURN SUB ROUTINE

**********************BLDIDX**********************************

BLDIDX    EQU    *
    LDX    #TABLE            ;LOAD X WITH TABLE START
    LDAA    KEYDAT1            ;LOAD A WITH ROW
    LDAB    #$4            ;LOAD B WITH 4
    MUL                ;MULTIPLY A*B    
    ADDB    COLCT            ;ADD COLUMN COUNT TO B
    ABX                ;ADD B TO X FOR LOOKUP
    LDAA    0,X            ;GET ASCII
    STAA    RESULT            ;STORE RESULT
    RTS                ;RETURN

***********************GETFORM*****************************
GETFORM EQU    *
    JSR    COMBINE
    JSR    FINDIT
    LDAA    RESULT
    BEQ    BLANKIT        ;IF RESULT = 0, THEN SHOW BLANK DISPLAY
    BRA    SHOW1        ;OTHERWISE SHOW THE ASCII VALUE.
BLANKIT    LDAA    #$FF        
    STAA    PORTC        ;SET ALL COLUMNS HIGH, THEREFORE ALL LEDS ARE OFF,
    BRA    EXIT5        ;AND THEN EXIT.
SHOW1    JSR    SHOWIT        ;DISPLAY THE SHAPE
EXIT5    RTS

************************ COMBINE *******************
COMBINE    EQU    *
    LDAA    TEMP0
    LSLA            ;LOGICAL SHIFT A (TEMP0)4 TIMES
    LSLA
    LSLA
    LSLA
    ADDA    TEMP1        ;TEMP1 IS HIGHER NIBBLE AND TEMP0 IS LOWER NIBBLE
    CMPA    #$30        ;LOWER LIMIT
    BLO    BLANK
    CMPA    #$5A        ;HIGHER LIMIT
    BHI    BLANK
    BRA    SAVE    
BLANK    CLRA
SAVE    STAA    RESULT        ;RESULT CONTAIN THE ASCII CODE  BETWEEN $30 & $5A OR $00
    RTS

************************** FINDIT ***************************
FINDIT    EQU    *
    LDAB    #$08
    LDAA    RESULT
    BEQ    EXIT3        ;IF RESULT = 0(OUT OF RANGE ENTRY), GET OUT
    LDX    #TABLE2        ;IN NOT, THEN BUILD AN INDEX
    SUBA     #$30
    MUL
    ABX            ;MAKE THE INDEX TO THE TABLE
    CMPA    #$00
    BEQ     EXIT3
    LDAB    #$FF        ;SINCE THE TABLE IS TOO LONG,
    ABX            ;ADD THE OFFSET TO X
    INX            ;GET THE NEXT SET OF DATA IN THE TABLE
EXIT3    RTS
************************* SHOWIT ****************************
SHOWIT    EQU    *
    SEC            ;PUT 1 IN THE CARRY TO GET 1 IN THE ROTATIONS
    LDAA    #$FE        ; %11111110 IN ORDER TO SET THE Nth COLUMN LOW
TOP    STAA    PORTC
    LDAB    0,X        ;GET THE DATA
    STAB    PORTB        ;Nth COLUMN IS ON
    JSR    W5MS
    ROLA            ; ROTATE A TO THE LEFT TO GET THE NEXT COLUMN
    BCC    EXIT4        ; IF CARRY IS = 0, THEN ALL THE COLUMNS ARE ON
    INX            ;IF NOT, GET THE NEXT SET OF DATA FOR NEXT COLUMN
    BRA    TOP        ; AND GO TO TOP TO SHOW THE NEXT COLUMN
EXIT4    RTS

**********************W5MS***********************************
    org    $0018
W5MS    EQU    *
    PSHX
    LDX    #$682            ;LOAD X WITH 682 HEX
LOOP    DEX                ;DECREMENT
    BNE    LOOP            ;KEEP LOOPING UNTIL 0
    PULX
    RTS                ;RETURN
*************************CHGCOL********************************

CHGCOL    EQU    *
    LDAA    #$03            ;LOAD 3 INTO A
    CMPA    COLCT            ;CHECK IF COLUMN COUNT UP TO 3
    BEQ    RESETCC            ;RESET COLUM COUNTER
    INC    COLCT            ;INCREMENT COLUMN COUNTER
    BRA    EXIT            ;BRANCH TO EXIT
RESETCC    CLR    COLCT            ;CLEAR COLUMN COUNTER
EXIT    RTS                ;RETURN FROM SUB ROUTINE