;These signs are at you disposal in the text: a to z ( ) ! , . ' - * & "
;Remember you can only write in lower case when you are using a to z.
;You can write as much as you wish in the text below. Just remember to end
;the text with db 0 as showed!    Or else the text won't wrap around!
;-------------------------------------------------------------------------------
SinusLength     equ     (128*2)*2     ;Don't alter any of these data!
Source          equ     320*106+8     ;As the loader would fuck up!
Source2         equ     320*124+8     ;
Step            equ     5             ;

                .model  small         ;
                dosseg                ;

                .data
;-------------------------------------------------------------------------------
Text            label   byte
                db      '   international network of crackers!   '
                db      'we bring you yet another quality release'
                db      '----------------------------------------'
                db      '  ** use this version of the loader **  '
                db      '     i have removed all known bugs!     '
                db      ' and all data is collected in one file! '
                db      '                                        '
                db      0     ;Marks end of text. DON'T FORGET!
;-------------------------------------------------------------------------------
EndMessage      db      '(C) The International Network of Crackers 1992!',10,10,13
                db      'All programming by Xerox!',10,13
                db      'Original music by Drax of the Vibrants!',10,13
                db      'Adlib player & conversion by Jch of the Vibrants!',10,10,13,24h
;-------------------------------------------------------------------------------
StartText       dw      0
Delay2          db      0
Pause           dw      0
First           dw      0
ColVar          db      9
Check           db      2
Fade            db      0
_Si             dw      0
_Di             dw      0
Ditto1          dw      0
Ditto2          dw      0
;-------------------------------------------------------------------------------
LetterTabel     dw      Source+(16*00),Source+(16*01),Source+(16*02),Source+(16*03),Source+(16*04),Source+(16*05),Source+(16*06),Source+(16*07),Source+(16*08),Source+(16*09),Source+(16*10),Source+(16*11),Source+(16*12),Source+(16*13),Source+(16*14),Source+(16*15),Source+(16*16),Source+(16*17),Source+(16*18)
                dw      Source2+(16*00),Source2+(16*01),Source2+(16*02),Source2+(16*03),Source2+(16*04),Source2+(16*05),Source2+(16*06),Source2+(16*07),Source2+(16*08),Source2+(16*09),Source2+(16*10),Source2+(16*11),Source2+(16*12),Source2+(16*13),Source2+(16*14),Source2+(16*15),Source2+(16*16),Source2+(16*17),Source2+(16*18)
;-------------------------------------------------------------------------------
SinusVar        db      0,0,0,0,0,0,0,0,0,0
                db      0,0,0,0,0,0,0,0,0,0
                db      0,0,0,0,0,0,0,0,0,0
                db      0,0,0,0,0,0,0,0,0,0

SinusData       dw      0,0,0,0,0,0,0,0,0,0
                dw      0,0,0,0,0,0,0,0,0,0
                dw      0,0,0,0,0,0,0,0,0,0
                dw      0,0,0,0,0,0,0,0,0,0
;-------------------------------------------------------------------------------
DataFile        db      'datafile.inc',0
;-------------------------------------------------------------------------------
UnpackedPicSeg  dw      0
MusicSegment    dw      0
;-------------------------------------------------------------------------------
Rgb1            db      0
Rgb2            db      0
Rgb3            db      0

