MAIN.ASM 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. RetCode EQU 0 ; return value for main
  2. RegParam EQU 0 ; Register parameter passing
  3. StkFrame EQU 1 ; Standard C parameter passing
  4. SSinDGROUP EQU 1 ; Stack in data segment
  5. SmallModel EQU 1 ; memory models
  6. CompactModel EQU 2
  7. MediumModel EQU 4
  8. LargeModel EQU 8
  9. XLargeModel EQU 16
  10. MemoryModel EQU LargeModel ; select model
  11. CallingConvention EQU RegParam ; calling convention
  12. IF MemoryModel EQ SmallModel
  13. .MODEL SMALL
  14. frame EQU 4
  15. ENDIF
  16. IF MemoryModel EQ CompactModel
  17. .MODEL COMPACT
  18. frame EQU 4
  19. ENDIF
  20. IF MemoryModel EQ MediumModel
  21. .MODEL MEDIUM
  22. frame EQU 6
  23. ENDIF
  24. IF MemoryModel EQ LargeModel
  25. .MODEL LARGE
  26. frame EQU 6
  27. ENDIF
  28. IF MemoryModel EQ XLargeModel
  29. .MODEL HUGE
  30. frame EQU 6
  31. ENDIF
  32. IF CallingConvention EQ RegParam
  33. IF @datasize EQ 1 ; Far data pointer models M, L, MT
  34. EnvV EQU WORD PTR [bp+frame] ; ArgC = ax, ArgV = cx:bx
  35. ; Near data pointer models S, C
  36. ; ArgC = ax, ArgV = bx, EnvV = cx *)
  37. ENDIF
  38. ELSE
  39. IF @datasize EQ 0 ; Near data pointer models S, M
  40. ArgC EQU WORD PTR [bp+frame]
  41. ArgV EQU WORD PTR [bp+2+frame]
  42. EnvV EQU WORD PTR [bp+4+frame]
  43. ELSE
  44. ArgC EQU WORD PTR [bp+frame]
  45. ArgVl EQU WORD PTR [bp+2+frame]
  46. ArgVh EQU WORD PTR [bp+4+frame]
  47. EnvVl EQU WORD PTR [bp+6+frame]
  48. EnvVh EQU WORD PTR [bp+8+frame]
  49. ENDIF
  50. ENDIF
  51. EXTRN __main_args3:FAR ; main entry points in library
  52. EXTRN __main_args2:FAR
  53. EXTRN __call_main:FAR
  54. .CODE
  55. IF @codesize EQ 0
  56. _main PROC NEAR
  57. ELSE
  58. _main PROC FAR
  59. ENDIF
  60. PUBLIC _main
  61. push bp
  62. mov bp, sp
  63. IF @datasize EQ 2
  64. push ds
  65. mov ax, @data
  66. mov ds, ax
  67. ENDIF
  68. ; your stuff here
  69. mov ax, RetCode
  70. IF @datasize EQ 2
  71. pop ds
  72. ENDIF
  73. pop bp
  74. IF CallingConvention EQ RegParam
  75. IF @datasize GT 0
  76. ret 4
  77. ELSE
  78. ret
  79. ENDIF
  80. ELSE
  81. ret
  82. ENDIF
  83. _main ENDP
  84. .DATA
  85. ; One option must be True
  86. Main0Args EQU 0 ; no main parameters
  87. Main2Args EQU 0 ; Brings in command line only
  88. Main3Args EQU 1 ; Brings in command line and environment
  89. STACK_SIZE EQU 4000H ; Sets Stack size
  90. HEAP_SIZE EQU 0FFFFH ; Sets Heap Size
  91. PUBLIC __initx
  92. IF Main3Args EQ 1
  93. __initx DW __main_args3, @code
  94. ENDIF
  95. IF Main2Args EQ 1
  96. __initx DW __main_args2, @code
  97. ENDIF
  98. IF Main0Args EQ 1
  99. __initx DW __call_main, @code
  100. ENDIF
  101. DW STACK_SIZE ; Stack size
  102. DW HEAP_SIZE ; Heap Size
  103. DB SSinDGROUP ; Near or far stack
  104. _DATA ENDS
  105. NEAR_STACK SEGMENT WORD PUBLIC 'BSS'
  106. PUBLIC __near_stack_start
  107. __near_stack_start LABEL WORD
  108. IF SSinDGROUP EQ 1
  109. ORG STACK_SIZE
  110. ENDIF
  111. IF SSinDGROUP EQ 0
  112. ORG 1
  113. ENDIF
  114. NEAR_STACK ENDS
  115. NEAR_HEAP SEGMENT WORD PUBLIC 'BSS'
  116. PUBLIC __near_heap_start
  117. __near_heap_start LABEL WORD
  118. ORG HEAP_SIZE
  119. NEAR_HEAP ENDS
  120. END
  121.