100 SYS 700 ;ACTIVATE PAL 64 ASSEMBLER 110 ; PICTURE COMPRESSOR 120 ; OPTIMIZES HI-RES PIC 130 ; AND SAVES ON DISK 140 ; THIS VERSION SAVES FROM MEMORY 150 ; AT $2000: 160 ; SYS(*),"D:FILENAME" 170 ; OR LOADS TO LOAD ADDR: 180 ; SYS(*+3),"FILENAME" 190 ; 200 ; SAVE"@0:COMP2.PAL",8 210 ; 220 .OPT OO 230 *=$C000 240 ; 250 JMP COMPRESS 260 JMP DECOMP 270 ; 280 PICTURE .WORD $2000 ;BITMAP LOC'N 290 REPCOUNT .BYTE 1 ;COUNTS REPETITION 300 NEWBYT .BYTE 0 ;CURRENT MEM BYTE 310 PREVBYT .BYTE 0 ;PREVIOUS BYTE 320 SENDFLAG .BYTE 0 ;COMP/DECOMP FLAG 330 BANKSAV .BYTE 0 ;ORIG LOC 1 VALUE 340 ENDPIC .WORD 0 ;END OF BITMAP 350 ; 360 PICLEN =8000 ;BITMAP BYTE LENGTH 370 PICPTR =$FB 380 ;KERNEL ROUTINES: 390 SETLFS =$FFBA 400 SETNAM =$FFBD 410 OPEN =$FFC0 420 CHROUT =$FFD2 430 GETIN =$FFE4 440 CLOSE =$FFC3 450 CHKOUT =$FFC9 460 CHKIN =$FFC6 470 CLRCHN =$FFCC 480 READST =$FFB7 490 ; 500 COMPRESS =* 510 LDA #1 520 STA SENDFLAG 530 LDY #1 ;SECONDARY ADDRESS 540 BNE CP1 550 ; 560 DECOMP =* 570 LDA #0 580 STA SENDFLAG 590 LDY #2 ;SECONDARY ADDRESS 600 CP1 =* 610 ; 620 LDA 1 ;BANK SELECT REG 630 STA BANKSAV ;STORE FOR LATER 640 LDA #8 ;FILE #8 650 TAX ;DEVICE #8 660 JSR SETLFS ;OPEN 8,8,1 OR 2 670 JSR $AEFD ;CHECK FOR COMMA 680 JSR $AD9E ;EVALUATE EXPRESSION 690 JSR $AD8F ;CHECK FOR STRING 700 LDY #0 710 LDA ($64),Y ;STRING LENGTH 720 PHA: INY 730 LDA ($64),Y ;STRING ADDR LOW 740 TAX: INY 750 LDA ($64),Y ;STRING ADDR HI 760 TAY: PLA 770 JSR SETNAM ;FILENAME=ABOVE STRING 780 JSR OPEN ;OPEN FILE 790 LDX #8 ;FILE #8 FOR CHKIN/OUT 800 ; 810 LDY #0 820 LDA SENDFLAG ;COMPRESS OR LOAD 830 BEQ NOSND ;NOSND=LOAD 840 JSR CHKOUT ;OUTPUT TO FILE 850 LDA PICTURE 860 JSR CHROUT ;START ADDR LO 870 LDA PICTURE+1 880 JSR CHROUT ;START ADDR HI 890 JSR SENDPIC ;SEND PICTURE TO FILE 900 JMP SS1 ;CLOSE FILES AND EXIT 910 NOSND =* 920 JSR CHKIN ;GET LOAD ADDR FIRST 930 JSR GETIN 940 STA PICPTR ;LOAD ADDR LO 950 JSR GETIN 960 STA PICPTR+1 ;LOAD ADDR HI 970 JSR GETPIC ;GET PICTURE 980 SS1 =* 990 ; 1000 JSR CLRCHN ;CLEAR I/O CHANNELS 1010 LDA #8 1020 JSR CLOSE ;CLOSE FILE #8 1030 RTS ;ALL FINISHED! 1040 ; 1050 ; 1060 SENDPIC =* ;COMPRESS PICTURE 1070 LDA PICTURE ;START ADDR LO 1080 STA PICPTR 1090 CLC 1100 ADC #PICLEN 1150 STA ENDPIC+1 ;LAST BYTE HI 1160 ; 1170 JSR GETBYT ;READ BYTE FROM MEM 1180 STA PREVBYT ;INITIALIZE PREV BYTE 1190 LDY #1 ;GET 2ND BYTE NEXT 1200 ; 1210 NEXTOUT =* 1220 JSR OUTBYTE ;FETCH BYTE OR GROUP 1230 ; 1240 LDA PICPTR+1 ;SEE IF AT PIC END 1250 CMP ENDPIC+1 1260 BNE SP1 1270 LDA PICPTR 1280 CMP ENDPIC 1290 BCC NEXTOUT ;DO NEXT BYTE 1300 RTS 1310 SP1 =* 1320 BCC NEXTOUT ;DO NEXT BYTE 1330 JSR WRITEREP ;WRITE LAST GROUP 1340 RTS ;ALL BYTES DONE 1350 ; 1360 ; 1370 OUTBYTE =* ;CHECK NEXT BYTE 1380 JSR GETBYT ;READ BYTE FROM MEM 1390 STA NEWBYT 1400 CMP PREVBYT ;COMPARE TO PREVIOUS 1410 BNE DIFF ;DIFFERENT"? 1420 ; 1430 INC REPCOUNT ;SAME, INC COUNT 1440 BNE OK ;[177]255 REPETITI[145]S"? 1450 DEC REPCOUNT ;SET TO 255 1460 JSR WRITEREP ;WRITE REPEAT CODE 1470 LDA #1 ;RESTART COUNT 1480 STA REPCOUNT 1490 OK =* 1500 JMP OBFIN ;FINISHED OUTBYTE 1510 ; 1520 DIFF =* ;NEW BYTE DIFFERENT 1530 LDA REPCOUNT ;CHECK COUNT 1540 CMP #4 ;3 OR MORE THE SAME"? 1550 BCS DOCODE ;YES, S[128] REP CODE 1560 ;NO, JUST [153] BYTE N TIMES 1570 TAX ;# REPS [129] LOOP 1580 LDA PREVBYT ;BYTE [164] REPEAT 1590 CMP #254 ;CTRL BYTE"? 1600 BEQ DOCODE ;YES, MUST CODE IT 1610 ; 1620 NLP =* ;REPEAT LOOP 1630 LDA PREVBYT 1640 JSR CHROUT ;SEND BYTE 1650 DEX ;DO .X TIMES 1660 BNE NLP 1670 LDA #1 ;RESTART COUNT 1680 STA REPCOUNT 1690 JMP OBFIN ;FINISHED SUBRTN 1700 ; 1710 DOCODE =* ;WRITE REPEAT CODE 1720 JSR WRITEREP 1730 LDA #1 ;RESTART COUNT 1740 STA REPCOUNT 1750 ; 1760 OBFIN =* 1770 LDA NEWBYT 1780 STA PREVBYT ;PREV=NEW 1790 INC PICPTR ;NEXT ADDRESS 1800 BNE OB1 1810 INC PICPTR+1 1820 OB1 =* 1830 RTS 1840 ; 1850 ; 1860 WRITEREP =* ;WRITE REPEAT CODE 1870 LDA #254 ;SPECIAL CONTROL BYTE 1880 JSR CHROUT 1890 LDA PREVBYT ;BYTE TO REPEAT 1900 JSR CHROUT 1910 LDA REPCOUNT ;NUMBER OF REPS 1920 JSR CHROUT 1930 RTS 1940 ; 1950 ; 1960 GETBYT =* 1970 SEI ;DISABLE INTERRUPTS 1980 LDA 1 ;CPU BANK REGISTER 1990 AND #$FC ;SELECT RAM 2000 STA 1 2010 LDA (PICPTR),Y ;READ BYTE 2020 PHA 2030 LDA BANKSAV ;GET ORIGINAL STATE 2040 STA 1 ;AND RESTORE 2050 CLI 2060 PLA 2070 RTS 2080 ; 2090 ; 2100 GETPIC =* ;UNCOMPRESS 2110 JSR GETIN 2120 CMP #254 ;REP INDICATOR 2130 BEQ GETREP 2140 ;NORMAL BYTE, JUST STORE IT 2150 STA (PICPTR),Y 2160 INC PICPTR ;NEXT ADDRESS 2170 BNE GR0 2180 INC PICPTR+1 2190 GR0 =* 2200 JMP GPFIN 2210 ; 2220 GETREP =* 2230 JSR GETIN ;BYTE TO REPEAT 2240 PHA 2250 JSR GETIN ;# OF REPETITIONS 2260 TAX 2270 PLA 2280 REPLP =* ;REPEAT BYTE N TIMES 2290 STA (PICPTR),Y 2300 INC PICPTR ;NEXT ADDRESS 2310 BNE GR1 2320 INC PICPTR+1 2330 GR1 =* 2340 DEX 2350 BNE REPLP 2360 ; 2370 GPFIN =* 2380 JSR READST ;READ DISK STATUS 2390 BEQ GETPIC ;DO UNTIL END-OF-FILE 2400 RTS 2410 .END