LOADERA.A 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. module LoaderA
  2. segment ENTERCODE(ENTERCODE,28H)
  3. extrn Loader$Main
  4. jmp far LoaderA$Init
  5. dw 0,0,0,0,0,0,0,0
  6. segment _TEXT(CODE,28H)
  7. group DGROUP(_TEXT)
  8. public LoaderA@MainName:
  9. (*%T ENV*)
  10. (*%F BATCH*) db 'TS', 0 (*%E*)
  11. (*%T BATCH*) db 'TSC', 0 (*%E*)
  12. (*%E*)
  13. (*%F ENV*)
  14. db 'DVTEST', 0
  15. (*%E*)
  16. org 62
  17. LoaderA$Init:
  18. cld
  19. push ds
  20. mov ah,30H
  21. int 21H
  22. cmp al,2
  23. (*%T DebugLoader*) jmp $start (*%E*)
  24. jbe $start
  25. push ax
  26. mov es,[2CH]
  27. sub di, di
  28. sub ax, ax
  29. mov cx, -1
  30. execLoop: (* get address of command *)
  31. scasw
  32. je execFound
  33. dec di
  34. loop execLoop
  35. execFound:
  36. push es
  37. pop ds
  38. add di, 2
  39. mov si,di
  40. push cs
  41. pop es
  42. mov di,LoaderA@MainName
  43. findpath:
  44. lodsb
  45. stosb
  46. cmp al,0
  47. jne findpath
  48. (* take off EXE *)
  49. cmp byte es:[di][-5],'.'
  50. jne $noexe
  51. mov byte es:[di][-5],0
  52. $noexe:
  53. (* extend handle size *)
  54. pop ax
  55. cmp al,3
  56. ja $handleextnd
  57. cmp ah,3
  58. jb $start
  59. $handleextnd:
  60. pop ax
  61. push ax (* recover address of PSP into AX *)
  62. push bx
  63. push es
  64. mov es,ax
  65. mov bx,es:[2] (* recover END-OF-ALLOCATION segment in BX *)
  66. mov ax,es
  67. sub bx,ax (* calculate total program size *)
  68. sub bx,11H (* adjust down 11H paras., 256bytes plus 16 for slack *)
  69. mov ah,4AH (* release this memory back to DOS to handle files *)
  70. int 21H
  71. sub word es:[2],11H (* decrement END-OF-ALLOCATION value for libraries *)
  72. pop es
  73. pop bx
  74. mov ah,67H
  75. push bx
  76. mov bx,255 (* prepare DOS to handle up to 255 file handles. *)
  77. int 21H
  78. pop bx
  79. $start:
  80. push ss
  81. pop ds
  82. mov dx,100H (* temporary DTA *)
  83. mov ah,1AH
  84. int 21H
  85. pop ds
  86. mov ax,1234H
  87. push ax
  88. sub ax,ax
  89. push ax
  90. mov bp,sp
  91. mov ax, ds
  92. call far Loader$Main
  93. public LoaderA$MoveUp:
  94. push ds
  95. mov ds, ax
  96. dec cx
  97. dec cx
  98. add si, cx
  99. add di, cx
  100. std
  101. inc cx
  102. inc cx
  103. shr cx, 1
  104. rep; movsw
  105. pop ds
  106. cld
  107. ret near 0
  108. public Loader$FileSeek :
  109. mov ax, 4200H
  110. int 21H
  111. ret 0
  112. public Loader$FileRead :
  113. push ds
  114. mov ds, ax
  115. mov ah, 3FH
  116. int 21H
  117. pop ds
  118. jc Loader$IoError
  119. ret 0
  120. public Loader$FileWrite :
  121. push ds
  122. mov ds, ax
  123. mov ah, 40H
  124. int 21H
  125. pop ds
  126. jc Loader$IoError
  127. ret 0
  128. public Loader$FileOpen :
  129. push ds
  130. mov ds, bx
  131. mov ah, 3DH
  132. int 21H
  133. pop ds
  134. jc Loader$IoError
  135. ret 0
  136. public Loader$FileClose :
  137. mov ah, 3EH
  138. int 21H
  139. ret 0
  140. public Loader$IoError:
  141. mov ax, -1
  142. ret 0
  143. public Loader$DosExit :
  144. mov ah, 4CH
  145. int 21H
  146. public Loader$Exec:
  147. mov ss, bx
  148. mov sp, cx
  149. mov ds, ax
  150. mov es, ax
  151. push dx
  152. mov dx,80H
  153. mov ah,1AH
  154. int 21H
  155. mov ax,ds
  156. sub bp, bp
  157. push si
  158. ret far 0
  159. public Loader$FileSize:
  160. sub cx,cx
  161. sub dx,dx
  162. mov ax, 4202H (* seek relative to end *)
  163. int 21H
  164. ret 0
  165. public Loader$FileDelete :
  166. push ds
  167. mov ds, bx
  168. mov ah, 41H
  169. int 21H
  170. pop ds
  171. ret 0
  172. public Loader$FileCreate :
  173. push ds
  174. mov ds, bx
  175. mov ah, 3CH
  176. sub cx, cx
  177. int 21H
  178. pop ds
  179. jc Loader$IoError2
  180. ret 0
  181. public Loader$FileCreateNew :
  182. push ds
  183. mov ds, bx
  184. $checkloop:
  185. mov ah, 4EH
  186. sub cx,cx
  187. int 21H
  188. jc $oktocreate
  189. mov bx,dx
  190. $findendloop: (* look for end of string *)
  191. inc bx
  192. cmp byte[bx],0
  193. jnz $findendloop
  194. $findextloop: (* look for '.' *)
  195. dec bx
  196. cmp byte[bx],'.'
  197. jnz $findextloop
  198. dec bx
  199. cmp byte[bx],'9'
  200. jne $notoverflow
  201. mov byte[bx],'0'
  202. dec bx
  203. $notoverflow:
  204. inc byte [bx]
  205. jmp $checkloop
  206. $oktocreate:
  207. mov ah, 3CH
  208. sub cx, cx
  209. int 21H
  210. pop ds
  211. jc Loader$IoError2
  212. ret 0
  213. Loader$IoError2:
  214. mov ax, -1
  215. ret 0
  216. segment _DATA(DATA,28H)
  217. extrn Loader$CallTrap
  218. extrn Loader$ReturnTrap
  219. public LoaderA@GateHandler:
  220. push bx
  221. push ax
  222. pushf
  223. mov bx, sp
  224. xchg bp, ss:[bx][6]
  225. mov bx, bp (* bx points to just after gate *)
  226. add bp, cs:[bp][-2] (* destination of gate *)
  227. cmp byte cs:[bp], 90H (* see if it is a return gate *)
  228. je $retgate
  229. $callgate:
  230. (* call frame looks like this:
  231. ret cs ( if call )
  232. ret ip ( if call )
  233. bp->pointer to gate / old bp
  234. old bx
  235. old ax
  236. sp->old flags
  237. *)
  238. mov ax, bp
  239. dec ax
  240. mov bp, sp
  241. add bp, 6
  242. sub bx, 3
  243. (* ax -> segrec, bx -> gaterec *)
  244. call far Loader$CallTrap
  245. xchg ax, [bp]
  246. mov bp, ax
  247. popf
  248. pop ax
  249. pop bx
  250. ret 0
  251. $retgate:
  252. (* ret frame looks like this:
  253. pointer to gate / old bp / target cs
  254. old bx / target ip
  255. old ax
  256. bp->old flags
  257. sp->old bx
  258. *)
  259. (* bp points one beyond seghdr *)
  260. mov ax, bp (* pointer to segrec *)
  261. mov bx, cs:[bx] (* target offset *)
  262. mov bp, sp
  263. xchg bx, [bp][4]
  264. push bx
  265. mov bp, [bp][6]
  266. call far Loader$ReturnTrap
  267. mov bx, sp
  268. mov ss:[bx][8], ax
  269. pop bx
  270. popf
  271. pop ax
  272. ret far 0
  273. segment STACK(STACK,74H)
  274. select STACK
  275. org 07FF0H
  276. end *
  277.