       opt    b,c,f,w,x
       nam    Microware promblower firmware
       spc    2
*
* EIA Baud rate constant - Must be >=600 and <=9600
*
       spc
baud   equ    9600
       spc    2
etx    equ    $03
eot    equ    $04
nl     equ    $0A
       spc    2
       org    0
fnkey7 equ    *
       org    $71
stack  rmb    1
savex  rmb    1
savexl rmb    1
inbufh rmb    1
inbufl rmb    1
digcnt rmb    1
arbase rmb    1
lookfn rmb    1
ldadd  rmb    1
ldaddl rmb    1
rmbase rmb    1
conimg rmb    1
romtyp rmb    1
bytect rmb    1
bitcnt rmb    1
       spc    5
steram equ    $2000
endram equ    $3000
colenb equ    $4000
romadr equ    $6000
romacr equ    $6001
romddr equ    $6002
romdcr equ    $6003
romadh equ    $8000
powcon equ    $A000
displr equ    $C000
dispmr equ    $C800
disphr equ    $D000
outprt equ    $D800
inport equ    $E000
       org    $FC00
fntabl fdb    fnkey0      Clear RAM
       fdb    fnkey1      Preset RAM
       fdb    fnkey2      Copy EPROM to RAM
       fdb    fnkey3      Compare EPROM with RAM
       fdb    fnkey4      Test for blank EPROM
       fdb    halt1  
       fdb    halt1  
       fdb    fnkey7      Execute RAM program
       fdb    fnkey8      Program EPROM
       fdb    fnkey9        Fast program 2704/2708/TMS2716
       fdb    fnkeyA      Serial load RAM
       fdb    fnkeyB      Serial send RAM  
       fdb    fnkeyC      Enter RAM program
       fdb    fnkeyD      Serial load program RAM
       fdb    fnkeyE      Enter RAM data
       fdb    fnkeyF      Emulate EPROM
       fdb    halt1  
       fdb    halt1  
keytab fcb    $0A
       fcb    $0B
       fcb    $00
       fcb    $0C
       fcb    $11
       fcb    $02
       fcb    $03
       fcb    $01
       fcb    $0D
       fcb    $10
       fcb    $05
       fcb    $06
       fcb    $04
       fcb    $0E
       fcb    $FF
       fcb    $08
       fcb    $09
       fcb    $07
       fcb    $0F
       fcb    $FF
romtab fcb    $0F      2758
       fcb    $08
       fcb    $34
       fcb    $0F      2716/TMS2516
       fcb    $08
       fcb    $34
       fcb    $01      2732
       fcb    $00
       fcb    $34
       fcb    $0F      2704
       fcb    $0C
       fcb    $3C
       fcb    $0F      2708
       fcb    $0C
       fcb    $3C
       fcb    $0E      TMS2716
       fcb    $00
       fcb    $3C
start  lds    #stack 
       clr a
       sta a  romadh
       sta a  powcon
       sta a  ldaddl
       lda b  #$0B
       sta b  conimg
       sta b  outprt
       bsr    displa
       lda b  #$FF
       sta b  lookfn
       sta b  romadr
       lda a  #$3C
       sta a  romacr
       sta a  romdcr
       lda a  #100
       sta a  bytect
tagain lda a  inport
       lda b  #15
       jsr    wait
       cmp a  inport
       bne    tagain
       and a  #$07
       sta a  romtyp
       and a  #$03
       lda b  #1
sagain asl b  
       dec a  
       bpl    sagain
       add b  #$20
       sta b  ldadd 
       bsr    keyw  
       ldx    #fntabl-2
fscnlp inx    
       inx    
       dec a  
       bpl    fscnlp
       ldx    $00,x
halt1  jmp    $00,x
displx psh a  
       stx    savex
       lda a  savexl
       bsr    displa
       lda a  savex
       com a  
       sta a  disphr
       lda a  conimg
       ora a  #$08
       bra    setcon
displa psh a  
       com a  
       sta a  displr
       ror a  
       ror a  
       ror a  
       ror a  
       sta a  dispmr
       lda a  conimg
       and a  #$F7
setcon sta a  conimg
       sta a  outprt
       pul a  
       rts    
keyw   bsr    tstkey
       bmi    keyw  
       rts    
kclr   psh a  
kclrlp bsr    tstkey
       bpl    kclrlp
       pul a  
       rts    
tstkey psh b  
kagain bsr    getkey
       lda b  #4
       jsr    wait
       psh a
       bsr    getkey
       pul b
       cba
       bne    kagain
       tst a
       pul b
       rts
