Metropoli BBS
VIEWER: test.asm MODE: TEXT (CP437)
    DOSSEG
    .MODEL SMALL
    .STACK 200h
    .CODE
    .386
    ASSUME CS:@CODE, DS:@CODE
    Locals
    Ideal
────────────────────────────────────────────────────────────────────────────
CsSeg       dw  ?

ScreenWidth =   400

INCLUDE "Modex.inc"

VLAsig      db  "oooooooooooooooooo",1
            db  "o                o",1
            db  "o x   x x    xx  o",1
            db  "o x   x x   x  x o",1
            db  "o  x x  x   xxxx o",1
            db  "o  x x  x   x  x o",1
            db  "o   x   xxx x  x o",1
            db  "o                o",1
            db  "oooooooooooooooooo",0

Roff        dw  0
Boff        dw  0
Goff        dw  0
Rvel        =   6
Bvel        =   3
Gvel        =   -3

INCLUDE "DaPal.DB"
────────────────────────────────────────────────────────────────────────────
    ;can you guess what this does?
PROC WriteSig
    push    es ds
    pusha
    
    mov     ah,1111b    ;latch in all 4 planes
    @Set_Write_Plane

    mov     ds,[cs:CSseg]
    mov     es,[VGAseg]

    mov     bp,30
    imul    bp,ScreenWidth/4
    add     bp,10
    mov     si,offset VLAsig
    mov     di,bp
@@DaLoop:
    mov     cl,[si]
    inc     si
    or      cl,cl
    je      @@AllDone
    dec     cl
    je      @@NextLine
    sub     cl," "-1

    mov     [es:di],cl
    mov     [es:di + ScreenWidth/4 * 2],cl
    mov     [es:di + ScreenWidth/4],cl
    mov     [es:di + ScreenWidth/4 * 3],cl
    inc     di
    jmp     @@DaLoop
@@NextLine:
    add     bp,ScreenWidth/4 * 4
    mov     di,bp
    jmp     @@DaLoop

@@AllDone:
    popa
    pop     ds es
    ret
ENDP WriteSig

    ;fills the screen w/ the palette
PROC WriteJunk
    push    es ds
    pusha

    mov     es,[cs:VGASeg]
    mov     di,0
    mov     cx,80
    mov     ax,2
    cld
    mov     bp,ScreenWidth
    shr     bp,2
@@Fw:
    mov     cx,bp
    push    ax

@@fff:
    stosb
    inc     al
    dec     cx
    jne     @@fff

    pop     ax
    inc     ax
    cmp     ax,480
    jb      @@Fw

    popa
    pop     ds es
    ret
ENDP WriteJunk

PROC WierdPal
    push    ds
    pusha 

    mov     ds,[cs:CSseg]
    mov     dx,3c8h
    xor     al,al
    out     dx,al
    inc     dx

    mov     si,[Roff]
    mov     di,[Goff]
    mov     bx,[Boff]
    mov     cx,256
@@DaLoop:
    mov     al,[Palette + si]
    out     dx,al
    mov     al,[Palette + di+1]
    out     dx,al
    mov     al,[Palette + bx+2]
    out     dx,al
    add     si,3
    add     di,3
    add     bx,3
    dec     cx
    jne     @@DaLoop

    add     [Roff],Rvel
    cmp     [Roff],768
    jl      @@Rok
    sub     [Roff],768
@@Rok:
    cmp     [Roff],0
    jge     @@Rok2
    add     [Roff],768
@@Rok2:

    add     [Boff],Bvel
    cmp     [Boff],768
    jl      @@Bok
    sub     [Boff],768
@@Bok:
    cmp     [Boff],0
    jge     @@Bok2
    add     [Boff],768
@@Bok2:

    add     [Goff],Gvel
    cmp     [Goff],768
    jl      @@Gok
    sub     [Goff],768
@@Gok:
    cmp     [Goff],0
    jge     @@Gok2
    add     [Goff],768
@@Gok2:

    popa
    pop     ds
    ret
ENDP

────────────────────────────────────────────────────────────────────────────
START:
    mov     [cs:CsSeg],cs
    mov     ds,[cs:CsSeg]
    
    @SetModeX m256x240x256,ScreenWidth;m360x480x256,ScreenWidth

    mov     cx,256
    mov     ah,0
    mov     si,offset Palette
    @WritePalette

    mov     ah,1111b    ;latch in all 4 planes
    @Set_Write_Plane

    call    WriteJunk
    call    WriteSig

    mov     bx,0
    mov     bp,1
@@ScanLoop:
    @FullVertWait
    @Set_Split
    @Set_Start_Offset
    call    WierdPal

    mov     ah,1
    int     16h
    jnz     KeyPress

    add     bx,bp
    cmp     bx,[ModeXScanLines]
    jle     @@NotOver480
    neg     bp
    mov     bx,[ModeXScanLines]
@@NotOver480:
    cmp     bx,1
    jge     @@ScanLoop
    neg     bp
    mov     bx,1
    jmp     @@ScanLoop

KeyPress:
    mov     ah,0
    int     16h         ;get or wait for keypress 
    mov     ax,3        
    int     10h         ;set 80x25x16 text mode
    mov     ax,4c00h
    int     21h         ;return control to DOS
END START
[ RETURN TO DIRECTORY ]