;Alto->8086 small-c compiler rev 2.0
C←CODE SEGMENT
$INCLUDE(8086LIB.D)
$INCLUDE(d8274.DEC)
ASSUME CS:C←CODE, DS:C←DATA
; extern OutByte();
; extern InByte();
; extern Block();
; Init8274()
←Init8274:
PUSH BP
MOV BP,SP
; {
; };
MOV SP,BP
POP BP
RET;
; nbPutChar(c)
←nbPutChar:
; char c;
PUSH BP
MOV BP,SP
PUSH BX
; {
; while (!SIOFree(0));
X1:
XOR BX,BX
CALL ←SIOFree
OR BX,BX
JNZ X2
JR X1
X2:
; SIOPutC(0, c);
; AX ← ←c
POP AX
PUSH AX
CBW
MOV BX,AX
XOR CX,CX
CALL ←SIOPutC
; };
MOV SP,BP
POP BP
RET;
; PutChar(c)
←PutChar:
; char c;
PUSH BP
MOV BP,SP
PUSH BX
; {
; PutC(0, c);
; AX ← ←c
POP AX
PUSH AX
CBW
MOV BX,AX
XOR CX,CX
CALL ←PutC
; };
MOV SP,BP
POP BP
RET;
; PutCRChar(c)
←PutCRChar:
; char c;
PUSH BP
MOV BP,SP
PUSH BX
; {
; PutChar(c);
; AX ← ←c
POP AX
PUSH AX
CBW
MOV BX,AX
CALL ←PutChar
; if (c=='\r') PutChar('\n');
; AL ← ←c
POP AX
PUSH AX
CMP AL,0DX
JNZ X3
MOV BX,0AX
CALL ←PutChar
X3:
; };
MOV SP,BP
POP BP
RET;
; PutC(ch, c)
←PutC:
; int ch;
; char c;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; while (!SIOFree(ch)) Block();
X4:
; BX ← ←ch
MOV BX,[BP-2]
CALL ←SIOFree
OR BX,BX
JNZ X5
CALL ←Block
JR X4
X5:
; SIOPutC(ch, c);
; AX ← ←c
POP AX
PUSH AX
CBW
MOV BX,AX
; CX ← ←ch
MOV CX,[BP-2]
CALL ←SIOPutC
; };
MOV SP,BP
POP BP
RET;
; int GetChar()
←GetChar:
PUSH BP
MOV BP,SP
; {
; return(GetC(0));
XOR BX,BX
CALL ←GetC
MOV SP,BP
POP BP
RET;
; };
; int GetC(ch)
←GetC:
; int ch;
PUSH BP
MOV BP,SP
PUSH BX
; {
; while (!AvC(ch)) Block();
X6:
; BX ← ←ch
POP BX
PUSH BX
CALL ←AvC
OR BX,BX
JNZ X7
CALL ←Block
JR X6
X7:
; return(SIOGetC(ch) & 0177);
; BX ← ←ch
POP BX
PUSH BX
CALL ←SIOGetC
AND BX,07FX
MOV SP,BP
POP BP
RET;
; };
; int Chav()
←Chav:
PUSH BP
MOV BP,SP
; {
; return(AvC(0));
XOR BX,BX
CALL ←AvC
MOV SP,BP
POP BP
RET;
; };
; int AvC(ch)
←AvC:
; int ch;
PUSH BP
MOV BP,SP
PUSH BX
; {
; ch = SIOCmdP(ch);
; BX ← ←ch
POP BX
PUSH BX
CALL ←SIOCmdP
; ←ch ← BX
POP DX
PUSH BX
; return(InByte(ch)&01);
; BX ← ←ch
POP BX
PUSH BX
CALL ←InByte
AND BX,1
MOV SP,BP
POP BP
RET;
; };
; Baud(mbr, ch)
←Baud:
; int mbr, ch;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; int dr, load, hold;
; if (ch == 0) { /* use 9513 channel 0 (FOUT) */
ADD SP,0FFFAX
; BX ← ←ch
MOV BX,[BP-4]
OR BX,BX
JNZ X8
; if (mbr == 300) { MM(0x0ac0); WR4(ch, 0x008c); };
; BX ← ←mbr
MOV BX,[BP-2]
CMP BX,012CX
JNZ X9
MOV BX,0AC0X
CALL ←MM
MOV BX,08CX
; CX ← ←ch
MOV CX,[BP-4]
CALL ←WR4
; else WR4(ch, 0x4c);
JR X10
X9:
MOV BX,04CX
; CX ← ←ch
MOV CX,[BP-4]
CALL ←WR4
X10:
; if (mbr==600) MM(0x0ac0);
; BX ← ←mbr
MOV BX,[BP-2]
CMP BX,0258X
JNZ X11
MOV BX,0AC0X
CALL ←MM
X11:
; if (mbr==1200) MM(0x088c0);
; BX ← ←mbr
MOV BX,[BP-2]
CMP BX,04B0X
JNZ X12
MOV BX,088C0X
CALL ←MM
X12:
; if (mbr==2400) MM(0x084c0);
; BX ← ←mbr
MOV BX,[BP-2]
CMP BX,0960X
JNZ X13
MOV BX,084C0X
CALL ←MM
X13:
; if (mbr==4800) MM(0x082c0);
; BX ← ←mbr
MOV BX,[BP-2]
CMP BX,012C0X
JNZ X14
MOV BX,082C0X
CALL ←MM
X14:
; if (mbr==9600) MM(0x08a00);
; BX ← ←mbr
MOV BX,[BP-2]
CMP BX,02580X
JNZ X15
MOV BX,08A00X
CALL ←MM
X15:
; if (mbr==19200) MM(0x08500);
; BX ← ←mbr
JR $+5
X8:
JMP X17
MOV BX,[BP-2]
CMP BX,04B00X
JNZ X16
MOV BX,08500X
CALL ←MM
X16:
; };
X17:
; if (ch==1) { /* use 9513 channel 4 */
; BX ← ←ch
MOV BX,[BP-4]
CMP BX,1
JNZ X18
; WR4(ch, 0x4c); /* always use /16 mode */
MOV BX,04CX
; CX ← ←ch
MOV CX,[BP-4]
CALL ←WR4
; mbr = mbr/100;
; AX ← ←mbr
MOV AX,[BP-2]
MOV BX,064X
CWD
IDIV AX,BX
; ←mbr ← AX
MOV [BP-2],AX
; dr = 960/mbr; /* 960 = 15360/16 (16 for 8274 division ratio) */
MOV AX,03C0X
; BX ← ←mbr
MOV BX,[BP-2]
CWD
IDIV AX,BX
; ←dr ← AX
MOV [BP-6],AX
; hold = dr/2;
; BX ← ←dr
MOV BX,[BP-6]
SAR BX
; ←hold ← BX
POP DX
PUSH BX
; load = dr-hold;
; BX ← ←hold
POP BX
PUSH BX
; CX ← ←dr
MOV CX,[BP-6]
SUB CX,BX
; ←load ← CX
MOV [BP-8],CX
; OutByte(TimCtl, 0xc8); /* disarm ch 4 */
MOV BX,0C8X
MOV CX,060X
CALL ←OutByte
; OutByte(TimCtl, 0x04); /* set data pointer for ch 4 */
MOV BX,4
MOV CX,060X
CALL ←OutByte
; OutWord(TimData, 0x1b62); /* Mode J, src F1, toggle, count up, binary */
MOV BX,01B62X
MOV CX,062X
CALL ←OutWord
; OutWord(TimData, load);
; BX ← ←load
MOV BX,[BP-8]
MOV CX,062X
CALL ←OutWord
; OutWord(TimData, hold);
; BX ← ←hold
POP BX
PUSH BX
MOV CX,062X
CALL ←OutWord
; OutByte(TimCtl, 0x48); /* load ch 4 */
MOV BX,048X
MOV CX,060X
CALL ←OutByte
; OutByte(TimCtl, 0x28); /* arm ch 4 */
MOV BX,028X
MOV CX,060X
CALL ←OutByte
; };
X18:
; };
MOV SP,BP
POP BP
RET;
; static SIOFree(ch)
←SIOFree:
; int ch;
PUSH BP
MOV BP,SP
PUSH BX
; {
; ch = SIOCmdP(ch);
; BX ← ←ch
POP BX
PUSH BX
CALL ←SIOCmdP
; ←ch ← BX
POP DX
PUSH BX
; return(InByte(ch)&04);
; BX ← ←ch
POP BX
PUSH BX
CALL ←InByte
AND BX,4
MOV SP,BP
POP BP
RET;
; };
; static SIOGetC(ch)
←SIOGetC:
; int ch;
PUSH BP
MOV BP,SP
PUSH BX
; {
; ch = SIODataP(ch);
; BX ← ←ch
POP BX
PUSH BX
CALL ←SIODataP
; ←ch ← BX
POP DX
PUSH BX
; return(InByte(ch)&0177);
; BX ← ←ch
POP BX
PUSH BX
CALL ←InByte
AND BX,07FX
MOV SP,BP
POP BP
RET;
; };
; static SIOPutC(ch, v)
←SIOPutC:
; int ch;
; char v;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; ch = SIODataP(ch);
; BX ← ←ch
MOV BX,[BP-2]
CALL ←SIODataP
; ←ch ← BX
MOV [BP-2],BX
; OutByte(ch, v);
; AX ← ←v
POP AX
PUSH AX
CBW
MOV BX,AX
; CX ← ←ch
MOV CX,[BP-2]
CALL ←OutByte
; };
MOV SP,BP
POP BP
RET;
; static SIOCmdP(ch)
←SIOCmdP:
; int ch;
PUSH BP
MOV BP,SP
PUSH BX
; {
; if (ch==0) ch = sioctla;
; BX ← ←ch
POP BX
PUSH BX
OR BX,BX
JNZ X19
MOV WORD PTR [BP-2],032X
; else ch = sioctlb;
JR X20
X19:
MOV WORD PTR [BP-2],030X
X20:
; return(ch);
; BX ← ←ch
POP BX
PUSH BX
MOV SP,BP
POP BP
RET;
; };
; static SIODataP(ch)
←SIODataP:
; int ch;
PUSH BP
MOV BP,SP
PUSH BX
; {
; if (ch==0) ch = siodata;
; BX ← ←ch
POP BX
PUSH BX
OR BX,BX
JNZ X21
MOV WORD PTR [BP-2],036X
; else ch = siodatb;
JR X22
X21:
MOV WORD PTR [BP-2],034X
X22:
; return(ch);
; BX ← ←ch
POP BX
PUSH BX
MOV SP,BP
POP BP
RET;
; };
; static MM(rv)
←MM:
; int rv;
PUSH BP
MOV BP,SP
PUSH BX
; {
; OutByte(TimCtl, 0x17);
MOV BX,017X
MOV CX,060X
CALL ←OutByte
; OutWord(TimData, rv);
; BX ← ←rv
POP BX
PUSH BX
MOV CX,062X
CALL ←OutWord
; };
MOV SP,BP
POP BP
RET;
; static WR4(ch, rv)
←WR4:
; int ch, rv;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; ch = SIOCmdP(ch);
; BX ← ←ch
MOV BX,[BP-2]
CALL ←SIOCmdP
; ←ch ← BX
MOV [BP-2],BX
; OutByte(ch, 0x04);
MOV BX,4
; CX ← ←ch
MOV CX,[BP-2]
CALL ←OutByte
; OutByte(ch, rv&0xff);
; BX ← ←rv
POP BX
PUSH BX
AND BX,0FFX
; CX ← ←ch
MOV CX,[BP-2]
CALL ←OutByte
; };
MOV SP,BP
POP BP
RET;
; static OutWord(port, val)
←OutWord:
; int port, val;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX
; {
; OutByte(port, val&0xff);
; BX ← ←val
POP BX
PUSH BX
AND BX,0FFX
; CX ← ←port
MOV CX,[BP-2]
CALL ←OutByte
; OutByte(port, (val >> 8)&0xff);
MOV CX,8
; BX ← ←val
POP BX
PUSH BX
SHR BX,CX
AND BX,0FFX
; CX ← ←port
MOV CX,[BP-2]
CALL ←OutByte
; };
MOV SP,BP
POP BP
RET;
; Externals Declared Here
PUBLIC ←Init8274
PUBLIC ←nbPutChar
PUBLIC ←PutChar
PUBLIC ←PutC
PUBLIC ←PutCRChar
PUBLIC ←GetChar
PUBLIC ←GetC
PUBLIC ←AvC
PUBLIC ←Chav
PUBLIC ←Baud
C←CODE ENDS
; Number of Bytes of Code = 02C2X, (706)