; TTXT.S ; ; TELETEXT SCREEN ; VERSION 0.01 20/03/1986, 2:26pm ; VERSION 0.02 20/03/1986, 3:26pm ; VERSION 0.03 22/03/1986, 3:26pm ; HOLD WORKING, RELEASE OUTPUTS LASTCH BEFORE RELEASING ; VERSION 0.04 28/03/1986, 7:18pm ; DOUBLE HEIGHT WORKING, TOP AND BOTTOM ; CONCEAL WORKING, NO FLASH IF CONCEALED ; VERSION 0.05 29/03/1986, 4:43pm ; PENDING JOIN/SEP WORKING, OPTIMISED GRAPHIC CHARS EQU 23606 ; BASE OF FONT MEMBOT EQU 23698 ; 30 BYTES OF WORKSPACE TTXTFLAGS EQU MEMBOT+0 flags EQU 0 double EQU 7 ; B7=DOUBLE HEIGHT top EQU 6 ; B6=TOP DOUBLE LINE bot EQU 5 ; B5=BOTTOM DOUBLE LINE graph EQU 4 ; B4=ALPHA/GRAPHICS sep EQU 3 ; B3=JOINED/SEPARATED pend EQU 2 ; B2=PENDING JOIN/SEP held EQU 1 ; B1=HELD CHARACTERS hide EQU 0 ; B0=CONCEALED attr EQU 1 last EQU 2 colm EQU 3 ; SCREEN COLUMN 0-31 skip EQU 4 ; COUNTDOWN FOR LEFT MARGIN line EQU 5 ; COUNTDOWN FOR TOP MARGIN ATTRS EQU MEMBOT+6 ; ADDRESS OF ATTRS BITMP1 EQU MEMBOT+8 ; SINGLE HEIGHT GRAPHICS BITMP2 EQU MEMBOT+16 ; DOUBLE HEIGHT BITMAP ORG #F900 ; 63744 DECIMAL ENT EQU $ ; ENTRY POINT ENTRY JP DISPSCRN ; REDRAW WHOLE SCREEN JP DISPHL ; REDRAW ONE LINE MARGL DEFB 4 ; LEFT MARGIN MARGT DEFB 0 ; TOP MARGIN START DEFW TESTDATA ; TELETEXT BUFFER AT #FC00 ; COPY TELETEXT CHARACTERS TO SCREEN DISPSCRN LD HL,(START) ; HL=>SOURCE TELETEXT SCREEN LD DE,#5800 ; DE=>START OF ATTRIBUTES LD C,24 ; C=NUMBER OF LINES TO DO LD A,(MARGT) ; A=TOP MARGIN DISPHL LD IX,TTXTFLAGS LD (IX+line),A ; SET TOP MARGIN LD (ATTRS),DE ; SET START OF DISPLAY XOR A OUT (254),A ; BLACK BORDER LD (IX+flags),A ; CLEAR FLAGS ; LINELP LD B,40 ; B=NUMBER OF CHARACTERS PER LINE LD A,(IX+flags) RRCA AND #20 ; IF LAST LINE WAS TOP, NOW BOTTOM LD (IX+flags),A ; CLEAR FLAGS FOR START OF LINE LD (IX+attr),7 ; INITIAL COLOUR=WHITE ON BLACK LD (IX+last),32 ; LAST=SPACE LD (IX+colm),0 ; SCREEN COLUMN 0 LD A,(MARGL) LD (IX+skip),A ; LEFT MARGIN ; CHARLP LD A,(HL) ; GET CHARACTER PUSH HL PUSH BC CALL CHAROUT ; OUTPUT IT POP BC POP HL INC HL DJNZ CHARLP ; DO WHOLE LINE DEC C ; DECREMENT LINE JR NZ,LINELP ; DO ALL LINES RET ; HOLDOUT LD A,32 ; DEFAULT TO SPACE BIT graph,(IX+flags) JR Z,CHAROUT ; USE SPACE IF ALPHA BIT held,(IX+flags) JR Z,CHAROUT ; USE SPACE IF NOT HELD LD A,(IX+last) ; GET LAST CHARACTER CHAROUT AND 127 CP 32 JR C,CONTROLS ; CONTROL CHARACTERS LD (IX+last),A ; REMEMBER THIS CHAR CHAR2 DEC (IX+skip) RET P ; SKIP LEFT MARGIN BIT 5,(IX+colm) RET NZ ; END OF SCREEN LINE PUSH AF ; SAVE FOR SPACE TEST INC (IX+colm) ; INCREMENT COLUMN CALL MATRIX LD DE,(ATTRS) PUSH DE ; SAVE ADDRESS FOR LATER LD A,D ; CONVERT TO DISPLAY ADDRESS SLA A SLA A SLA A AND #58 LD D,A LD B,8 MATRXLP LD A,(HL) ; COPY BITMAP TO SCREEN LD (DE),A INC HL INC D DJNZ MATRXLP POP HL POP AF ; GET CHARACTER BACK CP 32 ; IS IT SPACE LD A,(IX+attr) JR Z,NOFLASH ; DROP FLASH FOR SPACES BIT hide,(IX+flags) JR Z,SETATTR ; DROP FLASH FOR CONCEALED NOFLASH AND 127 SETATTR LD (HL),A ; SET ATTR INC HL LD (ATTRS),HL RET ; CONTROLS BIT 3,A JR NZ,NOT_COLOUR PUSH AF CALL HOLDOUT ; OUTPUT HOLD CHARACTER POP AF LD C,A AND 7 ; CONVERT RGB TO SPECTRUM JR Z,COLOUR0 ; IGNORE COLOUR 0 CP 4 CCF ADC A,A AND 7 LD B,A LD A,(IX+attr) ; GET CURRENT ATTRS AND #F8 ; MASK OUT INK OR B ; MASK IN NEW INK LD (IX+attr),A ; STORE IT LD A,C ; GET CONTROL BACK AND #10 ; KEEP ALPHA/GRAPHICS BIT LD C,A LD A,(IX+flags) AND #EF ; MASK OUT ALPHA/GRAPHICS OR C ; MASK IN NEW ALPHA/GRAPHICS LD (IX+flags),A RES hide,(IX+flags) ; ANY COLOUR REVEALS COLOUR0 RET ; NOT_COLOUR CP #1F JR Z,CTRLREL ; OUTPUT RELEASE WITH OLD SETTINGS CALL CTRLCALL JP HOLDOUT CTRLREL PUSH AF CALL HOLDOUT ; RELEASE, NEEDS TO OUTPUT FIRST POP AF ; CTRLCALL CP 16 ; A=8-15, 24-31 JR NC,CTRL2 ADD A,8 ; A=16-31 CTRL2 AND 15 ; A=0-15 ADD A,A ; INDEX INTO TABLE LD C,A XOR A ; DEFAULT SETTING LD B,A ; HIGH BYTE OFFSET LD HL,CTRLTABLE ADD HL,BC LD C,(HL) INC HL LD B,(HL) PUSH BC RET CTRLTABLE DEFW FLASH,STEADY,BOXSTART,BOXEND ; 88,89,8A,8B DEFW NORMH,DOUBLH,SO,SI ; 8C,8D,8E,8F DEFW CONCEAL,JOINED,SEPAR,ESC ; 98,99,9A,9B DEFW BLACK,NEWBACK,HOLD,RELEASE ; 9C,9D,9E,9F FLASH SET 7,(IX+attr) RET STEADY RES 7,(IX+attr) RET NEWBACK LD A,(IX+attr) AND 7 ; KEEP INK ADD A,A ; MOVE TO PAPER ADD A,A ADD A,A BLACK LD B,A LD A,(IX+attr) AND #C7 ; MASK OUT PAPER OR B ; MASK IN NEW PAPER LD (IX+attr),A RET NORMH RES double,(IX+flags) RET DOUBLH BIT bot,(IX+flags) JR NZ,DOUBL2 ; ALREADY ON BOTTOM DOUBLE LINE SET top,(IX+flags) ; SO WE MUST BE ON TOP DOUBLE LINE DOUBL2 SET double,(IX+flags) RET HOLD SET held,(IX+flags) RET RELEASE CALL PENDING RES held,(IX+flags) RET PENDING BIT held,(IX+flags) RET Z ; NOT HELD RES sep,(IX+flags) ; COPY PEND INTO SEP BIT pend,(IX+flags) RET Z SET sep,(IX+flags) RES pend,(IX+flags) RET JOINED BIT held,(IX+flags) JR NZ,JOIN2 ; HOLD, PENDING CHANGE RES sep,(IX+flags) RET JOIN2 RES pend,(IX+flags) RET SEPAR BIT held,(IX+flags) JR NZ,SEPAR2 ; HOLD, PENDING CHANGE SET sep,(IX+flags) RET SEPAR2 SET pend,(IX+flags) RET CONCEAL ; BIT reveal ; JR NZ,ESC SET hide,(IX+flags) BOXSTART BOXEND ESC SO SI RET MATRIX BIT bot,(IX+flags) JR Z,MATRX2 ; NOT BOTTOM DOUBLE LINE BIT double,(IX+flags) JR Z,MATRX4 ; BLANK ON BOTTOM LINE MATRX2 BIT double,(IX+flags) JR Z,MATRX3 ; SINGLE HEIGHT CALL MATRX3 BIT bot,(IX+flags) JR Z,BOTTOM ; MIDDLE OF BITMAP INC HL INC HL INC HL INC HL BOTTOM LD DE,BITMP2 PUSH DE LD B,4 ; FOUR LINES DOUBLP LD A,(HL) LD (DE),A INC DE LD (DE),A INC DE INC HL DJNZ DOUBLP POP HL ; HL=>BITMAP RET MATRX3 BIT hide,(IX+flags) JR Z,MATRX5 MATRX4 LD A,32 ; CONCEALED CHARACTER MATRX5 BIT graph,(IX+flags); GRAPHICS? JR Z,MATRX6 ; ALPHA BIT 5,A JR NZ,GRAPHICS ; CREATE GRAPHICS MATRIX MATRX6 CALL PENDING ; COPY PENDING SEPAR/JOIN CP #23 JR Z,MATX23 ; SWAP HASH CP #5F JR Z,MATX5F ; SWAP UNDERLINE CP #60 JR NZ,MATRX7 ; SWAP POUND XOR #43 ; SWAP #60 TO #5F MATX5F XOR #3F ; SWAP #5F TO #23 MATX23 XOR #43 ; SWAP #23 to #60 MATRX7 LD L,A AND #5F CP #5B JR C,MATRX8 ; NOT SPECIAL CHARS LD A,L CP #60 ADC A,A ; INDEX INTO BITMAPS SUB #76 AND #0F LD L,A LD BC,TTXTCHARS JR MATRX9 MATRX8 LD BC,(CHARS) MATRX9 LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,BC ; HL=>BITMAP RET GRAPHICS AND #5F CP #40 ; MOVE B6 TO B5 JR C,GRAPH1 OR #20 GRAPH1 LD D,A ; SAVE CHARACTER LD C,#FF ; PREPARE WITH 11111111 BIT sep,(IX+flags) JR Z,GRAPH2 ; NOT SEPERATED LD C,#EE ; PREPARE WITH 11101110 ; aaa aaa ; aaa aaa ; aaa aaa ; bbb bbb ; bbb bbb ; ccc ccc ; ccc ccc ; ccc ccc GRAPH2 LD HL,BITMP1 PUSH HL CALL GRAPH4 BIT sep,(IX+flags) JR Z,GRAPH3 ; NOT SEPERATED DEC HL LD (HL),0 ; SET BLANK LINES DEC HL DEC HL DEC HL LD (HL),0 DEC HL DEC HL LD (HL),0 GRAPH3 POP HL ; HL=>BITMAP RET GRAPH4 CALL THREE ; THREE LINES LD B,2 CALL TWO ; TWO LINES THREE LD B,3 ; THREE LINES TWO LD A,C ; FILLED BITMAP BIT 0,D JR NZ,GRAPH5 AND #0F ; REMOVE PIXELS GRAPH5 BIT 1,D JR NZ,GRAPHLP AND #F0 GRAPHLP LD (HL),A INC HL DJNZ GRAPHLP RR D ; PREPARE FOR NEXT CALL RR D RET DEFS #FBB0-$ ; PAD FOR SCREEN AT #FC00 TTXTCHARS DEFB #20,#20,#20,#22,#06,#0A,#0F,#02 ; 7B 1/4 DEFB #00,#10,#20,#7E,#20,#10,#00,#00 ; 5B <- DEFB #28,#28,#28,#28,#28,#28,#28,#00 ; 7C | DEFB #20,#20,#20,#2C,#02,#04,#0E,#00 ; 5C 1/2 DEFB #C0,#20,#C0,#22,#C6,#0A,#0F,#02 ; 7D 3/4 DEFB #00,#08,#04,#7E,#04,#08,#00,#00 ; 5D -> DEFB #00,#10,#00,#7C,#00,#10,#00,#00 ; 7E div DEFB #00,#10,#38,#54,#10,#10,#10,#00 ; 5E ^ DEFB #FE,#FE,#FE,#FE,#FE,#FE,#FE,#00 ; 7F block DEFB #00,#00,#00,#7E,#00,#00,#00,#00 ; 5F - ; TEST DATA TESTDATA DEFB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 DEFB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#30,#30 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#30,#31 DEFB #97,#9E,#8F,#73,#93,#9A,#96,#9E,#9F,#98,#84,#8D,#9D,#83,#45,#4E,#47,#49,#4E,#45 DEFB #45,#52,#49,#4E,#47,#20,#92,#9C,#8C,#9E,#73,#95,#8E,#91,#8F,#94,#8F,#87,#30,#32 DEFB #97,#9E,#8F,#73,#93,#9A,#96,#9E,#9F,#98,#84,#8D,#9D,#83,#45,#4E,#47,#49,#4E,#45 DEFB #45,#52,#49,#4E,#47,#20,#92,#9C,#8C,#9E,#73,#95,#8E,#91,#8F,#94,#8F,#87,#30,#33 DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#30,#34 DEFB #94,#9A,#9E,#73,#91,#99,#95,#80,#95,#81,#8D,#20,#85,#9D,#82,#54,#65,#73,#74,#20 DEFB #50,#61,#67,#65,#20,#20,#9C,#8C,#9E,#92,#73,#96,#90,#93,#80,#97,#90,#81,#30,#35 DEFB #94,#9A,#9E,#73,#91,#99,#95,#80,#95,#81,#8D,#20,#85,#9D,#82,#54,#65,#73,#74,#20 DEFB #50,#61,#67,#65,#20,#20,#9C,#8C,#9E,#92,#73,#96,#90,#93,#80,#97,#90,#81,#30,#36 DEFB #81,#80,#81,#20,#80,#20,#81,#9E,#20,#9E,#20,#97,#2C,#93,#93,#96,#96,#92,#92,#92 DEFB #95,#95,#91,#91,#94,#94,#94,#20,#20,#94,#80,#81,#80,#81,#80,#81,#80,#81,#30,#37 DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#30,#38 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#30,#39 DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#31,#30 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#31,#31 DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#31,#32 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#31,#33 DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#31,#34 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80 DEFB #81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#81,#80,#31,#35 DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F DEFB #7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#7E,#7F,#31,#36 DEFB #57,#68,#69,#74,#65,#83,#59,#65,#6C,#6C,#6F,#77,#86,#43,#79,#61,#6E,#82,#47,#72 DEFB #65,#65,#6E,#85,#4D,#61,#67,#65,#6E,#74,#61,#81,#52,#65,#64,#84,#42,#6C,#75,#65 DEFB #97,#9A,#21,#22,#23,#93,#24,#25,#26,#27,#96,#28,#29,#2A,#2B,#92,#2C,#2D,#2E,#2F DEFB #99,#30,#31,#32,#33,#95,#34,#35,#36,#37,#91,#38,#39,#3A,#3B,#94,#3C,#3D,#3E,#3F DEFB #20,#20,#21,#22,#23,#20,#24,#25,#26,#27,#20,#28,#29,#2A,#2B,#20,#2C,#2D,#2E,#2F DEFB #20,#30,#31,#32,#33,#20,#34,#35,#36,#37,#20,#38,#39,#3A,#3B,#20,#3C,#3D,#3E,#3F DEFB #20,#40,#41,#42,#43,#20,#44,#45,#46,#47,#20,#48,#49,#4A,#4B,#20,#4C,#4D,#4E,#4F DEFB #20,#50,#51,#52,#53,#20,#54,#55,#56,#57,#20,#58,#59,#5A,#5B,#20,#5C,#5D,#5E,#5F DEFB #20,#60,#61,#62,#63,#20,#64,#65,#66,#67,#20,#68,#69,#6A,#6B,#20,#6C,#6D,#6E,#6F DEFB #20,#70,#71,#72,#73,#20,#74,#75,#76,#77,#20,#78,#79,#7A,#7B,#20,#7C,#7D,#7E,#7F DEFB #94,#60,#61,#62,#63,#91,#64,#65,#66,#67,#95,#68,#69,#6A,#6B,#92,#6C,#6D,#6E,#6F DEFB #9A,#70,#71,#72,#73,#96,#74,#75,#76,#77,#93,#78,#79,#7A,#7B,#97,#7C,#7D,#7E,#7F DEFB #83,#98,#43,#6F,#6E,#63,#65,#61,#6C,#88,#46,#6C,#61,#73,#68,#83,#2A,#8B,#8B,#42 DEFB #6F,#78,#89,#53,#74,#65,#61,#64,#79,#98,#47,#6F,#6E,#65,#8A,#8A,#3F,#96,#5E,#7F DEFB #82,#82,#45,#6E,#67,#69,#6E,#65,#65,#72,#69,#6E,#67,#20,#00,#00,#00,#00,#00,#00 DEFB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ; DEFB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 DEFB #00,#00,#00,#00 ; DEVPAC DOESN'T LIKE HITTING #0000 DEFW ENTRY,ENTRY ; END