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 ! ---------------------------------------------