; Lark peripheral initialization
; Personalized for TeleLoad

; L. Stewart, January 4, 1982  8:13 PM


C←CODE SEGMENT

SPIN EQU   3FF0H

C←DATA SEGMENT

←mstate	LABEL	BYTE
rax	DW	?
rbx	DW	?
rcx	DW	?
rdx	DW	?
rsp	DW	?
rbp	DW	?
rsi	DW	?
rdi	DW	?
rcs	DW	?
rds	DW	?
rss	DW	?
res	DW	?
rip	DW	?
rfl	DW	?

C←DATA ENDS

EXTRN   ←main:NEAR

ASSUME CS:C←CODE, DS:C←DATA
←cstart:
   MOV   AX,SPIN
   MOV   SP,AX
   MOV   AX,CS
   MOV   SS,AX
   MOV   ES,AX
   MOV   DS,AX
   CALL   ←main
   JMP   DWORD PTR JHUNK

JHUNK   DW   00H
    DW   0FFFFH

; The format of this stuff is <port address><byte count><bytes>
; port FF terminates the list

; first set up the 8255 and reset all its outputs
←IRESET LABEL BYTE
  DB 0D3H
  DB  1
  DB  088H   ; Port A, B C[0..3] output, C[4..7] input

  DB  0D0H
  DB  1
  DB  000H

  DB  0D1H
  DB  1
  DB  000H

  DB  0D2H
  DB  1
  DB  000H

; reset both DMA controllers
  DB  04FH
  DB  1
  DB  00FH

  DB  01FH
  DB  1
  DB  00FH

  DB  04DH
  DB  1
  DB  000H

  DB  01DH
  DB  1
  DB  000H

; Set up SLC controller only

  DB  048H
  DB  1
  DB  020H

  DB  04BH
  DB  1
  DB  0C1H

  DB  04FH
  DB  1
  DB  00DH

  DB  0FFH

;portstr(p)
;  char *p;
;  {
;  int port;
;  int count;
;  while(*p != 0x00ff) {
;    port = *p++;
;    count = *p++;
;    while (count--) {
;      outbyte(port, *p++);
;      };
;    };
;  };
; enters with BX pointer to port string

←portstr LABEL NEAR
   XOR   AH,AH
   CLD
   MOV   SI,BX
X16:
   LODSB
   CMP   AL,0FFH
   JNE   X17
   RET
X17:
   MOV   DX,AX
   LODSB
   MOV   CX,AX
X18:
   LODSB
   OUT   DX,AL
   LOOP  X18
   JMP   X16

←startm LABEL NEAR
	MOV	AX,rss
	MOV	SS,AX
	MOV	AX,rsp
	MOV	SP,AX
	PUSH	rfl
	PUSH	rcs
	PUSH	rip
	MOV	BX,rbx
	MOV	CX,rcx
	MOV	DX,rdx
	MOV	SI,rsi
	MOV	DI,rdi
	MOV	BP,rbp
	MOV	AX,rax
	PUSH	res
	PUSH	rds
	POP	DS
	POP	ES
	IRET

PUBLIC  ←IRESET
PUBLIC  ←portstr
PUBLIC  ←mstate
PUBLIC  ←startm

C←CODE ENDS
	END