prt0.asm 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. .387
  2. .386p
  3. name prt0
  4. assume nothing
  5. extrn PASCALMAIN : near
  6. extrn HEAPSIZE : dword
  7. public start
  8. public ___exit
  9. public ___sbrk
  10. public HEAP
  11. public PSP_SELECTOR
  12. public ENV_SELECTOR
  13. public ENV_SIZE
  14. .STACK 1000h
  15. .CODE
  16. start proc near
  17. jmp short main
  18. db "WATCOM"
  19. main:
  20. mov ax,es ; psp selector in es
  21. mov PSP_SELECTOR,ax
  22. mov gs,ax
  23. mov bx,[gs:2Ch] ; environment sel. at psp_sel:2C
  24. mov ENV_SELECTOR,bx
  25. lsl ecx,bx ; get selector limit
  26. mov ENV_SIZE,ecx
  27. push ds
  28. pop es
  29. push ds
  30. pop fs
  31. mov eax,HEAPSIZE
  32. push eax
  33. call ___sbrk ; allocate heap
  34. mov HEAP,eax
  35. pop eax
  36. call PASCALMAIN
  37. start endp
  38. ___exit proc near
  39. pop eax
  40. mov ah,4Ch
  41. int 21h
  42. ___exit endp
  43. ___sbrk proc near
  44. mov ebx,dword ptr [esp+4]
  45. mov ecx,ebx
  46. shr ebx,16
  47. mov ax,501h
  48. int 31h
  49. jnc sbrk_ok
  50. xor eax,eax
  51. ret
  52. sbrk_ok:
  53. shl ebx,16
  54. mov bx,cx
  55. mov eax,ebx
  56. ret
  57. ___sbrk endp
  58. .DATA
  59. HEAP dd 0
  60. PSP_SELECTOR dw 0
  61. ENV_SELECTOR dw 0
  62. ENV_SIZE dd 0
  63. end start