Advertisement
Guest User

Untitled

a guest
May 7th, 2014
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %define     BOCHS_HD_IMAGE              ;define this when booting in Bochs as a hard drive image
  2.  
  3. %define     CONSOLE_WIDTH               0x4E
  4. %define     RTC_DIVIDER                 0xF
  5. %define     PADDLE_WIDTH                0x08
  6. %define     PADDLE_SPEED                0x2
  7.  
  8.     BITS    16                          ;we are running in real mode, so 16 bit only
  9.  
  10.     [org    0x7C00]                     ;set origin address to 0x7C00. This is where BIOS drops us off in RAM
  11.  
  12. boot:
  13.  
  14.     cli                                 ;halt interrupts
  15.    
  16.     xor     ax, ax
  17.     mov     ds, ax                      ;set data segment register
  18.     mov     gs, ax                      ;set general-use segment register
  19.    
  20.     mov     ax, 0B800h
  21.     mov     es, ax                      ;VGA color text data segment
  22.    
  23.     mov     ax, 07E0h
  24.     mov     ss, ax                      ;set stack segment register
  25.     mov     bp, ax                      ;set stack base pointer. bottom of stack
  26.     mov     sp, 9C00h                   ;set stack pointer. top of stack
  27.    
  28.     mov     ax, word int70h_handler     ;setup 70h interrupt for RTC timer
  29.     mov     [gs:70h*4], ax              ;set interrupt offset
  30.     mov     [gs:70h*4+2], ds            ;set interrupt segment
  31.    
  32.     mov     ax, word int09h_handler     ;setup 09h for keyboard
  33.     mov     [gs:09h*4], ax              ;set interrupt offset
  34.     mov     [gs:09h*4+2], ds            ;set interrupt segment
  35.      
  36.  
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  46. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Init Routine    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  47.  
  48. init:
  49.     ;fill with border chars
  50.     mov     ax, 0x0FFE                  ;set ax to bg color
  51.     xor     di, di                      ;clear di ;consider  for space
  52.     mov     cx, 80 * 25                 ;set cx to size of console screen
  53.     rep     stosw                       ;write ax to video memory cx times. mov [es:di++], ax
  54.    
  55.     mov     bx, 0x1901
  56.     xor     ax, ax
  57.     call    fill_area
  58.    
  59. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Draw Bricks    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  60.     mov     bx, 0x0501                  ;start at row 1, col 1
  61.     mov     ax, 0x03B2                  ;char and attr to write
  62.     call    fill_area
  63.  
  64. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  65.    
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    RTC Init    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  67.    
  68.     mov     al, 8Bh                     ;select reg B, disable NMI
  69.     out     70h, al
  70.    
  71.     in      al, 71h                     ;read B
  72.     or      al, 40h                     ;OR 0x40 to set flag for start
  73.     push    ax                          
  74.    
  75.     mov     ax, 8Bh                     ;select B
  76.     out     70h, al                    
  77.     pop     ax
  78.     out     71h, al                     ;set B register to start
  79.    
  80.     mov     al, 8Ah                     ;select reg A and disable NMI
  81.     out     70h, al
  82.    
  83.     in      al, 71h                     ;read reg A value
  84.     and     al, 11110000b               ;keep top nibble received
  85.     or      al, RTC_DIVIDER             ;OR in divider in low nibble
  86.     push    ax
  87.    
  88.     mov     al, 8Ah
  89.     out     70h, al                     ;select A
  90.     pop     ax
  91.     out     71h, al                     ;write value to A
  92.    
  93.     in      al, 0A1h                    ;clear PIC 2 mask to ensure that IRQ 8 fires
  94.     xor     al, al
  95.     out     0A1h, al
  96.    
  97.     sti
  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  99.  
  100.     jmp     main_loop
  101.    
  102. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
  103. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  104.  
  105.  
  106. fill_area:
  107.  
  108. .iter:
  109.  
  110.     mov     cx, CONSOLE_WIDTH           ;brick row counter
  111.     call    vga_get_char_offset         ;get video offset
  112.     rep     stosw                       ;write cx num bricks
  113.    
  114.     dec     bh
  115.     cmp     bh, 0                       ;loop
  116.     jnz     .iter    
  117.  
  118.     ret
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  127. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Update Frame    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  128.  
  129. update_frame:
  130.     mov     al, byte [paddle_x]                 ;load paddle offsets
  131.     add     al, byte [paddle_vec]               ;add vector
  132.     cmp     al, 1                               ;test against left side
  133.     jge     .testpaddlehigh                     ;bigger then test right side
  134.     mov     al, 1                               ;clip to 1
  135.     jmp     .storepaddlex                       ;store it
  136. .testpaddlehigh:
  137.     cmp     al, CONSOLE_WIDTH - PADDLE_WIDTH - 1;compare adjusted values for right edge
  138.     jle     .storepaddlex                       ;nope just store it
  139.     mov     al, CONSOLE_WIDTH - PADDLE_WIDTH - 1;clip to right side
  140. .storepaddlex:
  141.     mov     byte [paddle_x], al                 ;store the new x value
  142.  
  143. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  144. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  145.  
  146. .checkballycollision:
  147.     mov     bx, word [ball_x]                   ;load x,y at once
  148.     push    bx                                  ;save old position for later
  149.  
  150.     add     bh, byte [ball_vecy]                ;add y pos + y vec
  151.     call    vga_get_char_offset                 ;get video mem offset
  152.     mov     ax, word [es:di]                    ;get char from memory offset
  153.     cmp     al, 0                               ;check if the cell is empty
  154.  
  155.     je      .storebally                         ;if it is, move there
  156.  
  157.     neg     byte [ball_vecy]                    ;if not, reverse direction
  158.    
  159.                                                 ;this would be simpler with a paddle made of 1 char
  160.     cmp     al, 205                             ;check for paddle left side char
  161.     jz      .paddlecollide                      ;if we hit, handle the collision
  162.     cmp     al, 213                             ;paddle middle char
  163.     jz      .paddlecollide                      ;...
  164.     cmp     al, 184                             ;paddle right side char
  165.     jnz     .ybrickcollision                    ;inverse test, if we hit just fall through
  166.  
  167. .paddlecollide:
  168.     mov     dl, byte [ball_vecx]                ;load ball x vec
  169.     cmp     byte [paddle_vec], 0                ;check direction of paddle
  170.     jl      .pvecn                              ;moving left ?
  171.     jg      .pvec                               ;moving right ?
  172.     jmp     .checkballxcollision                ;no movement (only possible at start)
  173. .pvecn:                                         ;there's got to be a better way handling this
  174.     dec     dl                                  ;we are negative so decrement ball vec
  175.     cmp     dl, -1                              ;clip it to -1
  176.     jg      .donepaddle                         ;if greater, finish and store
  177.     mov     dl, -1                              ;if not, set to -1
  178.     jmp     .donepaddle                         ;store it
  179. .pvec:                                          ;paddle is positive
  180.     inc     dl                                  ;increment ball vec
  181.     cmp     dl, 1                               ;clipping to 1 this time
  182.     jl      .donepaddle                         ;...
  183.     mov     dl, 1                               ;...
  184. .donepaddle:
  185.     mov     byte [ball_vecx], dl                ;store new vector
  186.     jmp     .checkballxcollision                ;we hit something and reversed so just go on to check x direction
  187.    
  188. .ybrickcollision:      
  189.     call    brick_collider                      ;we possibly hit a brick so check and handle accordingly
  190.     jmp     .checkballxcollision                ;move on
  191.    
  192. .storebally:
  193.     mov     byte [ball_y], bh                   ;cell was empty so we store the new y position
  194.  
  195. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  196. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  197.  
  198. .checkballxcollision:
  199.     pop     bx                                  ;restore old ball x,y in case it changed above
  200.     push    bx                                  ;push it back onto the stack for later
  201.    
  202.     cmp     byte [ball_vecx], 0                 ;if we have no x vector we can't hit anything
  203.     jz      .skiptodraw                         ;no vec, just go draw
  204.    
  205.     add     bl, byte [ball_vecx]                ;add vector to x pos
  206.     call    vga_get_char_offset                 ;get new video offset
  207.     mov     ax, [es:di]                         ;retrieve char there
  208.     cmp     al, 0                               ;is it empty?
  209.    
  210.     je      .storeballx                         ;if it is, move there
  211.    
  212.     neg     byte [ball_vecx]                    ;nope, reverse direction
  213.    
  214. .xbrickcollision:
  215.     call    brick_collider                      ;we can only hit bricks on this axis, so handle if we did
  216.     jmp     .skiptodraw                         ;no store, just draw
  217. .storeballx:
  218.     mov     byte [ball_x], bl                   ;we hit nothing and had a vector, so store
  219.    
  220. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  221. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Clear Scr    ;;;
  222. .skiptodraw:
  223.     xor     ax, ax                              ;clear paddle row for redraw
  224.     mov     bx, 0x1701                          ;row 23, col 1
  225.     mov     cl, CONSOLE_WIDTH                   ;clear row
  226.     call    vga_get_char_offset
  227.     rep     stosw                               ;write blank chars to row
  228.                  
  229.     pop     bx                                  ;retrieve our original ball x,y
  230.     call    vga_get_char_offset
  231.     mov     [es:di], ax                         ;clear
  232.  
  233. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  234. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Draw Ball    ;;;
  235.     mov     bx, word [ball_x]                   ;get new ball x,y
  236.     mov     ax, 0x0D07                          ;ball char
  237.     call    vga_get_char_offset
  238.     mov     [es:di], ax                         ;write it
  239. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  240.  
  241.  
  242. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  243. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Draw Paddle    
  244.     mov     bx, word [paddle_x]                 ;read as word to get row offset as well
  245.     mov     ax, 0x07D5                          ;left side char
  246.     call    vga_get_char_offset
  247.     mov     [es:di], ax                         ;write to video mem
  248.    
  249.     add     di, 2                               ;increment video pointer
  250.     mov     cl, PADDLE_WIDTH
  251.     mov     al, 0xCD
  252.     rep     stosw                               ;write middle bars to video mem
  253.    
  254.     mov     al, 0xB8
  255.     mov     [es:di], ax                         ;write right side char
  256.  
  257.  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  258.  
  259. .update_end:
  260.     ret
  261.  
  262.  
  263. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  264. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  274. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Brick Collider   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  275.  
  276. brick_collider:                                 ;bx - bl - x, bh - y, al - char
  277.     cmp     al, 178                             ;chars 176-178 are brick chars. 178 - solid, 177 - 50%, 176 - 25%
  278.     jle     .charlow                            ;if its less or equal, check low bound
  279.     jmp     .skip                               ;greater, not a brick
  280. .charlow:
  281.     cmp     al, 176                             ;check low bound
  282.     jl      .skip                               ;lower, not a brick
  283.    
  284.     push    ax                                  ;ax has our char and attr, save on stack
  285.    
  286.     xor     ax, ax                              ;clear ax
  287.     mov     al, bl                              ;move ball x into al
  288.     mov     dl, 3                               ;set dl to 3. bricks are 3 wide. we need to divide ball x by 3 to get a brick offset
  289.     div     dl                                  ;do the divide
  290.     test    ah, 0x3                             ;check remainder. if its zero, we need to adjust or we will hit the brick to the right
  291.     jnz     .noadjust                           ;not zero, dont adjust
  292.     dec     al                                  ;decrement so we collide with correct brick
  293. .noadjust:  
  294.     mul     dl                                  ;multiply our brick offset by brick size (3)
  295.     mov     dl, al                              ;move offset into dl
  296.                                                 ;this gives us a brick offset that starts with the leftmost char of the brick
  297.    
  298.     pop     ax                                  ;pop our char and attr off stack
  299.     push    bx                                  ;push our x/y onto stack so we don't clobber it
  300.    
  301.     mov     bl, dl                              ;vga_get_char_offset uses bx for x/y so transfer brick x offset to it
  302.     inc     bl                                  ;increment position since our bricks start at column 1
  303.     mov     cl, 3                               ;we need to draw 3 chars
  304.     dec     al                                  ;decrement to more damage brick char
  305.     cmp     al, 176                             ;if we fall below lowest brick char, zero it out, its destroyed
  306.     jge     .draw                               ;nope, not destroyed, just draw
  307.     xor     al, al                              ;zero out char
  308. .draw:
  309.     call    vga_get_char_offset                 ;get brick mem offset
  310.     rep     stosw                               ;draw
  311.      
  312.     pop     bx                                  ;restore original ball x,y into bx
  313. .skip:
  314.     ret
  315.  
  316.    
  317. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  318. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  328.  
  329. main_loop:
  330.    
  331.     jmp     main_loop
  332.    
  333. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  343. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    VGA Offset    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  344.  
  345. vga_get_char_offset:                    ;bx parm. bl - x, bh - y. ret - offset in di
  346.  
  347.     push    ax                          ;push ax and dx onto stack
  348.     push    dx                          ;we don't want to clobber them
  349.    
  350.     xor     dx, dx
  351.     mov     al, bh                      ;put y value into al
  352.     mul     byte [console_w]            ;y * row_width. mul requires register or memory operand
  353.     mov     dl, bl                      ;put x value into dl
  354.     add     ax, dx                      ;add x + y_row offset
  355.     mov     di, ax                      ;move to di for our return value
  356.     shl     di, 1                       ;offset * 2, chars occupy 2 bytes        
  357.    
  358.     pop     dx                          ;restore ax and dx
  359.     pop     ax
  360.    
  361.     ret
  362.    
  363. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  372. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    RTC Timer Handler    ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  373.    
  374. int70h_handler:
  375.    
  376.     call    update_frame
  377.  
  378.     mov     al, 0Ch                     ;select reg C
  379.     out     70h, al                     ;read RTC reg C. We have to do this to keep receiving interrupts
  380.     in      al, 71h                     ;required dummy read. resets to reg D
  381.    
  382.     mov     al, 0x20                    ;send EOI to allow interrupts continue
  383.     out     0xa0, al                    ;this int occurs on the slave PIC 2, so we need to notify it
  384.     out     0x20, al                    ;notify the master PIC 1, too
  385.    
  386.                                         ;this is fudged a bit since it doesn't reset. It'll trigger multiple times per 1 missed
  387.                                         ;ball count reflects this
  388.     cmp     byte [ball_y], 24           ;check if we missed the ball
  389.     jl      .done                       ;nope, we're done
  390.     dec     byte [balls_left]           ;yep, decrement ball count
  391.     cmp     byte [balls_left], 0        ;if we are at 0 we lose
  392.     jnz     .done                       ;nope, we're done
  393. .check:                                
  394.     in      al, 64h                     ;out of balls, force reset. Read keyboard controller port
  395.     test    al, 02h                     ;test system flag bit
  396.     jnz     .check                      ;if its not clear, loop
  397.     mov     al, 0FEh                    ;system reset command
  398.     out     64h, al                     ;send to controller
  399. .done:
  400.     iret
  401.  
  402. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  411. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Keyboard handler    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  412.  
  413. int09h_handler:                        
  414.     in      al, 60h                                 ;read the key pressed
  415.  
  416.     cmp     al, 0x4B                                ;left arrow key
  417.     jnz     .testright                              ;if not pressed check right key
  418.     mov     byte [paddle_vec], -PADDLE_SPEED        ;set negative direction vector
  419.     jmp     .done
  420.  
  421. .testright:
  422.  
  423.     cmp     al, 0x4D                                ;right arrow key
  424.     jnz     .done                                   ;not pressed, exit
  425.     mov     byte [paddle_vec], PADDLE_SPEED         ;set positive direction vector
  426.  
  427. ;;;;;;;;;;;;;;;;;;;;;;;;;;;     Stuff we gotta do to make the keyboard interrupt happy
  428. .done:      
  429.    
  430.     in      al, 61h                     ;get keyboard control line value
  431.     mov     ah, al                      ;save for later
  432.     or      al, 80h                     ;set enable keyboard bit
  433.     out     61h, al                     ;write to port
  434.     xchg    ah, al                      ;swap control port value into al
  435.     out     61h, al                     ;write to port
  436.    
  437.     mov     al, 20h                     ;send EOI to allow interrupts to continue
  438.     out     20h, al
  439.    
  440.     iret
  441.  
  442. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  452.    
  453.     console_w   db  80                  ;console width
  454.     paddle_x    db  36                  ;current paddle x
  455.                 db  23                  ;hack to save 1 byte @ draw_paddle
  456.     paddle_vec  db  0                   ;paddle movement direction
  457.     ball_x      db  40                  ;current ball x
  458.     ball_y      db  22                  ;current ball y
  459.     ball_vecx   db  0                   ;vector in console chars
  460.     ball_vecy   db  -1                  ;vector in console chars
  461.     block_cnt   db  130                 ;number of blocks left
  462.     balls_left  db  0x20
  463. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  473.    
  474.     times   510-($-$$)  db 0            ; Pad remainder of boot sector with 0s
  475.     dw      0xAA55                      ; The standard PC boot signature
  476.    
  477. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  478.    
  479. %ifdef BOCHS_HD_IMAGE
  480.     times   1024 * 1024 db 0            ;Bochs HD image padding. Set Cylinders/Sectors/Heads to 3
  481. %endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement