DataMuseum.dk

Presents historical artifacts from the history of:

Christian Rovsing CR7, CR8 & CR16 CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦030d53ec6⟧ TextFile

    Length: 8064 (0x1f80)
    Types: TextFile
    Names: »GNHP747X.A86«

Derivation

└─⟦369075929⟧ Bits:30004202 GSX driver sourcer disk 1
    └─ ⟦this⟧ »GNHP747X.A86« 

TextFile

pagesize 56

line_status	equ	404h
rx_buffer	equ	400h
tx_buffer	equ	400h

Dgroup  Group   AsmData
AsmData Dseg	Common	Word

DataSP	Rw	0
	Rw	375
MyStack Rw	1
StOff	Rw	1
StSeg	Rw	1
Hi_Result	Rw	1
Low_Result	Rw	1
string		db	'zyxg'
first_time	db	0

	CSeg

	Extrn	DD747x:Near
	Public	LFetch
LFetch: Push	Bp
	Mov	Bp, Sp
	Push	Es
	Push	Bx
	Push	Si
	Mov	Es, +4ÆBpÅ
	Mov	Bx, +6ÆBpÅ
	Mov	Si, +8ÆBpÅ
	Shl	Si,1
	Mov	Ax, Es:WORD PTR ÆBx+SiÅ
	Pop	Si
	Pop	Bx
	Pop	Es
	Pop	Bp
	Ret

	Public	LStore
LStore: Push	Bp
	Mov	Bp, Sp
	Push	Es
	Push	Ax
	Push	Di
	Push	Bx
	Mov	Es, +4ÆBpÅ
	Mov	Bx, +6ÆBpÅ
	Mov	Di, +8ÆBpÅ
	Shl	Di,1	
	Mov	Ax, +10ÆBpÅ
	Mov	Es:WORD PTR ÆBx+DiÅ, Ax
	Pop	Bx
	Pop	Di
	Pop	Ax
	Pop	Es
	Pop	Bp
	Ret

Driver:
	Push	Ds
	Pop	Bx
	Push	Ds
	Mov	Ax, Seg DataSp
	Mov	Ds, Ax
	Mov	StOff, Sp
	Mov	Ax, Ss
	Mov	StSeg, Ax
	Mov	Ax, Ds
	Mov	Ss, Ax
	Mov	Sp, Offset MyStack
	Push	Bp
	Push	Dx
	Push	Bx

	Call	Dd747x

	Pop	Es			; Trash top parameter
	Pop	Dx
	Pop	Bp
	Mov	Ax, StSeg
	Mov	Ss, Ax
	Mov	Sp, StOff
	Pop	Ds
	Retf

Gdos_Int	Equ	224
Gdos_Funct	Equ	115

; CP/M-86 I/O Routines

; Small model C Callable

Param	Equ	Ss:(Word Ptr .8)ÆBpÅ	; Parameter address in stack
;	Sp+6	Offset Param
;	  +2	Offset Retaddr
; ÆBpÅ: Sp	OldBp

	Public	TtyIn
TtyIn:	Mov	Bx,00203h		; Channel 3 Get char, wait
	Push	Di
	Push	Si

All_In: Callf	Char_IO 		; Call Bdos via Gdos via first-time sw

Valid_Char:
	And	Dx,07fh 		; Mask off high order bit

Stuff_Char:
	Push	Bp			; Save caller's stack frame
	Mov	Bp,Sp			; Make my own frame

	Push	Ss
	Pop	Es
	Mov	Di,param		; Get pointer to parameter
	Mov	Es:(Word Ptr .0)ÆDiÅ,Dx ; Stuff character

	Pop	Bp			; & Bp
	Pop	Si
	Pop	Di
	Ret


	Public TtyINW
TtyINW: Mov	Bx,00303h		; Channel 3, Get char, no wait
	Push	Di
	Push	Si

	Callf	Char_IO 		; Call Bdos via Gdos via first-time sw

	Js	Valid_Char		; Jump if valid char in Dl

	Mov	Dl,-1			; Return -1 if not ready
	Jmps	Stuff_Char		; Go to common stuffer

	Public	RdrIn
RdrIn:	
	Push	Di
	Push	Si			
	push	ax
	mov	al,0ffh
	xchg	al,first_time
	test	al,al
	jnz	not_first_time
	call	hwinit