PaletteData     Label byte
                db      00,00,00,51,51,59,35,35,47,23,23,43,19,19,47,07,11,31,03,03,27,00,00,19,59,59,59,59,59,55,59,59,51,59,59,47,59,59,43,59,59,39,59,59,35,59,59,31,59,59,27,59,55,23,55,51,23,55,47,19,51,43,19,51,39,15,51,35,15,47,31,11
                db      47,31,11,47,27,07,43,23,07,39,19,03,35,15,03,31,15,03,27,11,00,23,07,00,63,00,00,59,00,00,55,00,00,51,00,00,48,00,00,47,00,00,43,00,00,39,00,00,38,00,00,34,00,00,31,00,00,27,00,00,23,00,00,22,00,00,19,00,00,14,00,00
                db      63,52,52,63,44,44,63,39,39,63,31,31,63,23,23,63,15,15,63,07,07,63,00,00,63,42,23,63,38,15,63,34,07,63,30,00,55,27,00,51,23,00,43,21,00,39,19,00,63,63,52,63,63,44,63,63,39,63,63,31,63,60,23,63,59,15,63,59,07,63,59,00
                db      55,52,00,51,47,00,43,43,00,39,39,00,31,31,00,27,27,00,22,21,00,15,15,00,51,63,23,47,63,15,43,63,07,39,63,00,35,55,00,31,51,00,27,43,00,23,39,00,52,63,52,47,63,44,39,63,39,31,63,31,23,63,23,15,63,15,07,63,07,00,63,00
                db      00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
                db      00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
                db      00,00,11,00,00,11,00,00,11,00,00,11,00,00,11,00,00,11,00,00,11,00,00,13,00,00,13,00,00,13,00,00,13,00,00,14,00,00,14,00,00,14,00,00,14,00,00,15,59,52,63,55,44,63,52,39,63,51,31,63,48,23,63,47,15,63,43,07,63,42,00,63
                db      38,00,55,31,00,51,27,00,43,23,00,39,19,00,31,17,00,27,13,00,22,10,00,15,63,52,63,63,44,63,63,39,63,63,31,63,63,23,63,63,15,63,63,07,63,63,00,63,55,00,55,48,00,51,43,00,43,39,00,39,31,00,31,27,00,27,22,00,22,15,00,15
                db      63,56,55,63,55,51,63,52,47,63,51,47,63,51,43,63,47,39,63,47,39,63,44,35,63,43,31,63,39,27,63,39,23,59,35,23,56,35,22,55,34,21,51,31,19,48,31,19,47,30,18,43,27,17,42,26,15,39,23,15,39,23,14,35,23,13,34,22,11,31,19,11
                db      27,19,10,27,18,09,23,15,07,21,15,07,18,14,06,15,11,06,14,11,05,10,07,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,47,10,10,47,19,10,47,27,10,47,39,10,47,47,10,39,47,10,27,47,10,19,47,10
                db      10,47,11,10,47,23,10,47,34,10,47,43,10,42,47,10,31,47,10,19,47,11,10,47,22,10,47,31,10,47,43,10,47,47,10,43,47,10,31,47,10,21,47,10,10,63,63,63
;-------------------------------------------------------------------------------
Sinus1          DW      36,38,40,41,43,45,46,48,49,51,52,54,55,57,58,59,60,62,63,64,65,65,66,67,67,68,68,69,69,69,69,69,69,69,69,69,68,68,67,67,66,65,65,64,63,62,60,59,58,57,55,54,52,51,49,48,46,45,43,41,40,38,36,34,33,31,29,28,26,24,23,21,20,18,17,15,14,12,11,10,9,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,4,5,6,7,9,10,11,12,14,15,17,18,20,21,23,24,26,28,29,31,33,34
                DW      36,38,40,41,43,45,46,48,49,51,52,54,55,57,58,59,60,62,63,64,65,65,66,67,67,68,68,69,69,69,69,69,69,69,69,69,68,68,67,67,66,65,65,64,63,62,60,59,58,57,55,54,52,51,49,48,46,45,43,41,40,38,36,34,33,31,29,28,26,24,23,21,20,18,17,15,14,12,11,10,9,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,4,5,6,7,9,10,11,12,14,15,17,18,20,21,23,24,26,28,29,31,33,34,36
;-------------------------------------------------------------------------------
StartPos        dw      320*101
EndPos          dw      320*10
Antal           dw      0
Book            dw      90
;-------------------------------------------------------------------------------
SetError7       db      'Allocation error: '
                db      'Memory control blocks destroyed.$'
SetError8       db      'Allocation error: '
                db      'Insufficient memory.$'
SetError9       db      'Allocation error: '
                db      'Invalid memory block adress.$'

SetUnknown      db      'Unknown allocation error.$'


DataBuffer      db      20786 dup (0)



                .code
                .286

Player:         ret
                db      9ah,0,0
Music           dw      0
                ret
;-------------------------------------------------------------------------------
Start:          mov     ax,@data
                mov     ds,ax
                call    Reserve    ;Allocate memory needed
                call    Setup      ;precalculate data & etc.
;-------------------------------------------------------------------------------
Main:           call    Waitraster

                call    Dycp

                mov     ah,3                 ;Play music
                call    Player

                mov     cx,8                 ;Put INC logo onto screen!
Network:        push    cx
                call    LogoShower
                pop     cx
                loop    Network

                mov     ah,1                 ;Check for keypress
                int     16h
                je      Main
                mov     ah,0
                int     16h                  ;End main
;-------------------------------------------------------------------------------
Terminate:      call    ClearInit

                mov     es,UnpackedPicSeg
                call    Deallocate

                mov     ax,3                ;Switch to normal graphics!
                int     10h
                mov     ah,9                ;Write EndMessage to screen
                lea     dx,EndMessage
                int     21h
                mov     ax,4c00h            ;Terminate program! Return to dos!
                int     21h
