+ #mov %ax, %ds
+ mov %ax, %gs
+ #mov $16000, %ecx
+ #rep movsl
+
+ mov $sintab, %eax
+ shr $4, %eax
+ mov %ax, %fs
+
+.Lframeloop:
+ xor %di, %di
+
+ movw $0, yval
+.Lyloop:
+ movw $0, xval
+.Lxloop:
+ # calc src scanline address -> bx
+ mov yval, %bx
+ shl $2, %bx
+ add frameno, %bx
+ xor %bh, %bh
+ mov %fs:(%bx), %cl
+ xor %ch, %ch
+ shr $5, %cx
+
+ mov yval, %ax
+ add %cx, %ax
+ # bounds check
+ cmp $200, %ax
+ jl 0f
+ mov $199, %ax
+
+0: mov %ax, %bx
+ shl $8, %ax
+ shl $6, %bx
+ add %ax, %bx
+
+ # calc src x offset -> si
+ mov xval, %ax
+ shl $2, %ax
+ add frameno, %ax
+ xor %ah, %ah
+ mov %ax, %si
+ mov %fs:(%si), %cl
+ xor %ch, %ch
+ shr $5, %cx
+
+ mov xval, %ax
+ add %cx, %ax
+ # bounds check
+ cmp $320, %ax
+ jl 0f
+ mov $319, %ax
+
+0: mov %ax, %si
+
+ mov %gs:(%bx, %si), %al
+
+ mov %al, %es:(%di)
+ inc %di
+
+ incw xval
+ cmpw $320, xval
+ jnz .Lxloop
+
+ incw yval
+ cmpw $200, yval
+ jnz .Lyloop
+
+ incw frameno
+
+ # wait vsync
+ mov $0x3da, %dx
+0: in %dx, %al
+ and $8, %al
+ jnz 0b
+0: in %dx, %al
+ and $8, %al
+ jz 0b
+ jmp .Lframeloop