DEF START REF VSBR,VSBW,VMBW,KSCAN,DSRLNK ERRTXT TEXT 'Fehler bei der Dateioeffnung ' TEXT 'Fehler beim Lesen eines Records ' TEXT 'Kein GIF-Header gefunden ' TEXT 'Pixel Aspect Ratio nicht unterst' TEXT 'Unbekannten Separator gefunden ' TEXT 'Application Extension Fehler ' TEXT 'Plain Text Extension Fehler ' TEXT 'Comment Extension Fehler ' TEXT 'Graphic Control Extension Fehler' TEXT 'LZW-Codelaengen Fehler ' TEXT 'Out of Memory! ' TEXT 'Stack-Overflow ' BLANK BYTE >20 EVEN DISTBL DATA IMGDIS DATA COMDIS DATA PLADIS DATA APPDIS DATA GRCDIS START CLR 0 * AUF GEHT'S MOVB @BLANK,1 CLRSCR BLWP @VSBW * SCREEN LOESCHEN INC 0 CI 0,>300 JNE CLRSCR LI 0,>2E0 LI 1,>20 BLWP @EDIT LI 0,STRING LI 1,DISTBL BLWP @GIFRD JNE TASTE DEC 0 SLA 0,5 LI 1,ERRTXT A 0,1 LI 0,>2E0 LI 2,>20 BLWP @VMBW TASTE BLWP @KSCAN MOVB @>837C,@>837C JEQ TASTE BLWP @>0000 SCRTXT TEXT 'Screendimension x' IMGTXT TEXT 'Bilddimension x' COLTXT TEXT 'Anzahl der Farben' BAKTXT TEXT 'Hintergrundfarbe' GRYTXT TEXT 'Definiere 256 Graustufen' FARTXT TEXT 'Definiere Farben aus GIF-File' LEFTXT TEXT 'Left-Offset' TOPTXT TEXT 'Top-Offset' INTTXT TEXT 'Das Bild ist Interlaced' NINTXT TEXT 'Das Bild ist Non-Interlaced' LOCMAP TEXT 'Local Color-Map gefunden' LZWTXT TEXT 'LZW Codelaenge' EVEN DISWS BSS >20 IMGDIS DATA DISWS,IMGPG IMGPG LI 0,>8E00 MOVB @DISWS+1,@>8C02 MOVB 0,@>8C02 MOV *13,4 CLR 0 LI 1,SCRTXT LI 2,23 BLWP @VMBW LI 0,>F MOV *4+,1 BLWP @DISPLY LI 0,>15 MOV *4+,1 BLWP @DISPLY LI 0,>80 LI 1,LEFTXT LI 2,11 BLWP @VMBW LI 0,>8F MOV *4+,1 BLWP @DISPLY LI 0,>A0 LI 1,TOPTXT LI 2,10 BLWP @VMBW LI 0,>AF MOV *4+,1 BLWP @DISPLY LI 0,>20 LI 1,IMGTXT LI 2,23 BLWP @VMBW LI 0,>2F MOV *4+,1 BLWP @DISPLY LI 0,>35 MOV *4+,1 BLWP @DISPLY MOV *4+,0 JNE IMGCOL LI 0,>C0 LI 1,GRYTXT LI 2,24 JMP IMGRAY IMGCOL LI 0,>C0 LI 1,FARTXT LI 2,29 IMGRAY BLWP @VMBW MOV *4+,0 JEQ IMGLMA LI 0,>100 LI 1,LOCMAP LI 2,24 BLWP @VMBW IMGLMA LI 0,>40 LI 1,COLTXT LI 2,17 BLWP @VMBW LI 0,>4F MOV *4+,1 BLWP @DISPLY LI 0,>60 LI 1,BAKTXT LI 2,16 BLWP @VMBW LI 0,>6F MOV *4+,1 BLWP @DISPLY MOV *4+,0 JEQ IMGNIN LI 0,>E0 LI 1,INTTXT LI 2,23 JMP IMGINT IMGNIN LI 0,>E0 LI 1,NINTXT LI 2,27 IMGINT BLWP @VMBW LI 0,>120 LI 1,LZWTXT LI 2,14 BLWP @VMBW LI 0,>12F MOV *4+,1 BLWP @DISPLY IMGSHO LI 1,>10 CLR 0 IMGWAI DEC 0 JNE IMGWAI DEC 1 JNE IMGWAI LI 0,>8E07 MOVB @DISWS+1,@>8C02 MOVB 0,@>8C02 RTWP COMDIS DATA DISWS,COMPG COMPG RTWP PLADIS DATA DISWS,PLAPG PLAPG RTWP APPDIS DATA DISWS,APPPG APPPG RTWP GRCDIS DATA DISWS,GRCPG GRCPG RTWP ******************************* * * * DISPLAY DEZIMAL * * * ******************************* DISPLY DATA DISWS1,DISPG DISWS1 BSS >20 DISPG MOV *13,0 AI 0,5 LI 4,10 MOV @2(13),3 DISLOP CLR 2 DIV 4,2 MOV 3,1 SWPB 1 AI 1,>3000 BLWP @VSBW DEC 0 MOV 2,3 JNE DISLOP RTWP ******************************************************************************** * * * GIF-DECODER FUER STANDARD 87a UND 89a, R0 IST FILE-POINTER, R0 RETURN * * IST FEHLERCODE BEI STATUS EQU, R1 IST POINTER AUF DISPLAY-TABLE * * * ******************************************************************************** GIFRD DATA GIFWS,GIFRPG MEMEXP EQU >0400 GRMCRU EQU >1700 GBASIS EQU >9838 PREFIX EQU >0000 SUFFIX EQU >6000 GRMRD EQU GBASIS GRMRA EQU GBASIS+2 GRMWD EQU GBASIS+1024 GRMWA EQU GBASIS+1026 PAB EQU >1500 PDATA DATA >4004,LINE,>8080,>0000,>0000 GIFEQU BYTE >20 CLOSE BYTE >41 READ BYTE >42 EXTENS BYTE >21 * EXTENSION ID----v GIF89a GRCBYT BYTE >F9 * GRAPHIC CONTROL EXTENSION " APPBYT BYTE >FF * APPLICATION EXTENSION " COMBYT BYTE >FE * COMMENT EXTENSION " PLABYT BYTE >01 * PLAIN TEXT EXTENSION " SEPBYT BYTE >2C * IMAGE SEPARATOR TERBYT BYTE >3B * TRAILER GIFID1 TEXT 'GIF87a' GIFID2 TEXT 'GIF89a' EVEN LOGWID BSS >2 * LOGICAL WIDTH LOGHEI BSS >2 * LOGICAL HEIGHT LEFOFF BSS >2 * IMAGE OFFSET VON LINKS TOPOFF BSS >2 * IMAGE OFFSET VON OBEN WIDTH BSS >2 * BILD-BREITE HEIGHT BSS >2 * BILD-HOEHE GMAP BSS >2 * FLAG FUER GLOBAL COLOR MAP LMAP BSS >2 * FLAG FUER LOCAL COLOR MAP COLOR BSS >2 * ANZAHL DER FARBEN BCKCOL BSS >2 * COLOR-CODE FUER HINTERGRUND INTERL BSS >2 * INTERLACE-FLAG LZWSIZ BSS >2 * LZW-STARTWERT GCOLOR BSS >2 * GLOBAL-COLOR GRED BSS >100 * GLOBAL COLOR-INTENSITAETEN GGREEN BSS >100 GBLUE BSS >100 RED BSS >100 * COLOR-INTENSITAETEN GREEN BSS >100 BLUE BSS >100 PIXCOL BSS >2 * PIXEL-COLOR CLRCDE BSS >2 * CLEAR-CODE EOFCDE BSS >2 * END-OF-FILE FIRST BSS >2 * FIRST-FREE-CODE INICDE BSS >2 * INIT-CODE-SIZE INIMAX BSS >2 * INIT-MAX-CODE CDESIZ BSS >2 * CODE-SIZE FREE BSS >2 * FREE-CODE MAXCDE BSS >2 * MAX-CODE IDXMSK BSS >2 * BIT-MASKE GIDXMS BSS >2 * GLOBAL BIT-MASKE INDEX BSS >2 * COLOR-INDEX CURCDE BSS >2 * CURRENT CODE OLDCDE BSS >2 * OLD CODE LIFO BSS >802 * 1025 WORTE LINE BSS >80 * EIN RECORD GIFWS BSS >20 GIFRPG BLWP @MEMPRO * PROLOG LI 0,>8E07 * PAB IM LETZTEN BLOCK MOVB @GIFWS+1,@>8C02 MOVB 0,@>8C02 LI 0,PAB LI 1,PDATA LI 2,>A LI 3,1 * ERROR-KENNUNG 1, OPEN-ERROR BLWP @VMBW AI 0,9 MOV 0,@>8356 MOV *13,1 * POINTER AUF FILE-NAME MOVB *1,2 SRL 2,8 INC 2 BLWP @VMBW BLWP @DSRLNK DATA 8 JNE OPENOK ERROR B @FCLOSE OPENOK LI 3,2 * ERROR-KENNUNG 2, READ-ERROR LI 0,PAB MOVB @READ,1 BLWP @VSBW AI 0,9 MOV 0,@>8356 BLWP @DSRLNK DATA 8 JEQ ERROR *-----------------------------+ * HEADER ! REQUIRED *-----------------------------+ CHECK1 LI 4,LINE ! ERSTE RECORD ERFOLGREICH GELESEN LI 5,GIFID1 ! LI 2,6 ! LI 3,3 ! ERROR-KENNUNG 3, KEINE GIF-DATEI CHK1LP CB *4+,*5+ ! WIR AKZEPTIEREN NUR GIF87a JNE CHECK2 ! DEC 2 ! JNE CHK1LP ! JMP LOGSCR ! CHECK2 LI 4,LINE ! POINTER WIEDER AUF DEN ANFANG LI 5,GIFID2 ! ZWEITE KENNUNG LI 2,6 ! CHK2LP CB *4+,*5+ ! UND GIF89a JNE ERROR ! DEC 2 ! JNE CHK2LP ! *-----------+-----------------+ * ! * ! * V *-----------------------------+ * LOGICAL SCRREN DESCR. ! REQUIRED *-----------------------------+ LOGSCR MOVB *4+,@LOGWID+1 ! MOVB *4+,@LOGWID ! LOGICAL SCRREN WIDTH MOVB *4+,@LOGHEI+1 ! MOVB *4+,@LOGHEI ! LOGICAL SCREEN HEIGHT MOVB *4,0 ! 7 6 5 4 3 2 1 0 SRL 0,8 ! --------------- ANDI 0,7 ! M --CR- S --P-- INC 0 ! LI 1,1 ! M => GLOBAL COLOR-MAP 0: NEIN, 1: JA SLA 1,0 ! CR => ANZAHL DER BIT/PIXEL (CR+1) MOST COL. MOV 1,@GCOLOR ! S => FARBTABELLEN ORDNUNG 0: NEIN 1: GEORDNET DEC 1 ! P => GLOBAL COLOR MAP SIZE = 2^(P+1) INV 1 ! MOV 1,@GIDXMS ! GLOBAL INDEX-MASKE ZUM LOESCHEN LI 3,4 ! ERROR-CODE 4 MOVB *4+,0 ! MOVB *4+,8 ! BACKDROP-COLOR MOVB *4+,1 ! NULL-BYTE, PIXEL ASPECT-RATIO JNE ERROR ! (BYTE-VALUE+15/64) 0 *-----------+-----------------+ (WIR NEHMEN NUR NULL) * ! * +----------------------------------+ * V ! *-----------------------------+ ! * GLOBAL COLOR MAP ! OPTIONAL ! *-----------------------------+ ! MOVB 0,0 ! ! JLT MAPOK ! GLOBAL COLOR-MAP? CLR @GMAP ! ! CLR 8 ! KEINE FARBEN, GRAUSTUFEN CLR @GRED ! ! CLR @GGREEN ! ! CLR @GBLUE ! ! SETO 5 ! DIE SPEZIFIKATION SAGT ERSTE FARBE SOLLTE MOVB 5,@GRED+1 ! SCHWARZ SEIN UND ZWEITE WEISS MOVB 5,@GGREEN+1 ! ! MOVB 5,@GBLUE+1 ! ! LI 5,>100 ! ! LI 6,>2 ! ! GRAULP MOVB 5,@GRED(6) ! ! MOVB 5,@GGREEN(6) ! ! MOVB 5,@GBLUE(6) ! ! AI 5,>100 ! ! INC 6 ! ! CI 6,>100 ! ! JNE GRAULP ! ! JMP COLDON ! ! MAPOK SETO @GMAP ! ! CLR 6 ! ! MOV @GCOLOR,7 ! ! FARBLP BL @NEXTCH ! GLOBAL COLOR'S FESTLEGEN MOVB 5,@GRED(6) ! ! BL @NEXTCH ! ! MOVB 5,@GGREEN(6) ! ! BL @NEXTCH ! ! MOVB 5,@GBLUE(6) ! ! INC 6 ! ! DEC 7 ! ! JNE FARBLP ! ! COLDON SRL 8,8 ! ! MOV 8,@BCKCOL ! HINTERGRUND-FARBE FESTLEGEN *-----------+-----------------+ ! * ! ! * !<---------------------------------+ * V *-----------------------------+ STREAM BL @NEXTCH ! BELIEBIG OFTER EINSTIEG IN DEN EXTENSION-BLOCK, LI 3,5 ! DEN ICH ABER NICHT UNTERSTUETZE! CB 5,@EXTENS ! ICH ERWARTE GLEICH DEN IMAGE DESCRIPTOR >2C JNE NOEXT ! DA DER EXTENSION-BLOCK KEINE BILDINFORMATION BL @NEXTCH ! ENTHAELT. ICH HABE BISHER AUCH KEIN GIF GEFUNDEN CB 5,@APPBYT ! DASS >21 HAT (EXTENSION-SEPARATOR) JEQ APPLIC ! CB 5,@COMBYT ! JEQ COMMEN ! CB 5,@GRCBYT ! JEQ GRAPHC ! CB 5,@PLABYT ! JEQ PLAINT ! JMP FCLOSE ! NOEXT CB 5,@SEPBYT ! JEQ SEPOK ! CB 5,@TERBYT ! JNE FCLOSE ! *-----------+-----------------+ * ! * +----------------------------------+ * ! *-----------------------------+ <--------------+ * TRAILER ! REQUIRED ! *-----------------------------+ ! TERMIN CLR 3 ! ! FCLOSE BLWP @MEMEPI ! TERMINATION, EPILOG LI 0,PAB ! FILE SCHLIESSEN MOVB @CLOSE,1 ! ! BLWP @VSBW ! ! AI 0,9 ! ! MOV 0,@>8356 ! ! BLWP @DSRLNK ! ! DATA 8 ! ! SZCB @GIFEQU,15 ! ! MOV 3,*13 ! ! JEQ GIFEND ! ! SOCB @GIFEQU,15 ! ! GIFEND LI 0,>8E00 ! ! CLR @>8C02 ! ! MOVB 0,@>8C02 ! ! RTWP ! ! *-----------------------------+ ! * ! *-----------------------------+ <--------------+ * APPLICATION EXTENSION ! OPTIONAL ! *-----------------------------+ ! APPLIC BL @NEXTCH ! HEADER BLOCK-SIZE LI 3,6 ! ! MOVB 5,2 ! ! SRL 2,8 ! ! CI 2,11 ! ! JNE FCLOSE ! ! APPIDL BL @NEXTCH ! SKIP 8 BYTES APP-ID UND 3 BYTES APP-AUT.-CODE DEC 2 ! ! JNE APPIDL ! ! APPBLP BL @NEXTCH ! SUB-BLOCK-SIZE ! MOVB 5,2 ! ! JEQ STREAM ! NULL-BYTE? ->READY SRL 2,8 ! ! APPSKP BL @NEXTCH ! ! DEC 2 ! ! JNE APPSKP ! ! JMP APPBLP ! ! *-----------------------------+ ! * ! *-----------------------------+ <--------------+ * PLAINTEXT EXTENSION ! OPTIONAL ! *-----------------------------+ ! PLAINT BL @NEXTCH ! HEADER BLOCK-SIZE LI 3,7 ! ! MOVB 5,2 ! ! SRL 2,8 ! ! CI 2,12 ! ! JNE FCLOSE ! ! PLAIDL BL @NEXTCH ! SKIP 12 BYTES ! DEC 2 ! ! JNE PLAIDL ! ! PLABLP BL @NEXTCH ! SUB-BLOCK-SIZE ! MOVB 5,2 ! ! JEQ STREAM ! NULL-BYTE? ->READY SRL 2,8 ! ! PLASKP BL @NEXTCH ! ! DEC 2 ! ! JNE PLASKP ! ! JMP PLABLP ! ! *-----------------------------+ ! * ! *-----------------------------+ <--------------+ * COMMENT EXTENSION ! OPTIONAL ! *-----------------------------+ ! COMMEN BL @NEXTCH ! SUB-BLOCK-SIZE ! LI 3,8 ! ! MOVB 5,2 ! ! JEQ STREAM ! NULL-BYTE? ->READY SRL 2,8 ! ! COMSKP BL @NEXTCH ! ! DEC 2 ! ! JNE COMSKP ! ! JMP COMMEN ! ! *-----------------------------+ ! * ! *-----------------------------+ <--------------+ * GRAPHICAL EXTENSION ! OPTIONAL ! *-----------------------------+ ! GRAPHC BL @NEXTCH ! HEADER BLOCK-SIZE LI 3,9 ! ! MOVB 5,2 ! ! SRL 2,8 ! ! CI 2,4 ! ! JNE FCLOSE ! ! GRAPDL BL @NEXTCH ! SKIP 4 BYTES ! DEC 2 ! ! JNE GRAPDL ! ! BL @NEXTCH ! SUB-BLOCK-SIZE ! LI 3,9 ! ! MOVB 5,2 ! ! JNE FCLOSE ! NULL-BYTE? ->READY B @STREAM ! NACH DIESEM BLOCK NUR IMAGE ODER PLAIN TEXT! *-----------------------------+ ! * ! *-----------------------------+ <--------------+ * IMAGE DESCRIPTOR ! OPTIONAL *-----------------------------+ SEPOK BL @NEXTCH ! SWPB 5 ! BL @NEXTCH ! MOV 5,@LEFOFF ! LEFT OFFSET BL @NEXTCH ! SWPB 5 ! BL @NEXTCH ! MOV 5,@TOPOFF ! TOP OFFSET BL @NEXTCH ! SWPB 5 ! BL @NEXTCH ! MOV 5,@WIDTH ! IMAGE WIDTH X BL @NEXTCH ! SWPB 5 ! BL @NEXTCH ! MOV 5,@HEIGHT ! IMAGE HEIGHT Y M: USE GLOBAL COLOR MAP -> 0 BL @NEXTCH ! 7 6 5 4 3 2 1 0 I: INTERLACED -> 1 MOVB 5,0 ! --------------- S: LOCAL COLOR MAP SORTED -> 1 ANDI 5,>4000 ! M I S 0 0 --P-- P: BITS PER PIXEL MOV 5,@INTERL ! *-----------------------------+ * ! CLR 6 CPYCOL MOVB @GRED(6),@RED(6) * KOPIEREN DER GLOBALEN DATEN IN DIE LOKALEN MOVB @GGREEN(6),@GREEN(6) MOVB @GBLUE(6),@BLUE(6) INC 6 CI 6,>100 JNE CPYCOL MOV @GCOLOR,@COLOR MOV @GIDXMS,@IDXMSK * ! * +----------------------------------+ * V ! *-----------------------------+ ! * LOCAL COLOR MAP ! OPTIONAL ! *-----------------------------+ ! MOVB 0,5 ! ! ANDI 5,>8000 ! GLOBAL COLOR-MAP? MOV 5,@LMAP ! ! JEQ RASTER ! JA! ! SRL 0,8 ! ! ANDI 0,7 ! ! INC 0 ! ! LI 1,1 ! ! SLA 1,0 ! ! MOV 1,@COLOR ! #COLOR NEU DEFINIEREN DEC 1 ! ! INV 1 ! ! MOV 1,@IDXMSK ! NEUE INDEX-MASKE CLR 6 ! ! MOV @COLOR,7 ! ! LOCCOL BL @NEXTCH ! LOCAL COLOR'S FESTLEGEN, ALTE FARB-CODES MOVB 5,@RED(6) ! UEBERSCHREIBEN ! BL @NEXTCH ! ! MOVB 5,@GREEN(6) ! ! BL @NEXTCH ! ! MOVB 5,@BLUE(6) ! ! INC 6 ! ! DEC 7 ! ! JNE LOCCOL ! ! *-----------+-----------------+ ! * ! ! * !<---------------------------------+ * V *-----------------------------+ * IMAGE DATA ! REQUIRED *-----------------------------+ RASTER BL @NEXTCH ! ERSTE LESEN DER DECOMPRESSIONS-DATEN LI 3,10 ! MOVB 5,0 ! SRL 0,8 ! CI 0,>2 ! LZW MINIMUM CODE SIZE JL BYEBYE ! CI 0,>8 ! JH BYEBYE ! MOV 0,@LZWSIZ ! LI 1,1 ! SLA 1,0 ! MOV 1,@CLRCDE ! CLEAR-CODE MOV 1,@EOFCDE ! INC @EOFCDE ! EOF-CODE = CLEAR-CODE + 1 MOV 1,@FIRST ! INCT @FIRST ! FIRST-FREE-CODE = CLEAR-CODE + 2 MOV @FIRST,@FREE ! FREE-CODE INC 0 ! MOV 0,@CDESIZ ! CODE-SIZE++ MOV 0,@INICDE ! INIT-CODE-SIZE SLA 1,1 ! MOV 1,@MAXCDE ! MAX-CODE MOV 1,@INIMAX ! INIT-MAX-CODE CLR @OLDCDE ! CLR @INDEX ! CLR 10 ! CLR 12 ! CLR @GRMWA ! CLR @GRMWA ! UNBLLP BL @NEXTCH ! UNBLOCK MOVB 5,2 ! JEQ DEKOMP ! SHOW THE GUTS SRL 2,8 ! UNLOOP BL @NEXTCH ! MOVB 5,@GRMWD(12) ! INC 10 ! JNC NOCAR ! AI 12,4 ! LI 3,11 ! ERROR-CODE 11 MOV 12,11 ! AI 11,GBASIS ! CI 11,>9840 ! JEQ BYEBYE ! CLR @GRMWA(12) ! CLR @GRMWA(12) ! NOCAR DEC 2 ! JNE UNLOOP ! JMP UNBLLP ! BYEBYE B @FCLOSE ! *-----------------------------+ ******************************* * * * DEKOMPRIMIEREN! * * * ******************************* DEKOMP MOV @2(13),1 JEQ LZWALG LI 0,LOGWID * POINTER AUF INFO-STRUCT MOV *1,1 * ERSTER TABLE-ENTRY IST IMAGE-DISPLAY BLWP *1 LZWALG BLWP @INITRD BLWP @BITMAP * MAKE IMAGE... LI 10,LIFO * STACK INITIALISIEREN LZWLOP BLWP @RDBITS * CODE HOLEN C 0,@EOFCDE * EOF? JEQ DONE C 0,@CLRCDE * CLEAR-CODE? JNE NOCLEA MOV @INICDE,@CDESIZ * JA! MOV @INIMAX,@MAXCDE MOV @FIRST,@FREE * FIRST-FREE BLWP @SETMSK CLRSKP BLWP @RDBITS C 0,@CLRCDE JEQ CLRSKP C 0,@EOFCDE JEQ DONE C 0,@FIRST JL CDEGOD CLR 0 CDEGOD MOV 0,@OLDCDE SZC @IDXMSK,0 MOV 0,@INDEX MOV 0,@PIXCOL BLWP @PIXEL JMP LZWLOP NOCLEA LI 3,12 * NORMALER OUTPUT MOV 0,@CURCDE C 0,@FREE JL FREELP MOV @OLDCDE,@CURCDE MOV @INDEX,*10+ FREELP C @CURCDE,@FIRST * RAW-DATA AUF DEN STACK RAUF JL STKOK CI 10,LIFO+>800 * PROBLEM!!! WIR TERMINIEREN JHE BYEBYE MOV @CURCDE,1 SLA 1,1 MOV @PREFIX(1),@CURCDE MOV @SUFFIX(1),*10+ JMP FREELP STKOK MOV @CURCDE,2 SZC @IDXMSK,2 MOV 2,@INDEX MOV 2,*10 UNSTK MOV *10,@PIXCOL * OK, ALLE PIXEL SETZEN BLWP @PIXEL DECT 10 CI 10,LIFO JHE UNSTK LI 10,LIFO C @FREE,@MAXCDE JEQ LZWLOP MOV @FREE,1 * BIT-CODE VERLAENGERN, FALLS ES GEHT SLA 1,1 MOV @OLDCDE,@PREFIX(1) MOV @INDEX,@SUFFIX(1) MOV 0,@OLDCDE INC @FREE C @FREE,@MAXCDE * NEIN, SOLL NICHT SEIN JNE LZWLOP MOV @CDESIZ,1 CI 1,12 * MAXIMUM IST SCHON ERREICHT JEQ LZWLOP INC @CDESIZ A @MAXCDE,@MAXCDE BLWP @SETMSK JMP LZWLOP DONE B @STREAM * WIR SIND FERTIG! ******************************* * * * LESEN EINES CHAR'S * * AUS EINEM "STREAM" * * * ******************************* NEXTCH MOVB *4+,5 * LIEST DAS NAECHSTE CHAR CI 4,LINE+128 * ENDE ERREICHT? JNE NEXTOK LI 0,PAB+9 MOV 0,@>8356 BLWP @DSRLNK DATA 8 JEQ NEXTER LI 4,LINE NEXTOK RT NEXTER LI 3,2 * ERROR-CODE 2 B @FCLOSE ******************************* * * * PROGLOG * * * ******************************* MEMPRO DATA MEMWS,MEMPPG MEMWS BSS >20 MEMPPG LI 12,GRMCRU * CRU-BASIS SBO 1 * ROM'S AUS SBO 5 * ALLE BYTES LI 12,MEMEXP SBO 0 * RAM AUF >0000 - >1FFF FUER PREFIX SBO 2 * RAM AUF >6000 - >7FFF FUER SUFFIX RTWP ******************************* * * * EPILOG * * * ******************************* MEMEPI DATA MEMWS,MEMEPG MEMEPG LI 12,MEMEXP * ALLE 16-BIT SPEICHER AUS SBZ 0 SBZ 1 SBZ 2 LI 12,GRMCRU * GRAM-KARTEN WIEDER AUF "NORMAL" SBZ 1 SBZ 5 RTWP ******************************* * * * INIT-READ * * * ******************************* INITRD DATA READWS,INIRPG READWS BSS >20 INIRPG CLR 9 * BIT-OFFSET CLR 10 * BYTE-OFFSET, MSB CLR 11 * LSB LI 12,GRMCRU JMP SETMPG ******************************* * * * SET BIT-MASK * * * ******************************* SETMSK DATA READWS,SETMPG SETMPG LI 8,1 MOV @CDESIZ,7 * R7 IST CODE-SIZE MOV @CDESIZ,0 JEQ SETMND SLA 8,0 DEC 8 * R8 IST BITMASKE! INV 8 SETMND RTWP ******************************* * * * READ CODE, * * R0 IST RETURN-CODE * * * ******************************* RDBITS DATA READWS,READPG READPG MOV 10,6 ANDI 6,>F SLA 6,2 MOVB 11,@GRMWA(6) MOVB @READWS+23,@GRMWA(6) MOV 11,5 SBZ 3 * DREI BYTES LESEN (24 BIT) MOVB @GRMRD(6),@READWS+5 INC 5 JNC READC1 * CARRY? AI 6,4 CLR @GRMWA(6) CLR @GRMWA(6) READC1 MOVB @GRMRD(6),2 INC 5 JNC READC2 AI 6,4 CLR @GRMWA(6) CLR @GRMWA(6) READC2 MOVB @GRMRD(6),@READWS+3 SBO 3 MOV 9,0 JEQ READSK SRL 2,0 * ZUSAMMENBAUEN EINES 32-BIT SHIFTS LI 3,1 SLA 3,0 DEC 3 INV 3 SZC 3,1 NEG 0 AI 0,16 SLA 1,0 A 1,2 READSK SZC 8,2 * MAXIMAL 12 BIT! MOV 2,*13 A 7,9 * ADDIERE CODE-SIZE AUF BIT-OFFSET MOV 9,0 SRL 0,3 ANDI 9,7 * BIT-OFFSET WIEDER OK A 0,11 * BYTE-OFFSET BESTIMMEN JNC READNC INC 10 READNC RTWP ******************************* * * * INIT BITMAP-MODUS * * * ******************************* BITMAP DATA PIXWS,BITXPG BITDAT DATA >000E,>0162,>021F,>05F7 * SCREEN AUF >0000 BIS >D400 DATA >061E,>0700,>080A,>0902 * MULTI-COLOR, NICHT INTERLACED DATA >0B01,>0E00,>0F00,>122D * 192 LINES DATA >0000 H01 BYTE >01 MODE7 BYTE >0E * GRAPHIC-MODE 7 MODE6 BYTE >0A * GRAPHIC-MODE 6 PAL BYTE >02 * PAL INTBIT BYTE >08 * INTERLACE-BIT LNBIT BYTE >80 * LN-BIT EVEN XMAX DATA 512 XMIN DATA 256 YMAX DATA 212 YMIN DATA 192 YMINI DATA 384 YMAXI DATA 424 COLMAX DATA 16 PIXCLX BSS >2 PIXCLY BSS >2 PIXWS BSS >20 BITXPG LI 11,>8C02 * FESTE WERTE! LI 12,>8C06 MOV @BCKCOL,3 * HINTERGRUNDFARBE BILDEN MOVB @GREEN(3),2 * ALLES VORBEREITEN, ALS WAERE ES 256x192 256 COL. ANDI 2,>E000 MOVB @RED(3),4 SRL 4,3 ANDI 4,>1C00 AB 4,2 MOVB @BLUE(3),4 SRL 4,6 AB 4,2 MOVB 2,@BITDAT+11 * COLOR-CODE SCHREIBEN MOVB @MODE7,@BITDAT+1 * GRAPHIC-MODE 7 MOVB @PAL,@BITDAT+15 * 192 LINES, NON-INTERLACED MOV @XMIN,@PIXCLX * CLIP-DATA MOV @YMIN,@PIXCLY LI 1,BITDAT C @COLOR,@COLMAX * MEHR ALS COLMAX FARBEN? -> RGB-MODE JLE BITLOW BITHIC C @HEIGHT,@YMIN * SWITCH ZU 212 LINES? JLE BITILP BITHIL MOVB @PAL,3 SOCB @LNBIT,3 MOVB 3,@BITDAT+15 MOV @YMAX,@PIXCLY JMP BITILP BITLOW C @WIDTH,@XMIN JH BITBIG C @HEIGHT,@YMIN JLE BITILP C @HEIGHT,@YMAX JLE BITHIL BITBIG LI 0,>9000 * COLOR-CODE IN TABLE SETZEN MOV @COLOR,2 CLR 3 BITBLP MOVB @PIXWS+1,*11 MOVB 0,*11 MOVB @RED(3),4 MOVB @GREEN(3),5 MOVB @BLUE(3),6 SRL 4,13 SRL 5,13 SRL 6,13 SLA 4,12 SLA 6,8 A 6,4 A 5,4 MOVB 4,@>8C04 MOVB @PIXWS+9,@>8C04 INC 0 INC 3 DEC 2 JNE BITBLP MOVB @MODE6,@BITDAT+1 * 512 PIXEL SETZEN MOVB @BCKCOL+1,@BITDAT+11 MOVB @PAL,3 SOCB @INTBIT,3 MOVB 3,@BITDAT+15 MOV @XMAX,@PIXCLX MOV @YMINI,@PIXCLY C @HEIGHT,@YMINI JLE BITILP MOVB @PAL,3 SOCB @INTBIT,3 SOCB @LNBIT,3 MOVB 3,@BITDAT+15 MOV @YMAXI,@PIXCLY BITILP MOV *1+,0 JEQ BITEND CB 0,@H01 JNE BITCON MOVB @PIXWS+1,@>83D4 BITCON ORI 0,>8000 MOVB @PIXWS+1,*11 MOVB 0,*11 JMP BITILP BITEND LI 0,>4000 * CLEAR SCREEN, LAEUFT AUTOMATISCH CLR *11 * UEBER 16K-GRENZE HINAUS MOVB 0,*11 MOVB @BITDAT+11,1 LI 2,>1D40 * >1D400 BYTES LOESCHEN LI 3,>8C00 BITCLR MOVB 1,*3 * POWER-CLEAR MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 MOVB 1,*3 DEC 2 JNE BITCLR LI 0,>8E07 * VDP-BASIS 0 MOVB @PIXWS+1,*11 MOVB 0,*11 CLR 8 * X CLR 9 * Y CLR 10 * PATH-COUNTER! RTWP ******************************* * * * SETZT PIXEL AUF SCREEN * * MAX. 256 FARBEN * * * ******************************* PIXEL DATA PIXWS,PIXPG VDPR17 BYTE >91 VDPR36 BYTE >24 VDPR44 BYTE >2C PIXCMD BYTE >50 EVEN PIXPG C 8,@PIXCLX JHE PIXNXT C 9,@PIXCLY JHE PIXNXT *-----------------------------+ MOVB @VDPR36,*11 ! MOVB @VDPR17,*11 ! START-REGISTER FUER AUTMATISCHES SCHREIBEN *-----------------------------+ MOVB @PIXWS+17,*12 ! MOVB 8,*12 ! X-SOURCE - POINT *-----------------------------+ CB @MODE6,@BITDAT+1 JEQ PIXSET MOV @PIXCOL,3 * TABLE-LOOKUP MOVB @GREEN(3),2 ANDI 2,>E000 MOVB @RED(3),4 SRL 4,3 ANDI 4,>1C00 AB 4,2 MOVB @BLUE(3),4 SRL 4,6 AB 4,2 *-----------------------------+ MOVB @PIXWS+19,*12 ! CLR *12 ! Y-SOURCE - POINT *-----------------------------+ MOVB @VDPR44,*11 ! MOVB @VDPR17,*11 ! START-REGISTER FUER AUTMATISCHES SCHREIBEN *-----------------------------+ MOVB 2,*12 ! COLOR-REGISTER *-----------------------------+ CLR *12 ! COMMAND-REGISTER *-----------------------------+ MOVB @PIXCMD,*12 ! SET PIXEL *-----------------------------+ JMP PIXNXT *-----------------------------+ PIXSET MOV 9,2 ! SRL 2,1 ! MOVB @PIXWS+5,*12 ! MOV 9,2 ! ANDI 2,1 ! MOVB @PIXWS+5,*12 ! Y-SOURCE - POINT *-----------------------------+ MOVB @VDPR44,*11 ! MOVB @VDPR17,*11 ! START-REGISTER FUER AUTMATISCHES SCHREIBEN *-----------------------------+ MOVB @PIXCOL+1,*12 ! COLOR-REGISTER *-----------------------------+ CLR *12 ! COMMAND-REGISTER *-----------------------------+ MOVB @PIXCMD,*12 ! SET PIXEL *-----------------------------+ PIXNXT INC 8 C 8,@WIDTH JL PIXEND CLR 8 MOV @INTERL,@INTERL JNE PIXINT INC 9 RTWP PIXINT MOV 10,10 * INTERLACED STUFF JNE PIXPH1 AI 9,>8 * LINE 0, 8, 16... C 9,@HEIGHT JL PIXEND INC 10 LI 9,>4 JMP PIXEND PIXPH1 CI 10,>1 JNE PIXPH2 AI 9,>8 * LINE 0, 4, 8, 12, 16... C 9,@HEIGHT JL PIXEND INC 10 LI 9,>2 JMP PIXEND PIXPH2 CI 10,>2 JNE PIXPH3 AI 9,>4 * LINE 0, 2, 4, 6, 8, 10... C 9,@HEIGHT JL PIXEND INC 10 LI 9,>1 JMP PIXEND PIXPH3 INCT 9 * LINE 0, 1, 2, 3, 4, 5... PIXEND RTWP ******************************************************************************** * R0 IST SCREEN POSITION VON DER GELESEN WIRD * * R1 IST MAXIMALE LAENGE * * STRING IST RETURN-WERT MIT ERSTEM BYTE=LAENGE, LEAVE IST DER RETURN-CHAR* ******************************************************************************** EDIT DATA EDITWS,EDITPG * CURSOR BYTE >5F * ZEICHEN DIE AKZEPTIERT WERDEN: * LOW BYTE >20 * INCLUSIVE LOW * HIGH BYTE >7F * INCLUSIVE HIGH * BS BYTE >08 * BACKSPACE * CR BYTE >0D * CARRIGE-RETURN * EVEN * STEQU DATA >2000 * LEAVE BSS >2 * RETURN-CHAR * STRING BSS >52 * FERTIGER STRING * EDITWS BSS >20 * EDITPG MOV @>0000(13),0 * START-POSITION * CLR 2 * SWITCH-COUNTER * CLR 3 * CHAR-COUNTER * CLR @>8374 * TASTATUR-MODUS 0 * EDIT1 MOVB @CURSOR,1 * ALS ERSTES DEN CURSOR * SWPB 1 * BLWP @VSBR * BL @SWITCH * EDIT2 INC 2 * CI 2,>200 * SWITCH-LIMIT ERREICHT? * JNE EDIT3 * BL @SWITCH * EDIT3 BLWP @KSCAN * MOVB @>837C,4 * COC @STEQU,4 * TASTATUR-STATUS = 0? * JNE EDIT2 * MOVB @BLANK,1 * SWPB 1 * MOVB @>8375,1 * ZEICHEN HOLEN * CB 1,@LOW * KLEINE ALS LOWER-BOUND? * JL EDIT4 * CB 1,@HIGH * HOEHER ALS UPPER-BOUND? * JH EDIT4 * C 3,@>0002(13) * MAXIMAL-ZAHL ERREICHT? * JEQ EDMAX * INC 3 * ZEICHEN ERHOEHEN -> ERSTE BYTE IMMER FREI! * EDMAX MOVB 1,@STRING(3) * ZEICHEN NACH STRING * BLWP @VSBW * CLR 2 * C 3,@>0002(13) * JEQ EDIT1 * INC 0 * JMP EDIT1 * EDIT4 CB 1,@BS * BACKSPACE * JNE EDIT5 * BL @SWITCH * SCHREIBT BLANK * MOV 3,3 * NICHT WENIGER! * JEQ EDIT1 * C 3,@>0002(13) * AM ENDE R0 NICHT VERAENDERN * JEQ EDITBS * DEC 0 * SWPB 1 * AKTUELLES ZEICHEN AUCH BLANKEN * BL @SWITCH * EDITBS DEC 3 * POINTER FUER STRING KORRIGIEREN * JMP EDIT1 * EDIT5 CB 1,@CR * CR * JEQ EDIT6 * BL @SWITCH * SCHREIBT BLANK (FUER JEDES NICHT GEWUENSCHTE * JMP EDIT1 ZEICHEN)* EDIT6 MOV 3,3 * JEQ EDIT1 * KEINE LEEREN STRINGS! * SWPB 3 * EDIT READY * MOVB 3,@STRING * LAENGE EINTRAGEN * MOVB 1,2 * ESC-CHAR RETTEN UND AUFBEREITEN UM IN LEAVE * SRL 2,8 * ZURUECK GEBEN * MOV 2,@LEAVE * CB 3,@>0003(13) * LETZTE POSITION ? * JEQ EDIT7 * EDIT8 BL @SWITCH * SCHREIBT BLANK, WENN R3 <> LAST IST! * RTWP * EDIT7 SWPB 3 * R3 KORRIGIEREN * MOVB @STRING(3),1 * LETZTE ZEICHEN HOLEN * SWPB 1 * SWAP UND SCHREIBEN * JMP EDIT8 * SWITCH CLR 2 * SWPB 1 * ZEICHEN DREHEN * BLWP @VSBW * UND SCHREIBEN * RT * ******************************************************************************** END START
© Dr. Henry Koplien