GophHub - zajo/appler/src/DRAM.INC


Raw File

;  _____________________________________________
; |                                             |
; |  Project:   APPLER                          |
; |  File:      DRAM.INC                        |
; |  Compiler:  16-bit TASM (2.5)               |
; |                                             |
; |  Subject:   RAM Card Emulation              |
; |                                             |
; |  Author:    Alexander Patalenski            |
; |_____________________________________________|

;       This file is included in EMULATE.ASM

;-------------- DRAM emulation entries -----------------------------------------

                assume  CS:Emulate,DS:Apple,ES:Video,SS:Data

                UseNextFreeSpace

ResetDRAM       proc    far
                mov     ax,Apple
                mov     ds,ax
                mov     ax,Video
                mov     es,ax
                mov     al,82h
                mov     di,offset ResetDRAM_1
                jmp     C08Xr
ResetDRAM_1:    mov     al,82h
                mov     di,offset ResetDRAM_2
                jmp     C08Xr
ResetDRAM_2:    ret
ResetDRAM       endp

; Entry:
;   bx    - file handle
; Action:
;   load memory banks
; Exit:
;   CF: 0-ok, 1-error (don't close file)
DRAMLoad        proc    far
                push    ax cx dx ds
                mov     ax,seg Bank1
                mov     ds,ax
                mov     dx,offset Bank1
                mov     cx,4000h
                mov     ah,3Fh
                int     21h
                cmp     ax,cx
                pop     ds dx cx ax
                ret
DRAMLoad        endp

; Entry:
;   bx    - file handle
; Action:
;   save memory banks
; Exit:
;   CF: 0-ok, 1-error (don't close file)
DRAMSave        proc    far
                push    ax cx dx ds
                mov     ax,seg Bank1
                mov     ds,ax
                mov     dx,offset Bank1
                mov     cx,4000h
                mov     ah,40h
                int     21h
                cmp     ax,cx
                pop     ds dx cx ax
                ret
DRAMSave        endp
                CheckAddress

                UseNextFreeSpace
C08Xr:          and     al,0Fh
                mov     bx,offset C080readTbl
                xlat    CS:[bx]
                mov     bh,C080
                mov     bl,bh
                shl     bl,1
                or      bl,bh
                or      bl,00000111b
                and     bl,al
                mov     al,bl
                mov     C080,al
                xor     al,bh
                test    al,1011b
                jnz     C08Xr_10
                mov     bl,ch
                jmp     di

C08Xr_10:       push    cs
                push    di                      ; BH/BL - old/new C080 value
                jmp     SetDRAM                 ; AL - BH xor BL

C080readTbl     db      0010b,1100b,0000b,1110b,0010b,1100b,0000b,1110b
                db      0011b,1101b,0001b,1111b,0011b,1101b,0001b,1111b
                CheckAddress

                UseNextFreeSpace
C08Xw:          and     al,0Fh
                mov     bx,offset C080writeTbl
                xlat    CS:[bx]
                mov     bh,C080
                mov     bl,bh
                or      bl,00000111b
                and     bl,al
                mov     al,bl
                mov     C080,al
                xor     al,bh
                test    al,1011b
                jz      C08Xw_10
                Save    ax
                call    SetDRAM                 ; BH/BL - old/new C080 value
                Restore ax                      ; AL - BH xor BL
C08Xw_10:       sahf
                mov     bl,ch
                DoNext

C080writeTbl    db      0010b,1000b,0000b,1010b,0010b,1000b,0000b,1010b
                db      0011b,1001b,0001b,1011b,0011b,1001b,0001b,1011b
                CheckAddress

;-------------- DRAM emulation subroutines -------------------------------------

Peripher        segment public
                assume  CS:Peripher,DS:Nothing,ES:Nothing

SetDRAM         Proc    far
;               BH/BL - old/new C080 value, AL - BH xor BL

                test    al,0011b
                jz      SetDRAM_20

                Save    bx cx dx si bp ds es
                test    al,0001b
                jz      SetDRAM_10
                Save    ax
                test    bh,0010b                ; Swap Bank1<->Bank2
                mov     ax,offset Bank1
                mov     bx,offset Bank2
                mov     bp,seg Bank2
                mov     ds,bp
                jz      SetDRAM_05
                mov     bx,0D000h
                mov     bp,Apple
SetDRAM_05:     mov     dx,1000h/1000h
                call    SwapMem
                Restore ax
                test    al,0010b
                jz      SetDRAM_15

SetDRAM_10:     mov     ax,seg DRAM             ; Swap ROM<->RAM
                mov     ds,ax
                mov     ax,offset DRAM
                mov     bx,0D000h
                mov     bp,Apple
                mov     dx,3000h/1000h
                call    SwapMem
SetDRAM_15:     Restore bx cx dx si bp ds es

SetDRAM_20:     test    bl,1000b                ; Set write mode :
                mov     ax,DRAM_DoNotWrite      ;  1 - read/write
                jz      SetDRAM_25              ;  2 - write only
                test    bl,0010b                ;  3 - don't write
                mov     ax,DRAM_WriteOnly
                jz      SetDRAM_25
                mov     ax,DRAM_ReadWrite

SetDRAM_25:     mov     bx,ds
                mov     di,Emulate
                mov     ds,di
Temp            =       0
                REPT    100h-0D0h
                mov     DS:DRAM_ModefyAdr[Temp],ax
Temp            =       Temp+100h
                ENDM
                mov     ds,bx
                mov     bl,ch
                ret
SetDRAM         Endp


SwapMem         Proc    near
                cld
SwapMem_10:     mov     si,ax
                mov     di,offset Buffer1000h
                mov     cx,seg Buffer1000h
                mov     es,cx
                mov     cx,1000h/2
        rep     movsw
                mov     di,ax
                mov     ax,si
                mov     si,bx
                mov     cx,ds
                mov     es,cx
                mov     ds,bp
                mov     cx,1000h/2
        rep     movsw
                mov     di,bx
                mov     bx,si
                mov     si,offset Buffer1000h
                mov     bp,es
                mov     cx,ds
                mov     es,cx
                mov     cx,seg Buffer1000h
                mov     ds,cx
                mov     cx,1000h/2
        rep     movsw
                mov     ds,bp
                mov     bp,es
                dec     dx
                jnz     SwapMem_10
                ret
SwapMem         Endp

Data            segment stack 'stack'
                even
Bank1           db      1000h dup(0)
Bank2           Label   byte
DRAM            db      3000h dup(0)
Data            ends

Peripher        ends

Generated by GNU Enscript 1.6.6, and GophHub 1.3.