          OPT A+      ; use (PC)-relativ adressing
          OPT O3+     ; use short-word addressing
          OPT O4+     ; use MOVEQ
          OPT O5+     ; use ADDQ / SUBQ

;#####################################################################
;#  BILDSCHIRM-TREIBER FšR ZX-SPECTRUM VIDEO-EMULATION
;#  Nur Mittlere Aufl”sung 640x400 Pixel x 2 Bitplanes
;#####################################################################
;#  Zur Verwendung, das assemblierte Programm in ZXVID.TRB umbenennen
;#  und in den Ordner von SPECCI.DAT kopieren.
;#####################################################################
; 
;---------------------------------------
; Makro fr S/W-Schirm-Transfer
;---------------------------------------
transm1   macro \1,\2
          moveq     #0,d0
          IFEQ \1,0
          move.b    (a3)+,d0            ; Byte vom Spectrum-Screen
          ELSEIF
          move.b    \1-1(a3),d0
          ENDC
          add.w     d0,d0
          add.w     d0,d0
          IFEQ \2,0
          move.w    0(a0,d0.l),(a4)+
          move.w    -2(a4),(a4)+
          ELSEIF
          move.w    0(a0,d0.l),\2-4(a4) ; ST-Werte aus Tabelle
          move.w    \2-4(a4),\2-2(a4)
          ENDC
          endm

transm2   macro \1,\2
          moveq     #0,d0
          IFEQ \1,0
          move.b    (a3)+,d0            ; Byte vom Spectrum-Screen
          ELSEIF
          move.b    \1-1(a3),d0
          ENDC
          add.w     d0,d0
          add.w     d0,d0
          IFEQ \2,0
          move.w    2(a0,d0.l),(a4)+
          move.w    -2(a4),(a4)+
          ELSEIF
          move.w    2(a0,d0.l),\2-4(a4) ; ST-Werte aus Tabelle
          move.w    \2-4(a4),\2-2(a4)
          ENDC
          endm

;---------------------------------------
; Makro fr S/W-Schirm-Transfer Einzel
;---------------------------------------
transf1   macro \1,\2
          moveq     #0,d0
          IFEQ \1,0
          move.b    (a2),d0
          ELSEIF
          move.b    \1(a2),d0
          ENDC
          add.w     d0,d0
          add.w     d0,d0
          IFEQ \2,0
          move.w    0(a0,d0.l),(a1)
          move.w    (a1),2(a1)
          ELSEIF
          move.w    0(a0,d0.l),\2(a1)   ; ST-Werte aus Tabelle
          move.w    \2(a1),\2+2(a1)
          ENDC
          endm

transf2   macro \1,\2
          moveq     #0,d0
          IFEQ \1,0
          move.b    (a2),d0
          ELSEIF
          move.b    \1(a2),d0
          ENDC
          add.w     d0,d0
          add.w     d0,d0
          IFEQ \2,0
          move.w    2(a0,d0.l),(a1)
          move.w    (a1),2(a1)
          ELSEIF
          move.w    2(a0,d0.l),\2(a1)   ; ST-Werte aus Tabelle
          move.w    \2(a1),\2+2(a1)
          ENDC
          endm

xbios     equ       14

clen      equ       256*128*4             ; L„nge Color-Translate-Table
llen      equ       24*4                  ; L„nge Linearisierungs-Tabelle
svmlen    equ       3*4*24                ; L„nge Worktabelle
flen      equ       256                   ; L„nge Flash-Revers-Tabelle


vdrv_hdr  equ       *
          bra.w     v_install             ; Installierung           +0
          ds.l      1                     ; De-Installierung        +4
          ds.l      1                     ; Einzelbyte Attr.        +8
          ds.l      1                     ; Einzelbyte Noattr.      +12
          ds.l      1                     ; BORDER-Darstellung      +16
          ds.l      1                     ; ganzen Schirm aufbauen  +20
          ds.l      1                     ; VBL-Task                +24

