First/programs/3d_renderer.asm

137 lines
1.8 KiB
NASM
Raw Normal View History

MOV $0xFF0000,%SP
#Set up vector mode
MOV $0xFFFC,%R4l
MOV $0x00FF,%R4h
MOV $0xFFFF,%R1l
MOV $0xFFFF,%R1h
MOV %R1,(%R4)
MOV $0x0008,%R7l
MOV $0x0000,%R7h #The number of rotate,render itrations
:MAIN_LOOP
PUSH %R7
PUSH %R6
CALL $RENDER
CALL $SPIN
POP %R6
POP %R7
SUB %R6,%R7
JMP,NZ $MAIN_LOOP
HALT
:SPIN
MOV $0x0008,%R2l
MOV $0x0000,%R2h #Constant 8
MOV $0x0004,%R5l
MOV $0x0000,%R5h #Constant 4
MOV $>DATA_START,%R0l
MOV $<DATA_START,%R0h
MOV (%R0),%R7
ADD %R5,%R0 #Load the number of lines
SL %R7 # x2 to get the number of points
MOV $0x3ccc,%R6h
MOV $0xcccd,%R6l #The angle to rotate by
:SPIN_LOOP
#Read in a point R1:x R3:z
MOV (%R0),%R1
ADD %R2,%R0
MOV (%R0),%R3
MOV %R6,%R4
COS %R4
PUSH %R1
FMUL %R4, %R1
MOV %R6,%R4
SIN %R4
FMUL %R3,%R4
FADD %R4,%R1
SUB %R2,%R0
MOV %R1,(%R0)
ADD %R2,%R0
MOV %R6,%R4
SIN %R4
POP %R1
FMUL %R4,%R1
MOV %R6,%R4
COS %R4
FMUL %R4,%R3
FSUB %R1,%R3
MOV %R3,(%R0)
ADD %R5,%R0
DEC %R7
JMP,NZ $SPIN_LOOP
:RENDER
MOV $>DATA_START,%R0l
MOV $<DATA_START,%R0h
MOV $0x000D,%R7l
MOV $0x0000,%R7h
MOV $0x0004,%R5l
MOV $0x0000,%R5h
MOV $0xFFFC,%R4l
MOV $0x00FF,%R4h
MOV $0x0002,%R1l
MOV $0x0000,%R1h #Clear the frame
MOV %R1,(%R4)
MOV (%R0),%R7
ADD %R5,%R0
MOV $0xFFFC,%R4l
MOV $0x00FF,%R4h
MOV $0x3f80,%R6h
MOV $0x0000,%R6l
:RENDER_LOOP
MOV $0xFFFF,%R1l
MOV $0xFFFF,%R1h
MOV %R1,(%R4)
#Read in a point R1:x R2:y R3:z
MOV (%R0),%R1
ADD %R5,%R0
MOV (%R0),%R2
ADD %R5,%R0
MOV (%R0),%R3
ADD %R5,%R0
FSUB %R6,%R1
FSUB %R6,%R2
FADD %R6,%R3
FADD %R6,%R3
FADD %R6,%R1
FADD %R6,%R2
FDIV %R3,%R1
FDIV %R3,%R2
MOV %R1,(%R4)
MOV %R2,(%R4)
MOV (%R0),%R1
ADD %R5,%R0
MOV (%R0),%R2
ADD %R5,%R0
MOV (%R0),%R3
ADD %R5,%R0
FSUB %R6,%R1
FSUB %R6,%R2
FADD %R6,%R3
FADD %R6,%R3
FADD %R6,%R1
FADD %R6,%R2
FDIV %R3,%R1
FDIV %R3,%R2
MOV %R1,(%R4)
MOV %R2,(%R4)
DEC %R7
JMP,NZ $RENDER_LOOP
MOV $0x0003,%R1l
MOV $0x0000,%R1h #Display the frame
MOV %R1,(%R4)
RET
:DATA_START