home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / COMMS / MODEM9.ARC / CONSOLE.ASM next >
Assembly Source File  |  1991-02-02  |  10KB  |  593 lines

  1. ;
  2. ;        CONSOLE.ASM
  3. ;
  4. ;Console I/O routines for MODEM9.xx.
  5. ;
  6. SHOW:    CPI    LF
  7.     JZ    CTYPE
  8.     CPI    CR
  9.     JZ    CTYPE
  10.     CPI    9
  11.     JZ    CTYPE
  12.     CPI    ' '
  13.     JC    SHOWHEX
  14.     CPI    7FH
  15.     JC    CTYPE
  16. SHOWHEX:
  17.     PUSH    PSW
  18.     MVI    A,'('
  19.     CALL    CTYPE
  20.     POP    PSW
  21.     CALL    HEXO
  22.     MVI    A,')'
  23.     JMP    CTYPE
  24. ;
  25. CTYPE:    PUSH    B
  26.     PUSH    D
  27.     PUSH    H
  28.     MOV    E,A
  29.     MVI    C,WRCON
  30.     CALL    BDOS
  31.     POP    H
  32.     POP    D
  33.     POP    B
  34.     RET
  35. ;
  36. CRLF:    PUSH    PSW
  37.     MVI    A,CR
  38.     CALL    TYPE
  39.     MVI    A,LF
  40.     CALL    TYPE
  41.     POP    PSW
  42.     RET
  43. ;
  44. TYPE:    PUSH    PSW
  45.     PUSH    B
  46.     PUSH    D
  47.     PUSH    H
  48.     MOV    C,A
  49. VTYPE:    CALL    $-$
  50.     POP    H
  51.     POP    D
  52.     POP    B
  53.     POP    PSW
  54.     RET
  55. ;
  56. STAT:    PUSH    B
  57.     PUSH    D
  58.     PUSH    H
  59. VSTAT:    CALL    $-$
  60.     POP    H
  61.     POP    D
  62.     POP    B
  63.     ORA    A
  64.     RET
  65. ;
  66. KEYIN:    PUSH    B
  67.     PUSH    D
  68.     PUSH    H
  69. VKEYIN:    CALL    $-$
  70.     POP    H
  71.     POP    D
  72.     POP    B
  73.     RET
  74. ;
  75. LISTER:    PUSH    B
  76.     PUSH    D
  77.     PUSH    H
  78. VLIST:    CALL    $-$
  79.     POP    H
  80.     POP    D
  81.     POP    B
  82.     RET
  83. ;
  84. LSTSTAT:
  85.     PUSH    B
  86.     PUSH    D
  87.     PUSH    H
  88. VLSTAT:    CALL    $-$
  89.     POP    H
  90.     POP    D
  91.     POP    B
  92.     ORA    A
  93.     RET
  94. ;
  95. UCASE:    CPI    61H    ;CHANGES LOWER CASE CHARACTER..
  96.     RC        ;..IN A-REG TO UPPER CASE.
  97.     CPI    7BH
  98.     RNC
  99.     ANI    5FH
  100.     RET
  101. ;
  102. DECOUT:    PUSH    PSW
  103.     PUSH    B
  104.     PUSH    D
  105.     PUSH    H
  106.     LXI    B,-10
  107.     LXI    D,-1
  108. DECOU2:    DAD    B
  109.     INX    D
  110.     JC    DECOU2
  111.     LXI    B,10
  112.     DAD    B
  113.     XCHG
  114.     MOV    A,H
  115.     ORA    L
  116.     CNZ    DECOUT
  117.     MOV    A,E
  118.     ADI    '0'
  119.     CALL    CTYPE
  120.     POP    H
  121.     POP    D
  122.     POP    B
  123.     POP    PSW
  124.     RET
  125. ;
  126. ;---->    DHXOUT: - DOUBLE PRECISION HEX OUTPUT ROUTINE.
  127. ;
  128. DHXOUT:
  129.     PUSH    H
  130.     PUSH    PSW
  131.     MOV    A,H    ;GET MS BYTE
  132.     CALL    HEXO    ;OUTPUT HIGH ORDER BYTE
  133.     MOV    A,L    ;GET LS BYTE
  134.     CALL    HEXO    ;OUTPUT LOW ORDER BYTE
  135.     POP    PSW
  136.     POP    H
  137.     RET
  138. ;
  139. HEXO:    PUSH    PSW
  140.     RAR
  141.     RAR
  142.     RAR
  143.     RAR
  144.     CALL    NIBBL
  145.     POP    PSW
  146. NIBBL:    ANI    0FH
  147.     CPI    10
  148.     JC    ISNUM
  149.     ADI    7
  150. ISNUM:    ADI    '0'
  151.     JMP    TYPE
  152. ;
  153. SHFTYPE:
  154.     PUSH    PSW
  155.     CALL    ILPRT
  156.     DB    'ctrl-',0
  157.     POP    PSW
  158.     ADI    40H
  159.     CALL    TYPE
  160. ;
  161. ;WRITE A STRING OF CHARACTERS
  162. ;
  163. ILPRT:    XTHL
  164. ILPLP:    MOV    A,M
  165.     ORA    A
  166.     JZ    ILPRET
  167.     CALL    CTYPE
  168.     INX    H
  169.     JMP    ILPLP
  170. ILPRET:    XTHL
  171.     RET
  172. ;
  173. ;WRITE A STRING OF CHARACTERS EXCEPT IN QUIET MODE
  174. ;
  175. ILPRTQ:    XTHL
  176. ILPLPQ:    MOV    A,M
  177.     ORA    A
  178.     JZ    ILPRETQ
  179.     LDA    QFLG
  180.     ORA    A
  181.     MOV    A,M
  182.     CNZ    CTYPE
  183.     INX    H
  184.     JMP    ILPLPQ
  185. ILPRETQ:
  186.     XTHL
  187.     RET
  188. ;
  189. ;Duplicates 'read buffer' routine same as CP/M function 10,
  190. ;but does not use CTL-C (reason for the routine).  Does
  191. ;allow controls U, R, E and H (backspace).  Outputs bell if
  192. ;the input is greater than the buffer.
  193. ;
  194. INBUFF:
  195.     PUSH    PSW
  196.     PUSH    H
  197.     PUSH    B
  198.     PUSH    D        ;'DE' REGISTERS MUST BE PUSHED LAST
  199. ISTART:    CALL    CLEAR        ;CLEAR THE BUFFER AREA
  200.     POP    D        ;GET ADDRESS OF BUFFER ON RETRIES
  201.     PUSH    D        ;RESTORE STACK
  202.     XRA    A
  203.     INX    D        ;ADDRESS COUNT FIELD
  204.     STAX    D        ;INITIALIZE WITH A ZERO IN COUNT BYTE
  205.     INX    D
  206.     XCHG            ;ADDRESS FIRST BUFFER BYTE WITH 'HL'
  207. INBUFA:    CALL    CONIN
  208.     CPI    0DH        ;IS IT A RETURN?
  209.     JZ    INBUFR        ;IF SO, THEN RETURN
  210.     CPI    7FH        ;IS IT A DELETE?
  211.     JZ    DELETE
  212.     CPI    8        ;CTL-H WILL BACKSPACE..
  213.     JZ    DELETE        ;..OVER DELETED CHAR.
  214.     CPI    'U'-40H        ;IS IT A CTL-U
  215.     JZ    INBUFO        ;OUTPUT # CR-LF AND START OVER
  216.     CPI    'R'-40H        ;CTL-R RETYPES LINE
  217.     JZ    RETYPE
  218.     CPI    'E'-40H
  219.     JZ    PCRLF
  220.     CPI    20H        ;NO CONTROL CHARACTERS OTHER..
  221.     JC    INBUFA        ;..THAN ABOVE ALLOWED.
  222.     MOV    B,A        ;SAVE INPUTTED CHARACTER
  223.     XCHG            ;SAVE 'HL' IN 'DE'
  224.     POP    H        ;GET ADDRESS OF BUFFER IN 'HL'
  225.     PUSH    H        ;RESTORE STACK
  226.     INX    H        ;ADDRESS COUNT BYTE
  227.     INR    M        ;INCREASE COUNT BYTE
  228.     DCX    H        ;ADDRESS MAXIMUM
  229.     MOV    A,M        ;PUT MAXIMUM IN 'A'
  230.     INX    H        ;ADDRESS COUNT
  231.     CMP    M        ;COMPARE COUNT TO MAXIMUM
  232.     JC    ALERT        ;IF MAXIMUM, RING BELL AND WAIT FOR CR
  233.     XCHG            ;RESTORE BUFFER POINTER TO 'HL'
  234.     MOV    M,B        ;PUT INPUTTED CHARACTER IN BUFFER
  235.     MOV    A,B        ;OUTPUT IT
  236.     CALL    CONOUT
  237.     INX    H        ;BUMP POINTER
  238.     JMP    INBUFA        ;GET NEXT CHARACTER
  239. ;
  240. DELETE:    XCHG            ;SAVE BUFFER POINTER IN 'DE'
  241.     POP    H        ;ADDRESS BEGINNING OF BUFFER
  242.     PUSH    H        ;RESTORE STACK
  243.     INX    H        ;ADDRESS COUNT FIELD
  244.     MOV    B,A        ;SAVE DELETE CHAR - 7FH OR 08H
  245.     MOV    A,M
  246.     SUI    1        ;DECREASE COUNT
  247.     MOV    M,A
  248.     JC    NODEL        ;DON'T DELETE PAST BEGINING OF BUFFER.
  249.     XCHG            ;RESTORE BUFFER POINTER TO 'HL'
  250.     DCX    H        ;POINT TO LAST BYTE INPUTTED
  251.     MOV    A,B        ;GET BACK EITHER 7FH OR 08H
  252.     MOV    B,M        ;GET CHARACTER BEING DELETED
  253.     MVI    M,20H        ;RESTORE BLANK
  254.     CPI    8
  255.     JZ    BKSPC
  256.     CPI    7FH
  257.     JZ    BKSPC0
  258.     JMP    INBUFA        ;GET NEXT CHARACTER
  259. ;
  260. NODEL:    INR    M        ;DON'T LEAVE COUNT NEGATIVE
  261.     XCHG            ;RESTORE POINTER TO 'HL'
  262.     JMP    INBUFA
  263. ;
  264. BKSPC0:    MVI    A,08H
  265. BKSPC:    CALL    CONOUT        ;TRUE ERASE IF 08H
  266.     MVI    A,20H
  267.     CALL    CONOUT
  268.     MVI    A,8
  269.     CALL    CONOUT
  270.     JMP    INBUFA
  271. ;
  272. INBUFO:    MVI    A,'#'
  273.     CALL    CONOUT
  274.     MVI    A,0DH
  275.     CALL    CONOUT
  276.     MVI    A,0AH
  277.     CALL    CONOUT
  278.     JMP    START
  279. ;
  280. RETYPE:    POP    D
  281.     PUSH    D
  282.     INX    D        ;POINT TO CURRENT NUMBER..
  283.     LDAX    D        ;..OF CHARACTERS.
  284.     MOV    B,A
  285.     MVI    A,'#'
  286.     CALL    CONOUT
  287.     MVI    A,0DH
  288.     CALL    CONOUT
  289.     MVI    A,0AH
  290.     CALL    CONOUT
  291.     MOV    A,B        ;TEST IF ZERO INPUT
  292.     ORA    A
  293.     JZ    INBUFA
  294. CTLRLP:    INX    D
  295.     LDAX    D
  296.     CALL    CONOUT
  297.     DCR    B
  298.     JNZ    CTLRLP
  299.     JMP    INBUFA
  300. ;    
  301. ALERT:    MVI    A,7
  302.     CALL    CONOUT
  303.     DCR    M
  304.     XCHG
  305.     JMP    INBUFA
  306. ;
  307. PCRLF:    MVI    A,0DH
  308.     CALL    CONOUT
  309.     MVI    A,0AH
  310.     CALL    CONOUT
  311.     JMP    INBUFA
  312. ;
  313. INBUFR:    MVI    A,0DH
  314.     CALL    CONOUT
  315.     MVI    A,0AH
  316.     CALL    CONOUT
  317.     POP    D
  318.     POP    B
  319.     POP    H
  320.     POP    PSW
  321.     RET
  322. ;
  323. CLEAR:    POP    D        ;ACCOUNTS FOR CALL
  324.     POP    H        ;ADDRESS BUFFER IN 'HL'
  325.     PUSH    H        ;RESTORE..
  326.     PUSH    D        ;..STACK
  327.     MOV    B,M        ;SAVE MAXIMUM IN 'B'
  328.     INX    H        ;POINT TO FIRST..
  329.     INX    H        ;..BUFFER BYTE.
  330.     MVI    A,20H
  331. CLEARL:    MOV    M,A
  332.     INX    H
  333.     DCR    B
  334.     JNZ    CLEARL
  335.     RET
  336. ;
  337. CONIN:    PUSH    H
  338.     PUSH    D
  339.     PUSH    B
  340. CONINLP:
  341.     CALL    CONSTAT
  342.     ORA    A
  343.     JZ    CONINLP
  344.     CALL    CONIN1
  345.     CPI    61H        ;CHANGE TO UPPER..
  346.     JC    NOUCASE        ;..CASE SINCE CP/M..
  347.     CPI    7BH        ;..DOES THE SAME.
  348.     JNC    NOUCASE
  349.     ANI    5FH
  350. NOUCASE:
  351.     POP    B
  352.     POP    D
  353.     POP    H
  354.     RET
  355. ;
  356. CONIN1:    LHLD    1
  357.     LXI    D,6
  358.     DAD    D
  359.     PCHL
  360. ;
  361. CONSTAT:
  362.     PUSH    H
  363.      PUSH    D
  364.     PUSH    B
  365.     CALL    CONST1
  366.     POP    B
  367.     POP    D
  368.     POP    H
  369.     RET
  370. ;
  371. CONST1:    LHLD    1
  372.     LXI    D,3
  373.     DAD    D
  374.     PCHL
  375. ;
  376. CONOUT:    PUSH    H
  377.     PUSH    D
  378.     PUSH    B
  379.     PUSH    PSW
  380.     CALL    CONOUT1
  381.     POP    PSW
  382.     POP    B
  383.     POP    D
  384.     POP    H
  385.     RET
  386. ;
  387. CONOUT1:
  388.     LHLD    1
  389.     LXI    D,9
  390.     DAD    D
  391.     MOV    C,A
  392.     PCHL
  393. ;
  394. ;
  395. ;Parses a CP/M buffer into format same as CP/M command line.
  396. ;
  397. ;Loads a command line addressed by 'DE' registers (max # characters in
  398. ;line in 'DE', number of characters in the line in 'DE'+1, line starts
  399. ;in 'DE'+2) into FCB addressed by 'HL' registers.  The FCB should be at
  400. ;least 33 bytes in length.  The command line buffer must have a maximum
  401. ;length of at least one more than the greatest number of characters
  402. ;that will be needed.
  403. ;
  404. CPMLINE:
  405.     PUSH    PSW
  406.     PUSH    B
  407.     PUSH    D
  408.     PUSH    H
  409.     CALL    CINIT        ;FILLS FCBS WITH BLANKS AND NULLS
  410.     XCHG            ;GET START OF COMMAND LINE IN 'HL'
  411.     INX    H        ;ADDRESS # BYTES IN CMD LINE
  412.     MOV    E,M        ;LOAD 'DE' PAIR WITH # BYTES
  413.     MVI    D,0
  414.     INX    H
  415.     DAD    D        ;POINT TO BYTE AFTER LAST CHAR..
  416.     MVI    M,0DH        ;..IN CMD LINE AND STORE DELIMITER
  417.     POP    H        ;RESTORE 'HL' AND 'DE'
  418.     POP    D
  419.     PUSH    D
  420.     PUSH    H
  421.     INX    D        ;ADDRESS START OF COMMAND
  422.     INX    D
  423.     CALL    DRIVE
  424. NAME1:    MVI    C,8        ;TRANSFER FIRST FILENAME TO FCB
  425.     CALL    TRANS
  426.     CPI    0DH
  427.     JZ    CDONE
  428.     CPI    20H        ;IF SPACE, THEN START OF..
  429.     JZ    NAME2        ;..SECOND FILENAME.
  430. TYPE1:    POP    H        ;FILETYPE MUST BE AFTER..
  431.     PUSH    H        ;..EIGHTH BYTE OF NAME
  432.     LXI    B,9
  433.     DAD    B
  434.     MVI    C,3        ;TRANSFER TYPE OF FIRST FILE
  435.     CALL    TRANS
  436.     CPI    0DH
  437.     JZ    CDONE
  438. NAME2:    LDAX    D        ;EAT MULTIPLE SPACES..
  439.     CPI    20H        ;..BETWEEN NAMES
  440.     JNZ    NAME2C
  441.     INX    D
  442.     JMP    NAME2
  443.     LDAX    D
  444.     CPI    0DH        ;TEST IF FIRST NAME..
  445.     JZ    CDONE        ;..ONLY AND THEN SPACE
  446. NAME2C:    POP    H        ;SECOND NAME STARTS IN 16TH BYTE
  447.     PUSH    H        ;POINT 'HL' TO THIS BYTE
  448.     LXI    B,16
  449.     DAD    B
  450.     CALL    DRIVE
  451.     MVI    C,8
  452.     CALL    TRANS
  453.     CPI    0DH
  454.     JZ    CDONE
  455. TYPE2:    POP    H        ;SECOND TYPE STARTS IN 25TH BYTE.
  456.     PUSH    H
  457.     LXI    B,25
  458.     DAD    B
  459.     MVI    C,3
  460.     CALL    TRANS
  461. CDONE:    POP    H
  462.     PUSH    H
  463.     INX    H        ;POINT TO 1ST CHAR OF 1ST NAME IN FCB
  464.     CALL    CSCAN        ;CHECK FOR * (AMBIGUOUS NAMES).
  465.     POP    H
  466.     PUSH    H
  467.     LXI    B,17        ;POINT TO 1ST CHAR OF 2ND NAME IN FCB.
  468.     DAD    B
  469.     CALL    CSCAN
  470.     POP    H
  471.     POP    D
  472.     POP    B
  473.     POP    PSW
  474.     RET
  475. ;
  476. CINIT:    PUSH    H        ;INITIALIZES FCB WITH 1 NULL (FOR 1ST DRIVE),..
  477.     PUSH    B        ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE),..    MVI    M,0        ;..11 BLANKS, AND 4 NULLS
  478.     INX    H
  479.     MVI    B,11
  480.     MVI    A,20H
  481.     CALL    INITFILL
  482.     MVI    B,5
  483.     MVI    A,0
  484.     CALL    INITFILL
  485.     MVI    B,11
  486.     MVI    A,20H
  487.     CALL    INITFILL
  488.     MVI    B,4
  489.     MVI    A,0
  490.     CALL    INITFILL
  491.     POP    B
  492.     POP    H
  493.     RET
  494. ;
  495. INITFILL:
  496.     MOV    M,A
  497.     INX    H
  498.     DCR    B
  499.     JNZ    INITFILL
  500.     RET
  501. ;
  502. DRIVE:    INX    D        ;CHECK 2ND BYTE OF FILENAME. IF IT..
  503.     LDAX    D        ;..IS A ":", THEN DRIVE WAS SPECIFIED
  504.     DCX    D
  505.     CPI    ':'
  506.     JNZ    DEFDR        ;ELSE ZERO FOR DEFAULT DRIVE ('INIT' PUT ZERO)
  507.     LDAX    D
  508.     ANI    5FH
  509.     SUI    40H        ;CALCULATE DRIVE (A=1, B=2,...)..
  510.     MOV    M,A        ;..AND PLACE IT IN FCB
  511.     INX    D        ;ADDRESS FIRST BYTE OF..
  512.     INX    D        ;..IN CMD LINE..
  513. DEFDR:    INX    H        ;..AND NAME FIELD IN FCB
  514.     RET
  515. ;
  516. TRANS:    LDAX    D        ;TRANSFER FROM CMD LINE TO FCB..
  517.     INX    D        ;..UP TO NUMBER OF CHARS SPECIFIED..
  518.     CPI    0DH        ;..BY 'C' REG. KEEP SCANNING FIELD..
  519.     RZ            ;..WITHOUT TRANSFER UNTIL A DELIMITING..
  520.     CPI    '.'        ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  521.     RZ            ;..C/R (FOR END OF CMD LINE)
  522.     CPI    20H
  523.     RZ
  524.     DCR    C
  525.     JM    TRANS        ;ONCE 'C' REG IS LESS THAN '0' KEEP READING
  526.     MOV    M,A        ;..CMD LINE BUT DO NOT TRANSFER TO FCB
  527.     INX    H
  528.     JMP    TRANS
  529. ;
  530. CSCAN:    MVI    B,8        ;SCAN FILE NAME ADDRESSED BY 'HL'
  531. TSTNAM:    MOV    A,M
  532.     CPI    '*'        ;IF '*' FOUND, FILL IN REST OF FIELD..
  533.     JZ    FILL1        ;..WITH '?' FOR AMBIGUOUS NAME
  534.     INX    H
  535.     DCR    B
  536.     JNZ    TSTNAM
  537.     JMP    TSTTYP
  538. ;
  539. FILL1:    CALL    FILL
  540. TSTTYP:    MVI    B,3        ;SCAN AND FILL TYPE FIELD FOR NAME..
  541. TSTTYPL:
  542.     MOV    A,M        ;..SPECIFIED ABOVE
  543.     CPI    '*'
  544.     JZ    FILL2
  545.     INX    H
  546.     DCR    B
  547.     RZ
  548.     JMP    TSTTYPL
  549. ;
  550. FILL2:    CALL    FILL
  551.     RET
  552. ;
  553. FILL:    MVI    M,'?'    ;ROUTINE TRANSFERS '?'
  554.     INX    H
  555.     DCR    B
  556.     JNZ    FILL
  557.     RET
  558. ;
  559. ;
  560. ;In-line compare.  Compares string addressed by 'DE' pair to string af-
  561. ;the call (ends with '0').  Return with carry set means strings not the
  562. ;same.  All registers (except 'A') are unaffected.
  563. ;
  564. ILCOMP:
  565.     XTHL            ;POINT 'HL' TO 1ST CHARACTER
  566.     PUSH    D
  567. ILCOMPL:
  568.     MOV    A,M        ;'HL' POINTS TO IN-LINE STRING
  569.     ORA    A        ;END OF STRING IF ZERO
  570.     JZ    SAME
  571.     LDAX    D
  572.     CMP    M
  573.     JNZ    NOTSAME
  574.     INX    H
  575.     INX    D
  576.     JMP    ILCOMPL
  577. ;
  578. NOTSAME:
  579.     MVI    A,0        ;IF NOT SAME, FINISH THRU..
  580. NSLP:    INX    H        ;..STRING SO RETURN WILL..
  581.     CMP    M        ;..GO TO INSTRUCTION AFTER..
  582.     JNZ    NSLP        ;..STRING AND NOT REMAINDER OF STRING
  583.     STC
  584. SAME:    POP    D
  585.     INX    H        ;AVOIDS A NOP INSTRUCTION..
  586.     XTHL            ;..WHEN RETURNING
  587.     RET
  588. ;
  589. ;
  590.     LINK    TERM
  591. ;
  592. X    H
  593.