home *** CD-ROM | disk | FTP | other *** search
/ 3D GFX / 3D GFX.iso / amiutils / a_d / colorpatch / source / patchcode.asm < prev    next >
Encoding:
Assembly Source File  |  1995-12-31  |  25.6 KB  |  1,271 lines

  1.  
  2.         *** ColorPatch ***
  3.  
  4.         INCDIR    Include:
  5.         INCLUDE exec/exec_lib.i
  6.         INCLUDE exec/memory.i
  7.         INCLUDE exec/lists.i
  8.         INCLUDE    graphics/view.i
  9.         INCLUDE    graphics/graphics_lib.i
  10.         INCLUDE intuition/screens.i
  11.         INCLUDE intuition/intuition_lib.i
  12.         INCLUDE dos/dos_lib.i
  13.  
  14.  
  15. DEBUG        EQU    0
  16.  
  17.         IFNE    DEBUG
  18.         OPT    L-,D+
  19.         ELSE
  20.         OPT    L+,D-
  21.         ENDC
  22.  
  23.         *** Knoten-Struktur ***
  24.  
  25.         STRUCTURE kn_Node,MLN_SIZE
  26.         APTR    kn_ViewPort
  27.         APTR    kn_AltCMap
  28.         APTR    kn_RGBBuf
  29.         LABEL    kn_Size
  30.  
  31.  
  32.         *** Debugging Code ***
  33.  
  34.         IFNE    DEBUG
  35.  
  36.         move.l    4.w,a6
  37.         lea    DosName(pc),a1
  38.         moveq    #0,d0
  39.         jsr    _LVOOpenLibrary(a6)
  40.         move.l    d0,_DOSBase
  41.         lea    GfxName(pc),a1
  42.         moveq    #0,d0
  43.         jsr    _LVOOpenLibrary(a6)
  44.         move.l    d0,_GfxBase
  45.         lea    IntName(pc),a1
  46.         moveq    #0,d0
  47.         jsr    _LVOOpenLibrary(a6)
  48.         move.l    d0,_IntuitionBase
  49.  
  50.         move.l    _IntuitionBase,a6
  51.         sub.l    a0,a0
  52.         lea    TagList(pc),a1
  53.         jsr    _LVOOpenScreenTagList(a6)
  54.         move.l    d0,_Screen
  55.         beq    skip
  56.  
  57.         moveq    #0,d7
  58. felder        move.l    d7,d0
  59.         move.l    _Screen,a1
  60.         lea    sc_RastPort(a1),a1
  61.         move.l    _GfxBase,a6
  62.         jsr    _LVOSetAPen(a6)
  63.         move.l    d7,d0
  64.         mulu    #32,d0
  65.         move.w    #100,d1
  66.         move.l    d0,d2
  67.         add.w    #30,d2
  68.         move.l    d1,d3
  69.         add.w    #30,d3
  70.         move.l    _Screen,a1
  71.         lea    sc_RastPort(a1),a1
  72.         move.l    _GfxBase,a6
  73.         jsr    _LVORectFill(a6)
  74.         addq.l    #1,d7
  75.         cmp.l    #8,d7
  76.         bne.s    felder
  77.  
  78.         move.l    _GfxBase,a6
  79.         move.l    _LVOLoadRGB32+2(a6),OldLoadRGB32
  80.         move.l    _LVOSetRGB32CM+2(a6),OldSetRGB32CM
  81.         move.l    _LVOLoadRGB4+2(a6),OldLoadRGB4
  82.         move.l    _LVOMakeVPort+2(a6),OldMakeVPort
  83.         move.l    _LVOLoadView+2(a6),OldLoadView
  84.  
  85.         bsr    _InstallPatch
  86.  
  87.         move.l    _DOSBase(pc),a6
  88.         moveq    #100,d1
  89.         jsr    _LVODelay(a6)
  90.  
  91. debug        move.l    _GfxBase,a6
  92.         move.l    _Screen,a0
  93.         lea    sc_ViewPort(a0),a0
  94.         lea    Table(pc),a1
  95.         bsr    NewLoadRGB32
  96.  
  97.         move.l    _DOSBase(pc),a6
  98.         moveq    #100,d1
  99.         jsr    _LVODelay(a6)
  100.  
  101.         bsr    _RemovePatch
  102.  
  103.         move.l    _IntuitionBase,a6
  104.         move.l    _Screen,a0
  105.         jsr    _LVOCloseScreen(a6)
  106.  
  107. skip        move.l    4.w,a6
  108.         move.l    _IntuitionBase,a1
  109.         jsr    _LVOCloseLibrary(a6)
  110.         move.l    _GfxBase,a1
  111.         jsr    _LVOCloseLibrary(a6)
  112.         move.l    _DOSBase,a1
  113.         jsr    _LVOCloseLibrary(a6)
  114.         rts
  115.  
  116. _DOSBase    dc.l    0
  117. _GfxBase    dc.l    0
  118. _IntuitionBase    dc.l    0
  119. _Screen        dc.l    0
  120.  
  121. DosName        dc.b    "dos.library",0
  122. GfxName        dc.b    "graphics.library",0
  123. IntName        dc.b    "intuition.library",0
  124.  
  125. TagList        dc.l    SA_Width,320
  126.         dc.l    SA_Height,256
  127.         dc.l    SA_Depth,3
  128.         dc.l    SA_DisplayID,LORES_KEY
  129.         dc.l    TAG_END
  130.  
  131. Table        dc.w    2
  132.         dc.w    0
  133.         dc.l    $7FFFFFFF,$7FFFFFFF,$7FFFFFFF
  134.         dc.l    $FFFFFFFF,$00000000,$00000000
  135.         dc.w    2
  136.         dc.w    4
  137.         dc.l    $00000000,$FFFFFFFF,$00000000
  138.         dc.l    $00000000,$00000000,$FFFFFFFF
  139.         dc.w    0
  140.  
  141.  
  142.         ENDC
  143.  
  144.         ; *** Install the patch ***
  145.  
  146.         XDEF    _InstallPatch
  147.  
  148. _InstallPatch    move.l    a6,-(sp)
  149.  
  150.         tst.w    Patched
  151.         bne    ip_Okay
  152.  
  153.         lea    Knotenliste(pc),a0
  154.         NEWLIST    a0
  155.  
  156.         bsr    CalcCorrTab
  157.  
  158.         IFEQ    DEBUG
  159.  
  160.         move.l    4.w,a6
  161.  
  162.         move.l    _GfxBase,a1
  163.         move.w    #_LVOLoadRGB32,a0
  164.         move.l    #NewLoadRGB32,d0
  165.         jsr    _LVOSetFunction(a6)
  166.         move.l    d0,OldLoadRGB32
  167.  
  168.         move.l    _GfxBase,a1
  169.         move.w    #_LVOSetRGB32CM,a0
  170.         move.l    #NewSetRGB32CM,d0
  171.         jsr    _LVOSetFunction(a6)
  172.         move.l    d0,OldSetRGB32CM
  173.  
  174.         move.l    _GfxBase,a1
  175.         move.w    #_LVOLoadRGB4,a0
  176.         move.l    #NewLoadRGB4,d0
  177.         jsr    _LVOSetFunction(a6)
  178.         move.l    d0,OldLoadRGB4
  179.  
  180.         move.l    _GfxBase,a1
  181.         move.w    #_LVOMakeVPort,a0
  182.         move.l    #NewMakeVPort,d0
  183.         jsr    _LVOSetFunction(a6)
  184.         move.l    d0,OldMakeVPort
  185.  
  186.         move.l    _GfxBase,a1
  187.         move.w    #_LVOLoadView,a0
  188.         move.l    #NewLoadView,d0
  189.         jsr    _LVOSetFunction(a6)
  190.         move.l    d0,OldLoadView
  191.  
  192.         ENDC
  193.  
  194.         move.w    #-1,Patched
  195.  
  196. ip_Okay        moveq    #0,d0
  197.         move.l    (sp)+,a6
  198.         rts
  199.  
  200.  
  201.  
  202.         ; *** Remove the patch ***
  203.         ;
  204.         ; ->d0=Success (0=OK,-1=Failure)
  205.  
  206.         XDEF    _RemovePatch
  207.  
  208. _RemovePatch    move.l    a6,-(sp)
  209.  
  210.         tst.w    Patched
  211.         beq    rp_Okay
  212.  
  213.         IFEQ    DEBUG
  214.  
  215.         move.l    4.w,a6
  216.         jsr    _LVOForbid(a6)
  217.  
  218.         move.l    _GfxBase,a1
  219.         move.w    #_LVOLoadRGB32,a0
  220.         move.l    OldLoadRGB32,d0
  221.         jsr    _LVOSetFunction(a6)
  222.         cmp.l    #NewLoadRGB32,d0
  223.         bne    rp_failed1
  224.  
  225.         move.l    _GfxBase,a1
  226.         move.w    #_LVOSetRGB32CM,a0
  227.         move.l    OldSetRGB32CM,d0
  228.         jsr    _LVOSetFunction(a6)
  229.         cmp.l    #NewSetRGB32CM,d0
  230.         bne    rp_failed2
  231.  
  232.         move.l    _GfxBase,a1
  233.         move.w    #_LVOLoadRGB4,a0
  234.         move.l    OldLoadRGB4,d0
  235.         jsr    _LVOSetFunction(a6)
  236.         cmp.l    #NewLoadRGB4,d0
  237.         bne.s    rp_failed3
  238.  
  239.         move.l    _GfxBase,a1
  240.         move.w    #_LVOMakeVPort,a0
  241.         move.l    OldMakeVPort,d0
  242.         jsr    _LVOSetFunction(a6)
  243.         cmp.l    #NewMakeVPort,d0
  244.         bne.s    rp_failed4
  245.  
  246.         move.l    _GfxBase,a1
  247.         move.w    #_LVOLoadView,a0
  248.         move.l    OldLoadView,d0
  249.         jsr    _LVOSetFunction(a6)
  250.         cmp.l    #NewLoadView,d0
  251.         bne.s    rp_failed5
  252.  
  253.         jsr    _LVOPermit(a6)
  254.  
  255.         ENDC
  256.  
  257.         clr.w    Patched
  258.         bsr    _MaintKnoten
  259.  
  260. rp_Okay        moveq    #0,d0
  261. rp_Finished    move.l    (sp)+,a6
  262.         rts
  263.  
  264.         IFEQ    DEBUG
  265.  
  266.         ; undo changes if unpatching failed
  267.  
  268. rp_failed5    move.l    _GfxBase,a1
  269.         move.w    #_LVOLoadView,a0
  270.         move.l    #NewLoadView,d0
  271.         jsr    _LVOSetFunction(a6)
  272.  
  273. rp_failed4    move.l    _GfxBase,a1
  274.         move.w    #_LVOMakeVPort,a0
  275.         move.l    #NewMakeVPort,d0
  276.         jsr    _LVOSetFunction(a6)
  277.  
  278. rp_failed3    move.l    _GfxBase,a1
  279.         move.w    #_LVOLoadRGB4,a0
  280.         move.l    #NewLoadRGB4,d0
  281.         jsr    _LVOSetFunction(a6)
  282.  
  283. rp_failed2    move.l    _GfxBase,a1
  284.         move.w    #_LVOSetRGB32CM,a0
  285.         move.l    #NewSetRGB32CM,d0
  286.         jsr    _LVOSetFunction(a6)
  287.  
  288. rp_failed1    move.l    _GfxBase,a1
  289.         move.w    #_LVOLoadRGB32,a0
  290.         move.l    #NewLoadRGB32,d0
  291.         jsr    _LVOSetFunction(a6)
  292.  
  293.         jsr    _LVOPermit(a6)
  294.  
  295.         moveq    #-1,d0
  296.         bra.s    rp_Finished
  297.  
  298.         ENDC
  299.  
  300.  
  301.  
  302.         ; *** Bereche CorrectionTable ***
  303.  
  304. CalcCorrTab    movem.l    a2/d2-d4,-(sp)
  305.  
  306.         lea    CorrectionTable(pc),a0
  307.  
  308.         moveq    #0,d0            ; d0=Helligkeitsstufe
  309.  
  310. cct_hell    moveq    #0,d1            ; d1=beste Farbe (Nummer)
  311.         move.b    #-1,d2            ; d2=kleinster Fehler
  312.  
  313.         lea    LookupTable(pc),a1    ; Reihenfolge der Prⁿfung
  314. cct_loop    moveq    #0,d3            ; auf ▄bereinstimmung
  315.         move.b    (a1)+,d3
  316.         bmi.s    cct_durch
  317.  
  318.         lea    A2024Table(pc),a2    ; Helligkeit der Vergleichs-
  319.         move.b    (a2,d3.w),d4        ; farbe lesen
  320.  
  321.         sub.b    d0,d4            ; Differenz zur Referenz-
  322.         bpl.s    cct_skip        ; helligkeit ermitteln
  323.         neg.b    d4
  324.  
  325. cct_skip    cmp.b    d2,d4            ; test, ob kleinerer Fehler
  326.         bhs.s    cct_loop
  327.  
  328.         move.b    d3,d1            ; neue beste Farbe
  329.         move.b    d4,d2            ; neuer kleinster Fehler
  330.         bra.s    cct_loop
  331.  
  332. cct_durch    lea    A2024RGBTable(pc),a1    ; R,G,B Werte aus der
  333.         mulu    #6,d1            ; A2024RGBTabelle auslesen
  334.         add.w    d1,a1            ; und in der CorrectionTable
  335.         move.w    (a1)+,(a0)+        ; auf 8 Byte-Grenzen ablegen
  336.         move.w    (a1)+,(a0)+
  337.         move.w    (a1)+,(a0)+
  338.         clr.w    (a0)+
  339.  
  340.         addq.b    #1,d0            ; alle Helligkeitsstufen
  341.         bne.s    cct_hell        ; 0-255 durchmachen
  342.  
  343.         movem.l    (sp)+,a2/d2-d4
  344.         rts
  345.  
  346.  
  347.  
  348.         ; *** Knoten Maintenance ***
  349.         ;
  350.         ; Alle Knoten l÷schen, wenn Patched=FALSE
  351.  
  352.         ; To Do:
  353.         ; Knoten l÷schen, wenn ViewPort nicht mehr im Display
  354.  
  355. _MaintKnoten    move.l    a6,-(sp)
  356.  
  357.         move.l    Knotenliste+LH_HEAD(pc),a1  ; ersten Eintrag holen
  358.  
  359. mk_Liste    tst.l    LN_SUCC(a1)        ; Liste zu Ende?
  360.         beq.s    mk_Fertig
  361.         move.l    LN_SUCC(a1),-(sp)    ; NΣchster Knoten -> a1
  362.  
  363.         tst.w    Patched            ; Alles freigeben wenn
  364.         beq.s    mk_Free            ; Patch entfernt
  365.  
  366.         tst.w    _PatchActive        ; oder wenn
  367.         bne.s    mk_Next            ; Patch inaktiv
  368.  
  369. mk_Free        tst.l    kn_RGBBuf(a1)        ; Check for RGBBuffer
  370.         beq.s    mk_FreeAltCMap
  371.         move.l    a1,-(sp)        , Free RGB Buffer
  372.         move.l    kn_RGBBuf(a1),a1
  373.         move.l    4.w,a6
  374.         jsr    _LVOFreeVec(a6)
  375.         move.l    (sp)+,a1
  376. mk_FreeAltCMap    tst.l    kn_AltCMap(a1)        ; Check for Alt CMap
  377.         beq.s    mk_FreeKnoten
  378.         move.l    kn_AltCMap(a1),a0    ; Free Alternate CMap
  379.         clr.l    cm_PalExtra(a0)        ; this is not _our_ PalExtra!
  380.         move.l    _GfxBase,a6
  381.         move.l    a1,-(sp)
  382.         jsr    _LVOFreeColorMap(a6)
  383.         move.l    (sp)+,a1
  384. mk_FreeKnoten    move.l    4.w,a6            ; Knoten freigeben
  385.         jsr    _LVOFreeVec(a6)
  386.  
  387. mk_Next        move.l    (sp)+,a1
  388.         bra.s    mk_Liste        ; Schleife wiederholen
  389.  
  390. mk_Fertig    move.l    (sp)+,a6
  391.         rts
  392.  
  393.  
  394.  
  395.         ; *** FindeKnoten ***
  396.         ;
  397.         ; a0=ViewPort
  398.         ; -> d0=Knoten oder NULL bei Fehler
  399.         ; Zerst÷rt KEINE Register au▀er D0
  400.  
  401. FindeKnoten    movem.l    d1-d3/a0/a1/a2/a6,-(sp)
  402.  
  403.         btst    #11-8,vp_Modes(a0)    ; HAM Modus ($800)?
  404.         bne    fk_Failure        ; -> ja: Raus!
  405.  
  406.         tst.l    vp_ColorMap(a0)        ; ColorMap vorhanden?
  407.         beq.s    fk_Erlaubt
  408.         move.l    vp_ColorMap(a0),a1
  409.         tst.b    cm_Type(a1)        ; alte (V34) ColorMap?
  410.         beq.s    fk_Erlaubt
  411.         move.l    cm_VPModeID(a1),d0    ; A2024 Monitor ID?
  412.         and.l    #MONITOR_ID_MASK,d0    ; -> ja: Raus!
  413.         cmp.l    #A2024_MONITOR_ID,d0
  414.         beq    fk_Failure
  415.  
  416. fk_Erlaubt    move.l    Knotenliste+LH_HEAD(pc),a2  ; ersten Eintrag holen
  417.  
  418. fk_Liste    tst.l    LN_SUCC(a2)        ; Liste zu Ende?
  419.         beq.s    fk_NeuerKnoten
  420.         cmp.l    kn_ViewPort(a2),a0    ; stimmt ViewPort ⁿberein?
  421.         beq.s    fk_Gefunden
  422.         move.l    LN_SUCC(a2),a2        ; NΣchster Knoten
  423.         bra.s    fk_Liste        ; Schleife wiederholen
  424.  
  425. fk_Gefunden    tst.l    kn_AltCMap(a2)        ; existiert eine AltCMap?
  426.         beq    fk_KnotenA2
  427.         move.l    vp_ColorMap(a0),a0    ; AltCMap nochmals von der
  428.         move.l    kn_AltCMap(a2),a1    ; ursprⁿngl. ColorMap klonen
  429.         bsr    CloneColorMap
  430.         bra    fk_KnotenA2
  431.  
  432. fk_NeuerKnoten    moveq    #kn_Size,d0        ; Speicher fⁿr Knoten belegen
  433.         move.l    #MEMF_PUBLIC+MEMF_CLEAR,d1
  434.         move.l    4.w,a6
  435.         move.l    a0,-(sp)        ; ViewPort retten
  436.         jsr    _LVOAllocVec(a6)
  437.         move.l    (sp)+,a0
  438.         tst.l    d0
  439.         beq    fk_Finished
  440.  
  441.         move.l    d0,a2            ; Knoten ist in a1
  442.         move.l    a0,kn_ViewPort(a2)    ; Store ViewPort in Knoten
  443.  
  444.         move.l    vp_ColorMap(a0),a0    ; Get ColorMap in a0
  445.         moveq    #0,d0            ; Get Color Count
  446.         move.w    cm_Count(a0),d0
  447.         move.l    _GfxBase,a6
  448.         move.l    a0,-(sp)
  449.         jsr    _LVOGetColorMap(a6)    ; Get Alternate CMap
  450.         move.l    (sp)+,a0
  451.  
  452.         move.l    d0,kn_AltCMap(a2)    ; Store Alternate CMap
  453.         beq.s    fk_Einklinken
  454.  
  455.         move.l    d0,a1            ; Clone ColorMap
  456.         bsr    CloneColorMap
  457.  
  458.         move.w    cm_Count(a0),d0        ; calc size for RGB Buffer
  459.         mulu    #12,d0            ; 12*cm_Count+8
  460.         addq.l    #8,d0
  461.         move.l    #MEMF_PUBLIC,d1
  462.         move.l    4.w,a6
  463.         movem.l    a0/a1,-(sp)
  464.         jsr    _LVOAllocVec(a6)
  465.         movem.l    (sp)+,a0/a1
  466.         move.l    d0,kn_RGBBuf(a2)
  467.         beq.s    fk_Einklinken
  468.  
  469.         moveq    #0,d0            ; start color
  470.         moveq    #0,d1            ; get color count
  471.         move.w    cm_Count(a0),d1
  472.         movem.l    a0/a1,-(sp)        ; save CMap ptrs
  473.         move.l    kn_RGBBuf(a2),a1    ; get RGBBuf ptr + 4
  474.         addq.w    #4,a1
  475.         move.l    _GfxBase,a6
  476.         jsr    _LVOGetRGB32(a6)
  477.         movem.l    (sp)+,a0/a1
  478.  
  479.         moveq    #0,d0            ; color counter
  480.         move.l    a1,a0            ; a0 is now AltCMap (!!!)
  481.         move.l    kn_RGBBuf(a2),a1    ; a1 is now RGBBuf (!!!)
  482.         addq.w    #4,a1
  483.  
  484. fk_colors    movem.l    (a1)+,d1-d3        ; get R,G,B values
  485.  
  486.         bsr    PatchColors        ; patch R,G,B values
  487.  
  488.         movem.l    d0/a0/a1,-(sp)        ; set patched color
  489.         move.l    _GfxBase,a6        ; in Alternate CMap
  490.         pea    fk_uffz(pc)
  491.         move.l    OldSetRGB32CM(pc),-(sp)
  492.         rts
  493. fk_uffz        movem.l    (sp)+,d0/a0/a1
  494.  
  495.         addq.w    #1,d0            ; loop all colors
  496.         cmp.w    cm_Count(a0),d0
  497.         bne.s    fk_colors
  498.  
  499. fk_Einklinken    lea    Knotenliste(pc),a0    ; Add Knoten to list
  500.         move.l    a2,a1
  501.         move.l    4.w,a6
  502.         jsr    _LVOAddTail(a6)
  503.  
  504. fk_KnotenA2    move.l    a2,d0
  505. fk_Finished    movem.l    (sp)+,d1-d3/a0/a1/a2/a6
  506.         rts
  507.  
  508. fk_Failure    moveq    #0,d0            ; return NULL (Failure)
  509.         bra.s    fk_Finished
  510.  
  511.  
  512.         ; *** CloneColorMap ***
  513.  
  514.         ; a0=SourceCMap
  515.         ; a1=DestCMap
  516.         ; Zerst÷rt KEINE Register
  517.         
  518. CloneColorMap    movem.l    d0/d1/a0/a1/a6,-(sp)
  519.         move.b    cm_Flags(a0),cm_Flags(a1)
  520.         tst.b    cm_Type(a0)
  521.         beq.s    ccm_OldStyle
  522.         move.l    cm_vpe(a0),cm_vpe(a1)
  523.         lea    cm_TransparencyPlane(a0),a0
  524.         lea    cm_TransparencyPlane(a1),a1
  525.         moveq    #cm_SIZEOF-cm_TransparencyPlane,d0
  526.         move.l    4.w,a6
  527.         jsr    _LVOCopyMem(a6)
  528. ccm_OldStyle    movem.l    (sp)+,d0/d1/a0/a1/a6
  529.         rts
  530.  
  531.  
  532.  
  533.         *** LoadRGB32 patch ***
  534.  
  535.         ; a0=ViewPort
  536.         ; a1=Table
  537.  
  538. NL_REGS        REG    d2-d4/a2/a3
  539.  
  540. NewLoadRGB32    cmp.w    #0,a0            ; kein ViewPort ⁿbergeben?
  541.         beq.s    nl_QuickExit
  542.         cmp.w    #0,a1            ; keine Tabelle ⁿbergeben?
  543.         beq.s    nl_QuickExit
  544.  
  545.         movem.l    NL_REGS,-(sp)
  546.  
  547.         tst.w    _PatchActive        ; Check ob Patch aktiv
  548.         beq.s    nl_NoPatch
  549.  
  550.         bsr    FindeKnoten        ; Knoten auffinden oder
  551.         tst.l    d0
  552.         beq.s    nl_NoPatch        ; erzeugen
  553.         move.l    d0,a2            ; Knoten -> a2
  554.  
  555.         tst.l    kn_AltCMap(a2)        ; keine AltCMap?
  556.         beq.s    nl_NoPatch
  557.  
  558.         tst.l    kn_RGBBuf(a2)        ; kein RGBBuf?
  559.         beq.s    nl_NoPatch
  560.  
  561.         tst.w    _UpdateAll        ; Check ob alle Farben
  562.         beq.s    nl_NoUpdateAll        ; verΣndert werden mⁿssen
  563.         bra    nl_UpdateAll
  564.  
  565. nl_NoPatch    movem.l    (sp)+,NL_REGS        ; keinen Patch durchfⁿhren
  566.         move.l    OldLoadRGB32(pc),-(sp)    ; original LoadRGB32 benutzen
  567. nl_QuickExit    rts
  568.  
  569.         ; ⁿbergebene Farben mittels ORIGINAL SetRGB32CM
  570.         ; in original CMap kopieren, patchen und
  571.         ; eine Tabelle aufbauen.
  572.  
  573. nl_NoUpdateAll    move.l    kn_RGBBuf(a2),a3    ; RGBBuffer in a3
  574.         move.l    a3,-(sp)
  575.  
  576. nl_GetCount    move.w    (a1)+,d4        ; get count in d4
  577.         move.w    d4,(a3)+
  578.         beq.s    nl_TabEnde
  579.         subq.w    #1,d4            ; use for dbra
  580.     
  581.         moveq    #0,d0            ; get offset in d0
  582.         move.w    (a1)+,d0
  583.         move.w    d0,(a3)+
  584.  
  585. nl_EntryLoop    movem.l    (a1)+,d1-d3        ; get supplied colors
  586.  
  587.         movem.l    a0-a1/d0-d3,-(sp)    ; set original colors
  588.         move.l    vp_ColorMap(a0),a0    ; in original ColorMap
  589.         pea    nl_uffz(pc)
  590.         move.l    OldSetRGB32CM(pc),-(sp)
  591.         rts
  592. nl_uffz        movem.l    (sp)+,a0-a1/d0-d3
  593.  
  594.         bsr    PatchColors        ; now patch colors
  595.  
  596.         movem.l    d1-d3,(a3)        ; save patched colors in
  597.         lea    12(a3),a3        ; in alternate table
  598.  
  599.         addq.l    #1,d0            ; increase color offset
  600.         dbra    d4,nl_EntryLoop        ; loop supplied entries
  601.         bra.s    nl_GetCount        ; check next count
  602.  
  603. nl_TabEnde    move.l    (sp)+,a1        ; use RGBBuf as table
  604.         bra    nl_ApplyTable
  605.  
  606.         ; ⁿbergebene Farben mittels ORIGINAL SetRGB32CM
  607.         ; in original CMap kopieren.
  608.         ; dann ALLE Farben der original CMap patchen und
  609.         ; eine Tabelle aufbauen
  610.  
  611. nl_UpdateAll    move.w    (a1)+,d4        ; get count in d3
  612.         beq.s    nl_TabEnde2
  613.         subq.w    #1,d4
  614.  
  615.         moveq    #0,d0            ; get offset in d0
  616.         move.w    (a1)+,d0
  617.  
  618. nl_EntryLoop2    movem.l    (a1)+,d1-d3        ; get supplied colors
  619.  
  620.         movem.l    a0-a1/d0,-(sp)        ; set original colors
  621.         move.l    vp_ColorMap(a0),a0    ; in original ColorMap
  622.         pea    nl_uffz2(pc)
  623.         move.l    OldSetRGB32CM(pc),-(sp)
  624.         rts
  625. nl_uffz2    movem.l    (sp)+,a0-a1/d0
  626.  
  627.         addq.l    #1,d0            ; increase color offset
  628.         dbra    d4,nl_EntryLoop2    ; loop supplied entries
  629.         bra.s    nl_UpdateAll        ; check next count
  630.  
  631. nl_TabEnde2    move.l    kn_RGBBuf(a2),a1    ; get RGBBuf in a1
  632.         move.l    a1,-(sp)        ; save RGBBuf
  633.  
  634.         move.l    a0,-(sp)        ; save ViewPort
  635.         move.l    vp_ColorMap(a0),a0    ; get ColorMap in a0
  636.         moveq    #0,d4            ; get color count in d4
  637.         move.w    cm_Count(a0),d4
  638.         move.w    d4,(a1)+        ; store count in RGBBuf
  639.         clr.w    (a1)+            ; store offset in RGBBuf
  640.         moveq    #0,d0            ; firstcolor=0
  641.         move.l    d4,d1            ; numcolors
  642.         move.l    a1,-(sp)
  643.         jsr    _LVOGetRGB32(a6)    ; get 32 bit RGB values
  644.         move.l    (sp)+,a1
  645.         move.l    (sp)+,a0        ; restore ViewPort
  646.  
  647.         subq.w    #1,d4            ; d4=colorcount for dbra
  648. nl_patch    movem.l    (a1),d1-d3        ; get 32 bit R,G,B
  649.         bsr    PatchColors        ; patch colors
  650.         movem.l    d1-d3,(a1)        ; replace original colors
  651.         lea    12(a1),a1        ; with patched ones in table
  652.         dbra    d4,nl_patch        ; loop all colors
  653.         clr.w    (a1)+            ; clear last count (end mark)
  654.  
  655.         move.l    (sp)+,a1        ; use RGBBuf as table
  656.  
  657.         ; erzeugte Tabelle auf AltCMap anwenden
  658.  
  659. nl_ApplyTable    move.l    vp_ColorMap(a0),-(sp)    ; save orig ColorMap
  660.         move.l    a0,-(sp)        ; save VPort ptr
  661.  
  662.         move.l    a6,-(sp)        ; forbid multitasking
  663.         move.l    4.w,a6
  664.         jsr    _LVOForbid(a6)
  665.         move.l    (sp)+,a6
  666.  
  667.         move.l    kn_AltCMap(a2),vp_ColorMap(a0)    ; use alt CMap in VPort
  668.         pea    nl_Return(pc)
  669.         move.l    OldLoadRGB32(pc),-(sp)    ; do original LoadRGB32
  670.         rts
  671. nl_Return    move.l    (sp)+,a0        ; restore VPort
  672.         move.l    (sp)+,vp_ColorMap(a0)    ; restore CMap in VPort
  673.  
  674.         move.l    a6,-(sp)        ; permit multitasking
  675.         move.l    4.w,a6
  676.         jsr    _LVOPermit(a6)
  677.         move.l    (sp)+,a6
  678.  
  679.         movem.l    (sp)+,NL_REGS
  680.         rts
  681.  
  682.  
  683.  
  684.         ; *** SetRGB32CM patch ***
  685.  
  686.         ; a0=ColorMap
  687.         ; d0=Color
  688.         ; d1=32 bit red
  689.         ; d2=32 bit green
  690.         ; d3=32 bit blue
  691.  
  692. NS_REGS        EQUR    d2-d4/a2
  693.  
  694. NewSetRGB32CM    cmp.w    #0,a0            ; no ColorMap given?
  695.         beq.s    ns_QuickExit
  696.  
  697.         movem.l    d0/d1/a0,-(sp)        ; use original SetRGB32CM
  698.         pea    ns_Return(pc)
  699.         move.l    OldSetRGB32CM(pc),-(sp)
  700.         rts
  701. ns_Return    movem.l    (sp)+,d0/d1/a0
  702.  
  703.         movem.l    NS_REGS,-(sp)
  704.  
  705.         tst.w    _PatchActive        ; Check ob Patch aktiv
  706.         beq.s    ns_NoPatch
  707.  
  708.         tst.b    cm_Type(a0)        ; Check ob V36 CMap
  709.         beq.s    ns_NoPatch
  710.  
  711.         tst.l    cm_vp(a0)        ; Link zu ViewPort?
  712.         beq.s    ns_NoPatch
  713.  
  714.         movem.l    a0/d0,-(sp)
  715.         move.l    cm_vp(a0),a0
  716.         bsr    FindeKnoten        ; Knoten auffinden
  717.         move.l    d0,a2            ; oder erzeugen
  718.         movem.l    (sp)+,a0/d0
  719.         cmp.w    #0,a2
  720.         beq.s    ns_NoPatch
  721.  
  722.         tst.l    kn_AltCMap(a2)        ; keine AltCMap?
  723.         beq.s    ns_NoPatch
  724.  
  725.         tst.l    kn_RGBBuf(a2)        ; kein RGBBuf?
  726.         beq.s    ns_NoPatch
  727.  
  728.         ; patch the color values and enter in the
  729.         ; alternate ColorMap as well
  730.  
  731.         bsr    PatchColors
  732.         move.l    kn_AltCMap(a2),a0
  733.         pea    ns_NoPatch(pc)
  734.         move.l    OldSetRGB32CM(pc),-(sp)
  735.         rts
  736.  
  737. ns_NoPatch    movem.l    (sp)+,NS_REGS
  738. ns_QuickExit    rts
  739.  
  740.  
  741.  
  742.         ; *** LoadRGB4 patch ***
  743.  
  744.         ; a0=ViewPort
  745.         ; a1=Colors
  746.         ; d0.w=Count
  747.  
  748. L4_REGS        REG    d2-d5/a2/a3
  749.  
  750. NewLoadRGB4    cmp.w    #0,a0            ; kein ViewPort ⁿbergeben?
  751.         beq.s    l4_QuickExit
  752.         cmp.w    #0,a1            ; keine Tabelle ⁿbergeben?
  753.         beq.s    l4_QuickExit
  754.  
  755.         movem.l    L4_REGS,-(sp)
  756.  
  757.         tst.w    _PatchActive        ; Check ob Patch aktiv
  758.         beq.s    l4_NoPatch
  759.  
  760.         move.w    d0,-(sp)
  761.         bsr    FindeKnoten        ; Knoten auffinden oder
  762.         move.l    d0,a2            ; erzeugen, Knoten -> a2
  763.         move.w    (sp)+,d0
  764.         cmp.w    #0,a2
  765.         beq.s    l4_NoPatch
  766.  
  767.         tst.l    kn_AltCMap(a2)        ; keine AltCMap?
  768.         beq.s    l4_NoPatch
  769.  
  770.         tst.l    kn_RGBBuf(a2)        ; kein RGBBuf?
  771.         beq.s    l4_NoPatch
  772.  
  773.         bra    l4_Patch
  774.  
  775. l4_NoPatch    movem.l    (sp)+,L4_REGS        ; keinen Patch durchfⁿhren
  776.         move.l    OldLoadRGB4(pc),-(sp)    ; original LoadRGB32 benutzen
  777. l4_QuickExit    rts
  778.  
  779. l4_Patch    ; ⁿbergebene Farben mittels ORIGINAL SetRGB32CM
  780.         ; in original CMap kopieren, patchen und
  781.         ; eine Tabelle aufbauen.
  782.  
  783. l4_NoUpdateAll    move.l    kn_RGBBuf(a2),a3    ; RGBBuffer in a3
  784.         move.l    a3,-(sp)
  785.  
  786. l4_GetCount    move.w    d0,d4            ; get count in d4
  787.         move.w    d4,(a3)+        ; store count
  788.         subq.w    #1,d4            ; use for dbra
  789.         moveq    #0,d0            ; get offset in d0
  790.         move.w    d0,(a3)+        ; store offset
  791.  
  792. l4_EntryLoop    moveq    #0,d1
  793.         move.w    (a1)+,d1        ; get RGB4 colors in d1
  794.         move.l    d1,d2
  795.         move.l    d1,d3
  796.  
  797.         and.w    #$0f00,d1        ; create 32bit red
  798.         move.w    d1,d5
  799.         lsl.w    #4,d1
  800.         or.w    d5,d1
  801.         swap    d1
  802.  
  803.         and.w    #$00f0,d2        ; create 32bit green
  804.         lsl.w    #4,d2
  805.         move.w    d2,d5
  806.         lsl.w    #4,d2
  807.         or.w    d5,d2
  808.         swap    d2
  809.  
  810.         and.w    #$000f,d3        ; create 32bit blue
  811.         lsl.w    #8,d3
  812.         move.w    d3,d5
  813.         lsl.w    #4,d3
  814.         or.w    d5,d3
  815.         swap    d3
  816.  
  817.         movem.l    a0-a1/d0-d3,-(sp)    ; set original colors
  818.         move.l    vp_ColorMap(a0),a0    ; in original ColorMap
  819.         pea    l4_uffz(pc)
  820.         move.l    OldSetRGB32CM(pc),-(sp)
  821.         rts
  822. l4_uffz        movem.l    (sp)+,a0-a1/d0-d3
  823.  
  824.         bsr    PatchColors        ; now patch colors
  825.  
  826.         movem.l    d1-d3,(a3)        ; save patched colors in
  827.         lea    12(a3),a3        ; in alternate table
  828.  
  829.         addq.l    #1,d0            ; increase color offset
  830.         dbra    d4,l4_EntryLoop        ; loop supplied entries
  831.  
  832.         clr.w    (a3)+            ; set count to 0 (end mark)
  833.         move.l    (sp)+,a1        ; use RGBBuf as table
  834.  
  835.         ; erzeugte Tabelle auf AltCMap anwenden
  836.  
  837. l4_ApplyTable    move.l    vp_ColorMap(a0),-(sp)    ; save orig ColorMap
  838.         move.l    a0,-(sp)        ; save VPort ptr
  839.  
  840.         move.l    a6,-(sp)        ; forbid multitasking
  841.         move.l    4.w,a6
  842.         jsr    _LVOForbid(a6)
  843.         move.l    (sp)+,a6
  844.  
  845.         move.l    kn_AltCMap(a2),vp_ColorMap(a0)    ; use alt CMap in VPort
  846.         pea    l4_Return(pc)
  847.         move.l    OldLoadRGB32(pc),-(sp)    ; do original LoadRGB32
  848.         rts
  849. l4_Return    move.l    (sp)+,a0        ; restore VPort
  850.         move.l    (sp)+,vp_ColorMap(a0)    ; restore CMap in VPort
  851.  
  852.         move.l    a6,-(sp)        ; permit multitasking
  853.         move.l    4.w,a6
  854.         jsr    _LVOPermit(a6)
  855.         move.l    (sp)+,a6
  856.  
  857.         movem.l    (sp)+,L4_REGS
  858.         rts
  859.  
  860.  
  861.  
  862.         ; *** MakeVPort patch ***
  863.  
  864.         ; a0=View
  865.         ; a1=ViewPort
  866.  
  867. MV_REGS        EQUR    a2
  868.  
  869. NewMakeVPort    cmp.w    #0,a0            ; no View given?
  870.         beq.s    mv_QuickExit
  871.         cmp.w    #0,a1            ; no ViewPort given?
  872.         beq.s    mv_QuickExit
  873.  
  874.         move.l    MV_REGS,-(sp)
  875.  
  876.         tst.w    _PatchActive        ; Check ob Patch aktiv
  877.         beq.s    mv_NoPatch
  878.  
  879.         move.l    a0,-(sp)
  880.         move.l    a1,a0
  881.         bsr    FindeKnoten        ; Knoten auffinden oder
  882.         move.l    (sp)+,a0        ; erzeugen
  883.         tst.l    d0
  884.         beq.s    mv_NoPatch
  885.         move.l    d0,a2            ; Knoten -> a2
  886.  
  887.         tst.l    kn_AltCMap(a2)        ; keine AltCMap?
  888.         beq.s    mv_NoPatch
  889.  
  890.         tst.l    kn_RGBBuf(a2)        ; kein RGBBuf?
  891.         beq.s    mv_NoPatch
  892.  
  893.         bra.s    mv_Patch
  894.  
  895. mv_NoPatch    move.l    (sp)+,MV_REGS        ; keinen Patch durchfⁿhren
  896.         move.l    OldMakeVPort(pc),-(sp)    ; original MakeVPort benutzen
  897.         rts
  898.  
  899. mv_Patch    move.l    vp_ColorMap(a1),-(sp)    ; save orig ColorMap
  900.         move.l    a1,-(sp)        ; save VPort ptr
  901.  
  902.         move.l    a6,-(sp)        ; forbid multitasking
  903.         move.l    4.w,a6
  904.         jsr    _LVOForbid(a6)
  905.         move.l    (sp)+,a6
  906.  
  907.         move.l    kn_AltCMap(a2),vp_ColorMap(a1)    ; use alt CMap in VPort
  908.         pea    mv_Return(pc)
  909.         move.l    OldMakeVPort(pc),-(sp)    ; do original MakeVPort
  910.         rts
  911. mv_Return    move.l    (sp)+,a1        ; restore VPort
  912.         move.l    (sp)+,vp_ColorMap(a1)    ; restore CMap in VPort
  913.  
  914.         move.l    a6,-(sp)        ; permit multitasking
  915.         move.l    4.w,a6
  916.         jsr    _LVOPermit(a6)
  917.         move.l    (sp)+,a6
  918.  
  919.         move.l    (sp)+,MV_REGS
  920. mv_QuickExit    rts
  921.  
  922.  
  923.  
  924.         ; *** LoadView Patch ***
  925.         ;
  926.         ; a1=View
  927.  
  928. LV_REGS        EQUR    a2
  929.  
  930.  
  931. NewLoadView    move.l    LV_REGS,-(sp)
  932.  
  933.         tst.w    _PatchActive        ; is patch active?
  934.         beq.s    lv_NoPatch
  935.  
  936.         cmp.w    #0,a1            ; no view given?
  937.         beq.s    lv_NoPatch        ; -> use orig function
  938.  
  939.         tst.l    v_ViewPort(a1)        ; no viewports?
  940.         beq.s    lv_NoPatch
  941.  
  942.         bra.s    lv_Patch
  943.  
  944. lv_NoPatch    move.l    (sp)+,LV_REGS
  945.         move.l    OldLoadView(pc),-(sp)
  946.         rts
  947.  
  948.         ; Die ColorMaps aller sichtbaren Views
  949.         ; gegen die alternativen austauschen,
  950.         ; dann LoadView aufrufen und die ─nderungen
  951.         ; rⁿckgΣngig machen
  952.  
  953. lv_Patch    move.l    a6,-(sp)        ; disable multitasking
  954.         move.l    4.w,a6
  955.         jsr    _LVOForbid(a6)
  956.         move.l    (sp)+,a6
  957.  
  958.         clr.l    -(sp)            ; end marker for stack frame
  959.  
  960.         move.l    v_ViewPort(a1),a0
  961.  
  962. lv_Loop        btst    #13-8,vp_Modes(a0)    ; viewport hidden?
  963.         bne.s    lv_Invisible        ; ->ignore
  964.  
  965.         bsr    FindeKnoten        ; Knoten auffinden oder 
  966.         tst.l    d0            ; erzeugen
  967.         beq.s    lv_Invisible
  968.         move.l    d0,a2
  969.  
  970.         tst.l    kn_AltCMap(a2)        ; no AltCMap?
  971.         beq.s    lv_Invisible
  972.  
  973.         tst.l    kn_RGBBuf(a2)        ; no RGBBuf?
  974.         beq.s    lv_Invisible
  975.  
  976.         move.l    vp_ColorMap(a0),-(sp)    ; ColorMap und ViewPort
  977.         move.l    a0,-(sp)        ; auf dem Stack sichern
  978.  
  979.         move.l    kn_AltCMap(a2),vp_ColorMap(a0)    ; use alt CMap
  980.  
  981. lv_Invisible    move.l    vp_Next(a0),a0        ; loop all ViewPorts
  982.         cmp.w    #0,a0
  983.         bne.s    lv_Loop
  984.  
  985.         pea    lv_Return(pc)        ; use original LoadView
  986.         move.l    OldLoadView(pc),-(sp)    ; function
  987.         rts
  988.  
  989. lv_Return    move.l    (sp)+,a0        ; alte ColorMaps wieder
  990.         cmp.w    #0,a0            ; in ViewPorts eintragen
  991.         beq.s    lv_Fertig
  992.         move.l    (sp)+,vp_ColorMap(a0)
  993.         bra.s    lv_Return
  994.  
  995. lv_Fertig    move.l    a6,-(sp)        ; reenable multitasking
  996.         move.l    4.w,a6
  997.         jsr    _LVOPermit(a6)
  998.         move.l    (sp)+,a6
  999.  
  1000.         move.l    (sp)+,LV_REGS
  1001.         rts
  1002.  
  1003.  
  1004.  
  1005.         ; *** PatchColors ***
  1006.  
  1007.         ; d1 = 32bit RED
  1008.         ; d2 = 32bit GREEN
  1009.         ; d3 = 32bit BLUE
  1010.         ; -> d1,d2,d3 patched 32bit RGB
  1011.         ; Zerst÷rt KEINE Register
  1012.  
  1013. PatchColors    move.l    d0,-(sp)
  1014.  
  1015.         rol.l    #8,d1            ; rotate 8 bit R,G,B
  1016.         rol.l    #8,d2            ; in d1.b,d2.b,d3.b
  1017.         rol.l    #8,d3
  1018.  
  1019.         moveq    #0,d0            ; create $ff.l in d0
  1020.         move.b    #$ff,d0
  1021.  
  1022.         and.l    d0,d1            ; create 8 bit R,G,B
  1023.         and.l    d0,d2            ; in d1.l,d2.l,d3.l
  1024.         and.l    d0,d3
  1025.  
  1026.         addq.w    #1,d0            ; create $100.l in d0
  1027.  
  1028.         cmp.w    _RedVal(pc),d0
  1029.         beq.s    .skipred
  1030.         muls    _RedVal(pc),d1
  1031.         asr.l    #8,d1
  1032. .skipred
  1033.  
  1034.         cmp.w    _GreenVal(pc),d0
  1035.         beq.s    .skipgreen
  1036.         muls    _GreenVal(pc),d2
  1037.         asr.l    #8,d2
  1038. .skipgreen
  1039.  
  1040.         cmp.w    _BlueVal(pc),d0
  1041.         beq.s    .skipblue
  1042.         muls    _BlueVal(pc),d3
  1043.         asr.l    #8,d3
  1044. .skipblue
  1045.  
  1046.         move.w    _ColorVal(pc),d0
  1047.         cmp.w    #256,d0
  1048.         beq.s    .skipcolor
  1049.         neg.w    d0
  1050.         add.w    #256,d0
  1051.  
  1052.         movem.l    d4/d5,-(sp)
  1053.  
  1054.         move.l    d1,d4        ; calc color average
  1055.         add.w    d2,d4
  1056.         add.w    d3,d4
  1057.         divu    #3,d4        ; alternative 1
  1058.  
  1059. *        moveq    #0,d5        ; alternative 2
  1060. *        add.w    _RedVal(pc),d5
  1061. *        add.w    _GreenVal(pc),d5
  1062. *        add.w    _BlueVal(pc),d5
  1063. *        asl.l    #8,d4
  1064. *        divs    d5,d4
  1065.  
  1066.         move.w    d4,d5        ; adjust red value
  1067.         sub.w    d1,d5
  1068.         muls.w    d0,d5
  1069.         asr.l    #8,d5
  1070.         add.w    d5,d1
  1071.  
  1072.         move.w    d4,d5        ; adjust green value
  1073.         sub.w    d2,d5
  1074.         muls.w    d0,d5
  1075.         asr.l    #8,d5
  1076.         add.w    d5,d2
  1077.  
  1078.         move.w    d4,d5        ; adjust blue value
  1079.         sub.w    d3,d5
  1080.         muls.w    d0,d5
  1081.         asr.l    #8,d5
  1082.         add.w    d5,d3
  1083.  
  1084.         movem.l    (sp)+,d4/d5
  1085. .skipcolor
  1086.  
  1087.         move.w    _ContrVal(pc),d0
  1088.         cmp.w    #256,d0
  1089.         beq.s    .skipcontr
  1090.         neg.w    d0
  1091.         add.w    #256,d0
  1092.  
  1093.         move.l    d4,-(sp)
  1094.  
  1095.         moveq    #$7f,d4        ; adjust red value
  1096.         sub.w    d1,d4
  1097.         muls.w    d0,d4
  1098.         asr.l    #8,d4
  1099.         add.w    d4,d1
  1100.  
  1101.         moveq    #$7f,d4        ; adjust green value
  1102.         sub.w    d2,d4
  1103.         muls.w    d0,d4
  1104.         asr.l    #8,d4
  1105.         add.w    d4,d2
  1106.  
  1107.         moveq    #$7f,d4        ; adjust blue value
  1108.         sub.w    d3,d4
  1109.         muls.w    d0,d4
  1110.         asr.l    #8,d4
  1111.         add.w    d4,d3
  1112.  
  1113.         move.l    (sp)+,d4
  1114. .skipcontr
  1115.  
  1116.         move.w    _BrightVal(pc),d0
  1117.         cmp.w    #256,d0
  1118.         beq.s    .skipbright
  1119.         muls.w    d0,d1
  1120.         muls.w    d0,d2
  1121.         muls.w    d0,d3
  1122.         asr.l    #8,d1
  1123.         asr.l    #8,d2
  1124.         asr.l    #8,d3
  1125. .skipbright
  1126.  
  1127.         tst.w    d1        ; fix R,G,B negative overflow
  1128.         bpl.s    .posred
  1129.         moveq    #0,d1
  1130. .posred        tst.w    d2
  1131.         bpl.s    .posgreen
  1132.         moveq    #0,d2
  1133. .posgreen    tst.w    d3
  1134.         bpl.s    .posblue
  1135.         moveq    #0,d3
  1136. .posblue
  1137.  
  1138.         move.w    #$ff,d0        ; fix R,G,B positive overflow
  1139.         cmp.w    d0,d1
  1140.         bls.s    .goodred
  1141.         move.w    d0,d1
  1142. .goodred    cmp.w    d0,d2
  1143.         bls.s    .goodgreen
  1144.         move.w    d0,d2
  1145. .goodgreen    cmp.w    d0,d3
  1146.         bls.s    .goodblue
  1147.         move.w    d0,d3
  1148. .goodblue
  1149.  
  1150.         tst.w    _CorA2024Active    ; a2024 correction
  1151.         beq.s    .skipcor
  1152.  
  1153.         move.l    d1,d0        ; calc color brightness
  1154.         add.w    d2,d0
  1155.         add.w    d3,d0
  1156.         divu    #3,d0
  1157.  
  1158.         lsl.w    #3,d0        ; get R,G,B values corresponding
  1159.         move.l    a0,-(sp)    ; to brightness
  1160.         lea    CorrectionTable(pc),a0
  1161.         movem.w    (a0,d0.w),d1-d3
  1162.         move.l    (sp)+,a0
  1163. .skipcor
  1164.  
  1165.         tst.w    _EmuA2024Active    ; a2024 emulation
  1166.         beq.s    .skipemu
  1167.  
  1168.         moveq    #0,d0        ; clear offset counter
  1169.  
  1170.         roxl.b    #1,d1        ; bit 3 red = 1st line high bit
  1171.         roxl.b    #1,d0
  1172.  
  1173.         roxl.b    #1,d3        ; bit 3 blue = 1st line low bit
  1174.         roxl.b    #1,d0
  1175.  
  1176.         roxl.b    #1,d2        ; bit 3 green = 2nd line high bit
  1177.         roxl.b    #1,d0
  1178.  
  1179.         lsl.b    #2,d3        ; skip 2 bits blue
  1180.         roxl.b    #1,d3        ; bit 0 blue = 2nd line low bit
  1181.         roxl.b    #1,d0
  1182.  
  1183.         move.l    a0,-(sp)    ; get grey value from table
  1184.         lea    A2024Table(pc),a0
  1185.         move.b    (a0,d0.w),d1
  1186.         move.b    d1,d2
  1187.         move.b    d1,d3
  1188.         move.l    (sp)+,a0
  1189. .skipemu
  1190.  
  1191.         ror.l    #8,d1        ; 32 bit R,G,B Werte herstellen
  1192.         ror.l    #8,d2
  1193.         ror.l    #8,d3
  1194.  
  1195.         move.l    (sp)+,d0
  1196.         rts
  1197.  
  1198.  
  1199.  
  1200.         *** Variablen ***
  1201.  
  1202.         XREF    _GfxBase
  1203.  
  1204.         XDEF    _PatchActive
  1205. _PatchActive    dc.w    1
  1206.         XDEF    _UpdateAll
  1207. _UpdateAll    dc.w    0
  1208.         XDEF    _CorA2024Active
  1209. _CorA2024Active    dc.w    0
  1210.         XDEF    _EmuA2024Active
  1211. _EmuA2024Active    dc.w    0
  1212.         XDEF    _RedVal
  1213. _RedVal        dc.w    256
  1214.         XDEF    _GreenVal
  1215. _GreenVal    dc.w    256
  1216.         XDEF    _BlueVal
  1217. _BlueVal    dc.w    256
  1218.         XDEF    _BrightVal
  1219. _BrightVal    dc.w    256
  1220.         XDEF    _ColorVal
  1221. _ColorVal    dc.w    256
  1222.         XDEF    _ContrVal
  1223. _ContrVal    dc.w    256
  1224.  
  1225. OldLoadRGB32    dc.l    0
  1226. OldSetRGB32CM    dc.l    0
  1227. OldLoadRGB4    dc.l    0
  1228. OldMakeVPort    dc.l    0
  1229. OldLoadView    dc.l    0
  1230. Patched        dc.w    0
  1231. Knotenliste    ds.b    MLH_SIZE
  1232.  
  1233. A2024Table    dc.b    $00,$66,$77,$AA        ; subjektive Helligkeits-
  1234.         dc.b    $66,$88,$99,$CC        ; werte aller 16 m÷glichen
  1235.         dc.b    $77,$99,$BB,$DD        ; A2024-"Farben"
  1236.         dc.b    $AA,$CC,$DD,$FF
  1237.  
  1238. *A2024Table    dc.b    $00,$22,$44,$AA        ; alternative Tabelle
  1239. *        dc.b    $22,$66,$88,$DD        ; weniger Kontrast, aber
  1240. *        dc.b    $44,$88,$CC,$EE        ; mehr Details
  1241. *        dc.b    $AA,$DD,$EE,$FF
  1242.  
  1243. A2024RGBTable    dc.w    $00,$00,$00        ; die R,G,B Werte aller 16
  1244.         dc.w    $00,$00,$88        ; m÷glichen A2024-"Farben"
  1245.         dc.w    $88,$00,$00
  1246.         dc.w    $88,$00,$88
  1247.  
  1248.         dc.w    $00,$00,$11
  1249.         dc.w    $00,$00,$99
  1250.         dc.w    $88,$00,$11
  1251.         dc.w    $88,$00,$99
  1252.  
  1253.         dc.w    $00,$88,$00
  1254.         dc.w    $00,$88,$88
  1255.         dc.w    $88,$88,$00
  1256.         dc.w    $88,$88,$88
  1257.  
  1258.         dc.w    $00,$88,$11
  1259.         dc.w    $00,$88,$99
  1260.         dc.w    $88,$88,$11
  1261.         dc.w    $88,$88,$99
  1262.  
  1263. LookupTable    dc.b    $0,$5,$A,$F        ; Reihenfolge der Graustufen
  1264.         dc.b    $1,$6,$B        ; fⁿr die Berechnung der
  1265.         dc.b    $2,$7            ; CorrectionTable, optimiert auf
  1266.         dc.b    $3            ; m÷glichst "reine" Graustufen.
  1267.         dc.b    -1
  1268.         even
  1269.  
  1270. CorrectionTable    ds.w    256*4            ; 4 Words pro Helligkeitsstufe
  1271.