home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol090 / smove.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  2.1 KB  |  132 lines

  1. ;
  2. ; SYSLIB Module Name:  SMOVE
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    HMOVB        HMOVBC        MOVEB        MOVEBC
  8. ; Module External References:
  9. ;    None
  10. ;
  11.  
  12. ;
  13. ;  SMOVEB.MAC -- SYSLIB MODULE
  14. ;
  15. ;  ENTRY POINTS --
  16. ;    EXT    MOVEB        -- MOVE BYTES PTED TO BY HL TO
  17. ;                   LOCATION PTED TO BY DE FOR B BYTES
  18. ;    EXT    MOVEBC        -- MOVE BYTES PTED TO BY HL TO
  19. ;                   LOCATION PTED TO BY DE FOR BC BYTES
  20. ;
  21. ;  NO REGISTERS ARE TO BE AFFECTED
  22. ;
  23. ;    EXT    HMOVB        -- LIKE MOVEB, BUT HL AND DE PT TO BYTE AFTER
  24. ;                   LAST BYTE MOVED WHEN DONE
  25. ;    EXT    HMOVBC        -- LIKE MOVEBC, BUT HL AND DE PT TO BYTE AFTER
  26. ;                   LAST BYTE MOVED WHEN DONE
  27. ;
  28.  
  29. ;
  30. ;  SUPPORTING MACROS --
  31. ;
  32. PUTRG    MACRO        ; SAVE ALL REGS
  33.     PUSH    PSW
  34.     PUSH    B
  35.     PUSH    D
  36.     PUSH    H
  37.     ENDM
  38.  
  39. GETRG    MACRO        ; RESTORE ALL REGS
  40.     POP    H
  41.     POP    D
  42.     POP    B
  43.     POP    PSW
  44.     ENDM
  45.  
  46. ;
  47. ;  HMOVB AND HMOVBC ROUTINES --
  48. ;
  49. HMOVB::
  50.     CALL    MOVEB    ; DO THE MOVE
  51.     PUSH    B    ; SAVE BC
  52.     MOV    C,B    ; BC=B
  53.     MVI    B,0
  54.     DAD    B    ; HL PTS TO BYTE AFTER LAST BYTE MOVED
  55.     XCHG
  56.     DAD    B    ; DE PTS TO BYTE AFTER LAST BYTE MOVED
  57.     XCHG
  58.     POP    B    ; GET BC
  59.     RET
  60.  
  61. HMOVBC::
  62.     CALL    MOVEBC    ; DO THE MOVE
  63.     PUSH    B    ; SAVE BC
  64.     DAD    B    ; HL PTS TO BYTE AFTER LAST BYTE MOVED
  65.     XCHG
  66.     DAD    B    ; DE PTS TO BYTE AFTER LAST BYTE MOVED
  67.     XCHG
  68.     POP    B    ; GET BC
  69.     RET
  70.  
  71. ;
  72. ;  MOVEB AND MOVEBC ROUTINES --
  73. ;
  74. MOVEB::
  75.     PUSH    B    ; SAVE BC
  76.     MOV    C,B    ; C=B
  77.     MVI    B,0    ; B=0
  78.     CALL    MOVEBC    ; USE MOVEBC
  79.     POP    B    ; RESTORE BC
  80.     RET
  81.  
  82. MOVEBC::
  83.     PUTRG        ; SAVE ALL REGS
  84.  
  85. ;  DETERMINE IF HL < DE; IF SO, MOVE BACK TO FRONT; OTHERWISE, FRONT TO BACK
  86.     MOV    A,H    ; HL<DE?
  87.     CMP    D
  88.     JC    MOVER    ; MOVE BACK-TO-FRONT
  89.     JNZ    MOVEF    ; MOVE FRONT-TO-BACK IF HL>DE
  90.     MOV    A,L    ; HL<DE?
  91.     CMP    E
  92.     JC    MOVER    ; MOVE BACK-TO-FRONT
  93.  
  94. ;  MOVE FRONT-TO-BACK
  95. MOVEF:
  96.     MOV    A,M    ; GET BYTE
  97.     STAX    D    ; PUT BYTE
  98.     INX    H    ; PT TO NEXT
  99.     INX    D
  100.     DCX    B    ; COUNT DOWN
  101.     MOV    A,B    ; DONE?
  102.     ORA    C
  103.     JNZ    MOVEF
  104.  
  105. ;  DONE WITH PROGRAM
  106. DONE:
  107.     GETRG        ; RESTORE ALL REGS
  108.     RET
  109.  
  110. ;  MOVE BACK-TO-FRONT
  111. MOVER:
  112. ;  POINT TO END OF BUFFERS
  113.     DCX    B    ; DECR COUNT BY 1
  114.     DAD    B    ; PT TO END OF BUFFERS
  115.     XCHG
  116.     DAD    B
  117.     XCHG
  118.     INX    B    ; CORRECT BYTE COUNT
  119. ;  PERFORM MOVE
  120. MOVERL:
  121.     MOV    A,M    ; GET BYTE
  122.     STAX    D    ; PUT BYTE
  123.     DCX    H    ; PT TO NEXT
  124.     DCX    D
  125.     DCX    B    ; COUNT DOWN
  126.     MOV    A,B    ; DONE?
  127.     ORA    C
  128.     JNZ    MOVERL
  129.     JMP    DONE
  130.  
  131.     END
  132.