002
17.03.2022, 23:31 Uhr
jde
|
Ich hatte für zum Einbinden von Assembler Unterprogrammen ein in Pascal geschriebenes Programm inlass. Keine Ahnung wer der Autor war. In meiner noch vorhandenen Turbo Pascal Quelle steht nur 1986 U.K.. Damit war ich sehr zufrieden. Das Programm hat aus einfachen Assembler Quelltexten Turbo Pascal Inline Code erzeugt. Ausschnitt aus inlass.pas (hat noch weitere Include Dateien):
Quellcode: | PROGRAM INLASS_80; {INLINE-Assembler fuer Turbo-Pascal }
{$V-}
CONST KommentarAnfang = ';'; ArgumentTrennung = ','; LabelEnde = ':';
TYPE Zeile = STRING[80]; string14 = STRING[14]; LabelString = STRING[8];
VAR Source, Objekt, PRNFile : text; PC : integer; FileName : string14; FehlerZahl : integer; First, KommentarFlag : boolean; SOU_Device, PRN_Device, OBJ_Device : STRING[2]; Ext : STRING[3]; PunktPos : byte; Antwort : char; KommStr : STRING[1];
{ $I PARAMSTR.BIB} (*Kann ab Turbo-Pascal 3.0 weggelassen werden*) {$I INLASCLN.INC} {$I INLAERR.INC} {$I INLABAUM.INC} {$I INLABRCH.INC} {$I INLA-Z80.INC} {$I INLAINL.INC} {$I INLADOPS.INC}
BEGIN ClrScr; writeln('INLINE-Assembler fuer Turbo-Pascal':55); writeln( '----------------------------------':55); writeln;writeln('Version Jan. 1986 U.K.':49); writeln; FehlerZahl :=0; KommentarFlag := true; SOU_Device :=''; OBJ_Device := ''; PRN_Device := ''; IF ParamCount=0 THEN BEGIN write('source file> '); readln(FileName); write('Source als Kommentar (J/N)? '); REPEAT read(kbd,Antwort); Antwort := upcase(Antwort) UNTIL Antwort IN ['J','N']; writeln(Antwort); KommentarFlag := Antwort='J' END ELSE BEGIN FileName := ParamStr(1); IF ParamCount>1 THEN BEGIN KommStr := ParamStr(2); KommentarFlag := NOT (KommStr[1] IN ['N','n']) END END;
PunktPos := pos('.',FileName); IF PunktPos>0 THEN BEGIN Ext := copy(FileName,PunktPos+1,length(FileName)-PunktPos); IF Ext<>'' THEN WHILE length(Ext)<3 DO Ext := Ext+Ext[1]; delete(FileName,PunktPos,length(FileName)-PunktPos+1) END ELSE Ext := '';
IF Ext<>'' THEN BEGIN SOU_Device := Ext[1]+':'; OBJ_Device := Ext[2]+':'; PRN_Device := Ext[3]+':' END;
assign(Source, SOU_Device+FileName+'.SOU'); assign(Objekt, OBJ_Device+FileName+'.INL'); rewrite(Objekt); assign(PRNFile,PRN_Device+FileName+'.PRN'); rewrite(PRNFile); VarListe := NIL; writeln(SOU_Device+FileName+'.SOU'); writeln('-> ',OBJ_Device+FileName+'.INL'); writeln('-> ',PRN_Device+FileName+'.PRN'); writeln(PRNFile,'PASS 1'); DoPass(1); writeln(PRNFile,'PASS 2'); DoPass(2); writeln(PRNFile); VariablenListe(VarListe); close(PRNFile); close(Objekt); writeln(FehlerZahl,' Fehler.') END.
|
Hat z.B. aus folgendem Assembler Quellcode:
Quellcode: | ; ; GDC Routinen fuer CAD in TURBO Pascal ; ; (C) 1987 by JDE, Jonny Jonas Erfurt ; ; created: 28-Jul-87 last update: 4-Aug-87 ; .z80 takt equ 16 ; Schiebetaktfrequenz ; ; Konstanten aus der Terminalberechnung ; pitch equ 64 ; Adressabstand zwischen zwei Pixelzeilen Aw equ 40 ; Aktive Worte je Zeile HS equ 1 ; Breite Hori. Syn. if takt eq 16 HFP equ 10 ; Breite hori. vordere Schwarzschulter HBP equ 11 ; Breite hori. hintere Schwarzschulter else HFP equ 7 ; Breite hori. vordere Schwarzschulter HBP equ 8 ; Breite hori. hintere Schwarzschulter endif AL equ 200 ; Aktive Zeilen (je Bild) VS equ 1 ; Breite des Vertikalsynchronimpulses VFP equ 56 ; Breite vert. vordere Schwarzschulter VBP equ 56 ; Breite vert. hintere Schwarzschulter ; LPCR equ 0 ; Zeilen je Zeichenzeile BR equ 3 ; Blinkrate CTop equ 0 ; Kursoroberzeile CBot equ 0 ; Kursorunterzeile ; sc equ Nob ; nob/bli blinkender Kursor n/j dic equ Noc ; noc/cur Kursor dargestellt n/j ; vsyntyp equ mas ; Master worktyp equ gra+nof+ref+noi ; siehe oben ; ; I/O-Adressen ; Status equ 4ch ; Status lesen / Parameter schreiben Data equ 4dh ; Daten Lesen / Kommando Schreiben Zoom equ 48h ; Konstante fuer Hardwarezoom schreiben ; ; GDC-Kommandos ; wdat equ 00100000b ;20h Schreibtyp setzen/ Daten Schreiben curs equ 01001001b ;49h Kursor setzen mask equ 01001010b ;4ah Schreibmaske setzen figs equ 01001100b ;4ch Parameter fuer Figurenzeichnen setzen figd equ 01101100b ;6ch Start fuer Figurenzeichnen pram equ 01110000b ;70h Setzen von Bytes im Parameterram zoomc equ 01000110b ;46h Zetzen der Zoomfaktoren sync equ 00001111b ;0fh Einstellen der Betriebsparameter pitchc equ 01000111b ;47h Einstellen des Zeilenadressabstandes blank equ 00001100b ;0ch Bildschirm Dunkeltasten unblank equ 00001101b ;0dh Bildschirm einschalten start equ 01101011b ;6bh Starten der Darstellung cchar equ 01001011b ;4bh Setzen der Parameter fuer Charactermode gchrd equ 01101000b ;68h Starten der Zeichnens von Character reset equ 00000000b ;00h Resetcode/ Betriebsparameter setzen vsync equ 01101110b ;6eh Vertikalsynchron-Mode setzen ; ; Schreibbetriebsarten ; trep equ 0 ; Replace mit dem Muster txor equ 1 ; Xor mit dem Muster tres equ 2 ; Setze Musterpunkte zurueck tset equ 3 ; Setze Muster ; ; Betriebsarten fuer den GDC ; mix equ 0 ; Mixed-Mode gra equ 2 ; Grafic-Mode cha equ 20h ; Character-Mode ; noi equ 0 ; ohne Zeilensprung inr equ 8 ; mit Zeilensprung beide Bilder identisch int equ 9 ; mit Zeilensprung doppelte Anzahl Zeilen ; nor equ 0 ; kein Refresh fuer dynamische Speicher ref equ 4 ; Refresh fuer dynamische Speicher ; fla equ 0 ; Schreiben in Bildbereich und Austastluecke nof equ 10h ; Schreiben nur in der Austastluecke ; ; Verikalsynchronbetriebsart ; Mas equ 1 ; Master GDC liefert Vsyn Slave equ 0 ; Slave GDC empfaengt Vsyn ( fuer mehrere GDC's) ; ; Kursorbetriebsarten ; NoC equ 0 ; ohne Kursor Cur equ 1 ; mit ; Bli equ 0 ; Blinkender Kursor NoB equ 1 ; fester Kursor ; wlines equ 16 ; Zeilen Textwindow mulhlde equ 6f5h ; integer multiplikation divdehl equ 70fh ; integer division ; ; Sprungtabelle fuer TURBO ; comman: jp cmd ; Procedure Command(P:Byte); param: jp par ; Procedure Parameter(P:Byte); setxy: jp setxy1 ; Procedure SetXY(X,Y:Integer); setber: jp setbe1 ; Procedure SetBer(Len,XAnf,YAnf,Nr:Integer); setzoom:jp setzo1 ; Procedure SetZoom(DZ,WZ:Byte); setmask:jp setma1 ; Procedure SetMask(Mask:Integer); setpat: jp setpa1 ; Procedure SetPattern(Patttern:Integer); clrscr: jp clrsc1 ; Procedure ClearScreen; exit: jp exitgr ; Procedure Exitgraf; paraw: jp paraw1 ; Procedure ParameterWord(P:Integer); austast:jp austa ; Procedure AustastLuecke; ; ; Procedure Command(P:Byte); ; cmd: pop hl ex (sp),hl cmd1: in a,(status) and 2 jr nz,cmd1 ; fifo full ld a,l out (data),a ret ; ; Procedure Parameter(P:Byte); ; par: pop hl ex (sp),hl par1: in a,(status) and 2 jr nz,par1 ; fifo full ld a,l out (status),a ret ; ; ; Procedure ParameterWord(P:Integer); ; paraw1: pop hl ; Parameter High und Low Byte ausgeben ex (sp),hl paraw2: call par1 ld l,h jr par1 ; div16: ld b,4 shftr: srl h rr l djnz shftr ret ; ; Procedure SetXY(X,Y:Integer); ; setxy1: ld l,curs call cmd1 pop iy ; ret addr. pop de ; Y ld hl,(maxy##) or a sbc hl,de ld de,(wordpl##) call mulhlde ex de,hl ; Ergebnis nach DE pop hl ; X ld c,l ; save low x call div16 add hl,de call par1 ld l,h call par1 ld l,c sla l sla l sla l sla l call par1 jp (iy) ; ; Procedure SetBer(len,xanf,yanf,nr:Integer); ; setbe1: pop iy ; ret addr. setbe2: pop hl ; nr des Bereiches sla l sla l ld a,pram add a,l ld l,a call cmd1 ; Bereich 0 oder 1 setzen pop de ; YAnf ld hl,(wordpl##) call mulhlde ex de,hl ; Ergebnis nach DE pop hl ; XAnf ld b,4 ; div 16 call shftr add hl,de call par1 ld l,h call par1 pop de ld l,e sla l sla l sla l sla l call par1 ex de,hl call div16 ld a,l and 3fh ld l,a call par1 jp (iy) ; ; Procedure SetZoom(DZ,WZ:Byte); ; setzo1: pop iy ; Return Adresse pop de ; WriteZoom in DE pop hl ; DarstellZoom in HL ld d,l ; DZ in D, WZ in E push de ld a,l or 10h out (zoom),a ; HardwareZoom ld h,0 inc l ld de,(GXMax##) push hl call divdehl ld (DarX##),hl pop hl ld de,(GYMax##) call divdehl ld (DarY##),hl ld l,zoomc call cmd1 pop de ; DZ in D, WZ in E ld a,d ; DZ nach A sla a sla a sla a sla a add a,e ; + WZ ld l,a call par1 ld hl,1 ; keine statuszeile ld a,d cp 2 jr nc,setzo2 ld l,wlines ; groesse statuszeile setzo2: push hl ; len ld de,0 push de ; xanf ld hl,(maxy##) inc hl push hl ; yanf push de ; nr jp setbe2 ; ; Procedure SetPattern(pat:Integer); ; setpa1: ld l,pram+8 jr setma2 ; ; Procedure SetMask(ma:Integer); ; setma1: ld l,mask setma2: call cmd1 pop hl ; Return adr. ex (sp),hl ; Parameter holen call par1 ld l,h call par1 ret ; ; Procedure ClearScreen; ; clrsc1: ld hl,clrtab call tabout ret ; ; ; Initialisierung des GDC ; exitgr: call austa ; warten austastluecke xor a out (zoom),a xor a out (data),a ld hl,exitab call tabout ld c,0ch ; clear screen call 0de0ch ld c,82h ; cursor on jp 0de0ch ; austa: in a,(status) ; warten ende austastluecke and 00100000b jr nz,austa austa1: in a,(status) ; warten auf anfang austastluecke and 00100000b jr z,austa1 ret ; ; Unterprogrammm zur Tabellenausgabe von Kommandos und Parametern ; an den GDC HL zeigt auf den Tabellenanfang ; (HL) - Anzahl der Kommandos ; dann wiederholt sich der folgende Tabellenaufbau fuer alle Kommandos ; (HL+1) Anzahl der Parameter fuer das 1.Kommando-1 (Kommando zaehlt mit) ; (HL+2) Kommando 1 ; (HL+..... Parameter ; (HL+n) Anzahl der Parameter fuer das 2.Kommando-1 ; tabout: ld c,m ; Kommandozahl inc hl ininex: ld b,m ; Parameterzahl inc hl comm2: in a,(status) ; Warten auf FIFO leer and 0ch cp 4 jr nz,comm2 ld a,m inc hl ; Kommando holen und ausgeben out (data),a ; Kommando ausgeben dec b ; Test auf keine Parameter jr z,iniwet inipar: ld a,m ; Parameter ausgeben inc hl out (status),a djnz inipar iniwet: dec c ; Test auf letztes Kommando jr nz,ininex ret ; ; ; Tabelle mit den Kommanndos und Parametern fuer die Initialisierung ; exitab: db 8 ; 8 Kommandos db 1 db reset db 9 db sync db worktyp db ((Aw-2) and 11111110b) db (vs and 111b) shl 5 +((hs-1) and 11111b) db (hfp-1) shl 2 + (vs and 11000b) shr 3 db (hbp and 111111b) db (vfp and 111111b) db (al and 11111111b) db (al and 1100000000b) shr 8 + vbp shl 2 db 1 db vsync + (vsyntyp and 1) db 2 db pitchc db pitch db 4 db cchar db lpcr db (br and 11b) shl 6 + sc shl 5 +ctop db (cbot and 11111b) shl 3 + (br and 11100b) shr 2 db 2 db zoomc db 0 db 1 db start db 1 db unblank ; clrtab: db 10 db 3,curs,0,0 db 3,mask,-1,-1 db 4,figs,2,-1,3fh db 3,wdat,0,0 db 4,figs,2,-1,3fh db 3,wdat,0,0 db 4,figs,2,-1,3fh db 3,wdat,0,0 db 4,figs,2,-1,3fh db 3,wdat,0,0 end
|
dieses Pascal Programm gemacht:
Quellcode: | begin {Modul GDCMAC} inline ( {0000} $C3/*+32 /$C3/*+41 /$C3/*+67 /$C3/*+113 /$C3/*+172 /$C3/ {0010} *+253 /$C3/*+246 /$C3/*+262 /$C3/*+266 /$C3/*+29 /$C3/*+285 / {0021} $E1/$E3/$DB/$4C/$E6/$02/$20/$FA/$7D/$D3/$4D/$C9/$E1/$E3/$DB/$4C/ {0031} $E6/$02/$20/$FA/$7D/$D3/$4C/$C9/$E1/$E3/$CD/*-13 /$6C/$18/$EE/ {0041} $06/$04/$CB/$3C/$CB/$1D/$10/$FA/$C9/$2E/$49/$CD/*-42 /$FD/$E1/ {0051} $D1/$2A/MAXY /$B7/$ED/$52/$ED/$5B/WORDPL /$CD/$F5/$06/$EB/$E1/ {0061} $4D/$CD/*-34 /$19/$CD/*-56 /$6C/$CD/*-60 /$69/$CB/$25/$CB/ {0071} $25/$CB/$25/$CB/$25/$CD/*-72 /$FD/$E9/$FD/$E1/$E1/$CB/$25/$CB/ {0081} $25/$3E/$70/$85/$6F/$CD/*-100 /$D1/$2A/WORDPL /$CD/$F5/$06/$EB/ {0091} $E1/$06/$04/$CD/*-82 /$19/$CD/*-106 /$6C/$CD/*-110 /$D1/$6B/ {00A1} $CB/$25/$CB/$25/$CB/$25/$CB/$25/$CD/*-123 /$EB/$CD/*-109 /$7D/ {00B1} $E6/$3F/$6F/$CD/*-134 /$FD/$E9/$FD/$E1/$D1/$E1/$55/$D5/$7D/$F6/ {00C1} $10/$D3/$48/$26/$00/$2C/$ED/$5B/GXMAX /$E5/$CD/$0F/$07/$22/DARX / {00D2} $E1/$ED/$5B/GYMAX /$CD/$0F/$07/$22/DARY /$2E/$46/$CD/*-189 / {00E2} $D1/$7A/$CB/$27/$CB/$27/$CB/$27/$CB/$27/$83/$6F/$CD/*-192 /$21/ {00F2} $01/$00/$7A/$FE/$02/$30/$02/$2E/$10/$E5/$11/$00/$00/$D5/$2A/MAXY / {0103} $23/$E5/$D5/$C3/*-138 /$2E/$78/$18/$02/$2E/$4A/$CD/*-237 /$E1/ {0113} $E3/$CD/*-230 /$6C/$CD/*-234 /$C9/$21/*+103 /$CD/*+41 /$C9/ {0123} $CD/*+24 /$AF/$D3/$48/$AF/$D3/$4D/$21/*+57 /$CD/*+25 /$0E/ {0133} $0C/$CD/$0C/$DE/$0E/$82/$C3/$0C/$DE/$DB/$4C/$E6/$20/$20/$FA/$DB/ {0143} $4C/$E6/$20/$28/$FA/$C9/$4E/$23/$46/$23/$DB/$4C/$E6/$0C/$FE/$04/ {0153} $20/$F8/$7E/$23/$D3/$4D/$05/$28/$06/$7E/$23/$D3/$4C/$10/$FA/$0D/ {0163} $20/$E6/$C9/$08/$01/$00/$09/$0F/$16/$26/$20/$24/$0B/$38/$C8/$E0/ {0173} $01/$6F/$02/$47/$40/$04/$4B/$00/$E0/$00/$02/$46/$00/$01/$6B/$01/ {0183} $0D/$0A/$03/$49/$00/$00/$03/$4A/$FF/$FF/$04/$4C/$02/$FF/$3F/$03/ {0193} $20/$00/$00/$04/$4C/$02/$FF/$3F/$03/$20/$00/$00/$04/$4C/$02/$FF/ {01A3} $3F/$03/$20/$00/$00/$04/$4C/$02/$FF/$3F/$03/$20/$00/$00) end; {GDCMAC}
|
Jemand Interesse?
Gruß Jonny Dieser Beitrag wurde am 17.03.2022 um 23:39 Uhr von jde editiert. |