prepoznavanje in interpretacija hpgl ukazov avtor matja finc vsebina hpgl format pretvorba prejetih ascii znakov vukaz glavni program main hpgl format uvod hpgl je d grafični format prvotno načrtovan za uporabo na ploterjih hp zaradi svoje enostavne strukture in uporabe so ga privzeli tudi ostali proizvajalci ploterjev in cad programov format se uporablja v večini programov za načrtovanje in risanje npr autocad ipd osnove datoteka hpgl je sestavljena iz več ukazov vsi ukazi imajo enako strukturo funkcija argumenti ločilo funkcija instruction je sestavljena iz dveh velikih črk v naem primeru smo uporabili le tiri najosnovneje funkcije pu pen up dvig risala pd pen down spust risala pr plot relative risanje oz premikanje po relativnih koordinatah glede na trenuten poloaj pa plot absolute risanje oz premikanje po absolutnih koordinatah glede na začetno izhodiče argumenti arguments so lahko različnih tipov stevila črke in so med sabo ločeni z vejico vsaka funkcija ima svoje argumente in določeno njihovo zaporedje Če funkcija argumentov nima jih enostavno izpustimo in na koncu postavimo ločilo ločilo separator pomeni konec hpgl ukaza privzeto ločilo je podpičje primer risanje ravne črte od do pu pa pd pr pu podrobneji opis najdete na naslovu wotsit's format the programmer's file formats and data formats resource vsebina pretvorba prejetih ascii znakov v ukaz v sprejemni buffer ploter prejme hpgl ukaz v ascii obliki ascii znake je treba pretvoriti v obliko ki bo ploterju omogočila izvajanje ukaza v ta namen imamo tri spremenljivke ukaz ukazx ukazy ukaz ukazni register bitni ukazni register zgleda takole dav online busy negative appendy penup relative stop msb lsb pomen posameznih bitov dav data valid ali je ukaz sve in v celoti sprejet pretvorjen online ali je ploter v stanju online ali offline busy ali ploter e vedno izvaja kaken ukaz preden začnemo izvajati nov ukaz moramo počakati da dokonča izvajanje trenutnega ukaza neg negative ali je prejeta koordinata negativna ali pozitivna appendy append y katero koordinato trenutno beremo x ali y Če v buffer ni prispel celoten ukaz nam appendy pove katera koordinata je aktualna v naslednjem ciklu branja penup stanje pisala dvignjeno ali spučeno relative relativne ali absolutne koordinate stop brezpogojna zaustavitev ukazx koordinata x bitna ukazy koordinata y bitna pretvorba rutina ki pretvarja ascii v ukaz ploterja se imenuje convert pri pretvorbi sem privzel da so v vhodni hpgl datoteki uporabljeni samo ukazi pd pu pr in pa ter da so vsi ukazi podani strukturno pravilno uporabljenih je tudi nekaj subrutin recchr prebere znak iz sprejemnega bufferja če buffer prazen postavi z recchr pshx ldx recb cpx rece beq norchar ldaa x inx cpx rece bne norrol ldx recb norrol stx recb norchar pulx rts xy pobrie ukazx in ukazy xy ldx stx ukazx ldx stx ukazy rts minus test predznaka če je znak spremeni neg na in vrne z minus cmpa bne minend ldaa ukaz oraa staa ukaz ldaa rts minend tab ldaa ukaz anda staa ukaz tba rts convert glavna rutina convert je okvirno sestavljena takole test prebranega znaka ugotavljanje črke računanje x koordinate računanje y koordinate konec rutine test prebranega znaka program najprej preveri če je zadnji ukaz v celoti izvren in če je ploter preipravljen na sprejem novega ukaza dav online busy Če so ti pogoji izpolnjeni prebere prvi naslednji znak v sprejemnem bufferju Če je slučajno buffer poln ni vrnjenega znaka oz z prekinemo izvajanje rutine naslednji korak je ugotavljanje prebranega znaka prvi prebrani znak ni nujno prva črka ukaza če je v prejnjem ciklu pretvorba bila nedokončana ostane dav oz če je bil buffer poln preden smo v njega spravili celoten ukaz nismo prebrali znak do konca torej ta znak je lahko črka prva ali druga črka ukaza tevilka del x ali y koordinate vejica vmesno ločilo med argumenti za x in y koordinato minus predznak x ali y koordinate ali podpičje ločilo konec ukaza Če je prebrani znak vejica potem se nastavi zastavica appendy kar nam pove katero koordinato bomo obdelovali če bo slučajno buffer poln in bomo v naslednjem ciklu prebrali tevilo convert ldaa ukaz anda najprej pogleda ce je dav online busy bne davend ce je skoci na konec jsr recchr prebere prvi znak na vrsti beq davend ce v bufferju ni znaka gre na konec cmpa bmi davend cmpa a preveri ce je crka bpl crka ce je skoci na test za crke cmpa ali je podpicje beq jepd ce je skoci na konec jepod jsr minus ali je minus bne vejmin ce ni skoci na test za vejico ldaa ukaz anda katero koordinato moramo obdelovati naslednji znak bne jevj ce je appendy vpisujemo y bra stevil ce ni pa vpisujemo x davend bra davend pomozni skok zaradi prevelike dolzine vejmin cmpa beq vejts ldaa ukaz anda beq nivej bra nipod ugotavljanje črke s tem delom programa ugotavljamo kateri ukaz bomo izvajali vsaka prebrana zadnja črka ukaza nam resetira ukazx in ukazy rutina xy in nastavi ustrezne zastavice v ukaznem registru crka cmpa p ce je crka p bne nip ce je prebere naslednjo ce ne pa ugotavlja katera crka je jsr recchr gleda drugo crko ukaza beq davend ce v bufferju ni znaka gre na konec nip cmpa a a ali je ukaz pa bne rukaz ce ni preverja naprej ldaa ukaz ce je nastavi zastavico relative anda staa ukaz bra stevx rukaz cmpa r r ali je pr bne uukaz ldaa ukaz oraa zastavica relative staa ukaz stevx jsr xy jsr recchr beq davend jsr minus beq stevil jmp nivej bra vejic jepd bra jepd uukaz cmpa u u ali je pu bne dukaz ldaa ukaz oraa nastavitev zastavic penup relative staa ukaz jsr xy jsr recchr pregleda ce je podpicje naslednji beq davend ce v bufferju ni znaka gre na konec bra podpic dukaz ldaa ukaz ce ni nobena od zgornjih potem je pd oz crka d anda penup oraa nastavitev zastavice relative staa ukaz jsr xy jsr recchr pregleda ce je podpicje beq davend ce v bufferju ni znaka gre na konec bra podpic jepd bra jepd pomozni skoki zaradi prevelike dolzine davend bra davend jevj bra jevej nipod bra nipod vejts bra vejtst računanje x koordinate prebrani ascii znak iz bufferja najprej spremenimo v tevilo odtejemo ascii vrednost znaka Če je spremenljivka ukazx prazna vrednost novo prebrano tevilo enostavno shranimo v spremenljivko Če pa je v spremenljivki ukazx e kakna neničelna vrednost jo pomnoimo z desetikim faktorjem in pritejemo na novo prebrano tevilo to ponavljamo dokler prebrani znak ni vejica mnoenje s faktorjem deset izvedemo s pomočjo shiftanja v levo mnoenje z in to takole tevilo tevilo tevilo tevilo racunanje x koordinate stevil jsr recchr beq davend ce v bufferju ni znaka gre na konec jmp vejica ali je slučajno ze vejica nivej suba pretvori ascii v stevilo psha shrani v sklad ldd ukazx ali je to prva stevilka po vrsti bne racunx ce ni moramo staro vsebino in pristeti novo pula prvo stevilko po vrsti le zacasno zapisemo v ukazx tab tu moramo uporabiti celotni akumulator d a b clra std ukazx bra stevil ponovimo dokler ni vejice potem y koordinato racunx ldd ukazx mnoenje z za x koordinato asld asld asld addd ukazx zacetna vrednost addd ukazx zacetna vrednost std ukazx nazaj v x pula potegnemo zadnje stevilo iz sklada tab akum d pretvorimo v obliko ' stevilo' clra addd ukazx pristejemo novo stevilko enice std ukazx bra stevil davend jmp davend pomozni skoki zaradi prevelike dolzine jepd bra jepod podpic bra podpic vejic bra vejica pomona veja za test vejice vejica naredi naslednje če ni vejice se vrne na nadaljevanje računanja x koordinate če je vejica če je neg naredi dvojiki komplement spremenljivke ukazx negativno tevilo resetira zastavico neg postavi appendy naslednja bo koordinata y skoči na računanje y koordinate pomozna veja za test vejice vejica cmpa ali je vejica bne nivej ce ni je stevilo oz koordinata x vejtst ldaa ukaz anda ce je pogledamo ce je x negativen beq nineg ldd ukazx in ga pretvorimo v neg stevilo coma comb addd std ukazx nineg ldaa ukaz oraa postavimo appendy anda brisemo neg staa ukaz jsr recchr beq davend jsr minus beq jevej gremo racunat y koordinato bra podpic računanje y koordinate ta podveja programa naredi podobno kot računanje x koordinate vmes testiramo za podpičje skok na podvejo podpic racunanje y koordinate jevej jsr recchr beq davend ce v bufferju ni znaka gre na konec bra podpic nipod suba pretvori ascii v stevilo psha shrani v sklad ldd ukazy ali je to prva stevilka po vrsti bne racuny ce ni moramo staro vsebino in pristeti novo pula prvo stevilko po vrsti le zacasno zapisemo v ukazy tab tu moramo uporabiti celotni akumulator d a b clra std ukazy bra jevej ponovimo dokler ni podpicja potem konec racuny ldd ukazy mnoenje z za y asld asld asld addd ukazy zacetna vrednost addd ukazy zacetna vrednost std ukazy nazaj v y pula tab clra addd ukazy pristejemo novo stevilko enice std ukazy bra jevej pomozna veja za test podpicja podpic cmpa ce je podpicje potem jepod bne nipod ce ni pa racunamo y bra jepod konec rutine preveri ali je treba ukazy dvojiko komplementirati zastavica neg resetira zastavici appendy in neg postavi dav konec rutine jepod ldaa ukaz anda pogleda ce je zadnjo koord treba spremenit v negativno beq jey ldd ukazy in ga pretvorimo v neg stevilo coma comb addd std ukazy jey ldaa ukaz anda brise appendy in neg oraa postavi dav staa ukaz bra davend davend rts zaključek po končani rutini convert so ukazni register ukaz in pozicijski spremenljivki ukazx in ukazy pripravljeni na nadaljno uporabo izris oz izvedba ukaza ko bo ukaz izveden dav oz sprejemni buffer ponovno napolnjen bo convert izvedel novo pretvorbo za naslednji ukaz vsebina glavni program main začetek izvede pretvorbo prejetih ascii znakov v ukaz ukazni register ukaz in koordinate ukazx in ukazy s katerimi krmilimo ploter če je pretvorjeni ukaz sve oz če je e dokončano izvajanje prejnjega ukaza dav glavni program kliče ustrezne rutine za izvajanje ukaza risanje plotra in dvig spust risala pendown glede na zastavice v ukaznem registru ukaz če ukaz ni sve oz izvajanje prejnjega ukaza e traja dav skoči na začetek vsebina glavna stran tekst je napisal matja finc stran je uredil miha krejan marec