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 $