;
;       +----------------------------+
;       |                            |
;       |     S  Y  S  T  E  M       |
;       ;                            |
;       +----------------------------+
;
;
;       Version number: 2.1
;       Version date:   April 30, 1981
;

;       The following code is supplied to customers who
;       purchase a hard/floppy disk system from DTC.
;       The command
;       SYSTEM z xxx y
;       computes the memory size and offset arguments for
;       the SYSTEM1.SUB SUBMIT file and executes
;       SUBMIT SYSTEM1 z xxx mm hhhh y
;
;
VERS:   EQU     21
;
CR:     EQU     0Dh     ;ASCII carriage return
LF:     EQU     0Ah     ;ASCII line feed
TAB:    EQU     9       ;ASCII horizontal tab
EOS:    EQU     '$'     ;BDOS end of string
;
;
;       BDOS function equates
;
PRTSTR: EQU     09      ;Print string,  DE=buffer address
INIT:   EQU     13      ;Initialize BDOS
;
;       Page zero locations
;
BOOT:   EQU     0
CDISK:  EQU     4
BDOSV:  EQU     5
DBUF:   EQU     080h    ;Default buffer
;
MM:     EQU     MSIZE-(BIOSIZ-600h)/K
;
;

;       Assembly switch
DAW:    EQU     FALSE
;

       ORG     100h

SYSCMD:
       PUSH    PSW
       PUSH    B
       PUSH    D
       PUSH    H
       LXI     H,0
       DAD     SP
       SHLD    SYSTK
       LXI     SP,STACK

       CALL    SYS

SYSRET:
       LHLD    SYSTK
       SPHL
       POP     H
       POP     D
       POP     B
       POP     PSW
       RET

SYS:
       LXI     H,DBUF          ;Get buffer count
       MOV     A,M
       ORA     A
       JZ      HELP
       MOV     B,A
       LXI     D,ARG
SYS1:
       INX     H               ;Point to string
       MOV     A,M             ;Skip leading spaces
       CPI     ' '
       JNZ     SYS2
       DCR     B
       JZ      HELP
       JMP     SYS1
SYS2:
       CPI     'A'             ;Validate drive
       JC      HELP
       CPI     'P'+1
       JNC     HELP
       STAX    D
       INX     D
       MVI     A,' '
       STAX    D
       INX     D
SYS3:
       DCR     B               ;Skip to unit record file name
       JZ      HELP
       INX     H
       MOV     A,M
       CPI     ' '
       JZ      SYS3
SYS4:
       STAX    D               ;Move unit record file name
       INX     D
       INX     H
       DCR     B
       JZ      HELP
       MOV     A,M
       CPI     ' '
       JNZ     SYS4
       STAX    D
       INX     D
       MVI     A,MM/10+'0'     ;mm
       STAX    D
       INX     D
       MVI     A,MM MOD 10 +'0'
       STAX    D
       INX     D
       MVI     A,' '
       STAX    D
       INX     D
       PUSH    B
       LXI     B,1F80h-CBIOS   ;hhhh
       MOV     A,B
       CALL    BYTHEX
       MOV     A,C
       CALL    BYTHEX
       MVI     A,' '
       STAX    D
       INX     D
       POP     B               ;y
SYS5:
       MOV     A,M
       INX     H
       CPI     ' '
       JNZ     SYS6
       DCR     B
       JZ      HELP
       JMP     SYS5
SYS6:
       STAX    D
       INX     D
       XRA     A               ;Terminate command string
       STAX    D
       LXI     H,CCPCMD        ;Compute command string length
       MOV     A,E
       SBB     L
       MOV     C,A
       INR     C
       DCR     A
       MOV     M,A

       IF      DAW
       PUSH    B

       MVI     C,INIT          ;Initialize BDOS
       CALL    BDOSV
       CALL    HOME            ;Get fresh copy of CCP
       LXI     B,CCP
       MVI     E,2             ;Starting sector
       MVI     D,(BDOS-CCP)/128        ;Number of sectors
SYS7:
       PUSH    B
       PUSH    D
       CALL    SETDMA
       POP     B
       PUSH    B
       MVI     B,0
       CALL    SETSEC
       CALL    READ
       POP     D
       POP     B
       LXI     H,128
       DAD     B
       MOV     B,H
       MOV     C,L
       INR     E
       DCR     D
       JNZ     SYS7
       MVI     C,INIT
       CALL    BDOSV

       POP     B
       LXI     H,CCPCMD
       LXI     D,CCP+7         ;Move command to CCP buffer
SYS8:
       MOV     A,M
       STAX    D
       INX     H
       INX     D
       DCR     C
       JNZ     SYS8
       LDA     CDISK
       MOV     C,A
       JMP     CCP+3           ;Execute CCP command
       ENDIF
       IF      NOT DAW
       MVI     A,EOS
       STAX    D
       LXI     D,USRMSG
       MVI     C,PRTSTR
       CALL    BDOSV
       LXI     D,CCPCMD+1
       MVI     C,PRTSTR
       CALL    BDOSV
       RET

USRMSG: DB      CR,LF,LF,'Command string is:',CR,LF,LF,TAB,EOS
       ENDIF


BYTHEX:
       PUSH    PSW             ;Save byte to be converted
       RAR                     ;Convert most significant nibble
       RAR
       RAR
       RAR
       CALL    HEXASC          ;Make it an ASCII character
       POP     PSW             ;Convert least significant nibble
HEXASC:
       ANI     0Fh
       ADI     090h
       DAA
       ACI     040h
       DAA
       STAX    D
       INX     D
       RET


;       BIOS Subroutines
;
HOME:   LHLD    BOOT+1
       MVI     L,18h
       PCHL

SETSEC: LHLD    BOOT+1
       MVI     L,21h
       PCHL

SETDMA: LHLD    BOOT+1
       MVI     L,24h
       PCHL

READ:   LHLD    BOOT+1
       MVI     L,27h
       PCHL


HELP:   MVI     C,PRTSTR        ;Print help message
       LXI     D,HELPM
       CALL    BDOSV
       JMP     BOOT

HELPM:  DB      CR,LF,LF
       IF      DAW
       DB      'SYSTEM'
       ENDIF
       IF      NOT DAW
       DB      'SYSCMD'
       ENDIF
       DB      ' z xxx y',CR,LF,LF
       DB      'Determines the SYSTEM'
       IF      DAW
       DB      '1'
       ENDIF
       DB      '.SUB parameters mm and hhhh',CR,LF
       IF      DAW
       DB      'and does',CR,LF,LF
       DB      'SUBMIT SYSTEM1 z xxx mm hhhh y',CR,LF
       ENDIF
       DB      EOS

;       CCP command string
;
CCPCMD: DB      0               ;length
       DB      'SUBMIT SYSTEM'
       IF      DAW
       DB      '1'
       ENDIF
       DB      ' '
ARG:    DS      30

SYSTK:  DS      2
       DS      50
STACK:  EQU     $
       END