       opt    c,f,w,x
       nam    Open Day Flasher
       spc    4
************************************************
*                                              *
*      I/O register addresses                  *
*                                              *
************************************************
dra    equ    $4000    PIA port A data
cra    equ    $4001    PIA port A control
drb    equ    $4002    PIA port B data
crb    equ    $4003    PIA port B control
cr13   equ    $8000    PTM Channel 1/3 control
cr2    equ    $8001    PTM Status/Chan 2 Control
tc1h   equ    $8002    PTM Channel 1 counter
tc1l   equ    $8003
tc2h   equ    $8004    PTM Channel 2 counter
tc2l   equ    $8005
tc3h   equ    $8006    PTM Channel 3 counter
tc3l   equ    $8007
       spc
************************************************
*                                              *
*      Static Variables                        *
*                                              *
************************************************
       org    0
psel   rmb    1
plen   rmb    1
ptim   rmb    1
pptr   rmb    2
key    rmb    1
tc     rmb    1
sem    rmb    1
presp  rmb    2
prespt rmb    2
ppptr  rmb    2
patno  rmb    1
       spc
************************************************
*                                              *
*      Interrupt vectors                       *
*                                              *
************************************************
       org    $FFF8
       fdb    timout   Maskable
       fdb    start    Software
       fdb    start    Non-maskable
       fdb    start    Reset
       page
************************************************
*                                              *
*      Start of program                        *
*                                              *
************************************************
       org    $FC00
start  lds    #$7F     Initialise stack pointer
       spc
************************************************
*                                              *
*      Initialise PIA                          *
*                                              *
************************************************
       clr a           Access both Data
       sta a  cra      Direction regs
       sta a  crb
       sta a  sem
       lda a  #$FF     Set all bits to output
       sta a  dra
       lda a  #$3F     Bits 0-5 out, 6,7 in
       sta a  drb
       lda a  #%100    Access data regs
       sta a  cra
       sta a  crb
       spc    2
************************************************
*                                              *
*      Initialise Counter and Display buffer   *
*                                              *
************************************************
       ldx    #pat1    Load pptr with start
       stx    presp
       stx    prespt
       inx
       inx
       stx    pptr     of display buffer
       lda a  #$01
       sta a  psel
       lda a  pat1
       sta a  plen
       lda a  pat1+1
       sta a  ptim
       ldx    #ptab
       stx    ppptr
       lda a  #nopats
       sta a  patno
       lda a  #10
       sta a  tc
       lda a  #$7F
       clr b
       spc
************************************************
*                                              *
*      Initialise PTM (channel 3)              *
*                                              *
************************************************
       lda a  #1
       sta a  cr2      Access control reg 1
       sta a  cr13     Reset all counters
       sta b  cr2      Access control reg 3
       ldx    #124     Load counter 3 with
       stx    tc3h     1 ms time constant
       lda a  #$43     Load control reg 3 for
       sta a  cr13     continuous, internal
*                      prescaled by 8
       lda a  #1
       sta a  cr2      Access control reg 1
       sta b  cr13     Enable counters
       cli
       spc
mloop1 lda a  #5
       sta a  key
wloop1 tst    sem
       ble    wloop1
       dec    sem
       lda a  drb
       bit a  #%01000000
       bne    mloop1
       dec    key
       bne    wloop1
       ldx    ppptr
       inx
       inx
       lda a  patno
       dec a
       bne    notcyc
       ldx    #ptab
       lda a  #nopats
notcyc sta a  patno
       stx    ppptr
       ldx    0,x
       stx    prespt
mloop2 lda a  #5
       sta a  key
wloop2 tst    sem
       ble    wloop2
       dec    sem
       lda a  drb
       bit a  #%01000000
       beq    mloop2
       dec    key
       bne    wloop2
       jmp    mloop1
       page
************************************************
*                                              *
*      PTM timeout interrupt handler           *
*                                              *
************************************************
       spc    2
************************************************
*                                              *
*      refresh display                         *
*                                              *
************************************************
timout lda a  cr2      Read PTM status
       ldx    tc3h     Read counter to clear
*                      interrupts
       lda a  psel     Load digit select mask
       ldx    pptr     Load display digit ptr
       clr b           Turn off current digit
       sta b  drb      (avoids ghosting)
       lda b  0,x      Send new digit pattern
       com b
       sta b  dra
       sta a  drb      Select digit displayed
       inx             Set up for next digit
       lsl a
       bit a  #$10     Check for end of buffer
       beq    norst
       lda a  #$01
norst  sta a  psel
       lda a  plen
       dec a
       bne    notend
       ldx    presp
       lda a  ptim
       dec a
       bne    notnxt
       lda a  0,x
       add a  #2
       add a  presp+1
       sta a  presp+1
       lda a  #0
       adc a  presp
       sta a  presp
       ldx    presp
       lda a  0,x
       bne    notrep
       ldx    prespt
       stx    presp
