100 ! ********************************************
105 ! *  RUNONLY.BAC f|r ABC800                  *
110 ! *                                          *
115 ! *  Skapar en enhtet som skriver och        *
120 ! *  l{ser RUNONLY program.                  *
130 ! *                                          *
135 ! *  830829 Per Ahlin enligt en artiel i     *
137 ! *  tidningen Mikrodatorn.                  *
140 ! ********************************************
145 ! 
150 ! 
155 ! Inititeringar
160 ! 
165 INTEGER 
170 EXTEND 
175 ! 
180 ! Dummyvariabel f|r enhetsrutiner
185 ! 
190 COMMON Dummy$=45
195 ! 
200 ! 
205 ! 
210 ! ===========================================
215 ! 
220 ! Huvudrutin
225 ! ==========
230 ! 
235 ; CHR$(12)
240 ; 'RUNONLY ABC800'
245 Z=FNVannamn
250 IF Z=0 THEN 295
255 Z=FNNynamn
260 Z=FNSystemvar
265 Z=FNKilldummy
270 Z=FNNyenhetsl{nk
275 Z=FNInl{nkning
280 Z=FNNyrutin
285 Z=FNUtskrift
290 CHAIN 'NUL:'
295 END 
300 ! ===========================================
305 ! 
310 ! 
315 ! 
320 ! Enhetens vanliga namn
325 ! 
330 DEF FNVannamn
335   ; : ; CHR$(7)
340   INPUT "Enhetens vanliga namn = "Vanenhet$
345   IF Vanenhet$='' THEN RETURN 0
350   Vanenhet$=FNKorr$(Vanenhet$)
355   L{nkadr=FNLetalist(Vanenhet$)
360   IF L{nkadr=0 THEN ; Vanenhet$ ' saknas!' : GOTO 335
365   Rutinadr=PEEK2(L{nkadr+5)
370   RETURN 1
375 FNEND 
380 ! --------------------------------------------
385 ! 
390 ! Hitta ledigt enhetsnamn
395 ! 
400 DEF FNNynamn
405   FOR I=65 TO 93
410     FOR J=65 TO 93
415       Nyenhet$=CHR$(I,J)+RIGHT$(Vanenhet$,3)
420       Nyenhet$=FNKorr$(Nyenhet$)
425       Z=FNLetalist(Nyenhet$)
430       IF Z=0 THEN RETURN 0
435     NEXT J 
440   NEXT I 
445   ; 'Hit kommer vi v{l alldrig' : STOP 
450 FNEND 
455 ! 
460 ! 
465 ! H{mta systemvariabler
470 ! 
475 DEF FNSystemvar
480   Bottom=PEEK2(SYS(10)+12)
485   Comtop=PEEK2(SYS(10)+48)
490   Enhetsrot=PEEK2(SYS(10)+123)
495   RETURN 0
500 FNEND 
505 ! ----------------------------------------
510 ! 
515 ! L{nka f|rbi dummy i variabellistan
520 ! 
525 DEF FNKilldummy
530   POKE SYS(10)+12,Comtop,SWAP%(Comtop) ! Ny BOTTOM
535   POKE SYS(12),Comtop,SWAP%(Comtop) ! Ny VARTB
540   RETURN 0
545 FNEND 
550 ! ------------------------------------------
555 ! 
560 ! Placera ut nya enhetsl{nken
565 ! 
570 DEF FNNyenhetsl{nk
575   POKE Bottom,Enhetsrot,SWAP%(Enhetsrot)
580   FOR I=1 TO 3
585     POKE Bottom+1+I,ASCII(RIGHT$(Nyenhet$,I))
590   NEXT I 
595   POKE Bottom+5,Bottom+8,SWAP%(Bottom+8),0
600   RETURN 0
605 FNEND 
610 ! -------------------------------------------
615 ! 
620 ! Inl{nkning
625 ! 
630 DEF FNInl{nkning
635   POKE SYS(10)+123,Bottom,SWAP%(Bottom)
640   RETURN 0
645 FNEND 
650 ! -------------------------------------------
655 ! 
660 ! Utplacering av nya enhetsrutinen
665 ! 
670 DEF FNNyrutin
675   ! 
680   ! Huvudrutin
685   ! 
690   POKE Bottom+8,229,245,42,Bottom+7,SWAP%(Bottom+7)
695   POKE Bottom+13,254,1,40,13,254,2,40,13,254,8,40,15
700   POKE Bottom+25,241,225,195,Rutinadr,SWAP%(Rutinadr)
705   ! 
710   ! PREPARE
715   ! 
720   POKE Bottom+30,54,1,24,247
725   ! 
730   ! CLOSE
735   ! 
740   POKE Bottom+34,253,203,38,142,24,241
745   ! 
750   ! Block-ut
755   ! 
760   POKE Bottom+40,175,190,40,9,54,0,46,5
765   POKE Bottom+48,221,102,20,203,206,24,226
770   ! 
775   RETURN 0
780 FNEND 
785 ! ------------------------------------------
790 ! 
795 ! Utskrift
800 ! 
805 DEF FNUtskrift
810   ; : ; 'Enheten ' Vanenhet$ ' kan nu anv{ndas f|r att l{sa och skriva RUNONLY-PROGRAM'
815   ! 
820   ; 'men skall d} ha enhetsnamnet ' Nyenhet$ ' i st{llet f|r ' Vanenhet$
825   ! 
830   RETURN 0
835 FNEND 
840 ! -------------------------------------------
845 ! 
850 ! S|kning av namn i enhetslistan
855 ! 
860 DEF FNLetalist(Enhet$) LOCAL Pekadr,Pekare,A,B,C
865   Pekadr=SYS(10)+123
870   Pekare=PEEK2(Pekadr)
875   IF Pekare=0 THEN RETURN 0
880   A=PEEK(Pekare+2)
885   B=PEEK(Pekare+3)
890   C=PEEK(Pekare+4)
895   IF Enhet$=CHR$(A,B,C) THEN RETURN Pekare
900   Pekadr=Pekare
905   GOTO 870
910 FNEND 
915 ! -------------------------------------------
920 ! 
925 ! Formatering av enhetsnamn
930 ! 
935 DEF FNKorr$(Namn$) LOCAL Korrnamn$=3
940   Korrnamn$=LEFT$(Namn$+SPACE$(3),3)
945   RETURN Korrnamn$
950 FNEND 
955 ! ---------------------------------------------