v_install:lea       screen,a2
          move.l    a1,(a2)
          lea       flags,a2
          lea       -4(a4),a4             ; 0(a4)=attr_sw, 1(a4)=flash_sw
          move.l    a4,(a2)               ; 2(a4)=fmode
          lea       ctab,a2
          move.l    a0,(a2)+              ; ctab
          adda.l    #clen,a0
          move.l    a0,(a2)+              ; svmtab
          adda.l    #svmlen,a0
          move.l    a0,(a2)+              ; lintab
          adda.l    #llen,a0
          move.l    a0,(a2)               ; ftab
          move.w    #4,-(sp)
          trap      #xbios                ; getrez()
          addq.l    #2,sp
          cmpi.w    #1,d0                 ; Nur mittlere
          beq.s     valres                ; ST-Aufl”sung!
          moveq     #1,d0                 ; 'Aufl”sung nicht untersttzt'
          rts

valres:   lea       v_deinst,a0
          move.l    a0,4(a5)
          lea       video_m1,a0
          move.l    a0,8(a5)
          lea       video_m2,a0
          move.l    a0,12(a5)
          lea       dborder,a0
          move.l    a0,16(a5)
          lea       buildpage,a0
          move.l    a0,20(a5)
          lea       vbltsk,a0
          move.l    a0,24(a5)

          move.l    lintab,a0             ; Linearisierungs-Tabelle
          clr.w     d0                    ; fr ZX-SCREEN
          move.w    #2,d6
iloo4:    move.w    d0,-(sp)
          move.w    #7,d5
iloo3:    move.w    d0,-(sp)
          move.l    screen,a1
          add.w     d0,a1
          move.l    a1,(a0)+
          move.w    (sp)+,d0
          add.w     #32,d0
          dbf       d5,iloo3
          move.w    (sp)+,d0
          add.w     #2048,d0
          dbf       d6,iloo4

          move.l    ctab,a0
          lea       grey_tab,a1
          clr.b     d0                    ; Attribut 0 - 127

iloo11:   clr.b     d6                    ; Pixelwert 0 - 255
          move.b    d0,d5                 ; Attribut in Grauwert umrechnen
          lsr.b     #3,d5
          andi.w    #15,d5                ; d5 = Paper-Color 0..15
          move.b    d0,d4
          andi.w    #7,d4
          btst      #3,d5
          beq.s     ini_15
          bset      #3,d4                 ; d4 = Ink-Color 0..15
ini_15:   lsl.b     #3,d4
          lsl.b     #3,d5
          move.w    0(a1,d4.w),d2         ; d2 = Ink-Grauwert 1.Wort
          move.w    4(a1,d4.w),d3         ; d3 = Ink-Grauwert 2.Wort
          move.w    0(a1,d5.w),d4         ; d4 = Paper-Grauwert 1.Wort
          move.w    4(a1,d5.w),d5         ; d5 = Paper-Grauwert 2.Wort

          swap      d0
iloo10:   movem.l   d2-d6,-(sp)           ; Pixel-Wert ber Graumaske
          moveq     #7,d7                 ; von Byte auf Wort strecken
          clr.w     d0
          moveq     #0,d1
iloo8:    roxr.b    #1,d6
          bcc.s     ini_60                ; Paper-Pixel
          roxr.w    #1,d2                 ; Ink-Pixel
          roxr.w    d0
          roxr.w    #1,d2
          roxr.w    d0
          roxr.w    #1,d3
          roxr.w    d1
          roxr.w    #1,d3
          roxr.w    d1
          dbf       d7,iloo8
          bra.s     ini_65
ini_60:   roxr.w    #1,d4
          roxr.w    d0
          roxr.w    #1,d4
          roxr.w    d0
          roxr.w    #1,d5
          roxr.w    d1
          roxr.w    #1,d5
          roxr.w    d1
          dbf       d7,iloo8
ini_65:   move.w    d0,(a0)+
          move.w    d1,(a0)+
          movem.l   (sp)+,d2-d6
          addq.b    #1,d6                 ; n„chster Pixelwert
          bne.s     iloo10

          swap      d0
          addq.b    #1,d0                 ; n„chstes Attribut
          bpl.s     iloo11

