;^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