;fs "Includes"
         machine   68020
         incdir    "IncludeIII:"
         include   "exec/exec_lib.i"
         include   "exec/memory.i"
         include   "exec/execbase.i"
         include   "dos/dos_lib.i"
         include   "dos/dos.i"
         include   "dos/dostags.i"
         include   "intuition/intuition_lib.i"
         include   "intuition/screens.i"
         include   "graphics/graphics_lib.i"
         include   "hardware/custom.i"
         include   "hardware/blit.i"
         include   "hardware/dmabits.i"
;fe
;fs "Macros"
AbsExecBase        = 4
CustomBase         = $dff000

TRUE     = -1
FALSE    = 0

CALL     macro
         jsr       _LVO\1(a6)
         endm
;fe
;fs "Main code"
start:
         movem.l   d0/a0,-(sp)
         move.l    (AbsExecBase).w,a6
         lea       gfx_name,a1
         clr.l     d0
         CALL      OpenLibrary
         move.l    d0,gfx_base
         beq       no_gfx
         lea       int_name,a1
         move.l    #39,d0
         CALL      OpenLibrary
         move.l    d0,int_base
         ;beq      no_int
         lea       dos_name,a1
         clr.l     d0
         CALL      OpenLibrary
         move.l    d0,dos_base
         beq       no_dos
         move.l    d0,a6
         move.l    #filename,d1
         clr.l     d2
         CALL      LoadSeg
         move.l    d0,seglist
         beq       no_seg
         move.l    (AbsExecBase).w,a6
         move.l    seglist,a5
         add.l     a5,a5
         add.l     a5,a5

         bsr       _Patch

         CALL      CacheClearU
         move.l    seglist,d1
search_last_seg:
         ;move.l    d1,a0
         ;add.l     a0,a0
         ;add.l     a0,a0
         ;move.l    (a0),d1
         ;bne       search_last_seg
         ;move.l    d0,(a0)
         clr.l     start-4
         movem.l   (sp)+,d0/a0
         ;move.l    a0,args
         move.l    dos_base,a6
         move.l    #tags,d1
         CALL      CreateNewProc
         ;lea       cl,a0
         ;move.l    #cle-cl-1,d0
         ;jsr       (a5)
         movem.l   d0/a0,-(sp)
no_mem:
         move.l    dos_base,a6
clean_all:
         move.l    seglist,d1
         ;CALL     UnLoadSeg
no_seg:
         move.l    a6,a1
         move.l    (AbsExecBase).w,a6
         CALL      CloseLibrary
no_dos:
         move.l    gfx_base,a1
         CALL      CloseLibrary
no_gfx:
         movem.l   (sp)+,d0/a0
         clr.l     d0
         rts
;fe
;fs "Main data"
dos_name:
         dc.b      "dos.library",0
gfx_name:
         dc.b      "graphics.library",0
int_name:
         dc.b      "intuition.library",0
         even
dos_base:
         ds.l      1
int_base:
         ds.l      1
gfx_base:
         ds.l      1
tags:
         dc.l      NP_Cli,-1
         dc.l      NP_StackSize,65536
         dc.l      NP_Seglist
seglist:
         ds.l      1
         dc.l      NP_Arguments
args:
         dc.l      cl
         dc.l      0,0
filename:
         dc.b      "wing.english",0
cl:
         dc.b      "h0",$a,0
cle:
         even
;fe
;fs "_Patch"
_Patch:
         move.l    (a5),a4
         add.l     a4,a4
         add.l     a4,a4
         move.b    #3,$7e3b+4(a4)      ; Patch joystick
         lea       $28ca(a4),a2
         addq.l    #4,a5

         lea       $30000(a5),a4
         lea       $1844(a4),a0
         move.l    a0,_bluop
         move.l    $4aa6(a4),_NearPtr

         move.b    #$2c,$3862(a4)       ;
         move.b    #$6e,$3867(a4)       ; Correction de plusieurs bugs
         move.l    #$203c0000,$386c(a4) ; trčs cons pour pouvoir tourner sur
         move.l    #$01004e71,$3870(a4) ; 1200 + fast
         move.b    #$bc,$3bcb(a4)       ;

         move.b    #$60,$1fca(a4)                ;
         move.w    #$4ef9,$2028(a4)              ;
         move.l    #_ChunkyToPlanar,$202a(a4)    ; Remplacement de la
         lea       $1ff8(a4),a3                  ; routine de c2p par une
         add.w     (a3),a3                       ; vraie
         move.l    a3,_BufSwitch                 ;
         move.l    #$4e714e71,$1ff6(a4)          ;

         lea       $1f000(a5),a4
         move.w    #$17,$e40(a4)
         move.w    #$4eb9,$dfa(a4)
         move.l    #Cred,$dfc(a4)
         move.w    #$4e71,$e00(a4)

         lea       NewCredz,a1
         move.l    (a2)+,(a1)+
         addq.l    #4,a2
         move.l    #MyCred0,(a1)+
         move.l    #MyCred00,(a1)+
         moveq     #$f,d0