ini_50:   move.w    #2,-(sp)
          trap      #xbios
          addq.l    #2,sp
          lea       stscrn,a0
          move.l    d0,(a0)+
          addi.l    #4*160+16,d0
          move.l    d0,(a0)+

          move.l    svmtab,a0
          move.l    stscrn1,a1
          move.l    screen,a2
          lea       6144(a2),a2
          move.l    lintab,a3
          move.w    #23,d0
iloo20:   move.l    a1,(a0)+
          move.l    a2,(a0)+
          move.l    (a3)+,(a0)+
          lea       160*8(a1),a1
          lea       32(a2),a2
          dbf       d0,iloo20

          move.l    ftab,a0               ; Flash-Tabelle
          clr.b     d0
          move.w    #127,d1
iloo29:   move.b    d0,(a0)+
          addq.b    #1,d0
          dbf       d1,iloo29
          clr.b     d0                    ; Attribut 0 bis 127
iloo30:   move.b    d0,d1
          move.b    d0,d2
          andi.b    #7,d1                 ; d1 = Ink
          lsl.b     #3,d1                 ; in die Paper-Bits schieben
          lsr.b     #3,d2                 ; Paper in
          andi.b    #7,d2                 ; die Ink-Bits schieben
          move.b    d0,d3
          and.b     #64,d3                ; Bright erhalten
          or.b      d1,d3                 ; vertauschtes Paper/Ink
          or.b      d2,d3                 ; zu Attribut formen
          move.b    d3,(a0)+              ; in die Tabelle damit
          addq.b    #1,d0                 ; bis Attribut = 128
          bpl.s     iloo30

          lea       px2st,a0
          clr.w     d0
          move.w    #2,d4
iloo31:   move.w    #7,d3
          move.w    d0,-(sp)
iloo32:   move.w    #7,d2
          move.w    d0,-(sp)
iloo33:   move.w    d0,-(sp)
          moveq     #31,d1
iloo34:   move.w    d0,(a0)+
          addq.w    #4,d0
          dbf       d1,iloo34
iloo35:   move.w    (sp)+,d0
          add.w     #160*8,d0
          dbf       d2,iloo33
          move.w    (sp)+,d0
          add.w     #160,d0
          dbf       d3,iloo32
          move.w    (sp)+,d0
          add.w     #160*8*8,d0
          dbf       d4,iloo31

          lea       px2at,a0
          move.w    #22528,d0
          move.w    #2,d4
iloo41:   move.w    #7,d3
iloo42:   move.w    #7,d2
iloo43:   move.w    #31,d1
iloo44:   move.w    d0,(a0)+
          addq.w    #1,d0
          dbf       d1,iloo44
          dbf       d2,iloo43
          sub.w     #256,d0
          dbf       d3,iloo42
          add.w     #256,d0
          dbf       d4,iloo41

          lea       at2px,a0
          move.w    #16384,d0
          move.w    #2,d2
iloo51:   move.w    #255,d1
iloo52:   move.w    d0,(a0)+
          addq.w    #1,d0
          dbf       d1,iloo52
          add.w     #2048-256,d0
          dbf       d2,iloo51
          moveq     #0,d0
          rts

v_deinst: rts

;---------------------------------------------------------------------
;         Vertical Blank-Task
;
;  Zur Darstellung des Bildschirms w„hrend einer LOAD-Operation
;---------------------------------------------------------------------

vbltsk:   move.l   a0,-(sp)
          lea      vbsem,a0
          subq.w   #1,(a0)
          bmi.s    vb_99
          bsr      vid_line
          add.w    #12,2(a0)
          bsr      vid_line
          add.w    #12,2(a0)
          cmpi.w   #288,2(a0)
          blt.s    vb_99
          clr.w    2(a0)
vb_99:    addq.w   #1,(a0)
          move.l   (sp)+,a0
          rte

