pouët.net

Go to bottom

lighXTforms by sibCrew

;   lighXTforms - 8088/CGA - 256 bytes - demodulation 2o21
;   -- wbcbz7 z7.lo.zozl
;
;   partysmashed lol
;   greets to everyone and everybody something something fuck fuck aaaaaa
;
;   lxtf.com 	 - cga     version             (tested on original IBM PC 5155)
;   lxtf_ega.com - ega\vga compatible version  
;
;   sound pitch depends on cpu\vram speed, no time to fix this
;
;   also check my MS-DOS demoscene seminar @ https://github.com/wbcbz7/yadm21_seminar
;

        org     0x100
        use16
        
        
; data start address
rdata       equ     0x800

width       equ     40
height      equ     25


sprite      equ     ((rdata     + 255) & ~255)                  ; sprite  location (256 byte align)
paltab      equ     (sprite     + (256*128))
heightmap   equ     (((paltab + 256) + 255) & ~255) 
bumpmap     equ     (heightmap  + (width *(height+2)))
sintab      equ     ((bumpmap    + (width *(height+2)*2) + 255) & ~255)

start:
        ; set mode 0x1 (40x25 color)
        
        ;mov         ah, 0x3
        inc         ax                      ; ax = 0 on startup
        ;mov         al, 0x13
        int         0x10
   
        ; sine table generator (by baze)
        ;xor        bx, bx    ; bx = 0 on startup

        mov         di, sintab
        inc         cx       ; cx = 0x00FF at startup
        mov         bp, 90   ; (512 * A * PI) / 256 = initial derivation
.store  mov         [di], bh
        inc         di
        mov         ax, 40    ; 262144 * (PI / 256)^2
        imul        bx
        add         bx, bp
        sub         bp, dx
        loop        .store
        
spritegen: 
 
        ; sprite generator
        mov         di, sprite
        mov         bx, 128
.yloop:
        mov         ch, (256 >> 8)                  ; cx = 0 from prev loop
.xloop:
        mov         ax, cx
        add         ax, -128
        mul         ax
        mov         bp, ax
        
        lea         ax, [bx-64]
        mul         ax
        inc         ax
        
        ; ax = x^2, dx = y^2
        add         bp, ax
        mov         ax, 0x1300
        cwd
        div         bp
        
        ; ax = 0x7FFF / (x^2 + y^2)
        ;test        ah, ah
        ;jz          .1
        ;mov         al, 0xFF
        
        cmp         ax, 0x7F
        jle         .1
        mov         al, 0x7F
.1:
        
        stosb
        loop        .xloop
    
        dec         bx
        jnz         .yloop
        
        ; bx = cx = 0
        
        ; palette
do_pal:
        mov         si, palette
        ;mov         di, paltab     ; di = paltab
.1:
        mov         cl, [si]
        jcxz        .2
        inc         si
        lodsb       
        rep         stosb
        jnz         .1
.2:
        
        
bumpgen:
        ; "landspace" gen
        ;mov         di, heightmap             ; di = heightmap from prev loop
        push        di
        mov         bl, height+2
.yloop:
        mov         cl, width
.xloop:
        in          al, 0x40
        mul         bx
        and         al, 4
        stosb
        loop        .xloop
        
        dec         bx
        jnz         .yloop
        
       
        pop         si
        
        mov         bp, sprite+((32 << 8) | (64))
difmap:
        mov         dx, height+2 
.yloop:
        mov         cl, width
.xloop:
        lodsb
        sub         al, [si-1-1]
        mov         ah, [si+width-1]
        sub         ah, [si-width-1]
        add         ax, bp
        stosw
        inc         bp
        loop        .xloop
        
        add         bp, (256 - width)
        dec         dx
        jnz         .yloop
        
        ; disable damn cursor
        mov         ah, 1
        mov         ch, 0x20
        int         0x10
        
%ifdef EGAVGA
        ; set high intensity
        mov         ax, 0x1003
        int         0x10
%endif      
      
        ; do the bump!       
        mov         dh, 0xB8            ; DX=0
        mov         es, dx
        xor         di, di
        mov         ch, 0x40
        mov         al, 0xB1
        rep         stosw
        
mainloop:
        push        bp
        
        ; get sintab position
        lea         bx, [bp+32]
        mov         bh, (sintab >> 8)
        add         bl, bl
        mov         ah, [bx]
        add         bl, bh
        add         bl, 0x32
        mov         al, [bx]
        add         ax, (12 << 8) | ((128-width) >> 1)
        mov         si, ax
        
        ; get sintab position
        mov         bx, bp
        mov         bh, (sintab >> 8)
        mov         dh, [bx]
        add         bl, bl
        add         bl, dl                      ; bl += 0xDA
        mov         dl, [bx]
        add         dx, (12 << 8) | ((128-width) >> 1)
        
        cli
        mov         bx, paltab
        mov         sp, bumpmap+width*2
        xor         di, di
        mov         cx, width*height
        
.1:
        ; ax = *bumpmap++;
        ; l = *(ax + disp);
        ; *screen++ = l;

        pop         bp
        mov         al, [bp+si]
        add         bp, dx
        add         al, [bp]
        
        xlatb
        inc         di
        stosb   
        and         al, 0x3
        or          al, 0x40
        out         0x61, al
        loop        .1
        
        pop         bp
        mov         dx, 0x3DA
    ;.retr2:
    ;    in          al, dx
    ;    and         al, 8
    ;    jnz         .retr2    
    .retr1:
        in          al, dx
        and         al, 8
        jz          .retr1

%ifndef EGAVGA
        ; set high intensity
        mov         dl, 0xD8        ; 0x3D8 - CGA mode register
        mov         al, 0x08
        out         dx, al
%endif  
        
        inc         bp
        
        in          al, 0x60
        dec         al
        jnz         mainloop
        
        ;int         0x20
        db          0xCD
        
palette:
%ifdef COMPOSITE
        ; length, color
        db 32, 0x00
        db  9, 0x08
        db  9, 0x09
        db 10, 0x19
        db 12, 0x99
        db 14, 0x9D
        db 18, 0xCC
        db 23 + 1  +128, 0xFF
%else
        ; length, color
        db 32, 0x00
        db  9, 0x08
        db  9, 0x09
        db 10, 0x19
        db 12, 0x99
        db 14, 0x9D
        db 18, 0xCC
        db 23 + 1 +128, 0xFF
%endif        
.count  equ ($ - palette)/2
        db 0
Go to top