home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / GENASM / PRLOD.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  3KB  |  125 lines

  1. ;    PRLOADER.ASM VERSION 1.0
  2. ;    11/3/80 BY RON FOWLER, WESTLAND, MICHIGAN
  3. ;
  4. ;
  5. ;    THIS PROGRAM IS A LOADER DESIGNED TO BE
  6. ;    ADDED TO A PROGRAM REQUIRING RELOCATION.
  7. ;    THE PROGRAM MUST BE OF TYPE PRL, AND THIS
  8. ;    CODE (IN HEX FORM) MUST BE ADDED TO IT
  9. ;    VIA DDT OR SID.  THE PROCEDURE IS:
  10. ;
  11. ;        A>DDT <FILENAME>.PRL
  12. ;        *IPRLOADER.HEX
  13. ;        *R
  14. ;        *^C
  15. ;        A>SAVE XX <FILENAME>.COM
  16. ;
  17. ;    THE FILE SIZE PARAMETER LOCATED IN THIS
  18. ;    CODE AT LOCATION 101H IS FILLED IN BY
  19. ;    GENMOD.COM IN THE PRL FILE.  THE FILE
  20. ;    RELOCATION ADDRESS AT 104H IS FILLED IN
  21. ;    BY THE USER, AND IF LEFT 0, WILL CAUSE
  22. ;    THE FILE TO LOAD UNDER THE CCP.  IF SET
  23. ;    TO 0001H, THE FILE WILL LOAD UNDER THE
  24. ;    BDOS, OVERLAYING THE CCP.
  25. ;
  26. BDOS    EQU    5
  27. BYE    EQU    1    ;THIS SPECIALLY FOR BYE PGM
  28. CPM2    EQU    1    ;THIS NEEDED ONLY FOR BYE
  29. COMUSR    EQU    15    ;THIS TOO...USED WITH RBBS
  30. ;
  31. ;
  32.     ORG    100H
  33. ;
  34.     DB    01H    ;LXI B
  35.     DS    2    ;GENMOD FILLS IN PGM SIZE HERE
  36.     LXI    H,0    ;PGM RUN ADRS, IF 0 OR 1 THEN IN TPA
  37.     LXI    SP,200H ;MAKE SURE SPACE AVAILABLE WHEN MODIFYING THIS PGM
  38.     LXI    D,200H    ;ADRS OF PRL STUFF
  39.     MOV    A,H    ;IF H IS NZ, THEN WE HAVE..
  40.     ORA    A    ;..ADRS TO RELOCATE TO
  41.     JNZ    MOVE
  42.     MOV    A,L    ;NO REL ADRS SUPPLIED, CHECK OPTIONS
  43.     LHLD    6    ;TOPMEM FOR LATER
  44.     ORA    A    ;IF ADRS WAS NOT ZERO..
  45.     MOV    A,H
  46.     JNZ    OVLCCP    ;..THEN FORGET THE CCP
  47.     SUI    8    ;..ELSE SAVE SPACE FOR IT
  48. OVLCCP: DCR    A 
  49.     SUB    B    ;SUBTRACT OUR PROGRAM SIZE
  50.     MOV    H,A    ;SAVE IN HL
  51. ;
  52. ;    AT THIS POINT, ADD IN ANY NECESSARY
  53. ;    CODE TO TEST L=6...THIS MAY BE NECESSARY
  54. ;    TO DETERMINE IF THIS CODE IS ALREADY IN
  55. ;    MEMORY
  56. ;
  57.     MVI    L,0    ;RELOC ADRS MUST BE ON PAGE BOUNDARY
  58. MOVE:    XCHG        ;SHIFT GEARS
  59.     PUSH    B    ;SAVE COUNT
  60.     PUSH    D    ;AND REL ADRS
  61. MOVLOP: MOV    A,B    ;CHECK COUNT FOR ZERO
  62.     ORA    C
  63.     JZ    RELOC    ;EXIT LOOP WHEN COUNT=0
  64.     DCX    B    ;COUNTDOWN
  65.     MOV    A,M    ;PICK UP
  66.     STAX    D    ;PUT DOWN
  67.     INX    D    ;BUMP POINTERS
  68.     INX    H
  69.     JMP    MOVLOP    ;AND LOOP
  70. ;
  71. ;    THE CODE HAS BEEN MOVED, NOW RELOCATE
  72. ;    IT AT IT'S NEW LOCATION.
  73. ;
  74. RELOC:    POP    D    ;GET RELOC ADRS
  75.     POP    B    ;GET BACK COUNT
  76.     PUSH    H    ;SAVE BITMAP POINTER
  77.     MOV    H,D    ;BASE PAGE ADDRESS IN H
  78. RLOOP:    MOV    A,B    ;TEST COUNT FOR ZERO
  79.     ORA    C
  80.     JZ    FINISH    ;EXIT LOOP WHEN COUNT=0
  81.     DCX    B    ;BUMPDOWN COUNT
  82.     MOV    A,E    ;CHECK BYTE BOUNDARY..
  83.     ANI    7    ;..OF BIT MAP
  84.     JNZ    NOT8    ;SKIP IF NOT OUT OF BITS
  85.     XTHL        ;ELSE GET BITMAP POINTER
  86.     MOV    A,M    ;GET NEXT BYTE FROM BITMAP
  87.     INX    H    ;POINT AHEAD
  88.     XTHL        ;RESTORE THINGS
  89.     MOV    L,A    ;BITMAP BYTE GOES IN L
  90. NOT8:    MOV    A,L    ;TEST NEXT BIT
  91.     RAL
  92.     MOV    L,A    ;PUT SHIFTED BIT BACK FOR NXT TIME
  93.     JNC    NOTREL    ;BITS THAT ARE ZERO ARE NOT RELOC'ED
  94.     LDAX    D    ;ELSE GET NEXT BYTE INTO ACCUMULATOR
  95.     ADD    H    ;ADD BASE PAGE
  96.     STAX    D    ;STORE IT BACK RELOCATED
  97. NOTREL: INX    D    ;BUMP PROGRAM POINTER
  98.     JMP    RLOOP    ;THEN LOOP
  99. FINISH: POP    D
  100.     MVI    L,0
  101.     PUSH    H    ;SAVE ADRS TO JMP TO FOR LATER
  102. ;
  103. ;    INSERT ANY CODE NEEDED BEFORE BRANCH
  104. ;    TO PROGRAM AT THIS POINT.
  105. ;
  106.     IF    BYE    ;DO THIS STUFF FOR BYE PROGRAM
  107.     MVI    A,0C3H    ;CLEAR ANY TRAPS SO SYSOP..
  108.     STA    0    ;CAN USER "BYE /A"
  109.     XRA    A    ;NEXT WARMBOOT TO USR0/DRV A
  110.     STA    4
  111.     MVI    C,14    ;MAKE DRIVE A DEFAULT
  112.     MOV    E,A    ;LOG-IN DRIVE CP/M FUNCTION
  113.     CALL    BDOS
  114.     ENDIF        ;OF (IF BYE)
  115. ;
  116.     IF    CPM2 AND BYE ;SET USER 0
  117.     MVI    C,32    ;GET/SET USR CP/M FUNCTION
  118.     MVI    E,COMUSR
  119.     CALL    BDOS
  120.     ENDIF        ;OF (IF CPM2 AND BYE)
  121. ;
  122.     RET        ;TO ADRS PUSH'ED ABOVE
  123.  
  124.  
  125.