home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / cios.sqc / CIOS.SRC
Text File  |  1985-02-09  |  20KB  |  699 lines

  1.  
  2. ;       LOGICAL I/O SYSTEM FOR CP/M
  3.  
  4. ;               MISCELLANEOUS EQUATES
  5.  
  6. CPM     EQU     5               ; CPM ENTRY POINT
  7. BIOS    EQU     0               ; BIOS ENTRY POINT
  8.  
  9. FCB     EQU     5CH             ; TRANSIENT FCB
  10. TBUF    EQU     80H             ; TRANSIENT BUFFER
  11.  
  12. ;               FCB FORMAT
  13.  
  14. FFET    EQU     0               ; ENTRY TYPE
  15. FFFN    EQU     1               ; FILE NAME
  16. FFFT    EQU     9               ; FILE TYPE
  17. FFEX    EQU     12              ; FILE EXTENT
  18. FFRC    EQU     15              ; RECORD COUNT
  19. FFDM    EQU     16              ; ALLOCATION MAP
  20. FFNR    EQU     32              ; NEXT RECORD
  21. FFBA    EQU     33              ; NEXT BYTE
  22. FFDV    EQU     35              ; DEVICE ADDRESS
  23. FFBUF   EQU     36              ; BUFFER
  24.  
  25. ;               GET CHARACTER (W/OUT ECHO) FROM CONSOLE
  26. ;               OUTPUTS:        A = CHARACTER
  27.  
  28. FGTCH:
  29.         LHLD    1               ; GET BIOS 
  30.         LXI     D,6             ; ADDRESS
  31.         DAD     D               ; FOR
  32.         LXI     D,FGTC01        ; CONSOLE
  33.         PUSH    D               ; CALL
  34.         PCHL                    ; BIOS
  35. FGTC01:
  36.         ANI     7FH             ; CLEAR PARITY
  37.         MOV     B,A
  38.         LDA     CANCEL          ; TEST FOR CANCEL
  39.         CMP     B
  40.         JZ      FGTC06
  41.         MOV     A,B
  42.         CPI     ESCAPE          ; TEST FOR ESCAPE
  43.         CZ      FGTC03
  44.         LDA     FLOWER
  45.         CMP     B               ; ADJUST
  46.         JP      FGTC02          ; LOWER
  47.         CPI     '{'             ; CASE
  48.         JP      FGTC02
  49.         MOV     A,B
  50.         ANI     5FH
  51.         MOV     B,A
  52. FGTC02:
  53.         MVI     A,60H
  54.         STA     FLOWER
  55.         MOV     A,B
  56.         RET
  57. FGTC03:
  58.         CALL    FGTCH           ; ESCAPE
  59.         CPI     '['             ; SEQUENCE
  60.         CZ      FGTCH           ; PROCESSOR
  61.         LXI     H,TRANSLATE
  62.         MOV     B,A
  63. FGTC04:
  64.         MOV     A,M             ; SCAN TRANSLATE
  65.         INX     H               ; TABLE USING
  66.         ORA     A               ; SECOND CHARACTER
  67.         JZ      FGTC05          ; OF SEQUENCE
  68.         CMP     B
  69.         JZ      FGTC05
  70.         INX     H
  71.         JMP     FGTC04
  72. FGTC05:
  73.         MOV     B,M             ; SUBSTITUTE VALUE
  74.         RET                     ; FROM TABLE
  75. FGTC06:
  76.         WRTLN   FGSURE
  77.         CALL    FGTCH
  78.         CPI     'Y'
  79.         JZ      BOOT
  80.         JMP     FGTCH
  81. FLOWER: DB      60H
  82. FGSURE: DB      13,10,'Are you sure(y/n)? ','$'
  83.  
  84. ;               GET CHARACTER (W/ECHO) FROM CONSOLE
  85. ;               OUTPUTS:        A = CHARACTER
  86.  
  87. FRDCH:
  88.         CALL    FGTCH
  89.         CPI     20H
  90.         JP      FRDC01
  91.         CPI     0DH
  92.         JZ      FRDC01
  93.         ORI     20H
  94. FRDC01:
  95.         CALL    FWTCH
  96.         RET
  97.  
  98.  
  99. ;               READ LINE FROM CONSOLE
  100.  
  101. ;               INPUT:          HL = @(BUFFER)
  102. ;                               A = S(BUFFER)
  103. ;               OUTPUT:         BUFFER WITH GOODIES
  104.  
  105. FRDLN:
  106.         DCX     H               ; POINT
  107.         DCX     H               ; TO MAX
  108.         PUSH    H               ; SIZE
  109.         PUSH    H
  110.         MOV     M,A             ; SAVE SIZE
  111.         INX     H               ; POINT TO
  112.         INX     H               ; BUFFER
  113. FFRD01:                         ; AND
  114.         MVI     M,' '           ; CLEAR
  115.         INX     H               ; THE
  116.         DCR     A               ; BUFFER
  117.         JNZ     FFRD01
  118.         POP     D
  119.         MVI     C,10            ; READ
  120.         CALL    CPM             ; CONSOLE
  121.         POP     H               ; ADJUST
  122.         MOV     B,M             ; LOWER
  123.         INX     H               ; CASE
  124.         INX     H
  125. FFRD02:
  126.         MOV     A,M
  127.         CPI     'a'
  128.         JM      FFRD03
  129.         CPI     '{'
  130.         JP      FFRD03
  131.         ANI     5FH
  132.         MOV     M,A
  133. FFRD03:
  134.         INX     H
  135.         DCR     B
  136.         JNZ     FFRD02
  137.         RET
  138.  
  139. ;               WRITE CHARACTER TO CONSOLE
  140. ;               INPUTS:         A = CHARACTER
  141.  
  142. FWTCH:
  143.         PUSH    PSW
  144.         CPI     13              ; CHECK FOR CR
  145.         JNZ     FWTCH1
  146.         LDA     CRLF
  147. FWTCH1:
  148.         CPI     10              ; CHECK FOR LF
  149.         JNZ     FWTCH2
  150.         LDA     CRLF+1
  151. FWTCH2:
  152.         MOV     E,A
  153.         MVI     C,2
  154.         CALL    CPM
  155.         POP     PSW
  156.         RET
  157.  
  158. ;               WRITE LINE TO CONSOLE
  159.  
  160. ;               INPUTS:         HL=@(LINE)
  161. ;                               LINE TERMINATED BY '$'
  162.  
  163. FWRTLN:
  164.         MOV     A,M
  165.         CPI     DOLLAR
  166.         RZ
  167.         PUSH    H
  168.         CALL    FWTCH
  169.         POP     H
  170.         INX     H
  171.         JMP     FWRTLN
  172.  
  173.  
  174. ;               GOTOXY CURSOR CONTROL FOR CRT
  175.  
  176. ;               INPUT:          A = ROW
  177. ;                               B = COLUMN
  178.  
  179. GOTOXY:
  180.         STA     FTEMP
  181.         LDA     MEMAP           ; TEST FOR
  182.         ORA     A               ; MEMORY MAPPED
  183.         LDA     FTEMP
  184.         JNZ     MGTXY           ; TERMINAL
  185.         MOV     C,A
  186.         LDA     CR              ; TEST FOR
  187.         CPI     0               ; ANSI OPTION
  188.         JZ      GTXY06
  189.         MOV     A,B
  190.         LHLD    XBND1           ; IF COL<XBND1
  191.         CMP     L               ; THEN
  192.         JP      GTXY01
  193.         ADD     H               ; COL:=COL+XINC1
  194.         JMP     GTXY02
  195. GTXY01:                         ; ELSE
  196.         LHLD    XBND2           ; IF COL<XBND2
  197.         CMP     L               ; THEN
  198.         JP      GTXY02
  199.         ADD     H               ; COL:=COL+XINC2
  200. GTXY02:
  201.         MOV     E,A
  202.         MOV     A,C
  203.         LHLD    YBND1           ; IF ROW<YBND1
  204.         CMP     L               ; THEN
  205.         JP      GTXY03
  206.         ADD     H               ; ROW:=ROW+YINC1
  207.         JMP     GTXY04
  208. GTXY03:
  209.         LHLD    YBND2           ; IF ROW<YBND2
  210.         CMP     L               ; THEN
  211.         JP      GTXY04
  212.         ADD     H               ; ROW:=ROW+YINC2
  213. GTXY04:
  214.         MOV     D,A
  215.         LDA     CR              ; IF COL_ROW THEN
  216.         CPI     2
  217.         JNZ     GTXY05
  218.         MOV     H,D             ; D XCHG E
  219.         MOV     D,E
  220.         MOV     E,H
  221. GTXY05:
  222.         XCHG
  223.         SHLD    GTXYL1
  224.         WRITE   PRFX            ; WRITE(PRFX)
  225.         WRITE   CMMD            ; WRITE(CMMD)
  226.         WRITE   GTXYL1          ; WRITE(ROW/COL)
  227.         WRITE   GTXYL1+1        ; WRITE(COL/ROW)
  228.         RET
  229.  
  230. GTXY06:                         ; ANSI GOTOXY OPTION
  231.         PUSH    B               ; SAVE COORDINATES
  232.         MOV     E,C             ; CONVERT
  233.         MVI     D,0             ; ROW
  234.         LXI     H,GTXYL2+2
  235.         MVI     A,2
  236.         CALL    INT$TO$STR
  237.         POP     B               ; CONVERT
  238.         MOV     E,B             ; COLUMN
  239.         MVI     D,0
  240.         LXI     H,GTXYL2+5
  241.         MVI     A,2
  242.         CALL    INT$TO$STR
  243.         WRTLN   GTXYL2          ; WRITE(ROW,COL)
  244.         RET
  245. GTXYL1: DB      '  '
  246. GTXYL2: DB      27H,'[00;00H','$'
  247.  
  248. ;       SCREEN CLEAR PROCEDURES
  249.  
  250. CLR$SCR:
  251.         XRA     A
  252.         CALL    CLEOS           ; CLEAR THE SCREEN
  253.         GTXY    0,0             ; GOTOXY(0,0);
  254.         MOVI    COLUMN,0
  255.         MOVI    ROW,0
  256.         RET                     ; END
  257.  
  258. CLEOS:
  259.         STA     CLROW
  260.         MVI     B,0             ; GOTOXY(0,A);
  261.         CALL    GOTOXY
  262.         MCPI    CLESL,DOLLAR    ; CHECK FOR CLEAR
  263.         JZ      CLES02          ; FUNCTION AVAILABLE
  264.         WRTLN   CLESL           ; CLEAR TO END OF SCREEN
  265.         CALL    CLWAIT
  266.         RET
  267. *
  268. *               CLEAR WITH SPACES
  269. *
  270. CLES02:
  271.         MVI     A,DOLLAR        ; ADJUST FOR
  272.         XPUT    CLSPC-1,MXCOL   ; LINE LENGTH
  273.         DMVI    CLESW2,2        ; WORK:=MXROW-2;
  274.         DSUB    CLESW2,MXROW,CLESW2
  275. CLES03:
  276.         WRTLN   CLSPC           ; CLEAR SCREEN
  277.         WRTLN   CLESL3          ; GO TO NEXT LINE
  278.         NEXT    CLES03,CLROW,CLESW2
  279.         WRTLN   CLSPC           ; CLEAR LAST LINE
  280.         RET
  281. CLESW2: DW      0
  282. CLESL3: DB      10,'$'
  283.  
  284. CLEOL:
  285.         STA     CLROW
  286.         MVI     B,0             ; GOTOXY(0,A);
  287.         CALL    GOTOXY
  288.         MCPI    CLELL,DOLLAR    ; CHECK FOR CLEAR
  289.         JZ      CLEL01          ; FUNCTION AVAILABLE
  290.         WRTLN   CLELL           ; WRITE CLEARTOENDOFLINE
  291.         CALL    CLWAIT
  292.         RET                     ; END
  293. CLEL01:
  294.         MVI     A,DOLLAR        ; ADJUST FOR
  295.         XPUT    CLSPC-1,MXCOL   ; LINE LENGTH
  296.         WRTLN   CLSPC           ; CLEAR LINE
  297.         RET
  298. CLROW:  DW      0
  299. CLSPC:  DB      '                '
  300.         DB      '                '
  301.         DB      '                '
  302.         DB      '                '
  303.         DB      '               '
  304.         DB      '$'
  305.  
  306. ;               WAIT FOR SCREEN TO SETTLE
  307.  
  308. CLWAIT:
  309.         MOVE    CLWTW1,NULL$COUNT
  310.         RZ                      ; EXIT IF NO DELAY NEEDED
  311. CLWT01:
  312.         WRTLN   CLWTL1          ; DELAY FOR CLEAR
  313.         MDEC    CLWTW1
  314.         JNZ     CLWT01
  315.         RET
  316. CLWTL1: DB      0,0,0,0,'$'
  317. CLWTW1: DB      0
  318.  
  319. ;               FCB BUILDER
  320.  
  321. ;               PREPARES FCB FOR I/O
  322.  
  323. ;               INPUTS:         DE = @(FCB)
  324. ;                               HL = @(FCB$NAME)
  325.  
  326. FFCB: 
  327.         CALL    FCMPR           ; COMPRESS
  328.         CALL    FADDR           ; GET ADDRS
  329.         DCX     H               ; GET
  330.         MOV     B,M             ; SIZE
  331.         PUSH    B               ; AND
  332.         INX     H               ; SAVE
  333.         XCHG
  334.         SHLD    FTEMP           ; SAVE HL
  335.         MVI     A,36            ; AND
  336. FFCB01:
  337.         MVI     M,0             ; CLEAR
  338.         INX     H               ; ENTIRE
  339.         DCR     A               ; FCB
  340.         JNZ     FFCB01
  341.         PUSH    D               ; GET CURRENT
  342.         MVI     C,25            ; DEVICE
  343.         CALL    CPM             ; SPECIFICATION
  344.         LHLD    FPFDV           ; RETRIEVE HL
  345.         MOV     M,A             ; AND SAVE
  346.         POP     D               ; RETRIEVE
  347.         PUSH    D               ; D AND
  348.         LDAX    D               ; GET DEVICE
  349.         MOV     B,A             ; SPEC
  350.         INX     D               ; POINT TO ':'
  351.         LDAX    D               ; GET ':'
  352.         CPI     ':'             ; TEST FOR
  353.         JNZ     FFCB02          ; DEVICE SPEC
  354.         MOV     A,B             ; NORMALIZE
  355.         MVI     B,'A'           ; DEVICE
  356.         SUB     B               ; SPEC
  357.         MOV     M,A             ; AND SAVE
  358.         INX     D               ; BYPASS D:
  359.         POP     B
  360.         POP     B               ; ADJUST
  361.         DCR     B               ; SIZE
  362.         DCR     B
  363.         PUSH    B
  364.         PUSH    D
  365. FFCB02:
  366.         LHLD    FPFCB           ; POINT
  367.         INX     H               ; TO ID
  368.         PUSH    H               ; AND SAVE
  369.         MVI     A,11
  370. FFCB03:
  371.         MVI     M,' '           ; CLEAR
  372.         INX     H               ; ID
  373.         DCR     A               ; TO
  374.         JNZ     FFCB03          ; SPACES
  375.         POP     H               ; RETRIEVE
  376.         POP     D               ; HL, DE
  377.         POP     B               ; AND BC
  378. FFCB04:
  379.         LDAX    D               ; GET NAME
  380.         CPI     '.'             ; AND TEST
  381.         JZ      FFCB06          ; FOR TYPE
  382.         CPI     '0'             ; ELSE TEST
  383.         JM      FFCB05          ; FOR DONE
  384.         CPI     '['
  385.         JP      FFCB05
  386.         MOV     M,A             ; ELSE
  387.         INX     H               ; MOVE
  388. FFCB05:
  389.         INX     D               ; CHARACTER
  390.         DCR     B               ; TO
  391.         JNZ     FFCB04          ; FCB
  392.         RET
  393. FFCB06:
  394.         PUSH    D               ; POINT
  395.         LHLD    FTEMP           ; TO
  396.         LXI     D,FFFT          ; TYPE
  397.         DAD     D               ; FIELD
  398.         POP     D               ; IN
  399.         JMP     FFCB05          ; FCB
  400.  
  401. FCMPR:
  402.         PUSH    D
  403.         MOV     D,H
  404.         MOV     E,L
  405.         DCX     H
  406.         PUSH    H
  407.         MOV     B,M
  408.         MVI     C,0
  409.         INX     H
  410. FCMP01:
  411.         MOV     A,M
  412.         CPI     '.'
  413.         JM      FCMP02
  414.         CPI     '['
  415.         JP      FCMP02
  416.         STAX    D
  417.         INX     D
  418.         INR     C
  419. FCMP02:
  420.         INX     H
  421.         DCR     B
  422.         JNZ     FCMP01
  423.         POP     H
  424.         MOV     M,C
  425.         INX     H
  426.         POP     D
  427.         RET
  428.         
  429. ;               CREATE A DISK FILE
  430.  
  431. ;               USED FOR OUTPUT FILES ONLY
  432.  
  433. ;               INPUT:          DE = @(FCB)
  434. ;               OUTPUT:         CARRY = ERROR
  435.  
  436. FREWRT:
  437.         MVI     A,22            ; SET UP
  438.         STA     FTEMP           ; FOR CREATE
  439.         CALL    FINIT
  440.         PUSH    PSW
  441.         LHLD    FPFBUF          ; INITIALIZE
  442.         CALL    FSVFBA          ; POINTER
  443.         CALL    FBCLR           ; CLEAR BUFFER
  444.         POP     PSW
  445.         RET
  446.  
  447. ;               OPEN A DISK FILE
  448.  
  449. ;               INPUT:          DE = @(FCB)
  450. ;               OUTPUT:         CARRY = ERROR
  451.  
  452. FRESET:
  453.         MVI     A,15            ; SET UP
  454.         STA     FTEMP           ; FOR OPEN
  455.         CALL    FINIT
  456.         PUSH    PSW
  457.         LHLD    FPFBUF          ; INITIALIZE
  458.         LXI     D,128           ; POINTER
  459.         DAD     D
  460.         CALL    FSVFBA
  461.         POP     PSW
  462.         RET
  463.  
  464. ;               CLOSE A DISK FILE
  465.  
  466. ;               INPUT:          DE = @(FCB)
  467. ;               OUTPUT:         CARRY = ERROR
  468.  
  469. FCLOS:
  470.         CALL    FADDR
  471.         LHLD    FPFBUF          ; WRITE
  472.         XCHG                    ; LAST
  473.         LHLD    FXFBA           ; RECORD
  474.         CALL    FCPHL
  475.         CNZ     FWRT02
  476.         MVI     A,16            ; SET
  477.         STA     FTEMP           ; UP
  478.         LHLD    FPFCB           ; FOR
  479.         XCHG                    ; CLOSE
  480.         JMP     FINIT
  481.  
  482. ;               DELETE A DISK FILE
  483.  
  484. ;               INPUT:          DE = @(FCB)
  485. ;               OUTPUT:         CARRY = 0
  486.  
  487. FDELE:  
  488.         MVI     A,19            ; SET UP
  489.         STA     FTEMP           ; FOR DELETE
  490.         CALL    FINIT
  491.         XRA     A               ; CLEAR CARRY
  492.         RET
  493.  
  494. ;               DISK INITIALIZATION
  495.  
  496. ;               INPUT:          DE = @(FCB)
  497. ;                               FTEMP = COMMAND
  498. ;               OUTPUT:         CARRY = ERROR
  499.  
  500. FINIT:
  501.         CALL    FADDR           ; GET FCB ADDRS
  502.         CALL    FSW             ; SELECT DEVICE
  503.         LHLD    FPFCB           ; RETRIEVE
  504.         XCHG                    ; DE
  505.         LDA     FTEMP           ; GET COMMAND
  506.         MOV     C,A             ; CREATE/OPEN/CLOSE
  507.         CALL    CPM             ; OR DELETE FILE
  508.         PUSH    PSW             ; SAVE ERRORS
  509.         CALL    FSW             ; DEVICE
  510.         POP     PSW             ; RETRIEVE AND
  511.         CPI     0FFH            ; TEST FOR
  512.         JZ      FINT01          ; ERROR
  513.         XRA     A               ; NO
  514.         RET
  515. FINT01:
  516.         STC                     ; SET
  517.         RET                     ; CARRY
  518.  
  519. ;               WRITE BYTE TO DISK BLOCK
  520.  
  521. ;               INPUT:          DE = @(FCB)
  522. ;                               A = BYTE
  523. ;               OUTPUT:         CARRY = ERROR
  524.  
  525. FWRIT:
  526.         STA     FTEMP           ; SAVE BYTE
  527.         CALL    FADDR           ; GET FCB ADDRS
  528. FWRT01:
  529.         LHLD    FPFBUF
  530.         LXI     D,128
  531.         DAD     D
  532.         XCHG                    ; BUFFER END ADDR IN DE
  533.         LHLD    FXFBA           ; CURRENT ADDR IN HL
  534.         CALL    FCPHL           ; TEST FOR END OF BUFFER
  535.         JZ      FWRT02          ; YES THEN WRITE
  536.         LDA     FTEMP           ; STORE DATA
  537.         MOV     M,A             ; BYTE IN BUFFER
  538.         INX     H               ; BUMP BUFFER POINTER
  539.         CALL    FSVFBA          ; AND SAVE IT
  540.         ORA     A
  541.         RET
  542. FWRT02:
  543.         CALL    FSW             ; SET DRIVE
  544.         LHLD    FPFCB
  545.         XCHG
  546.         MVI     C,21            ; WRITE
  547.         CALL    CPM             ; RECORD
  548.         PUSH    PSW             ; SAVE ERRORS
  549.         CALL    FSW             ; RESET DRIVE
  550.         POP     PSW             ; RETRIEVE AND
  551.         CPI     0               ; TEST FOR
  552.         JNZ     FWRTER          ; ERROR
  553.         LHLD    FPFBUF          ; RESET POINTER
  554.         CALL    FSVFBA          ; AND SAVE IT
  555.         CALL    FBCLR           ; CLEAR BUFFER
  556.         JMP     FWRT01          ; CONTINUE
  557. FWRTER:
  558.         STC                     ; FLAG ERROR
  559.         RET
  560.  
  561. ;               READ BYTE FROM DISK
  562.  
  563. ;               INPUT:          DE = @(FCB)
  564. ;               OUTPUT:         A = BYTE
  565. ;                               CARRY = ERROR
  566.  
  567. FREAD:
  568.         CALL    FADDR           ; GET FCB ADDRS
  569. FRD01:
  570.         LHLD    FPFBUF
  571.         LXI     D,128
  572.         DAD     D
  573.         XCHG                    ; BUFFER END ADDR IN DE
  574.         LHLD    FXFBA           ; CURRENT PONTER IN HL
  575.         CALL    FCPHL           ; TEST FOR END OF BUFFER
  576.         JZ      FRD02           ; YES SO GO READ
  577.         MOV     A,M             ; GET BYTE
  578.         INX     H               ; BUMP POINTER
  579.         CALL    FSVFBA          ; AND SAVE IT
  580.         ORA     A               ; RESET FLAG
  581.         RET
  582. FRD02:
  583.         CALL    FSW             ; SET DRIVE
  584.         LHLD    FPFCB
  585.         XCHG
  586.         MVI     C,20            ; READ
  587.         CALL    CPM             ; BLOCK
  588.         PUSH    PSW             ; SAVE ERRORS
  589.         CALL    FSW             ; RESET DRIVE
  590.         POP     PSW             ; RETRIEVE AND
  591.         CPI     0               ; TEST FOR
  592.         JNZ     FRDER           ; ERROR
  593.         LHLD    FPFBUF          ; RESET
  594.         CALL    FSVFBA          ; POINTER
  595.         JMP     FRD01
  596. FRDER:
  597.         STC                     ; FLAG ERROR
  598.         RET
  599.         
  600. ;               DRIVE SWITCH PROCEDURE
  601.  
  602. FSW:
  603.         PUSH    H
  604.         PUSH    D
  605.         LHLD    FPFBUF          ; SET
  606.         XCHG                    ; DMA
  607.         MVI     C,26
  608.         CALL    CPM
  609.         MVI     C,25            ; GET CURRENT
  610.         CALL    CPM             ; DRIVE NUMBER
  611.         MOV     B,A
  612.         LHLD    FPFDV
  613.         MOV     E,M             ; EXCHANGE
  614.         MOV     M,B             ; NUMBER
  615.         MVI     C,14            ; TELL
  616.         CALL    CPM             ; CPM
  617.         POP     D
  618.         POP     H
  619.         RET
  620.  
  621. ;               FCB ADDRESS COMPUTER
  622.  
  623. ;               INPUT:          DE = @(FCB)
  624.  
  625. FADDR:
  626.         PUSH    H
  627.         PUSH    D
  628.         XCHG
  629.         SHLD    FPFCB
  630.         LXI     D,FFBA
  631.         DAD     D
  632.         SHLD    FPFBA
  633.         MOV     E,M
  634.         INX     H
  635.         MOV     D,M
  636.         XCHG
  637.         SHLD    FXFBA
  638.         LHLD    FPFCB
  639.         LXI     D,FFDV
  640.         DAD     D
  641.         SHLD    FPFDV
  642.         LHLD    FPFCB
  643.         LXI     D,FFBUF
  644.         DAD     D
  645.         SHLD    FPFBUF
  646.         POP     D
  647.         POP     H
  648.         RET
  649.  
  650. ;               SAVE FBA PROCEDURE
  651.  
  652. ;               INPUT:          HL = POINTER
  653.  
  654. FSVFBA:
  655.         SHLD    FXFBA
  656.         XCHG
  657.         LHLD    FPFBA
  658.         MOV     M,E
  659.         INX     H
  660.         MOV     M,D
  661.         RET
  662.  
  663. ;               CLEAR OUTPUT BUFFER
  664.  
  665. FBCLR:
  666.         LHLD    FPFBUF
  667.         MVI     A,128
  668. FSVF01:
  669.         MVI     M,1AH
  670.         INX     H
  671.         DCR     A
  672.         JNZ     FSVF01
  673.         RET
  674.  
  675. ;               DOUBLE PRECISION COMPARE
  676.  
  677. ;               INPUT:          HL AND DE
  678. ;               OUTPUT:         EQUAL/NOT EQUAL
  679.  
  680. FCPHL:
  681.         MOV     A,H
  682.         CMP     D
  683.         RNZ
  684.         MOV     A,L
  685.         CMP     E
  686.         RET
  687.         
  688. ;               DATA STORAGE
  689.  
  690. FTEMP:  DS      2
  691. FPFCB:  DS      2
  692. FPFBA:  DS      2
  693. FXFBA:  DS      2
  694. FPFDV:  DS      2
  695. FPFBUF: DS      2
  696.         DS      32*2
  697. STACK:  DS      0
  698.  
  699.