home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / program / d / formula / !formula08 / functions < prev    next >
Encoding:
Text File  |  1992-12-17  |  9.3 KB  |  585 lines

  1. errorcheckflag .EQU TRUE
  2.  
  3. ;routines to check errors after a mySWI via the V-flag
  4.  
  5.  .IF errorcheckflag 
  6.  B formulafunctionstart
  7.  
  8. ;    error, if errorflag==1
  9. ; no error, if errorflag==0
  10. ;DECLARE INT errorflag
  11. errorflag     .WORD 0 
  12. ; RiscOS errorblock
  13. ;DECLARE CHARPTR errorblock
  14. errorblock    .WORD 0
  15.  
  16. formulaerrorcheck
  17.    BVS formulaerror
  18.    MOV tempregister,#0
  19.    STR tempregister,errorflag
  20.    B   formulaerrorback
  21. formulaerror
  22.    STR R0,errorblock
  23.    MOV tempregister,#1
  24.    STR tempregister,errorflag
  25. formulaerrorback
  26.    MOV PC,R14
  27.    MOV R0,R0
  28. formulafunctionstart
  29.  .ENDC
  30.  
  31.  .MACRO errorcheck
  32.   .IF errorcheckflag
  33.    STR R14,\temp
  34.    BL formulaerrorcheck
  35.    LDR R14,\temp
  36.    B \ready
  37. \temp .WORD 0
  38. \ready
  39.   .ENDC
  40.  .ENDM  
  41.  
  42.  .MACRO perror
  43.   LD  tempregister,errorflag
  44.   CMP tempregister,#1
  45.   BNE \ready
  46.   STR R0,\formulatemp0  
  47.   LD  R0,errorblock
  48.   ADD R0,R0,#4
  49.   mySWI XOS_Write0
  50.   mySWI XOS_NewLine
  51.   LDR  R0,\formulatemp0
  52.   B \ready
  53. \formulatemp0
  54. \ready
  55.  .ENDM
  56.  
  57. ; Macro to replace mySWI for save and restore R14 in Utilities
  58. ; use mySWI in Utilities instead of SWI
  59.  
  60.  .MACRO mySWI
  61.   .IF UTILITY
  62.    STR R14,\R14save
  63.   .ENDC
  64.   SWI %1
  65.   .IF UTILITY
  66.    LDR R14,\R14save
  67.    B \skipR14save
  68. \R14save .WORD 0
  69. \skipR14save
  70.   .ENDC
  71.  .ENDM
  72.  
  73. ;Macro to get the length of string [%2] into %1
  74. ;destroys tempregister 
  75.  
  76.  .MACRO strlenmacro
  77.   MOV %1,#0
  78.   MOV tempregister,#0
  79. \loop
  80.      LDRB tempregister,[%2,%1]
  81.      ADD  %1,%1,#1
  82.      CMP  tempregister,#0
  83.      GOcond NE,\loop
  84.   SUB %1,%1,#1
  85.  .ENDM 
  86.  
  87. ;Macro to copy a string from [R2] to [R1] number of copied chars into %1
  88. ;destroys R1,R2,R3,tempregister
  89.  
  90.  .MACRO strcpymacro
  91.   MOV R3,R2
  92. \loop
  93.      LDRB tempregister,[R2]
  94.      CMP  tempregister,#0
  95.      STRB tempregister,[R1]
  96.      GOcond EQ,\hupf
  97.       ADD  R1,R1,#1
  98.       ADD  R2,R2,#1
  99.      GO \loop
  100. \hupf 
  101.   SUB %1,R2,R3 
  102.  .ENDM
  103.  
  104. ;DECLARE INT  strlen(CHARPTR sourcestring)
  105.  
  106.  .MACRO strlen
  107.   LDR R0,[stackregister,#%2]
  108.   strlenmacro R1,R0
  109.   MOV %1,R1
  110.  .ENDM
  111.  
  112. ;DECLARE INT  strcpy(CHARPTR targetstring,CHARPTR sourcestring)
  113.  
  114.  .MACRO strcpy
  115.   LDR R1,[stackregister,#%2]
  116.   LDR R2,[stackregister,#%3]
  117.   strcpymacro %1
  118.  .ENDM
  119.  
  120. ;DECLARE INT  strcmp(CHARPTR targetstring,CHARPTR sourcestring)
  121.  
  122.  .MACRO strcmp
  123.   LDR R1,[stackregister,#%2]
  124.   LDR R2,[stackregister,#%3]
  125.   MOV R3,#0
  126.   MOV tempregister,#0
  127. \loop
  128.     LDRB R3,[R1]
  129.     LDRB tempregister,[R2]
  130.     CMP  R3,tempregister
  131.     MOVLT R0,#0
  132.     SUBLT R0,R0,#1
  133.     MOVGT R0,#1
  134.     GOcond NE,\hupf2
  135.        CMP  R3,#0
  136.        GOcond EQ,\hupf1
  137.     ADD R1,R1,#1
  138.     ADD R2,R2,#1
  139.     GO \loop
  140. \hupf1
  141.   MOV R0,#0
  142. \hupf2        
  143.   MOV %1,R0
  144.  .ENDM
  145.  
  146. ;DECLARE INT  strcat(CHARPTR targetstring,CHARPTR sourcestring)
  147.  
  148.  .MACRO strcat
  149.   LDR R1,[stackregister,#%2]
  150.   LDR R2,[stackregister,#%3]
  151.   strlenmacro R4,R1
  152.   ADD R1,R4,R1
  153.   strcpymacro %1
  154.  .ENDM
  155.  
  156. ;DECLARE INT  strncpy(CHARPTR targetstring,CHARPTR sourcestring,INT length)
  157.  
  158.  .MACRO strncpy
  159.   LDR R1,[stackregister,#%2]
  160.   LDR R2,[stackregister,#%3]
  161.   LDR R3,[stackregister,#%4]
  162.   MOV R5,R2
  163.   MOV R4,#0
  164.   MOV R0,#0
  165. \loop
  166.      LDRB R0,[R2]
  167.      CMP  R0,#0
  168.      STRB R0,[R1]
  169.      GOcond EQ,\hupf
  170.         ADD  R1,R1,#1
  171.         ADD  R2,R2,#1
  172.         ADD  R4,R4,#1
  173.         CMP R4,R3
  174.         GOcond EQ,\hupf2
  175.      GO \loop
  176. \hupf2
  177.   MOV R0,#0
  178.   STRB R0,[R1]
  179. \hupf  
  180.   SUB %1,R2,R5
  181.  .ENDM
  182.  
  183. ;DECLARE VOID  writestr(CHARPTR string)
  184.  
  185.  .MACRO writestr
  186.   LDR R0,[stackregister,#%2]
  187.   mySWI XOS_Write0
  188. ;  errorcheck
  189.  .ENDM
  190.  
  191. ;DECLARE INT  readstr(CHARPTR string,INT maxstringlength)
  192.  
  193.  .MACRO readstr
  194.   LDR R0,[stackregister,#%2]
  195.   LDR R1,[stackregister,#%3]
  196.   MOV R2,#0
  197.   MOV R3,#255.
  198.   mySWI XOS_ReadLine
  199.   errorcheck
  200.   MOV %1,R1  
  201.  .ENDM
  202.  
  203. ;Macro to convert numerical string %2 to integer %1 destroy R0,R1
  204.  
  205.  .MACRO string2intmacro
  206.   MOV R0,%2 
  207.   GO \hupf1 
  208. \buffer1 .BLOCK 12.
  209.  .ALIGN
  210. \hupf1
  211.   ADR R1,\buffer1
  212.   MOV R2,#11.
  213.   mySWI XOS_EvaluateExpression
  214.   errorcheck
  215.   MOV %1,R2
  216.  .ENDM
  217.  
  218. ;Macro to convert integer %2 to string %1 destroy R0,R1,R2,R3,R4
  219.  
  220. .MACRO int2stringmacro
  221.   GO \hupf
  222. \buffer .BLOCK 12.
  223.  .ALIGN
  224. \hupf
  225.   ADR R4,\buffer
  226.   MOV R2,#11. 
  227.   MOV R0,%2
  228.   MOV R1,R4
  229.   mySWI XOS_BinaryToDecimal
  230.   errorcheck
  231.   MOV R3,#0
  232.   STRB R3,[R4,R2]
  233.   MOV %1,R4
  234. .ENDM
  235.  
  236. ;Macro to convert integer %2 to hexstring %1 destroy R0,R1,R2,R3,R4
  237.  
  238. .MACRO int2hexstringmacro
  239.   GO \hupf
  240. \buffer .BLOCK 9.
  241.  .ALIGN
  242. \hupf
  243.   ADR R4,\buffer
  244.   MOV R2,#8. 
  245.   MOV R0,%2
  246.   MOV R1,R4
  247.   mySWI XOS_ConvertHex8
  248.   errorcheck
  249.   MOV %1,R4
  250. .ENDM
  251.  
  252. ;DECLARE INT string2int(CHARPTR string)
  253.  
  254.  .MACRO string2int
  255.   LDR R3,[stackregister,#%2]
  256.   string2intmacro R4,R3
  257.   MOV %1,R4
  258.  .ENDM  
  259.  
  260. ;DECLARE CHARPTR int2string(INT number)
  261.  
  262.  .MACRO int2string
  263.   LDR R5,[stackregister,#%2]
  264.   int2stringmacro R6,R5
  265.   MOV %1,R6
  266.  .ENDM  
  267.  
  268. ;DECLARE CHARPTR int2hexstring(INT number)
  269.  
  270.  .MACRO int2hexstring
  271.   LDR R5,[stackregister,#%2]
  272.   int2hexstringmacro R6,R5
  273.   MOV %1,R6
  274.  .ENDM  
  275.  
  276. ;DECLARE VOID  writeint(INT number)
  277.  
  278.  .MACRO writeint
  279.   LDR R5,[stackregister,#%2]
  280.   int2stringmacro R0,R5
  281.   mySWI XOS_Write0
  282. ;  errorcheck
  283.  .ENDM 
  284.  
  285. ;DECLARE VOID  writeinthex(INT number)
  286.  
  287.  .MACRO writeinthex
  288.   LDR R5,[stackregister,#%2]
  289.   int2hexstringmacro R0,R5
  290.   mySWI XOS_Write0
  291. ;  errorcheck
  292.  .ENDM 
  293.  
  294. ;DECLARE INT  readint()
  295.  
  296.  .MACRO readint
  297.   GO \hupf1 
  298. \buffer2 .BLOCK 21
  299.  .ALIGN
  300. \hupf1
  301.   ADR R4,\buffer2
  302.   MOV R0,R4
  303.   MOV R1,#20
  304.   MOV R2,#0
  305.   MOV R3,#255.
  306.   mySWI XOS_ReadLine
  307.   errorcheck
  308.   string2intmacro R3,R4
  309.   MOV %1,R3
  310.  .ENDM 
  311.  
  312. ;DECLARE CHAR getc()
  313.  
  314.  .MACRO getc
  315.   mySWI XOS_ReadC
  316. ;  errorcheck
  317.   MOV %1,R0
  318.  .ENDM
  319.  
  320. ;DECLARE VOID  putc(CHAR  character)
  321.  
  322.  .MACRO putc
  323.   LDRB R0,[stackregister,#%2]
  324.   mySWI XOS_WriteC
  325. ;  errorcheck
  326.  .ENDM
  327.  
  328. ;DECLARE INT  open(CHARPTR filename)
  329.  
  330.  .MACRO open
  331.   MOV R0,#5
  332.   LDR R1,[stackregister,#%2]
  333.   mySWI XOS_File
  334.   errorcheck
  335.   CMP R0,#1
  336.   GOcond EQ,\read
  337.   CMP R0,#0
  338.   GOcond EQ,\write
  339.   mySWI XOS_WriteS
  340.     .STRING " can't open file (directory)"
  341.     .ALIGN
  342.   MOV R0,R1
  343.   mySWI XOS_Write0
  344. \write    
  345.   MOV R0,#11.
  346.   LDR R1,[stackregister,#%2]
  347.   MOV R2,#0
  348.   MOV R4,#0
  349.   MOV R5,#0
  350.   mySWI XOS_File
  351.   errorcheck
  352. \read
  353.   MOV R0,#0C4
  354.   LDR R1,[stackregister,#%2]
  355.   mySWI XOS_Find
  356.   errorcheck
  357. \ready
  358.   MOV %1,R0
  359.  .ENDM
  360.  
  361. ;DECLARE INT  openw(CHARPTR filename)
  362.  
  363.  .MACRO openw
  364.   MOV R0,#84
  365.   LDR R1,[stackregister,#%2]
  366.   mySWI XOS_Find
  367.   errorcheck
  368.   MOV %1,R0
  369.  .ENDM
  370.  
  371. ;DECLARE INT  openr(CHARPTR filename)
  372.  
  373.  .MACRO openr
  374.   MOV R0,#44
  375.   LDR R1,[stackregister,#%2]
  376.   mySWI XOS_Find
  377.   errorcheck
  378.   MOV %1,R0
  379.  .ENDM
  380.  
  381. ;DECLARE VOID  close(INT filehandle)
  382.  
  383.  .MACRO close
  384.   MOV R0,#0 
  385.   LDR R1,[stackregister,#%2]
  386.   mySWI XOS_Find
  387.   errorcheck
  388.  .ENDM
  389.  
  390. ;DECLARE VOID  bput(INT filehandle,CHAR character)
  391.  
  392.  .MACRO bput
  393.   LDR  R0,[stackregister,#%3]
  394.   LDR  R1,[stackregister,#%2]
  395.   mySWI XOS_BPut
  396.   errorcheck
  397.  .ENDM  
  398.  
  399. ;DECLARE CHAR bget(INT filehandle)
  400.  
  401.  .MACRO bget
  402.   LDR R1,[stackregister,#%2]
  403.   mySWI XOS_BGet
  404.   errorcheck
  405.   MOV %1,R0   
  406.  .ENDM  
  407.  
  408. ;DECLARE INT fgets(CHARPTR buffer,INT filehandle,INT bufferlen)
  409.  
  410.  .MACRO fgets
  411.   LDR R2,[stackregister,#%3]
  412.   LDR R3,[stackregister,#%2]
  413.   MOV R5,R3
  414.   LDR R4,[stackregister,#%4]
  415. \loop
  416.    MOV R1,R2
  417.    mySWI XOS_BGet
  418.    errorcheck
  419.    GOcond CS,\end
  420.    CMP R0,#32.
  421.    MOVLT R4,R3
  422.    STRGEB R0,[R3]
  423.    ADDGE R3,R3,#1
  424.    CMP R4,R3
  425.    GOcond NE,\loop
  426. \end
  427.   MOV R0,#0
  428.   STRB R0,[R3]
  429.   SUB %1,R3,R5
  430.  .ENDM
  431.  
  432. ;DECLARE INT fputs(INT filehandle,CHARPTR buffer)
  433.  
  434.  .MACRO fputs
  435.   MOV R0,#2
  436.   LDR R2,[stackregister,#%3]
  437.   LDR R1,[stackregister,#%2]
  438.   strlenmacro R3,R2
  439.   ADD R8,R2,R3
  440.   MOV R5,#10.
  441.   STRB R5,[R8]
  442.   ADD R3,R3,#1
  443.   ADD R8,R8,#1
  444.   LDRB R6,[R8]
  445.   MOV R5,#0
  446.   STRB R5,[R8]
  447.   MOV R5,R3
  448.   mySWI XOS_GBPB
  449.   errorcheck
  450.   STRB R6,[R8]
  451.   SUB  R7,R8,#1
  452.   MOV  R6,#0
  453.   STRB R6,[R7]  
  454.   SUB  %1,R5,R3
  455.  .ENDM  
  456.  
  457. ;DECLARE INT  eof(INT filehandle)
  458.  
  459.  .MACRO eof
  460.   MOV R0,#127.
  461.   LDR R1,[stackregister,#%2]
  462.   mySWI XOS_Byte
  463.   errorcheck
  464.   MOV %1,R1
  465.  .ENDM
  466.  
  467. ;DECLARE VOID  system(CHARPTR cli_string)
  468.  
  469.  .MACRO system
  470.   LDR R0,[stackregister,#%2]
  471.   mySWI XOS_CLI
  472.   errorcheck
  473.  .ENDM
  474.  
  475. ;DECLARE VOID cr()
  476.  
  477.  .MACRO cr
  478.   mySWI XOS_NewLine
  479. ;  errorcheck
  480.  .ENDM 
  481.  
  482.  
  483.  .MACRO tailcpy 
  484.   MOV R4,#0
  485.   LDR R2,[stackregister,#%2]
  486.   MOV R3,#0 
  487. \loop
  488.      LDRB R4,[R0,R3]
  489.      STRB R4,[R2,R3] 
  490.      ADD R3,R3,#1
  491.      CMP R4,#0 
  492.      GOcond NE,\loop
  493.  .ENDM
  494.  
  495. ;DECLARE VOID  getclitail(CHARPTR buffer)
  496.  
  497.  .MACRO getclitail
  498.   .IF MODULE | SIMPLE_MODULE
  499.    LADR R0,formulaclitail
  500.   .ELSE
  501.    mySWI XOS_GetEnv
  502.    errorcheck
  503.    MOV  R1,#0
  504. \loop1
  505.    LDRB R1,[R0]
  506.    CMP R1,#20
  507.    BNE \loop2
  508.    CMP R1,#0
  509.    BEQ \ready
  510.    ADD R0,R0,#1
  511.    B \loop1
  512. \loop2
  513.    LDRB R1,[R0]
  514.    CMP R1,#20
  515.    BEQ \loop3
  516.    CMP R1,#0
  517.    BEQ \ready
  518.    ADD R0,R0,#1
  519.    B \loop2
  520. \loop3
  521.    LDRB R1,[R0]
  522.    CMP R1,#20
  523.    BNE \ready
  524.    CMP R1,#0
  525.    BEQ \ready
  526.    ADD R0,R0,#1
  527.    B \loop3
  528. \ready
  529.   .ENDC 
  530.   tailcpy %1,%2
  531.  .ENDM
  532.  
  533. ;DECLARE VOID  getargv(CHARPTR buffer)
  534.  
  535.  .MACRO getargv
  536.   mySWI XOS_GetEnv
  537.   errorcheck
  538.   tailcpy %1,%2
  539.  .ENDM
  540.  
  541. ;DECLARE VOID  getenv(CHARPTR buffer,CHARPTR varstring,INT bufferlen)
  542.  
  543.  .MACRO getenv
  544.   LDR R0,[stackregister,#%3]
  545.   LDR R1,[stackregister,#%2]
  546.   LDR R2,[stackregister,#%4]
  547.   MOV R3,#0
  548.   MOV R4,#0
  549.   mySWI XOS_ReadVarVal
  550.   errorcheck
  551.  .ENDM
  552.   
  553. ;DECLARE VOID  setenv(CHARPTR varstring,CHARPTR varval)
  554.  
  555.  .MACRO setenv
  556.   LDR R0,[stackregister,#%2]
  557.   LDR R1,[stackregister,#%3]
  558.   strlenmacro R2,R1
  559.   MOV R3,#0
  560.   MOV R4,#0
  561.   mySWI XOS_SetVarVal
  562.   errorcheck
  563.  .ENDM
  564.  
  565. ; malloc will currently use SWI OS_Module 6 use free() before you exit !
  566.  
  567. ;DECLARE CHARPTR malloc(INT length)
  568.  
  569.  .MACRO malloc
  570.   LDR R3,[stackregister,#%2]
  571.   MOV R0,#6.
  572.   mySWI OS_Module
  573.   errorcheck
  574.   MOV %1,R2
  575.  .ENDM
  576.  
  577. ;DECLARE VOID free(CHARPTR allocedbuffer)
  578.  
  579.  .MACRO free
  580.   LDR R2,[stackregister,#%2]
  581.   MOV R0,#7.
  582.   mySWI OS_Module
  583.   errorcheck
  584.  .ENDM
  585.