;---------------------------------------------------------------------
;         Screenroutinen Medium Res
;
;  Zur Darstellung von Bytes im ZX-Screen am ST-Screen
;
;  d0.b   Pixel/Attribut-Wert
;  d1.l   Offset im ZX-Adressraum
;  a5     Start ZX-Adressraum im ST
;---------------------------------------------------------------------
;
video_m2: cmpi.w   #22528,d1              ; Pixel oder Attribut ?
          bcc.s    vm2_90                 ; -> Attribut ignorieren
          movem.l  d0-d2/a0-a1,-(sp)
          subi.w   #16384,d1              ; Pixeloffset 0 - 6143
          bmi.s    vid_98                 ; ADRESSE IM ROM !
          move.w   d1,d2
          add.w    d1,d1                  ; * 2
          lea      px2st,a0               ; ST-Screenadresse
          move.w   0(a0,d1.l),d1          ; aus Pixel-Offset
          move.l   stscrn1,a0             ; ermitteln
          lea      0(a0,d1.l),a1
          move.l   ctab,a0
          adda.l   #120*1024,a0
          andi.w   #$00ff,d0
          add.w    d0,d0
          add.w    d0,d0
          btst     #8,d2
          beq.s    vm2_40
          move.w   2(a0,d0.w),(a1)
          move.w   (a1)+,(a1)
          movem.l  (sp)+,d0-d2/a0-a1
          rte
vm2_40:   move.w   0(a0,d0.w),(a1)
          move.w   (a1)+,(a1)
          movem.l  (sp)+,d0-d2/a0-a1
          rte

vm2_90:   tst.b    -3(a4)                 ; Spezialfall: attrsw=0, flashsw=1
          bcs      vidm_flsh              ; muž seperat behandelt werden
          rte

vid_98:   movem.l  (sp)+,d0-d2/a0-a1
          move.b   0(a5,d1.l),d0
          rte

vid_99:   movem.l  (sp)+,d0-d4/a0-a2
          move.b   0(a5,d1.l),d0
          rte

video_m1: movem.l  d0-d4/a0-a2,-(sp)
          cmpi.w   #22528,d1              ; Pixel oder Attribut ?
          bcc.s    vidm_att               ; -> Attribut
          subi.w   #16384,d1              ; Pixeloffset 0 - 6143
          bmi.s    vid_99                 ; ADRESSE IM ROM !
;
          move.w   d1,d4
          add.w    d1,d1                  ; * 2
          lea      px2st,a0               ; ST-Screenadresse
          move.w   0(a0,d1.l),d2          ; aus Pixel-Offset
          move.l   stscrn1,a0             ; ermitteln
          lea      0(a0,d2.w),a1
;
          lea      px2at,a0               ; Attribut dieses Pixels
          move.w   0(a0,d1.l),d2
          moveq    #0,d1
          move.b   0(a5,d2.w),d1
;
          bpl.s    vm1_12                 ; Normales Attribut
          tst.b    -2(a4)                 ; Flash-Zyklus?
          beq.s    vm1_10                 ; nein
          move.l   ftab,a0
          move.b   0(a0,d1.l),d1          ; Flash -> Invers
vm1_10:   andi.b   #$7f,d1
vm1_12:   moveq    #10,d3
          lsl.l    d3,d1
          move.l   ctab,a0
          lea      0(a0,d1.l),a0
          move.b   d0,d3
          add.w    d3,d3
          add.w    d3,d3
          btst     #8,d4
          beq.s    vm1_40
          move.w   2(a0,d3.w),(a1)
          move.w   (a1)+,(a1)
          movem.l  (sp)+,d0-d4/a0-a2
          rte
vm1_40:   move.w   0(a0,d3.w),(a1)
          move.w   (a1)+,(a1)
          movem.l  (sp)+,d0-d4/a0-a2
          rte

vidm_att: sub.w    #22528,d1
          add.w    d1,d1                  ; *2
          lea      at2px,a0               ; Attribut -> Pixel
          move.w   0(a0,d1.l),d2          ; ZX-Pixel-Adresse
          lea      0(a5,d2.w),a2          ; Position im ST-Ram
