10 ;********************************** 15 ;* DATA COMPRESSION * 20 ;*--------------------------------* 25 ;* N.HIGGINS 1989 * 30 ;*--------------------------------* 35 ;* METHOD: RUN LENGTH ENCODING * 40 ;* USING : MARKER(COUNT,CHAR) * 45 ;********************************** 50 ;* FIRST CALL THE ROUTINES AT:- * 55 ;* * 60 ;* COMPRESS - SYS $C000 * 65 ;* DECOMPER - SYS $C0B8 * 70 ;* * 75 ;* NOW ENTER THE MONITOR AND USE * 80 ;* THE COMMAND (MC110 C170) TO * 85 ;* SEE THE RESULTS. * 90 ;********************************** 95 ; 100 ; 105 ; 110 ; 115 ;-------------------------------- 120 ;POINTER TO THE END OF THE DATA 125 ;TO BE COMPRESSED. 130 ;-------------------------------- 135 ; 140 TEXTEND=TEXT+16 145 ; 150 MARKER=$EF 155 DATPNT=$FB 160 STOPNT=$FD 165 ; 170 ; 175 *=49152 180 ; 185 ; 190 ;-------------------------------- 195 ;SET POINTER TO DATA TO BE 200 ;COMPRESSED (TEXT) 205 ;SET POINTER TO STORE THE 210 ;COMPRESSED DATA (STORAGE) 215 ;-------------------------------- 220 ; 225 COMPRESS LDA #TEXT 240 STA DATPNT+1 245 LDA #STORAGE 260 STA STOPNT+1 265 ; 270 ; 275 ;--------------------------------- 280 ;SET (ENDFLAG) TO ZERO 285 ;SET (COUNT) TO 1 290 ;GET BYTE/IS CARRY SET? 295 ;YES:GOTO [E] 300 ;STORE BYTE 305 ;[A] GET NEXT BYTE/IS CARRY SET? 310 ;YES:GOTO [E] 315 ;IS BYTE SAME AS PREVIOUS? 320 ;NO :GOTO [C] 325 ;YES:INCREMENT (COUNT) 330 ;IS (COUNT) =0 335 ;YES:OUTPUT MARKER($FF,CHAR) 340 ;SET (COUNT)=1/GOTO [A] 345 ;NO :GOTO [A] 350 ;--------------------------------- 355 ; 360 LDY #0 365 STY ENDFLAG 370 LDA #1 375 STA COUNT 380 JSR GETBYTE 385 BCS FINISH 390 STA CHARACTER 395 ; 400 AGAIN JSR GETBYTE 405 BCS LOOP 410 CMP CHARACTER 415 BNE LOOP2 420 CONTINUE INC COUNT 425 BNE AGAIN 430 LDA #MARKER 435 JSR PUTBYTE 440 LDA #$FF 445 JSR PUTBYTE 450 LDA CHARACTER 455 JSR PUTBYTE 460 JMP CONTINUE 465 ; 470 ; 475 ;-------------------------------- 480 ;[C] STORE BYTE 485 ;GET PREVIOUS BYTE/IS IT A MARKER? 490 ;YES:GOTO [F] 495 ;NO :IS (COUNT) <4 500 ;YES:GOTO [G] 505 ;NO :GOTO [F] 510 ;-------------------------------- 515 ; 520 LOOP2 STA STORE 525 LOOP LDA CHARACTER 530 CMP #MARKER 535 BEQ LOOP9 540 LDA COUNT 545 CMP #4 550 BCC LOOP5 555 ; 560 ; 565 ;-------------------------------- 570 ;[F] OUTPUT MARKER(COUNT,CHAR) 575 ;-------------------------------- 580 ; 585 LOOP9 LDA #MARKER 590 JSR PUTBYTE 595 LDA COUNT 600 JSR PUTBYTE 605 LDA CHARACTER 610 JSR PUTBYTE 615 ; 620 ; 625 ;-------------------------------- 630 ;[D] CHECK FLAG/IS IT SET? 635 ;YES:GOTO [E] 640 ;NO :GET STORED BYTE 645 ;SET (COUNT) TO 1/GOTO [A] 650 ;-------------------------------- 655 ; 660 LOOP6 LDA ENDFLAG 665 BMI FINISH 670 LDA STORE 675 STA CHARACTER 680 LDA #1 685 STA COUNT 690 JMP AGAIN 695 ; 700 ; 705 ;-------------------------------- 710 ;[G] OUTPUT CHAR 715 ;DECREMENT (COUNT) 720 ;IS (COUNT)=0 725 ;YES:GOTO [D] 730 ;NO :GOTO [G] 735 ;-------------------------------- 740 ; 745 LOOP5 LDA CHARACTER 750 JSR PUTBYTE 755 DEC COUNT 760 BEQ LOOP6 765 JMP LOOP5 770 ; 775 ; 780 ;-------------------------------- 785 ;[E] WHEN FINISHED WE STORE THE 790 ;END ADDRESS+1 OF THE COMPACTED 795 ;DATA FOR THE DECOMPRESS ROUTINE. 800 ;-------------------------------- 805 ; 810 FINISH LDA STOPNT 815 STA COMPEND 820 LDA STOPNT+1 825 STA COMPEND+1 830 RTS 835 ; 840 ; 845 ;-------------------------------- 850 ;CHECK IF REACHED THE END OF DATA 855 ;NO :GET NEXT BYTE/CLR CARRY/RETURN 860 ;YES:SET (ENDFLAG)/SET CARRY/RETURN 865 ;-------------------------------- 870 ; 875 GETBYTE LDA DATPNT 880 CMP #TEXTEND 900 BNE LOOP12 905 LDA #$FF 910 STA ENDFLAG 915 SEC 920 RTS 925 ; 930 LOOP12 LDA (DATPNT),Y 935 INC DATPNT 940 BNE LOOP14 945 INC DATPNT+1 950 LOOP14 CLC 955 RTS 960 ; 965 ; 970 ;--------------------------------- 975 ;OUTPUT BYTE 980 ;--------------------------------- 985 ; 990 PUTBYTE STA (STOPNT),Y 995 INC STOPNT 1000 BNE LOOP15 1005 INC STOPNT+1 1010 LOOP15 RTS 1015 ; 1020 ; 1025 ; 1030 ;********************************* 1035 ;* DECOMPRESS ROUTINE * 1040 ;********************************* 1045 ;* THIS MUST BE CALLED AFTER THE * 1050 ;* COMPRESSION ROUTINE,IT WILL * 1055 ;* RESTORE THE COMPRESSED DATA * 1060 ;* AT 'STORAGE' BACK TO ITS * 1065 ;* ORIGINAL VALUES AND PLACE IT * 1070 ;* AT 'NEWTEXT'. * 1075 ;********************************* 1080 ;* YOU CAN THEN COMPARE BOTH * 1085 ;* 'TEXT' & 'NEWTEXT' TO SEE * 1090 ;* THAT THEY MATCH. * 1095 ;********************************* 1100 ; 1105 ; 1110 ;------------------------------- 1115 ;SET POINTERS TO START OF 1120 ;COMPRESSED DATA (STORAGE) & 1125 ;DECOMPRESSED DATA (NEWTEXT) 1130 ;------------------------------- 1135 ; 1140 DECOMPER LDA #STORAGE 1155 STA DATPNT+1 1160 LDA #NEWTEXT 1175 STA STOPNT+1 1180 ; 1185 ;------------------------------- 1190 ;GET COMPRESSED DATA 1195 ;IS IT A MARKER? 1200 ;NO:OUTPUT IT/INCREMENT (NEWTEXT) 1205 ;INCREMENT POINTER (STORAGE) 1210 ;IS IT END OF COMP.DATA? 1215 ;NO:GO BACK GET NEXT BYTE 1220 ;YES:EXIT 1225 ;------------------------------- 1230 ; 1235 LDY #0 1240 RELOOP LDA (DATPNT),Y 1245 CMP #MARKER 1250 BEQ LOOP40 1255 STA (STOPNT),Y 1260 JSR PNT1 1265 LOOP50 JSR PNT2 1270 LDA DATPNT 1275 CMP COMPEND 1280 BNE RELOOP 1285 LDA DATPNT+1 1290 CMP COMPEND+1 1295 BNE RELOOP 1300 RTS 1305 ; 1310 ;------------------------------- 1315 ;IF A MARKER IS FOUND THEN 1320 ;PUT (COUNT) IN X 1325 ;PUT (CHAR) IN A 1330 ;OUTPUT (CHAR) UNTIL X=0 1335 ;------------------------------- 1340 ; 1345 LOOP40 JSR PNT2 1350 LDA (DATPNT),Y 1355 TAX 1360 JSR PNT2 1365 LDA (DATPNT),Y 1370 LOOP42 STA (STOPNT),Y 1375 JSR PNT1 1380 DEX 1385 BNE LOOP42 1390 BEQ LOOP50 1395 ; 1400 ; 1405 ;----------------------------- 1410 ;INCREMENT POINTERS 1415 ;----------------------------- 1420 ; 1425 PNT1 INC STOPNT 1430 BNE LOOP43 1435 INC STOPNT+1 1440 LOOP43 RTS 1445 ; 1450 PNT2 INC DATPNT 1455 BNE LOOP44 1460 INC DATPNT+1 1465 LOOP44 RTS 1470 ; 1475 ; 1480 ; 1485 ; 1490 ; 1495 COMPEND BYT 0,0 1500 STORE BYT 0 1505 COUNT BYT 0 1510 CHARACTER BYT 0 1515 ENDFLAG BYT 0 1520 ; 1525 ;-------------------------------- 1530 ;THESE ARE THE BYTES TO BE 1535 ;COMPRESSED...YOU CAN USE YOUR 1540 ;OWN INSTEAD BUT IF YOU EXTEND 1545 ;ITS SIZE THEN MAKE SURE YOU 1550 ;ALTER THE OTHER STORAGE AREA'S 1555 ;AND POINTERS ACCORDINGLY... 1560 ;-------------------------------- 1565 ; 1570 TEXT ; 1575 ; 1580 BYT $01,$01,$01,$01 1585 BYT $01,$01,$01,$01 1590 BYT $01,$01,$01,$01 1595 BYT $01,$01,$EF,$01 1600 ; 1605 ;-------------------------------- 1610 ;THE BYTES ABOVE ARE COMPRESSED 1615 ;AND STORED HERE.............. 1620 ;(3 BYTES/FOR EVERY 1 IN TEXT) 1625 ;-------------------------------- 1630 STORAGE ; 1635 ; 1640 BYT 0,0,0,0,0,0,0,0 1645 BYT 0,0,0,0,0,0,0,0 1650 BYT 0,0,0,0,0,0,0,0 1655 BYT 0,0,0,0,0,0,0,0 1660 BYT 0,0,0,0,0,0,0,0 1665 BYT 0,0,0,0,0,0,0,0 1670 ; 1675 ;-------------------------------- 1680 ;THE COMPRESSED DATA IN 'STORAGE' 1685 ;IS DECOMPRESSED & PLACED HERE... 1690 ;-------------------------------- 1695 ; 1700 NEWTEXT ; 1705 ; 1710 BYT 0,0,0,0,0,0,0,0 1715 BYT 0,0,0,0,0,0,0,0 1720 BYT 0,0,0,0,0,0,0,0 1725 BYT 0,0,0,0,0,0,0,0 1730 BYT 0,0,0,0,0,0,0,0 1735 BYT 0,0,0,0,0,0,0,0 1740 ; 1745 ;