home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / cpu / vu_xm1c / save2new.asm < prev    next >
Assembly Source File  |  1990-04-30  |  5KB  |  208 lines

  1.  
  2.     ;  file = save2new.asm
  3.     ;  part of The Hyper-Space Library (r)
  4.  
  5.     ;  written by Terrance Hodgins, March, 1990
  6.  
  7.         page    60,132
  8.         title    save2new
  9.  
  10.     ;  copyright (C) 1990 by Terrance E. Hodgins,
  11.     ;  dba Semi-Intelligent Systems (r).  All rights reserved.
  12.     ;
  13.     ;  Semi-Intelligent Systems, and The Hyper-Space Library,
  14.     ;  are registered trademarks of Semi-Intelligent Systems.
  15.  
  16.  
  17.     ;  Disclaimer of Warranty
  18.     ;
  19.     ;  TERRANCE E. HODGINS, AND SEMI-INTELLIGENT
  20.     ;  SYSTEMS, EXCLUDE ANY AND ALL IMPLIED WARRANTIES,
  21.     ;  INCLUDING WARRANTIES OF MERCHANTABILITY AND
  22.     ;  FITNESS FOR A PARTICULAR PURPOSE.
  23.     ;
  24.     ;  NEITHER TERRANCE E. HODGINS, NOR SEMI-INTELLIGENT
  25.     ;  SYSTEMS, MAKE ANY WARRANTY OF REPRESENTATION,
  26.     ;  EITHER EXPRESS OR IMPLIED, WITH RESPECT TO THIS
  27.     ;  PROGRAM, ITS QUALITY, PERFORMANCE,
  28.     ;  MERCHANTABILITY, OR FITNESS FOR A PARTICULAR
  29.     ;  PURPOSE.
  30.     ;
  31.     ;  NEITHER TERRANCE E. HODGINS, NOR SEMI-INTELLIGENT
  32.     ;  SYSTEMS, SHALL HAVE ANY LIABILITY FOR SPECIAL,
  33.     ;  INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  34.     ;  OF OR RESULTING FROM THE USE OR MODIFICATION OF
  35.     ;  THIS PROGRAM.
  36.     ;
  37.     ;  THE USE OF THE 80286 LOADALL INSTRUCTION IS
  38.     ;  INHERENTLY DANGEROUS, AND CAN RESULT IN PROGRAM
  39.     ;  CRASHES, OR RUN-AWAY PROGRAMS, WHICH CAN ALTER,
  40.     ;  DAMAGE, OR DESTROY COMPUTER DATA, AND WHICH CAN
  41.     ;  DAMAGE OR DESTROY COMPUTER HARDWARE.
  42.     ;  USE ONLY AT YOUR OWN RISK.
  43.  
  44.  
  45.         .model    small,c
  46.         .286p
  47.  
  48.         ; subroutines:
  49.         public    save2new
  50.  
  51.  
  52.         ; variables:
  53.         public    new_Reg_Buf
  54.  
  55.         public    newMSW, newDead, newTR, newFlagWord
  56.  
  57.         public    newIP, newLDT, newDS, newSS, newCS, newES
  58.  
  59.         public    newDI, newSI, newBP, newSP
  60.  
  61.         public    newBX, newDX, newCX, newAX
  62.  
  63.         public    newESDC, newCSDC, newSSDC, newDSDC
  64.  
  65.         public    newGDTR, newLDTDC, newIDTR, newTSSDC
  66.  
  67.         extrn    flip3:near
  68.         extrn    wseg2abs:near
  69.  
  70.  
  71.         .code
  72.  
  73. ;    ------------------------------------------------------
  74.  
  75.  
  76.     ; save the original state of the machine,
  77.     ; in a new table, for a base-line setup, to then
  78.     ; change before a loadall.
  79.  
  80. save2new    proc    near
  81.         pusha
  82.         push    es
  83.         push    ds
  84.  
  85.         mov    newAX,ax
  86.         mov    newCX,cx
  87.         mov    newDX,dx
  88.         mov    newBX,bx
  89.  
  90.         mov    newBP,bp
  91.  
  92.         ; SP must be done later, when stack is emptier
  93.  
  94.         mov    newSI,si
  95.         mov    newDI,di
  96.  
  97.         mov    newES,es
  98.         mov    newCS,cs
  99.         mov    newSS,ss
  100.         mov    newDS,ds
  101.  
  102.         ; now convert the segment values to 24-bit absolute
  103.         ; addresses, and put them in the descriptor caches.
  104.         mov    ax,es
  105.         mov    di,offset newESDC
  106.         call    wseg2abs
  107.  
  108.         mov    ax,cs
  109.         mov    di,offset newCSDC
  110.         call    wseg2abs
  111.  
  112.         mov    ax,ss
  113.         mov    di,offset newSSDC
  114.         call    wseg2abs
  115.  
  116.         mov    ax,ds
  117.         mov    di,offset newDSDC
  118.         call    wseg2abs
  119.  
  120.         ; save flags.  We want to save a flags word with the
  121.         ; interrupts turned off, because this is the state
  122.         ; that the machine will be in immediately after the
  123.         ; loadall, and we don't want an interrupt horning in then.
  124.         cli
  125.         cld
  126.         nop
  127.         nop
  128.         pushf
  129.         pop    newFlagWord
  130.         sti
  131.  
  132.         ; save machine status word.  In real mode, this is usually 0.
  133.         smsw    ax
  134.         and    ax,0Fh        ; only the lowest 4 bits are used
  135.         mov    newMSW,ax
  136.  
  137.         ; save current data in the Global Descriptor Table Register
  138.         sgdt    qword ptr gdtr_n
  139.         mov    si,offset gdtr_n    ; ptr to temp buffer
  140.         mov    di,offset newGDTR    ; ptr to dest for fixed data
  141.         call    flip3            ; flip around word order
  142.  
  143.         ; save current data in the Interrupt Descriptor Table Register
  144.         sidt    qword ptr idtr_n
  145.         mov    si,offset idtr_n    ; ptr to temp buffer
  146.         mov    di,offset newIDTR    ; ptr to dest for fixed data
  147.         call    flip3            ; flip around word order
  148.  
  149.         pop    ds
  150.         pop    es
  151.         popa
  152.         mov    newSP,sp    ; save sp with 1 return addr on stack
  153.         ret
  154. save2new    endp
  155.  
  156.  
  157. ;    -----------------------------------------------------
  158. ;    -----------------------------------------------------
  159.  
  160.  
  161.         .data
  162.  
  163.  
  164. ;    LOADALL Register Load Table for saving and restoring the
  165. ;    original machine state.
  166.  
  167. new_Reg_Buf    dw    3 dup (0)    ; unused
  168. newMSW        dw    0
  169. newDead        dw    7 dup (0)    ; unused
  170. newTR        dw    0
  171. newFlagWord    dw    0
  172. newIP        dw    0
  173. newLDT        dw    0
  174.  
  175. newDS        dw    0
  176. newSS        dw    0
  177. newCS        dw    0
  178. newES        dw    0
  179.  
  180. newDI        dw    0
  181. newSI        dw    0
  182. newBP        dw    0
  183. newSP        dw    0
  184.  
  185. newBX        dw    0
  186. newDX        dw    0
  187. newCX        dw    0
  188. newAX        dw    0
  189.  
  190. newESDC        dw    0,    9200h,    0FFFFh
  191. newCSDC        dw    0,    9200h,    0FFFFh
  192. newSSDC        dw    0,    9200h,    0FFFFh
  193. newDSDC        dw    0,    9200h,    0FFFFh
  194.  
  195. newGDTR        dw    0,    0,    0
  196. newLDTDC    dw    0000h,    0FF0Eh,    88h
  197. newIDTR        dw    0,    0,    0
  198. newTSSDC    dw    0100h,    0FF0Eh,    800h
  199.  
  200.  
  201. ; temporary buffers for the data from the sgdt and sidt instructions.
  202. gdtr_n        dq    0
  203. idtr_n        dq    0
  204.  
  205.  
  206.         end
  207.  
  208.