;
          lea      px2st,a0
          subi.w   #16384,d2              ; 0
          add.w    d2,d2
          move.w   0(a0,d2.w),d1
          move.l   stscrn1,a0
          lea      0(a0,d1.w),a1          ; ST-Screenadresse
;
          moveq    #0,d1
          move.b   d0,d1
          bpl.s    vma_12                 ; normales Attribut
          tst.b    -2(a4)                 ; Flash-Zyklus?
          beq.s    vma_10                 ; nein
          move.l   ftab,a0
          move.b   0(a0,d1.l),d1          ; Attribut (Flash -> Invers)
vma_10:   andi.b   #$7f,d1
vma_12:   moveq    #10,d3
          lsl.l    d3,d1
          move.l   ctab,a0
          lea      0(a0,d1.l),a0
          transf1 0,0
          transf2 256,80*2
          transf1 256*2,80*4
          transf2 256*3,80*6
          transf1 256*4,80*8
          transf2 256*5,80*10
          transf1 256*6,80*12
          transf2 256*7,80*14
          movem.l  (sp)+,d0-d4/a0-a2
          rte

vidm_flsh:movem.l  d0-d3/a0-a2,-(sp)
          sub.w    #16384,d1
          add.w    d1,d1                  ; *2
          lea      at2px,a0               ; Attribut -> Pixel Tabelle
          move.w   0(a0,d1.l),d2          ; ZX-Pixel-Adresse
          lea      0(a5,d2.w),a2          ; Position im ST-Ram
;
          lea      px2st,a0
          subi.w   #16384,d2              ; 0
          add.w    d2,d2
          move.w   0(a0,d2.w),d1
          move.l   stscrn1,a0
          lea      0(a0,d1.w),a1          ; ST-Screenadresse
;
          move.l   ctab,a0
          adda.l   #%01111000*1024,a0     ; PAPER 0, INK 7, BRIGHT 1
          tst.b    d0                     ; Flash-Attribut?
          bpl.s    vmf_10                 ; normales Attribut
          tst.b    -2(a4)                 ; Flash-Zyklus?
          beq.s    vmf_10                 ; nein
          suba.l   #(%01111000-%01000111)*1024,a0 ; PAPER 7, INK 0, BRIGHT 1
vmf_10:   equ      *
          transf1 0,0
          transf2 256,80*2
          transf1 256*2,80*4
          transf2 256*3,80*6
          transf1 256*4,80*8
          transf2 256*5,80*10
          transf1 256*6,80*12
          transf2 256*7,80*14
          movem.l  (sp)+,d0-d3/a0-a2
          rte

dborder:  movem.l   a0/d0-d2,-(sp)
          lea       grey_tab,a0           ; Graumuster berechnen
          lsl.w     #3,d0                 ; Eintrag Grauwert fr Farbe d0
          move.l    0(a0,d0.w),d1         ; Grauwert Scan 1
          move.l    4(a0,d0.w),d2         ; Grauwert Scan 2
          move.l    stscrn,a0
          moveq     #3,d0                 ; Obere 4 Doppelzeilen
mc1:      move.l    d1,(a0)+              ; mit Border-Farbe fllen
          move.l    d1,(a0)+              ; 1
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 2
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 3
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 4
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 5
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 6
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 7
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 8
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 9
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 10
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 11
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 12
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 13
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 14
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 15
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 16
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 17
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 18
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 19
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 20
          exg       d1,d2
          dbf       d0,mc1
          move.w    #191,d0               ; Linken und rechten Rand
mc3:      move.l    d1,(a0)               ; mit Borderfarbe fllen
          move.l    d1,4(a0)
          move.l    d1,8(a0)
          move.l    d1,12(a0)
          move.l    d1,160-16(a0)
          move.l    d1,160-12(a0)
          move.l    d1,160-8(a0)
          move.l    d1,160-4(a0)
          exg       d1,d2
          lea       160(a0),a0
          dbf       d0,mc3
          moveq     #3,d0                 ; Untere 4 Doppelzeilen
