;^Z80^
TITLE FILE: TAPE_INTE:TOS      HEWLETT-PACKARD: TAPE_INTERFACE  (c) Coleco 1983 Confidential
;NAME ^Rev 02 - GPB^

De_TAPE_INTERFACE MACRO              ;Header Rev. 5
                .GOTO Ede_TAPE_INTERFACE

 Project:      TAPE, C101
 
 ******************************
 *                            *
 *  TAPE_INTERFACE      DTT   *
 *                            *
 ******************************

       Rev History
       Rev.  Date         Name      Change
        2    11/2/83  GPB       CHANGED RANGE TO RANGE_ ( duplicate symbol problem)
        1    9/13/83  DTT       CHANGED TO ALLOW ERROR RETIRES
        0    7/5/83   DTT       Initial Pseudo Code

Function:
        REQUEST READS AND WRITES AS DEFINED IN OCB.
        REQUESTS ABORT_TAPE.
        TEST STATUS OF TAPE REQUEST.


Ede_TAPE_INTERFACE  MEND
Pseudo_code_TAPE_INTERFACE    MACRO  ;Pseudocode macro area
         BEGIN:
             STORE OVERLAY_NUMBER
             HL := POINTER TO OCB  := OVERLAY_NUMBER*5 + OVERLAY_TABLE_POINTER
             MOVE OCB TO CSA
             IF WRITE THEN
                 SEND WRITE_COMMAND
             ELSE
                 SEND READ_COMMAND
             ENDIF
         END
                   .GOTO Ep_TAPE_INTERFACE



Ep_TAPE_INTERFACE  MEND

;Subroutines called
;       EXT

;Subroutines defined
        GLOBAL  TEST_TAPE
        GLOBAL  ABORT_TAPE
        GLOBAL  LOAD_OVERLAY
        GLOBAL  WRITE_OVERLAY
        GLOBAL  CALC_OCB_ADDR
        GLOBAL  WRITE_BLOCKS
        GLOBAL  LOAD_BLOCKS
        GLOBAL  BLOCK_IO
;       GLOBAL

;Operating system calls
;       EXT

;Inputs/Outputs passed in registers
;       A = OVERLAY NUMBER 1 thru N
;       A <> 0 = ERROR

;External data areas used
        EXT     OCB_PTR                         ;POINTER TO OVERLAY CONTROL TABLE

;Global data areas defined
        GLOBAL OVERLAY_NUMBER
        GLOBAL TAPE_STATE
        GLOBAL CSA
        GLOBAL   XFER_ADDR
        GLOBAL   BLOCK_NUM
        GLOBAL   RANGE_
;       GLOBAL

;Local equates
;       EQU

;Global equates
           GLOBAL READ_TAPE
           GLOBAL WRITE_TAPE
           GLOBAL KILL_TAPE
READ_TAPE  EQU    81H
WRITE_TAPE EQU    82H
KILL_TAPE  EQU    87H
;      INCLUDE File_name:userid


        PROG

;       TEST FOR COMPLETION OF IO REQUEST
TEST_TAPE:
       LD A,(CSA)
       OR A
       JP       EXIT_TAPE
;*
;*
;*
ABORT_TAPE:
        LD      A,KILL_TAPE
        LD      (CSA),A
        JP      EXIT_TAPE
;*
;*

CALC_OCB_ADDR:
       DEC     A                               ;ADDR = OCB_TABLE(OV_NUM-1*5)
       LD      C,A                             ;GET THE OVERLAY NUMBER IN C
       LD      B,0
       LD      HL,(OCB_PTR)                    ;POINTER TO THE OCB TABLE
       ADD     HL,BC                           ;OCB_ADDR = OVERLAY_NUM*5 + START_OF_TABLE
       ADD     HL,BC
       ADD     HL,BC
       ADD     HL,BC
       ADD     HL,BC
       RET
;*
WRITE_OVERLAY:
       SCF                                     ;SET CARRY FLAG IF WRITE INSTRUCTION!
       JR      LD_1
;*
;*
LOAD_OVERLAY:
       OR      A                               ;RESET CARRY FLAG IF READ
;*
;*
LD_1:
;  BEGIN       (Ordinarily registers are restored; retain only the pushes and pops you need.)
;*
;*
;*
       LD      (OVERLAY_NUMBER),A              ;FOR DEBUGGING PURPOSES
;*
;*
       PUSH    AF  ;++++++++++++++++++++;
       CALL    CALC_OCB_ADDR             ;
       POP     AF  ;--------------------;       ;SAVE THE CARRY FLAG IF SET
;*
       JR      NC,LOAD_BLOCKS

WRITE_BLOCKS:
        LD     A,WRITE_TAPE                    ;WRITE INSTRUCTIONS GO HERE
        JR     BLOCK_IO
LOAD_BLOCKS:
        LD     A,READ_TAPE                     ;READ INSTRUCTIONS GO HERE
BLOCK_IO:
        LD     DE,CSA+1                 ;      ;POINT TO THE COMMAND STATUS AREA
        LD     BC,5                     ;      ;NUMBER OF BYTES TO MOVE
        LDIR
        LD     DE,CSA
        LD     (DE),A                          ;SET THE COMMAND IN THE CSA BUFFER
        XOR    A
        GLOBAL  EXIT_TAPE
EXIT_TAPE:
        RET
;*********************************************************************************************
 DATA
OVERLAY_NUMBER DEFS 1
TAPE_STATE     DEFS 1
CSA            DEFS 6
XFER_ADDR      EQU CSA+1
BLOCK_NUM      EQU XFER_ADDR+2
RANGE_          EQU BLOCK_NUM+2