Tajemnice ATARI

6 STRONA - KONKURS
LISTINGI

    W poprzednim numerze Tajemnic zainaugurowaliśmy nową rubrykę konkursową, w której zamieszczać będziemy nadesłane przez Czytelników programy mieszczące się na szóstej stronie pamięci. Niestety do chwili oddania do druku tego numeru nie otrzymaliśmy takich programów, dlatego dla zachęty i przykładu przedstawiamy "redakcyjny" program "Print 8", przypominając że za każdy zamieszczony w tej rubryce program jego autor otrzyma honorarium w wysokości 300.000 zł.

   "Print 8" przeznaczony jest do wypisywania tekstów w grafice 8. Zdajemy sobie sprawę z faktu, że w wielu pismach komputerowych podobnych programów było już wiele, lecz sądzimy, że "nasza" procedura szczególnie ze względu na szybkość działania, a co za tym idzie uniwersalność zastosowania przyda się w pisanych przez Państwa programach.

   Procedurę z basicu należy wywoływać funkcją USR() z czterema parametrami. Pierwszy z nich to adres procedury (w tym wypadku 1536). Drugi to pozycja pozioma początku napisu. Może on przyjmować wartości takie jak komenda POSITION czyli 0-39. Przeliczając na rozdzielczość trybu grafiki 8 oznacza to, iż początek napisu może wypadać tylko co "pełne" 8 punktów. Jest to co prawda pewne ograniczenie, lecz przyspiesza to bardzo działanie procedurki, a poza tym trudno by ją było w innym wypadku zmieścić na szóstej stronie. Trzecim parametrem jest pozycja pionowa początku napisu, tym razem co jedną linię ekranową czyli 0-191. Wreszcie czwarty parametr to adres początku napisu jaki chcemy wyświetlić. Niestety w jakiś sposób trzeba powiadomić naszego "printa" kiedy ma skończyć swoją pracę. Należy to zrobić przez dostawienie na końcu napisu znaczka ESC (uzyskujemy go przez dwukrotne naciśnięcie ESC).

   Załączony przykładowy program w basicu zwraca uwagę na niektóre możliwości użycia samej procedury maszynowej. Sam kod procedury jest relokowalny i można go umieszczać w dowolnym miejscu pamięci. Linie DATA, w których zapisany jest właściwy program zakodowane są w standardowy dla TA sposób, toteż procedura czytająca i dekodująca dane do pamięci jest taka sama jak np. w zgrywusie (wiersze 900-960) i jej wywołanie także (wiersze 10,20). Wiersze 100-180 zawierają przykładowe wykorzystanie procedury PR8. Polecamy bacznej uwadze podprogram rozpoczynający się od wiersza 800.
********************
*       text       *
*    in graphics   *
*       mode       *
********************

     opt %10101

*--- page 0 --------

scr  equ 88	   (2)

posx equ $cb   (1)
posy equ $cc   (2)
post equ $de   (2)

temp equ $d0 
endl equ temp 
inv  equ temp+1
chba equ temp+2 
scrp equ temp+4

*--- other ---------

chbs   equ 756 
ramtop equ 106

*--- const --------- 

eoln   equ $9b


* begin of procedure

     org $0600

* get parameters
     pla
     cmp #3 
     beg *+3 
     rts

     pla
     pla
     sta posx
     pla
     pla
     sta posy
     pla
     sta post+1
     pla
 
     ldx #5 
stpr lda temp,x 
     pha
     dex 
     bpl stpr

* addr of gr8 line

*----- mlp 8 -------
     lda #0
     sta posy+1

     ldx #3
ml8  asl posy
     rol posy+1
     dex
     bne ml8
     lda posy
     sta scrp
     lda posy+1
     sta scrp+1
*----- mlp 32 ------
     asl posy
     rol posy+1 
     asl posy 
     rol posy+1
*----- mlp 40 ------
     lda posy
     adc scrp
     sta scrp
     lda posy+1
     adc scrp+1
     sta scrp+1
*-- addr on screen -
     clc
     lda scrp
     adc scr
     sta scrp
     lda scr+1
     adc scrp+1
     sta scrp+1

* lo byte endl
     clc
     lda scrp
     adc #40
     sta endl

