;Betöltés: load "screener",8,1,kezdőcím ;Irányítás: Joy2 ;Kilépés: C=+Shift+Ctrl ;Újraindítás: sys 952 (RESTART) ;Kispitye Software 1988 III.8. ;Felhasznált regiszterek: ;$02: 7.bit=joy aktív, 6.bit=függőleges írásirány ;$09: joyleolvasás számlálója(4-0), üzemmódkapcsoló tárolóhelye fájlkezelésnél ;$0C: aktuális joyérték ;$0e: utolsó billyentyű kódja ;$0f: ha 1, akkor a joy ír és nem mehet ki jobbra a kurzor, tehát áll az utolsó oszlopban. F7-nél másolásjelző(kép-szín) ;$9e-$9f: főprogram kezdőcíme ;$fb-$fc: f7-nél másolandó terület címe. load-nál kezdőcím ;$fd-$fe: f7-nél másolás célcíme *=$c000 ;eredeti *=$02ab ($02ed-(STOP-BEGIN)) betöltés kezdete BEGIN jsr $79 ;van-e karakter a másodlagos cím után? beq LCONT ;nincs: load folytatása jsr $aefd ;vessző ellenőrzése jsr $ad8a ;kifejezés beolvasása FAC-ba jsr $b7f7 ;FAC->2 bájt egész (Y=lo, A=high)=kezdőcím sty $ae ;kezdőcím tárolása (load mutató: $ae-$af) sty $9e sta $af ;load cím=kezdőcím sta $9f bcc LCONT ;load folytatása STOP2 lda $ae ;load mutató elérte-e a reklámfejléc/képernyő végét? ENDL cmp #(MAIN-SCREEN+$0400)< bne END ;ha nem, load folytatása lda $af ENDH cmp #(MAIN-SCREEN+$0400)> bne END lda #$f6ed< sta $0328 ;stop-vektor ($0328-$0329) visszaállítása az eredetire lda #$f6ed> sta $0329 STARTL lda #MAIN< sta $9e ;ha nincs megadva kezdőcím, akkor a főprogram kezdőcíme=load mutató sta $ae STARTH lda #MAIN> sta $9f sta $af bne BEGIN ;kezdőcímellenőrzés, később ez hatástalanítva lesz LCONT jsr $f4f3 ;load folytatása jmp $0400-(SCREEN-START);program indul a START-nál STOP ;új stop-vektor $02ed lda #($0400-(SCREEN-START))<;load folytatása START-tól sta $ae lda #($0400-(SCREEN-START))> sta $af lda #($02ed-(STOP-STOP2))< sta $0328 ;stop-vektor STOP2-ra jsr $e518 ;video reset END rts *=$0300-$02ed+STOP;töltelék a rendszerváltozó tábláig TABLE ;rendszerváltozók alapértékei $0300 .byte $8b, $e3, $83, $a4, $7c, $a5, $1a, $a7, $e4, $a7, $86, $ae, 0, 0, 0, 0, $4c, $48, $b2, 0 .byte $31, $ea, $66, $fe, $47, $fe, $4a, $f3, $91, $f2, $0e, $f2, $50, $f2, $33, $f3, $57, $f1, $ca, $f1 $0328 .byte $ed, 2 ;stop vektor átírása (eredetileg volt: $f6ed, tehát csak a felső bájt más!) ;stop vektor jelentősége: minden egyes bájt vétele (load)/kiírása (save) után meghívódik START pla ;felesleges visszatérési címek törlése a veremből pla pla pla RESTART lda #($0400-(SCREEN-STARTS))< sta $02ed-2 ;autoload képernyőnél a programkezdet (STOP-2) átírása STARTS-re sta $02ed+1 lda #$07e8< ;autoload képernyőnél az első rész (kép) vége sta $02ed-(STOP-ENDL)+1 lda #$07e8> sta $02ed-(STOP-ENDH)+1 lda #$d800< ;autoload képernyő 2. rész (szín) kezdőcím sta $02ed-(STOP-STARTL)+1 sta $fb sta $fd sta $02ed-(STOP-LCONT)-1;kezdőcímvizsgálat hatástalanítása lda #$d800> sta $02ed-(STOP-STARTH)+1 jmp ($9e) ;főprogramra ugrás TLOAD .text "LOAD" ;képernyőszerkesztő fájlkezelési kérdései .byte 0 TSAVE .text "SAVE" .byte 0 TFILEN .text " filename?" .byte 0 STARTS lda #$0f sta 53281 ;nemaktuális képernyőlap háttér és keretszíneinek beállítása BORDER lda #$10 sta 53280 RETURN rts ;autoload képernyőnél itt is PLA áll pla rts SCREEN ;kétsoros reklámfejléc $0400 .disp "Kispitye Software Please read scr.info! .byte 136 .disp ",Szombathely,Schőnherz 40;I/6.Tel:18454" MAIN bne RJOY ;feltétlen ugrás JOY tax ;joy állapotának (A) mentése ldy #ACTION-MAIN+1 lda #ACTIONT-ACTION-2 sta ($9e),y ;funkciómutató visszaállítása a funkciótábla (ACTIONT) elejére asl $02 ;joy jelző bit beállítása ($02 7. bitje) sec ror $02 txa ;joy állapot vizsgálata asl a ;érték eltologatásával az értéktelen bitek kiléptetése hogy a tüzet tudjuk elsőként vizsgálni asl a asl a sta $0c ;joyérték eltárolása ROTATE asl $0c ;értékes bitek vizsgálatának kezdete ACTION bcs ACTIONT ;ha a bit 1 akkor ugrás JOYL ldy #ACTION-MAIN+1 lda ($9e),y ;funkciómutató léptetése clc adc #$03 sta ($9e),y dec $09 ;joyszámláló csökkentése bpl ROTATE ;további vizsgálat asl $02 ;joy jelzőbit törlése lsr $02 RJOY lda #$04 sta $09 ;Joy beolvasás számlálójának visszaállítása bne LOOP ;feltétlen ugrás ACTIONT lda $0e ;tűz: utolsó karakter kiírása .byte $2c ;a többi akció elfedése (bit abcd) lda #$1d ;jobb: kurzor jobbra karakter kiírása .byte $2c ;a többi akció elfedése lda #$9d ;bal: kurzor balra karakter kiírása .byte $2c ;a többi akció elfedése lda #$11 ;le: kurzor le karakter kiírása .byte $2c ;a többi akció elfedése lda #$91 ;fel: kurzor fel karakter kiírása sta $0277 ;kód elhelyezése a billentyűzetpufferben inc $cc ;kurzor ki inc $c6 ;lenyomott billentyűk száma=1 bne PRINT ;közvetlen ugrás CPRINT jsr $e716 ;kiiratás rom rutinnal (csak vezérlőkaraktereknél használom) LOOPS bit $02 ;ha a joy aktív, folytatni a lekérdezését bmi JOYL LOOP lda $c6 ;$c6 lenyomott billentyűk száma sta $cc ;kurzorkapcsoló tay lda #$00 ;joy írásmutató nullázása sta $0f sta $d8 ;beszúrások számának nullázása, így nem dob sort bit $cb bvc KEYCHK ;ha van lenyomva billentyű, azt lekezeljük bit $a2 bvc KEYCHK ;ha nem telt el 4/60 sec, nem kell a joyt lekérdezni lda #$3c sta $a2 ;óra időzítése 4/60 sec-es késleltetésre lda $dc00 ;joy2 lekérdezése and #$1f eor #$1f bne JOY ;ha aktív, akkor lekezeljük KEYCHK lda $028d ;módosító billyentyűk ellenőrzése cmp #$07 ;C=+shift+ctrl bne *+2 ;kilépés átlépése rts ;kilépés tya beq LOOP ;ha nincs billentyűlenyomás, vissza a ciklusba PRINT sei ;megszakítások ki lda $cf ;ha a kurzor nem látszik beq CGET ;mehet a kiírás lda $ce ;kurzor alatti karakter ldx $0287 ;kurzor alatti szín ldy #$00 sty $cf ;kurzor kikapcs jsr $ea13 ;alatta volt karakter megjelenítése CGET jsr $e5b4 ;karakter beolvasása a billentyűzetpufferből A-ba cmp #$11 beq CHECKY ;kurzor le esetén ellenőrizni az aktuális sor számát ldy $c5 ;utolsó billyentyűkód dey bne FCHK ;ha nem (Shift+)Return, akkor ugrás CHECKY ldx $d6 cpx #24 ;kurzor az utolsó sorban? LOOPSJ bcs LOOPS ;igen, nincs kiírás, vissza a főciklusba bne CPRINT ;mehet a kiírás F1_2 cmp #$85 ;ha F1, akkor ugrás beq F1 dec $d021 ;paper szín léptetés bne LOOP ;feltétlen ugrás F1 dec $d020 ;border szín léptetés bne LOOP ;feltétlen ugrás FCHK dey dey beq F7_8J ;F7 vagy F8 dey beq F1_2 ;F1 vagy F2 dey beq FILEJ ;F3 vagy F4 dey beq FILEJ ;F5 vagy F6 tay bmi CHECKI ;ha vezérlőkód (>127), akkor elemezni kell cmp #$1d beq RIGHT ;kurzor jobbra cmp #$20 CPRINTJ bcc CPRINT ;vezérlőkód kiiratása rom rutinnal sta $0e ;utolsó kód mentése cmp #$60 ;konvertálás képernyőkóddá bcc CONVERT and #$df bne POKE ;képernyőkód megjelenítése, feltétlen ugrás CHECKI cmp #$94 ;insert billentyű vizsgálata beq INSERT F7_8J beq F7_8 CHECKC cmp #$a0 bcc CPRINTJ ;vezérlőkód kiiratása rom rutinnal sta $0e ;utolsó kód mentése and #$7f ora #$40 ;képernyőkódra alakítás bne POKE ;és kiírás, feltétlen ugrás INSERT ldy #$27 lda ($d1), y ;kurzor sorának utolsó oszlopában cmp #$20 bne LOOPSJ1 ;ha van karakter, akkor nem írjuk ki, nehogy sort dobjon lda #$94 ;ha mehet, akkor insert kiírása bne CHECKC ;feltétlen ugrás LOOPSJ1 sec bcs LOOPSJ ;feltétlen ugrás vissza a főciklusba CONVERT and #$3f ;$60-nál kisebb kód konvertálása képernyőkóddá POKE ldx $c7 ;inverz kapcsoló beq *+3 ;ha nem inverz, invertálás átlépése ora #$80 ;invertálása tay ldx $d6 ;kurzor sora jsr $e9f0 ;kurzor sora videomutatójának ($d1-$d2) kiszámítása ldx $0286 ;aktuális írószin tya jsr $ea13 ;karakter kiírása megfelelő színnel bit $02 bmi DOJOY ;joy aktív, azzal írunk bvs VERTICA ;függőleges írás RIGHT inc $d3 ;kurzor oszlopának növelése ldy $d3 cpy #40 ;ha még nem érte el a kurzor az utolsó oszlopot, akkor vissza a főciklusba bne LOOPSJ1 cmp #$1d bne NORIGHT ;ha nem kurzor jobbra, akkor megállás az utolsó oszlopban ldy $0f bne NORIGHT ;ha joy ír, akkor nem léphet ki a képernyőből ldy #$00 sty $d3 ;új sor elejére lépünk VERTICA lda $d6 ;kurzor sora cmp #24 ;ha az utolsó sorban van LOOPSJ2 bcs LOOPSJ1+1 ;akkor nem írjuk ki lda #$11 bcc CPRINTJ ;kurzor lefelé kiiratása rom-rutinnal, feltétlen ugrás DOJOY inc $0f ;joy írásmutató beállítása bne LOOPSJ1 ;feltétlen ugrás vissza a főciklusba NORIGHT dec $d3 ;kurzor az utolsó oszlopban ragad LOOPSJ3 bne LOOPSJ1 ;feltétlen ugrás vissza a főciklusba FILEJ beq FILE ;feltétlen ugrás F7_F8 cmp #$8c ;ha nem F8 bne F7 lda $028a ;F8-nál billentyűzetismétlés kapcsoló váltása eor #$ff sta $028a sec bcs LOOPSJ1+1 ;vissza a főciklusba F7 ldy #$00 ;képcsere index nullázása lda #$02 sta $0f ;kép és színmemória jelző ldx #$04 ;4 lapnyi képernyőmemóriaterület stx $fc ;forráscím $fb-$fc=$0400 lda #$e0 sta $fe ;célcím $fd-$fe=$e000 lda #$35 sei sta $01 ;$e000 alatti ram bekapcsolása XCHANGE lda ($fb), y ;képmemók felcserélése pha lda ($fd), y sta ($fb), y pla sta ($fd), y iny bne XCHANGE inc $fc ;mutatók felső bájtjainak léptetése ind $fe dex ;lapszámláló csökkentése bne XCHANGE ldx #$04 ;4 lapnyi színmemóriaterület lda #$d8 sta $fc ;forrásmutató a színmemóriára dec $0f ;másodjára színmemória másolása bne XCHANGE lda #$37 sta $01 ;memóriatérkép visszaállítása cli lda $d020 ;elmentendő border szín pha lda $d021 ;elmentendő paper szín pha jsr $0400-(SCREEN-STARTS);színek visszaállítása bmi *+4 ;ha már értelmes kép volt, akkor nincs törlés jsr $e544 ;első váltáskor törlés pla sta $0400-(SCREEN-STARTS)+1;paperszín tárolása pla sta $0400-(SCREEN-BORDER)+1;border szín tárolása bne LOOPSJ3 ;feltétlen ugrás vissza a főciklusba FILE cmp #$87 ;ha nem F5 bne DOFILE ;akkor valóban fájlkezelés lda $02 ;írásirány váltása eor #$40 sta $02 sec LOOPSJ4 bcs LOOPSJ2 ;feltétlen ugrás vissza a főciklusba DOFILE pha ;billentyűkód mentése lda $d020 sta $0400-(SCREEN-BORDER)+1;border szín tárolása lda $d021 sta $0400-(SCREEN-STARTS)+1;paper szín tárolása ldx #39 ;képernyő sor hossza stx $d021 COPY1 lda $0400, x ;képernyő első sorának mentése, mert itt lesz a fájlnévbekérés sta $033c, x lda $d800, x ;első sor színének mentése sta $0364, x dex bpl COPY1 inx ;x=0 stx $0286 ;tintaszín fekete jsr $e9ff ;legfelső sor törlése lda #$13 jsr $ffd2 ;crsr home kiiratása pla pha ;lenyomott billentyűkód frissítése ldy #$0400-(SCREEN-TLOAD)> cmp #$8b ;ha F6 akkor save bne *+4 lda #$0400-(SCREEN-TLOAD)<;stringmutató TLOAD-ra .byte $2c lda #$0400-(SCREEN-TSAVE)<;stringmutató TSAVE-re jsr $ab1e ;szöveg kiírása ldy #$0400-(SCREEN-TFILEN)> lda #$0400-(SCREEN-TFILEN)<;stringmutató TFILEN-re jsr $ab1e ;szöveg kiírása ldx #$00 INPUT jsr $ffcf ;fájlnév bekérése sta $038c, x inx ;x-ben a fájlnév hossza cmp #$0d ;bevitel végi return-ig olvasunk bne INPUT lda $9d ;üzemmódkapcsoló elmentése sta $09 txa ldx #$038c< ldy #$038c> sty $9d ;program üzemmódra kapcsolás jsr $ffbd ;fájlnév beállítása lemezműveletekhez ldx #39 ;képernyősor hossza bne COPY2 ;felső sor visszaállítása, feltétlen ugrás LOOPSJ5 sec bcs LOOPSJ4 COPY2 lda $038c, x ;felső képernyősor visszaállítása sta $0400, x lda $0364, x ;felső sor színeinek visszaállítása sta $d800, x dex bpl COPY2 jsr $0400-(SCREEN-STARTS);színek visszaállítása ldx $b7 ;megadott fájlnévhossz pla ;elmentett billentyűkód visszaolvasása dex beq LOOPSJ5 ;ha nincs megadva fájlnév, vissza a főciklusba cmp #$8b ;F6? bne SAVE lda $9e ;főprogram kezdőcímének mentése mert autoloados képfájlok ezt átírják pha lda $9f pha lda #$00 jsr $ffd5 ;load végrehajtása pla sta $9f ;főprogram kezdőcímének visszaállítása pla sta $9e RESTORE lda $09 ;üzemmódkapcsoló visszaállítása sta $9d lda #$60 ;rts kódja sta $0400-(SCREEN-RETURN);visszaállítjuk mert autoloados képfájlok ezt átírják bne LOOPSJ5 ;feltétlen ugrás vissza a főciklusba SAVE ldx #$68 ;pla kódja stx $0400-(SCREEN-RETURN); ldy #$0400> ;képmemória kezdete sty $fc cmp #$8a ;F4? bne AUTO ldx #$07e8< ;képmemória vége ldy #$07e8> lda #$fb ;kezdetmutató címe jsr $ffd8 ;save elvégzése RESTORJ sec bcs RESTORE ;mutatók visszaállítása és feltétlen ugrás vissza a főciklusba AUTO ldx #STARTS-RESTART;RESTART-tól STARTS-ig terjedő terület mentése COPY3 lda $0400-(SCREEN-RESTART), x sta $033c, x dex bpl COPY3 ldx #$29 COPY4 lda $0300, x ;rendszerváltozók tábláját a stop vektorig sta $0400-(SCREEN-STARTS)-#$29, x;bemásolni STARTS alá dex bpl COPY4 lda #($02ed-(STOP-STOP2))> sta $0400-(SCREEN-STARTS)-1;másolatban stop vektor átírása sta $fc lda #($02ed-(STOP-STOP2))< sta $fb ;másolás kezdete STOP2-től ldx #$dbe7< ldy #$dbe7> ;végcím=színmemória vége lda $9e clc adc #STOPS-MAIN<;stop vektor átállítása STOPS-ra sta $0328 lda $9f adc #STOPS-MAIN> sta $0329 lda #$fb jmp $ffd8 ;save végrehajtása STOPS lda $ac ;$ac-$ad aktuális save mutató beq CHECKH ;elértük a rendszerváltozótáblát? cmp #$07e7< ;elértük a képernyőmemó végét? bne ENDS lda $ad cmp #$07e7> bne ENDS lda #$00 ;mehet a második blokkban a színmemória sta $fb sta $ac lda #$d800> sta $ad lda #$f6ed< ;stop vektor visszaállítása eredeti értékére sta $0328 lda #$f6ed> sta $0329 jsr $f629 ;save folytatása ldx #STARTS-RESTART;RESTART-tól STARTS-ig terjedő terület visszaállítása COPY5 lda $033c, x sta $0400-(SCREEN-RESTART), x dex bpl COPY5 bmi RESTORJ ;feltétlen ugrás a mutatók visszaállítására CHECKH lda $ad cmp #$03 bne ENDS ;ha elértük a rendszerváltozótáblát ($0300) lda #$0400-(SCREEN-STARTS)-#$29<;akkor save folytatása a képernyőmemó elé másolt rendszerváltozótáblával sta $ac ENDS rts .END