|
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 - 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»