* text adr on screen
     cle
     lda scrp
     adc posx
     sta scrp
     bcc fuj
     inc scrp+1
* set chbase
fuj  ldy #0
strt lda #0
     sta chba
     sta chba+1

* next line
     lda scrp
     cmp endl
     bne prnt
     clc
     adc <280
     sta scrp
     lda scrp+1
     adc >280
     sta scrp+1
     clc
     lda endl
     adc <320
     sta endl

*-- not ramtop ?
prnt lda scrp+1
     cmp ramtop
     bcs exit

* atascii to intern
     lda (post),y
     tax
     and #128
     beg brr
     lda #255
brr  sta inv
     txa
     and #127
     cmp #eoln-$80
     beg exit
     cmp #96
     bpl done
     sbc #31
     bpl done
     adc #96
     bpl done
     and #127
     bpl done

* branch help
star bne strt

* locate & print
done ldx #2
lk   asl @
     rol chba+1
     dex
     bpl lk
     sta chba
     clc
     lda chba
     adc chba+1
     sta chba+1
     tya
     tax
     ldy #0
us   lda (chba),y
     eor inv
     sty posx
     ldy #0
     sta (scrp),y
     ldy posx
     clc
     lda scrp
     adc #40
     sta scrp
     bcc #+4
     inc scrp+1

     iny
     cpy #8
     bne us
     sec
     lda scrp
     sbc <319
     sta scrp
     lda scrp+1
     sbc >319
     sta scrp+1
     txa
     tay
     iny
     bne star

exit ldx #0
reps pla
     sta temp,x
     inx
     cpx #6
     bcc reps
quit rts

     opt %00111

     end of pr8

0 REM Przyklad uzycia procedury PR8
10 DIM A$(26):DT=1000:C=20:BS=1536
20 GOSUB 900
100 GRAPHICS 24:COLOR 1:DEG :TRAP 100
110 A=USR(BS,23,80,ADR("X=.")):DX=55
120 A=USR(BS,23,90,ADR("Y=.")):A=0
130 X=DX*SIN(A)+60:Y=55*COS(A)+95
140 WYNIK=X:HOR=25:VER=80:GOSUB 800
150 WYNIK=Y:HOR=25:VER=90:GOSUB 800
160 PLOT X,Y:A=A+3
170 IF A=360 THEN A=0:DX=DX-5
180 GOTO 130
800 REM -- Wypisz WYNIK na HOR,VER --
810 A$=STR$(WYNIK):A$(LEN(A$)+1)="."
820 Q=USR(BS,HOR,VER,ADR(A$)):RETURN 
900 REM ---   hex to data conv    ---
910 FS=0:RESTORE DT:TRAP 950
920 FOR X=0 TO C:READ A$:POKE 53279,7
930 FOR I=1 TO 26 STEP 2
940 H=ASC(A$(I))-48:H=(H-39*(H>9))*16:
L=ASC(A$(I+1))-48:L=L-39*(L>9):POKE BS
+FS,H+L:FS=FS+1:NEXT I:NEXT X
950 RETURN 
1000 REM ---    Print osiem      ---
1010 DATA 68c903f00160686885cb686885
1020 DATA cc6885df6885dea205b5d048ca
1030 DATA 10faa90085cda20306cc26cdca
1040 DATA d0f9a5cc85d4a5cd85d506cc26
1050 DATA cd06cc26cda5cc65d485d4a5cd
1060 DATA 65d585d518a5d4655885d4a559
1070 DATA 65d585d518a5d4692885d018a5
1080 DATA d465cb85d49002e6d5a000a900
1090 DATA 85d285d3a5d4c5d0d012186918
1100 DATA 85d4a5d5690185d518a5d06940
1110 DATA 85d0a5d5c56ab068b1deaa2980
1120 DATA f002a9ff85d18a297fc91bf056
1130 DATA c960100ee91f100a6960100629
1140 DATA 7f1002d0b8a2020a26d3ca10fa
1150 DATA 85d218adf40265d385d398aaa0
1160 DATA 00b1d245d184cba00091d4a4cb
1170 DATA 18a5d4692885d49002e6d5c8c0
1180 DATA 08d0e438a5d4e93f85d4a5d5e9
1190 DATA 0185d58aa8c8d0baa2006895d0
1200 DATA e8e00690f860



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001