Advertisement
Guest User

pcstartb.s

a guest
Aug 19th, 2018
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.56 KB | None | 0 0
  1. ;Tabulatorgr”že: 3
  2. ;Kommentare: ;ab Spalte 60
  3.  
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. ; Pure C Startup Code
  6. ;
  7. ; ARGV und die šbergabe langer Dateinamen in Hochkommata wird untersttzt.
  8. ; (c) und alle Rechte by Behne und Behne Software, Wunstorf.
  9. ;
  10. ; 07.10.95
  11. ;
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. ;zu exportierende Referenzen
  14.  
  15. EXPORT exit ;void exit( WORD status );
  16. EXPORT __exit
  17.  
  18. EXPORT _BasPag ;Adresse der Baspage
  19. EXPORT _StkLim ;Untergrenze des Stacks
  20. EXPORT _PgmSize ;Gr”že des Programms (TPA)
  21. EXPORT _app ;Flag fr Accessory (0) oder Applikation (1)
  22. EXPORT errno ;globale Fehlervariable
  23. EXPORT _AtExitVec
  24. EXPORT _FilSysVec
  25. EXPORT _RedirTab
  26.  
  27. EXPORT __text
  28. EXPORT __data
  29. EXPORT __bss
  30.  
  31. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  32. ;zu importierende Referenzen
  33.  
  34. IMPORT main ;WORD main( WORD argc, BYTE **argv, BYTE **envp );
  35. IMPORT _fpumode ;Art der FPU
  36. IMPORT _StkSize ;Gr”že des Stacks
  37. IMPORT _FreeAll ;Funktion zur Speicherfreigabe
  38.  
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;die BASEPAGE-Struktur
  41.  
  42. OFFSET 0
  43.  
  44. p_lowtpa: ds.l 1 ;Adresse der TPA
  45. p_hitpa: ds.l 1 ;erstes Byte nach der TPA
  46.  
  47. p_tbase: ds.l 1 ;Adresse des TEXT-Segements
  48. p_tlen: ds.l 1 ;L„nge des TEXT-Segments
  49.  
  50. p_dbase: ds.l 1 ;Adresse des DATA-Segments
  51. p_dlen: ds.l 1 ;L„nge des DATA-Segments
  52.  
  53. p_bbase: ds.l 1 ;Adresse des BSS-Segments
  54. p_blen: ds.l 1 ;L„nge des BSS-Segments
  55.  
  56. p_dta: ds.l 1 ;Zeiger auf die Default-DTA
  57.  
  58. p_parent: ds.l 1 ;Zeiger auf die Basepage des aufrufenden Prozesses
  59.  
  60. p_resrvd0: ds.l 1 ;reserviert
  61.  
  62. p_env: ds.l 1 ;Zeiger auf die Environment-Strings
  63. p_resrvd1: ds.b 80 ;reserviert
  64. p_cmdlin: ds.b 128 ;Kommandozeile
  65.  
  66. sizeof_BASEPAGE:
  67.  
  68. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  69.  
  70. TEXT
  71. __text: ;Startadresse des TEXT-Segments
  72.  
  73. bra.b start_me_up ;den Header berspringen
  74.  
  75. dc.l _RedirTab ;Zeiger auf die Umlenkungstabelle
  76. dc.l _StkSize ;Gr”že des Stacks
  77.  
  78. ALIGN 16
  79.  
  80. dc.b 'Pure C 2.0',0 ;Copyright-Hinweis
  81.  
  82. ALIGN 16
  83.  
  84. start_me_up: move.l a0,d0 ;Accessory?
  85. bne.b is_acc
  86.  
  87. move.l 4(sp),a3 ;Zeiger auf die Basepage
  88. moveq #1,d0 ;Applikation
  89. bra.b is_app
  90.  
  91. is_acc: movea.l a0,a3 ;Zeiger auf die Basepage
  92. clr.w d0 ;Accessory
  93.  
  94. is_app: move.l a3,_BasPag ;Zeiger auf die Basepage
  95. move.w d0,_app ;Flag Accessory/Applikation
  96.  
  97. ;Speicherbedarf ermitteln
  98.  
  99. move.l p_tlen(a3),d1 ;L„nge des TEXT-Segments
  100. add.l p_dlen(a3),d1 ;L„nge des DATA-Segments
  101. add.l p_blen(a3),d1 ;L„nge des BSS-Segments
  102. add.l #sizeof_BASEPAGE,d1 ;L„nge der Basepage
  103. move.l d1,_PgmSize ;Programml„nge
  104.  
  105. ;Stack setzen
  106. move.l d1,d2 ;L„nge
  107. add.l a3,d2 ;Zeiger auf die Basepage
  108. and.b #$fc,d2 ;auf Langwortgrenze abrunden
  109. move.l d2,sp ;Adresse des Stacks
  110.  
  111. tst.w d0 ;Accessory?
  112. beq chk_fpu
  113.  
  114. ;Speicher freigeben
  115.  
  116. move.l d1,-(sp) ;Speicherbedarf
  117. move.l a3,-(sp) ;Adresse der Basepage
  118. clr.w -(sp) ;reserviert
  119. move.w #74,-(sp) ;Mshrink
  120. trap #1
  121. lea.l 12(sp),sp
  122.  
  123. ;Environment-Strings untersuchen
  124.  
  125. move.l sp,d0
  126. sub.l #_StkSize-4,d0
  127. and.b #$fc,d0 ;auf Langwortgrenze ausrichten
  128. movea.l d0,a1 ;envp[] beginnt bei der niedrigsten Stackadresse
  129. move.l a1,a4 ;merken
  130. move.l p_env(a3),a2 ;Zeiger auf die Environment-Strings
  131.  
  132. scan_env_loop: move.l a2,(a1)+ ;Adresse in envp[] sichern
  133. movea.l a2,a5 ;Adresse sichern
  134. tst.b (a2)+ ;Ende der Environment-Strings?
  135. beq.b scan_env_end
  136.  
  137. scan_env_str: tst.b (a2)+ ;bis zum String-Ende
  138. bne.b scan_env_str
  139.  
  140. movep.w 0(a5),d0
  141. swap d0
  142. movep.w 1(a5),d0 ;'ARGV' ergibt in diesem Fall 'AGRV'
  143. cmpi.l #'AGRV',d0 ;'ARGV' ergibt in diesem Fall 'AGRV'
  144. bne.b scan_env_loop
  145. cmpi.b #'=',4(a5) ;'=' ?
  146. bne.b scan_env_loop
  147. cmpi.b #127,p_cmdlin(a3) ;Kommandozeile 127 Bytes lang?
  148. bne.b scan_env_loop
  149.  
  150. clr.b (a5) ;Environment terminieren (ARGV entfernen)
  151. clr.l -4(a1) ;letzten envp[] l”schen
  152. movea.l a1,a5 ;argv[] beginnt direkt hinter envp[]
  153. moveq #0,d3 ;argc ist 0
  154. move.l a2,(a1)+ ;Zeiger auf den ersten String
  155.  
  156. scan_ARGV: tst.b (a2)+ ;Ende des Strings suchen
  157. bne.b scan_ARGV
  158.  
  159. move.l a2,(a1)+ ;Zeiger auf das n„chste Argument
  160. addq.w #1,d3 ;argc hochz„hlen
  161. tst.b (a2) ;letzter Environment-String?
  162. bne.b scan_ARGV
  163.  
  164. bra scan_end
  165.  
  166. scan_env_end: clr.l -4(a1) ;letzten envp[] l”schen
  167.  
  168. ;Kommandozeile untersuchen
  169.  
  170. scan_cmd_line: lea p_cmdlin(a3),a0 ;Zeiger auf die Kommandozeile
  171. move.b (a0),d1 ;L„nge der Kommandozeile
  172. ext.w d1
  173. movea.l a1,a5 ;argv[] merken
  174.  
  175. move.l a0,(a1)+ ;argv[0]: Zeiger auf der ersten String
  176. clr.b (a0)+ ;Leerstring
  177. moveq #1,d3 ;argc
  178. move.l a0,(a1)+ ;argv[1]: Zeiger auf den zweiten String
  179.  
  180. moveq #' ',d4 ;Leerzeichen
  181. moveq #39,d5 ;Hochkomma
  182. moveq #'"',d6 ;Anfhrungszeichen
  183.  
  184. bra.b scan_next
  185.  
  186. scan_cmd_loop: move.b (a0)+,d0
  187. cmp.b d4,d0 ;Leer- oder Trennzeichen?
  188. bhi.b scan_squote
  189.  
  190. tst.b -2(a0) ;ist das vorhergehende Byte ein Nullbyte?
  191. bne.b scan_eos ;Ende eines Strings
  192.  
  193. addq.l #1,-4(a1) ;Adresse des Strings korrigieren
  194. bra.b scan_term ;dann das Leerzeichen ignorieren
  195.  
  196. scan_squote: cmp.b d5,d0 ;Dateiname in ' Hochkommata?
  197. bne.b scan_dquote
  198.  
  199. move.l -4(a1),d0
  200. addq.l #1,d0
  201. cmp.l d0,a0 ;Hochkomma mitten im Text?
  202. bne.b scan_dquote
  203.  
  204. addq.l #1,-4(a1) ;Adresse des Strings korrigieren
  205.  
  206. scan_snglquote: cmp.b (a0)+,d5 ;' Hochkomma?
  207. dbeq d1,scan_snglquote
  208. subq.w #1,d1 ;Ende des Strings?
  209. bmi.b scan_end
  210. beq.b scan_eos ;es folgen keine weiteren Zeichen
  211.  
  212. cmp.b (a0),d5 ;zus„tzliches Hochkomma?
  213. bne.b scan_eos ;sonst Ende des Dateinamens?
  214.  
  215. movea.l -(a1),a2 ;Zeiger auf den Anfang des Strings
  216. movea.l a0,a3 ;Zeiger auf das zweite Hochkomma
  217.  
  218. scan_move_args: move.b -2(a3),-(a3) ;String um ein Byte verschieben
  219. cmpa.l a2,a3
  220. bhi.b scan_move_args
  221.  
  222. addq.l #1,a0 ;Zeiger hinter das zweite Hochkomma
  223. subq.w #1,d1 ;L„nge der Kommandozeile verringern
  224. addq.l #1,(a1)+ ;Adresse des Strings korrigieren
  225. bra.b scan_snglquote ;nach dem n„chsten Hochkomma suchen
  226.  
  227. scan_dquote: cmp.b d6,d0 ;Dateiname in Anfhrungszeichen?
  228. bne.b scan_next
  229.  
  230. addq.l #1,-4(a1) ;Adresse des Strings korrigieren
  231.  
  232. scan_dblquote: cmp.b (a0)+,d6 ;Anfhrungszeichen?
  233. dbeq d1,scan_dblquote
  234. subq.w #1,d1 ;Ende des Strings?
  235. bmi.b scan_end
  236.  
  237. scan_eos: move.l a0,(a1)+ ;Startadresse des neuen Strings
  238. addq.w #1,d3 ;argc erh”hen
  239. scan_term: clr.b -1(a0) ;String terminieren
  240.  
  241. scan_next: subq.w #1,d1
  242. bpl.b scan_cmd_loop
  243.  
  244. tst.b -1(a0) ;ist letzte Byte ein Nullbyte?
  245. beq.b scan_end ;dann das Leerzeichen ignorieren
  246.  
  247. addq.w #1,d3 ;argc erh”hen
  248. clr.b (a0) ;String terminieren
  249. addq.l #4,a1
  250.  
  251. scan_end: movea.l a1,a6 ;untere Stackgrenze, stack limit
  252. clr.l -(a1) ;letzten argv[] l”schen
  253.  
  254. chk_fpu: clr.w _fpumode ;keine Atari FPU
  255.  
  256. lea 256(a6),a6 ;256 Bytes fr Aufrufe der Libraries addieren
  257. move.l a6,_StkLim ;niedrigste Stackadresse
  258.  
  259. clr.w errno ;globale Fehlervariable (extlib) l”schen
  260. clr.l _AtExitVec ;Vektor fr atexit() (stdlib-Funktion) l”schen
  261. clr.l _FilSysVec ;Vektor frs Terminieren des Dateisystems l”schen
  262.  
  263. ;main() anspringen
  264.  
  265. move.w d3,d0 ;argc
  266. movea.l a5,a0 ;argv
  267. movea.l a4,a1 ;envp
  268.  
  269. jsr main ;WORD main( WORD argc, BYTE **argv, BYTE **envp );
  270.  
  271.  
  272. ;void exit( WORD status );
  273.  
  274. exit: move.w d0,-(sp) ;Rckgabewert fr Pterm() sichern
  275.  
  276. move.l _AtExitVec,d0 ;sind mit atexit() Funktionen eingetragen worden?
  277. beq.b __exit
  278.  
  279. movea.l d0,a0
  280. jsr (a0)
  281.  
  282. __exit: move.l _FilSysVec,d0 ;mssen noch Dateien geschlossen oder zurckgeschrieben werden?
  283. beq.b exit_free
  284.  
  285. movea.l d0,a0
  286. jsr (a0) ;Datei-Funktionen aufrufen
  287.  
  288. exit_free: jsr _FreeAll ;Speicherbl”cke freigeben
  289.  
  290. move.w #76,-(sp) ;Pterm()
  291. trap #1
  292.  
  293.  
  294. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  295. DATA
  296. __data: ;Startadresse des DATA-Segments
  297.  
  298. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  299. BSS
  300. __bss: ;Startadresse des BSS-Segments
  301.  
  302. _BasPag: ds.l 1 ;Zeiger auf die Basepage
  303. _app: ds.w 1 ;Flag 0: Accessory / 1: Applikation
  304. _StkLim: ds.l 1 ;untere Stackgrenze
  305. _PgmSize: ds.l 1 ;L„nge des Programms (der TPA)
  306. _RedirTab: ds.l 6 ;Tabelle fr Ausgabe-Umlenkung
  307.  
  308. errno: ds.w 1 ;globale Fehlervariable (extlib)
  309. _AtExitVec: ds.l 1 ;Vektor fr atexit() (stdlib-Funktion)
  310. _FilSysVec: ds.l 1 ;Vektor frs Terminieren des Dateisystems
  311.  
  312. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement