home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol064 / str.src < prev    next >
Encoding:
Text File  |  1984-04-29  |  5.1 KB  |  436 lines

  1. C    SET              0
  2. M    SET              0
  3. F    SET              0
  4. ;TYPE
  5. ;$STRING0 = STRING 0;
  6. ;$STRING80= STRING 80;
  7. ;$STRING255 = STRING 255;
  8. ;VAR
  9. ;NUMBER:REAL;
  10. ;DATA:$STRING80;
  11. ;
  12. ;PROCEDURE SETLENGTH(VARX:$STRING0;Y:INTEGER);EXTERNAL;
  13.     EXTD    L156,SETLENGT
  14. ;FUNCTION LENGTH(X:$STRING255):INTEGER;EXTERNAL;
  15.     EXTD    L157,LENGTH  
  16. ;
  17. ;{function to convert a string "str" to a real number...
  18. ;corresponds roughly to the VAL$ statement in BASIC}
  19. ;
  20. ;FUNCTION STRTOREAL (STR:$STRING80):REAL;
  21. ;LABEL 1;
  22. ;
  23. ;VAR
  24. ;DECVAL,SIGN,VAL:REAL;
  25. ;DECIMAL,ERROR:BOOLEAN;
  26. ;L,I,LEN:INTEGER;
  27. ;
  28. ;BEGIN
  29. L158
  30.     NAME STRTOREAL
  31.     ENTRY STRTOREAL
  32. STRTOREAL:
  33.     ENTR    D,2,20
  34. ;VAL:=0;
  35.     STMT    D,1
  36.     CVTF    A,0
  37.     LXI    H,3
  38.     DADD    S
  39.     XCHG
  40.     PUSH    IX
  41.     POP    H
  42.     LXI    B,-16
  43.     DADD    B
  44.     XCHG
  45.     LXI    B,4
  46.     LDDR
  47.     POP    H
  48.     POP    H
  49. ;DECVAL:=0;
  50.     STMT    D,2
  51.     CVTF    A,0
  52.     LXI    H,3
  53.     DADD    S
  54.     XCHG
  55.     PUSH    IX
  56.     POP    H
  57.     LXI    B,-8
  58.     DADD    B
  59.     XCHG
  60.     LXI    B,4
  61.     LDDR
  62.     POP    H
  63.     POP    H
  64. ;LEN:=LENGTH(STR);
  65.     STMT    D,3
  66.     PUSH    IX
  67.     POP    H
  68.     LXI    B,88
  69.     DADD    B
  70.     SPSH    S,255
  71.     CALL    L157
  72.     STMT    M,3
  73.     MOV    -6(IX),D
  74.     MOV    -7(IX),E
  75. ;L:=LEN;
  76.     STMT    D,4
  77.     MOV    L,-7(IX)
  78.     MOV    H,-6(IX)
  79.     MOV    -4(IX),H
  80.     MOV    -5(IX),L
  81. ;ERROR:=FALSE;
  82.     STMT    D,5
  83.     MOV    -1(IX),A
  84. ;DECIMAL:=FALSE;
  85.     STMT    D,6
  86.     MOV    0(IX),A
  87. ;I:=1;
  88.     STMT    D,7
  89.     MOV    -2(IX),A
  90.     MVI    -3(IX),1
  91. ;SIGN:=1.0;
  92.     STMT    D,8
  93.     LXI    H,320
  94.     MOV    D,A
  95.     MOV    E,A
  96.     PUSH    H
  97.     PUSH    D
  98.     LXI    H,3
  99.     DADD    S
  100.     XCHG
  101.     PUSH    IX
  102.     POP    H
  103.     LXI    B,-12
  104.     DADD    B
  105.     XCHG
  106.     LXI    B,4
  107.     LDDR
  108.     POP    H
  109.     POP    H
  110. ;
  111. ;IF LEN = 0 THEN 
  112.     STMT    D,9
  113.     MOV    L,-7(IX)
  114.     MOV    H,-6(IX)
  115.     MOV    D,A
  116.     MOV    E,A
  117.     DSB1    D,0
  118. ;    BEGIN
  119.     JNZ    L215
  120.     STMT    D,10
  121. ;    ERROR:=TRUE;
  122.     STMT    D,11
  123.     MVI    -1(IX),1
  124. ;    GOTO 1;
  125.     STMT    D,12
  126.     CTRL    M,12
  127.     JMP    L159
  128. ;    END;
  129.     STMT    D,13
  130. L215
  131. ;
  132. ;WHILE (DECIMAL = FALSE) AND (I < LEN + 1) DO
  133.     STMT    D,14
  134. L236
  135.     MOV    H,A
  136.     MOV    L,0(IX)
  137.     MOV    A,L
  138.     CMPI    D,0
  139.     MOV    A,H
  140.     JNZ    L239
  141.     MOV    L,-3(IX)
  142.     MOV    H,-2(IX)
  143.     MOV    E,-7(IX)
  144.     MOV    D,-6(IX)
  145.     INX    D
  146.     LESS    D,0
  147. ;BEGIN
  148.     JNC    L235
  149.     STMT    D,15
  150. ;
  151. ;    CASE STR[I] OF
  152.     STMT    D,16
  153.     MOV    L,-3(IX)
  154.     MOV    H,-2(IX)
  155.     RCHK    H,1,80
  156.     XCHG
  157.     LXI    H,88
  158.     ADDR    IX
  159. ;
  160. ;     '-' : SIGN:=-1.0; 
  161.     MOV    D,A
  162.     MOV    E,M
  163.     MOV    A,E
  164.     CMPI    D,45
  165.     JNZ    L270
  166. L272
  167.     XRA    A
  168.     STMT    D,17
  169.     LXI    H,448
  170.     MOV    D,A
  171.     MOV    E,A
  172.     PUSH    H
  173.     PUSH    D
  174.     LXI    H,3
  175.     DADD    S
  176.     XCHG
  177.     PUSH    IX
  178.     POP    H
  179.     LXI    B,-12
  180.     DADD    B
  181.     XCHG
  182.     LXI    B,4
  183.     LDDR
  184.     POP    H
  185.     POP    H
  186. ;     '.' : DECIMAL:=TRUE;
  187.     JMP    L271
  188. L270
  189.     CMPI    D,46
  190.     JNZ    L285
  191. L286
  192.     XRA    A
  193.     STMT    D,18
  194.     MVI    0(IX),1
  195. ;
  196. ;    '0','1','2','3','4','5','6','7','8','9':
  197.     JMP    L271
  198. L285
  199.     CMPI    D,48
  200.     JRZ    L300
  201.     CMPI    D,49
  202.     JRZ    L300
  203.     CMPI    D,50
  204.     JRZ    L300
  205.     CMPI    D,51
  206.     JRZ    L300
  207.     CMPI    D,52
  208.     JRZ    L300
  209.     CMPI    D,53
  210.     JRZ    L300
  211.     CMPI    D,54
  212.     JRZ    L300
  213.     CMPI    D,55
  214.     JRZ    L300
  215.     CMPI    D,56
  216.     JRZ    L300
  217.     CMPI    D,57
  218.     JNZ    L299
  219. ;        VAL:=(VAL * 10) + (ORD(STR[I]) - 48); {48 = ord of zero}
  220. L300
  221.     XRA    A
  222.     STMT    D,19
  223.     LXI    H,-4
  224.     DADD    S
  225.     SPHL
  226.     XCHG
  227.     PUSH    IX
  228.     POP    H
  229.     LXI    B,-19
  230.     DADD    B
  231.     LXI    B,4
  232.     LDIR
  233.     CVTF    A,10
  234.     MULT    D,-4
  235.     MOV    L,-3(IX)
  236.     MOV    H,-2(IX)
  237.     RCHK    H,1,80
  238.     XCHG
  239.     LXI    H,88
  240.     ADDR    IX
  241.     MOV    D,A
  242.     MOV    E,M
  243.     STMT    M,19
  244.     LXI    H,-48
  245.     DADD    D,0
  246.     PUSH    H
  247.     CVTF    B
  248.     DADD    D,-4
  249.     LXI    H,3
  250.     DADD    S
  251.     XCHG
  252.     PUSH    IX
  253.     POP    H
  254.     LXI    B,-16
  255.     DADD    B
  256.     XCHG
  257.     LXI    B,4
  258.     LDDR
  259.     POP    H
  260.     POP    H
  261. ;       END; {OF CASE}
  262. L299
  263.     XRA    A
  264. L271
  265. ;
  266. ;I:=I+1;
  267.     STMT    D,20
  268.     MOV    L,-3(IX)
  269.     MOV    H,-2(IX)
  270.     INX    H
  271.     MOV    -2(IX),H
  272.     MOV    -3(IX),L
  273. ;
  274. ;END; {of while}
  275.     STMT    D,21
  276.     CTRL    M,21
  277.     JMP    L236
  278. L235
  279. L238    EQU    L235
  280. L239    EQU    L238
  281. ;
  282. ;WHILE (DECIMAL = TRUE) AND (L > I-1 ) DO  {i-1 because of last while loop}
  283.     STMT    D,22
  284. L401
  285.     MOV    H,A
  286.     MOV    L,0(IX)
  287.     MOV    A,L
  288.     CMPI    D,1
  289.     MOV    A,H
  290.     JNZ    L404
  291.     MOV    L,-5(IX)
  292.     MOV    H,-4(IX)
  293.     MOV    E,-3(IX)
  294.     MOV    D,-2(IX)
  295.     DCX    D
  296.     GRET    D,0
  297. ;    BEGIN    
  298.     JNC    L400
  299.     STMT    D,23
  300. ;        IF STR[L] IN ['0'..'9'] THEN
  301.     STMT    D,24
  302.     MOV    L,-5(IX)
  303.     MOV    H,-4(IX)
  304.     RCHK    H,1,80
  305.     XCHG
  306.     LXI    H,88
  307.     ADDR    IX
  308.     MOV    D,A
  309.     MOV    E,M
  310.     PUSH    D
  311.     CSET    D,0
  312.     LXI    H,57
  313.     LXI    D,48
  314.     CSET    D,2
  315.     MEMB
  316. ;            DECVAL:=(DECVAL * 0.1) + ((ORD(STR[L]) - 48) * 0.1);
  317.     JNC    L422
  318.     STMT    D,25
  319.     LXI    H,-4
  320.     DADD    S
  321.     SPHL
  322.     XCHG
  323.     PUSH    IX
  324.     POP    H
  325.     LXI    B,-11
  326.     DADD    B
  327.     LXI    B,4
  328.     LDIR
  329.     LXI    H,-666
  330.     LXI    D,26214
  331.     PUSH    H
  332.     PUSH    D
  333.     MULT    D,-4
  334.     MOV    L,-5(IX)
  335.     MOV    H,-4(IX)
  336.     RCHK    H,1,80
  337.     XCHG
  338.     LXI    H,88
  339.     ADDR    IX
  340.     MOV    D,A
  341.     MOV    E,M
  342.     STMT    M,25
  343.     LXI    H,-48
  344.     DADD    D,0
  345.     PUSH    H
  346.     LXI    H,-666
  347.     LXI    D,26214
  348.     PUSH    H
  349.     PUSH    D
  350.     CVTF    C
  351.     MULT    D,-4
  352.     DADD    D,-4
  353.     LXI    H,3
  354.     DADD    S
  355.     XCHG
  356.     PUSH    IX
  357.     POP    H
  358.     LXI    B,-8
  359.     DADD    B
  360.     XCHG
  361.     LXI    B,4
  362.     LDDR
  363.     POP    H
  364.     POP    H
  365. L422
  366. ;        L:=L-1;
  367.     STMT    D,26
  368.     MOV    L,-5(IX)
  369.     MOV    H,-4(IX)
  370.     DCX    H
  371.     MOV    -4(IX),H
  372.     MOV    -5(IX),L
  373. ;    END;
  374.     STMT    D,27
  375.     CTRL    M,27
  376.     JMP    L401
  377. L400
  378. L403    EQU    L400
  379. L404    EQU    L403
  380. ;
  381. ;
  382. ;1: { Exit immediately upon detection of a fatal error.}
  383.     STMT    D,28
  384. L159
  385. ;
  386. ;STRTOREAL:=SIGN * (DECVAL + VAL);
  387.     STMT    D,29
  388.     LXI    H,-4
  389.     DADD    S
  390.     SPHL
  391.     XCHG
  392.     PUSH    IX
  393.     POP    H
  394.     LXI    B,-15
  395.     DADD    B
  396.     LXI    B,4
  397.     LDIR
  398.     LXI    H,-4
  399.     DADD    S
  400.     SPHL
  401.     XCHG
  402.     PUSH    IX
  403.     POP    H
  404.     LXI    B,-11
  405.     DADD    B
  406.     LXI    B,4
  407.     LDIR
  408.     LXI    H,-4
  409.     DADD    S
  410.     SPHL
  411.     XCHG
  412.     PUSH    IX
  413.     POP    H
  414.     LXI    B,-19
  415.     DADD    B
  416.     LXI    B,4
  417.     LDIR
  418.     DADD    D,-4
  419.     MULT    D,-4
  420.     LXI    H,3
  421.     DADD    S
  422.     XCHG
  423.     PUSH    IX
  424.     POP    H
  425.     LXI    B,92
  426.     DADD    B
  427.     XCHG
  428.     LXI    B,4
  429.     LDDR
  430.     POP    H
  431.     POP    H
  432. ;END; {OF PROCEDURE}
  433.     STMT    D,30
  434.     EXIT    D,81
  435.