notrep lda a  1,x
notnxt sta a  ptim
       lda a  0,x
       inx
       inx
notend sta a  plen
       stx    pptr
dectim lda a  tc
       dec a
       bne    notswt
       inc    sem
       lda a  #10
notswt sta a  tc
       rti
       page
ptab   fdb   pat1
       fdb   pat2
       fdb   pat3
       fdb   pat4
nopats equ   (*-ptab)/2
       spc   5
pat1      fcb   16,10
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %010010
          fcb   %001001
          fcb   %101101
          fcb   %110110
          fcb   %010010
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %010010
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %010010
          spc   1
          fcb   16,10
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %011011
          fcb   %001001
          fcb   %100100
          fcb   %110110
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          spc   1
          fcb   16,10
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %100100
          fcb   %010010
          fcb   %011011
          fcb   %101101
          fcb   %100100
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %100100
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %100100
          spc   1
          fcb   16,10
          fcb   %000000
          fcb   %010010
          fcb   %001001
          fcb   %000000
          fcb   %110110
          fcb   %010010
          fcb   %001001
          fcb   %101101
          fcb   %000000
          fcb   %010010
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %010010
          fcb   %001001
          fcb   %000000
          spc   1
          fcb   16,10
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %110110
          fcb   %011011
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          spc   1
          fcb   16,10
          fcb   %000000
          fcb   %100100
          fcb   %010010
          fcb   %000000
          fcb   %101101
          fcb   %100100
          fcb   %010010
          fcb   %011011
          fcb   %000000
          fcb   %100100
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %100100
          fcb   %010010
          fcb   %000000
          spc   1
          fcb   0
          spc   2
pat2      fcb   16,10
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %100100
          fcb   %001001
          fcb   %101101
          fcb   %101101
          fcb   %100100
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %100100
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %100100
          spc   1
          fcb   16,10
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %011011
          fcb   %001001
          fcb   %100100
          fcb   %110110
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          spc   1
          fcb   16,10
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %010010
          fcb   %010010
          fcb   %011011
          fcb   %110110
          fcb   %010010
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %010010
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %010010
          spc   1
          fcb   16,10
          fcb   %000000
          fcb   %010010
          fcb   %010010
          fcb   %000000
          fcb   %110110
          fcb   %010010
          fcb   %010010
          fcb   %011011
          fcb   %000000
          fcb   %010010
          fcb   %010010
          fcb   %000000
          fcb   %000000
          fcb   %010010
          fcb   %010010
          fcb   %000000
          spc   1
          fcb   16,10
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %110110
          fcb   %011011
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          fcb   %100100
          fcb   %000000
          fcb   %000000
          fcb   %001001
          spc   1
          fcb   16,10
          fcb   %000000
          fcb   %100100
          fcb   %001001
          fcb   %000000
          fcb   %101101
          fcb   %100100
          fcb   %001001
          fcb   %101101
          fcb   %000000
          fcb   %100100
          fcb   %001001
          fcb   %000000
          fcb   %000000
          fcb   %100100
          fcb   %001001
          fcb   %000000
          spc   1
          fcb   0
          spc
