Back to home page

DOS ain't dead

Forum index page

Log in | Register

Back to the forum
Board view  Mix view

(My) fork of 8086 Assembler for DOS (Announce)

posted by rr Homepage E-mail, Berlin, Germany, 27.12.2020, 13:22

> missing features (so far):
> - no ORG directive (so no device driver development possible?)

With some "handcrafting" I was able to rebuild my little PAUSE.SYS using ASM.COM. Just rename generated PAUSE.COM to PAUSE.SYS. Of course, it's no fun to recalc offsets, e.g., for pausemsg, if you make changes to the code.

; ****************************************************************************
; `PAUSE' - Source code for `pause' object
;   Written by Robert Riebisch
;   Converted to 8086 Assembler syntax by Robert Riebisch
;
; Copyright (c) 1997-2020 BTTR Software.  All rights reserved.
;
; This program is free software; you can redistribute it and/or modify it
; under the terms of the `MODIFIED' BSD LICENSE.  Please see `legal.txt'
; for details.
; ****************************************************************************

; device driver header
devdrvrhdr:
  dw 0ffffh,0ffffh
  dw 0              ; device attributes (block device)
  dw 22             ; strategy routine offset _@strat
  dw 33             ; interrupt routine offset _@intr
  db 1              ; # of units
  db 0,0,0,0,0,0,0  ; (reserved)

reqhdrptr: dw 0,0  ; pointer to request header

; strategy routine
_@strat:
  cs:
  mov [reqhdrptr-100h],bx    ; save pointer to request header
  cs:                        ;   `-100h' = workaround unsupported `org'
  mov [reqhdrptr+2-100h],es
  retf

; interrupt routine
_@intr:
  push ax  ; save affected registers
  push bx
  push dx
  push ds
  pushf

; clear keyboard buffer
_@nextkey:
  mov ah,1      ; check for keystroke
  int 16h
  jz _@empty
  xor ah,ah     ; get keystroke
  int 16h
  jmp _@nextkey

_@empty:
  push cs  ; make local data (`pausemsg')
  pop ds   ;   addressable by setting DS = CS

  mov dx,90  ; print pause message
  ; or use:
  ;   mov dx,pausemsg  ; print pause message
  ;   sub dx,100h      ;   workaround unsupported `org' pseudo-op
  mov ah,9
  int 21h

  xor ah,ah  ; wait for keystroke
  int 16h

; get removed from RAM by signaling an error
; `lds bx, [reqhdrptr]' encoded
  db 0c5h,1eh,12h,0          ; point DS:BX to request header
  mov word ptr [bx+3],8103h  ; status = `Error', `Done', `Unknown command'

; above line might not be enough
  mov byte ptr [bx+13],0  ; # of units
  mov word ptr [bx+14],0  ; break address = CS:0 (for max. compatibility
  mov [bx+16],cs          ;   with, e.g., old FreeDOS kernels, PTS-DOS 2000 or
                          ;   PTS-DOS 32)

  popf    ; restore affected registers
  pop ds
  pop dx
  pop bx
  pop ax
  retf

pausemsg: db 'Press any key to continue...',13,10,'$'

; (end of `pause.asm')

---
Forum admin

 

Complete thread:

Back to the forum
Board view  Mix view
22370 Postings in 2073 Threads, 400 registered users, 98 users online (1 registered, 97 guests)
DOS ain't dead | Admin contact
RSS Feed
powered by my little forum