;-------------------------------------------------------------------------------
DepackPicture:  mov     es,UnpackedPicSeg
                mov     ax,@data
                mov     ds,ax

                lea     si,DataBuffer
                add     SI,3883            ;After player+data
                MOV     DI,0
                MOV     CX,200
                mov     al,0
                MOV     BP,320
                MOV     BX,0
                MOV     DX,8
                PUSH    AX
                MOV     AX,BP
                AND     AX,7
                SHR     BP,3
                CMP     AX,0
                JE      ax_0
                MOV     AX,1
ax_0:           ADD     BP,AX
                SHR     BX,3
                POP     AX
                push    cx
                mov     cl,al
                mov     al,1
                shl     al,cl
                MOV     AH,AL
                NOT     AH
                pop     cx
Depackl1:       PUSH    CX
                PUSH    AX
                MOV     CX,DX
Planes:         PUSH    CX
                PUSH    DI
                PUSH    BP
NotherOne:      XOR     CX,CX
                MOV     CL,DS:[SI]
                INC     SI
                CMP     CL,127
                JA      CrunchyNut
                INC     CX
                SUB     BP,CX
                push    bx
PutByte:        mov     bl,ds:[si]
                inc     si
                push    cx
                mov     cx,8
orpixel:        rcl     bl,1
                jc      carry_set
                and     es:[di],ah
                jmp     set_done
carry_set:      or      es:[di],al
set_done:       inc     di
                loop    orpixel
                pop     cx
                LOOP    PutByte
                pop     bx
                JMP     LineOk
CrunchyNut:     SUB     CX,257
                NEG     CX
                SUB     BP,CX
                push    bx
                mov     bl,ds:[si]
                mov     bh,bl
                inc     si
PutByte2:       push    cx
                mov     cx,8
orpixel2:       rcl     bl,1
                jc      carry_set2
                and     es:[di],ah
                jmp     set_done2
carry_set2:     or      es:[di],al
set_done2:      inc     di
                loop    orpixel2
                mov     bl,bh
                pop     cx
                LOOP    PutByte2
                pop     bx
LineOk:         CMP     BP,0
                JNE     NotherOne
                POP     BP
                POP     DI
                POP     CX
                SHL     AL,1
                STC
                RCL     AH,1
                LOOP    Planes
                push    bp
                push    bx
                shl     bp,3
                shl     bx,3
                ADD     DI,BP
                ADD     DI,BX
                pop     bx
                pop     bp
                POP     AX
                POP     CX
                LOOP    Depackl1
                RET

SetVgaPalette:  call    waitraster
                mov     dx,3c8h
                mov     ax,di
                out     dx,al
                inc     dx
                mov     ax,cx
                shl     cx,1
                add     cx,ax
                rep     outsb
                ret
;-------------------------------------------------------------------------------
Reserve:        mov     bx,(110000/16)      ;105 KB needed to run intro!
                call    Setblock

                mov     bx,(5000/16)        ;5 KB for all data
                call    Allocate
                mov     MusicSegment,ax
                mov     Music,ax

                mov     bx,(65000/16)       ;65 KB for the unpacked picture
                call    Allocate
                mov     UnpackedPicSeg,ax
                ret
;-------------------------------------------------------------------------------
SetBlock:       mov     ah,4ah
		int	21h
                jc      SetBlockError
                ret
SetBlockError:
                push    ax
                mov     ax,0003h
                int     10h
                pop     ax

                cmp     ax,7
                jz      Set10
		cmp	ax,8
                jz      Set20
                cmp     ax,9
                jz      Set30
                lea     dx,SetUnknown
                jmp     short SetBlockPrint
Set10:          lea     dx,SetError7
                jmp     short SetBlockPrint
Set20:          lea     dx,SetError8
                jmp     short SetBlockPrint
Set30:          lea     dx,SetError9

SetBlockPrint:  mov     ah,9
     		int	21h
                mov     ax,4c00h
                int     21h

Allocate:       mov     ah,48h
		int	21h
                jc      AllocateError
                ret
AllocateError:
                push    ax
                mov     ax,0003h
                int     10h
                pop     ax

                cmp     ax,7
                jz      Allo10
		cmp	ax,8
                jz      Allo20
                lea     dx,SetUnknown
                jmp     short AllocatePrint
Allo10:         lea     dx,SetError7
                jmp     short AllocatePrint
