GophHub - zajo/appler/src/GLOBALS.INC


Raw File

;  _____________________________________________
; |                                             |
; |  Project:   APPLER                          |
; |  File:      GLOBALS.ASM                     |
; |  Compiler:  16-bit TASM (2.5)               |
; |                                             |
; |  Subject:   Common Definitions & Macros     |
; |                                             |
; |  Author:    Alexander Patalenski            |
; |_____________________________________________|

                .386

;============== Constants ======================================================

WriteOFS        =       99h ;98h                ; Write Memory offset
StackPage       =       1                       ; Apple Stack page number
GRchar          =       'ß'                     ; Character used in GR Mode
LNdelimiter     =       'ú'                     ; License Name Delimiter (#250)
Tlen            =       16                      ; Max counters number
IRQmasks        =       10011100b               ; IRQ Interrupts activity (1-disabled)
MotorOffDelay   =       2 * 18                  ; Floppy Drive stop delay

RESETvector     =       0FFFCh                  ; 65C02
ABORTvector     =       0FFF8h                  ;      exception
NMIvector       =       0FFFAh                  ;              interrupt
IRQvector       =       0FFFEh                  ;                     vectors
BRKvector       =       0FFFEh                  ;

ReadAdd         =       0
WriteAdd        =       0
DataSearchLen   =       22                      ; Max distance b/address&data fields
TrackBufferLen  =       186Ah                   ; Number of Bytes on disk
TrackBuffer2Len =       DataSearchLen+31+156h   ; Max Sector length
FormatLimit     =       156h+20
;       .DSK type only:
Gap1            =       07FFFh                  ; From begining to first sector
Gap2            =       0FFFFh                  ; B/ address and data fields
Gap3            =       07FFFh                  ; B/ two sectors
Gap1Len         =       0Bh
Gap2Len         =       04h
Gap3Len         =       0Bh

;-------------- Process IDs ----------------------------------------------------
PID_EMULATOR            = 000h
PID_DEBUGGER            = 001h
PID_FILE_MANAGER        = 002h
PID_FLOPPY_DISK_MANAGER = 003h
PID_KEYBOARD_SETUP      = 004h
PID_ABOUT_SCREEN        = 005h
PID_HELP_SCREEN         = 006h
PID_DOS_SHELL           = 007h
PID_QUIT_APPLER         = 008h
PID_PREVIOUS_PROCESS    = 0FEh
PID_DONT_SWITCH         = 0FFh

;-------------- Keyboard Status Bits -------------------------------------------
M_CTRL          =       00000001b
M_LEFT_SHIFT    =       00000010b
M_RIGHT_SHIFT   =       00000100b
M_ALT           =       00001000b
M_NUM_LOCK      =       00100000b
M_CAPS_LOCK     =       01000000b

;============== Macroses =======================================================

Save            MACRO   a,b,c,d,e,f,g,h,i,j,k
                IRP     r,<a,b,c,d,e,f,g,h,i,j,k>
        IFNB    <r>
                push    r
        ENDIF
                ENDM
                ENDM

Restore         MACRO   a,b,c,d,e,f,g,h,i,j,k
                IRP     r,<k,j,i,h,g,f,e,d,c,b,a>
        IFNB    <r>
                pop     r
        ENDIF
                ENDM
                ENDM

SaveAll         MACRO
                push    ax bx cx dx si di bp ds es
                ENDM

RestoreAll      MACRO
                pop     es ds bp di si dx cx bx ax
                ENDM

FastStos        MACRO   Count                   ; AL - byte to stos
                Local   L1                      ; CX|Count - count in bytes
                mov     ah,al
        IFNB    <Count>
                mov     cx,(Count)/2
        rep     stosw
        IF      (Count) mod 2
                stosb
        ENDIF
        ELSE
                shr     cx,1
        rep     stosw
                jnc     L1
                stosb
L1:
        ENDIF
                ENDM

FastMovs        MACRO   Count                   ; CX|Count - count in bytes
                Local   L1
        IFNB    <Count>
                mov     cx,(Count)/2
        rep     movsw
        IF      (Count) mod 2
                movsb
        ENDIF
        ELSE
                shr     cx,1
        rep     movsw
                jnc     L1
                movsb
L1:
        ENDIF
                ENDM

SmartStos       MACRO   Dest,Count              ; AL - byte to stos
                Local   L1,L2                   ; DI|Dest - destination address
                mov     ah,al                   ; CX|Count - count in bytes
        IFNB    <Dest>
                mov     di,offset Dest
        IFNB    <Count>
Temp            =       Count
        IF      (offset Dest) mod 2
                stosb
Temp            =       Temp-1
        ENDIF
                mov     cx,Temp/2
        rep     stosw
        IF      Temp mod 2
                stosb
        ENDIF
        ELSE
        IF      (offset Dest) mod 2
                stosb
                dec     cx
        ENDIF
                shr     cx,1
        rep     stosw
                jnc     L2
                stosb
L2:
        ENDIF
        ELSE
        IFNB    <Count>
                mov     cx,Count
        ENDIF
                test    di,1b
                jz      L1
                stosb
                dec     cx
L1:             shr     cx,1
        rep     stosw
                jnc     L2
                stosb
L2:
        ENDIF
                ENDM

Print           MACRO   a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q
                %OUT    a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q
                ENDM

;-------------- Specific use definitions ---------------------------------------

If_this_is_file MACRO   FileName
                IRP     ThisFile,%@FileName
                IFIDNI  <ThisFile>,<FileName>
                ENDM
                ENDM

db_LICENSE_NAME MACRO
        IFDEF   LICENSE_NAME
                IRP     s,%LICENSE_NAME
                IRPC    c,<s>
                IF      "&c" NE LNdelimiter
                db      "&c"
                ELSE
                db      " "
                ENDIF
                ENDM
                ENDM
        ELSE
                db      'SHAREWARE'
        ENDIF
                ENDM


Opcode          MACRO   Code
                org     Code*100h
EndAddress      =       $+WriteOFS-1
                IRP     n,<% Code>
ValidOpcode&&n  equ     1
                ENDM
                ENDM

WriteAllFreeSpace MACRO
        IFDEF   Update
        IF1
Temp            =       0
FreeSpacePtr    =       0
                REPT    100h
                IRP     n,<%Temp>
        IFNDEF  ValidOpcode&&&n
                ENDM
                Print   <FreeSpace>,%FreeSpacePtr,< = >,%Temp
FreeSpacePtr    =       FreeSpacePtr+1
        ENDIF
Temp            =       Temp+1
                ENDM
                Print   <FreeSpaceCount>,< = >,%FreeSpacePtr
                Print   < IF 0 >
        ENDIF
        ENDIF
                ENDM

ReadAllFreeSpace MACRO
                include 65C02.INC
                ENDIF
                ENDM

FreeSpacePtr    =       0

UseNextFreeSpace MACRO
        IF      FreeSpacePtr LT FreeSpaceCount
                IRP     n,<%FreeSpacePtr>
                org     FreeSpace&&n*100h + 3
EndAddress      =       $-3+WriteOFS-1
                ENDM
FreeSpacePtr    =       FreeSpacePtr + 1
        ELSE
                ERR
                Print   <  Not enough free space!!>
        ENDIF
                ENDM

WriteMem        MACRO   Page
                org     Page*100h+WriteOFS
EndAddress      =       $-WriteOFS+0FFh
                ENDM

CheckAddress    MACRO   Lab
Len             =       EndAddress-($-1)
        IF      Len LT 0
                ERR
        ENDIF
        IFNB <Lab>
        IF      Len LT 0
                Print   <  >,<Lab>,<: >,<Fragment is >,%0-Len,< bytes bigger.>
        ELSE
                Print   <  >,<Lab>,<: >,%Len,< bytes left.>
        ENDIF
        ENDIF
                ENDM

AddTiming       MACRO   ms
                lea     eax,[eax+10000h*ms]
                ENDM

DoNext          MACRO
                lodsb
                mov     bh,al
                jmp     bx
                ENDM

GoWrite         MACRO
                mov     al,WriteOFS
                jmp     ax
                ENDM

SwitchToProcess macro   ProcessID
                mov     al,ProcessID
                call    TaskSwitch
                endm

;-------------- Floppy emulation interface -------------------------------------

Drive_S         Struc
ID              db      ?                       ; 0 or 1
Phase           db      00000000b               ; 0D0C0B0A - Phase A..D
PhasePTR        db      0                       ; ex. ^----- Half-step phase ptr
StepCounter     db      0                       ; Half-step counter
Track           db      0                       ; Double-step Track Number
;       Disk attributes:
FileHandle      dw      0FFFFh                  ; 0FFFFh if no disk in the drive
WriteProtect    db      0                       ; 0FFh-protected, 0-not
DiskType        db      0                       ; 0 - .NBL, 1 - .DSK
Volume          db      0FEh                    ; .DSK: Disk Volume
Drive_S         Ends

SectorImage_S   Struc
AddressProlog   db      0D5h,0AAh,096h          ; Address Field Prolog
AddressCheckSum db      000h                    ; Address Field CheckSum
AddressEpilog   db      0DEh,0AAh,0EBh          ; Address Field Epilog
DataProlog      db      0D5h,0AAh,0ADh          ; Data Field Prolog
DataCheckSum    db      000h                    ; Data Field CheckSum
DataEpilog      db      0DEh,0AAh,0EBh          ; Data Field Epilog
EndByte         db      0FFh                    ; End Of Sector byte
SectorImage_S   Ends

SectorImageF_S  Struc
AddressProlog   db      0FFh,0FFh,0FFh          ; Sector Image compare flags
AddressCheckSum db      0FFh                    ;
AddressEpilog   db      0FFh,0FFh,000h          ; 0 - ignore, 0FFh - compare
DataProlog      db      0FFh,0FFh,0FFh          ;
DataCheckSum    db      0FFh                    ;
DataEpilog      db      0FFh,0FFh,000h          ;
EndByte         db      000h                    ;
SectorImageF_S  Ends

;------ Error Codes:
;                               ; AL:   DL:
e_BadAdrCheckSum   =    0       ; Yes   No      ; Bad Address Field Checksum
e_BadAdrEpilog     =    1       ; No    Yes     ; Bad Address Field Epilog
e_BadTrackNumber   =    2       ; Yes   Yes     ; Track Number mismatch
e_BadSectorNumber  =    3       ; Yes   No      ; Not [0..F] Sector Number
e_MissingDataField =    4       ; No    Yes     ; Data Field not found
e_DuplicateSector  =    5       ; Yes   Yes     ; Sector found again
e_BadDataCheckSum  =    6       ; Yes   Yes     ; Bad Data Field Checksum
e_BadDataImage     =    7       ; No    Yes     ; Not 6&2 coded byte found
e_BadDataEpilog    =    8       ; No    Yes     ; Bad Data Field Epilog
e_BadEndByte       =    9       ; Yes   Yes     ; Bad End Byte
e_MissingSector    =    10      ; Yes   No      ; Sector not found

e_WriteAttempt     =    11                      ; Write attempt on protected disk


Generated by GNU Enscript 1.6.6, and GophHub 1.3.