getkey psh b  
       lda b  #$FD
       and b  conimg
       sta b  outprt
       clr a  
       sta a  colenb
       bsr    fetkey
       beq    nokey 
       asl b  
rowlp  asl b  
       bcs    rowfnd
       add a  #$05
       bra    rowlp 
rowfnd tst b  
       bne    nokey 
       lda b  #$01
collp  sta b  colenb
       cmp b  #$10
       beq    coldon
       psh b  
       bsr    fetkey
       pul b
       beq    gotkey
       inc a  
       asl b  
       bra    collp 
coldon lda b  conimg
       ora b  #$02
       sta b  outprt
       bsr    fetkey
       bne    nokey 
gotkey stx    savex 
       ldx    #keytab-1
kscnlp inx    
       dec a  
       bpl    kscnlp
       lda a  $00,x
       ldx    savex 
       pul b  
       rts    
nokey  lda a  #$FF
       pul b  
       rts    
fetkey lda b  inport
       com b  
       and b  #$78
       rts    
fnkey1 lda b  #$FF
       bra    skfnk0
fnkey0 clr b  
skfnk0 ldx    #steram
fnk0lp sta b  $00,x
       jsr    displx
       inx    
       cpx    #endram
       bne    fnk0lp
       bra    fnkeyE
fnkeyC clr    arbase
       ldx    #fnkey7
       bra    entlp 
fnkeyE lda a  #$20
       sta a  arbase
       ldx    #steram
entlp  lda a  $00,x
       sta a  inbufl
       clr    digcnt
nxtdis jsr    displa
nxtkey jsr    kclr  
       jsr    keyw  
       cmp a  #$11
       beq    entdat
       cmp a  #$10
       beq    entadd
       lda b  digcnt
       bne    shfkey
       sta b  inbufh
       sta b  inbufl
shfkey lda b  #$04
shftlp asl    inbufl
       rol    inbufh
       dec b  
       bne    shftlp
       ora a  inbufl
       sta a  inbufl
       inc    digcnt
       bra    nxtdis
entadd lda b  digcnt
       beq    dspadd
       lda a  inbufh
       and a  #$0F
       add a  arbase
       sta a  inbufh
       ldx    inbufh
dspadd jsr    displx
       jsr    kclr  
       bra    entlp 
entdat lda a  inbufl
       sta a  $00,x
       inx    
       bra    entlp 
fnkeyF lda a  conimg
       and a  #$F6
       sta a  conimg
       sta a  outprt
       wai    
       spc
fnkeyB ldx    #steram
       stx    savex
punlp1 lda b  #16
       sta b  bytect
       ldx    #mtape1
       bsr    pdata
       lda b  #$13
       ldx    #savex
       bsr    pbyte
       bsr    pbyte
       ldx    savex
punlp2 bsr    pbyte
       dec    bytect
       bne    punlp2
       stx    savex
       com b
       psh b
       tsx
       bsr    pbyte
       pul b
       ldx    savex
       cpx    ldadd
       bne    punlp1
       ldx    #mtape2
       bsr    pdata
       jmp    fnkeyE
pbyte  lda a  0,x
       lsr a
       lsr a
       lsr a
       lsr a
       add a  #'0
       bsr    sout
       lda a  0,x
       and a  #$0F
       add a  #'0
       bsr    sout
       add b  0,x
       inx
       rts
pdatal bsr    sout
pdata  lda a  0,x
       inx
       cmp a  #etx
       bne    pdatal
       rts
mtape1 fcb    nl,'S,'1,'1,'3,etx
mtape2 fcb    nl,'S,'9,nl,eot,etx
       spc
cycpbd equ    8160/(baud/100) M/C cycles per bit.
       spc
sout   psh a
       psh b
       com a
       lda b  #10
       sta b  bitcnt
       lda b  conimg
       and b  #$FB
       sta b  conimg
       ora b  #$04
       sta b  outprt
       clc
       rol a
       rol a
       bra    soutls
soutlp psh a
       and a  #$04
       ora a  conimg
       sta a  outprt
       pul a
       ror a
soutls lda b  #(cycpbd-31)/6
soutwt dec b
       bne    soutwt
       dec    bitcnt
       bne    soutlp
       lda b  #(cycpbd-37)/6
soutwl dec b
       bne    soutwl
       pul b
       pul a
       rts
       spc
sin    lda a  inport
       bmi    sin
       lda a  #(cycpbd-48)/12
