; Driver udostepniajacy adresy rejestrow sprzetowych VBXE i rejestry cienie
; oraz obslugujacy przerwanie IRQ od blittera
; (c) 2015 by Mono/Tristesse


  opt ?+ o+ h+


  icl 'vbxefx.icl'
  icl 'vbxefxs.icl'


IMIRQ = 0

FX_SIZE = $20

VIMIRQ = $216
SETVBLV = $e45c

  org $80
vbxead .ds 2
fxsad .ds 2

  org $2000

  jsr vbxe_discover
  sta vbxead
  stx vbxead+1
  bcs ?novbxe
  adc #IRQ_CONTROL
  sta vbxe_imirq.?irqcontrol
  stx vbxe_imirq.?irqcontrol+1
  sta vbxe_imirq.?irqstatus
  stx vbxe_imirq.?irqstatus+1

  jsr vbxe_required
  bcc ?wrongver
  lda #<vbxe_shadows
  ldx #>vbxe_shadows
  sta fxsad
  stx fxsad+1

  jsr vbxe_init
  
  nop

  jsr vbxe_destroy

?novbxe:
?wrongver:
  rts



vbxe_discover:
  lda #<VBASE_D640
  ldx #>VBASE_D640
  jsr ?detect
  bcc ?ret

  lda #<VBASE_D740
  ldx #>VBASE_D740
  jsr ?detect
  bcc ?ret

  lda #0
  tax
?ret:
  rts

?detect:
  sta _vbxe_write+1
  stx _vbxe_write+2
  jsr vbxe_detect
  lda _vbxe_write+1
  ldx _vbxe_write+2
  rts


; (c) 2009 by KMK/DLT
vbxe_detect:
  ldy #MEMAC_B_CONTROL
  jsr ?clr

?try:
  ldx $4000
  jsr ?chk
  bcc ?ret
  inx
  stx $4000
  jsr ?chk
  dec $4000
?ret:
  rts
?chk:
  lda #$80
  jsr _vbxe_write
  cpx $4000
  seq
  clc
?clr:
  lda #$00
_vbxe_write:
  sta $ffff,y
  rts


vbxe_required:
  ldy #CORE_VERSION
  lda (vbxead),y
  cmp #FX_PROPER_CORE_VERSION
  bne ?notfx
  iny  ;ldy #MINOR_REVISION
  lda (vbxead),y
  cmp #$ff
  beq ?before1_20
  and #$70
  cmp #FX_PROPER_MINOR_REVISION
  bcc ?before1_20
  lda (vbxead),y
  spl
  lsr vbxe_defaults.?vmemhi+2  ;VRAM size with RAMBO memory emulation
  rts

?notfx:
?before1_20:
  clc
  rts


vbxe_init:
  sei
  ldy #FXS_SIZE-1
?loop:
  cpy #2
  bcs ?init
  lda VIMIRQ,y
  sta vbxe_imirq.?jump,y
?init:
  lda vbxe_defaults-VBLIT,y
  cpy #FX_SIZE
  bcs ?shadows
  lda #0
  sta (vbxead),y
?shadows:
  sta vbxe_shadows,y
  dey
  bpl ?loop

  ldy #<vbxe_imirq
  ldx #>vbxe_imirq
;  lda #IMIRQ
  jsr SETVBLV
  cli
  rts

vbxe_destroy:
  sei
  lda #0
  ldy #FX_SIZE-1
?loop:
  sta (vbxead),y
  dey
  bpl ?loop

  ldy vbxe_imirq.?jump
  ldx vbxe_imirq.?jump+1
;  lda #IMIRQ
  jsr SETVBLV
  cli
  rts

vbxe_imirq:
  pha
  lda vbxe_shadows.?irq_control
?irqstatus = *+1
  bit $ffff  ;VBXEBASE+IRQ_STATUS
  bne ?enter
  pla
?jump = *+1
  jmp $ffff
?enter:
?irqcontrol = *+1
  sta $ffff  ;VBXEBASE+IRQ_CONTROL
?vblit = *+1
  jmp (vbxe_shadows.?vblit)

vbxe_plarti:
  pla
  rti

vbxe_defaults:
?vblit .word vbxe_plarti
?vmemlo .long 0
?vmemhi .long VRAM_SIZE-1

vbxe_shadows:
?video_control .ds 1
?xdl_adr .ds 3
?csel .ds 1
?psel .ds 1
?cr .ds 1
?cg .ds 1
?cb .ds 1
?colmask .ds 1
?colclr .ds 1
  .ds 5
?bl_adr .ds 3
?blitter_start .ds 1
?irq_control .ds 1
?p0 .ds 1
?p1 .ds 1
?p2 .ds 1
?p3 .ds 1
  .ds 4
?memac_b_control .ds 1
?memac_control .ds 1
?memac_bank_sel .ds 1

?vblit .ds 2
?vmemlo .ds 3
?vmemhi .ds 3
?len = *-vbxe_shadows



  end
