TITLE GETBUF RSX to allocate buffer in high memory ;************************************************************************ ; * ; This RSX returns the address of a buffer resident within * ; the RSX. * ; * ; On return HL = buffer address * ; BC = buffer length (always = 229) * ; * ; This RSX uses Ron Fowler's RSX calling convention: in the * ; RSX parameter block, * ; * ; FUNC = 127 * ; NUMPARMS = 1 (for this RSX) * ; PARM1 = address of RSX name in the calling * ; program. * ; * ; 16 Feb 84 HRC * ; * ;************************************************************************ .Z80 CSEG PREFIX: DB 0,0,0,0,0,0 ; CP/M 3.0 SERIAL NUMBER. ENTRY: JP BEGIN ; JP TO ENTRY POINT. NEXT: DB 0C3H ; JP INSTRUCTION OPCODE FOR THE DW 0 ; NEXT RSX OR THE LOADER. DW 0 ; PREVIOUS RSX. REMOVE: DB 0FFH ; REMOVE RSX ON WARM START. DB 0 ; CAN LOAD IN BANKED SYSTEM. MYNAME: DB 'GETBUF ' ; RSX NAME. DB 0 ; THIS IS THE LOADER - FLAG. DB 0,0 ; RFU. BEGIN: LD A,C ; GET BDOS FUNCTION CODE AND SEE CP 60 ; IF IT IS A RSX CALL. JP NZ,NEXT ; PASS ON IF IT IS NOT. LD A,(DE) ; HAVE AN RSX CALL SO GET THE CP 127 ; FUNCTION NO AND SEE OF OURS. JP NZ,NEXT ; PASS ON IF NOT. PUSH DE EX DE,HL ; NOW TEST IF NUMBER OF PARMS IS INC HL ; CORRECT FOR THIS RSX. LD A,(HL) CP 1 ; WE USE ONE PARAMETER. JP NZ,PASSON ; PASS ON IF NOT OURS. INC HL ; IF OURS, CHECK THE NAME. LD E,(HL) ; GET USER SUPPLIED NAME INC HL ; IN DE REGISTER. LD D,(HL) LD HL,MYNAME LD B,8 ; 8 CHARACTER NAME. LOOP: LD A,(DE) ; GET NEXT CHAR OF NAME AND CP (HL) ; COMPARE WITH PASSED NAME. INC HL ; (DOUBLE REGISTER INCREMENT) INC DE ; (DOES NOT CHANGE ZERO FLAG) JP NZ,PASSON ; NOT OUR NAME. DJNZ LOOP ; THIS CHAR OK, TEST ANOTHER. ; OK, HAVE A CALL FOR US. LD HL,(NEXT+1) ; THE BUFFER CAN ONLY BE ALLOCATED LD (ENTRY+1),HL ; ONCE SO CHANGE ENTRY ADDRESS TO ; THE NEXT RSX ADDRESS. THEN THE LD HL,BEGIN ; BUFFER CAN OVERLAY THE RSX CODE. LD BC,PREFIX+256-BEGIN ; LENGTH OF THE BUFFER. POP DE ; RETURN TO CALLING PROGRAM. XOR A ; SIGNAL 'WE DONE IT'. RET PASSON: POP DE ; PASS ON TO THE NEXT RSX. JP NEXT ; C REGISTER WAS NOT MODIFIED. END