sinwt1 dec a
       bne    sinwt1
       lda a  inport
       bmi    sin
       psh b
       lda a  #9
       sta a  bitcnt
       bra    sinlps
sinlp  lda b  inport
       rol b
       ror a
sinlps lda b  #(cycpbd-19)/6
sinwt2 dec b
       bne    sinwt2
       dec    bitcnt
       bne    sinlp
       pul b
       rts
       spc
byte   psh a
       bsr    sin
       tab
       asl b
       asl b
       asl b
       asl b
       bsr    sin
       and a  #$0F
       aba
       tab
       pul a
       aba
       rts
fnkeyA bsr    sin
       and a  #$7F
       cmp a  #'S
       bne    fnkeyA
       bsr    sin
       cmp a  #'1
       bne    notdat
       clr a
       bsr    byte
       sub b  #3
       sta b  bytect
       bsr    byte
       sta b  savex
       bsr    byte
       sta b  savexl
       ldx    savex
loadlp bsr    byte
       sta b  0,x
       inx
       dec    bytect
       bne    loadlp
       bsr    byte
       inc a
       bne    error
       bra    fnkeyA
notdat jmp    fnkeyE
       spc
fnkeyD lda a  #$12
       jsr    sout  
       clr a  
       ldx    #fnkey7
prgldl bsr    byte   
       sta b  $00,x
       inx    
       cpx    #$60
       bne    prgldl
       inc a  
       bne    error
       jmp    fnkey7
fnkey4 inc    lookfn
fnkey2 inc    lookfn
fnkey3 ldx    #steram
       clr a
       sta a  romadh
       sta a  rmbase
       lda a  #$FF
       sta a  powcon
       lda a  romtyp
       cmp a  #$02
       bhi    looklp
       lda a  #$34
       sta a  romdcr
looklp bsr    upaddr
       lda a  romddr
       lda b  lookfn
       beq    ldfrom
       bmi    cmprom
       cmp a  #$FF
       bne    error
cmplp  inx    
       cpx    ldadd 
       bne    looklp
       bsr    rstrom
       jmp    fnkeyE
ldfrom sta a  $00,x
       bra    cmplp 
cmprom cmp a  $00,x
       beq    cmplp 
error  bsr    rstrom
errorl jsr    displx
       bsr    wait
       jsr    displa
       bsr    wait
       bra    errorl
upaddr stx    savex 
       lda b  savex 
       add b  rmbase
       sta b  romadh
       lda b  savexl
       sta b  romadr
       jsr    displx
       rts    
rstrom lda b  #$38
       sta b  romacr
       sta b  romdcr
       lda b  #$FF
       sta b  romadr
       clr    romddr
       lda b  #$3C
       sta b  romacr
       sta b  romdcr
       clr b
       sta b  romadh
       sta b  powcon
       rts
wait   psh b
       clr b
waitlp dec b
       bne    waitlp
       pul b
       dec b
       bne    wait
       rts
fnkey9 lda a  #10   Fast blow for 2704/2708/TMS2716
       sta a  bytect
fnkey8 ldx    #romtab-3
       lda a  romtyp
rscnlp inx    
       inx    
       inx    
       dec a  
       bne    rscnlp
       lda a  $00,x
       sta a  powcon
       lda a  $01,x
       sta a  rmbase
       sta a  romadh
       lda a  $02,x
       sta a  romacr
       and a  #$FB
       sta a  romdcr
       lda b  #$FF
       sta b  romddr
       ora a  #$04
       sta a  romdcr
bagain ldx    #steram
blowlp bsr    upaddr
       lda b  $00,x
       sta b  romddr
       lda a  romtyp
       bit a  #$04
       bne    sloblw
       com b  
       beq    noblow
       cmp a  #$03
       beq    morpow
       lda a  #$01
       sta a  powcon
       lda a  #$0F
       bra    applse
morpow lda a  #$0F
       sta a  powcon
       lda a  #$01
applse lda b  #33
       bsr    wait
       sta a  powcon
       lda a  #$A7
blwtl1 dec a  
       bne    blwtl1
noblow inx    
       cpx    ldadd 
       bne    blowlp
       bra    blown 
sloblw lda a  #$34
       sta a  romacr
       sta a  romdcr
       lda a  #$88     was $50
blwtl2 dec a  
       bne    blwtl2
       lda a  #$3C
       sta a  romdcr
       sta a  romacr
       inx    
       cpx    ldadd 
       bne    blowlp
       dec    bytect
       bne    bagain
blown  jsr    rstrom
       jmp    fnkey3
       org    $FFFE
       fdb    start 
       end
