CP/M MACRO ASSEM 2.0 #001 LOAD CPM 10 DEC 87 RHP TITLE 'LOAD CPM 10 DEC 87 RHP' ;LOADS CPM AS A FILE AND MOVES IT INTO POSITION ;BASED ON PRLMOVE.ASM ; ;FILE: PRLMOVE.ASM ;FROM LIFELINES VOL II,NO 8 ; ;ENTERED 3 DEC 84 RHP ; ;******************************************************* ;PRL FILE FORMAT RELOCATER FOR BIT MAPPED FILES ;******************************************************* ;THIS SMALL PROGRAM BLOCK MOVES A BIT MAP RELOCATABLE ;FILE FROM ADDRESS 0200H ABOVE THIS MODULE UP TO A SPOT ;BELOW THE CCP AND THEN JUMPS TO THE BASE OF THE MOVED ;CODE. THE DIGITAL RESEARCH RELOCATING ASSEMBLER AND THE ;COMPANION LINKER PERMIT THE GENERATION OF THE PRL FILE ;FORMAT. LINK WILL PUT THE CODE SIZE WORD INTO ADDRESS ;101 AND 102. THE CODE SPOT IS INTENDED TO BE 0200H WITH ;THE BIT MAP IMMEDIATLY ABOVE THE CODE. A ONE IN THE ;BIT MAP INDICATES THE LOCATION OF A MOVED BYTE THAT ;REQUIRES A RELOCATION ADDRESS OFFSET. ; ;REVAMPED TO MOVE CPM CCP/BDOS/BIOS TO TOP OF MEMORY ; ;******************************************************* ; ;START POINT FOR THE BEGINNING OF THE MOVER PROGRAM ; 0100 ORG 0100H ; ;GENERAL CPM BDOS EQUATES ; 0005 = BDOS EQU 0005H ;FILE MANAGER ENTRANCE LOC. 0200 = CODEST: EQU 0200H ;LINK 80 CODE START POINT ; FOR ORG 0 FILE DFFF = MEMTOP: EQU 0DFFFH ;TOP OF AVAILABLE MEMORY 0016 = CPMLG: EQU 016H ;CCP+BDOS=1600H ; ;START POINT OF MOVER CODE ; 0100 01 START: DB 01H ;LOAD CODE SIZE AT START+1 0101 DS 2 ;SIMULATE LXI B,XXXX FOR OLAY ; LXI H,0000H ;GET CCP STACK FOR LATER ; DAD SP ; PASSING TO RELOCATED PRGM 0103 310002 LXI SP,CODEST ;STACK WORKS DOWN FROM CODE ; PUSH H ;SAVE OLD STACK ON NEW STACK 0106 C5 PUSH B ;SAVE CODE SIZE ON NEW STACK ; ;GET BDOS PAGE ADDRESS BOUNDRY (HI MEMORY) ; ; LXI H,BDOS+2 ;PAGE ADDRESS OF BDOS CODE 0107 21FFDF LXI H,MEMTOP ;*POINT AT TOP OF MEMORY ; MOV A,M ;INTO A 010A 7C MOV A,H ;HI MEM PAGE ; SUI 8 ;DOWN 8 PAGES FOR CCP CP/M MACRO ASSEM 2.0 #002 LOAD CPM 10 DEC 87 RHP 010B 3D DCR A ;ONCE MORE FOR PAGE FRACTION 010C 90 SUB B ;- CODE SIZE IN TRNC INT SIZE 010D 57 MOV D,A ;DE=DESTINATION BASE 010E 1E00 MVI E,0 0110 D5 PUSH D ;SAVE ADDR FOR JUMP TO CODE 0111 210002 LXI H,CODEST ;START MOVE POINTER TO HL ; ;LOOP TO MOVE CODE UP IN RAM UNDER CCP (HI MEMORY) ; 0114 78 MOVLOOP:MOV A,B ;CHK BYTE CNT, ALL MOVED YET? 0115 B1 ORA C 0116 CA2101 JZ MOVDONE ;EXIT OP IF DONE 0119 0B DCX B ;DECR BYTES TO MOVE COUNT 011A 7E MOV A,M ;MOVE THE BYTE 011B 12 STAX D ;PUT AT DEST ADDR 011C 13 INX D ;NEXT DEST 011D 23 INX H ;NEXT SOURCE 011E C31401 JMP MOVLOOP ;KEEP ON TRUCKING ; ;CODE MOVED, NOW SCAN THE BIT MAP ; 0121 D1 MOVDONE:POP D ;GET DEST ADDR 0122 C1 POP B ;GET BYTE COUNT 0123 E5 PUSH H ;SAVE BIT MAP ADDR ON STACK 0124 62 MOV H,D ;SET H TO RELOC PAGE OFFSET 0125 25 DCR H ; ;LOOP TO SCAN CODE BLOCK JUST MOVED AND TO ADD IN OFFSET OF ;EXECUTION PAGE ADDRESS ON ALL BYTES NEEDING RELOCATION. ; RELOCLOOP: 0126 78 MOV A,B ;CHECK BIT CNTER,RELOC COMPL? 0127 B1 ORA C 0128 CA4401 JZ RELOCDONE ;ALL BYTES DONE 012B 0B DCX B ;DEC BYTE COUNT 012C 7B MOV A,E ;IS DE ADDR MOD 8 BYTES? 012D E607 ANI 07H ;IF SO,NEED NEXT BIT MAP BYTE 012F C23701 JNZ SAMEBYTE ;STILL ON SAME BIT MAP BYTE ; ;GET NEXT BIT MAP BYTE VIA POINTER ON STACK ; 0132 E3 XTHL ;SAVE HL & GET CURNT MAP PNTR 0133 7E MOV A,M ;MAP BYTE TO A 0134 23 INX H ;BUMP POINTER FOR NEXT TIME 0135 E3 XTHL ;REPLACE POINTER ON STACK 0136 6F MOV L,A ;MAP BYTE TO HOLDING REG. ; SAMEBYTE: 0137 7D MOV A,L ;GET CURRENT BIT MAP BYTE 0138 17 RAL ;SHIFT ONE BIT 0139 6F MOV L,A ;SAVE SHFTD BIT FOR NXT PASS 013A D24001 JNC NOOFFSET ;0=NO OFFSET NEEDED ; ;GET CODE BYTE AND ADD IN OFFSET IF MAP BIT WAS 1 ; 013D 1A LDAX D ;GET THE DEST BYTE CP/M MACRO ASSEM 2.0 #003 LOAD CPM 10 DEC 87 RHP 013E 84 ADD H ;ADD THE OFFSET 013F 12 STAX D ;PUT IT BACK ; NOOFFSET: 0140 13 INX D ;BUMP THE MOVED CODE BYTE PTR 0141 C32601 JMP RELOCLOOP ;BACK FOR MORE BYTES ; ; THE RELOC IS DONE & READY TO JUMP TO THE MOVED CODE ;H HAS PAGE ADDRESS OF THE MOVED CODE ; RELOCDONE: ; POP D ;GET BIT MAP PNTR OFF STACK 0144 54 MOV D,H 0145 14 INR D ;SET UP EXECUTION ADDR 0146 C616 ADI CPMLG ;*POINT TO COLD BOOT 0148 1E00 MVI E,0 ;MAKE DE AN EVEN PAGE BOUNDRY ; POP H ;GET THE CCP STACK POINTER ; SPHL ;RESET TO GO TO MOVED PROGRAM 014A EB XCHG ;GET TRANSFER ADDR FROM DE 014B E9 PCHL ;JUMP TO THE NEW CODE ; 014C END