INITPOORT PROC NEAR MOV DX,PPI_ADDR ; LAADT ADRES PRINTERPOORT MOV AL,11111111B ; ALLE LIJNEN HOOG OUT DX,AL RET ; EINDE ROUTINE INITPOORT ENDP ZENDBYTE PROC NEAR PUSH AX ; SAVE REGISTERS PUSH BX PUSH CX PUSH DX MOV BL,AL ; ZET TE VERZENDEN BYTE IN BL SHL BX,1 ; ALLE DATABITS EEN POSITIE NAAR LINKS MOV DX,PPI_ADDR ; LAADT ADRES PRINTERPOORT MOV CX,8 ; LAADT TELLER VOOR BIT VERSCHUIVINGEN ZEND: MOV AL,11111101B ; CLEAR DATABIT OR AL,BL ; ZET DATABIT OP JUISTE WAARDE OUT DX,AL ; ZET DATA OP POORT AND AL,11111011B ; GEEFT STROBE NAAR ELECTRON OUT DX,AL INC DX ; LAADT ADRES PRINTERSTATUS WACHT_ACK: IN AL,DX ; LEES STATUS AND AL,10000000B ; TEST OF BIT GELEZEN IS JZ WACHT_ACK ; INDIEN LIJN HOOG IS BLIJVEN WACHTEN DEC DX ; LAADT ADRES PRINTERPOORT MOV AL,11111111B ; HAAL DATA EN STROBE VAN POORT AF OUT DX,AL SHR BX,1 ; SCHUIF VOOR VOLGENDE BIT INC DX ; LAADT ADRES PRINTERSTATUS WEG_ACK: IN AL,DX ; WACHT TOTDAT ACK VERDWIJNT AND AL,10000000B JNZ WEG_ACK DEC DX ; DX WORDT WEER PRINTERPOORT LOOP ZEND ; GA VERDER MET VOLGENDE BIT POP DX ; HAAL REGISTERS TERUG VAN STACK POP CX POP BX POP AX RET ; EINDE ZENDROUTINE ZENDBYTE ENDP LEESBYTE PROC NEAR PUSH DX ; SAVE REGISTERS PUSH CX PUSH BX PUSH AX MOV DX,PPI_ADDR ; LAADT ADRES PRINTERSTATUS INC DX MOV CX,8 ; LAADT TELLER VOOR AANTAL DATABITS DATA_VAL: IN AL,DX ; LEES STATUS AND AL,00010000B ; TEST OP GELDIGE DATA JNZ DATA_VAL ; SPRING INDIEN GEEN DATA BINNEN IS IN AL,DX ; LEES DATA SHL AL,1 ; SCHUIF DATABIT IN CARRY SHL AL,1 SHL AL,1 RCR BL,1 ; SCHUIF CARRY (DATABIT) IN BL DEC DX ; ADRES PRINTERPOORT MOV AL,11111101B ; GEEF ACK NAAR ELECTRON OUT DX,AL ; ZET OP PRINTERPOORT INC DX ; ADRES PRINTERSTATUS NO_DATA_VAL: IN AL,DX ; WACHT TOTDAT DATA_VALID WEGVALT AND AL,00010000B JZ NO_DATA_VAL DEC DX ; ADRES PRINTERPOORT MOV AL,11111111B ; HAAL ACK WEG OUT DX,AL INC DX ; ADRES PRINTERSTATUS LOOP DATA_VAL ; HERHAAL VOOR VOLGENDE BIT POP AX ; HAAL AX TERUG MOV AL,BL ; ZET ONTVANGEN BYTE IN AL POP BX ; HAAL OVERIGE REGISTERS TERUG POP CX POP DX RET ; EINDE ROUTINE LEESBYTE ENDP