home *** CD-ROM | disk | FTP | other *** search
/ 64'er 1989 October / 64er_Magazin_89-10_1989_Markt__Technik_de_Side_A.d64 / decomp.src < prev    next >
Text File  |  2022-10-26  |  24KB  |  1,403 lines

  1. ;***********************************************************
  2. ;*                                                         *
  3. ;*     Decompiler fuer C64 mit Austrocompiler              *
  4. ;*         Bringt mit dem Austrocompiler kompilierte       *
  5. ;*         Basicprogramm wieder in eine lesbare Form.      *
  6. ;*                                                         *
  7. ;*     Geschrieben 1987/88 von Thomas Klaeger              *
  8. ;*                                                         *
  9. ;***********************************************************
  10. ;
  11. ;
  12.        .nolist
  13.        .error
  14. *      =   $9000
  15. ;
  16. ;  Betriebssystemroutinen:
  17. ;
  18. bsout  =   $ffd2
  19. basin  =   $ffcf
  20. clrch  =   $ffcc
  21. chkin  =   $ffc6
  22. ckout  =   $ffc9
  23. open   =   $ffc0
  24. close  =   $ffc3
  25. filpar =   $ffba
  26. filnam =   $ffbd
  27. load   =   $ffd5
  28. reset  =   $fce2
  29. ;
  30. ;  Datenadressen: (globale Daten)
  31. ;
  32. vst    =   $2d
  33. arst   =   $2f
  34. aren   =   $31
  35. inst   =   $33
  36. datst  =   $35
  37. prgst  =   $37
  38. count  =   $39
  39. ;
  40. savesp =   $fe
  41. ;
  42. namlen =   $ff
  43. nambuf =   $200
  44. nambu2 =   nambuf+2
  45. ;
  46. ;  Datenadressen: (lokale Daten, werden mit pushrg gerettet
  47. ;                  und mit poprg restauriert)
  48. ;
  49. wp     =   $3b
  50. pf     =   $3d
  51. pl     =   $3f
  52. pt     =   $41
  53. p2     =   $43
  54. prior1 =   $45
  55. prior2 =   $46
  56. priorc =   $47
  57. c      =   $48
  58. i      =   $49
  59. ;
  60. ;  hierher kommen Rueckmeldungen:
  61. ;
  62. back   =   $14
  63. ;
  64. ;  Daten zur Zeilennummerierung:
  65.  
  66. linbuf =   $b000
  67. lline  =   $7a
  68. ;
  69. ;  verschiedene benoetigte Macros:
  70. ;
  71. .mac   print ;gibt text aus
  72.        ldx #0
  73. ?2     lda ?1,x
  74.        pha
  75.        and #$7f
  76.        jsr bsout
  77.        inx
  78.        pla
  79.        bpl ?2
  80. .mnd
  81. ;
  82. .mac   mvw ;verschieben von 2-Byte-
  83.        lda ?1 ;Zeigern
  84.        ldy ?1+1
  85.        sta ?2
  86.        sty ?2+1
  87. .mnd
  88. ;
  89. .mac   phw ;push word
  90.        lda ?1+1
  91.        pha
  92.        lda ?1
  93.        pha
  94. .mnd
  95. ;
  96. .mac   plw ;pull word
  97.        pla
  98.        sta ?1
  99.        pla
  100.        sta ?1+1
  101. .mnd
  102. ;
  103. ;
  104. ;  Das Werk kann beginnen:
  105. ;
  106.        jmp start
  107. ;
  108. error  lda #13     ; Floppyfehlerkanal abfragen
  109.        jsr bsout
  110.        ldx #15     ; vom Kommandokanal der Floppy
  111.        jsr chkin   ; Lesen
  112.        jsr basin   ; Zeichen holen
  113.        cmp #'0'    ; Nummer '00' oder '01'?
  114.        beq ok
  115.        cmp #'7'    ; Nummer '73' (Resetmeldung?)
  116.        bne out
  117.        jsr basin
  118.        cmp #'3'
  119.        beq ok
  120.        pha
  121.        lda #'7'
  122.        jsr bsout
  123.        pla
  124. out    jsr bsout   ; Fehlermeldung ausgeben
  125.        jsr basin
  126.        cmp #$d
  127.        bne out
  128.        pla
  129.        pla
  130.        jsr clrch
  131.        jmp start
  132. ok     jsr basin   ; Fehlermeldung nur lesen
  133.        cmp #$d
  134.        bne ok
  135.        jsr clrch
  136.        rts
  137. ;
  138. titel  .byt $d,'decompiler zum austrocompiler',$8d
  139. fnam   .byt 'bitte filenamen eingeben',$8d
  140. init   .byt 'i0'
  141. ;
  142. ;
  143. ende   jmp reset
  144. ;
  145. ;
  146. start  tsx
  147.        stx savesp
  148.        print titel
  149.        print fnam
  150.        ldy #0
  151. get    jsr basin
  152.        cmp #$d
  153.        beq end
  154.        cmp #95     ; "<-" zum Abbruch
  155.        beq ende
  156.        sta nambuf+2,y
  157.        iny
  158.        bne get
  159. end    tya
  160.        beq start
  161.        cmp #16
  162.        bcs start
  163.        sty namlen
  164. ;
  165.        lda #15 ;fehlerkanal oeffnen
  166.        ldx #8
  167.        tay
  168.        jsr filpar
  169.        lda #2
  170.        ldx #<init
  171.        ldy #>init
  172.        jsr filnam
  173.        jsr open
  174. ;
  175.        lda #1 ;programm laden
  176.        ldx #8
  177.        ldy #0
  178.        jsr filpar
  179.        lda namlen
  180.        ldx #<nambu2
  181.        ldy #>nambu2
  182.        jsr filnam
  183.        ldx #1
  184.        ldy #8
  185.        lda #0
  186.        jsr load
  187.        jsr error
  188. ;
  189.        lda namlen
  190.        adc #2
  191.        cmp #16
  192.        bcc filop
  193.        lda #16
  194. filop  sta namlen
  195.        lda #'b'
  196.        sta nambuf
  197.        lda #'/'
  198.        sta nambuf+1
  199.        ldx #15
  200.        jsr ckout
  201.        lda #'s'    ; altes Basic-
  202.        jsr bsout   ; programm loeschen
  203.        lda #':'
  204.        jsr bsout
  205.        ldy #0
  206. deloop lda nambuf,y
  207.        jsr bsout
  208.        iny
  209.        cpy namlen
  210.        bne deloop
  211.        lda #13
  212.        jsr bsout
  213.        jsr clrch
  214.        jsr error
  215.        lda #2 ; ausgabedatei oeffnen
  216.        ldx #8
  217.        ldy #1
  218.        jsr filpar
  219.        clc
  220.        lda namlen
  221.        ldx #<nambuf
  222.        ldy #>nambuf
  223.        jsr filnam
  224.        jsr open
  225.        jsr error
  226. ;
  227.        ldx #11 ;Parameter holen
  228. setpar lda $1784,x
  229.        sta vst,x
  230.        dex
  231.        bpl setpar
  232. ;
  233.        lda datst+1 ; wirklich austro-compiler-
  234.        cmp inst+1  ; code?
  235.        bcc noaust
  236.        bne ok01
  237.        ldy datst
  238.        cpy inst
  239.        bcc noaust
  240. ok01   lda prgst+1
  241.        cmp datst+1
  242.        bcc noaust
  243.        bne ok02
  244.        ldy prgst
  245.        cpy datst
  246.        bcc noaust
  247. ok02   lda vst+1
  248.        cmp prgst+1
  249.        bcc noaust
  250.        bne ok03
  251.        ldy vst
  252.        cpy prgst
  253.        bcc noaust
  254. ok03   lda arst+1
  255.        cmp vst+1
  256.        bcc noaust
  257.        bne ok04
  258.        ldy arst
  259.        cpy vst
  260.        bcc noaust
  261. ok04   lda aren+1
  262.        cmp arst+1
  263.        bcc noaust
  264.        bne vpack
  265.        ldy aren
  266.        cpy arst
  267.        bcs vpack
  268. noaust print notok
  269.        ldx savesp
  270.        txs
  271.        jmp start
  272. notok  .byt 13,'code nicht ok, kein austro-compiler-',13,'programm!!',$8d
  273. ;
  274. vpack  mvw vst,count ; Variabelnnamen packen
  275.        mvw vst,pt
  276. vpack0 lda count+1
  277.        cmp arst+1
  278.        bcc vpa00
  279.        lda count
  280.        cmp arst
  281.        bcs vpack1
  282. vpa00  ldy #0
  283.        lda (count),y
  284.        sta (pt),y
  285.        iny
  286.        lda (count),y
  287.        sta (pt),y
  288.        clc
  289.        lda #7
  290.        adc count
  291.        sta count
  292.        bcc vpa01
  293.        inc count+1
  294. vpa01  clc
  295.        lda #2
  296.        adc pt
  297.        sta pt
  298.        bcc vpack0
  299.        inc pt+1
  300.        bne vpack0
  301. vpack1 mvw pt,arst
  302. ;
  303.        ldy #0          ; vordefinierte Arrays
  304.        lda (inst),y    ; holen
  305.        cmp #$16
  306.        bne pda00
  307.        jmp noar        ; Keine Arrays vorhanden
  308. pda00  mvw inst,count
  309.        mvw inst,pl
  310.        jsr intval      ; Anzahl Arrays holen
  311.        inc back
  312.        bne pda01
  313.        inc back+1
  314. pda01  mvw back,$60    ; Platz fuer Array-
  315.        asl $60         ; Deskriptoren
  316.        rol $61         ; schaffen
  317.        clc
  318.        lda $60
  319.        adc back
  320.        sta back
  321.        lda $61
  322.        adc back+1
  323.        sta back+1
  324.        clc
  325.        lda arst
  326.        adc back
  327.        sta aren
  328.        lda arst+1
  329.        adc back+1
  330.        sta aren+1
  331. ;
  332. arloop jsr next
  333.        ldy #0
  334.        lda (count),y
  335.        cmp #$16        ; Ende der vordefinierten
  336.        beq noar        ; Arrays
  337.        cmp #$10        ; Dim?
  338.        bne arloop
  339.        jsr getarn
  340.        jmp arloop
  341. ;
  342. noar   lda #>linbuf
  343.        ldy #4
  344.        sta $7b
  345.        sty $7a
  346.        lda #$8f
  347.        ldy #0
  348.        sta wp+1
  349.        sty wp
  350.        lda #0
  351.        sta linbuf
  352.        sta linbuf+1
  353.        lda #255
  354.        sta linbuf+2
  355.        sta linbuf+3
  356.        lda #$36
  357.        sta 1
  358.        jsr pass1
  359.        jsr pass2
  360.        jsr pass3
  361.        lda #2
  362.        jsr close
  363.        jmp start
  364. ;
  365. ; ************************************
  366. ; *          Unterprogramme          *
  367. ; ************************************
  368. ;
  369. getarn ldy #1      ; Arrayparameter ablegen
  370.        lda (count),y
  371.        sta $5a
  372.        iny
  373.        lda (count),y
  374.        sta $58
  375.        iny
  376.        lda (count),y
  377.        sta $59
  378.        iny
  379.        lda (count),y
  380.        sta back+1
  381.        iny
  382.        lda (count),y
  383.        sec
  384.        sbc #7
  385.        sta back
  386.        lda back+1
  387.        sbc #0
  388.        sta back+1
  389.        lsr a
  390.        sta $61
  391.        lda back
  392.        ror a
  393.        clc
  394.        adc back
  395.        sta back
  396.        lda back+1
  397.        adc $61
  398.        sta back+1
  399.        lda $58
  400.        cmp #$da
  401.        bne ar1
  402.        lda $59
  403.        cmp #$aa
  404.        beq ar3
  405. ar1    clc
  406.        lda back
  407.        adc arst
  408.        sta back
  409.        lda back+1
  410.        adc arst+1
  411.        sta back+1
  412.        ldy #2
  413. ar2    lda $58,y
  414.        sta (back),y
  415.        dey
  416.        bpl ar2
  417. ar3    rts
  418. ;
  419. intval ldy #0
  420.        lda (pl),y
  421.        bmi intv00
  422.        rts
  423. intv00 sty back
  424.        sty back+1
  425.        iny
  426.        cmp #$a6
  427.        bne intva1
  428.        lda (pl),y
  429.        sta back
  430.        rts
  431. intva1 cmp #$a7
  432.        bne intva2
  433.        lda (pl),y
  434.        sta back+1
  435.        iny
  436.        lda (pl),y
  437.        sta back
  438.        rts
  439. intva2 cmp #$c0
  440.        and #15
  441.        bcc intv01
  442.        clc
  443.        adc #$10
  444. intv01 sta back
  445.        rts
  446. ;
  447. nextab
  448. ;           0 1 2 3 4 5 6 7 8 9 a b c d e f
  449.        .byt 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 0
  450.        .byt 6,1,1,1,1,1,1,1,0,3,3,0,0,1,1,2 1
  451.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 2
  452.        .byt 1,1,1,1,1,1,1,6,3,1,1,1,1,1,1,1 3
  453.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 4
  454.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 5
  455.        .byt 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 6
  456.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 7
  457.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 8
  458.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 9
  459.        .byt 2,2,2,3,2,3,2,3,6,6,1,1,1,1,1,1 a
  460.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 b
  461.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 c
  462.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 d
  463.        .byt 2,2,2,3,2,3,1,0,1,2,3,4,5,6,7,8 e
  464.        .byt 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 f
  465. ;
  466. next   ldy #0
  467.        lda (count),y
  468.        tax
  469.        lda nextab,x
  470.        beq nexta
  471. nextad clc
  472.        adc count
  473.        sta count
  474.        bcc next00
  475.        inc count+1
  476. next00 rts
  477. nexta  lda (count),y
  478.        cmp #$e7
  479.        bne nextb
  480.        iny
  481.        lda (count),y
  482.        clc
  483.        adc #2
  484.        bcc nextad
  485. nextb  cmp #27
  486.        bcc nextc
  487.        iny
  488.        lda (count),y
  489.        bne nextad
  490. nextc  cmp #24
  491.        bne nextd
  492. next01 iny
  493.        lda (count),y
  494.        cmp #':'
  495.        bne next01
  496.        iny
  497. next02 tya
  498.        bne nextad
  499. nextd  iny
  500.        cpy #100
  501.        beq next02
  502.        lda (count),y
  503.        cmp #$9e
  504.        bne nextd
  505.        iny
  506.        lda (count),y
  507.        cmp #'3'
  508.        bne nextd
  509.        iny
  510.        lda (count),y
  511.        cmp #'2'
  512.        bne nextd
  513.        iny
  514.        lda (count),y
  515.        cmp #'2'
  516.        bne nextd
  517.        iny
  518.        lda (count),y
  519.        cmp #'0'
  520.        bne nextd
  521.        iny
  522.        lda (count),y
  523.        cmp #':'
  524.        bne nextd
  525.        iny
  526.        tya
  527.        jmp nextad
  528. ;
  529. getval ldy #0
  530.        lda #$37
  531.        sta 1
  532.        lda priorc
  533.        pha
  534.        lda (pl),y
  535.        cmp #$a8
  536.        bne getint
  537.        ldy pl+1
  538.        lda pl
  539.        clc
  540.        adc #1
  541.        bcc getv0
  542.        iny
  543. getv0  jsr $bba2
  544.        jsr $bddd
  545.        lda #$36
  546.        sta 1
  547.        pla
  548.        sta priorc
  549.        rts
  550. ;
  551. getint jsr intval
  552.        ldy back
  553.        lda back+1
  554.        jsr $b391
  555.        jsr $bddd
  556.        lda #$36
  557.        sta 1
  558.        pla
  559.        sta priorc
  560.        rts
  561. ;
  562. cint   lda #$37
  563.        sta 1
  564.        ldy back
  565.        lda back+1
  566.        jsr $b391
  567.        jsr $bddd
  568.        lda #$36
  569.        sta 1
  570.        lda #1
  571.        ldy #0
  572.        sta back+1
  573.        sty back
  574.        lda (back),y
  575.        cmp #32
  576.        bne cint0
  577.        inc back
  578. cint0  lda (back),y
  579.        sta (pt),y
  580.        beq cint1
  581.        iny
  582.        bne cint0
  583. cint1  rts
  584. ;
  585. getstr ldy #0
  586.        lda #34
  587.        sta (pt),y
  588. getst1 lda (pl),y
  589.        cpy i
  590.        bcs getst2
  591.        iny
  592.        sta (pt),y
  593.        bne getst1
  594. getst2 iny
  595.        lda #34
  596.        sta (pt),y
  597.        iny
  598.        lda #0
  599.        sta (pt),y
  600.        rts
  601. ;
  602. pushrg dec wp+1
  603.        lda wp+1
  604.        cmp aren+1
  605.        bne pushr0
  606.        jmp nomem
  607. pushr0 ldy #0
  608. pushr1 lda $3d,y
  609.        sta (wp),y
  610.        iny
  611.        cpy #16
  612.        bne pushr1
  613.        rts
  614. ;
  615. poprg  ldy #0
  616. poprg1 lda (wp),y
  617.        sta $3d,y
  618.        iny
  619.        cpy #16
  620.        bne poprg1
  621.        inc wp+1
  622.        rts
  623. ;
  624. varna1 phw count
  625.        ldy #0
  626.        lda (count),y
  627.        sty back+1
  628.        cmp #$e5
  629.        bne varn01
  630.        iny
  631.        lda (count),y
  632.        sta back+1
  633. varn01 iny
  634.        lda (count),y
  635.        jsr varn5
  636.        plw count
  637.        rts
  638. ;
  639. varnam ldy #0
  640.        lda (pl),y
  641.        and #$3f
  642.        sta i
  643.        cmp #32
  644.        bcs varn1
  645.        sta back
  646.        sty back+1
  647.        jsr vnam
  648.        jmp varnc
  649. varn1  cmp #35
  650.        bne varn2
  651.        iny
  652.        lda (pl),y
  653.        sta back+1
  654.        iny
  655.        lda (pl),y
  656.        sta back
  657.        jsr vnam
  658.        jmp varnc
  659. varn2  bcs varn3
  660.        and #3
  661.        sta back+1
  662.        iny
  663.        lda (pl),y
  664.        sta back
  665.        jsr vnam
  666. varnc  ldy #0
  667.        lda $100,y
  668.        sta (pt),y
  669.        beq varnen
  670.        iny
  671.        bne varnc+2
  672. varnen mvw pl,back
  673.        rts
  674. ;
  675. varn3  sty back+1
  676.        cmp #37
  677.        bne varn4
  678.        iny
  679.        lda (pl),y
  680.        sta back+1
  681. varn4  iny
  682.        lda (pl),y
  683. varn5  sta back
  684.        jsr arnam
  685.        pha
  686.        jsr varnc
  687.        pla
  688.        sta back
  689.        jsr incpt
  690. getmul lda #'('
  691.        sta (pt),y
  692.        tya
  693.        sec
  694.        adc pt
  695.        sta pt
  696.        jsr pushrg
  697.        lda back
  698.        pha
  699.        lda #16
  700.        ldy wp+1
  701.        sta pt
  702.        sty pt+1
  703.        jsr getexp
  704.        lda #116
  705.        ldy wp+1
  706.        sta p2
  707.        sty p2+1
  708. varnl  lda #16
  709.        sta pt
  710.        pla
  711.        sec
  712.        sbc #1
  713.        bne varnl0
  714.        jmp varne1
  715. varnl0 pha
  716.        ldy #0
  717. varnl1 lda (pt),y
  718.        sta (p2),y
  719.        beq varnl2
  720.        iny
  721.        bne varnl1
  722. varnl2 mvw back,pl
  723.        jsr getexp
  724.        lda #16
  725.        sta pt
  726.        lda #44
  727.        jsr addchr
  728.        lda #116
  729.        ldy wp+1
  730.        sta p2
  731.        sty p2+1
  732.        ldy #0
  733. varnl3 lda (p2),y
  734.        sta (pt),y
  735.        beq varnl4
  736.        iny
  737.        bne varnl3
  738. varnl4 lda #16
  739.        sta pt
  740.        jmp varnl
  741. varne1 ldy #255
  742. varne2 iny
  743.        lda (pt),y
  744.        bne varne2
  745.        lda #')'
  746.        sta (pt),y
  747.        tya
  748.        pha
  749.        mvw pt,$5f
  750.        jsr poprg
  751.        pla
  752.        tay
  753.        iny
  754.        lda #0
  755.        sta (pt),y
  756.        dey
  757. varne3 lda ($5f),y
  758.        sta (pt),y
  759.        dey
  760.        bpl varne3
  761.        rts
  762. ;
  763. vnam   lda back
  764.        asl a
  765.        rol back+1
  766.        clc
  767.        adc vst
  768.        sta $61
  769.        lda back+1
  770.        adc vst+1
  771.        sta $62
  772. vname  ldy #0
  773.        lda ($61),y
  774.        php
  775.        and #$7f
  776.        sta $100
  777.        iny
  778.        lda ($61),y
  779.        php
  780.        and #$7f
  781.        beq vnam0
  782.        sta $100,y
  783.        iny
  784. vnam0  plp
  785.        bpl vnam3
  786.        plp
  787.        bmi vnam1
  788.        lda #'$'
  789.        bne vnam2
  790. vnam1  lda #'%'
  791. vnam2  sta $100,y
  792.        iny
  793.        bne vnam4
  794. vnam3  plp
  795. vnam4  lda #0
  796.        sta $100,y
  797.        rts
  798. ;
  799. arnam  sec
  800.        lda back
  801.        sbc #3
  802.        sta back
  803.        bcs arn00
  804.        dec back+1
  805. arn00  asl a
  806.        tax
  807.        lda back+1
  808.        rol a
  809.        tay
  810.        txa
  811.        clc
  812.        adc back
  813.        tax
  814.        tya
  815.        adc back+1
  816.        tay
  817.        txa
  818.        adc arst
  819.        sta $61
  820.        tya
  821.        adc arst+1
  822.        sta $62
  823.        jsr vname
  824.        ldy #2
  825.        lda ($61),y
  826.        rts
  827. ;
  828. getexp mvw pf,count ; Holt Ausdruck aus
  829. getexl mvw count,p2 ; dem Text
  830.        jsr next
  831.        lda count+1
  832.        cmp pl+1
  833.        bcc getexl
  834.        lda count
  835.        cmp pl
  836.        bcc getexl
  837.        ldy #0
  838.        lda (p2),y
  839.        sta c
  840.        cmp #7       ; Prioritaet feststellen
  841.        bcs gx000
  842.        lda #4
  843.        bne getexa
  844. gx000  cmp #9
  845.        bcs gx001
  846.        lda #5
  847.        bne getexa
  848. gx001  cmp #11
  849.        bcs gx002
  850.        lda #6
  851.        bne getexa
  852. gx002  bne gx003
  853.        lda #8
  854.        bne getexa
  855. gx003  cmp #13
  856.        bcs gx004
  857.        lda #2
  858.        bne getexa
  859. gx004  bne gx005
  860.        lda #1
  861.        bne getexa
  862. gx005  cmp #15
  863.        bcs gx006
  864.        lda #7
  865.        bne getexa
  866. gx006  bne gx007
  867.        lda #7
  868.        bne getexa
  869. gx007  lda #10
  870. getexa sta priorc
  871.        lda c
  872.        cmp #14
  873.        bcc gx008
  874.        jmp getb00
  875. gx008  jsr pushrg  ; d1 op d2
  876.        mvw p2,pl
  877.        lda #132
  878.        ldy wp+1
  879.        sta pt
  880.        sty pt+1
  881.        jsr getexp  ; hole d2
  882.        ldy #prior2-pf
  883.        sta (wp),y
  884.        mvw back,pl
  885.        lda #32
  886.        sta pt
  887.        jsr getexp  ; hole d1
  888.        ldy #prior1-pf
  889.        sta (wp),y
  890.        lda wp+1
  891.        pha
  892.        jsr poprg
  893.        mvw back,pl
  894.        pla
  895.        sta back+1
  896.        lda #32
  897.        sta back
  898.        ldy #0
  899.        lda prior1   ; muss d1 geklammert werden ?
  900.        cmp priorc
  901.        bcs gx009    ; nein ->
  902.        lda #'('     ; '(' in Ausdruckbuffer
  903.        sta (pt),y
  904.        inc pt
  905. gx009  lda (back),y ; d1 in Ausdruckbuffer
  906.        sta (pt),y
  907.        beq gx010
  908.        iny
  909.        bne gx009
  910. gx010  lda prior1
  911.        cmp priorc
  912.        bcs gx011    ; wenn d1 geklammert werden muss
  913.        lda #')'     ; ')' in Ausdruckbuffer
  914.        sta (pt),y
  915.        iny
  916. gx011  tya
  917.        clc
  918.        adc pt
  919.        sta pt
  920.        ldy #0
  921.        lda c
  922.        cmp #7
  923.        bcc gx012
  924.        adc #162     ; + - * / ^ and or
  925.        sta (pt),y
  926.        iny
  927.        bne geta00
  928. gx012  and #4
  929.        beq gx013
  930.        lda #179     ; '<'
  931.        sta (pt),y
  932.        iny
  933. gx013  lda c
  934.        and #1
  935.        beq gx014
  936.        lda #177     ; '>'
  937.        sta (pt),y
  938.        iny
  939. gx014  lda c
  940.        and #2
  941.        beq geta00
  942.        lda #178     ; '='
  943.        sta (pt),y
  944.        iny
  945. geta00 tya
  946.        clc
  947.        adc pt
  948.        sta pt
  949.        ldy #0
  950.        lda #132
  951.        sta back
  952.        lda prior2   ; muss d2 geklammert werden ?
  953.        cmp priorc
  954.        bcc geta01   ; unbedingt ->
  955.        bne geta02   ; sicher nicht ->
  956.        lda c
  957.        cmp #10      ; wenn op <> '/'
  958.        bne geta02   ; nicht klammern ->
  959.        dec prior2   ; merken fuer 2. Test
  960. geta01 lda #'('
  961.        sta (pt),y
  962.        inc pt
  963. geta02 lda (back),y
  964.        sta (pt),y
  965.        beq geta03
  966.        iny
  967.        bne geta02
  968. geta03 lda prior2
  969.        cmp priorc
  970.        bcs geta04
  971.        lda #')'
  972.        sta (pt),y
  973.        iny
  974. geta04 lda #0
  975.        sta (pt),y
  976.        mvw pl,back
  977.        lda priorc
  978.        rts          ; geschafft!
  979. getb00 cmp #32
  980.        bcs getb02
  981. getb01 jmp getc00
  982. getb02 cmp #52
  983.        bcs getb01
  984.        jsr pushrg
  985.        lda #32     ; fkt(d1)
  986.        ldy wp+1
  987.        sta pt
  988.        sty pt+1
  989.        mvw p2,pl
  990.        jsr getexp  ; d1 holen
  991.        lda wp+1
  992.        pha
  993.        jsr poprg
  994.        mvw back,pl
  995.        pla
  996.        sta back+1
  997.        lda #32
  998.        sta back
  999.        ldy #0
  1000.        lda c
  1001.        clc
  1002.        adc #148
  1003.        sta (pt),y  ;{CBM-B}fkt in den Ausdruckbuffer
  1004.        inc pt
  1005.        lda #'('    ; '(' in den Ausdruckbuffer
  1006.        sta (pt),y
  1007.        inc pt
  1008. getb03 lda (back),y ; d1 in den Ausdruckbuffer
  1009.        sta (pt),y
  1010.        beq getb04
  1011.        iny
  1012.        bne getb03
  1013. getb04 lda #')'     ; ')' in den Ausdruckbuffer
  1014.        sta (pt),y
  1015.        iny
  1016.        lda #0
  1017.        sta (pt),y
  1018.        mvw pl,back
  1019.        lda priorc
  1020.        rts          ; geschafft!
  1021. getc00 cmp #52
  1022.        beq getc01
  1023.        cmp #53
  1024.        bne getd00
  1025. getc01 adc #147     ; fkt(d1,d2) (left$,right$)
  1026.        ldy #0
  1027.        sta (pt),y   ; fkt in den Aus
  1028.        inc pt
  1029.        lda #2
  1030. getc02 sta back     ; back := 2/3
  1031.        sty back+1
  1032.        mvw p2,pl
  1033.        ldy #0
  1034.        jsr getmul   ; 2/3 Teilausdruecke in Klammern holen
  1035.        lda priorc
  1036.        rts          ; geschafft!
  1037. getd00 cmp #54
  1038.        bne gete00
  1039.        adc #147     ; fkt(d1,d2,d3) (mid$)
  1040.        ldy #0
  1041.        sta (pt),y
  1042.        inc pt
  1043.        lda #3
  1044.        bne getc02
  1045. gete00 cmp #$7f
  1046.        bcs gete02
  1047. gete01 jmp getf00
  1048. gete02 cmp #$a6
  1049.        bcs gete01
  1050.        mvw p2,pl
  1051.        jsr varnam   ; Variable holen
  1052.        lda priorc
  1053.        rts
  1054. getf00 cmp #$a6
  1055.        bcs getf02
  1056. getf01 jmp getg00
  1057. getf02 cmp #$a9
  1058.        bcc getf03
  1059.        cmp #$b0
  1060.        bcc getf01
  1061.        cmp #$c0
  1062.        bcc getf03
  1063.        cmp #$f0
  1064.        bcc getf01
  1065. getf03 mvw p2,pl    ; Konstante holen
  1066.        jsr getval
  1067.        lda #1
  1068.        ldy #0
  1069.        sta back+1
  1070.        sty back
  1071.        lda (back),y
  1072.        cmp #32
  1073.        bne getf04
  1074.        inc back
  1075. getf04 lda (back),y
  1076.        sta (pt),y
  1077.        beq getf05
  1078.        iny
  1079.        bne getf04
  1080. getf05 mvw pl,back
  1081.        lda priorc
  1082.        rts
  1083. getg00 cmp #14      ; '-' ? (Vorzeichen)
  1084.        beq getg01
  1085.        cmp #15      ; not
  1086.        bne getg10
  1087. getg01 jsr pushrg
  1088.        mvw p2,pl
  1089.        lda #132
  1090.        ldy wp+1
  1091.        sta pt
  1092.        sty pt+1
  1093.        jsr getexp
  1094.        ldy #prior2-pf
  1095.        sta (wp),y
  1096.        lda wp+1
  1097.        pha
  1098.        jsr poprg
  1099.        mvw back,pl
  1100.        pla
  1101.        sta back+1
  1102.        ldy #0
  1103.        lda c
  1104.        asl a
  1105.        sta back
  1106.        sec
  1107.        lda #213
  1108.        sbc back
  1109.        sbc c
  1110.        sta (pt),y   ; Operator merken
  1111.        iny
  1112.        jmp geta00
  1113. getg10 cmp #$aa
  1114.        bne getg20
  1115.        ldy #0
  1116.        lda #255     ; Pi
  1117.        sta (pt),y
  1118.        tya
  1119.        iny
  1120.        bne geth00
  1121. getg20 cmp #$ab
  1122.        bne getg30
  1123.        ldy #0
  1124.        lda #'s'     ; st
  1125.        sta (pt),y
  1126.        iny
  1127.        lda #'t'
  1128.        sta (pt),y
  1129.        iny
  1130.        bne geth00
  1131. getg30 cmp #$ac
  1132.        beq getg31
  1133.        cmp #$af
  1134.        bne getg40
  1135. getg31 ldy #0
  1136.        lda #'t'     ; ti/ti$
  1137.        sta (pt),y
  1138.        iny
  1139.        lda #'i'
  1140.        sta (pt),y
  1141.        iny
  1142.        lda c
  1143.        cmp #$ac
  1144.        beq geth00
  1145.        lda #'$'
  1146.        sta (pt),y
  1147.        iny
  1148. geth00 lda #0
  1149.        sta (pt),y
  1150.        mvw p2,back
  1151.        lda priorc
  1152.        rts
  1153. getg40 cmp #$e7     ; String
  1154.        bne getg50
  1155.        mvw p2,pl
  1156.        ldy #1
  1157.        lda (pl),y
  1158.        sta i
  1159.        iny
  1160.        bne getg60
  1161. getg50 cmp #56
  1162.        beq getg70
  1163.        and #7       ; Shortstring
  1164.        sta i
  1165.        mvw p2,pl
  1166.        ldy #1
  1167. getg60 tya
  1168.        clc
  1169.        adc pl
  1170.        sta pl
  1171.        bcc getg61
  1172.        inc pl+1
  1173. getg61 jsr getstr
  1174.        mvw p2,back
  1175.        lda priorc
  1176.        rts
  1177. getg70 ldy #0       ; Arrayelement
  1178.        lda #165
  1179.        sta (pt),y
  1180.        inc pt
  1181.        ldy #1
  1182.        lda (p2),y
  1183.        sta back+1
  1184.        iny
  1185.        lda (p2),y
  1186.        sta back
  1187.        jsr div7
  1188.        lda back
  1189.        asl a
  1190.        rol back+1
  1191.        adc vst
  1192.        sta $61
  1193.        lda back+1
  1194.        adc vst+1
  1195.        sta $62
  1196.        jsr vname
  1197.        jsr varnc
  1198.        lda #'('
  1199.        jsr addchr
  1200.        jsr pushrg
  1201.        lda #32
  1202.        ldy wp+1
  1203.        sta pt
  1204.        sty pt+1
  1205.        mvw p2,pl
  1206.        jsr getexp
  1207.        lda wp+1
  1208.        pha
  1209.        jsr poprg
  1210.        mvw back,pl
  1211.        pla
  1212.        sta back+1
  1213.        lda #32
  1214.        sta back
  1215.        ldy #0
  1216. getg71 lda (back),y
  1217.        sta (pt),y
  1218.        beq getg72
  1219.        iny
  1220.        bne getg71
  1221. getg72 lda #')'
  1222.        sta (pt),y
  1223.        iny
  1224.        lda #0
  1225.        sta (pt),y
  1226.        mvw pl,back
  1227.        lda priorc
  1228.        rts
  1229. ;
  1230. ;
  1231. isexpr ldy #0       ; Auf Ausdruckelement pruefen
  1232.        lda (count),y
  1233.        beq isnexp
  1234.        cmp #16
  1235.        bcc isexp
  1236.        cmp #32
  1237.        bcc isnexp
  1238.        cmp #$37
  1239.        bcc isexp
  1240.        cmp #$38
  1241.        beq isexp
  1242.        cmp #$80
  1243.        bcc isnexp
  1244.        cmp #$c0
  1245.        bcc isexp
  1246.        cmp #$e7
  1247.        bcc isnexp
  1248. isexp  sec
  1249.        rts
  1250. isnexp clc
  1251.        rts
  1252. ;
  1253. islet  ldy #0       ; Auf Zuweisung pruefen
  1254.        lda (count),y
  1255.        cmp #$c0
  1256.        bcc isnlet
  1257.        cmp #$e7
  1258.        bcs isnlet
  1259.        sec
  1260.        rts
  1261. isnlet clc
  1262.        rts
  1263. ;
  1264. addlin jsr search
  1265.        bcc addl02
  1266.        rts
  1267. addl02 mvw lline,$65
  1268.        clc
  1269.        lda #2
  1270.        adc lline
  1271.        sta lline
  1272.        bcc addl03
  1273.        inc lline+1
  1274.        lda lline
  1275.        cmp #$d0
  1276.        bcc addl03
  1277.        jmp nomem
  1278. addl03 mvw $7a,$5f
  1279. addl04 lda $65
  1280.        bne addl05
  1281.        dec $66
  1282. addl05 dec $65
  1283.        lda $5f
  1284.        bne addl06
  1285.        dec $60
  1286. addl06 dec $5f
  1287.        ldy #0
  1288.        lda ($65),y
  1289.        sta ($5f),y
  1290.        lda $64
  1291.        cmp $66
  1292.        bcc addl04
  1293.        lda $63
  1294.        cmp $65
  1295.        bcc addl04
  1296.        lda back
  1297.        sta ($63),y
  1298.        iny
  1299.        lda back+1
  1300.        sta ($63),y
  1301.        rts
  1302. ;
  1303. nom    .byt 'not enough memory!!',$8d
  1304. ;
  1305. nomem  print nom
  1306.        ldx savesp
  1307.        txs
  1308.        ldx #2
  1309.        jsr ckout
  1310.        lda #0
  1311.        jsr bsout
  1312.        jsr bsout
  1313.        jsr clrch
  1314.        ldx #2
  1315.        jsr close
  1316.        jmp start
  1317. ;
  1318. linend phw count
  1319.        lda pt
  1320.        cmp #72
  1321.        bcs line02
  1322.        bcc linen2
  1323. linen1 phw count
  1324. linen2 jsr next
  1325.        mvw count,back
  1326.        jsr search
  1327.        bcc line03
  1328. line02 plw count
  1329.        sec
  1330.        rts
  1331. line03 plw count
  1332.        clc
  1333.        rts
  1334. ;
  1335. incpt  ldy #255
  1336. incpt0 iny
  1337.        lda (pt),y
  1338.        bne incpt0
  1339.        clc
  1340.        tya
  1341.        adc pt
  1342.        sta pt
  1343.        ldy #0
  1344.        rts
  1345. ;
  1346. addchr pha
  1347.        ldy #255
  1348. addch0 iny
  1349.        lda (pt),y
  1350.        bne addch0
  1351.        pla
  1352.        sta (pt),y
  1353.        sec
  1354.        tya
  1355.        adc pt
  1356.        sta pt
  1357.        ldy #0
  1358.        tya
  1359.        sta (pt),y
  1360.        rts
  1361. ;
  1362. search mvw lline,$63
  1363.        lda #>linbuf
  1364.        ldy #0
  1365.        sty $61
  1366.        sta $62
  1367. seloop clc
  1368.        lda $61
  1369.        adc $63
  1370.        sta $65
  1371.        lda $62
  1372.        adc $64
  1373.        ror a
  1374.        sta $66
  1375.        lda $65
  1376.        ror a
  1377.        and #254
  1378.        sta $65
  1379.        cmp $61
  1380.        bne sel01
  1381.        lda $66
  1382.        cmp $62
  1383.        bne sel01
  1384.        clc
  1385.        rts
  1386. sel01  ldy #1
  1387.        lda ($65),y
  1388.        cmp back+1
  1389.        bcc sel02
  1390.        bne sel03
  1391.        dey
  1392.        lda ($65),y
  1393.        cmp back
  1394.        bcc sel02
  1395.        bne sel03
  1396.        rts
  1397. sel02  mvw $65,$61
  1398.        jmp seloop
  1399. sel03  mvw $65,$63
  1400.        jmp seloop
  1401. ;
  1402.        .fil decomp2.src
  1403.