        ORG     100H

JMP     START

CURRENTPAGE     DB      0
ACTIVEPAGE      DB      0
VISUALPAGE      DB      0

SEED            DD      0
A               DD      214013
C               DD      2531011
M               DD      0

X1              DW      0
Y1              DW      0
X2              DW      0
Y2              DW      0
COLOR           DB      0

CRX             DW      0
CRY             DW      0
XI              DW      0
YI              DW      0
DFX             DW      0
DFY             DW      0
TDX             DW      0
TDY             DW      0
TDXAE           DW      0
TDYAE           DW      0


START:
        CALL    RANDOMIZE

        MOV     AL,0DH
        CALL    SETMODE

        CALL    CLEARSCREEN


        MOV     [M],319
        CALL    RANDOM
        MOV     [X1],AX
        MOV     [M],199
        CALL    RANDOM
        MOV     [Y1],AX

START100:

        MOV     [M],319
        CALL    RANDOM
        MOV     [X2],AX
        MOV     [M],199
        CALL    RANDOM
        MOV     [Y2],AX
        MOV     [M],15
        CALL    RANDOM
        INC     AL
        MOV     [COLOR],AL
        CALL    LINE


        MOV     AX,[X2]
        MOV     [X1],AX
        MOV     AX,[Y2]
        MOV     [Y1],AX


        CALL    KBHIT
        JZ      START100

        MOV     AL,03H
        CALL    SETMODE

        RET



DELAY:
        ; CX:DX <- MICRO SECONDS
        MOV     AH,86H
        INT     15H
        RET



SETMODE:
        ; AL <- MODE
        MOV     AH,00H
        INT     10H
        RET



CLEARSCREEN:
        ; AL <- LINES
        ; BH <- ATTRIB
        ; CX <- FROM ROW COL
        ; DX <- TO ROW COL
        MOV     AH,06H
        MOV     AL,00H
        MOV     BH,00H
        MOV     CX,0000H
        MOV     DX,1928H
        INT     10H
        RET



PUTPIXEL:
        ; AL <- COLOR
        ; BH <- PAGE
        ; CX <- COL
        ; DX <- ROW
        MOV     AH,0CH
        INT     10H
        RET



SETVISUALPAGE:
        ; AL <- PAGE
        MOV     AH,05H
        INT     10H
        RET



FLIPSCREEN:
        MOV     AL,[CURRENTPAGE]
        MOV     [ACTIVEPAGE],AL
        MOV     AL,1
        SUB     AL,[CURRENTPAGE]
        MOV     [CURRENTPAGE],AL
        MOV     [VISUALPAGE],AL
        CALL    SETVISUALPAGE
        RET



KBHIT:
        ; ZF -> SET IF NO KEYSTROKE AVAILABLE
        ; ZF -> CLEAR IF KEYSTROKE AVAILABLE
        MOV     AH,01H
        INT     16H
        RET



RANDOMIZE:
        RDTSC
        MOV     [SEED],EAX
        RET



RANDOM:
        PUSH    EDX
        MOV     EDX,0
        MOV     EAX,[SEED]
        MUL     [A]
        ADD     EAX,[C]
        MOV     [SEED],EAX
        MOV     EDX,0
        DIV     [M]
        MOV     EAX,EDX
        POP     EDX
        RET



LINE:
        MOV     AX,[X2]
        SUB     AX,[X1]
        MOV     [DFX],AX

        MOV     AX,[Y2]
        SUB     AX,[Y1]
        MOV     [DFY],AX

        MOV     AX,[DFX]
        ADD     AX,[DFX]
        MOV     [TDX],AX

        MOV     AX,[DFY]
        ADD     AX,[DFY]
        MOV     [TDY],AX

        MOV     AX,[X1]
        MOV     [CRX],AX

        MOV     AX,[Y1]
        MOV     [CRY],AX

        MOV     [XI],1
        MOV     [YI],1

        MOV     AX,[DFX]
        CMP     AX,0
        JGE     LINE100
        MOV     [XI],-1
        NEG     [DFX]
        NEG     [TDX]

LINE100:
        MOV     AX,[DFY]
        CMP     AX,0
        JGE     LINE200
        MOV     [YI],-1
        NEG     [DFY]
        NEG     [TDY]

LINE200:
        MOV     AL,[COLOR]
        MOV     BH,[ACTIVEPAGE]
        MOV     CX,[X1]
        MOV     DX,[Y1]
        CALL    PUTPIXEL


        MOV     CX,0000F
        MOV     DX,0001F
        CALL    DELAY


        MOV     AX,[DFX]
        CMP     AX,0
        JNE     LINE300
        MOV     AX,[DFY]
        CMP     AX,0
        JNE     LINE300
        JMP     LINE1000        
LINE300:
        MOV     AX,[DFY]
        CMP     AX,[DFX]
        JG      LINE400
        MOV     [TDXAE],0
LINE310:
        MOV     AX,[CRX]
        ADD     AX,[XI]
        MOV     [CRX],AX

        MOV     AX,[TDXAE]
        ADD     AX,[TDY]
        MOV     [TDXAE],AX

        CMP     AX,[DFX]
        JLE     LINE320

        MOV     AX,[CRY]
        ADD     AX,[YI]
        MOV     [CRY],AX

        MOV     AX,[TDXAE]
        SUB     AX,[TDX]
        MOV     [TDXAE],AX
LINE320:
        MOV     AL,[COLOR]
        MOV     BH,[ACTIVEPAGE]
        MOV     CX,[CRX]
        MOV     DX,[CRY]
        CALL    PUTPIXEL


        MOV     CX,0000F
        MOV     DX,0001F
        CALL    DELAY


        MOV     AX,[CRX]
        CMP     AX,[X2]
        JNE     LINE310
        JMP     LINE1000
LINE400:
        MOV     [TDYAE],0
LINE410:
        MOV     AX,[CRY]
        ADD     AX,[YI]
        MOV     [CRY],AX

        MOV     AX,[TDYAE]
        ADD     AX,[TDX]
        MOV     [TDYAE],AX

        CMP     AX,[DFY]
        JLE     LINE420

        MOV     AX,[CRX]
        ADD     AX,[XI]
        MOV     [CRX],AX

        MOV     AX,[TDYAE]
        SUB     AX,[TDY]
        MOV     [TDYAE],AX
LINE420:
        MOV     AL,[COLOR]
        MOV     BH,[ACTIVEPAGE]
        MOV     CX,[CRX]
        MOV     DX,[CRY]
        CALL    PUTPIXEL


        MOV     CX,0000F
        MOV     DX,0001F
        CALL    DELAY


        MOV     AX,[CRY]
        CMP     AX,[Y2]
        JNE     LINE410

LINE1000:
        RET

