; contents of file lot_one.asm ; by Uros Boltin .MODEL large,PASCAL .DATA EXTRN Triangle: DWORD .CODE .386 ; function Backwards( Lot:LotMap; n:integer ): LotMap; far; Backwards PROC FAR Lot:DWORD, n:WORD PUBLIC Backwards mov eax, Lot xor edx, edx mov cx, n jcxz @@12 @@11: shr eax, 1 rcl edx, 1 loop @@11 @@12: mov ax, dx shr edx, 16 ret Backwards ENDP ; function LotIndex( Lot:LotMap ): LongInt; far; LotIndex PROC FAR Lot:DWORD PUBLIC LotIndex xor eax, eax ; Index := 0 les si, Triangle mov ecx, Lot @@41: jecxz @@44 @@42: shr ecx, 1 ; Inc(x) jc @@43 ; if x in ... add si, 4 ; Inc(j) jmp @@42 @@43: add eax, es:[si] ; Index := Index + ... add si, 128 ; Inc(i) jmp @@41 @@44: mov edx, eax shr edx, 16 ret LotIndex ENDP ; function LotAt( Index:LongInt; r:integer ): LotMap; far; LotAt PROC FAR Index:DWORD, r:WORD PUBLIC LotAt xor eax, eax ; Lot:=[] mov cx, r jcxz @@54 mov bx, cx shl bx, 5 ; i:=r+1, j:=-1 sub bx, cx ; i:=i-1, j:=i+32-r, shl bx, 2 ; ofs := [i,j] * SizeOf(LongInt) les si, Triangle add si, bx mov ebx, 80000000H ; x:=31; mov edx, Index jmp @@53 @@51: sub si, 4 ; Dec(j) @@52: shr ebx, 1 ; Dec(x) @@53: cmp edx, es:[si] ; if Index < ... jb @@51 or eax, ebx ; Include sub edx, es:[si] ; Index := Index - ... sub si, 128 ; Dec(i) loop @@52 ; Dec(r), while r>0 ... @@54: mov edx, eax shr edx, 16 ret LotAt ENDP END