*\       ---- SAVE:LOAD ----               08.09.86 VERSION 92
**=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=**
**   WORKING WTIH VIRTUAL ARRAY  **
**=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=**
**
LOCALS *LLOAD

  DATA TYPOPR
  DATA MEMADR,BYTE            % APEC ATA  COEPMOE
  DATA MEMIND=:M:TAB          % TAKA C HEKCAM EPOB
  DATA BUFTAB=:B:TAB          %        - C APECOM EPA
  DATA CONTAB=:C:TAB          %        - C CETKOM
  DATA CONTB2=:C:TAB+2
  DATA PAGTAB=:P:TAB          %        - C HOMEPOM CTPAH
  DATA MODTAB=:F:TAB          %        - AK MEHEH

  DATA XWORK,WORK             % PAOE EK (BA COBA)
  DATA ASWAP=SWAPIN,RSWAP     %  OPOPAMM

  DATA 'NBUF'=16              % CO EPOB
  DATA INICON=16*4            % HAAHOE HAEHE CETKA

  DATA :B:TAB=0,(NBUF)*=%*&100+!MBUF
  DATA :C:TAB[NBUF+1]
  DATA :P:TAB=0,(NBUF)*=&FFFF
  DATA :F:TAB[NBUF+1]

  BYTES :M:TAB[256]           % TAKA HEKCOB (CHAAA C HM)
  BUFFERS MBUF(256*NBUF)

*\
**     AC ATA B BPTAH MACCB
**           --> ^A    -- APEC
**               ^E    -- T OEPA   =0 - COBO   <>0 - AT
**               ^X    -- COBO (T=0)      AT ! P (T<>0)
**           <-- CARRY -- TRUE  - HOPMAHOE OKOHAHE
**                     -- FALSE - OKA OPAEH K KAHA
**            ^A,^E,^X -- COPEH
**
PROGRAM WRITE(MEMADR,,BYTE)
  IF >1= AND ^E= THEN RETURN ,,2
  (IF ,,MEMIND(MEMADR:):=
*        COPEHO EPOBM
    IF MEMADR:>=&E0 THEN CALL DEVWR MEMADR,,BYTE ; RETURN ,
    ,TYPOPR=
    GOSUB @ASWAP(RSWAP)
    =,TYPOPR
  IF)
  WORK=BUFTAB()
  $CONTAB()=MODTAB()=1
  =,,(MEMADR+1):
  IF ^E= THEN WORK()=BYTE.XAA. ELSE WORK():=BYTE:
  RETURN ,,0


*\
**  APKA ATA  BPTAHOO MACCBA
**           --> ^A    -- APEC ATA
**               ^E    -- T OEPA   =0 - COBO   <>0 - AT
**           <-- CARRY -- TRUE  - HOPMAHOE OKOHAHE
**                     -- FALSE - OKA OPAEH K KAHA
**               ^A    -- COBO (T=0)      AT ! AT (T<>0)
**               ^E,^X -- COPEH
**
PROGRAM READ(MEMADR)
  IF >1= AND ^E= THEN RETURN ,,2
  (IF ,,MEMIND(MEMADR:):=
*    COPEHO EPOBM
    IF MEMADR:>=&E0 THEN CALL DEVRD MEMADR ; RETURN ,
    ,TYPOPR=
    GOSUB @ASWAP(RSWAP)
    =,TYPOPR
  IF)
  WORK=BUFTAB()
  $CONTAB()=1
  =,,(MEMADR+1):
  IF ^E= THEN =WORK().XAA. ELSE =WORK()[WORK():
  RETURN ,,0


*\
**   OMEH C CKOM, EC HEOXOMOO EPA HET B AMT.
**
*SUBROUTINE SWAPIN
    <<SWAPIN>> =
*   ......EM EP C MHMAHM COM OPAEH
  WORK=#MIN1
  (XCYCLE 'NBUF*2' STEP 2) IF CONTB2()-WORK<> THEN WORK,,XWORK=CONTB2()
* ......MEHEM CTPAH B EPE
  ,,XWORK=BUFTAB(XWORK+2)
  IF ,MODTAB()<> THEN CALL M:SAVE ,,PAGTAB()
  CALL M:LOAD ,,MEMADR:
* ......MEHEM CETK
  (IF PAGTAB(XWORK)>=
    (XCYCLE 'NBUF*2' STEP 2) $CONTB2()=CONTB2().RLS.2.CNA.
* ......MOPEM KAPT EPOB
    MEMIND(PAGTAB(XWORK)):=0
  IF)
  MEMIND(MEMADR:):=XWORK
* ......AOHEM EMEHT TA  HOBO CTPAH
  PAGTAB(XWORK)=MEMADR:
  MODTAB(),CONTAB()=0,INICON
* ......OCTABEM B <X> HOMEP (BOEHH) PAOEO EPA
 GOTO @RSWAP

*\
**   OMEH C CKOM
**
LOCALS -LMSAVE
  DATA [2]
  USE ACR:STRUCT,FIL:STRUCT,LIB:PARAMS
  DATA XLIBR=LBLIBR+&100
  DATA 'READ'=0,'WRITE'=1
  DATA 'MAPSZ'=256,MAP(MAPSZ)
  DATA 'LBUF'=256
  DATA MAXEC=-1,PAGE,'FREE'=0
  DATA IOB=WRITE,ABUF,LENG=LBUF,NSEC=0
  DATA 'COMAND'=IOB+1

*\  AC CEKTOPA HA CK
**         ^A -- APEC EPA
**         ^X -- HOMEP CEKTOPA
**
PROGRAM M:SAVE(ABUF,,PAGE)
  (IF MAXEC=#MIN1
    MAXEC=0
    MAP('MAPSZ-1'):='FREE'
    !MAP(0)=MAP+1.XEX.
    DATA CREAT=(1.0,0."-"."!64K:BYTES")
    !#AZC(0)=CREAT,20
    IF CSV START 'LIBCRE',,XLIBR<0 THEN STOP ,
    IOB:=#AZC(1):
    CALL :IO IOB\
  IF)
  NSEC=((IF PAGE<> AND MAP(PAGE):='FREE' THEN MAP():=$MAXEC=1))
  COMAND:='WRITE'
  CALL :IO IOB\
  RETURN ABUF,,PAGE

*\  TEHE CEKTOPA C CKA
**         ^A -- APEC EPA
**         ^X -- HOMEP CEKTOPA
**
**
PROGRAM M:LOAD(ABUF,,PAGE)
  (IF MAXEC=#MIN1 OR (,,PAGE<> AND MAP():='FREE')
    ABUF(LENG-1):=&00
    !ABUF(0)=ABUF+1.XEX.
  ELSE
    NSEC=MAP(PAGE):
    COMAND:='READ'
    CALL :IO IOB\
  IF)
  RETURN ABUF,,PAGE

