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 / ENTERPRS / CPM / UTILS / S / ZEN2.LBR / BIOSREL.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  8KB  |  342 lines

  1.     TITLE    'CP/M-85 BIOS RELOCATOR     06 APR 1982'
  2. ;***
  3. ;
  4. ;    CP/M-85 BIOS RELOCATOR.
  5. ;
  6. ;    THIS CODE RESIDES IN THE FILE 'BIOS85.SYS' ALONG WITH THE 8085
  7. ;    CODED PORTION OF THE REAL BIOS.  THE BIOS LOADER READS THE FILE
  8. ;    INTO MEMORY, THEN TRANSFERS CONTROL TO THIS RELOCATOR TO PLACE
  9. ;    THE 8085 CODED PORTION OF THE REAL BIOS INTO ITS PROPER SPOT
  10. ;    IN MEMORY.
  11. ;
  12.  
  13. REL0    EQU    0
  14. ASM86    EQU    0
  15.  
  16.  
  17. ;**    EXTRA PSEUDO OPS FOR USE WITH MAC
  18. ;
  19.  
  20. RB    MACRO    A
  21.     DS    A
  22.     ENDM
  23.  
  24. RW    MACRO    A
  25.     DS    2*A
  26.     ENDM
  27.  
  28.  
  29. ;***    EQUATES
  30. ;
  31.  
  32.  
  33. ;**    Z-MACHINE MEMORY MAP UTILIZATION EQUATES
  34. ;
  35.  
  36. BOOTORG    EQU    0400H            ;BOOT CODE LOAD ADDRESS
  37. BCODEL    EQU    256+32            ;MAXIMUM BOOT CODE LENGTH
  38.  
  39. BLDR88    EQU    BOOTORG+BCODEL        ;BIOS LOADER (8088 PORTION)
  40. BLDR88L    EQU    64            ;MAXIMUM BIOS LOADER (8088) LENGTH
  41.  
  42. B88STK    EQU    2*1024            ;8088 STACK AREA
  43.  
  44. B88DAT    EQU    B88STK            ;MONITOR ROM DATA AREA START ADDR
  45.  
  46. BIOS88    EQU    4*1024            ;WHERE 8088 CODE OF BIOS WILL RESIDE
  47.  
  48. BLDRP0    EQU    16*1024            ;BIOS LOADER PAGE ZERO BIAS VALUE
  49.  
  50.     IF    REL0
  51. BLOADER    EQU    0000H            ;WHERE BOOT CODE LOADS BIOS LOADER
  52.     ENDIF
  53.     IF    NOT REL0
  54. BLOADER    EQU    0100H            ;WHERE BOOT CODE LOADS BIOS LOADER
  55.     ENDIF
  56. BLDR85L    EQU    8*128-BCODEL-BLDR88L    ;MAXIMUM BIOS LOADER (8085) LENGTH
  57.  
  58. BOOT85    EQU    0000H            ;WHERE 8085 STARTS AFTER PROCESSOR SWAP
  59.  
  60. SWISWAP    EQU    0FEH            ;SWI FOR SWAPPING PROCESSORS
  61. SWAPVEC    EQU    SWISWAP*4        ; VECTOR ADDRESS
  62.  
  63.  
  64. BIAS    EQU    BLDRP0
  65. ;**    CP/M-85 SYSTEM EQUATES
  66. ;
  67.  
  68. ;    OS VALUES
  69.  
  70. CCPL    EQU    0800H            ;LENGTH OF CCP
  71. BDOSL    EQU    0E00H            ;LENGTH OF BDOS
  72.  
  73. ;    RESERVED LOCATIONS IN PAGE ZERO
  74.  
  75.     ORG    BIAS
  76. BOOT    RB    3            ;JUMP TO WARM START ENTRY
  77. IOBYTE    RB    1            ;IOBYTE
  78. DFTDRV    RB    1            ;CURRENT EFAULT DRIVE
  79. BDOS    RB    3            ;JUMP TO BDOS
  80. INT1    RB    8            ;INTERRUPT LOCATION 1
  81. INT2    RB    8            ;INTERRUPT LOCATION 2
  82. INT3    RB    8            ;INTERRUPT LOCATION 3
  83. INT4    RB    8            ;INTERRUPT LOCATION 4
  84. INT5    RB    8            ;INTERRUPT LOCATION 5
  85. INT6    RB    8            ;INTERRUPT LOCATION 6 (RESERVED)
  86. INT7    RB    8            ;INTERRUPT LOCATION 7 (USED BY DDT)
  87. BSCR    RB    16            ;16 BYTE SCRATCH AREA FOR BIOS
  88.     RB    12            ;12 BYTES NOT USED BUT RESERVED
  89. TFCB    RB    36            ;TRANSIENT DEFAULT FCB
  90. TFCB2    EQU    TFCB+16            ;TRANSIENT 2ND FILENAME
  91. TBUFF    RB    128            ;DEFAULT DISK BUFFER
  92. TPA    RB    0            ;START OF TRANSIENT PROGRAM AREA
  93.  
  94. ;    HEATH PAGE ZERO LOCATIONS
  95.  
  96.     IF    ASM86
  97.     ORG    OFFSET INT1+3
  98.     ENDIF
  99.     IF    NOT ASM86
  100.     ORG    INT1+3
  101.     ENDIF
  102. TICCNT    RW    2            ;32 BIT TIMER TIC COUNTER
  103. TIMEFLG    RB    1            ;TIMER 2 FLAG (0=RUNNING , 1=TIME OUT)
  104.  
  105.     IF    ASM86
  106.     ORG    OFFSET INT2
  107.     ENDIF
  108.     IF    NOT ASM86
  109.     ORG    INT2
  110.     ENDIF
  111. COMREG    RB    0            ;BIOS88 COMMUNICATION REGION
  112. COMFUNC    RB    1            ; BIOS FUNCTION VALUE = (#-CBOOT)/3
  113. COMRA    RB    1            ; (A)
  114. COMRBC    RW    0            ; (BC)
  115. COMRC    RB    1            ;  (C)
  116. COMRB    RB    1            ;  (B)
  117. COMRDE    RW    0            ; (DE)
  118. COMRE    RB    1            ;  (E)
  119. COMRD    RB    1            ;  (D)
  120. COMRHL    RW    0            ; (HL)
  121. COMRL    RB    1            ;  (L)
  122. COMRH    RB    1            ;  (H)
  123. COMWHO    RB    1            ;WHICH PROCESSOR IS RUNNING
  124.                     ; ZPSPPS5 = 8085
  125.                     ; ZPSPPS8 = 8088
  126.  
  127. BDMAP    EQU    BSCR+00H        ;DRIVE MAP (MAX OF 8 ENTRIES 0-7)
  128.     IF    ASM86
  129. BBIOS    EQU    WORD PTR BSCR+0EH    ;TRUE ADDRESS FOR START OF BIOS
  130.     ENDIF
  131.     IF    NOT ASM86
  132. BBIOS    EQU    BSCR+0EH        ;TRUE ADDRESS FOR START OF BIOS
  133.     ENDIF
  134.  
  135. ;    CP/M FUNCTIONS
  136.  
  137. RESET    EQU    0            ;SYSTEM RESET
  138. RDCON    EQU    1            ;READ CONSOLE
  139. WRCON    EQU    2            ;WRITE CONSOLE
  140. RDRDR    EQU    3            ;READ READER
  141. WRPUN    EQU    4            ;WRITE PUNCH
  142. WRLST    EQU    5            ;WRITE LIST
  143. DCONIO    EQU    6            ;DIRECT CONSOLE I/O (2)
  144. IOSTAT    EQU    7            ;INTERROGATE I/O STATUS
  145. ASTAT    EQU    8            ;ALTER I/O STATUS
  146. PRCONB    EQU    9            ;PRINT CONSOLE BUFFER
  147. RDCONB    EQU    10            ;READ CONSOLE BUFFER
  148. CCSTAT    EQU    11            ;CHECK CONSOLE STATUS
  149. LDH    EQU    12            ;LIFT DISK HEAD
  150. CPMVER    EQU    LDH            ;GET CP/M VERSION (2)
  151. RDS    EQU    13            ;RESET DISK SYSTEM
  152. SELDSK    EQU    14            ;SELECT DISK
  153. OPEN    EQU    15            ;OPEN FILE
  154. CLOSE    EQU    16            ;CLOSE FILE
  155. S1ST    EQU    17            ;SEARCH FIRST
  156. SNXT    EQU    18            ;SEARCH NEXT
  157. DELETE    EQU    19            ;DELETE FILE
  158. READ    EQU    20            ;READ RECORD
  159. WRITE    EQU    21            ;WRITE RECORD
  160. CREATE    EQU    22            ;CREATE FILE
  161. RENAME    EQU    23            ;RENAME FILE
  162. ILOG    EQU    24            ;INTERROGATE LOGIN
  163. IDSK    EQU    25            ;INTERROGATE DISK
  164. SETDMA    EQU    26            ;SET DMA ADDRESS
  165. IALLOC    EQU    27            ;INTERROGATE ALLOCATION
  166. WPD    EQU    28            ;WRITE PROTECT DISK
  167. GROV    EQU    29            ;GET READ/ONLY VECTOR
  168. SFA    EQU    30            ;SET FILE ATTRIBUTES
  169. GADPB    EQU    31            ;GET ADDR OF DPB
  170. SGUSR    EQU    32            ;SET/GET USER CODE
  171. READRR    EQU    33            ;READ RANDOM RECORD
  172. WRITERR    EQU    34            ;WRITE RANDOM RECORD
  173. CFSIZE    EQU    35            ;COMPUTE FILE SIZE
  174. SRR    EQU    36            ;SET RANDOM RECORD
  175. RESDRV    EQU    37            ;RESET DRIVE
  176. WRITERZ    EQU    40            ;WRITE RANDOM WITH ZERO FILL
  177.  
  178. ;    BIOS ENTRY POINTS.
  179. ;      GIVEN AS DISPLACEMENTS FROM WARM BOOT ENTRY POINT WHOSE
  180. ;      ADDRESS IS USUALLY AT LOCATION BOOT+1.
  181. ;      TO COMPUTE DISPLACEMENTS FROM VALUE STORED AT 'BBIOS'
  182. ;      SUBTRACT 'CBOOT'.  EG. DISPLACEMENT FOR WARM BOOT = WBOOT-CBOOT
  183.  
  184. CBOOT    EQU    -0003H            ;COLD BOOT
  185. WBOOT    EQU    0000H            ;WARM BOOT
  186. CONST    EQU    0003H            ;CONSOLE STATUS
  187. CONIN    EQU    0006H            ;CONSOLE INPUT
  188. CONOUT    EQU    0009H            ;CONSOLE OUTPUT
  189. LSTOUT    EQU    000CH            ;LIST OUTPUT
  190. PUNOUT    EQU    000FH            ;PUNCH OUTPUT
  191. RDRIN    EQU    0012H            ;READER INPUT
  192. HOME    EQU    0015H            ;HOME DISK
  193. SETDSK    EQU    0018H            ;SET (SELECT) DISK DRIVE
  194. SETTRK    EQU    001BH            ;SET TRACK NUMBER
  195. SETSEC    EQU    001EH            ;SET SECTOR NUMBER
  196. SDMA    EQU    0021H            ;SET DMA ADDRESS
  197. BREAD    EQU    0024H            ;READ SELECTED SECTOR
  198. BWRITE    EQU    0027H            ;WRITE SELECTED SECTOR
  199. BLSTST    EQU    002AH            ;CHECK LIST DEVICE STATUS
  200. BSECTRN    EQU    002DH            ;SECTOR TRANSLATE ROUTINE
  201. BFMT    EQU    0030H            ;FORMAT
  202. BRDTRK    EQU    0033H            ;READ TRACK
  203. BWRTRK    EQU    0036H            ;WRITE TRACK
  204. BWPC    EQU    0039H            ;WRITE PROTECT CHECK
  205. BCBD    EQU    003CH            ;CLEAR BUFFERS FOR DRIVE
  206.  
  207. ;    BIOS WRITE TYPES
  208.  
  209. BWRNOR    EQU    0            ;NORMAL WRITE
  210. BWRDIR    EQU    1            ;WRITE TO A DIRECTORY SECTOR
  211. BRWUA1    EQU    2            ;WRITE TO 1ST SECTOR OF UNALLOC BLOCK
  212.  
  213. ;    FILE CONTROL BLOCK
  214.  
  215.     ORG    0
  216. FCBDN    RB    1            ;DISK NAME
  217. FCBFN    RB    8            ;FILE NAME
  218. FCBFNL    EQU    8            ;FILE NAME LENGTH
  219. FCBFT    RB    3            ;FILE TYPE
  220. FCBFTL    EQU    3            ;FILE TYPE LENGTH
  221. FCBRO    EQU    FCBFT+0            ;R/O FLAG
  222. FCBROF    EQU    10000000B        ; R/O FLAG VALUE
  223. FCBSYS    EQU    FCBFT+1            ;SYS FLAG
  224. FCBSYSF    EQU    10000000B        ; SYS FLAG VALUE
  225. FCBEX    RB    1            ;EXTENT
  226.     RB    1
  227. FCBRWF    RB    1            ;R/W FLAG
  228. FCBRWFF EQU    10000000B        ; R/W FLAG VALUE
  229. FCBRC    RB    1            ;RECORD COUNT
  230. FCBDM    RB    16            ;DISK ALLOCATION MAP
  231. FCBNR    RB    1            ;NEXT RECORD TO BE READ OR WRITTEN
  232. FCBLS    EQU    33            ;FCB LENGTH FOR SEQUENTIAL I/O
  233. FCBRR    RB    3            ;RANDOM RECORD POINTER
  234. FCBLR    EQU    36            ;FCB LENGTH FOR RANDOM I/O
  235.  
  236.  
  237. ;**    MISCELLANEOUS EQUATES
  238. ;
  239.  
  240. BIOSREL    EQU    TPA+128            ;ORIGIN FOR RELOCATOR
  241. RELMODL    EQU    TPA+1            ;SLOT FOR LENGTH OF RELOCATABLE MODULE
  242. RELMOD    EQU    TPA+256            ;START OF RELOCATABLE MODULE
  243.  
  244.     PAGE
  245. ;***    MAIN PROGRAM
  246. ;
  247.  
  248.     ORG    BIOSREL
  249.  
  250.     LXI    SP,TPA            ;INIT (SP)
  251.  
  252. ;    COMPUTE RELOCATION FACTOR
  253.  
  254.     LHLD    BBIOS            ;GET ADDR OF BIOS MEMORY AREA
  255.     MOV    A,H            ;SAVE HIGH ORDER BYTE AS
  256.     STA    RELFCT            ; THE RELOCATION FACTOR
  257.  
  258. ;    COPY RELOCATABLE BIOS TO BIOS MEMORY AREA
  259.  
  260.     XCHG                ;(DE) = ADDR OF BIOS MEMORY AREA
  261.  
  262.     LHLD    RELMODL            ;GET RELOCATABLE MODULE LENGTH
  263.     MOV    B,H
  264.     MOV    C,L
  265.  
  266.     LXI    H,RELMOD        ;GET START OF RELOCATABLE MODULE
  267.  
  268. COPY:
  269.     MOV    A,M            ;DO COPY
  270.     STAX    D
  271.     INX    H
  272.     INX    D
  273.     DCX    B
  274.     MOV    A,B
  275.     ORA    C
  276.     JNZ    COPY
  277.  
  278. ;    DO RELOCATION
  279.  
  280.     LHLD    RELMODL            ;COMPUTE START OF RELOCATION TABLE
  281.     MOV    B,H            ; (BC)=# OF BYTES IN
  282.     MOV    C,L            ;      RELOCATABLE MODULE
  283.     LXI    H,RELMOD
  284.     DAD    B
  285.     XCHG                ;(DE)=START OF RELOCATION TABLE
  286.  
  287.     LHLD    BBIOS
  288.     XCHG                ;(DE)=START OF BIOS MEMORY AREA
  289.                     ;(HL)=RELOCATION TABLE POINTER
  290.  
  291. RELOC1:
  292.     PUSH    H            ;SAVE THE RELOCATION TABLE POINTER
  293.  
  294.     MOV    H,M            ;GET NEXT RELOCATION TABLE BYTE
  295.     MVI    L,8            ; WHICH CONTAINS RELOCATION FOR 8 ADDRS
  296.  
  297. RELOC2:
  298.     MOV    A,H            ;GET THE RELOCATION BYTE
  299.     RAL                ;ROTATE LEFT
  300.     MOV    H,A            ;RESAVE IT
  301.  
  302.     JNC    RELOC3            ;IF NO CARRY, THEN NO NEED TO ADJUST
  303.  
  304.     LDAX    D            ;GET BIOS BYTE
  305.     ADI    0            ;ADJUST BYTE BY RELOCATION FACTOR
  306. RELFCT    EQU    $-1
  307.     STAX    D            ;REPLACE BIOS BYTE WITH UPDATED VALUE
  308.  
  309. RELOC3:
  310.     INX    D            ;POINT TO NEXT BIOS BYTE
  311.     DCX    B            ;COUNT THIS BYTE AS DONE
  312.     MOV    A,B            ;IS ENTIRE MODULE RELOCATED
  313.     ORA    C
  314.     JZ    DOCOLD            ;BR IF DONE
  315.  
  316.     DCR    L            ;RELOCATION BYTE COUNTER
  317.     JNZ    RELOC2            ;BR IF MORE INFO IN THIS BYTE
  318.  
  319.     POP    H            ;RECAL POINTER TO RELOCATION TABLE
  320.     INX    H            ;BUMP POINTER
  321.     JMP    RELOC1            ;CONTINUE RELOCATION
  322.  
  323. ;    DONE WITH RELOCATION.  DO COLD BOOT.
  324.  
  325. DOCOLD:
  326.     LHLD    BBIOS            ;GET ADDR OF BIOS MEMORY AREA
  327.     PCHL                ;1ST INSTRUCTION THERE IS 
  328.                     ; JUMP TO COLD BOOT
  329.  
  330.  
  331.     IF    ($-BIOSREL) GT 128
  332. %:    RELOCATOR IS TOO LARGE
  333.     ENDIF
  334.  
  335.  
  336.     END
  337. ;1ST INSTRUCTION THERE IS 
  338.                     ; JUMP TO COLD BOOT
  339.  
  340.  
  341.     IF    ($-BIOSREL) GT 128
  342. %:    RELO