1 REM Ins{nd av Anders Franz`n <5258>    1986-03-07 22.00.24
; RAM
; Anders Franz`n <5258>
; Stockholm januari 1986

; Rutin som l{nkar in en ny enhet i
; enhetslistan. P} denna enhet kan man
; skriva och l{sa data precis som fr}n
; en vanlig sekventiell fil.

; D} RAM: l{nkas in i enhetslistan
; allokeras enhetens minnesutrymme.
; Det sker genom att STACK-pekaren
; s{nks s} mycket att beg{rt utrymme
; f}r plats ovanf|r STACKen. Arean
; finns kvar i minnet till RESET
; trycks. Det {r s}ledes m|jligt att
; spara data p} RAM: d} CHAIN till ett
; annat program g|rs.

; PREPARE t|mmer den allokerade arean.
; OPEN ger felkod 21 om arean {r tom.
; PRINT ger felkod 41 om arean {r full.
; INPUT ger felkod 34 vid f|rs|k att
; l{sa poster efter den sista.

DEVROT   EQU  254:10
BOFA     EQU  254:28
HEAP     EQU  254:32
STACK    EQU  254:39

; Initieringsrutinen placeras i en
; kassettbuffert d} den bara anv{nds
; en g}ng. Inv{rdet, antal bytes som
; RAM-arean skall best} av, placeras
; i register DE.

         ORG  251:0

INIT     LD   HL,(DEVROT)
         LD   BC,L[NK
INIT1    LD   A,H       Slut p}
         OR   L         enhets-lista ?
         JRZ  INIT2     Ja, hoppa
         PUSH HL
         AND  A
         SBC  HL,BC     Finns RAM: redan
         POP  HL        i listan ?
         RETZ           Ja, hoppa
         LD   A,(HL)    Adress till
         INC  HL        n{sta l{nk
         LD   H,(HL)
         LD   L,A
         JR   INIT1     Leta vidare

INIT2    LD   HL,(STACK)
         LD   BC,L[NK
         AND  A
         PUSH HL
         SBC  HL,BC
         POP  HL
         JRC  INIT3     STACK < L[NK
         LD   L,C       F|rst|r ej
         LD   H,B       programmet!!
INIT3    LD   (MAX),HL
         SBC  HL,DE
         LD   DE,(HEAP)
         INC  D
         PUSH HL
         SBC  HL,DE     R{cker utrymmet?
         POP  DE
         LD   A,128+3
         JPC  0:18      Nej, ERR 3
         LD   (STACK),DE Nytt stackv{rde
         LD   HL,INIT4
         LD   BC,INIT5-INIT4
         LDIR           Fixa val p}
         EX   DE,HL     TED-meny!
         LD   (TXT),HL  Pekare till area
         LD   (HL),0    Rensa RAM-arean
         LD   HL,(DEVROT)
         LD   (L[NK),HL Spara RAM: i
         LD   HL,L[NK   enhetslistan
         LD   (DEVROT),HL
         LD   A,192      DOS-buffert 2
         LD   (253:97),A upptagen!
         RET

INIT4    DEFM "5  TILL BASIC",195
         DEFW BASIC
INIT5    EQU  $

; Huvudprogrammet placeras ovanf|r
; stacken och i en DOS-buffert som
; f|rhoppningsvis ej anv{nds.

         ORG  247:0

L[NK     DEFS 2
         DEFM "RAM"
         DEFW JPTAB

JPTAB    JP   OPEN
         JP   PREPARE
         JP   CLOSE
         JP   0:21      L{s ASCII
         JP   0:27      Skriv ASCII
         JP   BLOCKIN
         JP   BLOCKUT
         JP   7:39      DELETE och
         JP   7:39      RENAME finns ej

OPEN     LD   HL,(TXT)
         LD   A,(HL)
         AND  A
         JRNZ PREPARE1
         SCF
         RET

PREPARE  LD   HL,(TXT)
         LD   (HL),0    T|m RAM-arean
PREPARE1 XOR  A
         LD   (IX+6),A  Radposition
         LD   (IX+7),120 Max radl{ngd
         LD   (IX+8),L  Adress till
         LD   (IX+9),H  buffer
         LD   (IX+10),L Aktuell position
         LD   (IX+11),H i buffer
         LD   (IX+13),253 Kvar i buffer
         LD   (IX+14),A Inget skrivet
         RET

CLOSE    LD   A,(IX+14)
         AND  A
         RETZ
         XOR  A
         LD   B,6
         LD   E,(IX+10)
         LD   D,(IX+11) Aktuell position
CLOSE1   LD   (DE),A
         INC  DE
         DJNZ CLOSE1
         RET

BLOCKIN  CALL NYBLOCK
         EX   DE,HL
         RETNC
         RST  16        Record utanf|r
         DEFB 128+34    filen

BLOCKUT  CALL NYBLOCK
         LD   (IX+13),253 Kvar i buffer
         SET  0,(IX+14) Buffert skriven
         RETNC
         RST  16
         DEFB 128+41    RAM-arean full

NYBLOCK  LD   E,(IX+8)
         LD   D,(IX+9)  Buffertadress
         INC  D
         LD   HL,(MAX)
         DEC  H
         AND  A
         SBC  HL,DE
         RETC           Utanf|r arean
         LD   (IX+8),E
         LD   (IX+9),D  Ny buffertadress
         LD   (IX+10),E
         LD   (IX+11),D Ny position
         RET

; Hoppa till BASIC fr}n TED.
BASIC    LD   HL,(DEVROT) Ta bort
         LD   E,(HL)      TED: fr}n
         INC  HL          enhetslistan!
         LD   D,(HL)
         LD   (DEVROT),DE
         LD   L,0
         LD   (BOFA),HL S{nk BOFA
         JP   0:198     Till ROM

TXT      DEFS 2
MAX      DEFS 2

SLUT     END

