; cmpioml.asm ; 8255 assistance ; L. Stewart, August 24, 1982 10:41 AM $INCLUDE(Lark.d) CCClock EQU 010H CCData EQU 020H CCCBar EQU 0EFH CCDBar EQU 0DFH SynTSN EQU 002H C←CODE SEGMENT C←DATA SEGMENT ; int vpio[6]; ←vpio LABEL BYTE ←vpioa DB 00H ←vpiob DB 00H ←vpioc DB 00H ←vapioa DB 00H ←vapiob DB 00H ←vapioc DB 00H C←DATA ENDS ASSUME CS:C←CODE, DS:C←DATA pioports LABEL WORD DB pioa DB 0 DB piob DB 0 DB pioc DB 0 DB apioa DB 0 DB apiob DB 0 DB apioc DB 0 ; PIOOn(bits, port) ←PIOOn LABEL NEAR MOV DI,OFFSET ←vpio MOV AL,[DI][BX] OR AL,CL JMP piocom ; PIOOff(bits, port) ←PIOOff LABEL NEAR MOV DI,OFFSET ←vpio MOV AL,[DI][BX] XOR CL,0FFH AND AL,CL JMP piocom ; SetPIO(bits, port) ←SetPIO LABEL NEAR MOV DI,OFFSET ←vpio MOV AL,CL JMP piocom piocom: MOV [DI][BX],AL MOV SI,OFFSET pioports SAL BX,1 MOV DX,[SI][BX] OUT DX,AL RET ; int GetPIO(port) ←GetPIO PROC MOV SI,OFFSET pioports SAL BX,1 MOV DX,[SI][BX] XOR AX,AX IN AL,DX MOV BX,AX RET ←GetPIO ENDP ; Set up codec with time slot word passed in BX ; SetCodec(timeslot) ←SetCodec PROC NEAR MOV AL,←vapioa AND AL,CCCBar ; clear clock AND AL,CCDBar ; clear data OUT apioa,AL MOV CX,8 OR AL,CCClock ; set clock MOV DL,AL tsnlow: ; wait for not TSN IN AL,pioc TEST AL,SynTSN JNZ tsnlow tsnhigh: ; wait for TSN IN AL,pioc TEST AL,SynTSN JZ tsnhigh tsloop: MOV AL,DL OR BL,BL JNS tsl0 OR AL,CCData ; possibly set data tsl0: OUT apioa,AL AND AL,CCCBar ; clear clock OUT apioa,AL SAL BX,1 LOOP tsloop AND AL,CCDBar ; clear data OUT apioa,AL MOV ←vapioa,AL RET ←SetCodec ENDP PUBLIC ←vpio PUBLIC ←vpioa PUBLIC ←vpiob PUBLIC ←vpioc PUBLIC ←vapioa PUBLIC ←vapiob PUBLIC ←vapioc PUBLIC ←PIOOn PUBLIC ←PIOOff PUBLIC ←SetPIO PUBLIC ←GetPIO PUBLIC ←SetCodec C←CODE ENDS END