|
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 - 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»