home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / apps / misc / zx_sp207 / source / midres.s next >
Text File  |  1993-07-18  |  24KB  |  671 lines

  1.           OPT A+      ; use (PC)-relativ adressing
  2.           OPT O3+     ; use short-word addressing
  3.           OPT O4+     ; use MOVEQ
  4.           OPT O5+     ; use ADDQ / SUBQ
  5.  
  6. ;#####################################################################
  7. ;#  BILDSCHIRM-TREIBER FÜR ZX-SPECTRUM VIDEO-EMULATION
  8. ;#  Nur Mittlere Auflösung 640x400 Pixel x 2 Bitplanes
  9. ;#####################################################################
  10. ;#  Zur Verwendung, das assemblierte Programm in ZXVID.TRB umbenennen
  11. ;#  und in den Ordner von SPECCI.DAT kopieren.
  12. ;#####################################################################
  13. ;---------------------------------------
  14. ; Makro für S/W-Schirm-Transfer
  15. ;---------------------------------------
  16. transm1   macro \1,\2
  17.           moveq     #0,d0
  18.           IFEQ \1,0
  19.           move.b    (a3)+,d0            ; Byte vom Spectrum-Screen
  20.           ELSEIF
  21.           move.b    \1-1(a3),d0
  22.           ENDC
  23.           add.w     d0,d0
  24.           add.w     d0,d0
  25.           IFEQ \2,0
  26.           move.w    0(a0,d0.l),(a4)+
  27.           move.w    -2(a4),(a4)+
  28.           ELSEIF
  29.           move.w    0(a0,d0.l),\2-4(a4) ; ST-Werte aus Tabelle
  30.           move.w    \2-4(a4),\2-2(a4)
  31.           ENDC
  32.           endm
  33.  
  34. transm2   macro \1,\2
  35.           moveq     #0,d0
  36.           IFEQ \1,0
  37.           move.b    (a3)+,d0            ; Byte vom Spectrum-Screen
  38.           ELSEIF
  39.           move.b    \1-1(a3),d0
  40.           ENDC
  41.           add.w     d0,d0
  42.           add.w     d0,d0
  43.           IFEQ \2,0
  44.           move.w    2(a0,d0.l),(a4)+
  45.           move.w    -2(a4),(a4)+
  46.           ELSEIF
  47.           move.w    2(a0,d0.l),\2-4(a4) ; ST-Werte aus Tabelle
  48.           move.w    \2-4(a4),\2-2(a4)
  49.           ENDC
  50.           endm
  51.  
  52. ;---------------------------------------
  53. ; Makro für S/W-Schirm-Transfer Einzel
  54. ;---------------------------------------
  55. transf1   macro \1,\2
  56.           moveq     #0,d0
  57.           IFEQ \1,0
  58.           move.b    (a2),d0
  59.           ELSEIF
  60.           move.b    \1(a2),d0
  61.           ENDC
  62.           add.w     d0,d0
  63.           add.w     d0,d0
  64.           IFEQ \2,0
  65.           move.w    0(a0,d0.l),(a1)
  66.           move.w    (a1),2(a1)
  67.           ELSEIF
  68.           move.w    0(a0,d0.l),\2(a1)   ; ST-Werte aus Tabelle
  69.           move.w    \2(a1),\2+2(a1)
  70.           ENDC
  71.           endm
  72.  
  73. transf2   macro \1,\2
  74.           moveq     #0,d0
  75.           IFEQ \1,0
  76.           move.b    (a2),d0
  77.           ELSEIF
  78.           move.b    \1(a2),d0
  79.           ENDC
  80.           add.w     d0,d0
  81.           add.w     d0,d0
  82.           IFEQ \2,0
  83.           move.w    2(a0,d0.l),(a1)
  84.           move.w    (a1),2(a1)
  85.           ELSEIF
  86.           move.w    2(a0,d0.l),\2(a1)   ; ST-Werte aus Tabelle
  87.           move.w    \2(a1),\2+2(a1)
  88.           ENDC
  89.           endm
  90.  
  91. xbios     equ       14
  92.  
  93. clen      equ       256*128*4             ; Länge Color-Translate-Table
  94. llen      equ       24*4                  ; Länge Linearisierungs-Tabelle
  95. svmlen    equ       3*4*24                ; Länge Worktabelle
  96. flen      equ       256                   ; Länge Flash-Revers-Tabelle
  97.  
  98.  
  99. vdrv_hdr  equ       *
  100.           bra.w     v_install             ; Installierung           +0
  101.           ds.l      1                     ; De-Installierung        +4
  102.           ds.l      1                     ; Einzelbyte Attr.        +8
  103.           ds.l      1                     ; Einzelbyte Noattr.      +12
  104.           ds.l      1                     ; BORDER-Darstellung      +16
  105.           ds.l      1                     ; ganzen Schirm aufbauen  +20
  106.           ds.l      1                     ; VBL-Task                +24
  107.  
  108. v_install:lea       screen,a2
  109.           move.l    a1,(a2)
  110.           lea       flags,a2
  111.           lea       -4(a4),a4             ; 0(a4)=attr_sw, 1(a4)=flash_sw
  112.           move.l    a4,(a2)               ; 2(a4)=fmode
  113.           lea       ctab,a2
  114.           move.l    a0,(a2)+              ; ctab
  115.           adda.l    #clen,a0
  116.           move.l    a0,(a2)+              ; svmtab
  117.           adda.l    #svmlen,a0
  118.           move.l    a0,(a2)+              ; lintab
  119.           adda.l    #llen,a0
  120.           move.l    a0,(a2)               ; ftab
  121.           move.w    #4,-(sp)
  122.           trap      #xbios                ; getrez()
  123.           addq.l    #2,sp
  124.           cmpi.w    #1,d0                 ; Nur mittlere
  125.           beq.s     valres                ; ST-Auflösung!
  126.           moveq     #1,d0                 ; 'Auflösung nicht unterstützt'
  127.           rts
  128.  
  129. valres:   lea       v_deinst,a0
  130.           move.l    a0,4(a5)
  131.           lea       video_m1,a0
  132.           move.l    a0,8(a5)
  133.           lea       video_m2,a0
  134.           move.l    a0,12(a5)
  135.           lea       dborder,a0
  136.           move.l    a0,16(a5)
  137.           lea       buildpage,a0
  138.           move.l    a0,20(a5)
  139.           lea       vbltsk,a0
  140.           move.l    a0,24(a5)
  141.  
  142.           move.l    lintab,a0             ; Linearisierungs-Tabelle
  143.           clr.w     d0                    ; für ZX-SCREEN
  144.           move.w    #2,d6
  145. iloo4:    move.w    d0,-(sp)
  146.           move.w    #7,d5
  147. iloo3:    move.w    d0,-(sp)
  148.           move.l    screen,a1
  149.           add.w     d0,a1
  150.           move.l    a1,(a0)+
  151.           move.w    (sp)+,d0
  152.           add.w     #32,d0
  153.           dbf       d5,iloo3
  154.           move.w    (sp)+,d0
  155.           add.w     #2048,d0
  156.           dbf       d6,iloo4
  157.  
  158.           move.l    ctab,a0
  159.           lea       grey_tab,a1
  160.           clr.b     d0                    ; Attribut 0 - 127
  161.  
  162. iloo11:   clr.b     d6                    ; Pixelwert 0 - 255
  163.           move.b    d0,d5                 ; Attribut in Grauwert umrechnen
  164.           lsr.b     #3,d5
  165.           andi.w    #15,d5                ; d5 = Paper-Color 0..15
  166.           move.b    d0,d4
  167.           andi.w    #7,d4
  168.           btst      #3,d5
  169.           beq.s     ini_15
  170.           bset      #3,d4                 ; d4 = Ink-Color 0..15
  171. ini_15:   lsl.b     #3,d4
  172.           lsl.b     #3,d5
  173.           move.w    0(a1,d4.w),d2         ; d2 = Ink-Grauwert 1.Wort
  174.           move.w    4(a1,d4.w),d3         ; d3 = Ink-Grauwert 2.Wort
  175.           move.w    0(a1,d5.w),d4         ; d4 = Paper-Grauwert 1.Wort
  176.           move.w    4(a1,d5.w),d5         ; d5 = Paper-Grauwert 2.Wort
  177.  
  178.           swap      d0
  179. iloo10:   movem.l   d2-d6,-(sp)           ; Pixel-Wert über Graumaske
  180.           moveq     #7,d7                 ; von Byte auf Wort strecken
  181.           clr.w     d0
  182.           moveq     #0,d1
  183. iloo8:    roxr.b    #1,d6
  184.           bcc.s     ini_60                ; Paper-Pixel
  185.           roxr.w    #1,d2                 ; Ink-Pixel
  186.           roxr.w    d0
  187.           roxr.w    #1,d2
  188.           roxr.w    d0
  189.           roxr.w    #1,d3
  190.           roxr.w    d1
  191.           roxr.w    #1,d3
  192.           roxr.w    d1
  193.           dbf       d7,iloo8
  194.           bra.s     ini_65
  195. ini_60:   roxr.w    #1,d4
  196.           roxr.w    d0
  197.           roxr.w    #1,d4
  198.           roxr.w    d0
  199.           roxr.w    #1,d5
  200.           roxr.w    d1
  201.           roxr.w    #1,d5
  202.           roxr.w    d1
  203.           dbf       d7,iloo8
  204. ini_65:   move.w    d0,(a0)+
  205.           move.w    d1,(a0)+
  206.           movem.l   (sp)+,d2-d6
  207.           addq.b    #1,d6                 ; nächster Pixelwert
  208.           bne.s     iloo10
  209.  
  210.           swap      d0
  211.           addq.b    #1,d0                 ; nächstes Attribut
  212.           bpl.s     iloo11
  213.  
  214. ini_50:   move.w    #2,-(sp)
  215.           trap      #xbios
  216.           addq.l    #2,sp
  217.           lea       stscrn,a0
  218.           move.l    d0,(a0)+
  219.           addi.l    #4*160+16,d0
  220.           move.l    d0,(a0)+
  221.  
  222.           move.l    svmtab,a0
  223.           move.l    stscrn1,a1
  224.           move.l    screen,a2
  225.           lea       6144(a2),a2
  226.           move.l    lintab,a3
  227.           move.w    #23,d0
  228. iloo20:   move.l    a1,(a0)+
  229.           move.l    a2,(a0)+
  230.           move.l    (a3)+,(a0)+
  231.           lea       160*8(a1),a1
  232.           lea       32(a2),a2
  233.           dbf       d0,iloo20
  234.  
  235.           move.l    ftab,a0               ; Flash-Tabelle
  236.           clr.b     d0
  237.           move.w    #127,d1
  238. iloo29:   move.b    d0,(a0)+
  239.           addq.b    #1,d0
  240.           dbf       d1,iloo29
  241.           clr.b     d0                    ; Attribut 0 bis 127
  242. iloo30:   move.b    d0,d1
  243.           move.b    d0,d2
  244.           andi.b    #7,d1                 ; d1 = Ink
  245.           lsl.b     #3,d1                 ; in die Paper-Bits schieben
  246.           lsr.b     #3,d2                 ; Paper in
  247.           andi.b    #7,d2                 ; die Ink-Bits schieben
  248.           move.b    d0,d3
  249.           and.b     #64,d3                ; Bright erhalten
  250.           or.b      d1,d3                 ; vertauschtes Paper/Ink
  251.           or.b      d2,d3                 ; zu Attribut formen
  252.           move.b    d3,(a0)+              ; in die Tabelle damit
  253.           addq.b    #1,d0                 ; bis Attribut = 128
  254.           bpl.s     iloo30
  255.  
  256.           lea       px2st,a0
  257.           clr.w     d0
  258.           move.w    #2,d4
  259. iloo31:   move.w    #7,d3
  260.           move.w    d0,-(sp)
  261. iloo32:   move.w    #7,d2
  262.           move.w    d0,-(sp)
  263. iloo33:   move.w    d0,-(sp)
  264.           moveq     #31,d1
  265. iloo34:   move.w    d0,(a0)+
  266.           addq.w    #4,d0
  267.           dbf       d1,iloo34
  268. iloo35:   move.w    (sp)+,d0
  269.           add.w     #160*8,d0
  270.           dbf       d2,iloo33
  271.           move.w    (sp)+,d0
  272.           add.w     #160,d0
  273.           dbf       d3,iloo32
  274.           move.w    (sp)+,d0
  275.           add.w     #160*8*8,d0
  276.           dbf       d4,iloo31
  277.  
  278.           lea       px2at,a0
  279.           move.w    #22528,d0
  280.           move.w    #2,d4
  281. iloo41:   move.w    #7,d3
  282. iloo42:   move.w    #7,d2
  283. iloo43:   move.w    #31,d1
  284. iloo44:   move.w    d0,(a0)+
  285.           addq.w    #1,d0
  286.           dbf       d1,iloo44
  287.           dbf       d2,iloo43
  288.           sub.w     #256,d0
  289.           dbf       d3,iloo42
  290.           add.w     #256,d0
  291.           dbf       d4,iloo41
  292.  
  293.           lea       at2px,a0
  294.           move.w    #16384,d0
  295.           move.w    #2,d2
  296. iloo51:   move.w    #255,d1
  297. iloo52:   move.w    d0,(a0)+
  298.           addq.w    #1,d0
  299.           dbf       d1,iloo52
  300.           add.w     #2048-256,d0
  301.           dbf       d2,iloo51
  302.           moveq     #0,d0
  303.           rts
  304.  
  305. v_deinst: rts
  306.  
  307. ;---------------------------------------------------------------------
  308. ;         Vertical Blank-Task
  309. ;
  310. ;  Zur Darstellung des Bildschirms während einer LOAD-Operation
  311. ;---------------------------------------------------------------------
  312.  
  313. vbltsk:   move.l   a0,-(sp)
  314.           lea      vbsem,a0
  315.           subq.w   #1,(a0)
  316.           bmi.s    vb_99
  317.           bsr      vid_line
  318.           add.w    #12,2(a0)
  319.           bsr      vid_line
  320.           add.w    #12,2(a0)
  321.           cmpi.w   #288,2(a0)
  322.           blt.s    vb_99
  323.           clr.w    2(a0)
  324. vb_99:    addq.w   #1,(a0)
  325.           move.l   (sp)+,a0
  326.           rte
  327.  
  328. ;---------------------------------------------------------------------
  329. ;         Screenroutinen Medium Res
  330. ;
  331. ;  Zur Darstellung von Bytes im ZX-Screen am ST-Screen
  332. ;
  333. ;  d0.b   Pixel/Attribut-Wert
  334. ;  d1.l   Offset im ZX-Adressraum
  335. ;  a5     Start ZX-Adressraum im ST
  336. ;---------------------------------------------------------------------
  337. ;
  338. video_m2: cmpi.w   #22528,d1              ; Pixel oder Attribut ?
  339.           bcc.s    vm2_90                 ; -> Attribut ignorieren
  340.           movem.l  d0-d2/a0-a1,-(sp)
  341.           subi.w   #16384,d1              ; Pixeloffset 0 - 6143
  342.           bmi.s    vid_98                 ; ADRESSE IM ROM !
  343.           move.w   d1,d2
  344.           add.w    d1,d1                  ; * 2
  345.           lea      px2st,a0               ; ST-Screenadresse
  346.           move.w   0(a0,d1.l),d1          ; aus Pixel-Offset
  347.           move.l   stscrn1,a0             ; ermitteln
  348.           lea      0(a0,d1.l),a1
  349.           move.l   ctab,a0
  350.           adda.l   #120*1024,a0
  351.           andi.w   #$00ff,d0
  352.           add.w    d0,d0
  353.           add.w    d0,d0
  354.           btst     #8,d2
  355.           beq.s    vm2_40
  356.           move.w   2(a0,d0.w),(a1)
  357.           move.w   (a1)+,(a1)
  358.           movem.l  (sp)+,d0-d2/a0-a1
  359.           rte
  360. vm2_40:   move.w   0(a0,d0.w),(a1)
  361.           move.w   (a1)+,(a1)
  362.           movem.l  (sp)+,d0-d2/a0-a1
  363.           rte
  364.  
  365. vm2_90:   tst.b    -3(a4)                 ; Spezialfall: attrsw=0, flashsw=1
  366.           bcs      vidm_flsh              ; muß seperat behandelt werden
  367.           rte
  368.  
  369. vid_98:   movem.l  (sp)+,d0-d2/a0-a1
  370.           move.b   0(a5,d1.l),d0
  371.           rte
  372.  
  373. vid_99:   movem.l  (sp)+,d0-d4/a0-a2
  374.           move.b   0(a5,d1.l),d0
  375.           rte
  376.  
  377. video_m1: movem.l  d0-d4/a0-a2,-(sp)
  378.           cmpi.w   #22528,d1              ; Pixel oder Attribut ?
  379.           bcc.s    vidm_att               ; -> Attribut
  380.           subi.w   #16384,d1              ; Pixeloffset 0 - 6143
  381.           bmi.s    vid_99                 ; ADRESSE IM ROM !
  382. ;
  383.           move.w   d1,d4
  384.           add.w    d1,d1                  ; * 2
  385.           lea      px2st,a0               ; ST-Screenadresse
  386.           move.w   0(a0,d1.l),d2          ; aus Pixel-Offset
  387.           move.l   stscrn1,a0             ; ermitteln
  388.           lea      0(a0,d2.w),a1
  389. ;
  390.           lea      px2at,a0               ; Attribut dieses Pixels
  391.           move.w   0(a0,d1.l),d2
  392.           moveq    #0,d1
  393.           move.b   0(a5,d2.w),d1
  394. ;
  395.           bpl.s    vm1_12                 ; Normales Attribut
  396.           tst.b    -2(a4)                 ; Flash-Zyklus?
  397.           beq.s    vm1_10                 ; nein
  398.           move.l   ftab,a0
  399.           move.b   0(a0,d1.l),d1          ; Flash -> Invers
  400. vm1_10:   andi.b   #$7f,d1
  401. vm1_12:   moveq    #10,d3
  402.           lsl.l    d3,d1
  403.           move.l   ctab,a0
  404.           lea      0(a0,d1.l),a0
  405.           move.b   d0,d3
  406.           add.w    d3,d3
  407.           add.w    d3,d3
  408.           btst     #8,d4
  409.           beq.s    vm1_40
  410.           move.w   2(a0,d3.w),(a1)
  411.           move.w   (a1)+,(a1)
  412.           movem.l  (sp)+,d0-d4/a0-a2
  413.           rte
  414. vm1_40:   move.w   0(a0,d3.w),(a1)
  415.           move.w   (a1)+,(a1)
  416.           movem.l  (sp)+,d0-d4/a0-a2
  417.           rte
  418.  
  419. vidm_att: sub.w    #22528,d1
  420.           add.w    d1,d1                  ; *2
  421.           lea      at2px,a0               ; Attribut -> Pixel
  422.           move.w   0(a0,d1.l),d2          ; ZX-Pixel-Adresse
  423.           lea      0(a5,d2.w),a2          ; Position im ST-Ram
  424. ;
  425.           lea      px2st,a0
  426.           subi.w   #16384,d2              ; 0
  427.           add.w    d2,d2
  428.           move.w   0(a0,d2.w),d1
  429.           move.l   stscrn1,a0
  430.           lea      0(a0,d1.w),a1          ; ST-Screenadresse
  431. ;
  432.           moveq    #0,d1
  433.           move.b   d0,d1
  434.           bpl.s    vma_12                 ; normales Attribut
  435.           tst.b    -2(a4)                 ; Flash-Zyklus?
  436.           beq.s    vma_10                 ; nein
  437.           move.l   ftab,a0
  438.           move.b   0(a0,d1.l),d1          ; Attribut (Flash -> Invers)
  439. vma_10:   andi.b   #$7f,d1
  440. vma_12:   moveq    #10,d3
  441.           lsl.l    d3,d1
  442.           move.l   ctab,a0
  443.           lea      0(a0,d1.l),a0
  444.           transf1 0,0
  445.           transf2 256,80*2
  446.           transf1 256*2,80*4
  447.           transf2 256*3,80*6
  448.           transf1 256*4,80*8
  449.           transf2 256*5,80*10
  450.           transf1 256*6,80*12
  451.           transf2 256*7,80*14
  452.           movem.l  (sp)+,d0-d4/a0-a2
  453.           rte
  454.  
  455. vidm_flsh:movem.l  d0-d3/a0-a2,-(sp)
  456.           sub.w    #16384,d1
  457.           add.w    d1,d1                  ; *2
  458.           lea      at2px,a0               ; Attribut -> Pixel Tabelle
  459.           move.w   0(a0,d1.l),d2          ; ZX-Pixel-Adresse
  460.           lea      0(a5,d2.w),a2          ; Position im ST-Ram
  461. ;
  462.           lea      px2st,a0
  463.           subi.w   #16384,d2              ; 0
  464.           add.w    d2,d2
  465.           move.w   0(a0,d2.w),d1
  466.           move.l   stscrn1,a0
  467.           lea      0(a0,d1.w),a1          ; ST-Screenadresse
  468. ;
  469.           move.l   ctab,a0
  470.           adda.l   #%01111000*1024,a0     ; PAPER 0, INK 7, BRIGHT 1
  471.           tst.b    d0                     ; Flash-Attribut?
  472.           bpl.s    vmf_10                 ; normales Attribut
  473.           tst.b    -2(a4)                 ; Flash-Zyklus?
  474.           beq.s    vmf_10                 ; nein
  475.           suba.l   #(%01111000-%01000111)*1024,a0 ; PAPER 7, INK 0, BRIGHT 1
  476. vmf_10:   equ      *
  477.           transf1 0,0
  478.           transf2 256,80*2
  479.           transf1 256*2,80*4
  480.           transf2 256*3,80*6
  481.           transf1 256*4,80*8
  482.           transf2 256*5,80*10
  483.           transf1 256*6,80*12
  484.           transf2 256*7,80*14
  485.           movem.l  (sp)+,d0-d3/a0-a2
  486.           rte
  487.  
  488. dborder:  movem.l   a0/d0-d2,-(sp)
  489.           lea       grey_tab,a0           ; Graumuster berechnen
  490.           lsl.w     #3,d0                 ; Eintrag Grauwert für Farbe d0
  491.           move.l    0(a0,d0.w),d1         ; Grauwert Scan 1
  492.           move.l    4(a0,d0.w),d2         ; Grauwert Scan 2
  493.           move.l    stscrn,a0
  494.           moveq     #3,d0                 ; Obere 4 Doppelzeilen
  495. mc1:      move.l    d1,(a0)+              ; mit Border-Farbe füllen
  496.           move.l    d1,(a0)+              ; 1
  497.           move.l    d1,(a0)+
  498.           move.l    d1,(a0)+              ; 2
  499.           move.l    d1,(a0)+
  500.           move.l    d1,(a0)+              ; 3
  501.           move.l    d1,(a0)+
  502.           move.l    d1,(a0)+              ; 4
  503.           move.l    d1,(a0)+
  504.           move.l    d1,(a0)+              ; 5
  505.           move.l    d1,(a0)+
  506.           move.l    d1,(a0)+              ; 6
  507.           move.l    d1,(a0)+
  508.           move.l    d1,(a0)+              ; 7
  509.           move.l    d1,(a0)+
  510.           move.l    d1,(a0)+              ; 8
  511.           move.l    d1,(a0)+
  512.           move.l    d1,(a0)+              ; 9
  513.           move.l    d1,(a0)+
  514.           move.l    d1,(a0)+              ; 10
  515.           move.l    d1,(a0)+
  516.           move.l    d1,(a0)+              ; 11
  517.           move.l    d1,(a0)+
  518.           move.l    d1,(a0)+              ; 12
  519.           move.l    d1,(a0)+
  520.           move.l    d1,(a0)+              ; 13
  521.           move.l    d1,(a0)+
  522.           move.l    d1,(a0)+              ; 14
  523.           move.l    d1,(a0)+
  524.           move.l    d1,(a0)+              ; 15
  525.           move.l    d1,(a0)+
  526.           move.l    d1,(a0)+              ; 16
  527.           move.l    d1,(a0)+
  528.           move.l    d1,(a0)+              ; 17
  529.           move.l    d1,(a0)+
  530.           move.l    d1,(a0)+              ; 18
  531.           move.l    d1,(a0)+
  532.           move.l    d1,(a0)+              ; 19
  533.           move.l    d1,(a0)+
  534.           move.l    d1,(a0)+              ; 20
  535.           exg       d1,d2
  536.           dbf       d0,mc1
  537.           move.w    #191,d0               ; Linken und rechten Rand
  538. mc3:      move.l    d1,(a0)               ; mit Borderfarbe füllen
  539.           move.l    d1,4(a0)
  540.           move.l    d1,8(a0)
  541.           move.l    d1,12(a0)
  542.           move.l    d1,160-16(a0)
  543.           move.l    d1,160-12(a0)
  544.           move.l    d1,160-8(a0)
  545.           move.l    d1,160-4(a0)
  546.           exg       d1,d2
  547.           lea       160(a0),a0
  548.           dbf       d0,mc3
  549.           moveq     #3,d0                 ; Untere 4 Doppelzeilen
  550. mc4:      move.l    d1,(a0)+              ; mit Border-Farbe füllen
  551.           move.l    d1,(a0)+              ; 1
  552.           move.l    d1,(a0)+
  553.           move.l    d1,(a0)+              ; 2
  554.           move.l    d1,(a0)+
  555.           move.l    d1,(a0)+              ; 3
  556.           move.l    d1,(a0)+
  557.           move.l    d1,(a0)+              ; 4
  558.           move.l    d1,(a0)+
  559.           move.l    d1,(a0)+              ; 5
  560.           move.l    d1,(a0)+
  561.           move.l    d1,(a0)+              ; 6
  562.           move.l    d1,(a0)+
  563.           move.l    d1,(a0)+              ; 7
  564.           move.l    d1,(a0)+
  565.           move.l    d1,(a0)+              ; 8
  566.           move.l    d1,(a0)+
  567.           move.l    d1,(a0)+              ; 9
  568.           move.l    d1,(a0)+
  569.           move.l    d1,(a0)+              ; 10
  570.           move.l    d1,(a0)+
  571.           move.l    d1,(a0)+              ; 11
  572.           move.l    d1,(a0)+
  573.           move.l    d1,(a0)+              ; 12
  574.           move.l    d1,(a0)+
  575.           move.l    d1,(a0)+              ; 13
  576.           move.l    d1,(a0)+
  577.           move.l    d1,(a0)+              ; 14
  578.           move.l    d1,(a0)+
  579.           move.l    d1,(a0)+              ; 15
  580.           move.l    d1,(a0)+
  581.           move.l    d1,(a0)+              ; 16
  582.           move.l    d1,(a0)+
  583.           move.l    d1,(a0)+              ; 17
  584.           move.l    d1,(a0)+
  585.           move.l    d1,(a0)+              ; 18
  586.           move.l    d1,(a0)+
  587.           move.l    d1,(a0)+              ; 19
  588.           move.l    d1,(a0)+
  589.           move.l    d1,(a0)+              ; 20
  590.           exg       d1,d2
  591.           dbf       d0,mc4
  592.           movem.l   (sp)+,a0/d0-d2
  593.           rts
  594.  
  595. buildpage:move.l    a0,-(sp)
  596.           lea       pass,a0
  597.           clr.w     (a0)                  ; Index = 0
  598. bp_10:    bsr       vid_line              ; Zeile darstellen
  599.           add.w     #12,(a0)
  600.           cmpi.w    #288,(a0)
  601.           bne.s     bp_10
  602.           move.l    (sp)+,a0
  603.           rts
  604.  
  605. vid_line: movem.l   d0-d7/a0-a6,-(sp)
  606.           move.l    flags,a5
  607.           move.l    svmtab,a0
  608.           move.w    pass,d0
  609.           move.l    0(a0,d0.w),a4         ; ST-Screen
  610.           move.l    4(a0,d0.w),a6         ; Attributfile
  611.           move.l    8(a0,d0.w),a3         ; Spectrum Pixelzeile
  612.           move.l    ctab,a2
  613.           move.l    ftab,a1
  614.           moveq     #10,d6                ; für *1024
  615.  
  616.           moveq     #31,d4                ; 32 Chars (a 8 Scans)
  617.           move.l    ctab,a0
  618.           adda.l    #120*1024,a0
  619. vl_loo:   tst.b     (a5)                  ; attr_sw
  620.           beq.s     vl_noatt
  621.           moveq     #0,d1
  622.           move.b    (a6)+,d1              ; Attribut
  623.           move.b    0(a1,d1.l),d1         ; Flash -> Invers
  624.           lsl.l     d6,d1                 ; * 1024
  625.           lea       0(a2,d1.l),a0         ; Tabelle für dieses Attribut
  626. vl_noatt: transm1 0,0
  627.           transm2 256,80*2
  628.           transm1 256*2,80*4
  629.           transm2 256*3,80*6
  630.           transm1 256*4,80*8
  631.           transm2 256*5,80*10
  632.           transm1 256*6,80*12
  633.           transm2 256*7,80*14
  634.           dbf       d4,vl_loo
  635.           movem.l   (sp)+,d0-d7/a0-a6
  636.           rts
  637.  
  638. grey_tab: dc.l      $ffffffff,$ffffffff                ; BLACK   - BRIGHT 0
  639.           dc.l      $aaaaaaaa,$ffffffff                ; BLUE    - BRIGHT 0
  640.           dc.l      $ffffffff,$55555555                ; RED     - BRIGHT 0
  641.           dc.l      $aaaaaaaa,$55555555                ; MAGENTA - BRIGHT 0
  642.           dc.l      $55555555,$aaaaaaaa                ; GREEEN  - BRIGHT 0
  643.           dc.l      $55555555,$ffffffff                ; CYAN    - BRIGHT 0
  644.           dc.l      $ffffffff,$00000000                ; YELLOW  - BRIGHT 0
  645.           dc.l      $11111111,$88888888                ; WHITE   - BRIGHT 0
  646.           dc.l      $ffffffff,$ffffffff                ; BLACK   - BRIGHT 1
  647.           dc.l      $ffffffff,$aaaaaaaa                ; BLUE    - BRIGHT 1
  648.           dc.l      $55555555,$55555555                ; RED     - BRIGHT 1
  649.           dc.l      $55555555,$00000000                ; MAGENTA - BRIGHT 1
  650.           dc.l      $00000000,$55555555                ; GREEN   - BRIGHT 1
  651.           dc.l      $aaaaaaaa,$aaaaaaaa                ; CYAN    - BRIGHT 1
  652.           dc.l      $aaaaaaaa,$00000000                ; YELLOW  - BRIGHT 1
  653.           dc.l      $00000000,$00000000                ; WHITE   - BRIGHT 1
  654.  
  655. vbsem:    dc.w      0
  656. pass:     dc.w      0
  657.  
  658. ctab      ds.l      1
  659. svmtab    ds.l      1
  660. lintab    ds.l      1
  661. ftab:     ds.l      1
  662. stscrn:   ds.l      1
  663. stscrn1:  ds.l      1
  664. screen:   ds.l      1
  665. flags:    ds.l      1
  666.  
  667. at2px:    ds.w      32*24
  668. px2st:    ds.w      6144
  669. px2at:    ds.w      6144
  670.