* http://famkoplien.de/henry/TI99/ DEF START REF VSBR,VSBW,VMBW,KSCAN,DSRLNK ERRTXT TEXT 'Error opening file ' TEXT 'Error reading a record ' TEXT 'No GIF-Header found ' TEXT 'Pixel Aspect not supported ' TEXT 'Unknown separator found ' TEXT 'Application Extension Error ' TEXT 'Plain Text Extension Error ' TEXT 'Comment Extension Error ' TEXT 'Graphic Control Extension Error ' TEXT 'LZW-Code length Error ' 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 'Screen Dimension x' IMGTXT TEXT 'Image Dimension x' COLTXT TEXT 'Number of colors ' BAKTXT TEXT 'Background color' GRYTXT TEXT 'Define 256 Gray Shades ' FARTXT TEXT 'Define colors from GIF File ' LEFTXT TEXT 'Left-Offset' ' TOPTXT TEXT 'Top-Offset' INTTXT TEXT 'Picture is Interlaced ' NINTXT TEXT 'Picture is Non-Interlaced ' LOCMAP TEXT 'Local Color-Map found ' LZWTXT TEXT 'LZW Codelength' 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 * * IS ERROR CODE AT STATUS EQU, R1 IS POINTER TO 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 from the left TOPOFF BSS >2 * IMAGE OFFSET from top WIDTH BSS >2 * image width HEIGHT BSS >2 * image height GMAP BSS >2 * FLAG for GLOBAL COLOR MAP LMAP BSS >2 * FLAG for LOCAL COLOR MAP COLOR BSS >2 * NUMBER OF COLOURS BCKCOL BSS >2 * COLOR CODE FOR BACKGROUND INTERL BSS >2 * INTERLACE-FLAG LZWSIZ BSS >2 * LZW Start Value GCOLOR BSS >2 * GLOBAL-COLOR GRED BSS >100 * GLOBAL COLOR Intensities GGREEN BSS >100 GBLUE BSS >100 RED BSS >100 * COLOR-Intensities 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 * A RECORD GIFWS BSS >20 GIFRPG BLWP @MEMPRO * PROLOG LI 0,>8E07 * PAB IN THE LAST BLOCK MOVB @GIFWS+1,@>8C02 MOVB 0,@>8C02 LI 0,PAB LI 1,PDATA LI 2,>A LI 3,1 * ERROR ID 1, OPEN ERROR BLWP @VMBW AI 0,9 MOV 0,@>8356 MOV *13,1 * POINTER ON 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 ID 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 ! FIRST RECORD SUCCESSFULLY READ LI 5,GIFID1 ! LI 2,6 ! LI 3,3 ! ERROR ID 3, NO GIF FILE CHK1LP CB *4+,*5+ ! WE ONLY ACCEPT GIF87a JNE CHECK2 ! DEC 2 ! JNE CHK1LP ! JMP LOGSCR ! CHECK2 LI 4,LINE ! POINTER BACK TO START LI 5,GIFID2 ! SECOND IDENTIFIER LI 2,6 ! CHK2LP CB *4+,*5+ ! AND 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: NO, 1: YES SLA 1,0 ! CR => NUMBER OF BITS/PIXELS (CR+1) MOST COL. MOV 1,@GCOLOR ! S => COLOR TABLES ORDER 0: NO 1: ORDERED DEC 1 ! P => GLOBAL COLOR MAP SIZE = 2^(P+1) INV 1 ! MOV 1,@GIDXMS ! GLOBAL INDEX-MASKE TO DELETE 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 *-----------+-----------------+ (WE ONLY TAKE ZERO) * ! * +----------------------------------+ * V ! *-----------------------------+ ! * GLOBAL COLOR MAP ! OPTIONAL ! *-----------------------------+ ! MOVB 0,0 ! ! JLT MAPOK ! GLOBAL COLOR-MAP? CLR @GMAP ! ! CLR 8 ! NO COLOURS, SHADES OF GRAY CLR @GRED ! ! CLR @GGREEN ! ! CLR @GBLUE ! ! SETO 5 ! THE SPEC SAYS FIRST COLOR SHOULD MOVB 5,@GRED+1 ! BE BLACK AND SECOND WHITE 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 ESTABLISH 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 ! SET BACKGROUND COLOR *-----------+-----------------+ ! * ! ! * !<---------------------------------+ * V *-----------------------------+ STREAM BL @NEXTCH ! ENTRY INTO THE EXTENSION BLOCK ANY OFTEN, LI 3,5 ! WHICH I DID NOT SUPPORT! CB 5,@EXTENS ! I EXPECT THE IMAGE DESCRIPTOR >2C SOON JNE NOEXT ! SINCE THE EXTENSION BLOCK NO IMAGE INFORMATION BL @NEXTCH ! INCLUDES. I HAVE NOT FOUND ANY GIF YET CB 5,@APPBYT ! THAT >21 HAS (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 ! CLOSE FILE 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 AND 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 ! AFTER THIS BLOCK IMAGE OR PLAIN TEXT ONLY! *-----------------------------+ ! * ! *-----------------------------+ <--------------+ * 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) * COPY THE GLOBAL DATA TO THE LOCAL 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 ! YES! ! SRL 0,8 ! ! ANDI 0,7 ! ! INC 0 ! ! LI 1,1 ! ! SLA 1,0 ! ! MOV 1,@COLOR ! #REDEFINING COLOR DEC 1 ! ! INV 1 ! ! MOV 1,@IDXMSK ! NEW INDEX MASK CLR 6 ! ! MOV @COLOR,7 ! ! LOCCOL BL @NEXTCH ! DETERMINE LOCAL COLOR'S, OLD COLOR CODES MOVB 5,@RED(6) ! OVERWRITE ! 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 ! FIRST READING OF DECOMPRESSIONS DATA 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 ! *-----------------------------+ ******************************* * * * DECOMPRESS! * * * ******************************* 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 UP ON THE STACK JL STKOK CI 10,LIFO+>800 * PROBLEM!!! WE TERMINATE 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, ALL PIXEL SET BLWP @PIXEL DECT 10 CI 10,LIFO JHE UNSTK LI 10,LIFO C @FREE,@MAXCDE JEQ LZWLOP MOV @FREE,1 * EXTEND BIT CODE IF POSSIBLE SLA 1,1 MOV @OLDCDE,@PREFIX(1) MOV @INDEX,@SUFFIX(1) MOV 0,@OLDCDE INC @FREE C @FREE,@MAXCDE * NO, SHOULD NOT BE JNE LZWLOP MOV @CDESIZ,1 CI 1,12 * MAXIMUM IS ALREADY REACHED JEQ LZWLOP INC @CDESIZ A @MAXCDE,@MAXCDE BLWP @SETMSK JMP LZWLOP DONE B @STREAM * WE'RE DONE! ******************************* * * * READING A CHAR * * FROM A "STREAM" * * * ******************************* NEXTCH MOVB *4+,5 * READS THE NEXT 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 OUT SBO 5 * ALL BYTES LI 12,MEMEXP SBO 0 * RAM UP >0000 - >1FFF FOR PREFIX SBO 2 * RAM UP >6000 - >7FFF FOR SUFFIX RTWP ******************************* * * * EPILOG * * * ******************************* MEMEPI DATA MEMWS,MEMEPG MEMEPG LI 12,MEMEXP * ALL 16-BIT MEMORIES OFF SBZ 0 SBZ 1 SBZ 2 LI 12,GRMCRU * GRAM CARDS BACK TO "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 IS CODE-SIZE MOV @CDESIZ,0 JEQ SETMND SLA 8,0 DEC 8 * R8 IS BIT-MASK! 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 * READ THREE BYTES (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 * BUILDING A 32-BIT SHIFT 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 * ADD CODE SIZE TO BIT OFFSET MOV 9,0 SRL 0,3 ANDI 9,7 * BIT OFFSET OK AGAIN A 0,11 * DETERMINE BYTE OFFSET JNC READNC INC 10 READNC RTWP ******************************* * * * INIT BITMAP-MODUS * * * ******************************* BITMAP DATA PIXWS,BITXPG BITDAT DATA >000E,>0162,>021F,>05F7 * SCREEN on >0000 BIS >D400 DATA >061E,>0700,>080A,>0902 * MULTI-COLOR, NOT 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 * FIXED VALUES! LI 12,>8C06 MOV @BCKCOL,3 * MAKE BACKGROUND COLOR MOVB @GREEN(3),2 * PREPARE EVERYTHING AS IF IT WAS 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 * WRITE COLOR CODE 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 * MORE THAN COLMAX COLORS? -> RGB MODE JLE BITLOW BITHIC C @HEIGHT,@YMIN * SWITCH TO 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 SET 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, RUNS AUTOMATICALLY CLR *11 * UEBER 16K-GRENZE HINAUS MOVB 0,*11 MOVB @BITDAT+11,1 LI 2,>1D40 * DELETE >1D400 BYTES 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 FOR AUTOMATIC WRITE *-----------------------------+ 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 FOR AUTOMATIC WRITE *-----------------------------+ 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 FOR AUTOMATIC WRITE *-----------------------------+ 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 IS SCREEN POSITION READING FROM * * R1 IST MAXIMALE LAENGE * * STRING IS RETURN VALUE WITH FIRST BYTE=LENGTH, LEAVE IS THE RETURN CHAR * ******************************************************************************** EDIT DATA EDITWS,EDITPG * CURSOR BYTE >5F * SIGNS THAT ARE ACCEPTED: * 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 * FINISHED STRING * EDITWS BSS >20 * EDITPG MOV @>0000(13),0 * START-POSITION * CLR 2 * SWITCH-COUNTER * CLR 3 * CHAR-COUNTER * CLR @>8374 * KEYBOARD MODE 0 * EDIT1 MOVB @CURSOR,1 * THE CURSOR FIRST * SWPB 1 * BLWP @VSBR * BL @SWITCH * EDIT2 INC 2 * CI 2,>200 * SWITCH LIMIT REACHED ? * JNE EDIT3 * BL @SWITCH * EDIT3 BLWP @KSCAN * MOVB @>837C,4 * COC @STEQU,4 * KEYBOARD STATUS = 0? * JNE EDIT2 * MOVB @BLANK,1 * SWPB 1 * MOVB @>8375,1 * GET SIGN * CB 1,@LOW * SMALLER THAN LOWER BOUND? * JL EDIT4 * CB 1,@HIGH * HIGHER THAN UPPER BOUND? * JH EDIT4 * C 3,@>0002(13) * MAXIMUM REACHED? * JEQ EDMAX * INC 3 * INCREASE CHARACTER -> FIRST BYTE ALWAYS FREE! * EDMAX MOVB 1,@STRING(3) * CHARACTER AFTER STRING * BLWP @VSBW * CLR 2 * C 3,@>0002(13) * JEQ EDIT1 * INC 0 * JMP EDIT1 * EDIT4 CB 1,@BS * BACKSPACE * JNE EDIT5 * BL @SWITCH * WRITE BLANK * MOV 3,3 * NOT LESS! * JEQ EDIT1 * C 3,@>0002(13) * DO NOT CHANGE R0 AT THE END * JEQ EDITBS * DEC 0 * SWPB 1 * AKTUELLES ZEICHEN AUCH BLANKEN * BL @SWITCH * EDITBS DEC 3 * CORRECT POINTER FOR STRING * JMP EDIT1 * EDIT5 CB 1,@CR * CR * JEQ EDIT6 * BL @SWITCH * WRITE BLANK (FOR EACH UNWANTED CHARACTER) * JMP EDIT1 * EDIT6 MOV 3,3 * JEQ EDIT1 * NO EMPTY STRINGS! * SWPB 3 * EDIT READY * MOVB 3,@STRING * ENTER LENGTH * MOVB 1,2 * ESC-CHAR RESCUE AND RECYCLE ORDER INTO LEAVE * SRL 2,8 * HAND BACK * MOV 2,@LEAVE * CB 3,@>0003(13) * LAST POSITION ? * JEQ EDIT7 * EDIT8 BL @SWITCH * Write BLANK, WENN R3 <> IS LAST * RTWP * EDIT7 SWPB 3 * R3 CORRECT * MOVB @STRING(3),1 * GET LAST CHARACTERS * SWPB 1 * SWAP AND WRITE * JMP EDIT8 * SWITCH CLR 2 * SWPB 1 * ROTATE CHARACTERS * BLWP @VSBW * AND WRITE * RT * ******************************************************************************** END START