TITLE   'XMODEM PATCH FILE FOR TURBODOS'
;
; TDPAT - patch file for TurboDOS / XMODEM
; uses COMM port
;
; EDITED: 07/14/84      SFK
;
BASE    EQU     100H            ;start of TPA
;
PORT    EQU     0               ;0=modem port, 1=console port
;
;-------------------------------------------------------------------
;
; Jump table: The jump table must be in exactly the same sequence
; as the one in XMODEM. Note the ORG of 103H - This jump table has
; no jump to BEGIN.
;
       ORG     BASE+3  ;start after JMP BEGIN
;
CONOUT: JMP     COUT
PMINIT: JMP     MINIT   ;initialize whatever has to be (or do RET)
PUNINIT:JMP     UNINIT  ;undo whatever MINIT did (or RET)
PSENDR: JMP     SENDR   ;send data byte on stack (POP PSW / OUT)
PCAROK: JMP     CAROK   ;test for carrier. RET Z=ok, NZ=no carrier
PMDIN:  JMP     MDIN    ;receive data byte
PGETCHR:JMP     GETCHR  ;must point to a RET
PRCVRDY:JMP     RCVRDY  ;check receive ready RET Z=ready
PSNDRDY:JMP     SNDRDY  ;check send ready RET Z=ready
PSPEED: JMP     SPEED   ;get speed factor in ACC
PSPARE1:JMP     SPARE   ;3 jumps for custom routines
PSPARE2:JMP     SPARE
PSPARE3:JMP     SPARE
;
;-----------------------------------------------------------------------
;
GETCHR:                 ;no garbage collection done
SPARE:                  ;for later use
MINIT:                  ; No Init
UNINIT:                 ; No Init so no Un-init!
       RET
;
; SNDRDY - check if ready to send
;
SNDRDY: xra     a       ;assume always ready
       ret
;
       if      not port
COUT:   push    b
       push    d
       push    h
       mvi     d,1
       jmp     go
       endif
;
; SENDR - send character
;
SENDR:  pop     psw
       push    b
       push    d
       push    h
       mov     e,a
       mvi     d,port
go:     mvi     c,36
       call    50h
       pop     h
       pop     d
       pop     b
       ret
;
; RCVRDY - check receive ready
; RET with Z = character available.
; return error code in A
;
RCVRDY: push    b
       push    d
       push    h
       mvi     c,34
       mvi     d,port
       call    50h
       pop     h
       pop     d
       pop     b
       ora     a
       jnz     rdy
       mvi     a,0afh
rdy     equ     $-1
       ora     a
       ret
;
; MDIN - receive a character (GETCHR is identical)
;
MDIN:   push    b
       push    d
       push    h
       mvi     c,34
       mvi     d,0
       call    50h
       ora     a
       jnz     nochar
       mvi     c,35
       mvi     d,port
       call    50h
nochar:
       pop     h
       pop     d
       pop     b
       ret
;
; SPEED - This routine returns the speed code.
; 0=110, 1=300, 2=450, 3=600, 4=710, 5=1200
; Load your speed byte from low memory, or
; simply MVI A,n and RET for default speed only
;
; the following will work correctly for 300 and 1200:
;
SPEED:  push    b
       push    d
       push    h
       mvi     c,38
       mvi     d,port
       call    50h
       lxi     h,table
       ani     0fh
       add     l
       mov     l,a
       mvi     a,0
       adc     h
       mov     h,a
       mov     a,m
       pop     h
       pop     d
       pop     b
       ret
;
; table for baud rates (110,300,600,1200,2400,4800,9600,19200)
; invalid entries return 110 baud
;
table:  db      0,0,0,0,0,1,3,5,0,0,6,0,7,0,8,9
;
; CAROK - check for presence of carrier.
; RET with Z = carrier on
;
CAROK:  xra     a
       RET
       END