pat3      fcb   4,25
          fcb   %000000
          fcb   %000000
          fcb   %111111
          fcb   %111111
          spc   1
          fcb   4,25
          fcb   %000001
          fcb   %000000
          fcb   %111110
          fcb   %111111
          spc   1
          fcb   4,25
          fcb   %000001
          fcb   %000001
          fcb   %111110
          fcb   %111110
          spc   1
          fcb   4,25
          fcb   %000011
          fcb   %000001
          fcb   %111100
          fcb   %111110
          spc   1
          fcb   4,25
          fcb   %000011
          fcb   %000011
          fcb   %111100
          fcb   %111100
          spc   1
          fcb   4,25
          fcb   %000111
          fcb   %000011
          fcb   %111000
          fcb   %111100
          spc   1
          fcb   4,25
          fcb   %000111
          fcb   %000111
          fcb   %111000
          fcb   %111000
          spc   1
          fcb   4,25
          fcb   %001111
          fcb   %000111
          fcb   %110000
          fcb   %111000
          spc   1
          fcb   4,25
          fcb   %001111
          fcb   %001111
          fcb   %110000
          fcb   %110000
          spc   1
          fcb   4,25
          fcb   %011111
          fcb   %001111
          fcb   %100000
          fcb   %110000
          spc   1
          fcb   4,25
          fcb   %011111
          fcb   %011111
          fcb   %100000
          fcb   %100000
          spc   1
          fcb   4,25
          fcb   %111111
          fcb   %011111
          fcb   %000000
          fcb   %100000
          spc   1
          fcb   4,25
          fcb   %111111
          fcb   %111111
          fcb   %000000
          fcb   %000000
          spc   1
          fcb   4,25
          fcb   %111111
          fcb   %011111
          fcb   %000000
          fcb   %100000
          spc   1
          fcb   4,25
          fcb   %011111
          fcb   %011111
          fcb   %100000
          fcb   %100000
          spc   1
          fcb   4,25
          fcb   %011111
          fcb   %001111
          fcb   %100000
          fcb   %110000
          spc   1
          fcb   4,25
          fcb   %001111
          fcb   %001111
          fcb   %110000
          fcb   %110000
          spc   1
          fcb   4,25
          fcb   %001111
          fcb   %000111
          fcb   %110000
          fcb   %111000
          spc   1
          fcb   4,25
          fcb   %000111
          fcb   %000111
          fcb   %111000
          fcb   %111000
          spc   1
          fcb   4,25
          fcb   %000111
          fcb   %000011
          fcb   %111000
          fcb   %111100
          spc   1
          fcb   4,25
          fcb   %000011
          fcb   %000011
          fcb   %111100
          fcb   %111100
          spc   1
          fcb   4,25
          fcb   %000011
          fcb   %000001
          fcb   %111100
          fcb   %111110
          spc   1
          fcb   4,25
          fcb   %000001
          fcb   %000001
          fcb   %111110
          fcb   %111110
          spc   1
          fcb   4,25
          fcb   %000001
          fcb   %000000
          fcb   %111110
          fcb   %111111
          spc   1
          fcb   0
          spc   2
pat4   fcb   4,25
          fcb   %000000
          fcb   %000000
          fcb   %111111
          fcb   %111111
          spc   1
          fcb   4,25
          fcb   %000001
          fcb   %000000
          fcb   %111110
          fcb   %111111
          spc   1
          fcb   4,25
          fcb   %000001
          fcb   %000001
          fcb   %111110
          fcb   %111110
          spc   1
          fcb   4,25
          fcb   %000011
          fcb   %000001
          fcb   %111100
          fcb   %111110
          spc   1
          fcb   4,25
          fcb   %000011
          fcb   %000011
          fcb   %111100
          fcb   %111100
          spc   1
          fcb   4,25
          fcb   %000111
          fcb   %000011
          fcb   %111000
          fcb   %111100
          spc   1
          fcb   4,25
          fcb   %000111
          fcb   %000111
          fcb   %111000
          fcb   %111000
          spc   1
          fcb   4,25
          fcb   %001111
          fcb   %000111
          fcb   %110000
          fcb   %111000
          spc   1
          fcb   4,25
          fcb   %001111
          fcb   %001111
          fcb   %110000
          fcb   %110000
          spc   1
          fcb   4,25
          fcb   %011111
          fcb   %001111
          fcb   %100000
          fcb   %110000
          spc   1
          fcb   4,25
          fcb   %011111
          fcb   %011111
          fcb   %100000
          fcb   %100000
          spc   1
          fcb   4,25
          fcb   %111111
          fcb   %011111
          fcb   %000000
          fcb   %100000
          spc   1
          fcb   4,25
          fcb   %111111
          fcb   %111111
          fcb   %000000
          fcb   %000000
          spc   1
          fcb   4,25
          fcb   %111110
          fcb   %111111
          fcb   %000001
          fcb   %000000
          spc   1
          fcb   4,25
          fcb   %111110
          fcb   %111110
          fcb   %000001
          fcb   %000001
          spc   1
          fcb   4,25
          fcb   %111100
          fcb   %111110
          fcb   %000011
          fcb   %000001
          spc   1
          fcb   4,25
          fcb   %111100
          fcb   %111100
          fcb   %000011
          fcb   %000011
          spc   1
          fcb   4,25
          fcb   %111000
          fcb   %111100
          fcb   %000111
          fcb   %000011
          spc   1
          fcb   4,25
          fcb   %111000
          fcb   %111000
          fcb   %000111
          fcb   %000111
          spc   1
          fcb   4,25
          fcb   %110000
          fcb   %111000
          fcb   %001111
          fcb   %000111
          spc   1
          fcb   4,25
          fcb   %110000
          fcb   %110000
          fcb   %001111
          fcb   %001111
          spc   1
          fcb   4,25
          fcb   %100000
          fcb   %110000
          fcb   %011111
          fcb   %001111
          spc   1
          fcb   4,25
          fcb   %100000
          fcb   %100000
          fcb   %011111
          fcb   %011111
          spc   1
          fcb   4,25
          fcb   %000000
          fcb   %100000
          fcb   %111111
          fcb   %011111
          spc   1
          fcb   0
          spc   2
       end
