home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 208_01 / crt.s < prev    next >
Text File  |  1987-10-13  |  12KB  |  553 lines

  1. *
  2. * HEADER:    CUG208;
  3. * TITLE:        crt
  4. * VERSION:    1.00
  5. * DESCRIPTION:    "C program starter";
  6. *
  7. * KEYWORDS:    linkage;
  8. * SYSTEM:        CP/M68K, V1.2;
  9. * FILENAME:    e/crt.s
  10. * WARNINGS:    "as regards side-effects, study the source code
  11. *         non-owner of CP/M68K is not expected to run this file.
  12. * AUTHORS:    sub-contractors of DRI.
  13. * CODER:        Yoshimasa Tsuji( this file should be withdrawn when
  14. *        DRI resumed consumer support).
  15. * COMPILERS:    DRI C(Alcyon C) for CP/M68K;
  16. *    ----    ---    ---    ---    ---    ---    ---
  17. *
  18. *    C runtime starter -- postprocesses command line and sets up
  19. *                standard IO's.
  20. *        s.s, main.c, xmain.c hacked
  21. *                by Y. Tsuji 8/9/1986
  22. *    You are advised to eliminate main.o,xmain.o,xmainnw.o from "libc.a".
  23. *    You cannot undefine _nowildcard now.
  24. *BUG:    command line handling of xmain.c is still buggy regarding
  25. *    \" ,\', " ' "
  26. *
  27. *FIX:    fixing CCP is more productive.
  28. *
  29. *    Will you please send me your code?
  30. *        Dr Yoshimasa Tsuji
  31. *        Kasuga 2-20-12-114,
  32. *        Bunkyo-ku,
  33. *        Tokyo 112,
  34. *        JAPAN
  35.     .text
  36.     .globl  __start,_brk,___BDOS,__sovf,__exit
  37. * blkfill() and index() are found in libc.a too.
  38.     .globl _blkfill,_strchr,_index
  39. * _start is the start of executable file
  40. __start:
  41.     moveq    #0,d6            * don't know why
  42.     movea.l  4(a7),a0
  43.     move.l  a0,__base        * base page address
  44.     movea.l  $18(a0),a1        * address of bss
  45.       adda.l  $1C(a0),a1        * bss length
  46. * _break is the end address of the current executable file
  47. * the linker sets these data always even
  48.     move.l  a1,__break
  49.       lea  $80(a0),a2
  50.     clr.w    d0
  51.       move.b  (a2)+,d0
  52.       move.w  d0,-(a7)
  53.       move.l  a2,-(a7)
  54.       suba.l  a6,a6            * don't know why
  55.       bsr  __main            * _main(cmdline,count)
  56.       bra  __exit
  57. _brk:
  58. * brk(addr)
  59. * sets __break=address, and returns 0 or -1
  60. * BUG: the original did not check odd address
  61. * This is very dangerous because the caller can destroy itself.
  62. * This function is used because accessing between _break and stack pointer
  63. * is illegal.
  64. *
  65.       movea.l  4(a7),a0
  66.       move.l  a0,d0
  67.       lea  $100(a0),a0
  68.       cmpa.l  a0,a7
  69.       bhi  brkok
  70.       moveq.l  #$FF,d0
  71.       bra    brkdone
  72. brkok:
  73.     addq.l    #1,d0
  74.     andi.w    #$fffe,d0
  75.       move.l  d0,__break
  76.       moveq    #0,d0
  77. brkdone:
  78.       rts
  79. ___BDOS:
  80. * __BDOS(arg,fn)
  81. * long arg;
  82. * int fn; /* function number */
  83.       move.w  4(a7),d0
  84.       move.l  6(a7),d1
  85.       trap  #2
  86.       move.w    d0,___cpmrv
  87. * now you can know what value bdos returned by __cpmrv
  88.       cmpa.l  __break,a7
  89.       bhi  noovf
  90. __sovf:
  91.       move.w  #9,d0
  92.       move.l  #ovf,d1
  93.       trap  #2
  94. __exit:
  95. *            the value returned is 4(USP)
  96.       move.w  #0,d0
  97.       trap  #2
  98. noovf:
  99.       rts
  100. _blkfill:
  101. * fixed so that it accepts unsigned count
  102. * you can use malloc(unsigned) now.
  103. * blkfill(buff,c,count)
  104. * char *buff,c;
  105. * unsigned int count;
  106. * fills buff with c count times
  107.       movea.l  4(a7),a0
  108.       move.w  8(a7),d1
  109.     move.w  10(a7),d0
  110.     beq    filldone
  111.       subq.w  #1,d0
  112. fillit:
  113.       move.b  d1,(a0)+
  114.       dbf  d0,fillit
  115. filldone:
  116.       moveq    #0,d0
  117.       rts
  118. _index:
  119. _strchr:
  120.       movea.l  4(a7),a0
  121.       move.w  8(a7),d0
  122. xindex:
  123.       cmp.b    (a0),d0
  124.     beq    done
  125.     tst.b  (a0)+
  126.       bne    xindex
  127.       suba.l    a0,a0
  128. done:    move.l  a0,d0
  129.     rts
  130. *
  131.     .data
  132.     .globl ___pname
  133.     .globl ___tname
  134.     .globl ___lname
  135.     .globl ___aname
  136.     .globl ___xeof
  137. ovf:
  138.     dc.b    'Stack Overflow$'
  139. ___pname:
  140.     dc.b 'C runtime',0
  141. ___tname:
  142.     dc.b 'CON:',0
  143. ___lname:
  144.     dc.b 'LST:',0
  145. * aux was not supported by DRI
  146. ___aname:
  147.     dc.b 'AUX:',0
  148. * changing end of file char does not affect any subroutine that
  149. * checks EOF of ASCII files.
  150. ___xeof:
  151.     dc.b $1a
  152.     .bss
  153.     .globl __base
  154.     .globl __break
  155.     .globl ___cpmrv
  156. __base:   ds.l    1
  157. __break:  ds.l    1
  158. ___cpmrv: ds.w    1
  159. *
  160. **********************
  161. * main.c
  162. * _main(com,len)
  163. * char *com;
  164. * int len;
  165. * DESCRIPTION
  166. *{ _chinit(),open(___tname,0);open(___tname,1);open(___tname,1);
  167. *  *(com+len)=0;tolower(com);
  168. *  __main(com,len);
  169. *}
  170. *
  171.         .text
  172.         .globl _open,__chinit
  173. __main:
  174. * initialise file structure
  175.         jsr    __chinit
  176. * open stdin as tty input
  177.         clr.w    -(a7)
  178.         move.l    #___tname,-(a7)
  179.         jsr    _open
  180.             addq.w  #4,a7        don't forget a7+2
  181. * open stdout as tty output
  182.         move.w    #1,(a7)
  183.         move.l    #___tname,-(a7)
  184.         jsr    _open
  185.         addq.w    #4,a7
  186. * open stderr as tty input/output.
  187. * DRI did not allow you to read stderr.
  188.         move.w    #2,(a7)        r/w stderr
  189.         move.l    #___tname,-(a7)
  190.         jsr    _open
  191.             addq.w  #6,a7        a7 is now properly restored
  192.             movea.l  4(a7),a0        com is long
  193.             move.w   8(a7),d0        len is word
  194.             clr.b  0(a0,d0.w)        clr
  195. * tolower command line
  196. * but convert \n to N
  197. * you can pass upper case letters from the command line now.
  198.         movea.l    a0,a1
  199. L1:
  200.         move.b    (a0),d1
  201.         beq    L2
  202.         cmpi.b    #'\',d1
  203.         bne    L3
  204.         move.b    1(a0),d0
  205.         bsr.b    alpha
  206.         tst    d0
  207.         beq.b    L4
  208.         subq.w    #1,8(a7)    len--
  209.         addq.w    #1,a0
  210.         move.b    (a0),d1
  211.         bra.b    L4
  212. L3:
  213.         move.b    d1,d0
  214.         bsr.b    alpha
  215.         tst    d0
  216.         beq    L4
  217.         ori.b    #%00100000,d1
  218. L4:
  219.         move.b    d1,(a1)+
  220.         addq.w    #1,a0
  221.         bra    L1
  222. alpha:
  223.         cmpi.b    #'A',d0
  224.         blt    L5
  225.         cmpi.b    #'Z',d0
  226.         bls    L6
  227. L5:        clr    d0
  228. L6:        rts
  229. *
  230. L2:
  231.         clr.b    (a1)
  232. *        jmp    ___main
  233. ******
  234. * xmain.c
  235. *
  236.     .text
  237. *    .globl  _main
  238.     .globl _strcpy,_creat,___open,__salloc
  239.     .globl _lseek,_close,_strlen
  240. * ___main:
  241. * com = 8, len = 12, i = d7, s= a5, p = a4, c = d6, pfd = fffc, tmpbuf = ffde
  242.         link  a6,#$FFDE
  243.         movem.l  d5-d7/a3-a5,-(a7)
  244.     lea    $ffde(a6),a3
  245.      move.l    __break,d0
  246.     move.l  d0,argv
  247.         move.l  d0,argn
  248.         clr.w  argc
  249.         move.l  #___pname,(a7)
  250.         bsr    _addargv
  251.         movea.l  8(a6),a5
  252.         bra  L7b
  253. L10b:
  254.         addq.w  #1,a5
  255. L11b:
  256.         move.b (a5),d0
  257.         beq  L5b
  258.         cmpi.b    #' ',d0
  259.     beq    L10b
  260.     cmpi.b    #9,d0
  261.     beq    L10b
  262.         cmpi.b  #$22,(a5)        * double quote
  263.         beq  L10001b
  264.         cmpi.b  #$27,(a5)        * single quote
  265.         bne  L12b
  266. L10001b:
  267.         move.b  (a5),d6
  268.         ext.w  d6
  269.         move.w  d6,(a7)
  270.         move.l  a5,-(a7)
  271.         addq.l  #1,(a7)
  272.         jsr  _strchr
  273.         addq.w  #4,a7
  274.         movea.l  d0,a4
  275.         tst.l  d0
  276.         bne  L13b
  277.         move.l  #L14b,(a7)
  278.         move.l  a5,-(a7)
  279.         bra  __err        * unmatched quote
  280. L13b:
  281.     clr.b    (a4)
  282.         sub.l  a5,d0
  283.         move.w  d0,d7
  284.         addq.w  #1,d7
  285.         move.l  a5,(a7)
  286.         addq.l  #1,(a7)
  287.         bsr  _addargv
  288.         bra  L6b
  289. L12b:
  290.         clr.w  d7
  291.         bra  L18b
  292. L17b:
  293.         addq.w  #1,d7
  294. L18b:
  295.     move.b    0(a5,d7.w),d0
  296.         beq  L20b
  297.         cmpi.b    #' ',d0
  298.     beq    L16b
  299.     cmpi.b    #9,d0
  300.     bne    L17b
  301. L16b:
  302.         clr.b    0(a5,d7.w)
  303.         addq.w  #1,d7
  304. L20b:
  305.         move.b  (a5),d0
  306.         ext.w  d0
  307.         cmp.b  #'>',d0
  308.         beq  L26b
  309.         cmp.b  #'<',d0
  310.         bne  L33b
  311. * standard input
  312. L23b:
  313.         clr.w  (a7)
  314.         jsr  _close
  315.         clr.w  (a7)
  316.         move.l  a5,-(a7)
  317.         addq.l  #1,(a7)
  318.         jsr  _open
  319.         addq.w  #4,a7
  320.         tst.w  d0
  321.         beq  L6b
  322.         move.l  a5,(a7)
  323.         addq.l  #1,(a7)
  324.         move.l  #L25b,-(a7)
  325.         bra  __err
  326. * standard output
  327. L26b:
  328.         move.w  #1,(a7)
  329.         jsr  _close
  330.         cmpi.b  #'>',1(a5)
  331.         bne  L27b
  332. * appending output
  333.         move.w  #1,(a7)
  334.         move.l  a5,-(a7)
  335.         addq.l  #2,(a7)
  336.         jsr  _open
  337.         addq.w  #4,a7
  338.         cmpi.w  #1,d0            * fd for std out
  339.         bne  L10003b             * must create then***
  340.         move.w  #2,(a7)
  341.         clr.l  -(a7)
  342.         move.w  #1,-(a7)
  343.         jsr  _lseek            * append at end
  344.         addq.w  #6,a7
  345.         addq.l #1,d0
  346.         bne  L6b
  347.         move.l  a5,(a7)
  348.         addq.l  #1,(a7)
  349.         move.l  #L29b,-(a7)
  350.         bra  __err
  351. L10003b:
  352.     subq.w    #1,d7
  353.     addq.w    #1,a5
  354. * delete old and create new outputfile
  355. L27b:
  356.         clr.w  (a7)
  357.         move.l  a5,-(a7)
  358.         addq.l  #1,(a7)
  359.         jsr  _creat
  360.         addq.w  #4,a7
  361.         cmp.w  #1,d0
  362.         beq  L6b
  363.         move.l  a5,(a7)
  364.         addq.l  #1,(a7)
  365.         move.l  #L32b,-(a7)
  366.         bra  __err
  367. L33b:
  368.         move.w  #$3F,(a7)        * '?'
  369.         move.l  a5,-(a7)
  370.         jsr  _strchr
  371.         addq.w  #4,a7
  372.         tst.l  d0
  373.         bne  L10004b
  374.         move.w  #$2A,(a7)        * '*'
  375.         move.l  a5,-(a7)
  376.         jsr  _strchr
  377.         addq.w  #4,a7
  378.         tst.l  d0
  379.         beq  L34b
  380. * contained ? or *
  381. L10004b:
  382.         movea.l  #__fds+540,a0        * 180*3 (21C)
  383.         move.l  a0,$FFFC(a6)
  384.     lea    $34(a0),a0
  385.         move.l  a0,d1
  386.         move.w  #$1a,d0
  387.         trap    #2            * set dma
  388.         move.w  #17,(a7)        search for first
  389.         move.l  a5,-(a7)        filename
  390.         move.w  #3,-(a7)        file descriptor
  391.         jsr  ___open            this does not really open
  392.         addq.w  #6,a7
  393.         move.b  d0,d6
  394.         cmp.b  #$FF,d6
  395.         bne  L38b
  396.         move.l  #L36b,(a7)
  397.         move.l  a5,-(a7)
  398.         bra  __err
  399. L38b:
  400.     move.l  a3,(a7)
  401.         ext.w  d6
  402.         move.w  d6,-(a7)
  403.         move.l  $FFFC(a6),-(a7)
  404.         bsr  __toasc
  405.         addq.w  #6,a7
  406.     move.l  a3,(a7)
  407.         jsr  _strlen
  408.         move.w  d0,(a7)
  409.         addq.w  #1,(a7)
  410.         jsr  __salloc        * sp lowered by d0+1 bytes with care
  411.         movea.l  d0,a4
  412.         move.l  a3,(a7)
  413.         move.l  a4,-(a7)
  414.         jsr  _strcpy
  415.         addq.w  #4,a7
  416.         move.l  a4,(a7)
  417.         bsr  _addargv
  418.         move.w  #$12,(a7)
  419.         move.l  a5,-(a7)
  420.         move.w  #$3,-(a7)
  421.         jsr  ___open
  422.         addq.w  #6,a7
  423.         move.b  d0,d6
  424.         cmp.b  #$FF,d0
  425.         bne  L38b
  426.         bra  L6b
  427. L34b:
  428.         move.l  a5,(a7)
  429.         bsr  _addargv
  430. L6b:
  431.         adda.w  d7,a5
  432. L7b:
  433.         tst.b  (a5)
  434.         bne  L11b
  435. L5b:
  436.         clr.l  (a7)
  437.         bsr  _addargv
  438.         subq.w  #1,argc
  439.         move.l  argn,(a7)
  440.         bsr  _brk
  441.         cmp.w  #$FFFF,d0
  442.         bne  L41b
  443.         move.l  #L43b,(a7)
  444.         move.l  #L42b,-(a7)
  445.         bra  __err
  446. L41b:
  447.         clr.l  (a7)
  448.         move.l  argv,-(a7)
  449.         move.w  argc,-(a7)
  450.         jsr  _main            execute user program
  451.         addq.w  #6,a7
  452.         move.w  d0,(a7)            return value to shell
  453.         jsr  _exit            never returns
  454. __err:
  455. * s1 = 8 s2 = 12, buf = ff80
  456.  
  457.        movea.l    4(a7),a0
  458.     bsr    L45b
  459.     movea.l    8(a7),a0
  460.     bsr    L45b
  461.     move.w    #$FFFF,(a7)
  462.     jmp    _exit
  463. L45b:
  464.     move.b    (a0)+,d1
  465.     beq    L44b
  466.     moveq    #2,d0
  467.     trap    #2
  468.     bra    L45b
  469. L44b:    rts
  470. *
  471. _addargv:
  472. * ptr = a0    store argv to address pointed by argn, and increment argn
  473.         movea.l  argn,a0
  474.         move.l  4(a7),(a0)
  475.         addq.l  #4,argn
  476.         addq.w  #1,argc
  477.         rts
  478. __toasc:
  479. * p = a2, c = d0, buf = a1, f = a0, i = d1
  480.         link  a6,#-4
  481.         movea.l  8(a6),a2
  482.         move.b  13(a6),d0        * c
  483.         movea.l  14(a6),a1
  484.         clr.b  (a1)
  485.         clr.w  d1
  486.         lea  $34(a2),a0
  487.         ext.w  d0            * c
  488.         asl.w  #5,d0
  489.         adda.w  d0,a0
  490.         move.b  2(a2),d0
  491.         beq  L51b
  492.         ext.w  d0
  493.         subq.w  #1,d0            * offset by one
  494.         cmpi.w  #10,d0
  495.         blt  L52b
  496.         move.b  #'1',(a1)+
  497.     subi.w    #10,d0
  498. L52b:
  499.         add.b  #'0',d0
  500.         move.b  d0,(a1)+        * user number
  501.         move.b  #$3A,(a1)+         * colon
  502.         move.w  #1,d1
  503. L51b:
  504.         tst.b  $10(a2)            * drive name
  505.         beq  L53b
  506.         tst.w  d1
  507.         beq  L54b
  508.         subq.w  #1,a1            * erase colon
  509. L54b:
  510.         move.b  $10(a2),d0
  511.         addi.b  #$60,d0
  512.         move.b  d0,(a1)+
  513.         move.b  #$3A,(a1)+
  514. * tolower
  515. L53b:    addq.w    #1,a0
  516.         move.w  #7,d1
  517. L58b:    bsr    L55b
  518.     dbra    d1,L58b
  519.         move.b  #$2E,(a1)+
  520.         move.w  #2,d1
  521. L63b:    bsr    L55b
  522.     dbra    d1,L63b
  523.         clr.b  (a1)+
  524.         unlk  a6
  525.         rts
  526. *
  527. *** tolower
  528. L55b:    move.b    (a3)+,d0
  529.     cmpi.b    #$20,d0
  530.     beq    L56b
  531.     cmpi.b    #'A',d0
  532.     bcs    L57b
  533.     cmpi.b    #'Z'+1,d0
  534.     bcc    L57b
  535.     ori.b    #%00100000,d0
  536. L57b:    move.b    d0,(a4)+
  537. L56b:    rts
  538.     .data
  539. L14b:    dc.b ': unmatched quote',0
  540. L25b:    dc.b 'Cannot open ',0
  541. L29b:    dc.b 'Cannot append ',0
  542. L32b:    dc.b 'Cannot creat ',0
  543. L36b:    dc.b ': No match',0
  544. L42b:    dc.b 'Stack Overflow',0
  545. L43b:    dc.b    0
  546. *
  547.     .bss
  548. argc:     ds.w    1
  549. argv:     ds.l    1        * pointer to the first address of argv
  550. argn:     ds.l    1        * pointer to the next argv
  551.         .end
  552.  
  553.