.CLoop:
         move.l    (a2)+,(a1)+
         dbf       d0,.CLoop
         move.l    #MyCred1,(a1)+
         move.l    #MyCred2,(a1)+
         move.l    #MyCred3,(a1)+
         move.l    #MyCred4,(a1)+
         rts
;fe

         section   coin,CODE
*
* ChunkyToPlanar conversion routine - 256 color version
* ©1997, CdBS Software (MORB)
*
_bluop:
         ds.l      1
;fs "_ChunkyToPlanar"
ChunkySize         = 320*200
_WorkOutputBuffer:
         dc.l      _OutputBuffer1
_BlitOutputBuffer:
         dc.l      _OutputBuffer2

_ChunkyToPlanar:
         movem.l   d0-7/a0-6,-(a7)

         move.l    $8f00000,a2
         move.l    a2,$8f00004
         move.l    a0,$8f00000
;         ;move.l    #_Cky1,$8f00004
;
;         cmp.l     a0,a2
;         beq.s     .ouin
.aha:
;         move.w    #$ff0,$dff180
;         btst      #6,$bfe001
;         bne.s     .aha
.ouin:

         ext.l     d2

         move.l    a4,-(a7)
         move.l    a1,-(a7)

         ;lea       _Cky1,a0

         move.l    _WorkOutputBuffer,a1
         lea       $f0f0f0f0,a4
         lea       $cccc3333,a5
         lea       $ff00ff00,a6

         move.w    d0,d6
         lsr.w     #4,d6
         mulu      d3,d6
         movem.l   d2/d6,-(a7)
         subq.w    #1,d6

         ;move.l    #ChunkySize/16-1,d6
.Wait2:
         ;move.w    #$ff0,$dff180
         ;tst.b     _Busy(pc)
         ;bne.s     .Wait2

         move.l    a0,a2
         move.l    _LastCkyBuffer,a3
         move.l    a3,d7
         move.l    a3,_CurrentCkyBuffer
         move.l    a0,_LastCkyBuffer


.Loop:
         cmp.l     (a2)+,(a3)+
         bne.s     .TasVuHéCestUneKineutonJenAvaisJamaisVue
         cmp.l     (a2)+,(a3)+
         bne.s     .TasVuHéCestUneKineutonJenAvaisJamaisVue
         cmp.l     (a2)+,(a3)+
         bne.s     .TasVuHéCestUneKineutonJenAvaisJamaisVue
         cmp.l     (a2)+,(a3)+
         bne.s     .TasVuHéCestUneKineutonJenAvaisJamaisVue
         move.l    a2,a0
         move.l    a3,d7
         add.l     #16,d7
         lea       16(a1),a1
         bra.s     .EtDePrčsTuLasVueDePrčsVaVoirDePrčs
.TasVuHéCestUneKineutonJenAvaisJamaisVue:
         move.l    d7,a3

         move.l    a4,d7
         move.l    (a0),d0
         move.l    d0,d1
         and.l     d7,d0
         eor.l     d0,d1
         move.l    4(a0),d2
         move.l    d2,d3
         and.l     d7,d2
         eor.l     d2,d3
         lsr.l     #4,d2
         or.l      d2,d0
         lsl.l     #4,d1
         or.l      d1,d3

         move.l    8(a0),d1
         move.l    d1,d2
         and.l     d7,d1
         eor.l     d1,d2
         move.l    12(a0),d4
         move.l    d4,d5
         and.l     d7,d4
         eor.l     d4,d5
         lsr.l     #4,d4
         or.l      d4,d1
         lsl.l     #4,d2
         or.l      d2,d5

         move.l    a5,d7

         move.l    d0,d2
         and.l     d7,d0
         eor.l     d0,d2
         lsr.w     #2,d2
         swap      d2
         lsl.w     #2,d2
         or.l      d2,d0

         move.l    d3,d2
         and.l     d7,d3
         eor.l     d3,d2
         lsr.w     #2,d2
         swap      d2
         lsl.w     #2,d2
         or.l      d2,d3

         move.l    d1,d2
         and.l     d7,d1
         eor.l     d1,d2
         lsr.w     #2,d2
         swap      d2
         lsl.w     #2,d2
         or.l      d2,d1

         move.l    d5,d2
         and.l     d7,d5
         eor.l     d5,d2
         lsr.w     #2,d2
         swap      d2
         lsl.w     #2,d2
         or.l      d2,d5

         move.l    a6,d7

         move.l    d0,d2
         and.l     d7,d0
         eor.l     d0,d2
         move.l    d1,d4
         and.l     d7,d1
         eor.l     d1,d4
         lsr.l     #8,d1
         or.l      d1,d0
         move.l    d0,(a1)+
         lsl.l     #8,d2
         or.l      d2,d4
         move.l    d4,(a1)+

         move.l    d3,d2
         and.l     d7,d3
         eor.l     d3,d2
         move.l    d5,d4
         and.l     d7,d5
         eor.l     d5,d4
         lsr.l     #8,d5
         or.l      d5,d3
         move.l    d3,(a1)+
         lsl.l     #8,d2
         or.l      d2,d4
         move.l    d4,(a1)+

         lea       16(a0),a0
         move.l    a0,a2
.EtDePrčsTuLasVueDePrčsVaVoirDePrčs:
         dbf       d6,.Loop

         move.w    #$c040,$dff09a
         move.w    #$8300,$dff096
.Wait:
         ;move.w    #$ff0,$dff180
         tst.b     _Busy(pc)
         bne.s     .Wait

         st        _Busy

         move.l    _WorkOutputBuffer,a2
         move.l    _BlitOutputBuffer,_WorkOutputBuffer
         move.l    a2,_BlitOutputBuffer
         lea       DestPtr(pc),a3
         lea       SrcInc(pc),a6
         lea       DestOfst(pc),a1
         movem.l   (a7)+,d2/d5

         ;move.l    d2,$8f00000
         move.l    a3,a5
         moveq     #6,d3
.Glou:
         move.l    d2,d7
         muls      (a1)+,d7
         move.l    d7,(a5)+
         dbf       d3,.Glou
         move.l    d2,d7
         muls      (a1)+,d7
         addq.l    #2,d7
         move.l    d7,(a5)+

         move.l    (a7)+,a5
         move.l    a5,d6
         moveq     #5,d7
         moveq     #0,d2
         moveq     #0,d3
         move.l    #$0de41000,d4
         lea       BlitRegs(pc),a1


         movem.l   d0-6/a2-6,(a1)

         move.l    (a7)+,a4
         ;move.l    #-1,-$3b0(a4)
         move.l    -$30a(a4),a6
         lea       BltNode(pc),a1
         CALL      QBlit
         lea       BltNode2(pc),a1
         CALL      QBlit
         lea       BltNode3(pc),a1
         CALL      QBlit
         lea       BltNode4(pc),a1
         CALL      QBlit
         lea       BltNode5(pc),a1
         CALL      QBlit
         lea       BltNode6(pc),a1
         CALL      QBlit
         lea       BltNode7(pc),a1
         CALL      QBlit
         lea       BltNode8(pc),a1
         CALL      QBlit

         ;btst      #2,$dff016
         ;bne.s     .pum

.a:
         ;move.w    $dff006,$dff180
         ;btst      #2,$dff016
         ;beq.s     .a
         move.l    -$3ac(a4),a0
         move.l    _CurrentCkyBuffer,d0
         move.l    d0,$1958(a4)
         move.l    d0,$1978(a4)
         move.l    d0,$1132(a4)
         move.l    _bluop,a0
         pea       $1954(a4)
         jsr       (a0)
         addq.l    #4,a7

         ;move.w    #0,-$598(a4)
         ;move.l    a0,-$8d6(a4)
         ;move.l    a0,-$438(a4)
         ;lea       -$438(a4),a1
         ;move.l    -$444(a4),d1
         ;moveq     #$f,d0
.gu:
         ;move.l    a0,(a1)+
         ;add.l     d1,a0
         ;dbf       d0,.gu
.pum:

         movem.l   (a7)+,d0-7/a0-6
         rts