not_first_time:
in_loop: 
        mov     dx,sio1a_cmd
        mov     al,10H
        out     dx,al
        nop
        nop
        mov     al,0
        out     dx,al
	mov	dx,line_status
	in	al,dx
	test	al,1h
	jz	in_loop 		;wait for char in input buffer
	mov	dx,rx_buffer
	in	al,dx			;get character
	mov	dl,al			;save it in dl
	mov	dh,0h
	pop	ax
	jmps	valid_char
;	
	Eject

	Public TtyOut
TtyOut: Mov	Bx,00603h		; Channel 3, wait, output
	Push	Di
	Push	Si

AllOut: Push	Bp			; Save caller's Bp
	Mov	Bp,Sp			; Point into stack

	Mov	Dl,(Byte Ptr .8)ÆBpÅ	; Get the character to show
	Mov	Dh,0			; High order zero

	Callf	Char_IO 		; Call Bdos via Gdos via first-time sw

	Pop	Bp			; & Bp
	Pop	Si
	Pop	Di
	Ret

	Public	PchOut
PchOut: 	
	push	ax
	push	dx
	push	bp			;have to do three pushes
	mov	bp,sp			;get param address in bp
	mov	al,0ffh
	xchg	al,first_time
	test	al,al
	jnz	not_first
	call	hwinit
not_first:
out_loop: 
        mov     dx,sio1a_cmd
        mov     al,10H
        out     dx,al
        nop
        nop
        mov     al,0
        out     dx,al
	mov	dx,line_status
	in	al,dx
	and     al,24H
	cmp     al,24H
	jne	out_loop		;wait trans buffer to empty

	mov	dx,tx_buffer
	mov	al,(byte ptr .8)ÆbpÅ	;get char to output
	out	dx,al			;send character
	pop	bp
	pop	dx
	pop	ax
	ret
;	
	Public LptOut
LptOut: Mov	Bx,00605h		; Channel 5, wait, output
	Push	Di
	Push	Si
	Jmps	AllOut			; Go do common Int

	Public	TtyInE
TtyInE: Push	Bp			; Save caller's Bp
	Mov	Bp,Sp			; Point into stack
	Push	Di
	Push	Si

	Mov	Dx,Param		; Point Ds:Dx to buffer
	Mov	Bx,00803h		; Read Console Buffer opcode

	Callf	Char_IO 		; Call Bdos via Gdos via first-time sw

	Pop	Si
	Pop	Di
	Pop	Bp			; & Bp
	Ret

	Eject

Char_IO:
	Test	CIO_Segment,0ffffh	; Already found where it is?
	Jz	Find_It 		; Jump if need to find layer 1

Char_jmpf:
;		Jmpf	Far Ptr 0:0	; Hard jump becomes Jmpf layer1
		db	0eah		; Jmpf
CIO_Offset	DW	0		; Offset
CIO_Segment	Dw	0		;   & Seg

Find_it:
	Push	Ax			; Save registers
	Push	Bx
	Push	Cx
	Push	Es

	Mov	Cx,01600h+Gdos_Funct	; GDdos "Return Layer Pointer" function
	Int	Gdos_Int		; Get ptr to layer 1 table entry

	Les	Bx,Es:(DWord Ptr 1)ÆBxÅ ; Es:Bx <- Ptr to layer 1
	Mov	CIO_Offset,Bx		; Fix up jump
	Mov	CIO_Segment,Es

	Pop	Es			; Restore registers
	Pop	Cx
	Pop	Bx
	Pop	Ax
	Jmps	Char_Jmpf		; & call Char I/O layer 1


	Public	MULDIV
MULDIV:
;*********************************************************************;
;								      ;
;    Function: Do 32 bit multiply and divide			      ;
;								      ;
;    Input Parameters:						      ;
;	    multiply1  - first arg for multiply 		      ;
;	    multiply2  - second arg for multiply		      ;
;	    divarg     - divide argument			      ;
;								      ;
;    Output Parameters: 					      ;
;	    none						      ;
;    Functional Output: 					      ;
;	    result of (multiply1 * multiply2)/divarg		      ;
;								      ;
;    Routines Called:						      ;
;	    none						      ;
;*********************************************************************;
	Push	Bp
	Mov	Bp,Sp

