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
|