Allo20:         lea     dx,SetError8

AllocatePrint:  mov     ah,9
     		int	21h
                mov     ax,4c00h
                int     21h

DeAllocate:     mov     ah,49h
		int	21h
                jc      DeAlloError
                ret
DeAlloError:
                push    ax
                mov     ax,0003h
                int     10h
                pop     ax

                cmp     ax,7
                jz      DeA10
                cmp     ax,9
                jz      DeA20
                lea     dx,SetUnknown
                jmp     short DeAlloPrint
DeA10:          lea     dx,SetError7
                jmp     short DeAlloPrint
DeA20:          lea     dx,SetError9

DeAlloPrint:    mov     ah,9
     		int	21h
                mov     ax,4c00h
                int     21h

waitraster:     mov     dx,3dah
ras1:           in      al,dx
                test    al,8
                jnz     ras1
ras2:           in      al,dx
                test    al,8
                jz      ras2
                ret
;-------------------------------------------------------------------------------
LogoShower:     mov     ax,@data
                mov     ds,ax

                cmp     Book,1
                jne     Naah
                ret

Naah:           mov     cx,160
                mov     si,StartPos
                mov     di,EndPos

                mov     ax,@data
                mov     ds,ax
                mov     ds,UnpackedPicSeg
                mov     ax,0a000h
                mov     es,ax
                rep     movsw

                mov     ax,@data
                mov     ds,ax

                mov     ax,Book
                inc     Antal
                cmp     Antal,ax
                jne     Reset1
                dec     Book
                mov     Antal,0
                mov     EndPos,320*9
                sbb     StartPos,320
Reset1:         add     EndPos,320
                ret

Setup:          mov     ax,@data
                mov     ds,ax
                mov     ax,MusicSegment
                mov     es,ax

                mov     cx,3900/2
                lea     si,DataBuffer
                xor     di,di
                rep     movsw


                mov     ah,6        ;Adlib detection
                call    Player
                jc      NoCard

Yes:            mov     Byte ptr player,90h

NoCard:         mov     ax,13h          ;Switch to 320x200 256 colors
                int     10h

                call    ClearInit

;-------------------------------------------------------------------------------
                CALL    DepackPicture

                mov     ax,@data
                mov     ds,ax

                mov     di,0
                mov     cx,256
                lea     si,PaletteData
                call    setvgapalette

                mov     ds,UnpackedPicSeg
                mov     ax,0a000h
                mov     es,ax

                cld
                xor     si,si
                xor     di,di
                mov     cx,160*9
                rep     movsw

                mov     si,(320*191)
                mov     di,(320*191)
                mov     cx,160*9
                rep     movsw

                mov     ax,@data
                mov     ds,ax
                mov     es,ax

                lea     si,Sinus1
                lea     di,Sinus1
                mov     cx,256
Calc:           lodsw
                add     ax,110
                stosw
                loop    Calc

                lea     si,SinusData
                lea     di,SinusData
                mov     cx,40
Calc2:          lodsw
                add     ax,Source-8
                stosw
                loop    Calc2

                lea     si,SinusVar
                lea     di,SinusVar
                mov     cx,40
                mov     bl,0
Calc3:          lodsb
                add     al,bl
                stosb
                add     bl,3
                loop    Calc3

                mov     ax,@data
                mov     ds,ax
                mov     ax,0a000h
                mov     es,ax
                ret
;-------------------------------------------------------------------------------
Dycp:           mov     ax,@data
                mov     ds,ax

Kwon:           mov     Rgb1,0
                mov     Rgb2,0
                mov     Rgb3,0

                cmp     Check,0
                jne     Red
                mov     Rgb2,60
                mov     Rgb3,60
                jmp     Skib1

Red:            cmp     Check,1
                jne     Green
                mov     Rgb2,60
                jmp     Skib1

Green:          mov     Rgb3,60
                mov     Rgb1,60

Skib1:          mov     bl,15*8
                sbb     bl,ColVar

                mov     cx,8
Col2:           mov     dx,3c8h
                mov     al,bl
                out     dx,al
                inc     dx
                nop
                nop
                nop
                nop
                nop
                nop
                mov     al,Rgb1
                out     dx,al
                nop
                nop
                nop
                nop
                nop
                nop
                mov     al,Rgb2
                out     dx,al
                nop
                nop
                nop
                nop
                nop
                nop
                mov     al,Rgb3
                out     dx,al

                cmp     Check,0
                jne     Red2
                sbb     Rgb2,Step
                sbb     Rgb3,Step
                jmp     Skib2
