|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8064 (0x1f80)
Types: TextFile
Names: »GNHP747X.A86«
└─⟦369075929⟧ Bits:30004202 GSX driver sourcer disk 1
└─⟦this⟧ »GNHP747X.A86«
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»