|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 15104 (0x3b00) Types: TextFile Names: »JET80G.PAS«
└─⟦6cf793dfc⟧ Bits:30003506 JET80 Grafik og fontprogrammering └─ ⟦this⟧ »JET80G.PAS«
(* Latest update 851028 *) (*---------------------------------------------------------Declarations*) TYPE koord = RECORD x : Integer; y : Integer; END; str10 = String(.10.); str16 = String(.16.); VAR cirkeldata : Array(.0..9.) Of koord; (*---------------------------------------------------------ENTER_GRAPHICS*) PROCEDURE enter_graphics; BEGIN Write(#27,#81); END; (*----------------------------------------------------------EXIT_GRAPHICS*) PROCEDURE exit_graphics; BEGIN Write(#0); END; (*---------------------------------------------------------------ABS_MOVE*) PROCEDURE abs_move(x,y:Integer;pen:Boolean); VAR t_pen : Byte ABSOLUTE pen; BEGIN Write(Chr(120-(t_pen SHL 3)+(x AND 768) SHR 7+(y AND 256) SHR 8), Chr(x AND 255),Chr(y AND 255)); END; (*-------------------------------------------------------------REL_MOVE_L*) PROCEDURE rel_move_l(x,y:Integer;pen:Boolean); VAR t_pen : Byte ABSOLUTE pen; BEGIN Write(Chr(136 - t_pen SHL 3 + Abs(x) AND $300 SHR 7 + Abs(y) AND $100 SHR 8 + x AND $8000 SHR 10 + y AND $8000 SHR 11), Chr(Abs(x) AND 255),Chr(Abs(y) AND 255)); END; (*-------------------------------------------------------------REL_MOVE_S*) PROCEDURE rel_move_s(x,y:Integer;pen:Boolean); VAR t_pen : Byte ABSOLUTE pen; BEGIN Write(Chr(200 - t_pen SHL 3 + Abs(x) AND $30 SHR 3 + Abs(y) AND $10 SHR 4 + x AND $8000 SHR 10 + y AND $8000 SHR 11), Chr((Abs(x) AND 15) SHL 4 + (Abs(y) AND 15))); END; (*-------------------------------------------------------------------PLOT*) PROCEDURE plot(x,y:Integer); BEGIN abs_move(x,y,False); Write(#192,#0); END; (*------------------------------------------------------------------LINJE*) PROCEDURE linje(x1,y1,x2,y2:Integer); BEGIN abs_move(x1,y1,False); abs_move(x2,y2,True); END; (*--------------------------------------------------------------REKTANGEL*) PROCEDURE rektangel(x1,y1,x2,y2:Integer); BEGIN abs_move(x1,y1,False); abs_move(x2,y1,True); abs_move(x2,y2,True); abs_move(x1,y2,True); abs_move(x1,y1,True); END; (*------------------------------------------------------------CIRKEL_INIT*) PROCEDURE cirkel_init; VAR i,x1,x2,y1,y2 : Integer; BEGIN x1:=1000; y1:=0; FOR i:= 1 TO 9 DO BEGIN x2:=Round(1000*Cos(pi*i/36)); y2:=Round(1000*Sin(pi*i/36)); cirkeldata(.i.).x:=x2-x1; cirkeldata(.i.).y:=y2-y1; x1:=x2; y1:=y2; END; END; (*-----------------------------------------------------------------CIRKEL*) PROCEDURE cirkel(x1,y1,x2,y2:Integer); VAR tcirkel : Array(.0..10.)Of koord; i,dx,dy,xc,yc,r : Integer; k1,k2 : Real; PROCEDURE sek45(xk,yk,xs,ys:Integer;koord:Boolean); VAR i : Integer; BEGIN abs_move(xk,yk,False); IF koord THEN FOR i:=1 TO 9 DO rel_move_s(xs*tcirkel(.i.).x,ys*tcirkel(.i.).y,True) ELSE FOR i:=1 TO 9 DO rel_move_s(xs*tcirkel(.i.).y,ys*tcirkel(.i.).x,True); END; BEGIN dx:=0; dy:=0; xc:=Round((x2+x1)/2); yc:=Round((y2+y1)/2); k1:=(x2-x1); k2:=(y2-y1); r:=Round(Sqrt(Sqr(k1)+Sqr(k2))/2); FOR i:=1 TO 9 DO BEGIN tcirkel(.i.).x:=-(Abs(cirkeldata(.i.).x*r+dx) DIV 1000); dx:=-(Abs(cirkeldata(.i.).x*r+dx) MOD 1000); tcirkel(.i.).y:=(cirkeldata(.i.).y*r+dy) DIV 1000; dy:=(cirkeldata(.i.).y*r+dy) MOD 1000; END; sek45(xc+r,yc,1,-1,True); (* 0 , -45 *) sek45(xc+r,yc,1,1,True); (* 0 , 45 *) sek45(xc,yc+r,-1,1,False); (* 135 , 90 *) sek45(xc,yc+r,1,1,False); (* 90 , 45 *) sek45(xc-r,yc,-1,-1,True); (* -135 , 180 *) sek45(xc-r,yc,-1,1,True); (* 180 , 135 *) sek45(xc,yc-r,1,-1,False); (* -90 , -45 *) sek45(xc,yc-r,-1,-1,False); (* -135 , -90 *) END; (*----------------------------------------------------------CIRKEL_BÅGE*) PROCEDURE cirkel_bage(x1,y1,x2,y2,x3,y3:Integer); CONST n = 20; VAR i : Integer; dx,dy,radie,uv,mv, a,x,y : Real; FUNCTION at(x,y:Real):Real; VAR v : Real; BEGIN IF x=0 THEN v:=pi/2 ELSE v:=ArcTan(Abs(y/x)); IF x<0 THEN v:=pi-v; IF y<0 THEN v:=-v; at:=v; END; BEGIN dx:=x2-x1; dy:=y2-y1; radie:=Sqrt(Sqr(dx)+Sqr(dy)); uv:=at(dx,dy); mv:=at((x3-x1),(y3-y1))-uv; IF mv < 0 THEN mv:=2*pi+mv; abs_move(Round(x1+radie*cos(uv)),Round(y1+radie*sin(uv)),False); a:=mv/n; FOR i:=1 TO n DO BEGIN uv:=uv+a; x:=x1+radie*cos(uv); y:=y1+radie*sin(uv); abs_move(Round(x),Round(y),True) END; END; (*-------------------------------------------------------SELECT_DRAW_MODE*) PROCEDURE select_draw_mode(val:Integer); BEGIN Write(Chr(32+val)); END; (*-------------------------------------------------------SET_LINE_PATTERN*) PROCEDURE set_line_pattern(monster:str16); VAR dec_pat_h,dec_pat_l,i,term : Integer; BEGIN dec_pat_h:=0; dec_pat_l:=0; term:=128; FOR i:=1 TO 8 DO BEGIN IF monster(.i.)='1' THEN dec_pat_h:=dec_pat_h+term; term := term DIV 2; END; term:=128; FOR i:=9 TO 16 DO BEGIN IF monster(.i.)='1' THEN dec_pat_l:=dec_pat_l+term; term := term DIV 2; END; Write(#37,Chr(dec_pat_h),Chr(dec_pat_l)); END; (*----------------------------------------------------------SELECT_SCREEN*) PROCEDURE select_screen(val:Integer); BEGIN Write(#27,#91,Chr(48+val),Chr(125)); END; (*----------------------------------------------------------------CL_GRAF*) PROCEDURE cl_graf; BEGIN Write(#27,#12); END; (*------------------------------------------------------------------CROSS*) PROCEDURE cross(VAR x,y:Integer; VAR tkn:Char; min_x,min_y,max_x,max_y,d_min,d_max:Integer); CONST tang_rep_tid = 40; VAR x1,x2,y1,y2,d,i : Integer; exit : Boolean; PROCEDURE set_reset_haircross(x,y:Integer); BEGIN abs_move(x,y,False); rel_move_s(5,0,True); rel_move_s(-5,0,False); rel_move_s(0,5,True); rel_move_s(0,-5,False); rel_move_s(-5,0,True); rel_move_s(5,0,False); rel_move_s(0,-5,True); END; BEGIN Write(#33); x1:=x; y1:=y; x2:=x; y2:=y; d:=d_min; exit:=False; set_reset_haircross(x1,y1); REPEAT i:=0; REPEAT i:=(i+1) MOD 1000 + 500 * ((i+1) DIV 1000); UNTIL Keypressed; IF i > tang_rep_tid THEN d:=d_min ELSE IF d<d_max THEN d:=d+1; READ(KBD,tkn); IF Ord(tkn)=27 THEN BEGIN READ(KBD,tkn); IF Ord(tkn)=91 THEN READ(KBD,tkn); END; CASE tkn OF '8' : BEGIN y2:=(y1+d); IF y2>max_y THEN y2:=min_y; END; '2' : BEGIN y2:=(y1-d); IF y2<min_y THEN y2:=max_y; END; '4' : BEGIN x2:=(x1-d); IF x2<min_x THEN x2:=max_x; END; '6' : BEGIN x2:=(x1+d); IF x2>max_x THEN x2:=min_x; END; '9' : BEGIN y2:=(y1+d); IF y2>max_y THEN y2:=min_y; x2:=(x1+d); IF x2>max_x THEN x2:=min_x; END; '3' : BEGIN y2:=(y1-d); IF y2<min_y THEN y2:=max_y; x2:=(x1+d); IF x2>max_x THEN x2:=min_x; END; '1' : BEGIN y2:=(y1-d); IF y2<min_y THEN y2:=max_y; x2:=(x1-d); IF x2<min_x THEN x2:=max_x; END; '7' : BEGIN y2:=(y1+d); IF y2>max_y THEN y2:=min_y; x2:=(x1-d); IF x2<min_x THEN x2:=max_x; END ELSE exit:=True END; set_reset_haircross(x1,y1); set_reset_haircross(x2,y2); x1:=x2; y1:=y2; UNTIL exit; set_reset_haircross(x2,y2); x:=x1; y:=y1; Write(#32); END; (*------------------------------------------------------------DUMPA_SKARM Gemensamma procedurer : *) PROCEDURE dumpinit_cpm; BEGIN INLINE ($F3/$21/*+23/$11/$4D/$FB/$01/$0E/$00/$ED/$B0/$21/*+26/$11/ $3B/$FC/$01/$0A/$00/$ED/$B0/$FB/$C9/$3A/$F4/$FC/$B7/$CA/$4D/$FB/ $AF/$32/$F4/$FC/$DB/$22/$C9/$F5/$3E/$FF/$32/$F4/$FC/$F1/$FB/$ED/$4D); END; PROCEDURE dumpreset_cpm; BEGIN INLINE ($F3/$21/*+23/$11/$4D/$FB/$01/$10/$00/$ED/$B0/$21/*+28/$11/ $3B/$FC/$01/$10/$00/$ED/$B0/$FB/$C9/$21/$F4/$FC/$AF/$B6/$28/ $FD/$F3/$35/$ED/$5B/$F7/$FC/$1A/$21/$0E/$ED/$73/$C6/$FC/$31/ $D8/$FC/$F5/$D5/$E5/$21/$F4/$FC/$7E/$FE/$15); END; PROCEDURE dumpinit_bridos; BEGIN INLINE ($F3/$21/*+23/$11/$7C/$FA/$01/$0E/$00/$ED/$B0/$21/*+26/$11/ $23/$FB/$01/$0A/$00/$ED/$B0/$FB/$C9/$3A/$6B/$FB/$B7/$CA/$7C/$FA/ $AF/$32/$6B/$FB/$DB/$22/$C9/$F5/$3E/$FF/$32/$6B/$FB/$F1/$FB/$ED/$4D); END; PROCEDURE dumpreset_bridos; BEGIN INLINE ($F3/$21/*+23/$11/$7C/$FA/$01/$10/$00/$ED/$B0/$21/*+28/$11/ $23/$FB/$01/$10/$00/$ED/$B0/$FB/$C9/$21/$6B/$FB/$AF/$B6/$28/ $FD/$F3/$35/$ED/$5B/$6E/$FB/$1A/$E6/$7F/$ED/$73/$58/$FB/$31/ $6A/$FB/$F5/$D5/$E5/$21/$6B/$FB/$7E/$FE/$15); END; PROCEDURE dump_init; BEGIN Write(#27,'R'); END; (*END dump_init*) (*Førsta varianten dumpar, konverterar till CPA 80 format och skriver till filen filnamn *) PROCEDURE dumpa_skarm(x_max,y_max,x_min,y_min : Integer; filnamn : str10); (* CPA80 har lf3 = 24, CP80 har lf3 = 22 *) CONST gr1 = 27; (* ESC + K *) gr2 = 75; lf1 = 27; (* ESC + J + argument *) lf2 = 74; lf3 = 24; VAR rad : Array(.0..7,1..80.) Of Byte; rad_nr,i : Integer; streng : String(.80.); dumpfil : Text; v_mask : Byte; h_mask : Byte; mask : Byte; PROCEDURE dumpa_rad; VAR i,j,y : Integer; slask : Byte; BEGIN y:=400-(rad_nr)*8; FOR i:=7 DOWNTO 0 DO FOR j:=1 TO 80 DO BEGIN slask:=Bios(2); IF ((y+i) <= y_max) AND ((y+i) >= y_min) THEN IF (8*j >= x_min) AND (8*(j-1) <= x_max) THEN BEGIN IF j = (x_min DIV 8 + 1) THEN slask:= slask AND v_mask; IF j = (x_max DIV 8 + 1) THEN slask:= slask AND h_mask; rad(.i,j.):=slask; END ELSE rad(.i,j.):=0 ELSE rad(.i,j.):=0; END; END; (*END dumpa_rad*) PROCEDURE add_streng_to_fil; BEGIN Write(dumpfil,streng); streng:=''; END; (*END add_streng_to_fil*) PROCEDURE konvertera_rad; VAR prev_space : Boolean; ant_space,ant_data,j : Integer; PROCEDURE add_data; VAR k,l : Integer; byt : Byte; PROCEDURE konvertera_tkn; VAR m : Integer; BEGIN byt:=0; FOR m:=0 TO 7 DO byt:=byt+(1 SHL m)*(rad(.m,k.) AND (1 SHL l)) DIV (1 SHL l); END; (*END konvertera_tkn*) BEGIN IF Length(streng)>75 THEN add_streng_to_fil; streng:=streng+Chr(gr1)+Chr(gr2)+Chr((8*ant_data) MOD 256)+Chr((8*ant_data) DIV 256); FOR k:=(j-ant_data) TO (j-1) DO FOR l:=0 TO 7 DO BEGIN konvertera_tkn; streng:=streng+Chr(byt); IF Length(streng)=80 THEN add_streng_to_fil; END; ant_data:=0; END; (*END add_data*) PROCEDURE add_space; VAR k : Integer; BEGIN FOR k:=1 TO ant_space DO BEGIN streng:=streng+' '; IF Length(streng)=80 THEN add_streng_to_fil; END; ant_space:=0; END; (*END add_space*) BEGIN prev_space:=False; ant_space:=0; ant_data:=0; FOR j:=1 TO 80 DO BEGIN IF (rad(.0,j.)+rad(.1,j.)+rad(.2,j.)+rad(.3,j.)+ rad(.4,j.)+rad(.5,j.)+rad(.6,j.)+rad(.7,j.)) = 0 THEN BEGIN IF (NOT prev_space) AND (ant_data <> 0) THEN add_data; prev_space:=True; ant_space:=ant_space+1; END ELSE BEGIN IF prev_space THEN add_space; prev_space:=False; ant_data:=ant_data+1; END; END; j:=j+1; IF NOT prev_space THEN add_data; IF Length(streng)>75 THEN add_streng_to_fil; streng:=streng+Chr(13)+Chr(lf1)+Chr(lf2)+Chr(lf3); END; (*END konvertera_rad*) BEGIN (*skarm_dump, huvudrutin*) IF Bdos(12)=49 THEN dumpinit_cpm ELSE dumpinit_bridos; mask:=255; v_mask:=mask Shl (x_min MOD 8); h_mask:=mask Shr (7 - x_max MOD 8); dump_init; Assign(dumpfil,filnamn+'.dmp'); Rewrite(dumpfil); FOR i:=1 TO 15 DO Write(dumpfil,Chr(10)); streng:=''; FOR rad_nr:=1 TO 50 DO BEGIN dumpa_rad; konvertera_rad; END; add_streng_to_fil; Write(dumpfil,Chr(12)); Close(dumpfil); IF Bdos(12)=49 THEN dumpreset_cpm ELSE dumpreset_bridos; END; (*Andra varianten dumpar på snabbast møjliga sætt till en fil utan att bearbeta data från terminalen.*) PROCEDURE dump(filnamn:str10); VAR i,j : Integer; tkn : Byte; dumpfil : FILE; cpm_record : Array(.0..127.) OF Byte; BEGIN dumpinit_cpm; dump_init; Assign(dumpfil,filnamn+'.DMP'); Rewrite(dumpfil); FOR i:=1 TO 250 DO BEGIN FOR j:=0 TO 127 DO cpm_record(.j.):=BIOS(2); BlockWrite(dumpfil,cpm_record,1); END; Close(dumpfil); dumpreset_cpm; END; (*----------------------------------------------------------------------*) «eof»