vc15_rt.asm 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. ;***
  2. ;vc15_rt.asm: Wonder Witch Start-up code for Visual C++ 1.5x
  3. ;
  4. SRAM_SEG equ 1000h
  5. MAXPATHLEN equ 64
  6. INT_EXIT equ 10h
  7. INT_DISP equ 12h
  8. INT_TEXT equ 13h
  9. DISPLAY_CONTROL equ 00h
  10. SPRITE_SET_RANGE equ 0bh
  11. SCREEN_SET_SCROLL equ 13h
  12. SCREEN2_SET_WINDOW equ 15h
  13. SPRITE_SET_WINDOW equ 17h
  14. SCREEN_SET_VRAM equ 21h
  15. SPRITE_SET_VRAM equ 22h
  16. TEXT_SCREEN_INIT equ 00h
  17. TEXT_SET_MODE equ 02h
  18. TEXT_SET_SCREEN equ 0eh
  19. TEXT_MODE_ANK equ 0
  20. TEXT_MODE_ANK_SJIS equ 1
  21. TEXT_MODE_SJIS equ 2
  22. SCREEN1 equ 0
  23. SCREEN2 equ 1
  24. DCM_SCR1 equ 1
  25. DCM_SCR2 equ 2
  26. V_SPRITE_START equ 0
  27. V_SPRITE_COUNT equ 0
  28. ifdef DISPLAY_MODE_JAPANESE1
  29. V_DISPLAY_CONTROL equ DCM_SCR2
  30. V_TEXT_SCREEN equ SCREEN2
  31. V_TEXT_MODE equ TEXT_MODE_ANK_SJIS
  32. V_SCREEN1_VRAM equ 3 ; duplicated with screen2
  33. V_SCREEN2_VRAM equ 3
  34. V_SPRITE_VRAM equ 11
  35. V_STACK_TOP equ 01600h
  36. endif
  37. ifdef DISPLAY_MODE_JAPANESE2
  38. V_DISPLAY_CONTROL equ DCM_SCR1 + DCM_SCR2
  39. V_TEXT_SCREEN equ SCREEN2
  40. V_TEXT_MODE equ TEXT_MODE_ANK_SJIS
  41. V_SCREEN1_VRAM equ 2
  42. V_SCREEN2_VRAM equ 3
  43. V_SPRITE_VRAM equ 7
  44. V_STACK_TOP equ 00e00h
  45. endif
  46. ifdef DISPLAY_MODE_ASCII1
  47. V_DISPLAY_CONTROL equ DCM_SCR2
  48. V_TEXT_SCREEN equ SCREEN2
  49. V_TEXT_MODE equ TEXT_MODE_ANK
  50. V_SCREEN1_VRAM equ 6 ; duplicated with screen2
  51. V_SCREEN2_VRAM equ 6
  52. V_SPRITE_VRAM equ 23
  53. V_STACK_TOP equ 02e00h
  54. endif
  55. ifdef DISPLAY_MODE_ASCII2
  56. V_DISPLAY_CONTROL equ DCM_SCR1 + DCM_SCR2
  57. V_TEXT_SCREEN equ SCREEN2
  58. V_TEXT_MODE equ TEXT_MODE_ANK
  59. V_SCREEN1_VRAM equ 6
  60. V_SCREEN2_VRAM equ 5
  61. V_SPRITE_VRAM equ 19
  62. V_STACK_TOP equ 02600h
  63. endif
  64. _TEXT segment byte public 'CODE'
  65. _TEXT ends
  66. TEXT segment byte public 'CODE'
  67. TEXT ends
  68. _DATA segment para public 'DATA'
  69. dseg_start proc far
  70. dseg_start endp
  71. _DATA ends
  72. DATA segment para public 'DATA'
  73. DATA ends
  74. CONST segment para public 'CONST'
  75. CONST ends
  76. _BSS segment word public 'BSS'
  77. bss_start proc far
  78. bss_start endp
  79. _BSS ends
  80. BSS segment word public 'BSS'
  81. BSS ends
  82. c_common segment word public 'BSS'
  83. c_common ends
  84. _HEAP segment para public 'HEAP'
  85. heap_start proc far
  86. heap_start endp
  87. _HEAP ends
  88. CGROUP group _TEXT, TEXT
  89. DGROUP group _DATA, DATA, CONST, _BSS, BSS, c_common, _HEAP
  90. assume cs:CGROUP, ds:DGROUP, es:DGROUP
  91. _TEXT segment byte public 'CODE'
  92. extrn _main :near
  93. public _load0
  94. public _run0
  95. public _exit0
  96. _load0 proc far
  97. push ds
  98. push di
  99. push si
  100. push cx
  101. push bx
  102. ; calcurate initialized data size
  103. mov cx, offset DGROUP:bss_start
  104. shr cx, 1 ; word alignmented
  105. ; copy initialized data into user ds
  106. mov ax, cs
  107. sub ax, CGROUP
  108. ; add ax, seg dseg_start
  109. add ax, DGROUP
  110. mov ds, ax
  111. mov ax, SRAM_SEG
  112. mov es, ax
  113. mov si, offset DGROUP:dseg_start
  114. mov di, si
  115. rep movsw
  116. ; clear bss
  117. mov cx, offset DGROUP:heap_start
  118. push cx
  119. mov di, offset DGROUP:bss_start
  120. sub cx, di
  121. shr cx, 1
  122. xor ax, ax
  123. rep stosw
  124. ; calcurate heap start position
  125. ; set argv starting position at heap start
  126. pop es:[__argv]
  127. mov dx, cs
  128. mov ax, offset _run0
  129. pop bx
  130. pop cx
  131. pop si
  132. pop di
  133. pop ds
  134. ret
  135. _load0 endp
  136. _run0 proc far ;C, argc :word, argv :near ptr
  137. push bp
  138. mov bp,sp
  139. push ds
  140. mov dx, SRAM_SEG
  141. mov es, dx
  142. mov ds, dx
  143. ; mov ax, sp
  144. ; mov word ptr ds:[__sp], ax
  145. ; mov ax, ss
  146. ; mov word ptr ds:[__sp + 2], ax
  147. ;; setup SP according to the display modes
  148. ;; display_control(0);
  149. mov bx, 0
  150. mov ah, DISPLAY_CONTROL
  151. int INT_DISP
  152. ;; screen_set_scroll(SCREEN1, 0, 0);
  153. mov bx, 00000h
  154. mov al, SCREEN1
  155. mov ah, SCREEN_SET_SCROLL
  156. int INT_DISP
  157. ;; screen_set_scroll(SCREEN2, 0, 0);
  158. mov bx, 00000h
  159. mov al, SCREEN2
  160. mov ah, SCREEN_SET_SCROLL
  161. int INT_DISP
  162. ;; screen2_set_window(0, 0, 255, 255)
  163. mov cx, 0ffffh
  164. mov bx, 00000h
  165. mov ah, SCREEN2_SET_WINDOW
  166. int INT_DISP
  167. ;; sprite_set_window(0, 0, 255, 255)
  168. mov cx, 0ffffh
  169. mov bx, 00000h
  170. mov ah, SPRITE_SET_WINDOW
  171. int INT_DISP
  172. ;; text_set_screen(V_TEXT_SCREEN);
  173. mov al, V_TEXT_SCREEN
  174. mov ah, TEXT_SET_SCREEN
  175. int INT_TEXT
  176. ;; text_set_mode(V_TEXT_MODE);
  177. mov bx, V_TEXT_MODE
  178. mov ah, TEXT_SET_MODE
  179. int INT_TEXT
  180. ;; screen_set_vram(SCREEN1, V_SCREEN1_VRAM)
  181. mov bx, V_SCREEN1_VRAM
  182. mov al, SCREEN1
  183. mov ah, SCREEN_SET_VRAM
  184. int INT_DISP
  185. ;; screen_set_vram(SCREEN2, V_SCREEN2_VRAM)
  186. mov bx, V_SCREEN2_VRAM
  187. mov al, SCREEN2
  188. mov ah, SCREEN_SET_VRAM
  189. int INT_DISP
  190. ;; sprite_set_vram(SCREEN2, V_SCREEN2_VRAM)
  191. mov bx, V_SPRITE_VRAM
  192. mov ah, SPRITE_SET_VRAM
  193. int INT_DISP
  194. ;; sprite_set_range(V_SPRITE_START, V_SPRITE_COUNT)
  195. mov cx, V_SPRITE_COUNT
  196. mov bx, V_SPRITE_START
  197. mov ah, SPRITE_SET_RANGE
  198. int INT_DISP
  199. ;; display_control(V_DISPLAY_CONTROL);
  200. mov bx, V_DISPLAY_CONTROL
  201. mov ah, DISPLAY_CONTROL
  202. int INT_DISP
  203. MOV CX, [BP + 8] ; for argv ; mov bx, argc
  204. MOV BX, [BP + 6] ; for argc ; mov cx, argv
  205. mov ax, V_STACK_TOP
  206. mov sp, ax
  207. push cx ; argv
  208. push bx ; argc
  209. call _main
  210. _exit00:
  211. _exit0:
  212. int INT_EXIT
  213. ;mov sp,bp
  214. ;pop bp
  215. ;ret
  216. _run0 endp
  217. ;_exit0:
  218. ; mov ax, SRAM_SEG
  219. ; mov es, ax
  220. ; les ax, dword ptr es:[__sp]
  221. ; mov sp, ax
  222. ; mov ax, es
  223. ; mov ss, ax
  224. ; jmp _exit00
  225. _TEXT ends
  226. _DATA segment para public 'DATA'
  227. public __acrtused ; trick to force in startup
  228. __acrtused = 9876h ; funny value not easily matched in SYMDEB
  229. public __id
  230. public __pid
  231. public __ppid
  232. public __pcbid
  233. public __ppcbid
  234. public __ilib
  235. public __proc
  236. public __cwfs
  237. public __currentdir
  238. public __argv
  239. public __heap
  240. ;dseg_start:
  241. __id db 'TCC', 0
  242. __pid dw ?
  243. __ppid dw ?
  244. __pcbid dw ?
  245. __ppcbid dw ?
  246. __ilib dd ?
  247. __proc dd ?
  248. __cwfs dd ?
  249. __currentdir db MAXPATHLEN dup (?)
  250. __argv dw ?
  251. __resource dd ?
  252. __heap dw ?
  253. _DATA ends
  254. end