_CleanUp:
         sf        _Busy

         movem.l   d0-7/a0-6,-(a7)
         move.l    _NearPtr(pc),a4
         move.l    _BufSwitch(pc),a0
         jsr       (a0)
         movem.l   (a7)+,d0-7/a0-6

         rts
BP       = 40*200
SrcInc:
         dc.l      0,2,0,6,0,2,0,6
DestPtr:
         ds.l      8
DestOfst:
         dc.w      7,-3,1,-3,1,-3,1,5

_LastCkyBuffer:
         dc.l      _Cky1
_CurrentCkyBuffer:
         dc.l      0

_Busy:
         ds.w      1

_BufSwitch:
         ds.l      1
_NearPtr:
         ds.l      1

BltNode:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode2:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode3:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode4:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode5:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode6:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode7:
         dc.l      0,_C2pBlit
         dc.b      0,0
         dc.w      0,0
         dc.l      0
BltNode8:
         dc.l      0,_C2pBlit
         dc.b      CLEANME,0
         dc.w      0,0
         dc.l      _CleanUp

BlitRegs:
         ds.l      13

_C2pBlit:
         ;move.w    $dff006,$dff180
         ;btst      #7,$bfe001
         ;bne.s     _C2pBlit
.gna:
         ;move.w    #$f00,$dff180
         ;btst      #7,$bfe001
         ;beq.s     .gna

         movem.l   d1-7/a0-6,-(a7)
         lea       BlitRegs(pc),a1
         movem.l   (a1),d0-6/a2-6
         lea       $dff040,a0

         add.l     (a6)+,a2
         move.l    d4,(a0)+
         moveq     #-1,d1
         move.l    d1,(a0)+
         addq.l    #4,a0
         lea       4(a2,d2.w),a4
         move.l    a4,(a0)+
         lea       (a2),a4
         move.l    a4,(a0)+
         add.l     (a3)+,a5
         lea       (a5,d3.w),a4
         move.l    a4,(a0)+
         lea       10(a0),a4
         addq.l    #4,a0
         move.w    #14,(a4)+
         move.w    #14,(a4)+
         move.w    #0,(a4)+
         addq.l    #8,a4
         move.w    #$aaaa,(a4)
         addq.l    #6,a4
         move.w    d5,(a0)+
         ;move.w    #1,(a0)+
         move.w    #1,(a0)

         eor.w     #-16,d2
         eor.l     #-2,d3
         eor.l     #$f0001000,d4
         eor.b     #1,d5

         movem.l   d0-6/a2-6,(a1)

         ;moveq     #-1,d0
         ;tst.l     (a6)
         ;bpl.s     .Ok
         moveq     #0,d0
         ;move.b    #CLEANME,Cln
.Ok:

         movem.l   (a7)+,d1-7/a0-6
         rts





_C2pBlitHook:
         move.l    a0,d1
         ;lea       BpPtrs+18,a1
         moveq     #7,d0
.Loop:
         swap      d1
         move.w    d1,(a1)
         addq.l    #4,a1
         swap      d1
         move.w    d1,(a1)
         addq.l    #4,a1
         add.l     #40*100,d1
         dbf       d0,.Loop
         rts
;fe
;fs "Cred"
Cred:
         lea       NewCredz,a0
         move.l    (a7),-(a7)
         move.l    (a0,d0.l),4(a7)
         rts
MyCred0:
         dc.b      "Destroyed",$a
         dc.b      "by",$a
         dc.b      "Nick Pelling",0
MyCred00:
         dc.b      "Enhanced",$a
         dc.b      "by",$a
         dc.b      "CdBS Software",0
MyCred1:
         dc.b      "Many lame bugs",$a
         dc.b      "by",$a
         dc.b      "Nick Pelling",0
MyCred2:
         dc.b      "Very sloooow",$a
         dc.b      "chunky routine",$a
         dc.b      "by",$a
         dc.b      "Nick Pelling",0
MyCred3:
         dc.b      "Various fixes",$a
         dc.b      "by",$a
         dc.b      "CdBS Software",0
MyCred4:
         dc.b      "Chunky routine",$a
         dc.b      "replacement",$a
         dc.b      "by",$a
         dc.b      "CdBS Software",0
NewCredz:
         ds.l      23
;fe

         section   poupouf,BSS
_Cky1:
         ds.b      320*200
_Cky2:
         ds.b      320*200

         section   paf,BSS_C
_OutputBuffer1:
         ds.b      320*200
_OutputBuffer2:
         ds.b      320*200

         END