mc4:      move.l    d1,(a0)+              ; mit Border-Farbe fllen
          move.l    d1,(a0)+              ; 1
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 2
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 3
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 4
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 5
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 6
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 7
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 8
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 9
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 10
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 11
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 12
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 13
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 14
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 15
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 16
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 17
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 18
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 19
          move.l    d1,(a0)+
          move.l    d1,(a0)+              ; 20
          exg       d1,d2
          dbf       d0,mc4
          movem.l   (sp)+,a0/d0-d2
          rts

buildpage:move.l    a0,-(sp)
          lea       pass,a0
          clr.w     (a0)                  ; Index = 0
bp_10:    bsr       vid_line              ; Zeile darstellen
          add.w     #12,(a0)
          cmpi.w    #288,(a0)
          bne.s     bp_10
          move.l    (sp)+,a0
          rts

vid_line: movem.l   d0-d7/a0-a6,-(sp)
          move.l    flags,a5
          move.l    svmtab,a0
          move.w    pass,d0
          move.l    0(a0,d0.w),a4         ; ST-Screen
          move.l    4(a0,d0.w),a6         ; Attributfile
          move.l    8(a0,d0.w),a3         ; Spectrum Pixelzeile
          move.l    ctab,a2
          move.l    ftab,a1
          moveq     #10,d6                ; fr *1024

          moveq     #31,d4                ; 32 Chars (a 8 Scans)
          move.l    ctab,a0
          adda.l    #120*1024,a0
vl_loo:   tst.b     (a5)                  ; attr_sw
          beq.s     vl_noatt
          moveq     #0,d1
          move.b    (a6)+,d1              ; Attribut
          move.b    0(a1,d1.l),d1         ; Flash -> Invers
          lsl.l     d6,d1                 ; * 1024
          lea       0(a2,d1.l),a0         ; Tabelle fr dieses Attribut
vl_noatt: transm1 0,0
          transm2 256,80*2
          transm1 256*2,80*4
          transm2 256*3,80*6
          transm1 256*4,80*8
          transm2 256*5,80*10
          transm1 256*6,80*12
          transm2 256*7,80*14
          dbf       d4,vl_loo
          movem.l   (sp)+,d0-d7/a0-a6
          rts

grey_tab: dc.l      $ffffffff,$ffffffff                ; BLACK   - BRIGHT 0
          dc.l      $aaaaaaaa,$ffffffff                ; BLUE    - BRIGHT 0
          dc.l      $ffffffff,$55555555                ; RED     - BRIGHT 0
          dc.l      $aaaaaaaa,$55555555                ; MAGENTA - BRIGHT 0
          dc.l      $55555555,$aaaaaaaa                ; GREEEN  - BRIGHT 0
          dc.l      $55555555,$ffffffff                ; CYAN    - BRIGHT 0
          dc.l      $ffffffff,$00000000                ; YELLOW  - BRIGHT 0
          dc.l      $11111111,$88888888                ; WHITE   - BRIGHT 0
          dc.l      $ffffffff,$ffffffff                ; BLACK   - BRIGHT 1
          dc.l      $ffffffff,$aaaaaaaa                ; BLUE    - BRIGHT 1
          dc.l      $55555555,$55555555                ; RED     - BRIGHT 1
          dc.l      $55555555,$00000000                ; MAGENTA - BRIGHT 1
          dc.l      $00000000,$55555555                ; GREEN   - BRIGHT 1
          dc.l      $aaaaaaaa,$aaaaaaaa                ; CYAN    - BRIGHT 1
          dc.l      $aaaaaaaa,$00000000                ; YELLOW  - BRIGHT 1
          dc.l      $00000000,$00000000                ; WHITE   - BRIGHT 1

vbsem:    dc.w      0
pass:     dc.w      0

ctab      ds.l      1
svmtab    ds.l      1
lintab    ds.l      1
ftab:     ds.l      1
stscrn:   ds.l      1
stscrn1:  ds.l      1
screen:   ds.l      1
flags:    ds.l      1

at2px:    ds.w      32*24
px2st:    ds.w      6144
px2at:    ds.w      6144
