FILE: TAPE_INTE:TOS      HEWLETT-PACKARD: TAPE_INTERFACE  (c) Coleco 1983 Confidential         Tue, 15 May 1984, 20:30     Page   1

      1                         ;^Z80^
      3                         ;NAME ^Rev 02 - GPB^
      4
      5                         De_TAPE_INTERFACE MACRO              ;Header Rev. 5
      6                                         .GOTO Ede_TAPE_INTERFACE
      7
      8                          Project:      TAPE, C101
      9                          
     10                          ******************************
     11                          *                            *
     12                          *  TAPE_INTERFACE      DTT   *
     13                          *                            *
     14                          ******************************
     15
     16                                Rev History
     17                                Rev.  Date         Name      Change
     18                                 2    11/2/83  GPB       CHANGED RANGE TO RANGE_ ( duplicate symbol problem)
     19                                 1    9/13/83  DTT       CHANGED TO ALLOW ERROR RETIRES
     20                                 0    7/5/83   DTT       Initial Pseudo Code
     21
     22                         Function:
     23                                 REQUEST READS AND WRITES AS DEFINED IN OCB.
     24                                 REQUESTS ABORT_TAPE.
     25                                 TEST STATUS OF TAPE REQUEST.
     26
     27
     28                         Ede_TAPE_INTERFACE  MEND
     29                         Pseudo_code_TAPE_INTERFACE    MACRO  ;Pseudocode macro area
     30                                  BEGIN:
     31                                      STORE OVERLAY_NUMBER
     32                                      HL := POINTER TO OCB  := OVERLAY_NUMBER*5 + OVERLAY_TABLE_POINTER
     33                                      MOVE OCB TO CSA
     34                                      IF WRITE THEN
     35                                          SEND WRITE_COMMAND
     36                                      ELSE
     37                                          SEND READ_COMMAND
     38                                      ENDIF
     39                                  END
     40                                            .GOTO Ep_TAPE_INTERFACE
     41
     42
     43
     44                         Ep_TAPE_INTERFACE  MEND
     45
     46                         ;Subroutines called
     47                         ;       EXT
     48
     49                         ;Subroutines defined
     50                                 GLOBAL  TEST_TAPE
     51                                 GLOBAL  ABORT_TAPE
     52                                 GLOBAL  LOAD_OVERLAY
     53                                 GLOBAL  WRITE_OVERLAY
     54                                 GLOBAL  CALC_OCB_ADDR
     55                                 GLOBAL  WRITE_BLOCKS
     56                                 GLOBAL  LOAD_BLOCKS

FILE: TAPE_INTE:TOS      HEWLETT-PACKARD: TAPE_INTERFACE  (c) Coleco 1983 Confidential         Tue, 15 May 1984, 20:30     Page   2

     57                                 GLOBAL  BLOCK_IO
     58                         ;       GLOBAL
     59
     60                         ;Operating system calls
     61                         ;       EXT
     62
     63                         ;Inputs/Outputs passed in registers
     64                         ;       A = OVERLAY NUMBER 1 thru N
     65                         ;       A <> 0 = ERROR
     66
     67                         ;External data areas used
     68                                 EXT     OCB_PTR                         ;POINTER TO OVERLAY CONTROL TABLE
     69
     70                         ;Global data areas defined
     71                                 GLOBAL OVERLAY_NUMBER
     72                                 GLOBAL TAPE_STATE
     73                                 GLOBAL CSA
     74                                 GLOBAL   XFER_ADDR
     75                                 GLOBAL   BLOCK_NUM
     76                                 GLOBAL   RANGE_
     77                         ;       GLOBAL
     78
     79                         ;Local equates
     80                         ;       EQU
     81
     82                         ;Global equates
     83                                    GLOBAL READ_TAPE
     84                                    GLOBAL WRITE_TAPE
     85                                    GLOBAL KILL_TAPE
     86           0081          READ_TAPE  EQU    81H
     87           0082          WRITE_TAPE EQU    82H
     88           0087          KILL_TAPE  EQU    87H
     89                         ;      INCLUDE File_name:userid
     90
     91
     92                                 PROG
     93
     94                         ;       TEST FOR COMPLETION OF IO REQUEST
     95   0000'                 TEST_TAPE:
     96   0000' 3A 0200"               LD A,(CSA)
     97   0003' B7                     OR A
     98   0004' C3 3D00'               JP       EXIT_TAPE
     99                         ;*
    100                         ;*
    101                         ;*
    102   0007'                 ABORT_TAPE:
    103   0007' 3E 87                   LD      A,KILL_TAPE
    104   0009' 32 0200"                LD      (CSA),A
    105   000C' C3 3D00'                JP      EXIT_TAPE
    106                         ;*
    107                         ;*
    108
    109   000F'                 CALC_OCB_ADDR:
    110   000F' 3D                     DEC     A                               ;ADDR = OCB_TABLE(OV_NUM-1*5)
    111   0010' 4F                     LD      C,A                             ;GET THE OVERLAY NUMBER IN C
    112   0011' 06 00                  LD      B,0
    113   0013' 2A 0000#               LD      HL,(OCB_PTR)                    ;POINTER TO THE OCB TABLE

