home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 52 / af052sub.adf / false.lha / False / false.s < prev    next >
Text File  |  1993-07-16  |  6KB  |  377 lines

  1. ; FALSE compiler in a 1020 bytes executable!
  2. ; Wouter van Oortmerssen, 1993, v1.1
  3. ; - fixed free twice bug in v1.0
  4.  
  5. maxsource    = 25000
  6. maxcode        = 30000
  7. maxmem        = maxsource+maxcode+5000
  8.  
  9. k:    clr.b    -1(a0,d0.w)
  10.     move.l    a0,d5            ; d5=temparg
  11.     move.l    4.w,a6
  12.     moveq    #0,d1
  13.     moveq    #1,d0
  14.     swap    d0            ; move.l #maxmem,d0
  15.     jsr    -684(a6)        ; allocvec
  16.     move.l    d0,d6            ; d6=tempmem
  17.     beq    nfrer
  18.     move.l    d6,a2            ; a2=mem
  19.     move.l    d6,a4            ; a4=code
  20.     lea    maxsource(a4),a4
  21.     move.l    a4,d7            ; d7=begin_of_code
  22.     lea    maxcode(a4),a3        ; a3=lambda-stack
  23.     lea    dosn(pc),a1
  24.     moveq    #37,d0
  25.     jsr    -552(a6)        ; opendoslib
  26.     tst.l    d0
  27.     beq.w    ncler
  28.     move.l    d0,a6            ; a6=dosbase
  29.     move.l    d5,d1
  30.     move.l    #1005,d2
  31.     jsr    -30(a6)            ; open(arg)
  32.     tst.l    d0
  33.     beq.w    er
  34.     move.l    d0,d5            ; d5=temphandle
  35.     move.l    d0,d1
  36.     move.l    d6,d2
  37.     move.l    #maxsource,d3
  38.     jsr    -42(a6)            ; readfile
  39.     move.l    d0,d6
  40.     move.l    d5,d1
  41.     jsr    -36(a6)            ; close
  42.     cmp.w    #1,d6
  43.     bmi.w    er
  44.     add.l    d2,d6            ; d6=end_of_source
  45.     move.l    d2,a5            ; a5=source
  46.     lea    initc(pc),a0
  47.     lea    inite(pc),a1
  48.     bsr    copy
  49.  
  50. loop:    cmp.l    d6,a5            ; main loop
  51.     bpl.w    done
  52.     moveq    #0,d0
  53.     move.b    (a5)+,d0
  54.     cmp.w    #"0",d0
  55.     bpl.w    num
  56. numb:    cmp.w    #"[",d0            ; lambda
  57.     bne.s    .1
  58.     move.l    #$41fa0008,(a4)+    ;    lea    ...(pc),a0
  59.     move.w    #$2b08,(a4)+        ;    move.l    a0,-(a5)
  60.     move.l    #$6000fff8,(a4)+    ;    bra    ...
  61.     move.l    a4,(a3)+
  62.     bra.s    loop
  63. .1:    cmp.w    #"]",d0            ; end of lambda
  64.     bne.s    .2
  65.     move.w    #$4e75,(a4)+
  66.     move.l    -(a3),a0
  67.     move.l    a4,d0
  68.     sub.l    a0,d0
  69.     addq.l    #2,d0
  70.     move.w    d0,-2(a0)
  71.     bra.s    loop
  72. .2:    cmp.w    #"a",d0            ; variable
  73.     bpl.w    var
  74. varb:    cmp.w    #" "+1,d0
  75.     bmi.s    loop
  76.     cmp.w    #"{",d0
  77.     bne.s    .1
  78. .l:    cmp.l    d6,a5            ; collect comments
  79.     bpl.w    done
  80.     cmp.b    #"}",(a5)+
  81.     bne.s    .l
  82.     bra.s    loop
  83. .1:    cmp.w    #34,d0
  84.     bne.s    .2
  85.     move.l    #$41fa0006,(a4)+    ; gen code for string
  86.     move.l    #$60000000,(a4)+
  87.     move.l    a4,a0
  88. .l2:    cmp.l    d6,a5
  89.     bpl.s    .f
  90.     cmp.b    #34,(a5)
  91.     beq.s    .f
  92.     move.b    (a5)+,(a4)+
  93.     bra.s    .l2
  94. .f:    addq.l    #1,a5
  95.     clr.b    (a4)+
  96.     move.l    a4,d0
  97.     btst    #0,d0
  98.     beq.s    .even
  99.     clr.b    (a4)+
  100. .even:    move.l    a4,d0
  101.     sub.l    a0,d0
  102.     addq.l    #2,d0
  103.     move.w    d0,-2(a0)
  104.     move.l    #$22084eae,(a4)+
  105.     move.w    #$fc4c,(a4)+
  106.     bra.w    loop
  107. .2:    cmp.w    #"'",d0            ; ascii
  108.     bne.s    .3
  109.     moveq    #0,d0
  110.     move.b    (a5)+,d0
  111.     move.w    #$2b3c,(a4)+
  112.     move.l    d0,(a4)+
  113.     bra.w    loop
  114. .3:    cmp.w    #"`",d0            ; inline assembler :-)
  115.     bne.s    .4
  116.     move.l    -(a4),d0
  117.     subq.l    #2,a4
  118.     move.w    d0,(a4)+
  119.     bra.w    loop
  120. .4:
  121.     lea    plus(pc),a0
  122. search:    cmp.b    2(a0),d0        ; generate code for symbol
  123.     bne.s    next
  124.     addq.l    #3,a0
  125.     moveq    #0,d1
  126.     move.b    (a0)+,d1
  127. .cl:    move.w    (a0)+,(a4)+
  128.     dbra    d1,.cl
  129.     bra.w    loop
  130. next:    move.w    (a0),d1
  131.     beq.w    er
  132.     add.w    d1,a0
  133.     bra.s    search
  134.  
  135. done:    lea    exitc(pc),a0
  136.     lea    exite(pc),a1
  137.     bsr    copy
  138.     move.l    a4,d0            ; ready, now write executable.
  139.     btst    #1,d0
  140.     beq.s    .s
  141.     clr.w    (a4)+
  142. .s:    move.l    a4,d0
  143.     sub.l    d7,d0
  144.     sub.l    #32,d0
  145.     lsr.l    #2,d0
  146.     move.l    #1010,(a4)+        ; hunk_end
  147.     move.l    d7,a0
  148.     move.l    d0,20(a0)        ; hunk lenght
  149.     move.l    d0,28(a0)
  150.     lea    exen(pc),a0
  151.     move.l    a0,d1            ; now write exe
  152.     move.l    #1006,d2
  153.     jsr    -30(a6)            ; open
  154.     move.l    d0,d4
  155.     beq    er
  156.     move.l    d0,d1
  157.     move.l    d7,d2
  158.     move.l    a4,d3
  159.     sub.l    d7,d3
  160.     jsr    -48(a6)            ; write
  161.     move.l    d4,d1
  162.     jsr    -36(a6)            ; close
  163.  
  164. close:    move.l    a6,a1
  165.     move.l    4.w,a6
  166.     jsr    -414(a6)
  167.     bsr.s    ncler
  168.     moveq    #0,d0
  169.     rts
  170.  
  171. er:    bsr.s    close
  172.     bra.s    nfrer
  173. ncler:    move.l    a2,a1
  174.     jsr    -690(a6)
  175. nfrer:    moveq    #10,d0            ; error exit point
  176.     rts
  177.  
  178. num:    cmp.w    #"9"+1,d0        ; code gen voor num
  179.     bpl.w    numb
  180.     moveq    #0,d1
  181. .l:    mulu    #10,d1
  182.     sub.w    #"0",d0
  183.     add.l    d0,d1
  184.     cmp.b    #"0",(a5)
  185.     bmi.s    .x
  186.     cmp.b    #"9"+1,(a5)
  187.     bpl.s    .x
  188.     moveq    #0,d0
  189.     move.b    (a5)+,d0
  190.     bra.s    .l
  191. .x:    move.w    #$2b3c,(a4)+        ; move.l #x,-(a5)
  192.     move.l    d1,(a4)+
  193.     bra.w    loop
  194.  
  195. var:    cmp.w    #"z"+1,d0        ; code gen voor vars
  196.     bpl.w    varb
  197.     sub.w    #"a",d0
  198.     lsl.w    #2,d0
  199.     move.w    #$41ec,(a4)+        ; lea x(a4),a0
  200.     move.w    d0,(a4)+
  201.     move.w    #$2b08,(a4)+        ; move.l a0,-(a5)
  202.     bra.w    loop
  203.  
  204. copy:    move.l    a1,d0
  205.     sub.l    a0,d0
  206.     lsr.l    #1,d0
  207.     subq.l    #1,d0
  208. .l:    move.w    (a0)+,(a4)+
  209.     dbra    d0,.l
  210.     rts
  211.  
  212. ; code-gen list: implementation for all other symbols.
  213.  
  214. plus:    dr.w    min
  215.     dc.b    "+",1
  216.     move.l    (a5)+,d0
  217.     add.l    d0,(a5)
  218. min:    dr.w    mul
  219.     dc.b    "-",1
  220.     move.l    (a5)+,d0
  221.     sub.l    d0,(a5)
  222. mul:    dr.w    div
  223.     dc.b    "*",3
  224.     move.l    (a5)+,d0
  225.     muls    2(a5),d0
  226.     move.l    d0,(a5)
  227. div:    dr.w    printi
  228.     dc.b    "/",4
  229.     move.l    (a5)+,d0
  230.     move.l    (a5),d1
  231.     divs    d0,d1
  232.     ext.l    d1
  233.     move.l    d1,(a5)
  234. printi:    dr.w    exe
  235.     dc.b    ".",9
  236.     bra.s    .c
  237. .form:    dc.b    "%ld",0
  238. .c:    lea    .form(pc),a0
  239.     move.l    a0,d1
  240.     move.l    a5,d2
  241.     jsr    -954(a6)
  242.     addq.l    #4,a5
  243. exe:    dr.w    store
  244.     dc.b    "!",1
  245.     move.l    (a5)+,a0
  246.     jsr    (a0)
  247. store:    dr.w    get
  248.     dc.b    ":",1
  249.     move.l    (a5)+,a0
  250.     move.l    (a5)+,(a0)
  251. get:    dr.w    equal
  252.     dc.b    ";",1
  253.     move.l    (a5)+,a0
  254.     move.l    (a0),-(a5)
  255. equal:    dr.w    if
  256.     dc.b    "=",5
  257.     move.l    (a5)+,d0
  258.     cmp.l    (a5),d0
  259.     seq    d0
  260.     ext.w    d0
  261.     ext.l    d0
  262.     move.l    d0,(a5)
  263. if:    dr.w    dup
  264.     dc.b    "?",3
  265.     move.l    (a5)+,a0
  266.     move.l    (a5)+,d0
  267.     beq.s    .f
  268.     jsr    (a0)
  269. .f:
  270. dup:    dr.w    drop
  271.     dc.b    "$",0
  272.     move.l    (a5),-(a5)
  273. drop:    dr.w    swap
  274.     dc.b    "%",0
  275.     addq.l    #4,a5
  276. swap:    dr.w    rot
  277.     dc.b    "\",4
  278.     move.l    (a5),d0
  279.     move.l    4(a5),(a5)
  280.     move.l    d0,4(a5)
  281. rot:    dr.w    neg
  282.     dc.b    "@",7
  283.     move.l    8(a5),d0
  284.     move.l    4(a5),8(a5)
  285.     move.l    (a5),4(a5)
  286.     move.l    d0,(a5)
  287. neg:    dr.w    and
  288.     dc.b    "_",0
  289.     neg.l    (a5)
  290. and:    dr.w    or
  291.     dc.b    "&",1
  292.     move.l    (a5)+,d0
  293.     and.l    d0,(a5)
  294. or:    dr.w    not
  295.     dc.b    "|",1
  296.     move.l    (a5)+,d0
  297.     or.l    d0,(a5)
  298. not:    dr.w    big
  299.     dc.b    "~",0
  300.     not.l    (a5)
  301. big:    dr.w    while
  302.     dc.b    ">",5
  303.     move.l    (a5)+,d0
  304.     cmp.l    (a5),d0
  305.     smi    d0
  306.     ext.w    d0
  307.     ext.l    d0
  308.     move.l    d0,(a5)
  309. while:    dr.w    put
  310.     dc.b    "#",12
  311.     movem.l    (a5)+,a0/a1        ; fun,boolf
  312.     movem.l    a0/a1,-(a7)
  313. .s:    move.l    4(a7),a0
  314.     jsr    (a0)
  315.     tst.l    (a5)+
  316.     beq.s    .e
  317.     move.l    (a7),a0
  318.     jsr    (a0)
  319.     bra.s    .s
  320. .e:    addq.l    #8,a7
  321. put:    dr.w    getc
  322.     dc.b    ",",3
  323.     move.l    d6,d1
  324.     move.l    (a5)+,d2
  325.     jsr    -312(a6)
  326. getc:    dr.w    pick
  327.     dc.b    "^",3
  328.     move.l    d5,d1
  329.     jsr    -306(a6)
  330.     move.l    d0,-(a5)
  331. pick:    dr.w    flush
  332.     dc.b    "ø",3
  333.     move.l    (a5)+,d0
  334.     lsl.l    #2,d0
  335.     move.l    0(a5,d0.l),-(a5)
  336. flush:    dc.w    0
  337.     dc.b    "ß",5
  338.     move.l    d5,d1
  339.     jsr    -360(a6)
  340.     move.l    d6,d1
  341.     jsr    -360(a6)
  342.  
  343. exen:    dc.b    "a.out",0
  344.     even
  345.  
  346. ; initialisation code.
  347.  
  348. initc:    dc.l    1011            ; hunkheader
  349.     dc.l    0,1,0,0         ; endofnames,1hunk,firsthunkno,lasthn
  350.     dc.l    0            ; codesize/4
  351.     dc.l    1001            ; hunkcode
  352.     dc.l    0            ; codesize/4
  353.     lea    -$900(a7),a5        ; a5=calcstack
  354.     lea    -$800(a7),a4        ; a4=variables
  355.     move.l    a0,(a4)            ; var_a=arg
  356.     move.l    4.w,a6
  357.     lea    dosn(pc),a1
  358.     moveq    #37,d0
  359.     jsr    -552(a6)        ; opendoslib
  360.     tst.l    d0
  361.     bne.s    .o
  362.     rts
  363. .o:    move.l    d0,a6
  364.     jsr    -60(a6)
  365.     move.l    d0,d6            ; d6=stdout
  366.     jsr    -54(a6)
  367.     move.l    d0,d5            ; d5=stdin
  368.     bra.s    inite
  369. dosn:    dc.b    "dos.library",0
  370. inite:
  371. exitc:    move.l    a6,a1
  372.     move.l    4.w,a6
  373.     jsr    -414(a6)
  374.     moveq    #0,d0
  375.     rts
  376. exite:
  377.