; SYSTEM I/O SYSTEM$$ ; NWC MOD1 6 SEPT 79 ; USE WITH MATROX ALT-2480 VIDEO DISPLAY BOARD ONLY MSIZE EQU 60 LAST EQU MSIZE*1024 FIRST EQU LAST-1536 LASTM EQU FIRST+4A0H RELOC EQU 100H-LASTM ; WIDTH EQU 80 ; WIDTH OF LINE WMATRX EQU 128 ; WIDTH OF MATROX WSKP EQU 48 ; DUMMY AREA FOR MATROX LINES EQU 24 ; NUMBER OF LINES NEDITB EQU 1 ; NUMBER OF EDIT BUFFER LINES NSCRL EQU LINES BLK EQU 020H ; TOP EQU 0F000H ; TOP OF TV SCREEN WORDS EQU TOP+LINES*WMATRX ; BEGINNING OF EDIT BUFFER OULINE EQU WORDS-WMATRX ; POINTER TO OUTPUT BUFFER SCREND EQU OULINE+WIDTH ; END OF SCREEN CR EQU 13 ; ; ORG LASTM ;START PROGRAM HERE JMP DTOU JMP LISTR ; DTOU: LDA CLRFLG ; CHECK IF SCREEN TO BE CLEARED CPI 1 JZ DTOU2 ; CLEAR SCREEN ADI 1 ; INCREMENT CLRFLG STA CLRFLG ; SAVE CLRFLG LXI H,TOP ; TOP OF SCREEN MVI D,WIDTH ; SET COLUMN COUNTER MVI E,LINES ; SET LINE COUNTER LXI B,WSKP ; DUMMY AREA SPACING MVI A,BLK ; FILL WITH BLANKS CLR1: MOV M,A ; STUFF ONE INX H ; NEXT ADDR DCR D ; ONE LESS TO DO JNZ CLR1 ; ANY COLUMN LEFT DAD B ; NEXT LINE MVI D,WIDTH ; RESET COLUMN COUNTER DCR E ; ONE LESS LINE TO DO JNZ CLR1 DTOU2: MOV A,C PUSH D CALL CHOUT POP D RET ; ; SAVE REGISTERS SVREG: PUSH B PUSH D PUSH H RET ; RESTORE REGISTERS RSREG: POP H POP D POP B RET ; ; SCROLL UP ONE LINE ; SCRL: MVI B,NSCRL ;SCROLL UP ONE LINE SCRLX: LXI H,TOP ;TO ADDRESS LXI D,TOP+WMATRX ;FROM ADDRESS CALL SCUP ;SCROLL UP ONE LINE CALL ZERO ;BLANK OUT LINE 3 RET ; ; ; SCROLL UP ; SCUP: MVI C,WIDTH ;SCROLL UP ONE LINE SCUP2: MOV A,H ; CHECK FOR CR BEFORE DISPLAYING CPI SCREND SHR 8 ; JNZ SCUP5 SCUP3: LDAX D CPI CR JNZ SCUP4 MVI A,BLK ; BLANK OUT CR SCUP4: ANI 7FH MOV M,A INX H INX D DCR C JNZ SCUP3 JMP SCUP6 SCUP5: LDAX D ;PICK UP CHARACTER ANI 7FH ;STRIP OFF WHITE BACKGROUND MOV M,A ;STORE IT IN NEW LOCATION INX H ;ADJUST POINTERS INX D ; DCR C ;DECREMENT CHARACTER COUNTER JNZ SCUP2 ;LOOP SCUP6: PUSH PSW CALL SCDD POP PSW DCR B ; DECREMENT LINE COUNTER JZ SCUP7 JMP SCUP ; ; BLANK OUT INPUT BUFFER AREA SCUP7: PUSH H PUSH B LXI H,OULINE MVI C,WIDTH MVI A,BLK ANI 7FH SCUP8: MOV M,A INX H DCR C JNZ SCUP8 POP B POP H RET ; ; FOR SKIPPING FOR ADDRESS 80-128 ; SCDD: PUSH H ; SAVE OLD H-L LXI H,WSKP ; DUMMY AREA FACTOR DAD D ; INCREMENT D-E FOR DUMMY AREA XCHG ; NEW VALUE FOR D-E POP H PUSH D ; SAVE NEW D-E PUSH H LXI H,WSKP XCHG POP H ; LOAD WITH OLD H-L DAD D ; INCREMENT H-L FOR DUMMY AREA POP D ; RESTORE NEW D-E RET ; ; BLANK OUT ONE LINE ; ZERO: MVI A,BLK ;LOAD A-REG WITH BLANK CHARACTER MVI C,WIDTH ;LINE CHARACTER COUNT SC3: MOV M,A ;STORE BLANK INX H ; DCR C ; JNZ SC3 ;LOOP FOR ALL WIDTH CHARACTERS RET ; ; ; ; CHOUT: PUSH H MOV C,A ; SAVE CHARACTER PUSH B ; LHLD TVBUF ;TV BUFFER CURRNET CHARACTER POINTER ANI 7FH ; CPI CR ;IS IT CR? JZ TVCR ;IF SO, THEN SCROLL UP CPI 95 ;ELSE CHECK FOR DELETE JNZ CH0 ; DCX H ;IF CHAR IS DELETE, MOVE POINTER BA JMP CH2 ; CH0: CPI BLK ;IS CHAR CONTROL TYPE? JC CHEND ;IF NOT, OUTPUT CHARACTER TO TV MOV A,H ; CHECK HIGH ORDER FOR END CPI SCREND SHR 8 ; CHECK HIGH ORDER FOR END JNZ CH1 MOV A,L ; CHECK LOW ORDER FOR END CPI SCREND AND 0FFH ; JNZ CH1 PUSH B CALL SCRL POP B LXI H,OULINE ;RESET EDIT BUFFER JMP CH1 TVCR: PUSH B CALL SCRL ;SCROLL UP ONE LINE POP B LXI H,OULINE ;RESET EDIT BUFFER JMP CH2 ; CH1: MOV M,C ;NOW, FINALLY, SAVE CHAR IN CH3: INX H ;IN BUFFER AND BUMP POINTER CH2: SHLD TVBUF ;SAVE POINTER CHEND: MOV A,M ORI 80H MOV M,A POP B POP H ; RESTORE H AND L MOV A,C ; RET ; ; TVBUF: DW WORDS-WMATRX ; LINE 24 CLRFLG: DB 0 ; FLAG FOR CLEARING SCREEN ; CSTAT EQU 0 ;STATUS PORT CDATA EQU 1 ;DATA PORT CPTR EQU 10000000B ;READY BIT LSTAT EQU CSTAT ;LIST STATUS PORT. LCOM EQU 2 ;LIST COMMAND PORT. LDATA EQU CDATA ;LIST DATA PORT. LRBIT EQU CPTR ;LIST READY BIT. LNULL EQU 2 ;LIST NULL COUNT. ; ; WRITE A CHARACTER ON LISTING DEVICE. ; LISTR: MVI A,0DH ;IF IT'S A CR, CMP C ;THEN HOP OUT TO JZ LINUL ;NULL ROUTINE. LIST1: IN LSTAT ;READ LISTER STATUS. ANI LRBIT ;LOOK AT READY BIT. JZ LIST1 ;READY WHEN HIGH. MOV A,C ;GET DATA BYTE. OUT LDATA ;PRINT IT. RET ;RETURN FROM LIST. LINUL: PUSH B ;SAVE B&C. MVI B,LNULL ;GET NULL COUNT. LINUL1: CALL LIST1 ;PRINT (CR FIRST). MVI C,0 ;GET NULL CHAR. DCR B ;DECREMENT COUNTER. JNZ LINUL1 ;DO NEXT NULL. POP B ;RESTORE B&C. MOV A,C ;RESTORE A. RET ;RETURN FROM LIST. VIOMOD: RET ; NOT REQUIRED WITH MATROX VIDEO BOARD END