i i “928-Batagelj” — 2010/6/14 — 9:19 — page 1 — #1 i i i i i i List za mlade matematike, fizike, astronome in računalnikarje ISSN 0351-6652 Letnik 16 (1988/1989) Številka 2 Strani 100–102 Vladimir Batagelj: IZPOPOLNIMO LOGO NA MAVRICI Ključne besede: računalništvo. Elektronska verzija: http://www.presek.si/16/928-Batagelj.pdf c© 1988 Društvo matematikov, fizikov in astronomov Slovenije c© 2010 DMFA – založništvo Vse pravice pridržane. Razmnoževanje ali reproduciranje celote ali posameznih delov brez poprejšnjega dovoljenja založnika ni dovo- ljeno. OOlAll"\IOL NIL-,"~In .'" ' __ 111 u: _, 1- - IZPOPOLNIMO LOGO NA MAVRICI V tem sestavku bomo spoznali, kako lahko logo na mavrici (Spectrum) do- polnimo z novimi možnostmi. V logu prižigamo pike na zaslonu z ukazom DOT . Logo na mavr ici pa ne pozna ukaza, ki bi nam povedal, ali je neka pika prižgana. Zato si poglejmo, kako bi v logo vgradili ukazu DOT "nasprotni" ukaz DOTP [ :x :y ], ki vrne vrednost TRUE, kadar je pika s koordinatama x in y (-128'-;;;;x'-;;;; 127, -88'-;;;; ,-;;;; y'-;;;; 97) črna (prižgana). Kot vemo, vsaki piki ustreza bit v slikovnem pomnilniku. Z ukazom ZLOG izračunamo naslov zloga v slikovnem pomnilniku, v katerem je ta bit , in nato z ukazom BIT pogledamo njegovo vrednost . TO DOTP : t OUTPUT 1 = BIT (.EXAMINE ZLOG 128 + FIRST :t 87 - LAST :t ) 7 - REMAINDER (128 + FIRST :t ) 8 END TO DINT .a :b OP INT ( :a / :b ) END TO ZLOG :x:z OP 16384+ 32 * ((REMAINDER DINT :z 8 8) + 8 * (REMAINDER :z 8 ) + 64 * DINT :z 64) + DINT :x 8 END TO BIT :w :b IF :b = O [OP REMAINDER :w 2] OP BIT DINT :w 2 :b - 1 END Opisana rešitev je razmeroma počasna. Precej učinkovitejšo rešitev dobimo, če uporabimo sistemsko rutino , ki pripada basiškemu ukazu POINT. Opišimo še, kako dopolnimo logo s to rutino. Takoj na Začetku, ko vnesemo logo v raču ­ nalnik, z ukazom .RESERVE 100 zasežemo del delovnega prostora. Z uka- zom PRINT .RESERVED izvemo, da imamo na voljo zloge od naslova 64924 do 65024. Ker ne poznamo načina prenosa parametrov v logovih ukazih, bomo za zvezo med logom in podprogramom v strojnem jeziku uporabili "nabiralnike". Podatke o piki bomo pustili v zlogih 65000 (x) in 65001 (y); rezultat pa bomo dobili v zlogu 65002. Nekoliko prirejen ukaz POINT pa bomo namestili od naslova 64924 naprej: 100 naslov prevod zbirnik 64924 237 75 232 253 LD BC, (65000) (x, y) v BC 64928 205 170 34 CALL 08874 določi naslov zloga 64931 71 LD B,A 64932 4 INC B izloči 64933 126 LD A,(HL) bit, ki 64934 7 RLCA pripada 64935 16 253 DJNZ 64934 piki 64937 230 1 AND +01 64939 50 234 253 LD (65002) , A vrn i vrednost bita 64942 201 RET To storimo z ukazom MCDOTP: TO MCDOTP MCPUT 64924 [237 75 232 253 205 170 34 71 4 126 7 16 253 230 ! 1 50 234 253 201 END TO MCPUT :nas :koda IF EMPTYP :koda [STOP 1 .DEPOSIT :nas F IRST :koda MCPUT :nas+ 1 BF :koda END Vnesemo še ukaz DOTP. TO DOTP :t .DEPOSIT 65000 128 + FIRST :t .DEPOSIT 65001 88 + LAST :t .CALL 64924 OP 1 = .EX AM INE 65002 END Pozor! Ukaz DOTP ne preverja, ali je pika (x, yI res na zaslonu. Če ga izvedemo za podatke, ki ne določajo pike na zaslonu, logo prekine delo s sporočilom: BASIC SYSTEM ERROR ??? ? in DOTP Vsakokratnemu vnašanju podprograma v strojnem jeziku se lahko izognemo, če ga shranimo na trak .BSAVE "dotp [64924 20] Tedaj na začetku za ukazom. RESERVE 100 zahtevamo še . BLOAD "dotp . Opišimo še, kako lahko sestavimo svoje znake. Pokažimo to s primerom. Z ukazom MCPUT shranimo v področje za uporabniške znake (kode 144 do 101 TO CSZH MCPUr663B813680W64&4646000) M C P U T 8 8 3 7 8 [ 3 6 8 U 6 4 6 0 2 0 2 0 ) MCPUT 88384 [38 126 4 8 16 32 126 81 MCPUT 66392 [ 0 20 28 32 32 32 28 01 MCPUT 66400 [ 0 40 58 8466 4 120 01 UCPUT 66408 [ 0 40 124 8 18 32 124 01 END KO lrvedemo ukaz CSZH, m nam na voljo &Ice C, &,r, 6 i in 2, kar prsverimo z u k o m PREVER I: TO PREVERI (PR CHAR 144 CHAR 1 4 CHAR 148 CHAR 147 CHAR 148 CHAR 1 4 1 END