;**************************************************
;
;		BASICODE TEST
;
;  DIT OPENBAAR PROGRAMMA MAG GECOPIEERD EN GEDISTRIBEERD
;  WORDEN,  MITS INHOUDENDE DE VOLGENDE COPYRIGHT NOTICE
;
;   "         DIT PROGRAMMA
;     BETREFFENDE EEN IMPLEMENTATIE VAN DE
;		NOS BASICODE
;
;   IS TER BESCHIKKING GESTELD DOOR DE
;	HOBBY COMPUTER CLUB (HOLLAND)      "
;
;
;  NOS 	P.O. 1200 	1200BE HILVERSUM	(HOBBYSCOOP)
;  HCC  P.O. 149	2250AC VOORSCHOTEN	(CP/M gg)
;
;   Implementatie:
;		Albert van der Horst
;	t.b.v.  FORTH gebruikersgroep (HCC)
;
;**************************************************
;
;  Test een bandje geschreven volgens het
;         BASICODE protocol
;  De sterretjes die op het scherm verschijnen,
;  moeten zo goed mogelijk onder elkaar komen.
;  Dit programma is waarschijnlijk niet goed aan 
;  te passen wanneer er geen memory mapped video is.
;
;**************************************************
;
;	Algemene opmerking:
;	Daar ook CP/M de registers van de Z80 niet
;	intact laat bij aanroepen naar het systeem,
;	is hier de regel aanhouden dat registers altijd
;	verpest worden door subroutines, tenzij anders
;	vermeld.
;
;*************************************************

;------------- VERANDERLIJKE EQUATES ---------------
;
; 	In het algemeen zal men voor ieder type computer
;       een verantwoorde keus moeten maken uit de volgende
;	opties, alsmede hardware adressen in moeten vullen.
;
; ASSEMBLER SWITCH	  ALS HIJ 1 IS, BETEKENT HET DAT 
MEMMAP	EQU 1	; De Centronics poort is 'memory mapped'
OSBRN	EQU 1	; Speciaal voor OSBORNE: bank switching	

; HARDWARE EQUATES
PAPORT	EQU	2900H	; Parallel port (memory mapped)
SCREEN	EQU	0F000H	; Memory mapped video screen
DEL12	EQU	90	; Delay loop voor '0' bit (4 MHz)
DEL24	EQU	44	; Delay loop voor '1' bit (4 MHz)

;
;------------- VASTE EQUATES --------------------------------

BDOS	EQU	5H
DMA	EQU	80H
STX	EQU	02H
ETX	EQU	03H
LF	EQU	0AH
CR	EQU	0DH
CTRLZ	EQU	1AH	; Control-Z
FCB	EQU	5CH	; Standaard file control block

;-------------------------------------------------

	ORG	100H
	CALL	PRINT
 DB CTRLZ,LF,LF,LF,LF,LF,' ** CPM BASICODE TEST '
 DB '**  RELEASE 1.0',CR,LF,LF,0

	JMP	STACK	

;
; ================================================
;

	IF	NOT OSBRN	; Normale situatie
	DS	20H		; Reserveer stack ruimte
	ENDIF

	IF	OSBRN	; Programma moet boven 4000H draaien
	ORG	4020H	; wegens Osborne bankswitching
	ENDIF

STACK:	
	LXI	H,STACK	; Initialiseer stack
	SPHL

	IF	OSBRN
        CALL	BANK2
   	ENDIF

; - - - - - INITIALISATIE - - - - - - - - - - - - 
;
;     Tellers gaan mis bij interrupts

	DI 

; - - - - - TESTEN VAN INPUT SIGNAAL - - - - - - 

	LXI	H,PAPORT+2
REP1:	CALL	BITPS
	JZ	OUT1	; Z: Timeout
;
; - - - - - BEREKEN NIEUW ADRES OP VIDEO PAG - - - - - -

	ANI	40H	; 0 of 1 fase ingangssignaal?
	RAL
	RAL
	RAL
	ADI	0F0H	; kies uit 1e of 3e regel
	MOV	D,A

; - - - - - WIS OUDE STERRETJE - - - - - - - - - -

	MVI	A,' '
	STAX	B

; - - - - - ZET NIEUW STERRETJE - - - - - - - - - 

	MOV	A,E		; deel E door 2
	RAR
	MOV	E,A

	MOV	C,E
	MOV	B,D
	MVI	A,'*'
	STAX	B
	JMP	REP1

; - - - - - AFBREKEN? - - - - - - - - - - - - 
; 
;    ( OSBORNE :Schakel even terug naar de andere bank
;    Kijk of er een toets is ingedrukt,
;    dan ophouden.
 
OUT1:	
	IF	OSBRN
	CALL	BANK1
	ENDIF

	CALL	KBD
	PUSH	PSW

	IF	OSBRN
	CALL	BANK2
	ENDIF

	POP	PSW
	JNC	REP1
	CALL	BANK1
	JMP	0	; STOP

;**************************************************
;
;     subroutine gebied
;
;**************************************************
;
;--------------  SWITCH NAAR BANK 2 -------------
;	
;  Zie OSBORNE User Guide 262 ( REV.12/15/82)
;  interrupts zijn al disabled!
;  En moeten dat blijven !
                 
	IF	OSBRN
BANK2:	OUT	0
	MVI	A,0
	STA	0EF08H	
	RET

; -------------  SWITCH NAAR BANK 1 -------------  
;
;  Zie BANK2

BANK1:	OUT	1
	MVI	A,1
	STA	0EF08H	
	RET
	ENDIF


; - - - - - -  MEET LENGTE PERIODE - - - - - 
;
; Normaal ca. 23 perioden (1) of 46 (0) 
; Geeft gemeten lengte terug in E
; HL wijst al naar de poort
; Z bij return wijst op time-out
;
BITPS:	MOV	A,M	; Lees poort
	MVI	E,0	; Init teller

REP5:	INR	E	; Meet lengte
	RZ		; Timeout
	CMP	M	; Veranderd?
	JZ	REP5	; Zo niet herhaal
	RET

; - - - - - - PRINT AN INLINE STRING - - - - - - - - - -

PRINT	POP	H	; HAAL RETURN ADDRESS OP
	MOV	A,M	; GET CHARACTER
	INX	H
	ORA	A
	JZ	END5
	PUSH	H
	CALL	CRT
	JMP	PRINT
END5	PCHL		; RETURN


;=================================================
;
;            INTERFACING WITH CP/M
;            ---------------------
;
;=================================================

;----------------  FUNKTIE SCAN FOR CHAR ----------------
;
KBD	PUSH	H
	PUSH	B
	EI
	MVI	C,0BH	; Als de carry op staat is er een 
	CALL	BDOS	;  toets ingedrukt
	ANI	1
	JZ	NOCHAR
	MVI	C,1
	CALL	BDOS
	STC
	JMP	RETURN
NOCHAR	XRA	A	; Clear carry
RETURN	POP	B
	POP	H
	DI
	RET	

;   zero flag : geen character ingetoetst

KEYBRD	PUSH	H
	PUSH	B
	MVI	C,0BH	
	CALL	BDOS
	ANI	1
	POP	B
	POP	H
	RET	

; -------------  FUNKTIE PRINT A CHAR ------------- - 
   
CRT	MOV	E,A	; OUTPUTS 'A' IN ASCII
	MVI	C,2	
	CALL	BDOS	
	RET



