The GIF Interpreter


A program which is able to convert gif images. Additional RAM required in form of GRAM cards on CRU >1700 and an additional 80 column card.


       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
    

eMail:Koplien@TU-Harburg.d400.DE

© Dr. Henry Koplien