FILE: TAPE_INTE:TOS      HEWLETT-PACKARD: TAPE_INTERFACE  (c) Coleco 1983 Confidential         Tue, 15 May 1984, 20:30     Page   3

    114   0016' 09                     ADD     HL,BC                           ;OCB_ADDR = OVERLAY_NUM*5 + START_OF_TABLE
    115   0017' 09                     ADD     HL,BC
    116   0018' 09                     ADD     HL,BC
    117   0019' 09                     ADD     HL,BC
    118   001A' 09                     ADD     HL,BC
    119   001B' C9                     RET
    120                         ;*
    121   001C'                 WRITE_OVERLAY:
    122   001C' 37                     SCF                                     ;SET CARRY FLAG IF WRITE INSTRUCTION!
    123   001D' 18 01                  JR      LD_1
    124                         ;*
    125                         ;*
    126   001F'                 LOAD_OVERLAY:
    127   001F' B7                     OR      A                               ;RESET CARRY FLAG IF READ
    128                         ;*
    129                         ;*
    130   0020'                 LD_1:
    131                         ;  BEGIN       (Ordinarily registers are restored; retain only the pushes and pops you need.)
    132                         ;*
    133                         ;*
    134                         ;*
    135   0020' 32 0000"               LD      (OVERLAY_NUMBER),A              ;FOR DEBUGGING PURPOSES
    136                         ;*
    137                         ;*
    138   0023' F5                     PUSH    AF  ;++++++++++++++++++++;
    139   0024' CD 0F00'               CALL    CALC_OCB_ADDR             ;
    140   0027' F1                     POP     AF  ;--------------------;       ;SAVE THE CARRY FLAG IF SET
    141                         ;*
    142   0028' 30 04                  JR      NC,LOAD_BLOCKS
    143
    144   002A'                 WRITE_BLOCKS:
    145   002A' 3E 82                   LD     A,WRITE_TAPE                    ;WRITE INSTRUCTIONS GO HERE
    146   002C' 18 02                   JR     BLOCK_IO
    147   002E'                 LOAD_BLOCKS:
    148   002E' 3E 81                   LD     A,READ_TAPE                     ;READ INSTRUCTIONS GO HERE
    149   0030'                 BLOCK_IO:
    150   0030' 11 0300"                LD     DE,CSA+1                 ;      ;POINT TO THE COMMAND STATUS AREA
    151   0033' 01 0500                 LD     BC,5                     ;      ;NUMBER OF BYTES TO MOVE
    152   0036' ED B0                   LDIR
    153   0038' 11 0200"                LD     DE,CSA
    154   003B' 12                      LD     (DE),A                          ;SET THE COMMAND IN THE CSA BUFFER
    155   003C' AF                      XOR    A
    156                                 GLOBAL  EXIT_TAPE
    157   003D'                 EXIT_TAPE:
    158   003D' C9                      RET
    159                         ;*********************************************************************************************
    160                          DATA
    161   0000"   0001          OVERLAY_NUMBER DEFS 1
    162   0001"   0001          TAPE_STATE     DEFS 1
    163   0002"   0006          CSA            DEFS 6
    164           0003"         XFER_ADDR      EQU CSA+1
    165           0005"         BLOCK_NUM      EQU XFER_ADDR+2
    166           0007"         RANGE_          EQU BLOCK_NUM+2

FILE: TAPE_INTE:TOS      HEWLETT-PACKARD: TAPE_INTERFACE  (c) Coleco 1983 Confidential         Tue, 15 May 1984, 20:30     Page   4

     0 Error(s) Detected.    62 Program Bytes.     8 Data Bytes.
    20 Symbols Detected.

FILE: TAPE_INTE:TOS      HEWLETT-PACKARD: TAPE_INTERFACE  (c) Coleco 1983 Confidential         Tue, 15 May 1984, 20:30     Page   5

Value   Symbol          Defined         Referenced:

0007' ABORT_TAPE           102      51
0030' BLOCK_IO             149      57   146
0005" BLOCK_NUM            165      75   166
000F' CALC_OCB_ADDR        109      54   139
0002" CSA                  163      73    96   104   150   153   164
003D' EXIT_TAPE            157      98   105   156
0087  KILL_TAPE             88      85   103
0020' LD_1                 130     123
002E' LOAD_BLOCKS          147      56   142
001F' LOAD_OVERLAY         126      52
0000# OCB_PTR                       68   113
0000" OVERLAY_NUMBER       161      71   135
0007" RANGE_               166      76
0081  READ_TAPE             86      83   148
0001" TAPE_STATE           162      72
0000' TEST_TAPE             95      50
002A' WRITE_BLOCKS         144      55
001C' WRITE_OVERLAY        121      53
0082  WRITE_TAPE            87      84   145
0003" XFER_ADDR            164      74   165