home *** CD-ROM | disk | FTP | other *** search
- ; ╔═══════════════════╗
- ; ║ GENERAL EQUATES ║
- ; ╚═══════════════════╝
- CR EQU 0D ;carriage return
- DLR EQU "$" ;dollar sign
- LF EQU 0A ;line feed
- MINUS1 EQU -1 ;minus one
- FR EQU FAR ;short form for FAR operator
- NR EQU NEAR ;short form for NEAR operator
- O EQU OFFSET ;short form for OFFSET operator
- S EQU SHORT ;short form for SHORT operator
- L EQU LONG ;short form for LONG operator
- TAB EQU 9 ;tab
- ; ╔═══════════════════╗
- ; ║ LOW MEMORY FIELDS ║
- ; ╚═══════════════════╝
- ORG 0
- LO EQU $
- LOFAORB EQU B[LO + 0504] ; floppy drive A or B
- FDRA EQU 0 ;drive A
- FDRB EQU 1 ;drive B
- LOFCTDN EQU B[LO + 0440] ; fd countdown
- LOFMOTR EQU B[LO + 043F] ; bit n = motor fd drive n
- FMODRA EQU 01 ;drive A
- FMODRB EQU 02 ;drive B
- FMODRC EQU 04 ;drive C
- FMODRD EQU 08 ;drive D
- LOFSTAT EQU B[LO + 0441] ; fd status
- FSTADDR EQU 002 ;address not found
- FSTCHIP EQU 020 ;chip failed
- FSTCMND EQU 001 ;command invalid
- FSTCRC EQU 010 ;CRC failed
- FSTDMA EQU 008 ;DMA error
- FSTSECT EQU 004 ;sector error
- FSTSEEK EQU 040 ;seek failed
- FSTTOUT EQU 080 ;timeout
- LOKSTAT EQU B[LO + 0417] ; keyboard status
- KSTALT EQU 008 ;alt
- KSTCAPS EQU 040 ;caps lock
- KSTCTRL EQU 004 ;control
- KSTINS EQU 080 ;insert
- KSTNUM EQU 020 ;num lock
- KSTSCRL EQU 010 ;scroll lock
- KSTSH EQU 003 ;shift
- KSTSHL EQU 002 ;left shift
- KSTSHR EQU 001 ;right shift
- LOMSIZE EQU W[LO + 0413] ; memory size (k)
- LOMTIME EQU D[LO + 046C] ; memory time of day
- LOVCTBL EQU W[LO + 0450] ;w x 8 video cursor table
- LOVCURS EQU W[LO + 0460] ; video cursor shape
- LOVLINE EQU W[LO + 044A] ; video line width
- LOVMODE EQU B[LO + 0449] ; video mode
- VMOBW40 EQU 0 ;b/w 40 cols
- VMOBWMR EQU 5 ;b/w 40 cols medium res
- VMOBW80 EQU 2 ;b/w 80 cols
- VMOCO40 EQU 1 ;col 40 cols
- VMOCO80 EQU 3 ;col 80 cols
- VMOCOHR EQU 6 ;col 80 cols high res
- VMOCOMR EQU 4 ;col 40 cols medium res
- VMOMONO EQU 7 ;MDA 80 columns
- LOVOFST EQU W[LO + 044E] ; video buffer offset
- LOVPAGE EQU B[LO + 0462] ; video page
- LOVPORT EQU W[LO + 0463] ; video port
- LOVROWS EQU B[LO + 0484] ; video number of rows - 1
- LOVSIZE EQU W[LO + 044C] ; video buffer size
- ; ╔═══════════════════╗
- ; ║ PSP FIELDS ║
- ; ╚═══════════════════╝
- ORG 0
- PSP EQU $
- PSPENV EQU W[PSP + 02C] ; seg of environment
- PSPFCB1 EQU B[PSP + 05C] ; FCB 1
- PSPFCB2 EQU B[PSP + 06C] ; FCB 2
- FCBDR EQU 0 ;b filename drive
- FCBHEAD EQU 1 ;b x 8 filename head
- FCBTAIL EQU 9 ;b x 3 filename tail
- PSPHI EQU W[PSP + 002] ; high paragraph
- PSPI20 EQU B[PSP + 000] ;b x 2 int 020
- PSPI21 EQU B[PSP + 050] ;b x 3 int 021 ; retf
- PSPLINK EQU W[PSP + 016] ; seg link to parent
- PSPPARM EQU B[PSP + 081] ; parameters
- PSPPLEN EQU B[PSP + 080] ; param length
- ;╔════════════════╗ ROUTINE
- ;║ ABORT ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Invoke ABORT sequence (ERRORLEVEL = AL) │
- ; └─────────────────────────────────────────────────────────────┘
- @@ABORT = 0
- ABORT MACRO
- @@ABORT = 1
- JMPL $ABORT
- #EM
- ;
- ;╔════════════════╗
- ;║ ASCIIZ ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ ASCII string with ZERO added │
- ; └─────────────────────────────────────────────────────────────┘
- ASCIIZ MACRO
- ##IF #NL
- #RX1L
- DB #X,0
- #ER
- ##ELSE
- DB 0
- ##ENDIF
- #EM
- ;╔════════════════╗
- ;║ BIN2DEC ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ BIN2DEC - AL (bin) ──> AX (dec zoned 2) │
- ; └─────────────────────────────────────────────────────────────┘
- BIN2DEC EQU AAM
- ;╔════════════════╗
- ;║ BIN2X ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ BIN2X base - AL (bin) ──> AX (base zoned 0)│
- ; └─────────────────────────────────────────────────────────────┘
- BIN2X MACRO AAM #1 #EM
- ;╔════════════════╗
- ;║ C ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ COPYRIGHT │
- ; └─────────────────────────────────────────────────────────────┘
- C MACRO
- ORG 0100
- JMPS >M0
- DB CR,#1
- CARRET DB CR,LF,0,01A,DLR,01A
- EVEN
- M0: CLD
- @@LOOKUP = 1
- MOV SI,080 ;START WITH COMMAND LINE
- MOV DI,SI ;REWRITING THIS LINE
- INC SI ;MOVE TO FIRST BYTE
- PUSH SI ;SAVE THIS FOR LATER
- JMPS >M2 ;START PROCESSING
- M1: STOSB ;USE THIS BYTE
- LODSB ;LOOK AT NEXT ONE
- CMP AL,020 ;IS IT A SPACE ?
- JNZ >M4 ;NO - STILL IN PARAMETER
- M2: XOR AX,AX ;SET A NULL..
- STOSB ;..BEFORE EACH PARAMETER
- M3: LODSB ;PICK UP A BYTE
- CMP AL,020 ;IS IT A SPACE ?
- JZ M3 ;YES - IGNORE IT
- M4: CMP AL,CR ;IS IT ENDED YET ?
- JNZ M1 ;NO - USE THIS ONE
- XOR AX,AX ;CLEAR AX..
- STOSW ;..AND SET A DOUBLE NULL
- POP SI ;START AT THE BEGINNING
- ; ┌─────────────────────────────────────────────────────────────┐
- ; │ At this point, the command-line parameters have been │
- ; │ massaged into an ASCIIZ table starting at 0080h with │
- ; │ a null, and terminated by a double-null sequence. │
- ; └─────────────────────────────────────────────────────────────┘
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ CRLF ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Print a blank line on STDOUT │
- ; └─────────────────────────────────────────────────────────────┘
- @@CRLF = 0 ;print new line
- CRLF MACRO
- @@CRLF = 1
- CALL $CRLF
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ DBINTODEC ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ DOUBLEWORD Binary to Decimal │
- ; │ i/p : DX | AX │
- ; │ o/p : at DI with length CX (not counting 0,$) │
- ; │ max space taken up is 15 bytes: max CX=000D (13) │
- ; └─────────────────────────────────────────────────────────────┘
- @@DBINTODEC= 0 ;doubleword binary to decimal
- DBINTODEC MACRO
- @@DBINTODEC = 1
- @@WBINTODEC = 1
- CALL $DBINTODEC
- #EM
- DBIN2DEC MACRO
- DBINTODEC
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ DELEVAR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Delete a system environment variable │
- ; │ DS:SI - location of variable name │
- ; └─────────────────────────────────────────────────────────────┘
- @@DELEVAR = 0 ;delete environment variable
- DELEVAR MACRO
- @@DELEVAR = 1
- CALL $DELEVAR
- #EM
- ;╔════════════════╗
- ;║ DBW ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ DB + DW in pairs │
- ; └─────────────────────────────────────────────────────────────┘
- DBW MACRO
- #RX1L
- DB #X
- DW #AX
- #E2
- #EM
- ;╔════════════════╗
- ;║ DEC2BIN ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ DEC2BIN - AX (dec zoned 0) ──> AX (bin) │
- ; └─────────────────────────────────────────────────────────────┘
- DEC2BIN EQU AAD
- ;╔════════════════╗
- ;║ Dshift;Drotate ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ DOUBLE-register SHIFTs and ROTATEs │
- ; └─────────────────────────────────────────────────────────────┘
- DSAL MACRO
- SAL #2,1
- RCL #1,1
- #EM
- DSHL MACRO DSAL #1,#2 #EM
- DSAR MACRO
- SAR #1,1
- RCR #2,1
- #EM
- DSHR MACRO
- SHR #1,1
- RCR #2,1
- #EM
- DRCL MACRO
- RCL #2,1
- RCL #1,1
- #EM
- DROL MACRO
- DSAL #1,#2
- PUSHF
- ADC BX,1
- POPF
- #EM
- DRCR MACRO
- RCR #1,1
- RCR #2,1
- #EM
- DROR MACRO
- PUSH BX
- SHR #2,1
- POP BX
- DRCR #1,#2
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ ERROR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝Errors are accessed in "ERRORS" via BP. │
- ; │ This routine reports and then resigns with │
- ; │ ERRORLEVEL = BP. "Conditional" entry via │
- ; │ ERRIFccc < Z, NZ, C, NC, B, A >. │
- ; └─────────────────────────────────────────────────────────────┘
- @@ERROR = 0
- ERRIFA MACRO ;error in BP if A flag set
- @@ERROR = 1
- CALL $ERRIFA
- #EM
- ERRIFB MACRO ;error in BP if B flag set
- @@ERROR = 1
- CALL $ERRIFB
- #EM
- ERRIFC MACRO ;error in BP if C flag set
- ERRIFB
- #EM
- ERRIFNC MACRO ;error in BP if C flag not set
- @@ERROR = 1
- CALL $ERRIFNC
- #EM
- ERRIFNZ MACRO ;error in BP if Z flag not set
- @@ERROR = 1
- CALL $ERRIFNZ
- #EM
- ERRIFZ MACRO ;error in BP if Z flag set
- @@ERROR = 1
- CALL $ERRIFZ
- #EM
- ERROR MACRO
- @@ERROR = 1
- JMPL $ERROR
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ FRJULIAN ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Calculate day/month/year from Julian date │
- ; │ │
- ; │ i/p: BX = "Julian" date │
- ; │ │
- ; │ o/p: AL = day (0=Sunday, 1=Monday..) │
- ; │ CX = year (including century) │
- ; │ DH = month │
- ; │ DL = day │
- ; ├─────────────────────────────────────────────────────────────┤
- ; │ The "Julian" date here is the number of days since │
- ; │ 20th November 1937: it applies to all dates from then │
- ; │ up to 31st December 2099. It is related to the │
- ; │ Clarion date and to Scaliger's date function. │
- ; │ │
- ; │ Clarion = Julian + 50,000 │
- ; │ Scaliger = Julian + 2,428,858 │
- ; └─────────────────────────────────────────────────────────────┘
- @@FRJULIAN = 0 ;from Julian to dd/mm/yy
- FRJULIAN MACRO
- @@FRJULIAN = 1
- CALL $FRJULIAN
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ GETENV ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Get address of system environment │
- ; │ │
- ; │ ES:DI - location of environment │
- ; │ CX - length of environment │
- ; │ CARRY set if environment not found │
- ; └─────────────────────────────────────────────────────────────┘
- @@GETENV = 0 ;get environment address
- GETENV MACRO
- @@GETENV = 1
- CALL $GETENV
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ GETENVT ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ │
- ; │ Get address of system environment tail │
- ; │ │
- ; │ ES:DI - location of environment's tail │
- ; │ CX - available room in environment │
- ; │ CARRY set if no room found │
- ; └─────────────────────────────────────────────────────────────┘
- @@GETENVT = 0 ;get environment tail
- GETENVT MACRO
- @@GETENVT = 1
- CALL $GETENVT
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ GETEVAR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ │
- ; │ Get address of a system environment variable │
- ; │ │
- ; │ DS:SI - location of variable name (input) │
- ; │ │
- ; │ ES:DI - location of environment's variable │
- ; │ CX - available room in environment │
- ; │ CARRY set if variable not found │
- ; └─────────────────────────────────────────────────────────────┘
- @@GETEVAR = 0 ;get environment variable
- GETEVAR MACRO
- @@GETEVAR = 1
- CALL $GETEVAR
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ GETPAGE ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Get video page │
- ; └─────────────────────────────────────────────────────────────┘
- @@VIDDATA = 0
- @@GETPAGE = 0 ;get page
- GETPAGE MACRO
- @@GETPAGE = 1
- CALL $GETPAGE
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ GETPOS ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Get video position │
- ; └─────────────────────────────────────────────────────────────┘
- @@VIDDATA = 0
- @@GETPOS = 0 ;get position
- GETPOS MACRO
- @@GETPOS = 1
- CALL $GETPOS
- #EM
- ;╔════════════════╗
- ;║ JMPL ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ JMP long │
- ; └─────────────────────────────────────────────────────────────┘
- JMPL MACRO
- DB 0E9
- DW #1-$-2
- #EM
- ;╔════════════════╗
- ;║ JMPS ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ JMP short │
- ; └─────────────────────────────────────────────────────────────┘
- JMPS MACRO
- DB 0EB
- DB #1-$-1
- #EM
- ;╔════════════════╗
- ;║ Jconditional ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Extra conditional JUMP routines │
- ; └─────────────────────────────────────────────────────────────┘
- JAZ EQU JAE
- JBZ EQU JBE
- JCE EQU JBE
- JCZ EQU JBE
- JGZ EQU JGE
- JLZ EQU JLE
- JNAZ EQU JNAE
- JNBZ EQU JNBE
- JNCE EQU JNBE
- JNCZ EQU JNBE
- JNGZ EQU JNGE
- JNLZ EQU JNLE
- ;╔════════════════╗
- ;║ JCXNZ ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Negative of JCXZ │
- ; └─────────────────────────────────────────────────────────────┘
- JCXNZ MACRO
- INC CX
- LOOP #1
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ LENSTR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Length of ASCIIZ string │
- ; │ input pointer DS:SI output CX │
- ; │ or ES:DI or DS:DX │
- ; └─────────────────────────────────────────────────────────────┘
- @@LENSTR = 0 ;length of ASCIIZ string
- LENSTR MACRO
- @@LENSTR = 1
- ##IF #S1 = 2
- ##IF '#1' = 'SI'
- ##ELSEIF '#1' = 'DI'
- SWAP
- ##ELSEIF '#1' = 'DX'
- XCHG SI,DX
- ##ELSE
- PUSH SI
- MOV SI,o #1
- ##ENDIF
- ##ELSE
- PUSH SI
- MOV SI,o #1
- ##ENDIF
- CALL $LENSTR
- ##IF #S1 = 2
- ##IF '#1' = 'SI'
- ##ELSEIF '#1' = 'DI'
- SWAP
- ##ELSEIF '#1' = 'DX'
- XCHG SI,DX
- ##ELSE
- POP SI
- ##ENDIF
- ##ELSE
- POP si
- ##ENDIF
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ LOOKUP ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Lookup into table (DS:SI) to item N │
- ; │ BP = item number (N) - starts at 1 │
- ; │ SI updated - carry set if not found │
- ; └─────────────────────────────────────────────────────────────┘
- @@LOOKUP = 0 ;lookup BP in table at SI
- LOOKUP MACRO
- @@LOOKUP = 1
- CALL $LOOKUP
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ NLPRINT ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ print new line + ASCIIZ message in DS:DX │
- ; └─────────────────────────────────────────────────────────────┘
- @@NLPRINT = 0 ;new line print
- NLPRINT MACRO
- @@NLPRINT = 1
- CALL $NLPRINT
- #EM
- ;╔════════════════╗
- ;║ OLDINT ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ (for TSR): perform old interrupt │
- ; │ (as designated by operand) │
- ; └─────────────────────────────────────────────────────────────┘
- OLDINT MACRO
- PUSHF
- CS CALL D OLD#1+1
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ PARSE ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Parse filename │
- ; │ DS:SI - pointer to ASCIIZ filename │
- ; │ o/p 5D-64 major name parsed │
- ; │ o/p 65-67 minor name parsed │
- ; │ -CF set if ambiguity involved │
- ; └─────────────────────────────────────────────────────────────┘
- @@PARSE = 0 ;parse a path/filename
- PARSE MACRO
- @@PARSE = 1
- CALL $PARSE
- #EM
- ;╔════════════════╗
- ;║ POPALL ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ POP all normal registers, flags │
- ; │ (match to PUSHALL) │
- ; └─────────────────────────────────────────────────────────────┘
- POPALL MACRO
- POP ES,DS,DI,SI,BP,DX,CX,BX,AX
- POPF
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ POS2ADR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Convert video row/col (AX) to offset (DI) │
- ; └─────────────────────────────────────────────────────────────┘
- @@POS2ADR = 0 ;get address
- POS2ADR MACRO
- @@POS2ADR = 1
- CALL $POS2ADR
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ PRINT ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ print ASCIIZ message in DS:DX │
- ; └─────────────────────────────────────────────────────────────┘
- @@PRINT = 0 ;print
- PRINT MACRO
- @@PRINT = 1
- CALL $PRINT
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ PRIOERR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Print I/O error (if Cflag on) │
- ; │ input = AX │
- ; └─────────────────────────────────────────────────────────────┘
- @@PRIOERR = 0 ;print if I/O error
- PRIOERR MACRO
- @@PRIOERR = 1
- CALL $PRIOERR
- #EM
- ;╔════════════════╗
- ;║ PUSHALL ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ PUSH all normal registers, flags │
- ; │ (match to POPALL) │
- ; └─────────────────────────────────────────────────────────────┘
- PUSHALL MACRO
- PUSHF
- PUSH AX,BX,CX,DX,BP,SI,DI,DS,ES
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ RESIGN ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Invoke termination with ERRORLEVEL = 0 │
- ; └─────────────────────────────────────────────────────────────┘
- @@RESIGN = 0 ;sign off program with ERRORLEVEL = 0
- RESIGN MACRO
- @@RESIGN = 1
- JMPL $RESIGN
- #EM
- ;╔════════════════╗
- ;║ Sshift;Srotate ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ SINGLE-register SHIFTs and ROTATEs │
- ; └─────────────────────────────────────────────────────────────┘
- SSAL MACRO SAL #1,1 #EM
- SSHL MACRO SSAL #1 #EM
- SSAR MACRO SAR #1,1 #EM
- SSHR MACRO SHR #1,1 #EM
- SRCL MACRO RCL #1,1 #EM
- SROL MACRO ROL #1,1 #EM
- SRCR MACRO RCR #1,1 #EM
- SROR MACRO ROR #1,1 #EM
- ;╔════════════════╗ ROUTINE
- ;║ SETEVAR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ │
- ; │ Set a system environment variable │
- ; │ │
- ; │ DS:SI - location of variable name (input) │
- ; │ │
- ; │ CARRY set if not done │
- ; └─────────────────────────────────────────────────────────────┘
- @@SETEVAR = 0 ;set new environment variable
- SETEVAR MACRO
- @@SETEVAR = 1
- CALL $SETEVAR
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ SETPAGE ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Set video page (i/p $$VIDPAGE) │
- ; └─────────────────────────────────────────────────────────────┘
- @@SETPAGE = 0 ;set page
- @@VIDDATA = 0
- SETPAGE MACRO
- @@SETPAGE = 1
- CALL $SETPAGE
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ SETPOS ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Set video position (i/p $$VIDPAGE) │
- ; └─────────────────────────────────────────────────────────────┘
- @@SETPOS = 0 ;set position
- @@VIDDATA = 0
- SETPOS MACRO
- @@SETPOS = 1
- CALL $SETPOS
- #EM
- ;╔════════════════╗
- ;║ STK ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ STK (plus many variables) - put on stack │
- ; └─────────────────────────────────────────────────────────────┘
- STK MACRO
- #RX1L
- PUSH #X
- #ER
- #QXL1
- POP #X
- #EQ
- #EM
- ;╔════════════════╗
- ;║ SWAP ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ DS:SI <--> ES:DI │
- ; └─────────────────────────────────────────────────────────────┘
- SWAP MACRO
- XCHG SI,DI
- XCHG DS,ES
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ SWAPSCR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ │
- ; │ Swap memory (DS:SI) with screen (segment ES) │
- ; │ 1st word = row/col 2nd word = rows/cols others = bytes│
- ; └─────────────────────────────────────────────────────────────┘
- @@SWAPSCR = 0 ;swap screen (ES) with memory
- SWAPSCR MACRO
- @@SWAPSCR = 1
- CALL $SWAPSCR
- #EM
- ;╔════════════════╗
- ;║ SYNCH ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ SYNCH [DS] - DS:SI ───> ES:DI │
- ; │ SYNCH ES - DS:SI <─── ES:DI │
- ; └─────────────────────────────────────────────────────────────┘
- SYNCH MACRO
- ##IF '#1' = 'ES'
- PUSH ES,DI
- POP SI,DS
- ##ELSE
- PUSH DS,SI
- POP DI,ES
- ##ENDIF
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ TOJULIAN ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Calculate Julian date from day/month/year │
- ; │ │
- ; │ i/p: CX = year (including century) │
- ; │ DH = month │
- ; │ DL = day │
- ; │ │
- ; │ o/p: AL = day (0=Sunday, 1=Monday..) │
- ; │ BX = "Julian" date │
- ; ├─────────────────────────────────────────────────────────────┤
- ; │ The "Julian" date here is the number of days since │
- ; │ 20th November 1937: it applies to all dates from then │
- ; │ up to 31st December 2099. It is related to the │
- ; │ Clarion date and to Scaliger's date function. │
- ; │ │
- ; │ Clarion = Julian + 50,000 │
- ; │ Scaliger = Julian + 2,428,858 │
- ; └─────────────────────────────────────────────────────────────┘
- @@TOJULIAN = 0 ;dd/mm/yy to Julian
- TOJULIAN MACRO
- @@TOJULIAN = 1
- CALL $TOJULIAN
- #EM
- ;╔════════════════╗
- ;║ TRAP ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Trap an Interrupt (as specified by operand) │
- ; └─────────────────────────────────────────────────────────────┘
- TRAP MACRO
- MOV AX,035 BY #1
- INT 021
- MOV W OLD#1+3,ES
- MOV W OLD#1+1,BX
- MOV AH,025
- MOV DX,O NEW#1
- INT 021
- #EM
- ;╔════════════════╗
- ;║ TSR ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Terminate & Stay Ready │
- ; │ (optional operand specifies start of transient area) │
- ; └─────────────────────────────────────────────────────────────┘
- TSR MACRO
- ##IF '#1' = ''
- MOV DX,(TRANSIENT + 0F)/010
- ##ELSE
- MOV DX,(#1 + 0F)/010
- ##ENDIF
- MOV AX,031 BY 0
- INT 021
- #EM
- ;╔════════════════╗
- ;║ UNSTK ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ UNSTK (plus variables) - take off stack │
- ; └─────────────────────────────────────────────────────────────┘
- UNSTK MACRO
- #RX1L
- POP #X
- #ER
- #QXL1
- PUSH #X
- #EQ
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ VALIDHEX ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ VALIDHEX: validate a byte as HEX │
- ; │ i/p - AL │
- ; │ o/p - AL (binary equivalent) │
- ; │ Zflag set if good - Cflag if bad │
- ; └─────────────────────────────────────────────────────────────┘
- @@VALIDHEX = 0 ;validate AL as hex
- VALIDHEX MACRO
- @@VALIDHEX = 1
- CALL $VALIDHEX
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ VALIDNUM ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ VALIDNUM: validate a byte as NUMERIC │
- ; │ i/p - AL │
- ; │ o/p - AL (binary equivalent) │
- ; │ Zflag set if good - Cflag if bad │
- ; └─────────────────────────────────────────────────────────────┘
- @@VALIDNUM = 0 ;validate AL as number
- VALIDNUM MACRO
- @@VALIDNUM = 1
- CALL $VALIDNUM
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ VIDEO ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Establish Video mode and addresses │
- ; │ │
- ; │ output: ES:DI --> $VIDSEG, $VIDADR │
- ; │ $VIDMODE - current mode │
- ; │ $VIDCOLS - number of cols in this mode │
- ; │ $VIDPAGE - current active page │
- ; │ $VIDSHAPE - cursor shape │
- ; │ $VIDPOSN - [$VIDROW, $VIDCOL] │
- ; │ CF if not correct mode │
- ; └─────────────────────────────────────────────────────────────┘
- @@GETPAGE = 0 ;video service
- VIDEO MACRO
- GETPAGE
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ WBINTODEC ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ WORD Binary to Decimal │
- ; │ i/p : AX │
- ; │ o/p : at DI with length CX (not counting 0,$) │
- ; │ max space taken up is 8 bytes: max CX=0006 │
- ; └─────────────────────────────────────────────────────────────┘
- @@WBINTODEC= 0 ;word binary to decimal
- WBINTODEC MACRO
- @@WBINTODEC = 1
- CALL $WBINTODEC
- #EM
- WBIN2DEC MACRO
- WBINTODEC
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ WDECTOBIN ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ WORD Decimal to Binary │
- ; │ i/p : at SI │
- ; │ cf if error o/p : AX │
- ; └─────────────────────────────────────────────────────────────┘
- @@WDECTOBIN= 0 ;word decimal to binary
- WDECTOBIN MACRO
- @@WDECTOBIN = 1
- CALL $WDECTOBIN
- #EM
- WDEC2BIN MACRO
- WDECTOBIN
- #EM
- ;╔════════════════╗ ROUTINE
- ;║ WEEKDAYJ ╟─────────────────────────────────────────────┐
- ;╚╤═══════════════╝ Calculate weekday from a Julian date │
- ; │ │
- ; │ i/p: BX = "Julian" date │
- ; │ o/p: AL = day (0=Sunday, 1=Monday..) │
- ; ├─────────────────────────────────────────────────────────────┤
- ; │ The "Julian" date here is the number of days since │
- ; │ 20th November 1937: it applies to all dates from then │
- ; │ up to 31st December 2099. It is related to the │
- ; │ Clarion date and to Scaliger's date function. │
- ; │ │
- ; │ Clarion = Julian + 50,000 │
- ; │ Scaliger = Julian + 2,428,858 │
- ; └─────────────────────────────────────────────────────────────┘
- @@WEEKDAYJ = 0 ;Julian weekday
- WEEKDAYJ MACRO
- @@WEEKDAYJ = 1
- CALL $WEEKDAYJ
- #EM