#11 Article 531 Posted at 1987/10/27 08:17:02 by Ami (MAP404) [PRG.NL3]

Subject: NL3loader for FM-11/OS-9

最近の主流Formatに対応した(と思う)loaderです。いちおう
それらしい絵はでますが,色がなんとなく正確に再現されていないような気が
してます。formatを説明したアーティクルもみたのですが,いまいち
わからないところがあります。
 できれば,format解説していただけませんか?
----------------------------------------------------------------------
PROCEDURE n3loader
(* N3Loader 
(* メイプルタウン ネットワーク
(* 1987/10/13

BASE 0

DIM c(64),r(64),g(64),b(64):INTEGER
DIM x,y:INTEGER
DIM ipath:INTEGER
DIM filename:STRING[32]
DIM tc:STRING[1]
DIM cl,ch,cn,i,tflg:INTEGER

PRINT "     ** NL3 Loader **"
PRINT "             by Ami 1987/10/13"
PRINT 
INPUT "filename :",filename
RUN CLS

RUN LOCATE(0,0,0)

OPEN #ipath,filename:READ

x:=0 \y:=0
FOR i:=0 TO 63
GOSUB 50
cl:=ASC(tc)-32
IF cl>=127 THEN cl:=cl-33 \ ENDIF 
GOSUB 50
ch:=ASC(tc)-32
IF ch>=127 THEN ch:=ch-33 \ ENDIF 
c(i):=ch*128+cl
r(i):=c(i)/81
g(i):=(c(i)-r(i)*81)/9
b(i):=c(i)-r(i)*81-g(i)*9
r(i):=r(i)*3 \g(i):=g(i)*3 \b(i):=b(i)*3
NEXT i
WHILE x<160 AND y<100 DO 
GOSUB 50
cl:=ASC(tc)-32
IF cl>=127 THEN cl:=cl-33 \ ENDIF 
tflg:=LAND(cl,$40)
IF tflg<>0 THEN 
cl:=cl-$40
GOSUB 50 \cn:=ASC(tc)-32
IF cn>=127 THEN cn:=cn-33 \ ENDIF 
cn:=cn+2
ELSE 
cn:=1
ENDIF 
FOR i:=1 TO cn
RUN PutBlock(x*3,y*3,x*3+3,y*3+4,r(cl),2,2)
RUN PutBlock(x*3,y*3,x*3+3,y*3+4,g(cl),2,1)
RUN PutBlock(x*3,y*3,x*3+3,y*3+4,b(cl),2,4)
(* fill(x*3,y*4,x*3+2,y*4+3,rgb(r(cl),g(cl),b(cl)))
y:=y+1
IF y=100 THEN y:=0 \x:=x+1 \ ENDIF 
NEXT i
ENDWHILE 
CLOSE #ipath
GET #0,tc
RUN LOCATE(0,0,1)
END 

50 (* get 1 byte *)
REPEAT 
GET #ipath,tc
UNTIL ASC(tc)>=$20
RETURN 

PROCEDURE PutBlock
(* Put block 1 sub system command 
(* 
PARAM px1,py1,px2,py2:INTEGER
PARAM pdat:INTEGER
PARAM pf:INTEGER
PARAM pcl:INTEGER

TYPE HD=Head,InOut,Insize,Outsize:BYTE
TYPE OUTRCB=Dummy,cn,cmd:BYTE; X1,Y1,X2,Y2:INTEGER; CL,Func,Suu:BYTE; Patt1,Patt2,Patt3:INTEGER; ETX:BYTE

DIM Header:HD
DIM Outdat:OUTRCB

Header.Head:=$14
Header.InOut:=$0E
Header.Outsize:=20

Outdat.cn:=0
Outdat.cmd:=$1C
Outdat.X1:=px1
Outdat.Y1:=py1
Outdat.X2:=px2
Outdat.Y2:=py2
Outdat.CL=pcl
Outdat.Func:=pf
Outdat.Suu:=6
Outdat.Patt1:=pdat
Outdat.Patt2:=pdat
Outdat.Patt3:=pdat
Outdat.ETX:=3

PUT #1,Header
PUT #1,Outdat
END