;
;  result = muldiv(m1,m2,d)
;
	Xor	Dx, Dx
	Mov	Ax, (Word Ptr .4) ÆBpÅ
	IMul	(Word Ptr .6) ÆBpÅ
	Mov	Bx,(Word Ptr .8) ÆBpÅ
	IDiv    Bx

	Pop	Bp
	Ret

	Public	INTERCPT
INTERCPT:
;*********************************************************************;
;								      ;
;    Function: Do 32 bit multiply and divide for specific formula:    ;
;	INTERCPT=((raster-y2)*x1-(raster-y1)*x2)/(y1-y2+sign*(x1-x2)) ;      
;								      ;
;    Input Parameters:						      ;
;	    raster						      ;
;	    sign						      ;
;	    x1							      ;
;	    y1							      ;
;	    x2							      ;
;	    y2							      ;
;								      ;
;    Output Parameters: 					      ;
;	    none						      ;
;    Functional Output: 					      ;
;	    result of formula					      ;
;								      ;
;    Routines Called:						      ;
;	    none						      ;
;*********************************************************************;
	Push	Bp
	Mov	Bp, Sp
;
;  Result = ((raster-y2)*x1)/(y1-y2+sign*(x1-x2)) - (raster-y1)*x2)/(y1-y2+sign*(x1-x2))
;
	Xor	Dx, Dx
	Mov	Ax, (Word Ptr .8) ÆBpÅ		; Load x1
	Sub	Ax, (Word Ptr .12) ÆBpÅ 	;   - x2
	IMul	(Word Ptr .6) ÆBpÅ		;   * sign
	Add	Ax, (Word Ptr .10) ÆBpÅ 	;   + y1
	Sub	Ax, (Word Ptr .14) ÆBpÅ 	;   - y2
	Mov	Bx, Ax

	Xor	Dx, Dx
	Mov	Ax, (Word Ptr .4) ÆBpÅ		; Load raster
	Sub	Ax, (Word Ptr .14) ÆBpÅ 	;   - y2
	IMul	(Word Ptr .8) ÆBpÅ		;   * x1 
	Mov	Low_Result, Ax
	Mov	Hi_Result, Dx

	Xor	Dx, Dx
	Mov	Ax, (Word Ptr .4) ÆBpÅ		; Load raster
	Sub	Ax, (Word Ptr .10) ÆBpÅ 	;   - y1
	IMul	(Word Ptr .12) ÆBpÅ		;   * x2

	Sub	Word Ptr Low_Result, Ax 	;   - (raster-y1)*x2
	Sbb	Hi_Result, Dx
	Mov	Ax, Low_Result
	Mov	Dx, Hi_Result

	IDiv	Bx

	Pop	Bp
	Ret

;	setup af sio1a til 9600 baud async 7 bit no parity no autoenable

pit_sio1a_reg	equ	580h
pit_sio1b_reg	equ	582h
pit_cmd_reg	equ	586h
pit_cmd		equ	36h
pit_9600_lsb	equ	8
pit_9600_msb	equ	0

sio1a_cmd	equ	404h
wr0		equ	18h
wr1		equ	0
wr3		equ	0e1h
wr4		equ	44h
wr5		equ	0eah

hwinit:
	mov	dx,sio1a_cmd
	mov	al,wr0
	out	dx,al
	nop  !  nop
	mov	al,4
	out	dx,al
	nop  !  nop
	mov	al,wr4
	out	dx,al
	nop  !  nop
	mov	al,1
	out	dx,al
	nop  !  nop
	mov	al,wr1
	out	dx,al
	nop  !  nop
	mov	al,3
	out	dx,al
	nop  !  nop
	mov	al,wr3
	out	dx,al
	nop  !  nop
	mov	al,5
	out	dx,al
	nop  !  nop
	mov	al,wr5
	out	dx,al
	nop  !  nop

	mov	dx,pit_cmd_reg
	mov	al,pit_cmd
	out	dx,al
	nop  !  nop
	mov	dx,pit_sio1a_reg
	mov	al,pit_9600_lsb
	out	dx,al
	nop  !  nop
	mov	al,pit_9600_msb
	out	dx,al
	ret

	End	Driver
«eof»