DataMuseum.dkPresents historical artifacts from the history of: Christian Rovsing CR7, CR8 & CR16 CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 6912 (0x1b00) Types: TextFile Names: »CHARIO.ASM«
└─⟦b445f10af⟧ Bits:30004389 CP/M Plus Source files └─ ⟦this⟧ »CHARIO.ASM«
TITLE 'CHARACTER I/O HANDLER FOR CP/M 3.0 BIOS - DATE:831207' PAGE 43 ;************************************************************************ ;* THIS CHARIO MODULE HANDLES ALL CHARACTER DEVICE INTERFACING * ;* AND IT CONTAINS THE @CTBL. * ;* THE @CTBL IS A TABLE DESCRIBING THE PHYSICAL I/O DEVICES BY * ;* THEIR NAME AND THEIR CHARACTERISTICS. * ;************************************************************************ PUBLIC ?CINIT ;CHAR DEV INIT PUBLIC ?CIST ;CHAR INPUT DEV STATUS PUBLIC ?COST ;CHAR OUTPUT DEV STATUS PUBLIC ?CI ;CHAR DEV INPUT PUBLIC ?CO ;CHAR DEV OUTPUT PUBLIC @CTBL ;CHAR DEV TABLE EXTRN ?PMSG ; MACLIB PORTS ;PORT AND MASK EQUATES MACLIB Z80 ;DEFINE Z80 OP CODES MAX$DEVICE$NO EQU 3 ;DEVICE 0-2 PAGE ;************************************************************************ ;* CHARACTER DEVICE INITIALIZATION * ;* * ;* INPUT : <C> = PHYSICAL DEVICE NUMBER * ;* DEVICE PARAMETERS IN @CTBL * ;* * ;* OUTPUT: NONE * ;* * ;************************************************************************ CSEG ;COMMON MEMORY ?CINIT: MOV A,C ;GET DEVICE NUMBER CPI MAX$DEVICE$NO ; RNC ;RETURN IF ILLEGAL NUMBER MOV L,C ;MAKE DEVICE NUMBER 16 BITS MVI H,0 ; PUSH H ;SAVE DEVICE NUMBER DAD H ; DAD H ; *8 DAD H ; LXI D,@CTBL+7 ;GET BAUD RATE DAD D ; MOV L,M ; MVI H,0 ; LXI D,SPEED$TABLE ; DAD D ; MOV A,M ;GET BAUD RATE CODE ORA A ;TEST IF VALID BAUD POP H JZ NOTVALID ; PUSH H STA SPEED ;SAVE IN INIT TABLE POP H ; PUSH H ; LXI D,BAUD$PORTS ; DAD D ; MOV A,M ;GET GET PORT STA PIT$CH ;SAVE IN INIT TABLE POP H ; LXI D,MODE$WORDS ; DAD D ; MOV A,M ;GET TIMER MODE WORD STA PIT$MODE ;SAVE IN INIT TABLE LXI H,INIT$TABLE ; SET$BAUD: MOV A,M ; ORA A ; RZ ; MOV B,A ; INX H ; MOV C,M ; INX H ; OUTIR ; JMP SET$BAUD ; NOTVALID: LXI H,NVBAUD CALL ?PMSG RET NVBAUD: DB CR,LF,' ',ESC,'Æ7m','ERROR : Only available baudrates are' DB ' 600,1200,2400,4800,9600 and 19.2k',CR,LF,ESC,'Æm',0 ;************************************************************************ ;* CHARACTER INPUT DEVICE STATUS * ;* * ;* INPUT : <B> = PHYSICAL DEVICE NUMBER * ;* * ;* OUTPUT: <A> = 00H IF NO INPUT CHAR IS AVAILABLE * ;* <A> = 0FFH IF INPUT CHAR IS AVAILABLE * ;* * ;************************************************************************ ?CIST: MOV A,B ;GET DEVICE NUMBER CPI MAX$DEVICE$NO ; JNC NULL$STATUS ; MOV L,B ;MAKE DEVICE NUMBER 16 BITS MVI H,0 ; PUSH H ;SAVE DEVICE NUMBER LXI D,STAT$PORTS ; DAD D ;MAKE POINTER TO PORT ADDRESS MOV C,M ; INP A ;READ FROM SIO STATUS PORT POP H ;GET DEVICE NUMBER PUSH H ; LXI D,IN$STAT$MASK ; DAD D ;MAKE POINTER TO MASK MOV C,M ; ANA C ;MASK INPUT FROM STATUS PORT POP H ; LXI D,IN$STAT$VALUE ; DAD D ;MAKE POINTER TO VALUE MOV C,M ; CMP C ;COMPARE INPUT WITH VALUE JNZ NULL$STATUS ; ORI 0FFH ; RET ; NULL$STATUS: XRA A ;NO INPUT CHARACTER READY RET ; ;************************************************************************ ;* CHARACTER DEVICE INPUT * ;* * ;* INPUT : <B> = PHYSICAL DEVICE NUMBER * ;* * ;* OUTPUT: <A> = NEXT AVAILABLE CHARACTER * ;* * ;************************************************************************ ?CI: MOV A,B ;GET DEVICE NUMBER CPI MAX$DEVICE$NO ; JNC NULL$INPUT ; CIL: CALL ?CIST ;CHECK INPUT STATUS JZ CIL ; MOV L,B ;MAKE DEVICE NUMBER 16 BITS MVI H,0 ; LXI D,DATA$PORTS ; DAD D ;MAKE POINTER TO PORT ADDRESS MOV C,M ; INP A ;GET DATA ANI 7FH ;MASK PARITY RET ; NULL$INPUT: MVI A,1AH ;RETURN A CTL-Z FOR NO DEVICE RET ; ;************************************************************************ ;* CHARACTER OUTPUT DEVICE STATUS * ;* * ;* INPUT : <B> = PHYSICAL DEVICE NUMBER * ;* * ;* OUTPUT: <A> = 00H IF OUTPUT BUSY * ;* <A> = 0FFH IF OUTPUT READY * ;* * ;************************************************************************ ?COST: MOV A,B ;GET DEVICE NUMBER CPI MAX$DEVICE$NO ; JNC NULL$STATUS ; MOV L,B ;MAKE DEVICE NUMBER 16 BITS MVI H,0 ; PUSH H ; LXI D,STAT$PORTS ; DAD D ;MAKE POINTER TO PORT ADDRESS MOV C,M ; if (crtype eq CR7) CPI 1 ;IF DEVICE = LINE PRINTER THEN JZ COST1 ;DO NOT RESET EXTERNAL STATUS endif MVI A,10H ;RESET EXTERNAL STATUS OUTP A ; COST1: INP A ;GET STATUS POP H ;GET DEVICE NUMBER PUSH H ; LXI D,OUT$STAT$MASK ; DAD D ;MAKE POINTER TO MASK MOV C,M ; ANA C ; POP H ; LXI D,OUT$STAT$VALUE; DAD D ;MAKE POINTER TO VALUE MOV C,M ; CMP C ; JNZ NULL$STATUS ; ORI 0FFH ; RET ; ;************************************************************************ ;* CHARACTER DEVICE OUTPUT * ;* * ;* INPUT : <B> = PHYSICAL DEVICE NUMBER * ;* <C> = OUTPUT CHARACTER * ;* * ;* OUTPUT: NONE * ;* * ;************************************************************************ ?CO: MOV A,B ;GET DEVICE NUMBER CPI MAX$DEVICE$NO ; JNC NULL$OUTPUT ; MOV A,C ;GET OUTPUT CHARACTER PUSH PSW ;SAVE CHARACTER PUSH B ; COL: CALL ?COST ; JZ COL ; POP B ; MOV L,B ; MVI H,0 ;MAKE DEVICE NUMBER 16 BITS LXI D,DATA$PORTS ; DAD D ;MAKE POINTER TO PORT ADDRESS MOV C,M ; POP PSW ;GET CHARACTER OUTP A ; NULL$OUTPUT: RET PAGE ;*************************************************************************** INIT$TABLE: DB 1H ;COUNT DB P$PIT$CMD ;PORT PIT$MODE: DS 1 ;VALUE DB 2H ;COUNT PIT$CH: DS 1 ;PORT SPEED: DS 1 ;(LSB) VALUE DB 0H ;(MSB) VALUE DB 0 ;TABLE TERMINATOR SPEED$TABLE: ;BAUD RATES DB 0,0,0,0 ;NONE,50,75,110 DB 0,0,0,82H ;134.5,150,300,600 DB 41H,0,20H,0 ;1200,1800,2400,3600 DB 10H,0,08H,04H ;4800,7200,9600,19.2K MODE$WORDS: DB C$CRT$MODE,C$LPT$MODE,C$MODEM$MODE ; BAUD$PORTS: DB P$CRT$BAUD,P$LPT$BAUD,P$MODEM$BAUD ; DATA$PORTS: DB P$CRT$DATA,P$LPT$DATA,P$MODEM$DATA ; STAT$PORTS: DB P$CRT$STAT,P$LPT$STAT,P$MODEM$STAT ; OUT$STAT$MASK: DB M$CRT$OUT,M$LPT$OUT,M$MODEM$OUT ; IN$STAT$MASK: DB M$CRT$IN,M$LPT$IN,M$MODEM$IN ; OUT$STAT$VALUE: DB V$CRT$OUT,V$LPT$OUT,V$MODEM$OUT ; IN$STAT$VALUE: DB V$CRT$IN,V$LPT$IN,V$MODEM$IN ; ;=========================================================================== @CTBL: DB 'CRT ' ;DEVICE 0 DB MB$IN$OUT+MB$SERIAL+MB$SOFT$BAUD DB BAUD$9600 ; ; DB 'LPT ' ;DEVICE 1 DB MB$OUTPUT+MB$SERIAL+MB$SOFT$BAUD+MB$XONXOFF DB BAUD$9600 ; DB 'MODEM ' ;DEVICE 2 DB MB$IN$OUT+MB$SERIAL+MB$SOFT$BAUD DB BAUD$9600 ; DB 0 ;TABLE TERMINATOR END «eof»