Red2:           cmp     Check,1
                jne     Green2
                sbb     Rgb2,Step
                jmp     Skib2
Green2:         sbb     Rgb3,Step
                sbb     Rgb1,Step
Skib2:

                inc     bl
                loop    col2

                mov     dx,3c8h
                mov     al,bl
                out     dx,al
                inc     dx
                nop
                nop
                nop
                nop
                nop
                nop
                mov     al,0
                out     dx,al
                nop
                nop
                nop
                nop
                nop
                nop
                out     dx,al
                nop
                nop
                nop
                nop
                nop
                nop
                out     dx,al

Wrappie:        xor     di,di
                mov     si,StartText

                mov     cx,40
Trans:          mov     al,Text[si]
                cmp     al,0
                jne     Wrap
                mov     StartText,0
                jmp     Wrappie
Wrap:           xor     ah,ah
                cmp     al,32
                jne     Space
                mov     al,26+97     ;
Space:          cmp     al,'('
                jne     Para1
                mov     al,27+97     ;(
Para1:          cmp     al,')'
                jne     Para2
                mov     al,28+97     ;)
Para2:          cmp     al,'!'
                jne     udrob
                mov     al,29+97     ;!
Udrob:          cmp     al,','
                jne     comma
                mov     al,30+97     ;,
Comma:          cmp     al,'.'
                jne     Punktum
                mov     al,31+97
Punktum:        cmp     al,''''  ;'
                jne     oper
                mov     al,32+97
Oper:           cmp     al,'+'
                jne     Plus
                mov     al,33+97
Plus:           cmp     al,'-'
                jne     Minus
                mov     al,34+97
Minus:          cmp     al,'*'
                jne     Stjerne
                mov     al,35+97
Stjerne:        cmp     al,'&'
                jne     og
                mov     al,36+97
Og:             cmp     al,'"'
                jne     Gose
                mov     al,37+97
Gose:

                sbb     al,97
                shl     ax,1
                mov     bx,ax
                mov     ax,LetterTabel[bx]
                mov     SinusData[di],ax
                inc     si
                add     di,2
                loop    Trans
;-------------------------------------------------------------------------------
                mov     ax,0a000h
                mov     es,ax

                mov     cx,40
Lykke:          push    cx
                xor     bh,bh
                mov     di,_DI
                mov     si,_SI

Testt:          mov     bl,SinusVar[Si]

                shl     bx,1
                mov     ax,320

                mul     Sinus1[bx]
                add     di,ax
                push    di
                mov     di,Ditto1
                inc     SinusVar[di]
                mov     di,Ditto2
                mov     si,SinusData[di]
                pop     di
                mov     ds,UnpackedPicSeg
                mov     cx,12
Husk1:          push    cx
                mov     cx,4
                rep     movsw
                add     si,312
                add     di,312
                pop     cx
                loop    Husk1

                mov     ax,@data
                mov     ds,ax
                add     _Di,8
                add     _Si,1
                add     Ditto1,1
                add     Ditto2,2

                pop     cx
                loop    Lykke

                mov     _si,0
                mov     _di,0
                mov     Ditto1,0
                mov     Ditto2,0

                cmp     First,100
                je      Cool
                inc     First
                ret

Cool:           cmp     Fade,0
                je      Op
                jmp     FadeDown

Op:             inc     Delay2
                cmp     Delay2,7
                je      Now1
                ret

Now1:           mov     Delay2,0
                cmp     ColVar,0
                je      Don1
                dec     Colvar
                ret

Don1:           mov     Pause,0
                mov     Fade,1
                mov     Delay2,0
                ret

FadeDown:       cmp     Pause,400
                je      OkayDown
                inc     Pause
                ret

OkayDown:       inc     Delay2
                cmp     Delay2,7
                je      Down1
                ret

Down1:          mov     Delay2,0
                cmp     ColVar,9
                je      Down2
                inc     ColVar
                ret

Down2:          mov     Delay2,0
                mov     fade,0
                mov     Pause,0
                add     StartText,40
                inc     Check
                cmp     Check,3
                jne     Reset
                mov     Check,0
Reset:          ret

ClearInit:      mov     ah,1            ;Init player
                call    Player
                mov     ax,@data
                mov     ds,ax
                xor     ah,ah
                mov     cx,2125
                mov     bx,MusicSegment
                sub     dl,dl
                call    Player

                mov     ah,2
                xor     bx,bx
                call    Player
                ret

                end     Start
