;Alto->8086 small-c compiler rev 2.0 C←CODE SEGMENT $INCLUDE(8086LIB.D) $INCLUDE(dtslc.DEC) ASSUME CS:C←CODE, DS:C←DATA ; #include <Lark.h> ; struct ccb { ; char cmda; ; char *addra; ; char counta; ; char stata; ; }; ; extern InByte(); ; extern Swab(); ; extern SetTmr(); ; extern TmrExp(); ; extern SLCInit(); ; extern SLTStart(); ; extern SLRStart(); ; static struct ccb rxccb; ; static struct PBI *rxPBI; ; static int rxLength; ; static int rxTmr; ; SStartRx(pbi, length) ←SStartRx: ; struct PBI *pbi; ; int length; PUSH BP MOV BP,SP PUSH CX PUSH BX ; { ; rxPBI = pbi; ; BX ← ←pbi MOV BX,[BP-2] MOV ←rxPBI,BX ; rxLength = length; ; BX ← ←length POP BX PUSH BX MOV ←rxLength,BX ; rxccb.cmda = 0x00; MOV ←rxccb,0 ; rxccb.addra = rxPBI->pup; MOV BX,←rxPBI MOV CX,[BX+6] MOV WORD PTR ←rxccb+1,CX ; rxccb.addra = rxccb.addra - 4; MOV BX,WORD PTR ←rxccb+1 ADD BX,0FFFCX MOV WORD PTR ←rxccb+1,BX ; rxccb.counta = (-rxLength) & 0x00ff; MOV BX,←rxLength NEG BX AND BX,0FFX MOV ←rxccb+3,BL ; rxccb.stata = 0; MOV ←rxccb+4,0 ; SLRStart(&rxccb); LEA BX,←rxccb CALL ←SLRStart ; SetTmr(10000, &rxTmr); LEA BX,←rxTmr MOV CX,02710X CALL ←SetTmr ; }; MOV SP,BP POP BP RET; ; struct PBI *SCheckRx() ←SCheckRx: PUSH BP MOV BP,SP ; { ; struct EtherEncapsulation *ee; ; int temp; ; if (rxccb.stata & 0x80) { ADD SP,0FFFCX MOV AX,WORD PTR ←rxccb+4 AND AL,080X OR AL,AL JZ X1 ; if (rxccb.stata == 0x88) { MOV AX,WORD PTR ←rxccb+4 CMP AL,088X JNZ X2 ; temp = (int) rxPBI->pup; MOV BX,←rxPBI MOV CX,[BX+6] ; ←temp ← CX POP DX PUSH CX ; temp -= 4; SUB WORD PTR [BP-4],4 ; ee = (struct EtherEncapsulation *) temp; ; BX ← ←temp POP BX PUSH BX ; ←ee ← BX MOV [BP-2],BX ; if (ee->type == 2) return(rxPBI); /* Swabbed typePup */ ; BX ← ←ee MOV BX,[BP-2] MOV CX,[BX+2] MOV BX,CX CMP BX,2 JNZ X3 MOV BX,←rxPBI MOV SP,BP POP BP RET; X3: ; }; X2: ; SStartRx(rxPBI, rxLength) MOV BX,←rxLength MOV CX,←rxPBI CALL ←SStartRx ; }; X1: ; if (TmrExp(&rxTmr)) { LEA BX,←rxTmr CALL ←TmrExp OR BX,BX JZ X4 ; SLCReset(); /* violent ! */ CALL ←SLCReset ; SStartRx(rxPBI, rxLength) MOV BX,←rxLength MOV CX,←rxPBI CALL ←SStartRx ; return (0); XOR BX,BX MOV SP,BP POP BP RET; ; }; X4: ; return (0); XOR BX,BX MOV SP,BP POP BP RET; ; }; ; int EtherHost() ←EtherHost: PUSH BP MOV BP,SP ; { ; return (FetchW(0xFFFE)); MOV BX,0FFFEX CALL ←FetchW MOV SP,BP POP BP RET; ; }; ; SLCReset() ←SLCReset: PUSH BP MOV BP,SP ; { ; SLCInit(EtherHost()); CALL ←EtherHost CALL ←SLCInit ; }; MOV SP,BP POP BP RET; ; static struct ccb txccb; ; static int txTmr; ; SStartTx(pbi) ←SStartTx: ; struct PBI *pbi; PUSH BP MOV BP,SP PUSH BX ; { ; int len; PUSH DX ; len = Swab(pbi->pup->length); ; BX ← ←pbi MOV BX,[BP-2] MOV CX,[BX+6] MOV DI,CX MOV BX,[DI] CALL ←Swab ; ←len ← BX POP DX PUSH BX ; len = (len + 5) & 0x0fffe; ; BX ← ←len POP BX ADD BX,5 AND BX,0FFFEX ; ←len ← BX PUSH BX ; txccb.cmda = 0x50; MOV ←txccb,050X ; txccb.addra = pbi->pup; ; BX ← ←pbi MOV BX,[BP-2] MOV CX,[BX+6] MOV WORD PTR ←txccb+1,CX ; txccb.addra = txccb.addra - 4; MOV BX,WORD PTR ←txccb+1 ADD BX,0FFFCX MOV WORD PTR ←txccb+1,BX ; txccb.counta = len & 0x00ff; ; BX ← ←len POP BX PUSH BX AND BX,0FFX MOV ←txccb+3,BL ; txccb.stata = 0; MOV ←txccb+4,0 ; SLTStart(&txccb); LEA BX,←txccb CALL ←SLTStart ; SetTmr(200, &txTmr); LEA BX,←txTmr MOV CX,0C8X CALL ←SetTmr ; }; MOV SP,BP POP BP RET; ; SCheckTx() ←SCheckTx: PUSH BP MOV BP,SP ; { ; if (txccb.stata & 0x80) return(true); MOV AX,WORD PTR ←txccb+4 AND AL,080X OR AL,AL JZ X5 MOV BX,0FFFFX MOV SP,BP POP BP RET; X5: ; if (TmrExp(&txTmr)) { LEA BX,←txTmr CALL ←TmrExp OR BX,BX JZ X6 ; SLCReset(); /* violent ! */ CALL ←SLCReset ; return(true); MOV BX,0FFFFX MOV SP,BP POP BP RET; ; }; X6: ; return(false); XOR BX,BX MOV SP,BP POP BP RET; ; }; ; Externals Declared Here PUBLIC ←SStartRx PUBLIC ←SCheckRx PUBLIC ←SLCReset PUBLIC ←EtherHost PUBLIC ←SStartTx PUBLIC ←SCheckTx C←CODE ENDS ; Number of Bytes of Code = 0160X, (352)