;------------------------------------------------------------------------
;
;  DICE.ASM
;
;  Author: San Bergmans
;          www.sbprojects.com
;
;  Created for the 6802 Nano Computer at 29-8-1993
;
;  Demonstration program, rolling two dice
;
;------------------------------------------------------------------------

             .CR    6800                Select cross overlay
             .OR    $F000
             .TF    DICE.HEX,INT        Specify target file

;------------------------------------------------------------------------
;  Declaration of constants
;------------------------------------------------------------------------

DIE1            .EQ     $0000           Roll of die 1
DIE1_FLAG       .EQ     $0001           Die 1 rolling if <> 0
WALK_PAT1       .EQ     $0003           Walking pattern for die 1
DIE2            .EQ     $0004           Roll of die 2
DIE2_FLAG       .EQ     $0005           Die 2 rolling if <> 0
WALK_PAT2       .EQ     $0006           Walking pattern for die 2
WALK            .EQ     $0007,$0008     Walk delay counter
POINTER         .EQ     $0009,$000A     Pointer to retreive LED pattern

PIA_A           .EQ     $0080           Pia data register A (die 1)
PIA_B           .EQ     $0081           Pia data register B (die 2)
CON_A           .EQ     $0082           Pia control register A
CON_B           .EQ     $0083           Pia control register B

WALK_DELAY      .EQ     500             Delay time reload value

;------------------------------------------------------------------------
;  Reset and initialisation
;------------------------------------------------------------------------

RESET           LDS     #$007F          Reset stack pointer
                LDAA    #%0000.0100     Initialise PIA ports
                STAA    CON_A
                STAA    CON_B
                LDAA    #%0111.1111     b0..b6 are outputs b7 is input
                STAA    PIA_A            for both PIA ports
                STAA    PIA_B
                CLRB
                STAB    CON_A
                STAB    CON_B
                STAA    PIA_A
                STAA    PIA_B
                LDAA    #%0000.0100     Select data registers again
                STAA    CON_A
                STAA    CON_B
                LDX     #WALK_DELAY     Setup walk delay time
                STX     WALK

                STAB    DIE1            Initialise dice
                STAB    DIE1_FLAG
                STAB    DIE2
                STAB    DIE2_FLAG
                LDAA    #%0000.0010     Initialise walking light pattern
                STAA    WALK_PAT1
                LDAA    #%0100.0000
                STAA    WALK_PAT2

;------------------------------------------------------------------------
;  Main program loop
;------------------------------------------------------------------------

MAIN            BSR     SHOW_DICE       Show both dice on LEDs
                CLRB                    In case push button A not down
                LDAA    PIA_A           See if push button A is down
                BMI     .A_NOT_DOWN     It's not down!
                DEC     DIE1            Decrement die counter
                BPL     .DIE1_OK        Die is within 5..0!
                LDAA    #5              Restart die counter
                STAA    DIE1
.DIE1_OK        LDAB    #-1             Indicate push button A is down

.A_NOT_DOWN     STAB    DIE1_FLAG       Indicate push button A state
                CLRB                    In case push button B not down
                LDAA    PIA_B           See if push button B is down
                BMI     .B_NOT_DOWN     It's not down!
                DEC     DIE2            Decrement die counter
                BPL     .DIE2_OK        Die is within 5..0!
                LDAA    #11             Restart die counter (rolls at
                STAA    DIE2             half the speed of die 1)
.DIE2_OK        LDAB    #-1             Indicate push button B is down
.B_NOT_DOWN     STAB    DIE2_FLAG       Indicate push button B state
                BRA     MAIN            Return to main routine

;------------------------------------------------------------------------
;  Show both dice on the LEDs
;------------------------------------------------------------------------

SHOW_DICE       LDX     WALK            Decrement walking light counter
                DEX
                BNE     .NO_WRAP        No wrap around is needed!
                LDX     #WALK_DELAY     Restart counter

                LDAA    WALK_PAT1       Increment walking pattern
                ASLA                     for die 1
                BPL     .WALK_OK1       Not beyond LED 6!
                LDAA    #%0000.0010     Restart walking pattern
.WALK_OK1       STAA    WALK_PAT1

                LDAA    WALK_PAT2       Increment walking pattern for
                LSRA                     die 2 (the other way around)
                BITA    #%0000.0001     Not before LED 1?
                BEQ     .WALK_OK2       No! O.K.
                LDAA    #%0100.0000     Restart at LED 6 again
.WALK_OK2       STAA    WALK_PAT2

.NO_WRAP        STX     WALK
                LDAA    DIE1_FLAG       Is die 1 rolling?
                BNE     .DIE1_ROLL      Yes!
                LDAA    DIE1            Get die pattern from table
                BSR     GET_PATTERN
                STAA    PIA_A            and show it
                BRA     .DIE2           Handle die 2 now!
.DIE1_ROLL      LDAA    WALK_PAT1       Just display walking pattern
                COMA
                STAA    PIA_A

.DIE2           LDAA    DIE2_FLAG       Is die 2 rolling?
                BNE     .DIE2_ROLL      Yes!
                LDAA    DIE2            Get die pattern from table
                LSRA                    (Die 2 rolls slower!)
                BSR     GET_PATTERN
                STAA    PIA_B            and show it
                RTS
.DIE2_ROLL      LDAA    WALK_PAT2       Just display walking pattern
                COMA
                STAA    PIA_B
                RTS

;------------------------------------------------------------------------
;  Get LED pattern from pattern table
;------------------------------------------------------------------------

GET_PATTERN     ADDA    #DIE_PAT        Add die roll to base address of
                STAA    POINTER+1        the pattern table
                LDAA    /DIE_PAT
                STAA    POINTER
                LDX     POINTER         Then use it as index
                LDAA    0,X              to get the actual pattern
                RTS

DIE_PAT         .DA     #%1111.1110     1            6     1
                .DA     #%1110.1101     2
                .DA     #%1110.1100     3            5  0  2
                .DA     #%1010.0101     4
                .DA     #%1010.0100     5            4     3
                .DA     #%1000.0001     6

;------------------------------------------------------------------------
;  Interrupt and reset vectors
;------------------------------------------------------------------------

                .NO     $FFF8,$FF
                .DA     RESET           IRQ (Not used)
                .DA     RESET           SWI (Not used)
                .DA     RESET           NMI (Not used)
                .DA     RESET           Reset

                .LI     OFF
