|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 31360 (0x7a80)
Types: TextFile
Names: »QDISPLAY.MAC«
└─⟦72577d508⟧ Bits:30003297 Diverse BIOS typer til RC703
└─⟦this⟧ »QDISPLAY.MAC«
SUBTTL DISPLAY DRIVER
page
;================================================
;= DISPLAY DRIVER =
;================================================
GRAPH: DB 0 ; GRAPHICAL MODE FLAG
LINTEM: DW 0 ; SAVE AREA FOR ESCDL
CPLHL: LD A,H ; PROCEDURE COMPLEMENT_HL;
CPL ; BEGIN
LD H,A ; H:=CPL(H);
LD A,L ; L:=CPL(L);
CPL ; END;
LD L,A ;
RET ;
NEGHL: CALL CPLHL ; PROCEDURE NEGATE_HL;
INC HL ; COMPLEMENT_HL;
RET ; HL:=HL+1;
TSTLROW:LD HL,(RCTAD) ; PROCEDURE TEST_LAST_ROW;
LD A,L ; BEGIN
CP 128 ; IF ROW=1920 THEN Z_FLG := SET
RET NZ ; ELSE Z_FLG := RESET;
LD A,H ; END;
CP 7 ;
RET ;
CONV: LD A,(GRAPH) ; PROCEDURE CONVERT_CHAR;
OR A ; IF GRAPH THEN
LD A,C ; A:=CHAR
RET NZ ; ELSE
CON1: LD B,0 ; A:=CONVERT(CHAR);
ADD HL,BC ;
LD A,(HL) ;
RET ;
WP75: PUSH AF ; PROCEDURE CURSOR_POSITION;
LD A,80H ; (* LOAD CURSOR COMMAND *)
OUT (DSPLC),A ;
LD A,(CCTAD) ;
OUT (DSPLD),A ; (* X POSITION *)
LD A,(CURSY) ;
OUT (DSPLD),A ; (* Y POSITION *)
POP AF ;
RET ;
PAGE
ROWDN: LD HL,(RCTAD) ; PROCEDURE ROW_DOWN;
LD DE,80 ; BEGIN
ADD HL,DE ; ROW:=ROW+80;
LD (RCTAD),HL ; CURSY:=CURSY+1;
LD HL,CURSY ; CURSOR_POSITION(COLUMN,CURSY);
INC (HL) ; END;
JP WP75 ;
ROWUP: LD HL,(RCTAD) ; PROCEDURE ROW_UP;
LD DE,-80 ; BEGIN
ADD HL,DE ; ROW:=ROW-80;
LD (RCTAD),HL ; CURSY:=CURSY-1;
LD HL,CURSY ; CURSOR_POSITION(COLUMN,CURSY);
DEC (HL) ; END;
JP WP75 ;
ES0H: LD HL,0 ; PROCEDURE HOME;
LD (RCTAD),HL ; BEGIN
XOR A ; ROW:=0;
LD (CCTAD),A ; COLUMN:=0;
LD (CURSY),A ; CURSY:=0;
RET ; END;
CHKDC: CP B ; PROCEDURE A_MOD_B;
RET C ; BEGIN
SUB B ; A:=A MOD B;
JR CHKDC ; END;
PAGE
FILL: LD HL,(LOCBUF) ; PROCEDURE FILL_LINE_WITH_SPACES;
LD D,H ; BEGIN
LD E,L ; SOURCE:=LOCBUF;
INC DE ; DESTINATION:=LOCBUF+1;
LD BC,79 ; COUNT:=79; (SOURCE):='SP';
LD (HL),32 ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LDIR ; IF BACKGROUND THEN
LD A,(BGFLG) ; BEGIN
CP 0 ; SOURCE:=LOCBBU;
RET Z ; DESTINATION:=LOCBBU+1;
LD HL,(LOCBBU) ; COUNT:=9; (* 10 BYTES = 80 BITS *)
LD D,H ; (SOURCE):='NUL';
LD E,L ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
INC DE ; END;
LD BC,9 ; END;
LD (HL),0 ;
LDIR ;
RET ;
SCROLL: LD HL,DSPSTR+80 ; PROCEDURE SCROLL;
LD DE,DSPSTR ; BEGIN
LD BC,1920 ; SOURCE:=DISPLAY_START+80;
LDIR ; DESTINATION:=DISPLAY_START;
LD HL,DSPSTR+1920 ; COUNT:=1920;
LD (LOCBUF),HL ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD A,(BGFLG) ; LOCBUF:=DISPLAY_START+1920;
CP 0 ; IF BACKGROUND THEN
JP Z,FILL ; BEGIN
LD HL,BGSTAR+10 ; SOURCE:=BGSTAR+10;
LD DE,BGSTAR ; DESTINATION:=BGSTAR;
LD BC,240 ; COUNT:=240;
LDIR ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD HL,BGSTAR+240 ; LOCBBU:=BGSTAR+240; (*LAST LINE*)
LD (LOCBBU),HL ; END;
JP FILL ; FILL_LINE_WITH_SPACES;
; END;
PAGE
ADDOFF: LD A,0 ; PROCEDURE BACKGROUND_ADDRESS_CALCULATION;
LD B,3 ; BEGIN
ADDOF1: SRL H ; A:=HL MOD 8; (* BIT NUMBER *)
RR L ; HL:=HL DIV 8; (* BYTE OFFSET IN BG *)
RRA ; END;
DJNZ ADDOF1 ;
CP 0 ;
RET Z ;
LD B,5 ;
ADDOF2: RRA ;
DJNZ ADDOF2 ;
RET ;
CLRBIT: LD DE,BGSTAR ; PROCEDURE CLEAR_REST_OF_BITS;
ADD HL,DE ; BEGIN
CP 0 ; (* ENTRY:A=BIT NO, HL=BG OFFSET *)
LD B,A ;
LD A,0 ; HL:=BGSTAR+BGOFFSET;
JR Z,CLRBI2 ; IF BITNO<>0 THEN
CLRBI1: SCF ;
RLA ; FOR I:=0 TO BITNO DO
DJNZ CLRBI1 ; (HL).I:=0;(* CLEAR BIT #I *)
CLRBI2: AND (HL) ; ELSE
LD (HL),A ; (HL):='NUL'
RET ; END;
PAGE
MOVUP: LD A,B ;
OR C ;
RET Z ;
LDIR ;
RET ;
MOVDWN: LD A,B ;
OR C ;
RET Z ;
LDDR ;
RET ;
PAGE
;========================================================
;= CONTROL CHARACTER TREATMENT =
;========================================================
CTLG: OUT (BELL),A ; PROCEDURE BELL;
RET ;
CTLF: CALL ES0H ; PROCEDURE START_XY_ADDRESSING;
LD A,2 ; HOME;
LD (XFLG),A ; XFLG:=2;
RET ;
DUMMY: RET ; PROCEDURE DUMMY;
; BEGIN END;
CTLM: LD A,0 ; PROCEDURE CARRIAGE_RETURN;
LD (CCTAD),A ; COLUMN:=0;
JP WP75 ; CURSOR_POSITION(COLUMN,CURSY);
ESCE: LD HL,DSPSTR+1999 ; PROCEDURE CLEAR_SCREEN;
LD DE,DSPSTR+1998 ; BEGIN
LD BC,1999 ; SOURCE:=DISPLAY_START+1999;
LD (HL),32 ; DESTINATION:=DISPLAY_START+1999-1;
LDDR ; COUNT:=1999;
CALL ES0H ; (SOURCE):='SP';
CALL WP75 ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD A,(BGFLG) ; HOME;
CP 0 ; CURSOR_POSITION(COLUMN,CURSY);
RET Z ; IF BACKGROUND THEN (* CLEAR FLAGS *)
XOR A ; BEGIN
LD (BGFLG),A ; BACKGROUND:=FALSE;
LD HL,BGSTAR+249 ; SOURCE:=BGSTAR+240;
LD DE,BGSTAR+248 ; DESTINATION:=BGSTAR+240-1;
LD BC,249 ; COUNT:=249;
LD (HL),0 ; (SOURCE):='NUL';
LDDR ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
RET ; END;
; END;
PAGE
ESCK: LD DE,DSPSTR+79 ; PROCEDURE ERASE_TO_END_OF_LINE;
LD HL,(RCTAD) ; BEGIN
ADD HL,DE ; SOURCE:=DISPLAY_START+ROW+79;
; DESTINATION:=DISPLAY_START+ROW+79-1;
; COUNT:=79-COLUMN;
LD D,H ; (SOURCE):='SP';
LD E,L ; IF COUNT<>0 THEN
DEC DE ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD BC,0 ;
LD A,(CCTAD) ;
CPL ;
INC A ;
ADD A,79 ;
LD C,A ;
LD (HL),32 ;
CALL MOVDWN ;
LD A,(BGFLG) ;
CP 0 ;
RET Z ; IF BACKGROUND THEN
LD HL,(RCTAD) ; BEGIN
LD D,0 ;
LD A,(CCTAD) ;
LD E,A ;
ADD HL,DE ; BGOFFSET:=(ROW+COLUMN) DIV 8;
CALL ADDOFF ; BITNO:=(ROW+COLUMN) MOD 8;
CALL CLRBIT ; CLRBIT;
LD A,(CCTAD) ;
SRL A ; IF COLUMN<79 THEN
SRL A ; BEGIN (* MORE BG BYTES TO CLEAR *)
SRL A ;
CPL ;
ADD A,9 ; COUNT:=9-(COLUMN DIV 8);
RET M ;
LD C,A ;
LD B,0 ; DESTINATION:=BGOFFSET+1+1;
INC HL ; SOURCE:=BGOFFSET+1;
LD D,H ; IF COUNT<>0 THEN
LD E,L ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
INC DE ; END;
LD A,0 ; END;
JP MOVUP ; END;
PAGE
ESCY: LD HL,(RCTAD) ; PROCEDURE ERASE_TO_END_OF_SCREEN;
LD A,(CCTAD) ; BEGIN
LD C,A ; SOURCE:=DISPLAY_START+1999;
LD B,0 ; DESTINATION:=DISPLAY_START+1999-1;
ADD HL,BC ; COUNT:=1999-(ROW+COLUMN);
CALL NEGHL ; (SOURCE):='SP';
LD DE,1999 ; IF COUNT>0 THEN
ADD HL,DE ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD B,H ; IF BACKGROUND THEN
LD C,L ; BEGIN
LD HL,DSPSTR+1999 ; BGOFFSET:=(COLUMN+ROW) DIV 8;
LD DE,DSPSTR+1998 ; BITNO:=(ROW+COLUMN) MOD 8; CLRBIT;
LD (HL),32 ; COUNT:=248-BGOFFSET;
CALL MOVDWN ; SOURCE:=BGSTAR+249;
LD A,(BGFLG) ; DESTINATION:=BGSTAR+249-1;
CP 0 ; (SOURCE):='NUL';
RET Z ; IF COUNT<>0 THEN
LD HL,(RCTAD) ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD D,0 ; END;
LD A,(CCTAD) ; END;
LD E,A ;
ADD HL,DE ;
CALL ADDOFF ;
CALL CLRBIT ;
CALL CPLHL ;
LD DE,BGSTAR+249 ;
ADD HL,DE ;
LD A,80H ;
AND H ;
RET NZ ;
LD B,H ;
LD C,L ;
LD H,D ;
LD L,E ;
DEC DE ;
LD (HL),0 ;
JP MOVDWN ;
PAGE
ESCD: LD A,(CCTAD) ; PROCEDURE CURSOR_LEFT;
CP 0 ; BEGIN
JR Z,ESCD1 ; IF COLUMN<>0 THEN
DEC A ; BEGIN
LD (CCTAD),A ; COLUMN:=COLUMN-1;
JP WP75 ; CURSOR_POSITION(COLUMN,CURSY);
ESCD1: LD A,79 ; END ELSE
LD (CCTAD),A ; BEGIN
LD HL,(RCTAD) ; COLUMN:=79;
LD A,L ; IF ROW<>0 THEN
OR H ; ROW_UP
JP NZ,ROWUP ; ELSE
LD HL,1920 ; BEGIN
LD (RCTAD),HL ; ROW:=1920;
LD A,24 ; CURSY:=24;
LD (CURSY),A ; CURSOR_POSITION(COLUMN,CURSY);
JP WP75 ; END;
; END;
; END;
ESCC: LD A,(CCTAD) ; PROCEDURE CURSOR_RIGTH;
CP 79 ; BEGIN
JR Z,ESCC1 ; IF COLUMN<>79 THEN
INC A ; BEGIN
LD (CCTAD),A ; COLUMN:=COLUMN+1;
JP WP75 ; CURSOR_POSITION(COLUMN,CURSY);
ESCC1: LD A,0 ; END ELSE
LD (CCTAD),A ; BEGIN
CALL TSTLROW ; COLUMN:=0;
JP NZ,ROWDN ; IF ROW<>1920 THEN ROW_DOWN
CALL WP75 ; ELSE
JP SCROLL ; BEGIN
; CURSOR_POSITION(COLUMN,CURSY);
; SCROLL;
; END;
; END;
; END;
PAGE
CTAB: CALL ESCC ; PROCEDURE TABULATE;
CALL ESCC ;
CALL ESCC ; FOR I:=1 TO 4 DO CURSOR_RIGHT;
CALL ESCC ;
RET ; END;
ESCB: CALL TSTLRO ; PROCEDURE CURSOR_DOWN;
JP NZ,ROWDN ; IF ROW<>1920 THEN ROW_DOWN
JP SCROLL ; ELSE SCROLL;
ESCA: LD HL,(RCTAD) ; PROCEDURE CURSOR_UP;
LD A,L ; IF ROW<>0 THEN ROW_UP
OR H ; ELSE
JP NZ,ROWUP ; BEGIN
LD HL,1920 ; ROW:=1920;
LD (RCTAD),HL ; CURSY:=24;
LD A,24 ; CURSOR_POSITION(COLUMN,CURSY);
LD (CURSY),A ; END;
JP WP75 ;
ESCH: CALL ES0H ; PROCEDURE HOME;
JP WP75 ; ES0H;
; CURSOR_POSITION(COLUMN,CURSY);
PAGE
ESCDL: LD HL,(RCTAD) ; PROCEDURE DELETE_LINE;
LD B,H ; BEGIN
LD C,L ; SOURCE:=DISPLAY_START+ROW+80;
LD DE,DSPSTR+80 ; DESTINATION:=DISPLAY_START+ROW;
ADD HL,DE ; COUNT:=1920-ROW;
LD (LINTEM),HL ; IF COUNT<>0 THEN
LD DE,-80 ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
ADD HL,DE ; LOCBUF:=DISPLAY_START+1920;
EX DE,HL ; IF BACKGROUND THEN
LD HL,1920 ; BEGIN
OR A ; BGOFFSET:=ROW DIV 8;
; BITNO:=ROW MOD 8;
; SOURCE:=BGSTAR+BGOFFSET+10;
SBC HL,BC ; DESTINATION:=BGSTAR+BGOFFSET;
LD B,H ; COUNT:=240-BGOFFSET;
LD C,L ; IF COUNT<>0 THEN
LD HL,(LINTEM) ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
CALL MOVUP ; LOCBBU:=BGSTAR+240;
LD HL,DSPSTR+1920 ; END;
LD (LOCBUF),HL ; FILL_LINE_WITH_SPACES;
; END;
PAGE
LD A,(BGFLG) ; BACKGROUND HANDLING:
CP 0 ;
JP Z,FILL ;
LD HL,(RCTAD) ;
CALL ADDOFF ;
LD B,H ;
LD C,L ;
LD DE,BGSTAR+10 ;
ADD HL,DE ;
LD (LINTEM),HL ;
LD DE,-10 ;
ADD HL,DE ;
EX DE,HL ;
LD H,B ;
LD L,C ;
CALL NEGHL ;
LD BC,240 ;
ADD HL,BC ;
LD B,H ;
LD C,L ;
LD HL,(LINTEM) ;
CALL MOVUP ;
LD HL,BGSTAR+240 ;
LD (LOCBBU),HL ;
JP FILL ;
PAGE
ESCIL: LD HL,(RCTAD) ; PROCEDURE INSERT_LINE
LD DE,DSPSTR ; BEGIN
ADD HL,DE ; SOURCE:=1919;
LD (LOCBUF),HL ; DESTINATION:=1999;
CALL NEGHL ; COUNT:=1920-ROW;
LD DE,DSPSTR+1920 ; IF COUNT<>0 THEN
ADD HL,DE ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD B,H ; IF BACKGROUND THEN
LD C,L ; BEGIN
LD HL,DSPSTR+1919 ; BGOFFSET:=ROW DIV 8;
LD DE,DSPSTR+1999 ; BITNO:=ROW MOD 8;
CALL MOVDWN ; LOCBBU:=BGSTAR+BGOFFSET;
LD A,(BGFLG) ; SOURCE:=BGSTAR+239;
CP 0 ; DESTINATION:=BGSTAR+249;
JP Z,FILL ; COUNT:=240-BGOFFSET;
LD HL,(RCTAD) ; IF COUNT<>0 THEN
CALL ADDOFF ; MOVEBYTES(SOURCE,DESTINATION,COUNT);
LD DE,BGSTAR ; END;
ADD HL,DE ;
LD (LOCBBU),HL ;
CALL NEGHL ;
LD DE,BGSTAR+240 ;
ADD HL,DE ;
LD B,H ;
LD C,L ;
LD HL,BGSTAR+239 ;
LD DE,BGSTAR+249 ;
CALL MOVDWN ;
JP FILL ;
PAGE
ESCSB: LD A,2 ; PROCEDURE SET_BACKGROUND;
LD (BGFLG),A ;
RET ;
ESCSF: LD A,1 ; PROCEDURE SET_FOREGROUND;
LD (BGFLG),A ;
RET ;
ESCCF: LD HL,DSPSTR ; PROCEDURE CLEAR_FOREGROUND;
LD DE,BGSTAR ; BEGIN
LD B,250 ; HL:=DISPLAY_START;
ESCCF1: LD A,(DE) ; DE:=BGSTAR;
LD C,8 ; FOR B:=250 DOWNTO 1 DO
CP 0 ; BEGIN
JR NZ,ESCCF3 ; IF (DE)=0 THEN
ESCCF2: LD (HL),32 ; FOR C:=8 DOWNTO 1 DO
INC HL ; BEGIN
DEC C ; (HL):='SP';
JR NZ,ESCCF2 ; HL:=HL+1;
JR ESCCF5 ; END
ESCCF3: RRA ; ELSE
JR C,ESCCF4 ; FOR C:=8 DOWN TO 1 DO
LD (HL),32 ; BEGIN
ESCCF4: INC HL ; IF (DE) AND (1 SHIFT (8-C))=1 THEN
DEC C ; (HL):='SP';
JR NZ,ESCCF3 ; HL:=HL+1;
ESCCF5: INC DE ; END;
DJNZ ESCCF1 ; END;
RET ; END;
PAGE
;========================================================
;= CONTROL CHARACTER JUMP TABLE =
;========================================================
TAB1: DW DUMMY ; DUMMY;
DW ESCIL ; INSERT_LINE;
DW ESCDL ; DELETE_LINE;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW ESCD ; CURSOR_LEFT;
DW CTLF ; START_XY_ADDRESSING;
DW CTLG ; BELL;
DW ESCD ; CURSOR_LEFT;
DW CTAB ; TABULATION;
DW ESCB ; CURSOR_DOWN;
DW DUMMY ; DUMMY;
DW ESCE ; CLEAR_SCREEN;
DW CTLM ; CARRIAGE_RETURN;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW ESCSB ; SET_BACKGROUND;
DW ESCSF ; SET_FOREGROUND;
DW ESCCF ; CLEAR_FOREGROUND;
DW DUMMY ; DUMMY;
DW ESCC ; CURSOR_RIGHT;
DW DUMMY ; DUMMY;
DW ESCA ; CURSOR_UP;
DW DUMMY ; DUMMY;
DW DUMMY ; DUMMY;
DW ESCH ; CURSOR_HOME;
DW ESCK ; ERASE_TO_END_OF_LINE;
DW ESCY ; ERASE_TO_END_OF_SCREEN;
PAGE
SPECC: LD A,0 ;PROCEDURE CONTROL_CHAR;
LD (XFLG),A ;BEGIN
LD A,(USHER) ; CANSEL POSSIBLE X-Y ADDRESSING
RLCA ;
AND 3EH ; OFFSET := CHAR * 2;
LD C,A ;
LD B,0 ;
LD HL,TAB1 ;
ADD HL,BC ;
LD E,(HL) ;
INC HL ;
LD D,(HL) ; JP (TABLE + OFFSET)
EX DE,HL ;
JP (HL) ;END;
;========================================================
;= END OF CONTROL CHARACTER TREATMENT =
;========================================================
PAGE
;================================================
;= X-Y ADDRESSING =
;================================================
XYADD: LD A,(USHER) ; PROCEDURE XYADDRESS;
AND 127 ; BEGIN
SUB 32 ; CHAR:=(CHAR AND 127)-32; XFLG:=XFLG-1;
LD HL,XFLG ; IF XFLG>0 THEN ADR0:=CHAR
DEC (HL) ; ELSE (* LAST BYTE OF ADDRESS *)
JR Z,XYADD1 ; BEGIN
LD (ADR0),A ; IF ADRMODE=0 THEN
RET ; BEGIN (* XY MODE *)
XYADD1: LD D,A ; CURSY:=CHAR MOD 25;
LD A,(ADR0) ; ROW:=ROW+CHAR*80;
LD H,A ; COLUMN:=ADR0 MOD 80;
LD A,(ADRMODE) ; END
OR A ; ELSE (* YX MODE *)
JR Z,XYADD2 ; BEGIN
EX DE,HL ; CURSY:=ADR0 MOD 25;
XYADD2: LD A,H ; ROW:=ROW+ADR0*80;
LD B,80 ; COLUMN:=CHAR MOD 80;
CALL CHKDC ; END;
LD (CCTAD),A ; END;
LD A,D ; END;
LD B,25 ;
CALL CHKDC ;
LD (CURSY),A ;
OR A ;
JP Z,WP75 ;
LD HL,(RCTAD) ;
LD DE,80 ;
XYADD3: ADD HL,DE ;
DEC A ;
JP NZ,XYADD3 ;
LD (RCTAD),HL ;
JP WP75 ;
PAGE
;================================================
;= NORMAL CHARACTER TREATMENT =
;================================================
DISPL: LD HL,(RCTAD) ; PROCEDURE DISPLAY_CHARACTER;
LD D,0 ; BEGIN
LD A,(CCTAD) ; LOCAD:=ROW+COLUMN;
LD E,A ;
ADD HL,DE ;
LD (LOCAD),HL ;
LD A,(USHER) ;
CP 192 ; IF CHAR > 224 THEN (* COLOUR *)
JR C,DISPL1 ; CHAR := COLOUR BITS
SUB 192 ; CHAR := SHIFT_LEFT(1,CHAR);
CP 32 ; CHAR := CHAR + COLOUR_ATTRIBUTE;
JR C,DISPL1 ; ELSE
AND 0FH ; IF CHAR > 192 THEN
RLA ; CHAR := CHAR -192;
OR 11000001B ;
JR DISPL3 ;
DISPL1: LD C,A ; IF CHAR=128 THEN GRAPH := FALSE;
CP 128 ; IF CHAR=128 THEN
JR C,DISPL2 ;
AND 4 ;
LD (GRAPH),A ; GRAPH := TRUE
LD A,C ; ELSE
JR DISPL3 ; CONVERT(CHAR);
DISPL2: LD HL,OUTCON ; END;
CALL CONV ; END;
DISPL3: LD HL,(LOCAD) ; (DISPLAY_START+LOCAD):=CHAR;
LD DE,DSPSTR ;
ADD HL,DE ;
LD (HL),A ;
CALL ESCC ; CURSOR_RIGTH;
PAGE
LD A,(BGFLG) ; IF BACKGROUND THEN
CP 2 ; BEGIN
RET NZ ; BGOFFSET:=LOCAD DIV 8;
LD HL,(LOCAD) ; BITNO:=LOCAD MOD 8;
CALL ADDOFF ; BGADDR:=BGSTAR+BGOFFSET;
LD DE,BGSTAR ; (BGADDR):=(BGADDR) OR (1 SHIFT BITNO);
ADD HL,DE ;
CP 0 ;
LD B,A ;
LD A,1 ;
JR Z,DISPL5 ;
DISPL4: RLCA ;
DJNZ DISPL4 ;
DISPL5: OR (HL) ;
LD (HL),A ; END;
RET ; END;
PAGE
CONOUT: DI ; PROCEDURE CONSOLE_OUTPUT;
PUSH HL ; BEGIN
LD HL,0 ; IF XFLG<>0 THEN
ADD HL,SP ; XYADD
LD SP,STACK ; ELSE
EI ; IF CHAR<32 THEN
PUSH HL ; SPECC
PUSH AF ; ELSE
PUSH BC ; DISPLAY_CHARACTER;
PUSH DE ; END;
LD A,C ;
LD (USHER),A ;
LD A,(XFLG) ;
OR A ;
JR Z,CONOU1 ;
CALL XYADD ;
JR CONOU3 ;
CONOU1: LD A,(USHER) ;
CP 32 ;
JR NC,CONOU2 ;
CALL SPECC ;
JR CONOU3 ;
CONOU2: CALL DISPL ;
CONOU3: POP DE ;
POP BC ;
POP AF ;
POP HL ;
DI ;
LD SP,HL ;
POP HL ;
EI ;
RET ;
PAGE
;================================================================
;= INTEL 8275 DISPLAY CONTROLLER INTERRUPT ROUTINE =
;================================================================
DSPITR: LD (SP_SAV),SP ; SAVE ACCUMULATOR AND FLAGS
LD SP,ISTACK ; SAVE REGISTERS
PUSH AF ;
PUSH BC ;
PUSH DE ; ESTABLISH LOCAL STACK
PUSH HL ; SAVE GLOBAL STACK POINTER
IN A,(DSPLC) ;
LD A,6 ;
OUT (DMAMAS),A ; SET DMA CH2 MASK;
LD A,7 ;
OUT (DMAMAS),A ; SET DMA CH3 MASK;
OUT (DMACBC),A ; CLEAR DMA BYTECOUNTER;
LD HL,DSPSTR ;
LD A,L ;
OUT (DMAAD2),A ; SET DMA CH2 LOW ADDRESS;
LD A,H ;
OUT (DMAAD2),A ; SET DMA CH2 HIGH ADDRESS;
LD HL,1999 ;
LD A,L ;
OUT (DMACN2),A ; SET DMA CH2 LOW BYTECOUNT;
LD A,H ;
OUT (DMACN2),A ; SET DMA CH2 HIGH BYTECOUNT;
LD A,0 ;
OUT (DMACN3),A ; SET DMA CH3 LOW BYTE COUNT;
OUT (DMACN3),A ; SET DMA CH3 HIGH BYTE COUNT;
LD A,2 ;
OUT (DMAMAS),A ; CLEAR CH2 MASK;
LD A,3 ;
OUT (DMAMAS),A ; CLEAR CH3 MASK;
LD A,0D7H ;
OUT (CTCCH2),A ; SET CTC CH2 MODE;
LD A,1 ;
OUT (CTCCH2),A ; SET CTC CH2 COUNT;
PAGE
LD HL,RTC0 ; REAL TIME CLOCK
INC (HL) ;
JR NZ,AFB11 ;
INC HL ;
INC (HL) ;
JR NZ,AFB11 ;
INC HL ;
INC (HL) ;
JR NZ,AFB11 ;
INC HL ;
INC (HL) ;
AFB11: LD HL,(EXCNT0) ; EXIT ROUTINE 0 COUNTER
LD A,L ;
OR H ;
JR Z,AFB12 ;
DEC HL ;
LD A,L ;
OR H ;
LD (EXCNT0),HL ;
CALL Z,EXROUT ;
AFB12: LD HL,(EXCNT1) ; EXIT ROUTINE 1 COUNTER
LD A,L ;
OR H ;
JR Z,AFB13 ;
DEC HL ;
LD A,L ;
OR H ;
LD (EXCNT1),HL ;
CALL Z,FDSTOP ;
AFB13: LD HL,(DELCNT) ;
LD A,L ;
OR H ;
JR Z,AFB14 ;
DEC HL ;
LD (DELCNT),HL ;
AFB14: POP HL ;
POP DE ; RESTORE GLOBAL STACKPOINTER
POP BC ; RESTORE REGISTERS
POP AF ; RESTORE ACCUMULATOR AND FLAGS
LD SP,(SP_SAV) ;
EI ;
RETI ;
«eof»