Create readable text `.bas' for each tokenized BASIC `,ffb' file.
[ssr] / StraySrc / Libraries / Sapphire / bsh / flex.bas
diff --git a/StraySrc/Libraries/Sapphire/bsh/flex.bas b/StraySrc/Libraries/Sapphire/bsh/flex.bas
new file mode 100644 (file)
index 0000000..9602136
--- /dev/null
@@ -0,0 +1,62 @@
+REM Sapphire flex macro library -- © 1994 Straylight
+
+DEF FNflex_test=0
+
+REM --- Support functions ---
+
+DEF FNflex__m(mask$)
+LOCAL reg$,sep$,mask%,r%,s%,i%
+mask%=0
+WHILE FNflex__g(mask$,reg$,sep$)
+  IF reg$="" THEN ERROR 1,"Expected register, found `"+sep$+"'"
+  r%=EVAL(reg$)
+  IF sep$="-" THEN
+    IF FNflex__g(mask$,reg$,sep$) THEN
+      IF reg$="" THEN ERROR 1,"Expected register, found `"+sep$+"'"
+      IF sep$="-" THEN ERROR 1,"Unexpected `-' in register list"
+      s%=EVAL(reg$)
+      IF s%<r% THEN SWAP s%,r%
+      FOR i%=r% TO s%
+        mask%=mask% OR (1<<i%)
+      NEXT
+    ELSE
+      ERROR 1,"Missing register name"
+    ENDIF
+  ELSE
+    mask%=mask% OR (1<<r%)
+  ENDIF
+ENDWHILE
+=mask%
+
+DEF FNflex__g(RETURN mask$,RETURN reg$,RETURN sep$)
+IF mask$="" THEN =FALSE
+reg$=""
+sep$=""
+REPEAT
+  reg$+=sep$
+  sep$=LEFT$(mask$,1)
+  mask$=MID$(mask$,2)
+UNTIL mask$="" OR INSTR("-,",sep$)
+IF INSTR("-,",sep$)=0 THEN
+  reg$+=sep$
+  sep$=""
+ENDIF
+=TRUE
+
+REM --- Macros ---
+
+DEF FNflex_save(r$)
+[ opt 4
+  FNimport("flex_save")
+  bl flex_save
+  dcd FNflex__m(r$) OR &e8ae0000
+]
+=0
+
+DEF FNflex_load(r$)
+[ opt 4
+  FNimport("flex_load")
+  bl flex_load
+  dcd FNflex__m(r$) OR &e93e0000
+]
+=0