1 REM Ins{nd av Anders Franz`n <5258>    1988-11-06 11.33.12 (KERMIT)
;        CHAINARE
;        Anders Franz`n
;        Stockholm maj 1986
;
;        N{r ett BASIC-program tar slut, det kan
;        bero p} END i programmet eller pga CTRL-C,
;        tar CHAINARE |ver kontrollen av maskinen
;        i st{llet f|r BASIC-tolken. Ett valfritt
;        BASIC-kommando eller en valfri BASIC-
;        instruktion exekveras.
;


         ORG  251:0

START    LD   HL,(254:39)
         LD   DE,CMD
         AND A
         SBC  HL,DE
         JRC  START1A
         LD   (254:39),DE     ; S{nk stacken
START1A  LD   HL,TEXT1
         LD   BC,TEXT2-TEXT1
         CALL 0:11
         LD   A,13
         LD   (KOMMANDO),A
         LD   A,192
         LD   (253:113),A     ; Markera DOS-buffertarna
         LD   (253:129),A     ; tre, fyra och fem upptagna
         LD   (253:145),A
         LD   IX,254:41-2
START1   LD   L,(IX+2)
         LD   H,(IX+3)
         LD   A,H
         OR   L
         JPZ  CMD             ; Variabler slut
         PUSH HL
         POP  IX
         LD   A,(IX+0)
         AND  15
         CP   2
         JRNZ START1          ; Ej str{ng
         LD   L,(IX+6)
         LD   H,(IX+7)        ; Peka p} str{ng
         LD   A,(IX+8)        ; L{ngd p} str{ng
         CP   120
         JRC  START4
         LD   A,119
START4   LD   DE,KOMMANDO
         LD   B,A
START5   LD   A,(HL)
         LD   (DE),A
         INC  HL
         INC  DE
         DJNZ START5
         LD   A,13
         LD   (DE),A
         JR   START1

TEXT1    DEFB 12
         DEFM "+-------------------------------------+",13,10
         DEFM "!                                     !",13,10
         DEFM "!   CHAINARE f|r ABC80                !",13,10
         DEFM "!   tillverkad i Stockholm maj 1986   !",13,10
         DEFM "!                                     !",13,10
         DEFM "+-------------------------------------+",13,10,10
TEXT2    EQU  $


         ORG  248:0

; Ny CMD-rutin som m|jligg|r nya kommandon och nya instruktioner.

CMD      LD   (IY+14),1      ; Kommando-mode
         LD   HL,(254:39)
         LD   SP,HL          ; ]terst{ll stack
         CALL 3:62           ; Testa och }terst{ll CTRL-C-flaggan
         LD   HL,KOMMANDO
         RST  32             ; Skippa eventuella mellanslag, A=f|rsta tecknet
         CP   13             ; [r den inmatade raden tom?
         JPZ  EXIT           ; Ja, l{mna CHAINARE...
         LD   DE,CMDTAB      ; Adress till v}r egen kommandotabell
         CALL 0:68           ; Leta inmatat kommando i tabellen
         LD   DE,JPTAB
         JRZ  CMD1           ; Hoppa om kommandot finns i tabellen
         LD   DE,10:32       ; BASIC-ens vanliga kommandotabell
         CALL 0:68           ; Leta i tabell
         LD   DE,10:90
         JRZ  CMD1           ; Hoppa om hittat
         LD   A,(24:144)
         CP   205
         JRNZ CMD1A
         CALL 24:144         ; Kompilera BASIC-rad
         JPC  EXIT           ; Fel, l{mna CHAINARE...
         JR   CMD1B

CMD1A    CALL 24:142         ; Kompilera BASIC-rad
         JPC  EXIT           ; Fel, l{mna CHAINARE...
CMD1B    LD   L,(IX+1)
         LD   H,(IX+2)       ; HL=radnummer
         LD   A,H
         OR   L
         JPNZ EXIT           ; Radnr > noll, BASIC-rad, l{mna CHAINARE..
         LD   A,(IX+0)       ; Radl{ngden
         AND  A
         JPZ  EXIT           ; Tom rad, l{mna CHAINARE...
         LD   HL,254:187     ; Pekar p} kompilerade radens kod
         PUSH HL
         LD   (IY+44),0      ; Inga argument i DEFFN
         CALL 14:170         ; Fixa programraden
         POP  DE
         CALL ELINE          ; Exekvera raden
         JR   CMD

CMD1     LD   BC,CMD         ; Adress att g|ra retur till efter kommandot
         PUSH BC             ; L{gg returadressen p} stacken
         JP   1:58

CMDTAB   DEFB 128,"RUN"      ; H{r {r tabellen med v}ra nya kommandon
         DEFB 255

JPTAB    DEFW RUN


; EXIT-rutin f|r att l{mna CHAINARE.

EXIT     LD   HL,EXIT1
         LD   BC,EXIT2-EXIT1
         CALL 0:11
         JP   0:204

EXIT1    DEFM 13,10,"Felaktig inrad, CHAINARE avslutas...",13,10
EXIT2    EQU  $


; Ny RUN-rutin f|r att avsluta program p} r{tt s{tt.

RUN      RST  32
         CP   13
         JRZ  RUN1           ; Hoppa om inget argument
         LD   A,(11:168)
         CP   62
         PUSH AF
         CALLZ 11:168        ; LOAD
         POP  AF
         CALLNZ 11:166
RUN1     LD   A,(10:128)
         CP   221
         JRNZ RUN2
         CALL 10:128
         CALL 14:110         ; Fixa programmet
         CALL 34:147         ; RESTORE
         CALL 34:93          ; Initiera slumptal
         JR   RUN3

RUN2     CALL 10:129
         CALL 14:110         ; Fixa programmet
         CALL 34:145         ; RESTORE
         CALL 34:91          ; Initiera slumptal
RUN3     LD   (IY+14),0      ; RUN-mode
         LD   DE,(254:28)    ; BOFA
         LD   SP,(254:39)    ; Initiera stack
         LD   HL,7:27        ; Error "return utan GOSUB"
         PUSH HL
RUN4     LD   A,(DE)
         DEC  A
         JPZ  CMD            ; Hoppa om END
         LD   (254:44),DE    ; Spara adress till rad
         BIT  4,(IY+15)
         JRZ  RUN5           ; Hoppa om inte TRACE
         LD   A,(35:47)
         CP   213
         PUSH AF
         CALLZ 35:47         ; Skriv radnummer
         POP  AF
         CALLNZ 35:45
RUN5     LD   (254:54),SP    ; S{tt runtime-stack
         INC  DE
         INC  DE
         INC  DE
         CALL ELINE
         INC  DE
         JR   RUN4

ELINE    CALL 3:62           ; Testa och nollst{ll CTRL-C
         JPNZ CMD            ; Hoppa om CTRL-C
         LD   A,(DE)
         CP   13
         RETZ                ; Raden slut
         CALL ESATS
         JR   ELINE

ESATS    LD   A,(DE)
         INC  DE
         CP   128
         JRC  ESATS          ; Hoppa om ej satskod
         CP   134
         JRZ  ESATS2         ; Hoppa om satstabell tv}
         CP   128
         JPZ  EGOTO
         CP   129
         JPZ  EGOTO
         CP   144
         JPZ  EGOSUB
         CP   146
         JPZ  EON
         CP   148
         JPZ  EONERR
         LD   BC,14:20       ; Satstabell ett
         JR   ESATS3

ESATS2   LD   A,(DE)
         INC  DE
         CP   138
         JPZ  CMD            ; Hoppa om END
         CP   145
         JPZ  ECHAIN
         LD   BC,14:66       ; Satstabell tv}
ESATS3   ADD  A
         LD   L,A
         LD   H,0
         ADD  HL,BC
         LD   A,(HL)
         INC  HL
         LD   H,(HL)
         LD   L,A
         JP   (HL)


; Nya rutiner f|r GOTO, GOSUB, ON X GOTO, ON X GOSUB, ON X RESTORE
; och ONERRORGOTO s} att hopp sker till ny RUN-rutin.

EGOTO    CALL RUNST
         INC  DE
         INC  DE
         EX   DE,HL
         CALL 16:28
EGOTO1   POP  HL
         POP  HL
         JP   RUN4

EGOSUB   CALL RUNST
         INC  DE
         INC  DE
         EX   DE,HL
         CALL 16:28
EGOSUB1  LD   A,(51:137)
         CP   229
         PUSH AF
         CALLZ 51:137        ; Kolla om minet {r fullt
         POP  AF
         CALLNZ 51:128
         PUSH HL             ; Spara BASIC-programr{knare
         CALL RUN4
         POP  DE
         RET

EON      CALL RUNST
         RST  56
         LD   A,(DE)
         INC  DE
         INC  DE
         LD   BC,EGOTO1
         CP   128
         JRZ  EON1
         LD   BC,EGOSUB1
         CP   144
         JRZ  EON1
         LD   BC,34:151
         LD   A,(BC)
         CP   235
         JRZ  EON1
         LD   BC,34:149
EON1     LD   A,(32:33)
         CP   197
         JPZ  32:33
         JP   32:31

EONERR   CALL RUNST
         EX   DE,HL
         INC  HL
         INC  HL
         CALL 16:28
         EX   DE,HL
         LD   (EONERR1),HL
         LD   HL,EONERR2
         LD   (254:52),HL
         RET

EONERR1  DEFW 0
EONERR2  DEFB 10,0,0,131,203,0,EONERR4-EONERR3
EONERR3  LD   HL,(254:54)
         LD   SP,HL
         LD   DE,(EONERR1)
         JP   RUN4
EONERR4  DEFB 186


; Ny CHAIN-rutin f|r att hopp ska ske till ny RUN-rutin.

ECHAIN   RST  56             ; Ber{kna str{nguttryck (filnamn)
         CALL 10:112         ; NEW, ta bort gamla programmet
         POP  HL             ; Stackkorrigering
         POP  HL             ; Str{ngadress
         POP  BC             ; Str{ngl{ngd
         LD   E,L
         LD   D,H
         ADD  HL,BC
         LD   (HL),13        ; L{gg CR efter str{ng
         EX   DE,HL          ; Forts{tt ner i RUN
         JP   RUN

RUNST    LD   A,(IY+14)      ; RUNmode-flagga
         AND  A
         RETZ                ; Retur om i programmet
         JP   EXIT


KOMMANDO DEFS 120


SLUT     EQU  $
