home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 25 / CD_ASCQ_25_1095.iso / dos / prg / cpe50 / cpe / ipe1.asm next >
Assembly Source File  |  1995-09-05  |  79KB  |  3,876 lines

  1. ; *******************************************************************
  2. ; * Amstrad CPC emulator v4.9i                                      *
  3. ; * (c) 1991-95 Bernd Schmidt                                       *
  4. ; *                                                                 *
  5. ; *******************************************************************
  6.  
  7.     IDEAL
  8.  
  9. PUBLIC rambase,amsdos,basic,rom7,sysstat,scrbase
  10. PUBLIC DoScr,inp,outp,memmap,normramseg
  11. PUBLIC intreq,ffcount
  12. PUBLIC cleanup
  13. PUBLIC ReDrawCount,RedrawScreen,RedrawArea,RethinkCRTC,colmode,SetColors
  14. PUBLIC crtcvgaoff,writevgaoff
  15. PUBLIC ClearCRTCDBuf,reset,multimodeon,modezones,modeffoff
  16. PUBLIC PCRTC_Mode,SetPCsCRTC
  17. PUBLIC lsmode,doublelin,asyncff,clearff,emulr,realtime,fancyrlt
  18. PUBLIC GetPrtState,DoJoystick
  19.  
  20. PUBLIC SBinstalled,SBport,usesound,PSGcount,psgregmod,psgregs,sbdelay,noisy
  21. PUBLIC cpctype,quietcas,germkey
  22. EXTRN SB_Reset:PROC,DoSound:PROC,RethinkPSG:PROC,SOUND_Init:PROC,SOUND_Cleanup:PROC
  23.  
  24. EXTRN  inpFB:PROC,outFA:PROC,outFB:PROC
  25. EXTRN  OpenDriveA:PROC,CloseDisk:PROC,DCstat:BYTE
  26. EXTRN  DiskBuf:BYTE,fha:WORD
  27.  
  28. EXTRN simz80:PROC,sz80l:PROC,interrupt:PROC,sz80gb:PROC
  29. EXTRN simstack:WORD,sAFx:WORD,sBCx:WORD,sDEx:WORD,sHLx:WORD,ix:WORD,iy:WORD
  30. EXTRN srF:WORD,srFhi:WORD,srI:WORD,imode:WORD,sIFF1:BYTE,sIFF2:BYTE
  31. EXTRN intflag:WORD,simz80l:PROC,intspeed:WORD,NormISpeed:WORD
  32. EXTRN imode:WORD
  33.  
  34. PUBLIC MenuScr,MenuItems,MenuVars,FixPrefs
  35. PUBLIC RestoreScreen,ResetScreen,OpenTextScr,PutChar
  36.  
  37. PUBLIC LoadSnap,SaveSnap
  38.  
  39. ; *** Code from files.asm
  40. EXTRN GetDirs:PROC,GetSnapDir:PROC,SelFile:PROC,SelSnap:PROC,GetSaveSnapName:PROC
  41. EXTRN InitTape:PROC,CloseTape:PROC
  42.  
  43. ; *** Data from files.asm
  44. EXTRN snapdir:BYTE,snaname:BYTE,snapha:WORD
  45.  
  46. ; *** Code from misc.asm
  47. EXTRN LoadROMs:PROC,Menu:PROC,ClearKeyMap:PROC,Video:PROC,MyKeyInt:PROC,SetLEDs:PROC
  48.  
  49. ; *** Data from misc.asm
  50. EXTRN KeyMatrix:BYTE
  51.  
  52. EXTRN ColorTab:DWORD,ColorTabA:DWORD
  53.  
  54. ; *** Code from comp386.asm
  55. EXTRN UnpackArea:PROC,PackArea:PROC
  56.  
  57. P386
  58.  
  59. GROUP   DGROUP _stack,_data
  60.  
  61.       INCLUDE "macros.inc"
  62.  
  63. SEGMENT _text PAGE PUBLIC 'CODE'
  64. ASSUME CS:_text
  65. ASSUME DS:DGROUP
  66.  
  67. start:
  68.       ;  STARTUPCODE
  69.     MOV     DX,DGROUP
  70.     MOV     DS,DX
  71.     MOV     DX,SEG stck
  72.     MOV     SS,DX
  73.     MOV     DX,OFFSET stckend
  74.     MOV     SP,DX
  75.  
  76.     XOR     EAX,EAX
  77.     XOR     EBX,EBX
  78.     XOR     ECX,ECX
  79.     XOR     EDX,EDX
  80.     XOR     ESI,ESI
  81.     XOR     EDI,EDI
  82.     XOR     EBP,EBP
  83.  
  84.     MOV     [fha],0ffffh
  85.     MOV     [snapha],0ffffh
  86.  
  87.         CALL    GetDirs
  88.  
  89.     CALL    GetOldKeyInt
  90.     CALL    GetOld8253Int
  91.  
  92.     CALL    GetScrMode
  93.  
  94.     CALL    OpenPrinter
  95.  
  96.     MOV     DX,OFFSET prefname        ; load prefs
  97.     MOV     AX,3d00h
  98.     INT     21h
  99.     JC      cleanup
  100.     MOV     BX,AX
  101.     MOV     AH,3Fh
  102.     MOV     DX,OFFSET CPEPrefs
  103.     MOV     CX,42
  104.     INT     21h
  105.     MOV     AH,3Fh
  106.     MOV     DX,OFFSET joystuff
  107.     MOV     CX,8
  108.     INT     21h
  109.     MOV     AH,3Eh
  110.     INT     21h
  111.  
  112.         CALL    FixPrefs
  113.  
  114.     CALL    InitRamSegs
  115.         CALL    LoadROMs
  116.  
  117.     MOV     AX,CS
  118.     MOV     DS,AX
  119.     MOV     DX,OFFSET MyKeyInt
  120.     MOV     AX,2509h
  121.     INT     21h                     ; set interrupt
  122.     MOV     AX,DGROUP
  123.     MOV     DS,AX
  124.  
  125.     MOV     AX,[normramseg]
  126.     MOV     ES,AX
  127.  
  128.     MOV     [NormISpeed],1
  129.     MOV     [intspeed],1
  130.  
  131.     CALL    Set8253Int
  132.  
  133.     CALL    SOUND_Init
  134.     CALL    SB_reset
  135.  
  136.     CALL    OpenDriveA
  137.     CALL    InitHardware
  138.     CALL    reset
  139.  
  140.     JMP     simz80
  141.  
  142. cleanup:
  143.     CALL    SB_reset
  144.     CALL    SOUND_Cleanup
  145.     CALL    CloseTape
  146.     CALL    CloseDisk
  147.     CALL    DisableInt
  148.     CALL    Res8253Int
  149.     CALL    SetOldMode
  150.     CALL    ClosePrinter
  151.     CALL    CleanupEMM
  152.     EXITCODE
  153.  
  154. GetOldKeyInt:
  155.     MOV     AX,3509h
  156.     INT     21h
  157.     MOV     [oldintseg],ES
  158.     MOV     [oldintadd],BX
  159.     RET
  160.  
  161. DisableInt:
  162.     PUSHAD
  163.     MOV     DX,[oldintadd]
  164.     MOV     AX,[oldintseg]
  165.     MOV     DS,AX
  166.     MOV     AX,2509h
  167.     INT     21h                     ; set interrupt
  168.     MOV     AX,DGROUP
  169.     MOV     DS,AX
  170.     POPAD
  171.     RET
  172.  
  173. GetOld8253Int:
  174.     MOV     AX,3508h
  175.     INT     21h
  176.     MOV     [old8253seg],ES
  177.     MOV     [old8253add],BX
  178.     RET
  179.  
  180. Set8253Int:
  181.     MOV     AX,CS
  182.     MOV     DS,AX
  183.     MOV     DX,OFFSET My8253Int
  184.     MOV     AX,2508h
  185.     INT     21h
  186.     CLI
  187.     MOV     AX,DGROUP
  188.     MOV     DS,AX
  189.  
  190.     MOV     DX,43h
  191.     MOV     AL,36h
  192.     OUT     DX,AL
  193.     MOV     DX,40h
  194.     MOV     AX,[timerval]
  195.     OUT     DX,AL
  196.     MOV     AL,AH
  197.     OUT     DX,AL
  198.     STI
  199.     RET
  200.  
  201. Res8253Int:
  202.     CLI
  203.     MOV     DX,43h
  204.     MOV     AL,36h
  205.     OUT     DX,AL
  206.     MOV     DX,40h
  207.     MOV     AL,000h
  208.     OUT     DX,AL
  209.     MOV     AL,000h
  210.     OUT     DX,AL
  211.  
  212.     MOV     AX,[old8253seg]
  213.     MOV     DX,[old8253add]
  214.     MOV     DS,AX
  215.     MOV     AX,2508h
  216.     INT     21h
  217.     MOV     AX,DGROUP
  218.     MOV     DS,AX
  219.     STI
  220.     RET
  221.  
  222. My8253Int:
  223.     PUSH    DS
  224.     PUSH    EAX
  225.  
  226.     PUSH    DGROUP
  227.     POP     DS
  228.  
  229.     CALL    My8253Handler
  230.  
  231.     MOV     AX,[timerval]
  232.     ADD     [timercount],AX
  233.     JNC     M8253_Ret
  234.     POP     EAX
  235.     POP     DS
  236.     JMP     [old8253]
  237.  
  238. M8253_Ret:
  239.     MOV     AL,20h
  240.     OUT     20h,AL
  241.     POP     EAX
  242.     POP     DS
  243.     IRET
  244.  
  245. LABEL old8253 DWORD
  246. old8253add  dw    0
  247. old8253seg  dw    0
  248.  
  249. My8253Handler:
  250.     PUSH    EAX
  251.     PUSH    DS
  252.     PUSH    DX
  253.  
  254.     MOV     AX,DGROUP
  255.     MOV     DS,AX
  256.  
  257.         CMP     [resetting],0
  258.         JNE     MII_NotInt
  259.  
  260.     CMP     [doingems],0
  261.     JNE     MII_NotInt
  262.  
  263.     CMP     [ffcount],5
  264.     JNE     MII_CheckRHitEnd
  265.     MOV     DX,3dah
  266.     IN      AL,DX
  267.     AND     AL,8h
  268.     MOV     [PCRTC_HITVB],AL
  269.     JE      MII_CheckRHit_noff
  270.     MOV     [PCRTC_VR2CNT],0
  271.     JMP     MII_CheckRHitEnd
  272. MII_CheckRHit_noff:
  273.     CMP     [PCRTC_VR2CNT],20
  274.     JNC     MII_CheckRHitEnd
  275.     INC     [PCRTC_VR2CNT]
  276. MII_CheckRHitEnd:
  277.  
  278.     DEC     [intcount]
  279.     JNS     MII_intcountok
  280.     MOV     AX,[intspeed]
  281.     ADD     [intcount],AX
  282. MII_intcountok:
  283.     CMP     [intcount],0
  284.     JNE     MII_NotInt
  285.  
  286.     CMP     [multimodeon],0
  287.     JNE     MII_ExactOverride
  288.     CMP     [permitmm],0
  289.     JE      MII_Exact_NoOverride
  290.     CMP     [lastmodechg],6
  291.     JC      MII_ExactOverride
  292. MII_Exact_NoOverride:
  293.     CMP     [exactint],0
  294.     JNE     MII_ExactInt
  295. MII_ExactOverride:
  296.     MOV     AX,[intflag]            ; check if last int has been
  297.     AND     AX,4000h                ; processed by simz80
  298.     JZ      MII_ExactInt
  299.     MOV     [omitnextint],2
  300. MII_ExactInt:
  301.  
  302.     CMP     [permitmm],0
  303.     JE      MII_MMEnd
  304.     MOV     AX,[modeinprogr]
  305.     CMP     AX,0
  306.     JE      MII_NoModeIP
  307.     MOV     [omitnextint],2
  308.     JMP     MII_MMEnd
  309. MII_NoModeIP:
  310.     CMP     [multimodeon],0
  311.     JE      MII_MMEnd
  312.     MOV     AX,[mozoctdn]
  313.     OR      AX,AX
  314.     JZ      MII_NoZoneChgHappened
  315.     DEC     [mozoctdn]
  316.     JNZ     MII_NoZoneChgHappened
  317.     MOV     [mmintsignal],1
  318. MII_NoZoneChgHappened:
  319.     XOR     EAX,EAX
  320.     MOV     AX,[ffcount]
  321.     MOV     AL,[EAX+modeffoff]
  322.     MOV     DL,[EAX+modezones]
  323.     CMP     DL,[videomode]
  324.     JE      MII_MMEnd
  325.     MOV     DL,[videomode]
  326.     MOV     [EAX+modezones],DL
  327.     MOV     [modezochgd],1
  328. MII_MMEnd:
  329.  
  330.     CMP     [multimodeon],0
  331.     JE      MII_StillMM
  332.     MOV     DX,[WORD PTR modezones]
  333.     CMP     [WORD PTR modezones+2],DX
  334.     JNE     MII_StillMM
  335.     CMP     [WORD PTR modezones+4],DX
  336.     JNE     MII_StillMM
  337.     OR      [intflag],1
  338.     MOV     [RedrawCount],10
  339.     MOV     [multimodeon],41h
  340. MII_StillMM:
  341.  
  342.     CMP     [omitnextint],0
  343.     JE      MII_NoOmit
  344.     DEC     [omitnextint]
  345.     JMP     MII_NotInt
  346. MII_NoOmit:
  347.  
  348.     OR      [intflag],4000h
  349.  
  350.     DEC     [ffcount]
  351.     JNS     MII_noff
  352.     MOV     AX,[lastdbuf]
  353.     OR      AX,AX
  354.     JE      MII_nodbuf
  355.     CMP     AX,1
  356.     JNE     MII_decdbuf
  357.     OR      [intflag],8
  358. MII_decdbuf:
  359.     DEC     [lastdbuf]
  360.     CMP     [xchgdbuf],0
  361.     JE      MII_nodbuf
  362.     CMP     [lastdbuf],22
  363.     JNE     MII_nodbuf
  364.     CALL    SetNewScrBase
  365. MII_nodbuf:
  366.     MOV     [ffcount],5
  367.     OR      [intflag],8000h
  368. MII_noff:
  369.  
  370.     CMP     [permitmm],0
  371.     JE      MII_NoMultiModePermitted
  372.     MOV     AL,[lastmodechg]
  373.     INC     AL
  374.     CMP     AL,10
  375.     JNE     MII_MuMo_ALOK
  376.     DEC     AL
  377. MII_MuMo_ALOK:
  378.     CMP     AL,7
  379.     JNE     MII_MuMo_WBackAL
  380.     CMP     [multimodeon],0
  381.     JNE     MII_MuMo_WBackAL
  382.     OR      [intflag],1
  383.     MOV     [RedrawCount],1
  384. MII_MuMo_WBackAL:
  385.     MOV     [lastmodechg],AL
  386. MII_NoMultiModePermitted:
  387.  
  388.     MOV     DX,0
  389.     MOV     AX,4
  390.     CMP     [asyncff],0
  391.     JE      MII_syncok
  392.     INC     AX
  393.     CMP     [fancyrlt],0
  394.     JE      MII_syncok
  395.     MOV     AX,3
  396. MII_syncok:
  397.     CMP     [ffcount],AX
  398.     JNE     MII_FF4End
  399.     MOV     DX,1
  400.     MOV     AX,[ffly_dec_std]
  401.     MOV     [ffly_dec],AX
  402. MII_FF4End:
  403.     MOV     [ffly],DX
  404.  
  405. MII_NotInt:
  406.     CMP     [PCRTC_MODE],2                  ; MODE = 2 (adjust 50Hz)?
  407.     JNE     MII_FF3End
  408.     CMP     [ffcount],1
  409.     JNE     MII_FF3End
  410.     CMP     [CRTCkyfo],0
  411.     JNE     MII_FF3End
  412.     CLI
  413.     MOV     AX,[PCRTC_VT1]
  414.     MOV     DX,[PCRTC_VR1]
  415.     INC     AL
  416.     INC     DX
  417.     CMP     [PCRTC_HITVB],0
  418.     JNE     MII_VidValsOK
  419.     DEC     AL
  420.     DEC     DX
  421.     CMP     [PCRTC_VR2CNT],20
  422.     JC      MII_VidValsOK
  423.     ADD     AL,4
  424.     ADD     DX,4
  425. MII_VidValsOK:
  426.     PUSH    DX
  427.     PUSH    AX
  428.     MOV     DX,3d4h
  429.     MOV     AL,6h
  430.     OUT     DX,AL
  431.     POP     AX
  432.     INC     DX
  433.     OUT     DX,AL
  434.  
  435.     MOV     DX,3d4h
  436.     MOV     AL,10h
  437.     OUT     DX,AL
  438.     INC     DX
  439.     POP     AX
  440.     OUT     DX,AL
  441.     DEC     DX
  442.     MOV     AL,7
  443.     OUT     DX,AL
  444.     INC     DX
  445.     IN      AL,DX
  446.     ADD     AH,AH
  447.     ADD     AH,AH
  448.     PUSH    CX
  449.     MOV     CL,AH
  450.     SHL     CL,4
  451.     AND     CL,80h
  452.     AND     AH,4
  453.     AND     AL,7bh
  454.     OR      AL,AH
  455.     OR      AL,CL
  456.     OUT     DX,AL
  457.     POP     CX
  458.  
  459. MII_FF3End:
  460.     STI
  461.     POP     DX
  462.     POP     DS
  463.     POP     EAX
  464.     RET
  465.  
  466. DoJoystick:
  467.     CMP     [usejoy],0
  468.     JE      DJOY_End
  469.     CMP     [ffcount],0
  470.     JNE     DJOY_End
  471.     PUSHAD
  472.     MOV     DX,201h
  473.     IN      AL,DX
  474.     XOR     ESI,ESI
  475.     XOR     EDI,EDI
  476.     CLI
  477.     XOR     AX,AX
  478.     OUT     DX,AL
  479.  
  480. DJOY_l: IN      AL,DX
  481.     AND     AL,3
  482.     JZ      DJOY_lend
  483.     BT      AX,0
  484.     JNC     DJOY_notx
  485.     INC     ESI
  486. DJOY_notx:
  487.     BT      AX,1
  488.     JNC     DJOY_noty
  489.     INC     EDI
  490. DJOY_noty:
  491.     JMP     DJOY_l
  492. DJOY_lend:
  493.     IN      AL,DX
  494.     STI
  495.     MOV     CL,[KeyMatrix+9]
  496.     OR      CL,03fh
  497.     CMP     SI,[joyr]
  498.     JNC     DJOY_notright
  499.     XOR     CL,4
  500. DJOY_notright:
  501.     CMP     [joyl],SI
  502.     JNC     DJOY_notleft
  503.     XOR     CL,8
  504. DJOY_notleft:
  505.     CMP     DI,[joyu]
  506.     JNC     DJOY_notup
  507.     XOR     CL,1
  508. DJOY_notup:
  509.     CMP     [joyd],DI
  510.     JNC     DJOY_notdn
  511.     XOR     CL,2
  512. DJOY_notdn:
  513.     AND     AL,48
  514.     AND     CL,0CFh
  515.     OR      CL,AL
  516.     MOV     [KeyMatrix+9],CL
  517.     POPAD
  518. DJOY_End:
  519.     RET
  520.  
  521. GetScrMode:
  522.     MOV     AH,0FH
  523.     CALL    Video
  524.     PUSH    AX
  525.     MOV     AX,1130H
  526.     MOV     BH,0
  527.     MOV     DL,0
  528.     CALL    Video
  529.     POP     AX
  530.     MOV     DH,AH
  531.     CMP     DL,25
  532.     SBB     AH,AH
  533.     INC     AH
  534.     MOV     [OldVideo],AX
  535.     RET
  536.  
  537. SetOldMode:
  538.     MOV     AX,[OldVideo]
  539.     MOV     BX,40h
  540.     MOV     ES,BX
  541.     MOV     BL,20H
  542.     CMP     AL,7            ; smMono
  543.     JNE     @@1
  544.     MOV     BL,30H
  545.  
  546. @@1:    AND     [BYTE PTR ES:10h],0CFH     ; Equipmentbyte
  547.     OR      [ES:10h],BL
  548.     AND     [BYTE PTR ES:87h],0FEH     ; CrtInfo
  549.     PUSH    AX
  550.     MOV     AH,0
  551.     CALL    Video
  552.     POP     AX
  553.     OR      AH,AH
  554.     JE      @@2
  555.     MOV     AX,1112H
  556.     MOV     BL,0
  557.     CALL    Video
  558.     MOV     AX,1130H
  559.     MOV     BH,0
  560.     MOV     DL,0
  561.     CALL    Video
  562.     CMP     DL,42
  563.     JNE     @@2
  564.     OR      [BYTE PTR ES:87h],1
  565.     MOV     AH,1
  566.     MOV     CX,600H
  567.     CALL    Video
  568.     MOV     AH,12H
  569.     MOV     BL,20H
  570.     CALL    Video
  571. @@2:
  572.     RET
  573.  
  574. OpenTextScr:
  575.         MOV     AL,[PCRTC_MODE]
  576.         MOV     [tssavedmode],AL
  577.         MOV     [PCRTC_MODE],0
  578.  
  579.         MOV     AX,3
  580.         CALL    Video
  581.         PUSH    0B800h
  582.         POP     FS
  583.         RET
  584.  
  585. PutChar:
  586.         MOV     [FS:EDX*2],AX
  587.         RET
  588.  
  589. RestoreScreen:
  590.         PUSH    AX
  591.         MOV     AL,[tssavedmode]
  592.         MOV     [PCRTC_MODE],AL
  593.         POP     AX
  594. ResetScreen:
  595.     CALL    ClearCRTCDBuf
  596.     MOV     [scrtype],0ffffh
  597.     CALL    SetPCsCRTC
  598.     CALL    RedrawScreen
  599.         RET
  600.  
  601. FixPrefs:
  602.         CMP     [havejoy],0f00bh
  603.         JNE     FPRF_JoyCalibrated
  604.         MOV     [havejoy],0ffffh
  605.  
  606.         MOV     AX,8400h                  ; check joystick
  607.         MOV     DX,1
  608.         INT     15h
  609.         JC      FPRF_nojoy
  610.  
  611.         CMP     [joyr],4
  612.         JNC     FPRF_JoyCalibrated
  613. FPRF_nojoy:
  614.         MOV     [havejoy],0
  615. FPRF_JoyCalibrated:
  616.         CMP     [SBinstalled],0
  617.     JNE     FPRF_DontClearSB
  618.     MOV     [usesound],0
  619. FPRF_DontClearSB:
  620.         MOV     BP,[havejoy]
  621.         AND     [usejoy],BP
  622.         RET
  623.  
  624. InitHardware:
  625.     MOV     [CRTCkyfo],0
  626.     MOV     [ffly],0
  627.     MOV     [scrbase],0ffffh
  628.     MOV     [colmode],0
  629.     MOV     [PCRTC_MODE],0
  630.     MOV     [scrtype],0
  631.     CALL    InitTape
  632.     RET
  633.  
  634. reset:  PUSH    40h
  635.     POP     FS
  636.     CLI
  637.     MOV     AL,[FS:17h]
  638.     OR      AL,96
  639.     XOR     AL,64
  640.     MOV     [FS:17h],AL
  641.     SHR     AL,4
  642.     AND     AL,7
  643.     AND     [BYTE PTR FS:97h],0f8h
  644.     OR      [FS:97h],AL
  645.     STI
  646.  
  647.         MOV     [resetting],1
  648.  
  649.     CALL    ClearKeyMap
  650.     CALL    SetLEDs
  651.  
  652.     MOV     [WORD PTR sysstat],9
  653.     MOV     [memstate],9
  654.     MOV     [romnum],0
  655.     MOV     [doingems],0
  656.     CALL    InitCRTC
  657.     CALL    RethinkMemMap
  658.     CALL    ResetRAMState
  659.     CALL    RethinkRamState
  660.     MOV     sPC,0
  661.     InitPCSeg
  662.     MOV     [sIFF1],0
  663.     MOV     [sIFF2],0
  664.     MOV     [intreq],0
  665.     MOV     [dcstat],0
  666.     MOV     [imode],1
  667.     MOV     [omitnextint],2
  668.     MOV     [intflag],0
  669.         MOV     [simstack],0
  670.  
  671.         MOV     [resetting],0
  672.     XOR     EBP,EBP
  673.     RET
  674.  
  675. InitCRTC:
  676.     MOV     BP,OFFSET CRTCregs
  677.     MOV     [DWORD PTR BP],08e2e283fh
  678.     MOV     [DWORD PTR BP+4],01e190026h
  679.     MOV     [DWORD PTR BP+8],00000700h
  680.     MOV     [DWORD PTR BP+12],00c00030h
  681.  
  682.     MOV     [crtcvgaoff],0FFFFh
  683.     MOV     [crtcvgaoff+2],0FFFFh
  684.     MOV     [crtcvgaoff+4],0FFFFh
  685.     MOV     [crtcvgaoff+6],00000h
  686.     CALL    GenWriteVGAoff
  687.     MOV     [crtcscrheight],25
  688.     MOV     [crtcscrwidth],40
  689.     MOV     [scroff],0
  690.     MOV     [scrbase],0C000h
  691.     MOV     [vgascroll],0
  692.     MOV     [scrtype],0ffffh
  693.  
  694.     MOV     [mmintsignal],0
  695.     MOV     [videomode],1
  696.     MOV     [newvidmode],1
  697.     MOV     [WORD PTR modezones],0101h
  698.     MOV     [WORD PTR modezones+2],0101h
  699.     MOV     [WORD PTR modezones+4],0101h
  700.     MOV     [WORD PTR oldmzones],0101h
  701.     MOV     [WORD PTR oldmzones+2],0101h
  702.     MOV     [WORD PTR oldmzones+4],0101h
  703.     MOV     [lastmodechg],9
  704.     MOV     [multimodeon],0
  705.     MOV     [modeinprogr],0
  706.     MOV     [modezochgd],0
  707.     MOV     [mozoctdn],0
  708.  
  709.     CALL    InitScroff
  710.     CALL    SetPCsCRTC
  711.     CALL    GenByteMode
  712.     CALL    GenLatchTables
  713.     RET
  714.  
  715. ClearCRTCDbuf:                    ; adjusts crtcvgaoff so that all except current
  716.     PUSH    sFree
  717.     PUSH    BP
  718.     MOV     sFree,[scrbase]   ; bank have to be redrawn
  719.     SHR     sFree,14
  720.     MOV     BP,[EsFree*2+crtcvgaoff]
  721.     MOV     [crtcvgaoff],0FFFFh
  722.     MOV     [crtcvgaoff+2],0FFFFh
  723.     MOV     [crtcvgaoff+4],0FFFFh
  724.     MOV     [crtcvgaoff+6],0FFFFh
  725.     MOV     [EsFree*2+crtcvgaoff],BP
  726.     POP     BP
  727.     POP     sFree
  728.     CALL    GenWriteVGAoff
  729.     RET
  730.  
  731. GenWriteVGAoff:
  732.     PUSHAW
  733.     XOR     BX,BX
  734.     XOR     DH,DH
  735.     MOV     CX,4
  736. GWVO_Loop:
  737.     MOV     AX,0ffffh
  738.     MOV     DL,[BX+ramstate]
  739.     CMP     DL,4
  740.     JNC     GWVO_AXOK
  741.     MOV     AX,[EDX*2+crtcvgaoff]
  742. GWVO_AXOK:
  743.     MOV     [EBX*2+writevgaoff],AX
  744.     INC     BX
  745.     LOOP    GWVO_Loop
  746.     POPAW
  747.     RET
  748.  
  749. RedrawArea:
  750.     CMP     [multimodeon],0
  751.     JNE     RDA_SimpleMinded
  752.     PUSHAW                    ; AX: vga offset; ES: readseg; CX: len
  753.     PUSH    DS                ; SI: first addr
  754.     PUSH    ES
  755.     PUSH    ES
  756.     MOV     DX,AX
  757.     ADD     DX,[vgascroll]
  758.  
  759.     MOV     BX,SEG ScrAdConv
  760.     MOV     FS,BX
  761.     MOV     BP,SI
  762.     AND     BP,3fffh
  763.     ADD     BP,BP
  764.     ADD     BP,OFFSET ScrAdConv
  765.  
  766.     LES     BX,[scradd]
  767.     ADD     BH,[videomode]
  768.     POP     DS
  769. RDA_Loop1:
  770.     LODSB
  771.     XLAT    [ES:0]
  772.     MOV     DI,[FS:BP]
  773.     ADD     DI,DX
  774.     STOSB
  775.  
  776.     ADD     BP,2
  777.     LOOP    RDA_Loop1
  778.     POP     ES
  779.     POP     DS
  780.     POPAW
  781.     RET
  782.  
  783. RDA_SimpleMinded:
  784.     PUSHAW
  785.     MOV     BP,SI
  786.     MOV     sFree,AX
  787. RDA_SimpleLoop:
  788.     PUSH    BP
  789.     PUSH    sFree
  790.     MOVZX   AX,[ES:BP]
  791.     CALL    DoScr
  792.     POP     sFree
  793.     POP     BP
  794.     INC     BP
  795.     LOOP    RDA_SimpleLoop
  796.     POPAW
  797.     RET
  798.  
  799. MACRO   argh1
  800.     LODSB
  801.     XLAT    [ES:0]
  802.     STOSB
  803. ENDM
  804.  
  805. MACRO argh2
  806.       argh1
  807.       argh1
  808. ENDM
  809.  
  810. MACRO argh3
  811.       argh2
  812.       argh2
  813. ENDM
  814.  
  815. MACRO argh4
  816.       argh3
  817.       argh3
  818. ENDM
  819.  
  820. MACRO argh5
  821.       argh4
  822.       argh4
  823. ENDM
  824.  
  825. RDS_UnfoldedLoop:
  826.     argh5
  827.     argh5
  828.     argh5
  829.     argh5
  830.     argh5
  831.     argh5
  832.     argh5
  833.     argh5
  834.     argh5
  835.     argh5
  836.     argh5
  837.     argh5
  838.     argh5
  839.     argh5
  840.     argh5
  841.     argh5
  842.     argh5
  843.     argh5
  844.     argh5
  845.     argh5
  846.     argh5
  847.     argh5
  848.     argh5
  849.     argh5
  850.     argh5
  851.     argh5
  852.     argh5
  853.     argh5
  854.     argh5
  855.     argh5
  856.     argh5
  857.     argh5
  858.     argh1
  859. RDS_ULByteCnt:
  860.     argh1
  861. RDS_ULZero:
  862.     JMP     RDS_Loop
  863.  
  864. RedrawScreen:
  865.     CMP     [multimodeon],0
  866.     JNE     RDS_SimpleMinded
  867.     PUSHAW
  868.     PUSH    DS
  869.     PUSH    ES
  870.     MOV     BP,SEG ScrAdList
  871.     MOV     FS,BP
  872.     MOV     BP,ES
  873.     MOV     SI,[scrbase]
  874.     SHR     SI,4
  875.     ADD     BP,SI
  876.     LES     BX,[scradd]
  877.     ADD     BH,[videomode]
  878.     MOV     DI,[scrbase]
  879.     SHR     DI,14
  880.     MOV     DI,[EDI*2+crtcvgaoff]
  881.     ADD     DI,[vgascroll]
  882.     MOV     DS,BP
  883.     MOV     BP,OFFSET ScrAdList
  884.  
  885. RDS_Loop:
  886.     MOV     SI,[FS:BP]
  887.     MOV     AX,[FS:BP+2]
  888.  
  889.     ADD     BP,4
  890.     OR      SI,SI
  891.     JS      RDS_End
  892.     ADD     AX,AX
  893.     ADD     AX,AX                   ; LODSB /XLAT ES/STOSB = 4 bytes
  894.     NEG     AX
  895.     ADD     AX,OFFSET RDS_ULZero
  896.     JMP     AX
  897.  
  898. RDS_End:
  899.     POP     ES
  900.     POP     DS
  901.     POPAW
  902. RDS_Ret:
  903.     RET
  904.  
  905. RDS_SimpleMinded:
  906.     PUSHAW
  907.     PUSH    DS
  908.     MOV     BP,[scrbase]
  909.     MOV     DI,BP                    ; DI: CPC screen addr
  910.     ADD     DI,3fffh
  911.     SHR     BP,14
  912.     MOV     BP,[EBP*2+crtcvgaoff]
  913.     ADD     BP,[vgascroll]           ; BP: VGA Screen offset
  914.     MOV     CX,04000h                ; CX: counter
  915.     MOV     SI,07ffeh                ; SI: offset to ScrAdConv
  916.     LFS     BX,[scradd]              ; FS:BX 0a000:SColOff
  917.     PUSH    SEG ScrAdConv
  918.     POP     DS
  919.     STD
  920. RDS_Easy_Loop:
  921.     MOV     DX,[DS:SI+OFFSET ByteMode]
  922.     MOVZX   AX,[ES:DI]
  923.     ADD     AX,DX
  924.     ADD     AX,BX
  925.     MOV     AL,[FS:EAX]              ; read latch
  926.  
  927.     LODSW                            ; read converted VGA addr
  928.     ADD     AX,BP
  929.     MOV     [FS:EAX],AL              ; write latch
  930.     DEC     DI
  931.     LOOP    RDS_Easy_Loop
  932.     CLD
  933.     POP     DS
  934.     POPAW
  935.     RET
  936.  
  937. DoScr:                                  ; in sFree vga offset, BP cpc addr
  938.     PUSH    SEG ScrAdConv
  939.     POP     FS
  940.     ADD     BP,BP
  941.     BTR     BP,15
  942.     ADD     sFree,[FS:BP]           ; assumed: OFFSET ScrAdConv == 0
  943.     ADD     sFree,[vgascroll]
  944.     ADD     BP,OFFSET ByteMode
  945.     ADD     AX,[FS:BP]
  946.     LFS     BP,[scradd]
  947.     ADD     BP,AX
  948.     MOV     AL,[FS:BP]
  949.     MOV     [FS:sFree],AL
  950.     RET
  951.  
  952. RethinkCRTC:
  953.     PUSH    sFree        ; 1: GenScrAdConv, 2: ClearCRTCDBuf, 4: Redraw
  954.     XOR     sFree,sFree  ; 8: SetPCsCRTC, 16: InitScroff
  955.     PUSH    AX           ; 64: SetNewScrBase, 128: GenByteMode
  956.     PUSH    BP           ; 32768: only scroll
  957.     MOV     BP,[WORD PTR CRTCregs+12]
  958.     ROL     BP,8
  959.     ADD     BP,BP
  960.     MOV     AX,BP
  961.     ADD     BP,BP
  962.     AND     AX,7FEh
  963.     AND     BP,0C000h
  964.  
  965.     CMP     AX,[scroff]     ; ********** has the screen offset changed?
  966.     JE      CRTC_nonewscroff
  967.     XCHG    [scroff],AX
  968.     SUB     AX,[scroff]
  969.     AND     AX,7feh
  970.     MOV     [oldscroff],AX
  971.     OR      sFree,8007h
  972.     CMP     [multimodeon],0
  973.     JE      CRTC_nonewscroff
  974.     OR      sFree,128
  975. CRTC_nonewscroff:
  976.     CMP     BP,[scrbase]    ; ********** has the screen base changed?
  977.     JE      CRTC_nonewbase
  978.  
  979.     OR      sFree,64
  980.     AND     sFree,7fffh
  981.     MOV     [lastdbuf],25
  982.     PUSH    BX
  983.     PUSH    DX
  984.     MOV     BX,[scrbase]
  985.     MOV     [scrbase],BP
  986.     SHR     BP,14
  987.     MOV     DX,[EBP*2+crtcvgaoff]
  988.     OR      DX,DX
  989.     JNS     CRTC_newscrbase_end
  990. CRTC_newscrbase_rd:
  991.     SHR     BX,14
  992.     MOV     DX,[EBX*2+crtcvgaoff]
  993.     MOV     [crtcvgaoff],0ffffh
  994.     MOV     [crtcvgaoff+2],0ffffh
  995.     MOV     [crtcvgaoff+4],0ffffh
  996.     MOV     [crtcvgaoff+6],0ffffh
  997.     CMP     [permitdbuf],0
  998.     JE      CRTC_dbufforbidden
  999.     MOV     [EBX*2+crtcvgaoff],DX
  1000. CRTC_dbufforbidden:
  1001.     XOR     DX,4000h
  1002.     MOV     [EBP*2+crtcvgaoff],DX
  1003.     CALL    GenWriteVGAoff
  1004.     OR      sFree,4
  1005. CRTC_newscrbase_end:
  1006.     POP     DX
  1007.     POP     BX
  1008. CRTC_nonewbase:
  1009.     MOV     AX,[sysstat]    ; ********** has the mode changed?
  1010.     AND     AX,3
  1011.     MOV     AL,[MoTable+EAX]
  1012.     CMP     AL,[videomode]
  1013.     JE      CRTC_NoNewMode
  1014.     CMP     [multimodeon],0
  1015.     JNE     CRTC_Mode_MultiIsOn
  1016.  
  1017.     MOV     [videomode],AL
  1018.     AND     sFree,7fffh
  1019.     OR      sFree,86h
  1020.     JMP     CRTC_NoNewMode
  1021. CRTC_Mode_MultiIsOn:
  1022.     NOP                     ; Bug!
  1023. CRTC_NoNewMode:
  1024.     TEST    [multimodeon],40h ; ********* did one of the modezones change?
  1025.     JZ      CRTC_DontDoMMChg
  1026.     AND     [multimodeon],0BFh
  1027.     PUSH    EAX
  1028.     MOV     EAX,[DWORD PTR modezones]
  1029.     SUB     EAX,[DWORD PTR oldmzones]
  1030.     JNZ     CRTC_ModeChgCorrect
  1031.     MOV     AX,[WORD PTR modezones+4]
  1032.     SUB     AX,[WORD PTR oldmzones+4]
  1033. CRTC_ModeChgCorrect:
  1034.     POP     EAX
  1035.     JZ      CRTC_DontDoMMChg
  1036.     MOV     AX,[WORD PTR modezones]
  1037.     MOV     [WORD PTR oldmzones],AX
  1038.     MOV     AX,[WORD PTR modezones+2]
  1039.     MOV     [WORD PTR oldmzones+2],AX
  1040.     MOV     AX,[WORD PTR modezones+4]
  1041.     MOV     [WORD PTR oldmzones+4],AX
  1042.     MOV     [modeinprogr],1
  1043.     AND     sFree,7fffh
  1044.     OR      sFree,86h
  1045.     MOV     AX,[WORD PTR modezones]
  1046.     CMP     AX,[WORD PTR modezones+1]
  1047.     JNE     CRTC_DontDoMMChg
  1048.     CMP     AX,[WORD PTR modezones+2]
  1049.     JNE     CRTC_DontDOMMChg
  1050.     CMP     AX,[WORD PTR modezones+4]
  1051.     JNE     CRTC_DontDoMMChg
  1052.     MOV     [multimodeon],0
  1053. CRTC_DontDoMMChg:
  1054.     MOV     AL,[BYTE PTR CRTCregs+1]
  1055.     CMP     AL,[crtcscrwidth]; ********* has the screen width changed?
  1056.     JE      CRTC_nonewwidth
  1057.     CMP     AL,128
  1058.     JC      CRTC_NewWidth_OK
  1059.     MOV     AL,40
  1060. CRTC_NewWidth_OK:
  1061.     MOV     [crtcscrwidth],AL
  1062.     AND     sFree,7fffh
  1063.     OR      sFree,1eh
  1064.     CMP     [multimodeon],0
  1065.     JE      CRTC_nonewwidth
  1066.     OR      sFree,80h
  1067. CRTC_nonewwidth:
  1068.     MOV     AL,[BYTE PTR CRTCregs+6]
  1069.     CMP     AL,[crtcscrheight]; ******** has the screen height changed?
  1070.     JE      CRTC_nonewheight
  1071.     MOV     [crtcscrheight],AL
  1072.     AND     sFree,7fffh
  1073.     OR      sFree,1ch
  1074.     CMP     [multimodeon],0
  1075.     JE      CRTC_nonewheight
  1076.     OR      sFree,80h
  1077. CRTC_nonewheight:
  1078.     CMP     [spcrtcflag],0  ; ********** has one of the special regs changed?
  1079.     JE      CRTC_SFLAG0
  1080.     CMP     [spcrtcflag],2
  1081.     JNE     CRTC_SFLAG1
  1082.     OR      sFree,96h
  1083. CRTC_SFLAG1:
  1084.     MOV     [spcrtcflag],0
  1085.     AND     sFree,7fffh
  1086.     OR      sFree,8
  1087. CRTC_SFLAG0:
  1088.  
  1089.     TEST    sFree,8000h        ;******* Well, now we can do the necessary
  1090.     JZ      CRTC_NotJustScroll ;******* steps...
  1091.     CMP     [crtccareful],0
  1092.     JNE     CRTC_NotJustScroll
  1093.     CALL    JustScrollIt
  1094.     OR      sFree,sFree
  1095.     JE      CRTC_Rethought
  1096.     NOP
  1097. CRTC_NotJustScroll:
  1098.     TEST    sFree,16
  1099.     JZ      CRTC_DontInitScroff
  1100.     CALL    InitScroff
  1101. CRTC_DontInitScroff:
  1102.     TEST    sFree,1
  1103.     JZ      CRTC_DontGenScrAdConv
  1104.     CALL    GenScrAdConv
  1105. CRTC_DontGenScrAdConv:
  1106.     TEST    sFree,2
  1107.     JZ      CRTC_DontClearCRTCDBuf
  1108.     CALL    ClearCRTCDBuf
  1109. CRTC_DontClearCRTCDBuf:
  1110.     TEST    sFree,8
  1111.     JZ      CRTC_DontSetPCsCRTC
  1112.     CALL    SetPCsCRTC
  1113. CRTC_DontSetPCsCRTC:
  1114.     TEST    sFree,64
  1115.     JZ      CRTC_NoNewBaseAddr
  1116.     CALL    SetNewScrBase
  1117. CRTC_NoNewBaseAddr:
  1118.     TEST    sFree,128
  1119.     JZ      CRTC_DontGenByteMode
  1120.     MOV     [modeinprogr],1
  1121.     CALL    GenByteMode
  1122. CRTC_DontGenByteMode:
  1123.     TEST    sFree,4
  1124.     JZ      CRTC_DontRedraw
  1125.     MOV     [modeinprogr],1
  1126.     CALL    RedrawScreen
  1127. CRTC_DontRedraw:
  1128. CRTC_Rethought:
  1129.     CMP     [modeinprogr],0
  1130.     JE      CRTC_RTEnd
  1131.     MOV     [modeinprogr],0
  1132.  ;       AND     [intflag],0bfffh
  1133. CRTC_RTEnd:
  1134.     POP     BP
  1135.     POP     AX
  1136.     POP     sFree
  1137.     RET
  1138.  
  1139. JustScrollIt:
  1140.     MOV     AX,[oldscroff]
  1141.     MOVZX   BP,[crtcscrwidth]
  1142.     ADD     BP,BP
  1143.     CMP     AX,BP
  1144.     JE      JSIT_scrollup
  1145.     CMP     AX,2
  1146.     JE      JSIT_scrolllf
  1147.     CMP     AX,7feh
  1148.     JE      JSIT_scrollrt
  1149.     NEG     AX
  1150.     AND     AX,7feh
  1151.     CMP     AX,BP
  1152.     JE      JSIT_scrolldn
  1153.     JMP     JSIT_NotJustScroll
  1154. JSIT_scrollup:
  1155.     CALL    GenScrAdConv
  1156.     CALL    ClearCRTCDBuf
  1157.     CALL    ScrollUp
  1158.     JMP     JSIT_Rethought
  1159. JSIT_scrolldn:
  1160.     CALL    GenScrAdConv
  1161.     CALL    ClearCRTCDBuf
  1162.     CALL    ScrollDn
  1163.     JMP     JSIT_Rethought
  1164. JSIT_scrollrt:
  1165.     CALL    GenScrAdConv
  1166.     CALL    ClearCRTCDBuf
  1167.     CALL    ScrollLf        ; Ich krieg's nie richtig hin!
  1168.     JMP     JSIT_Rethought
  1169. JSIT_scrolllf:
  1170.     CALL    GenScrAdConv
  1171.     CALL    ClearCRTCDBuf
  1172.     CALL    ScrollRt
  1173. JSIT_Rethought:
  1174.     XOR     sFree,sFree
  1175.     JMP     JSIT_Ret
  1176. JSIT_NotJustScroll:
  1177.     AND     sfree,7fffh
  1178. JSIT_Ret:
  1179.     RET
  1180.  
  1181. ScrollLf:
  1182.     PUSHAW
  1183.     PUSH    DS
  1184.     PUSH    ES
  1185.     CMP     [useVGAroll],0
  1186.     JE      SCLF_Conventional
  1187.     ADD     [vgascroll],2
  1188.     CALL    SetNewScrBase
  1189.     JMP     SCLF_blitted
  1190. SCLF_Conventional:
  1191.     MOVZX   AX,[BYTE PTR CRTCRegs+9]
  1192.     INC     AX
  1193.     MOVZX   CX,[crtcscrwidth]
  1194.     ADD     CX,CX
  1195.     MUL     CX
  1196.     MOVZX   CX,[crtcscrheight]
  1197.     MUL     CX
  1198.     MOV     CX,AX
  1199.     SUB     CX,2
  1200.  
  1201.     MOV     DI,[scrbase]
  1202.     SHR     DI,14
  1203.     MOV     DI,[EDI*2+crtcvgaoff]
  1204.     ADD     DI,[vgascroll]
  1205.     MOV     SI,DI
  1206.     ADD     SI,2
  1207.  
  1208.     MOV     AX,0A000h
  1209.     MOV     DS,AX
  1210.     MOV     ES,AX
  1211.  
  1212.     REP     MOVSB
  1213. SCLF_blitted:
  1214.     PUSH    SS
  1215.     POP     DS
  1216.  
  1217.     POP     ES
  1218.     PUSH    ES
  1219.  
  1220.     PUSH    GS
  1221.     MOV     DI,ES
  1222.     MOV     AX,[scrbase]
  1223.     SHR     AX,4
  1224.     ADD     DI,AX
  1225.     MOV     GS,DI                   ; GS: Rambase
  1226.  
  1227.     MOVZX   CX,[BYTE PTR CRTCRegs+9]; CX: Loop1 (8 lines/char)
  1228.     INC     CX
  1229.     MOV     AX,[scrbase]
  1230.     SHR     AX,14
  1231.     MOV     BP,[EAX*2+crtcvgaoff]   ; BP: Vgaoffset
  1232.     ADD     BP,[vgascroll]
  1233.     LES     BX,[scradd]             ; ES: BX = A000:FD00
  1234.     ADD     BH,[videomode]
  1235.     MOV     DI,SEG ScrAdConv
  1236.     MOV     FS,DI                   ; FS: ScrAdConv
  1237.     MOV     SI,[scroff]
  1238.     MOVZX   DI,[crtcscrwidth]
  1239.     ADD     SI,DI
  1240.     ADD     SI,DI
  1241.     SUB     SI,2
  1242.     AND     SI,7ffh                 ; SI: CPC addr
  1243. SLF_Loop1:
  1244.     PUSH    SI
  1245.     PUSH    CX
  1246.     MOVZX   CX,[crtcscrheight]
  1247. SLF_Loop2:
  1248.     MOV     DI,[FS:ESI*2+ScrAdConv]
  1249.     MOV     AL,[GS:SI]
  1250.     XLAT    [ES:0]
  1251.     ADD     DI,BP
  1252.     MOV     [ES:DI],AL
  1253.  
  1254.     MOV     DI,[FS:ESI*2+ScrAdConv+2]
  1255.     MOV     AL,[GS:SI+1]
  1256.     XLAT    [ES:0]
  1257.     ADD     DI,BP
  1258.     MOV     [ES:DI],AL
  1259.  
  1260.     MOVZX   AX,[crtcscrwidth]
  1261.     ADD     AX,AX
  1262.     MOV     DI,SI
  1263.     ADD     SI,AX
  1264.     AND     SI,7ffh
  1265.     AND     DI,3800h
  1266.     ADD     SI,DI
  1267.  
  1268.     LOOP    SLF_Loop2
  1269.     POP     CX
  1270.     POP     SI
  1271.     ADD     SI,800h
  1272.     AND     SI,3fffh
  1273.     LOOP    SLF_Loop1
  1274.     POP     GS
  1275. SCLF_End:
  1276.     POP     ES
  1277.     POP     DS
  1278.     POPAW
  1279.     RET
  1280.  
  1281. ScrollRt:
  1282.     PUSHAW
  1283.     PUSH    DS
  1284.     PUSH    ES
  1285.     CMP     [useVGAroll],0
  1286.     JE      SCRT_Conventional
  1287.     SUB     [vgascroll],2
  1288.     CALL    SetNewScrBase
  1289.     JMP     SCRT_blitted
  1290. SCRT_Conventional:
  1291.     MOVZX   AX,[BYTE PTR CRTCRegs+9]
  1292.     INC     AX
  1293.     MOVZX   CX,[crtcscrwidth]
  1294.     ADD     CX,CX
  1295.     MUL     CX
  1296.     MOVZX   CX,[crtcscrheight]
  1297.     MUL     CX
  1298.     MOV     CX,AX
  1299.     SUB     CX,2
  1300.     MOV     SI,CX
  1301.  
  1302.     MOV     DI,[scrbase]
  1303.     SHR     DI,14
  1304.     MOV     DI,[EDI*2+crtcvgaoff]
  1305.     ADD     DI,[vgascroll]
  1306.     ADD     SI,DI
  1307.     MOV     DX,DI
  1308.     ADD     DI,AX
  1309.     DEC     DI
  1310.     DEC     SI
  1311.  
  1312.     MOV     AX,0A000h
  1313.     MOV     DS,AX
  1314.     MOV     ES,AX
  1315.  
  1316.     STD
  1317.     REP     MOVSB
  1318.     CLD
  1319. SCRT_blitted:
  1320.     MOV     AX,DGROUP
  1321.     MOV     DS,AX
  1322.     POP     ES
  1323.     PUSH    ES
  1324.  
  1325.     PUSH    GS
  1326.     MOV     DI,ES
  1327.     MOV     AX,[scrbase]
  1328.     SHR     AX,4
  1329.     ADD     DI,AX
  1330.     MOV     GS,DI                   ; GS: Rambase
  1331.  
  1332.     MOVZX   CX,[BYTE PTR CRTCRegs+9]; CX: Loop1 (8 lines/char)
  1333.     INC     CX
  1334.     MOV     AX,[scrbase]
  1335.     SHR     AX,14
  1336.     MOV     BP,[EAX*2+crtcvgaoff]   ; BP: Vgaoffset
  1337.     ADD     BP,[vgascroll]
  1338.     LES     BX,[scradd]             ; ES: BX = A000:FD00
  1339.     ADD     BH,[videomode]
  1340.     MOV     DI,SEG ScrAdConv
  1341.     MOV     FS,DI                   ; FS: ScrAdConv
  1342.     MOV     SI,[scroff]             ; SI: CPC addr
  1343. SRT_Loop1:
  1344.     PUSH    SI
  1345.     PUSH    CX
  1346.     MOVZX   CX,[crtcscrheight]
  1347. SRT_Loop2:
  1348.     MOV     DI,[FS:ESI*2+ScrAdConv]
  1349.     MOV     AL,[GS:SI]
  1350.     XLAT    [ES:0]
  1351.     ADD     DI,BP
  1352.     MOV     [ES:DI],AL
  1353.     MOV     DI,[FS:ESI*2+ScrAdConv+2]
  1354.     MOV     AL,[GS:SI+1]
  1355.     XLAT    [ES:0]
  1356.     ADD     DI,BP
  1357.     MOV     [ES:DI],AL
  1358.  
  1359.     MOVZX   AX,[crtcscrwidth]
  1360.     ADD     AX,AX
  1361.     MOV     DI,SI
  1362.     ADD     SI,AX
  1363.     AND     SI,7ffh
  1364.     AND     DI,3800h
  1365.     ADD     SI,DI
  1366.  
  1367.     LOOP    SRT_Loop2
  1368.     POP     CX
  1369.     POP     SI
  1370.     ADD     SI,800h
  1371.     AND     SI,3fffh
  1372.     LOOP    SRT_Loop1
  1373.     POP     GS
  1374. SCRT_End:
  1375.     POP     ES
  1376.     POP     DS
  1377.     POPAW
  1378.     RET
  1379.  
  1380. ScrollDn:
  1381.     CMP     [useVGAroll],0
  1382.     JE      SCDN_Conventional
  1383.     PUSHAW
  1384.     MOVZX   AX,[BYTE PTR CRTCRegs+9]
  1385.     INC     AX
  1386.     MOVZX   CX,[crtcscrwidth]
  1387.     ADD     CX,CX
  1388.     MUL     CX
  1389.     ADD     [vgascroll],AX
  1390.  
  1391.     CALL    SetNewScrBase
  1392.     MOV     CX,AX
  1393.     MOV     SI,[scrbase]
  1394.     SHR     SI,14
  1395.     MOV     SI,[ESI*2+crtcvgaoff]
  1396.     ADD     SI,[vgascroll]
  1397.     MOVZX   BX,[crtcscrheight]
  1398.     DEC     BX
  1399.     MUL     BX
  1400.     ADD     SI,AX
  1401.     MOV     DX,SI
  1402.     ADD     DX,CX
  1403.     PUSH    DS
  1404.     PUSH    ES
  1405.     CALL    RedrawScreenPart
  1406.     POP     ES
  1407.     POP     DS
  1408.     POPAW
  1409.     RET
  1410. SCDN_Conventional:
  1411.     PUSHAW
  1412.     PUSH    DS
  1413.     POP     FS
  1414.     PUSH    DS
  1415.     PUSH    ES
  1416.     MOVZX   AX,[BYTE PTR CRTCRegs+9]
  1417.     INC     AX
  1418.     MOVZX   CX,[crtcscrwidth]
  1419.     ADD     CX,CX
  1420.     MUL     CX
  1421.     MOV     BX,AX                   ; BX: character line length (VGA)
  1422.     MOVZX   CX,[crtcscrheight]
  1423.     MUL     CX
  1424.     SUB     AX,BX
  1425.     MOV     CX,AX
  1426.     MOV     SI,BX
  1427.  
  1428.     MOV     DI,[scrbase]
  1429.     SHR     DI,14
  1430.     MOV     DI,[EDI*2+crtcvgaoff]
  1431.     ADD     DI,[vgascroll]
  1432.     ADD     SI,DI
  1433.  
  1434.     MOV     AX,0A000h
  1435.     MOV     DS,AX
  1436.     MOV     ES,AX
  1437.  
  1438.     REP     MOVSB
  1439.     MOV     DX,SI
  1440.     MOV     SI,DI
  1441.  
  1442.     MOV     AX,DGROUP
  1443.     MOV     DS,AX
  1444.     POP     ES
  1445.     PUSH    ES
  1446.     CALL    RedrawScreenPart
  1447.  
  1448.     POP     ES
  1449.     POP     DS
  1450.     POPAW
  1451.     RET
  1452.  
  1453. ScrollUp:
  1454.     CMP     [useVGAroll],0
  1455.     JE      SCUP_Conventional
  1456.     PUSHAW
  1457.     MOVZX   AX,[BYTE PTR CRTCRegs+9]
  1458.     INC     AX
  1459.     MOVZX   CX,[crtcscrwidth]
  1460.     ADD     CX,CX
  1461.     MUL     CX
  1462.     SUB     [vgascroll],AX
  1463.  
  1464.     CALL    SetNewScrBase
  1465.     MOV     SI,[scrbase]
  1466.     SHR     SI,14
  1467.     MOV     SI,[ESI*2+crtcvgaoff]
  1468.     ADD     SI,[vgascroll]
  1469.     MOV     DX,SI
  1470.     ADD     DX,AX
  1471.     PUSH    DS
  1472.     PUSH    ES
  1473.     CALL    RedrawScreenPart
  1474.     POP     ES
  1475.     POP     DS
  1476.     POPAW
  1477.     RET
  1478. SCUP_Conventional:
  1479.     PUSHAW
  1480.     PUSH    DS
  1481.     POP     FS
  1482.     PUSH    DS
  1483.     PUSH    ES
  1484.     MOVZX   AX,[BYTE PTR CRTCRegs+9]
  1485.     INC     AX
  1486.     MOVZX   CX,[crtcscrwidth]
  1487.     ADD     CX,CX
  1488.     MUL     CX
  1489.     MOV     BX,AX                   ; bx one character line height
  1490.     MOVZX   CX,[crtcscrheight]
  1491.     MUL     CX
  1492.  
  1493.     MOV     SI,AX
  1494.     DEC     SI
  1495.     SUB     SI,BX
  1496.     MOV     CX,AX
  1497.     SUB     CX,BX
  1498.  
  1499.     MOV     DI,[scrbase]
  1500.     SHR     DI,14
  1501.     MOV     DI,[EDI*2+crtcvgaoff]
  1502.     ADD     DI,[vgascroll]
  1503.     PUSH    DI
  1504.     ADD     SI,DI
  1505.     ADD     DI,AX
  1506.     DEC     DI
  1507.  
  1508.     MOV     AX,0A000h
  1509.     MOV     DS,AX
  1510.     MOV     ES,AX
  1511.  
  1512.     STD
  1513.     REP     MOVSB
  1514.     CLD
  1515.     POP     SI
  1516.     MOV     DX,SI
  1517.     ADD     DX,BX
  1518.  
  1519.     MOV     AX,DGROUP
  1520.     MOV     DS,AX
  1521.     POP     ES
  1522.     PUSH    ES
  1523.     CALL    RedrawScreenPart
  1524.  
  1525.     POP     ES
  1526.     POP     DS
  1527.     POPAW
  1528.     RET
  1529.  
  1530. RedrawScreenPart:                       ; in: SI VGA start off to be redrawn
  1531.     MOV     BP,SEG ScrAdList        ;     DX end offset to be redrawn
  1532.     MOV     FS,BP
  1533.     SUB     SI,[vgascroll]
  1534.     MOV     BP,ES
  1535.     MOV     DI,[scrbase]
  1536.     SHR     DI,4
  1537.     ADD     BP,DI
  1538.     LES     BX,[scradd]
  1539.     ADD     BH,[videomode]
  1540.     MOV     DI,[scrbase]
  1541.     SHR     DI,14
  1542.     MOV     DI,[EDI*2+crtcvgaoff]
  1543.     MOV     DS,BP
  1544.     MOV     BP,OFFSET ScrAdList
  1545. RDSP_SeekListPosition:
  1546.     MOV     AX,[FS:BP+2]
  1547.     ADD     BP,4
  1548.     ADD     DI,AX
  1549.     CMP     DI,SI
  1550.     JC      RDSP_SeekListPosition
  1551.     SUB     DI,AX
  1552.     MOV     CX,DI
  1553.     SUB     BP,4
  1554.     ADD     DI,[SS:vgascroll]
  1555.     SUB     DX,[SS:vgascroll]
  1556.  
  1557. RDSP_Loop:
  1558.     CMP     CX,DX
  1559.     JNC     RDSP_End
  1560.     MOV     SI,[FS:BP]
  1561.     MOV     AX,[FS:BP+2]
  1562.     ADD     CX,AX
  1563.     ADD     AX,AX
  1564.     ADD     AX,AX                   ; LODSB /XLAT ES/STOSB = 4 bytes
  1565.     NEG     AX
  1566.     ADD     BP,4
  1567.     ADD     AX,OFFSET RDSP_ULZero
  1568.     JMP     AX
  1569.  
  1570. RDSP_End:
  1571.     RET
  1572.  
  1573. RDSP_UnfoldedLoop:
  1574.     argh5
  1575.     argh5
  1576.     argh5
  1577.     argh5
  1578.     argh5
  1579.     argh5
  1580.     argh5
  1581.     argh5
  1582.     argh5
  1583.     argh5
  1584.     argh5
  1585.     argh5
  1586.     argh5
  1587.     argh5
  1588.     argh5
  1589.     argh5
  1590.     argh5
  1591.     argh5
  1592.     argh5
  1593.     argh5
  1594.     argh5
  1595.     argh5
  1596.     argh5
  1597.     argh5
  1598.     argh5
  1599.     argh5
  1600.     argh5
  1601.     argh5
  1602.     argh5
  1603.     argh5
  1604.     argh5
  1605.     argh5
  1606.     argh1
  1607. RDSP_ULByteCnt:
  1608.     argh1
  1609. RDSP_ULZero:
  1610.     JMP     RDSP_Loop
  1611.  
  1612. InitScroff:
  1613.     MOV     [crtccareful],0
  1614.     PUSHAD
  1615.     MOV     BX,SEG Scrofftab         ; BX       = ScrOffTab (A0)
  1616.     MOV     FS,BX
  1617.     MOV     BX,OFFSET Scrofftab      ; CH outer = D7 (7)
  1618.     MOV     CH,[BYTE PTR CRTCregs+9]
  1619.     INC     CH
  1620.     MOV     AX,0       ; line offset ; AX outer = D0
  1621.     CMP     [BYTE PTR CRTCregs+1],0
  1622.     JE      ISC_AllNull
  1623. ISC_Loop1:
  1624.     MOV     DX,AX                    ; DX       = D1
  1625.     MOV     CL,[BYTE PTR CRTCregs+6]                    ; CL outer = D6 (24)
  1626.     MOV     SI,2048                  ; SI       = D4 (2048)
  1627.     CMP     CL,0
  1628.     JNE     ISC_Loop2
  1629.     MOV     CL,1
  1630. ISC_Loop2:
  1631.     PUSH    CX
  1632.     MOVZX   BP,[BYTE PTR CRTCregs+1]
  1633.     ADD     BP,BP
  1634.     SUB     SI,BP
  1635.     JNC     ISC_NoCarryInSI
  1636.     NEG     SI
  1637.     SUB     BP,SI
  1638.     XOR     SI,SI
  1639.     MOV     [crtccareful],1
  1640. ISC_NoCarryInSI:
  1641.     OR      BP,BP
  1642.     JZ      ISC_BPIsZero
  1643.     MOV     CX,DX                    ; CX       = D2
  1644. ISC_Loop3:
  1645.     CMP     CX,32000
  1646.     JC      ISC_CX_OK
  1647.     MOV     [WORD PTR FS:BX],32768
  1648.     JMP     ISC_CX_CONT
  1649. ISC_CX_OK:
  1650.     CMP     BX,32768
  1651.     JNC     ISC_OopsRet
  1652.     MOV     [FS:BX],CX
  1653. ISC_CX_CONT:
  1654.     ADD     BX,2
  1655.     INC     CX
  1656.     DEC     BP
  1657.     JNE     ISC_Loop3
  1658. ISC_BPIsZero:
  1659.     MOVZX   CX,[BYTE PTR CRTCregs+9]
  1660.     INC     CX
  1661.     PUSH    AX
  1662.     MOVZX   AX,[crtcscrwidth]
  1663.     ADD     AX,AX
  1664. ISC_IncDXLoop:
  1665.     ADD     DX,AX
  1666.     LOOP    ISC_IncDXLoop
  1667.     POP     AX
  1668.     POP     CX
  1669.     DEC     CL
  1670.     JNE     ISC_Loop2
  1671.     OR      SI,SI
  1672.     JZ      ISC_invisiOK
  1673.     JS      ISC_invisiOK
  1674. ISC_Loop4:
  1675.     CMP     BX,32768
  1676.     JNC     ISC_OopsRet2
  1677.     MOV     [WORD PTR FS:BX],32768 ; invisible bytes
  1678.     ADD     BX,2
  1679.     DEC     SI
  1680.     JNE     ISC_Loop4
  1681. ISC_invisiOK:
  1682.     PUSH    CX
  1683.     MOVZX   CX,[crtcscrwidth]
  1684.     ADD     AX,CX
  1685.     ADD     AX,CX
  1686.     POP     CX
  1687.     DEC     CH
  1688.     JNE     ISC_Loop1
  1689. ISC_Loop5:
  1690.     CMP     BX,32768
  1691.     JNC     ISC_Ret
  1692.     MOV     [WORD PTR FS:BX],32768 ; invisible bytes
  1693.     ADD     BX,2
  1694.     JMP     ISC_Loop5
  1695. ISC_OopsRet:
  1696.     POP     CX
  1697. ISC_Ret:
  1698.     POPAD
  1699.     CALL    GenScrAdConv
  1700.     RET
  1701.  
  1702. ISC_OopsRet2:
  1703.     JMP     ISC_Ret
  1704.     RET
  1705.  
  1706. ISC_AllNull:
  1707.     MOV     [WORD PTR FS:BX],32768
  1708.     INC     BX
  1709.     INC     BX
  1710.     INC     AX
  1711.     CMP     AX,16384
  1712.     JNE     ISC_AllNull
  1713.     POPAD
  1714.     CALL    GenScrAdConv
  1715.     RET
  1716.  
  1717. GenScrAdConv:
  1718.     PUSHAW
  1719.     PUSH    ES
  1720.     PUSH    DS
  1721.     MOV     AX,[scroff]
  1722.     NEG     AX
  1723.     AND     AX,07feh
  1724.     MOV     BX,AX
  1725.     ADD     BX,BX
  1726.     SHR     AX,1
  1727.     PUSH    SEG ScroffTab
  1728.     POP     DS
  1729.     PUSH    SEG ScrAdConv
  1730.     POP     ES
  1731.     MOV     CX,8
  1732.     MOV     SI,OFFSET ScroffTab
  1733.     MOV     DI,OFFSET ScrAdConv
  1734. GSAC_LoopA:
  1735.     PUSH    CX
  1736.     PUSH    SI
  1737.     PUSH    SI
  1738.     ADD     SI,BX
  1739.     MOV     CX,400h
  1740.     SUB     CX,AX
  1741.     REP     MOVSD
  1742.     POP     SI
  1743.     MOV     CX,AX
  1744.     REP     MOVSD
  1745.     POP     SI
  1746.     ADD     SI,1000h
  1747.     POP     CX
  1748.     LOOP    GSAC_LoopA
  1749.  
  1750.     MOV     CX,DGROUP
  1751.     MOV     DS,CX
  1752.     MOV     CX,SEG ScrAdList
  1753.     MOV     ES,CX
  1754.     MOV     DI,OFFSET ScrAdList
  1755.  
  1756.     MOV     SI,[scroff]             ; offset
  1757.     MOVZX   DX,[crtcscrwidth]
  1758.     ADD     DX,DX
  1759.     CMP     DX,0
  1760.     JE      GSAC_End
  1761.     MOVZX   BP,[crtcscrheight]
  1762.     MOV     CX,BP
  1763.     CMP     CX,0
  1764.     JE      GSAC_End
  1765.     MOV     BL,[BYTE PTR CRTCregs+9]
  1766. GSAC_CalcLines:
  1767.     ADD     CX,BP
  1768.     DEC     BL
  1769.     JNE     GSAC_CalcLines
  1770.  
  1771.     MOV     BX,0                    ; char scan line
  1772.     MOV     BP,0                    ; char line offs
  1773.  
  1774. GSAC_Loop2:
  1775.     MOV     AX,SI
  1776.     ADD     AX,BP
  1777.     STOSW
  1778.     MOV     AX,800h
  1779.     SUB     AX,SI
  1780.     CMP     AX,DX
  1781.     JNC     GSAC_NoCarry
  1782.     STOSW
  1783.     NEG     AX
  1784.     ADD     AX,DX
  1785.     XCHG    AX,BP
  1786.     STOSW
  1787.     XCHG    AX,BP
  1788.     STOSW
  1789.     JMP     GSAC_FinishLine
  1790. GSAC_NoCarry:
  1791.     MOV     AX,DX
  1792.     STOSW
  1793. GSAC_FinishLine:
  1794.     CMP     BL,[BYTE PTR CRTCregs+9]
  1795.     JE      GSAC_NewRasterChar
  1796.     INC     BX
  1797.     ADD     BP,800h
  1798.     JMP     GSAC_Loop2End
  1799. GSAC_NewRasterChar:
  1800.     ADD     SI,DX
  1801.     AND     SI,7feh
  1802.     XOR     BX,BX
  1803.     XOR     BP,BP
  1804. GSAC_Loop2End:
  1805.     LOOP    GSAC_Loop2
  1806. GSAC_End:
  1807.  
  1808.     MOV     [DWORD PTR ES:DI],0ffffffffh
  1809.     CMP     [crtccareful],1
  1810.     JNE     GSAC_Ret
  1811.     MOV     DI,OFFSET ScrAdList+2
  1812.     MOV     DX,0
  1813.     MOV     CX,4
  1814. GSAC_CarefulLoop:
  1815.     MOV     AX,[ES:DI]
  1816.     OR      AX,AX
  1817.     JS      GSAC_CarefulEnd
  1818.     ADD     DX,AX
  1819.     CMP     DX,4000h
  1820.     JNC     GSAC_CarefulEnd
  1821.     ADD     DI,CX
  1822.     JMP     GSAC_CarefulLoop
  1823. GSAC_CarefulEnd:
  1824.     SUB     DI,2
  1825.     MOV     [DWORD PTR ES:DI],0ffffffffh
  1826. GSAC_Ret:
  1827.     POP     DS
  1828.     POP     ES
  1829.     POPAW
  1830.     RET
  1831.  
  1832. GenByteMode:
  1833.     CMP     [multimodeon],0
  1834.     JNE     GBYM_NotSoSimple
  1835.     PUSHAW
  1836.     PUSH    ES
  1837.     PUSH    SEG ByteMode
  1838.     POP     ES
  1839.     MOV     DI,OFFSET ByteMode
  1840.     MOV     CX,2000h
  1841.     XOR     EAX,EAX
  1842.     MOV     AH,[videomode]
  1843.     ROL     EAX,16
  1844.     MOV     AH,[videomode]
  1845.     REP     STOSD
  1846.     XOR     EAX,EAX
  1847.     POP     ES
  1848.     POPAW
  1849.     RET
  1850. GBYM_NotSoSimple:
  1851.     CMP     [crtcscrwidth],0
  1852.     JE      GBYM_Ret
  1853.     CMP     [crtcscrheight],0
  1854.     JE      GBYM_Ret
  1855.     PUSHAW
  1856.     PUSH    ES
  1857.     MOV     DH,[BYTE PTR CRTCregs+9]
  1858.     INC     DH                        ; DH = MaxScanLine
  1859.     MOV     AL,[crtcscrheight]
  1860.     MUL     DH
  1861.     MOV     SI,AX                     ; SI = screen height
  1862.     MOVZX   AX,[BYTE PTR CRTCregs+4]
  1863.     SUB     AL,[BYTE PTR CRTCregs+7]
  1864.     MUL     DH
  1865.     MOV     BX,AX
  1866.     MOVZX   AX,[BYTE PTR CRTCregs+5]
  1867.     AND     AX,1fh
  1868.     ADD     BX,AX                     ; BX = first line in scrmem
  1869.     ADD     BX,5
  1870.     MOV     DL,52
  1871.     MOV     DI,OFFSET ByteMode+7ffeh
  1872.     PUSH    SEG ByteMode
  1873.     POP     ES
  1874.     MOV     CX,3fffh
  1875.     MOV     SI,[scroff]
  1876.     STD
  1877. GBYM_Loop:
  1878.     MOV     AX,CX
  1879.     SUB     AX,SI
  1880.     AND     AX,07feh
  1881.     PUSH    DX
  1882.     MOV     DL,[crtcscrwidth]
  1883.     ADD     DL,DL
  1884.     DIV     DL
  1885.     POP     DX
  1886.     MUL     DH
  1887.  
  1888.     MOV     BP,CX
  1889.     SHR     BP,11
  1890.     ADD     AX,BP
  1891.     ADD     AX,BX
  1892.     DIV     DL
  1893.     XOR     AH,AH
  1894.     MOV     AH,[EAX+OFFSET modezones]
  1895.     XOR     AL,AL
  1896.     STOSW
  1897.     DEC     CX
  1898.     JNS     GBYM_Loop
  1899.     CLD
  1900.     POP     ES
  1901.     POPAW
  1902. GBYM_Ret:
  1903.     RET
  1904.  
  1905. outp:   BT      AX,14
  1906.     JC      OUT_noCRTC
  1907.     BT      AX,9
  1908.     JC      OUT_End
  1909.     BT      AX,8
  1910.     JC      OUT_CRTC_wr
  1911.     CALL    outCRTCreg
  1912.     JMP     OUT_End
  1913. OUT_CRTC_wr:
  1914.     CALL    outCRTCwr
  1915.     JMP     OUT_End
  1916. OUT_noCRTC:
  1917.  
  1918.     BT      AX,11
  1919.     JC      OUT_noPIO
  1920.     PUSH    AX
  1921.     AND     AH,3
  1922.     CMP     AH,0
  1923.     JNE     OUT_NotPIOa
  1924.     CALL    out8255a
  1925.     JMP     OUT_PIOend
  1926. OUT_NotPIOa:
  1927.     CMP     AH,1
  1928.     JNE     OUT_NotPIOb
  1929.     CALL    out8255b
  1930.     JMP     OUT_PIOend
  1931. OUT_NotPIOb:
  1932.     CMP     AH,2
  1933.     JNE     OUT_NotPIOc
  1934.     CALL    out8255c
  1935.     JMP     OUT_PIOend
  1936. OUT_NotPIOc:
  1937.     CALL    out8255control
  1938. OUT_PIOEnd:
  1939.     POP     AX
  1940.         JMP     OUT_noGary
  1941. OUT_noPIO:
  1942.  
  1943.     BT      AX,15
  1944.     JC      OUT_noGary
  1945.     PUSH    AX
  1946.     CALL    outga
  1947.     POP     AX
  1948. OUT_noGary:
  1949.  
  1950.     BT      AX,10
  1951.     JC      OUT_noDiskStuff
  1952.     PUSH    AX
  1953.     BT      AX,8
  1954.     JC      OUT_Disk_cmd
  1955.     CALL    outFA
  1956.     JMP     OUT_Disk_End
  1957. OUT_Disk_Cmd:
  1958.     CALL    outFB
  1959. OUT_Disk_End:
  1960.     POP     AX
  1961. OUT_NoDiskStuff:
  1962.  
  1963.     BT      AX,13
  1964.     JC      OUT_noROMnum
  1965.     PUSH    AX
  1966.     CALL    outROMnum
  1967.     POP     AX
  1968. OUT_noROMnum:
  1969.     BT      AX,12
  1970.     JC      OUT_noprinter
  1971.     PUSH    AX
  1972.     CALL    outPrinter
  1973.     POP     AX
  1974. OUT_noprinter:
  1975. OUT_end:
  1976.     RET
  1977.  
  1978. outROMnum:
  1979.     MOV     AH,0
  1980.     CMP     AX,[romnum]
  1981.     JE      outROM_old
  1982.     MOV     [romnum],AX
  1983.     CALL    RethinkMemMap
  1984. outROM_old:
  1985.     RET
  1986.  
  1987. outCRTCreg:
  1988.     MOV     [CRTCregnum],AL
  1989.     RET
  1990.  
  1991. outCRTCwr:
  1992.     MOVZX   BP,[BYTE PTR CRTCregnum]
  1993.     MOV     [BYTE PTR BP+CRTCregs],AL
  1994.     CMP     BP,1
  1995.     JE      CRTC_NewWidth
  1996.     CMP     BP,6
  1997.     JE      CRTC_NewHeight
  1998.     CMP     BP,7
  1999.     JE      CRTC_NewSyncPos
  2000.     CMP     BP,9
  2001.     JE      CRTC_NewMaxSLin
  2002.     CMP     BP,12
  2003.     JC      CRTC_nonewparms
  2004.     CMP     BP,14
  2005.     JNC     CRTC_nonewparms
  2006.     MOV     BP,[CRTCregs+12]
  2007.     ROL     BP,8
  2008.     ADD     BP,BP
  2009.     MOV     AX,BP
  2010.     ADD     BP,BP
  2011.     AND     AX,7FEh
  2012.     AND     BP,0C000h
  2013.  
  2014.     CMP     AX,[scroff]
  2015.     JNE     CRTC_setintcount
  2016.     CMP     BP,[scrbase]
  2017.     JE      CRTC_nonewparms
  2018.     JMP     CRTC_setintcount
  2019. CRTC_NewHeight:
  2020.     CMP     AL,[crtcscrheight]
  2021.     JE      CRTC_nonewparms
  2022.     JMP     CRTC_setintcount
  2023.  
  2024. CRTC_NewWidth:
  2025.     CMP     AL,[crtcscrwidth]
  2026.     JE      CRTC_nonewparms
  2027.     JMP     CRTC_setintcount
  2028. CRTC_setintcount:
  2029.     MOV     [ReDrawCount],20
  2030.     OR      [intflag],1
  2031. CRTC_nonewparms:
  2032.     RET
  2033. CRTC_NewSyncPos:
  2034.     CMP     [crtcsyncpos],AL
  2035.     JE      CRTC_nonewparms
  2036.     MOV     [crtcsyncpos],AL
  2037.     MOV     [ReDrawCount],20
  2038.     OR      [intflag],1
  2039.     MOV     [spcrtcflag],1
  2040.     RET
  2041. CRTC_NewMaxSLin:
  2042.     CMP     [crtcmaxslin],AL
  2043.     JE      CRTC_nonewparms
  2044.     MOV     [crtcmaxslin],AL
  2045.     MOV     [ReDrawCount],20
  2046.     OR      [intflag],1
  2047.     MOV     [spcrtcflag],2
  2048.     RET
  2049.  
  2050. out8255a:
  2051.     BT      [WORD PTR control8255],4
  2052.     JC      o8255aend
  2053.     MOV     [port8255a],AL
  2054.     MOV     sFree,[WORD PTR port8255c]
  2055.     SHR     sFree,6
  2056.     AND     sFree,3
  2057.     JE      inactivepsg
  2058.     CMP     sFree,3
  2059.     JE      latchpsg
  2060.     CMP     sFree,2
  2061.     JE      writepsg
  2062. o8255aend:
  2063.     RET
  2064.  
  2065. out8255b:
  2066.     MOV     [port8255b],AL
  2067.     RET
  2068.  
  2069. out8255c:
  2070.     PUSH    DX
  2071.     PUSH    AX
  2072.     XOR     DL,DL
  2073.     BT      [WORD PTR control8255],0
  2074.     JC      o8255clin
  2075.     OR      DL,15
  2076. o8255clin:
  2077.     BT      [WORD PTR control8255],3
  2078.     JC      o8255chin
  2079.     OR      DL,240
  2080. o8255chin:
  2081.     OR      [port8255c],DL
  2082.     XOR     [port8255c],DL
  2083.     AND     AL,DL
  2084.     OR      [port8255c],AL
  2085.     MOV     AH,AL
  2086.     SHR     AH,4
  2087.     AND     AH,2
  2088.     MOV     BP,DX
  2089.     CLI
  2090.     MOV     DX,61h
  2091.     IN      AL,DX
  2092.     AND     AL,0fch
  2093.     OR      AL,AH
  2094.     OUT     DX,AL
  2095.     STI
  2096.  
  2097.     POP     AX
  2098.     POP     DX
  2099.     AND     BP,0C0h
  2100.     JZ      inactivepsg
  2101.     MOV     sFree,AX
  2102.     SHR     sFree,6
  2103.     AND     sFree,3
  2104.     JE      inactivepsg
  2105.     CMP     sFree,3
  2106.     JE      latchpsg
  2107.     CMP     sFree,2
  2108.     JE      writepsg
  2109.     RET
  2110.  
  2111. out8255control:
  2112.     BT      AX,7
  2113.     JNC     out8255control_SF
  2114.     MOV     [control8255],AL
  2115.     CALL    UpdatePIOA
  2116.     CALL    UpdatePIOC
  2117.     RET
  2118. out8255control_SF:
  2119.     BT      AX,0
  2120.     JC      o8255cSFset
  2121.     PUSH    AX
  2122.     SHR     AL,1
  2123.     AND     AX,7
  2124.     MOV     BP,AX                     ; is it in output mode?
  2125.     AND     BP,4
  2126.     SHR     BP,1
  2127.     BT      [WORD PTR control8255],BP
  2128.     JNC     o8255cSFnores
  2129.     BTR     [WORD PTR port8255c],AX
  2130.     MOV     AL,[port8255c]
  2131.     CALL    out8255c
  2132. o8255cSFnores:
  2133.     POP     AX
  2134.     RET
  2135. o8255cSFset:
  2136.     PUSH    AX
  2137.     SHR     AL,1
  2138.     AND     AX,7
  2139.     MOV     BP,AX                     ; is it in output mode?
  2140.     AND     BP,4
  2141.     SHR     BP,1
  2142.     BT      [WORD PTR control8255],BP
  2143.     JNC     o8255cSFnoset
  2144.     BTS     [WORD PTR port8255c],AX
  2145.     MOV     AL,[port8255c]
  2146.     CALL    out8255c
  2147. o8255cSFnoset:
  2148.     POP     AX
  2149.     RET
  2150.  
  2151. inactivepsg:
  2152.     RET
  2153.  
  2154. writepsg:
  2155.     MOV     BP,[WORD PTR psgregnum]
  2156.     AND     BP,00Fh
  2157.     MOV     AL,[port8255a]
  2158.     MOV     [BP+OFFSET psgregs],AL
  2159.     MOV     [BYTE PTR BP+OFFSET psgregmod],255
  2160.     CALL    DoSound
  2161.     CALL    UpdatePIOA
  2162.     RET
  2163.  
  2164. latchpsg:
  2165.     MOV     AL,[port8255a]
  2166.     AND     AL,15
  2167.     MOV     [psgregnum],AL
  2168.     CALL    UpdatePIOA
  2169.     RET
  2170.  
  2171. outga:  MOV     BP,AX
  2172.     SHR     BP,6
  2173.     AND     BP,3
  2174.     AND     AL,3Fh
  2175.     CMP     [BYTE PTR BP+rgsgarr],AL
  2176.     JE      outga_end
  2177.     MOV     [BYTE PTR (BP+rgsgarr)],AL
  2178.     CMP     BP,2
  2179.     JNE     outga1
  2180.     CMP     AL,[memstate]
  2181.     JE      outga_end
  2182.     MOV     [memstate],AL
  2183.     AND     [memstate],0Efh
  2184.     AND     AL,10h
  2185.     JZ      outga_nocli
  2186.   ;      MOV     AX,[intspeed]
  2187.   ;      MOV     [intcount],AX
  2188.     MOV     [intreq],0
  2189. outga_nocli:
  2190.     CALL    RethinkMemMap
  2191.     InitPCSeg
  2192.     CALL    RethinkMode
  2193.     JMP     outga_end
  2194. outga1: CMP     BP,1
  2195.     JE      ga_setcol
  2196.     CMP     BP,0
  2197.     JE      outga_colreg
  2198.     CMP     BP,3
  2199.     JE      RethinkRamState
  2200.     JMP     outga_end
  2201. outga_colreg:
  2202.     MOV     [BYTE PTR rgsgarr+1],255
  2203. outga_end:
  2204.     RET
  2205.  
  2206. ga_setcol:
  2207.     PUSH    AX
  2208.     PUSH    EBX
  2209.     PUSH    DX
  2210.     MOV     AL,[BYTE PTR rgsgarr]
  2211.     CMP     AL,17
  2212.     JNC     ga_sc_end
  2213.     AND     AX,1Fh         ; *?*
  2214.     MOV     BL,[BYTE PTR (rgsgarr+1)]
  2215.     AND     BX,01Fh
  2216.     MOV     [EAX+OFFSET garrcols],BL
  2217.     CMP     [colmode],0
  2218.     JE      ga_normcols
  2219.     MOV     EBX,[EBX*4+ColorTabA]
  2220.     JMP     ga_colsok
  2221. ga_normcols:
  2222.     MOV     EBX,[EBX*4+ColorTab]
  2223. ga_colsok:
  2224.     CMP     [EAX*4+OFFSET CMap],EBX
  2225.     JE      ga_sc_end
  2226.     MOV     [EAX*4+OFFSET CMap],EBX
  2227.  
  2228. ga_sc_norm:
  2229.     CLI
  2230.     MOV     DX,3c8h
  2231.     OUT     DX,AL
  2232.     MOV     DX,3c9h
  2233.     ROR     EBX,8
  2234.     MOV     AL,BH
  2235.     OUT     DX,AL
  2236.     ROL     EBX,8
  2237.     MOV     AL,BH
  2238.     OUT     DX,AL
  2239.     MOV     AL,BL
  2240.     OUT     DX,AL
  2241.     STI
  2242. ga_sc_end:
  2243.     POP     DX
  2244.     POP     EBX
  2245.     POP     AX
  2246.     RET
  2247.  
  2248. SetColors:
  2249.     PUSH    AX
  2250.     PUSH    EBX
  2251.     PUSH    DX
  2252.  
  2253.     MOV     AX,16
  2254. SCL_Loop:
  2255.     PUSH    AX
  2256.     MOV     BL,[EAX+OFFSET garrcols]
  2257.     AND     BX,01Fh
  2258.     CMP     [colmode],0
  2259.     JE      SCL_normcols
  2260.     MOV     EBX,[EBX*4+ColorTabA]
  2261.     JMP     SCL_colsok
  2262. SCL_normcols:
  2263.     MOV     EBX,[EBX*4+ColorTab]
  2264. SCL_colsok:
  2265.     MOV     [EAX*4+OFFSET CMap],EBX
  2266.     CLI
  2267.     MOV     DX,3c8h
  2268.     OUT     DX,AL
  2269.     MOV     DX,3c9h
  2270.     ROR     EBX,8
  2271.     MOV     AL,BH
  2272.     OUT     DX,AL
  2273.     ROL     EBX,8
  2274.     MOV     AL,BH
  2275.     OUT     DX,AL
  2276.     MOV     AL,BL
  2277.     OUT     DX,AL
  2278.     STI
  2279.     XOR     EBX,EBX
  2280.     POP     AX
  2281.     DEC     AX
  2282.     JNS     SCL_Loop
  2283.  
  2284.     POP     DX
  2285.     POP     EBX
  2286.     POP     AX
  2287.     RET
  2288.  
  2289. SetEGARegs:
  2290.     MOV     BX,0
  2291. SCL_EGAloop:
  2292.     MOV     AX,1000h
  2293.     PUSH    BX
  2294.     CALL    Video
  2295.     POP     BX
  2296.     ADD     BX,101h
  2297.     CMP     BH,10h
  2298.     JNE     SCL_EGAloop
  2299.     MOV     AX,1001h
  2300.     CALL    Video
  2301.     RET
  2302.  
  2303. SetNewScrBase:
  2304.     CMP     [vgascroll],0C001h
  2305.     JC      SNSB_AllOK
  2306.     MOV     [vgascroll],06000h
  2307.     MOV     [SNSBRedraw],1
  2308. SNSB_AllOK:
  2309.     PUSH    BX
  2310.     PUSH    AX
  2311.     PUSH    DX
  2312.     CLI
  2313.     MOV     BX,[scrbase]
  2314.     SHR     BX,14
  2315.     MOV     BX,[WORD PTR EBX*2+crtcvgaoff]
  2316.     CMP     [xchgdbuf],0
  2317.     JE      SNSB_DontExchange
  2318.     CMP     [lastdbuf],24
  2319.     JC      SNSB_DontExchange
  2320.     XOR     BX,4000h
  2321. SNSB_DontExchange:
  2322.     ADD     BX,[vgascroll]
  2323.     MOV     DX,3d4h
  2324.     MOV     AL,0ch
  2325.     OUT     DX,AL
  2326.     INC     DX
  2327.     MOV     AL,BH
  2328.     OUT     DX,AL
  2329.     DEC     DX
  2330.     MOV     AL,0dh
  2331.     OUT     DX,AL
  2332.     MOV     AL,BL
  2333.     INC     DX
  2334.     OUT     DX,AL
  2335.     STI
  2336.     MOV     BX,SColOff
  2337.     ADD     BX,[vgascroll]
  2338.     MOV     [WORD PTR scradd],BX
  2339.     POP     DX
  2340.     POP     AX
  2341.     POP     BX
  2342.     CALL    GenLatchTables
  2343.     CMP     [SNSBRedraw],0
  2344.     JE      SNSB_Ret
  2345.     MOV     [SNSBRedraw],0
  2346.     CALL    RedrawScreen
  2347. SNSB_Ret:
  2348.     RET
  2349.  
  2350. SetPCsCRTC:
  2351.     MOV     [CRTCkyfo],1
  2352.     PUSHAW
  2353.     CMP     [PCRTC_MODE],0          ; Mode = 50Hz?
  2354.     JNE     SPCC_HeightL25
  2355.     CMP     [crtcscrwidth],41
  2356.     JC      SPCC_WidthL40
  2357.     CALL    OpenLongScr
  2358.     CALL    SetNewScrBase
  2359.     CALL    GenLatchTables
  2360.     JMP     SPCC_ScrOpen
  2361. SPCC_WidthL40:
  2362.     MOV     AL,[crtcscrheight]
  2363.     MOV     AH,[crtcmaxslin]
  2364.     INC     AH
  2365.     MUL     AH
  2366.     CMP     AX,201
  2367.     JC      SPCC_HeightL25
  2368.     CALL    OpenLongScr
  2369.     CALL    SetNewScrBase
  2370.     CALL    GenLatchTables
  2371.     JMP     SPCC_ScrOpen
  2372. SPCC_HeightL25:
  2373.     CALL    OpenScr
  2374.     CALL    SetNewScrBase
  2375.     CALL    GenLatchTables
  2376. SPCC_ScrOpen:
  2377.  
  2378.     MOV     AL,[crtcscrwidth]
  2379.     CMP     AL,0
  2380.     JE      SPCC_WidthOK
  2381.     CLI
  2382.     MOV     DX,3d4h
  2383.     PUSH    AX
  2384.     MOV     AL,13h
  2385.     OUT     DX,AL
  2386.     INC     DX
  2387.     IN      AL,DX
  2388.     POP     AX
  2389.     OUT     DX,AL
  2390.     STI
  2391.  
  2392.     CMP     AL,50
  2393.     JNC     SPCC_WidthOK
  2394.  
  2395.     ADD     AL,AL
  2396.     DEC     AL
  2397.     DEC     DX
  2398.     PUSH    AX
  2399.     MOV     AL,1
  2400.     CLI
  2401.     OUT     DX,AL
  2402.     INC     DX
  2403.     IN      AL,DX
  2404.     POP     AX
  2405.     OUT     DX,AL
  2406.     STI
  2407. SPCC_WidthOK:
  2408.     CMP     [PCRTC_MODE],0
  2409.     JE      SPCC_NoMode0
  2410.     MOV     DX,3d4h
  2411.     MOV     AL,10h
  2412.     CLI
  2413.     OUT     DX,AL
  2414.     PUSH    CX
  2415.     PUSH    DX
  2416.     MOV     CL,[BYTE PTR CRTCregs+9]
  2417.     INC     CL
  2418.     MOV     AL,[BYTE PTR CRTCregs+7]
  2419.     MUL     CL
  2420.     ADD     AX,AX
  2421.     ADD     AX,3
  2422.     MOV     [PCRTC_VR1],AX
  2423.     POP     DX
  2424.     INC     DX
  2425.     OUT     DX,AL
  2426.     DEC     DX
  2427.     MOV     AL,7
  2428.     OUT     DX,AL
  2429.     INC     DX
  2430.     IN      AL,DX
  2431.     ADD     AH,AH
  2432.     ADD     AH,AH
  2433.     MOV     CL,AH
  2434.     SHL     CL,4
  2435.     AND     CL,80h
  2436.     AND     AH,4
  2437.     AND     AL,07bh
  2438.     OR      AL,AH
  2439.     OR      AL,CL
  2440.     OUT     DX,AL
  2441.     STI
  2442.     POP     CX
  2443.  
  2444.     MOV     DX,3d4h
  2445.     MOV     AL,15h
  2446.     CLI
  2447.     OUT     DX,AL
  2448.     INC     DX
  2449.     MOV     AX,[PCRTC_VR1]
  2450.     SUB     AX,30
  2451.     OUT     DX,AL
  2452.  
  2453.     DEC     DX
  2454.     MOV     AL,7
  2455.     OUT     DX,AL
  2456.     INC     DX
  2457.     IN      AL,DX
  2458.     ADD     AH,AH
  2459.     ADD     AH,AH
  2460.     ADD     AH,AH
  2461.     PUSH    AX
  2462.     AND     AH,8h
  2463.     AND     AL,0F7h
  2464.     OR      AL,AH
  2465.     OUT     DX,AL
  2466.     STI
  2467.     DEC     DX
  2468.     MOV     AL,9h
  2469.     CLI
  2470.     OUT     DX,AL
  2471.     INC     DX
  2472.     POP     AX
  2473.     IN      AL,DX
  2474.     AND     AL,0DFh
  2475.     ADD     AH,AH
  2476.     AND     AH,20h
  2477.     OR      AL,AH
  2478.     OUT     DX,AL
  2479.     STI
  2480. SPCC_NoMode0:
  2481.     MOV     AL,[crtcscrheight]
  2482.     CMP     AL,0
  2483.     JE      SPCC_HeightOK
  2484.     PUSH    AX
  2485.     MOV     AL,12h
  2486.     MOV     DX,3d4h
  2487.     CLI
  2488.     OUT     DX,AL
  2489.     POP     AX
  2490.  
  2491.     PUSH    BX
  2492.     MOVZX   BX,[BYTE PTR CRTCregs+9]
  2493.     AND     BL,7
  2494.     INC     BL
  2495.     PUSH    DX
  2496.     XOR     AH,AH
  2497.     MUL     BX
  2498.     CMP     AX,100h
  2499.     JC      SPCC_HeightLess256
  2500.     MOV     AX,100h
  2501. SPCC_HeightLess256:
  2502.     POP     DX
  2503.     POP     BX
  2504.     CMP     [doublelinmode],0
  2505.     JE      SPCC_DontDouble
  2506.     ADD     AX,AX
  2507. SPCC_DontDouble:
  2508.     DEC     AX
  2509.     MOV     DX,3d5h
  2510.     OUT     DX,AL
  2511.     STI
  2512.  
  2513.     PUSH    AX
  2514.     MOV     AL,7
  2515.     MOV     DX,3d4h
  2516.     CLI
  2517.     OUT     DX,AL
  2518.     POP     AX
  2519.  
  2520.     MOV     DX,3d5h
  2521.     IN      AL,DX
  2522.     AND     AL,0bdh
  2523.  
  2524.     ADD     AH,AH
  2525.     AND     AH,2
  2526.     OR      AL,AH
  2527.  
  2528.     OUT     DX,AL
  2529. SPCC_HeightOK:
  2530. SPCC_End:
  2531.     POPAW
  2532.     STI
  2533.     MOV     [CRTCkyfo],0
  2534.     RET
  2535.  
  2536. inp:    CMP     AH,0F4h
  2537.     JE      inpioA
  2538.     CMP     AH,0F5h
  2539.     JE      inpioB
  2540.     CMP     AH,0F6h
  2541.     JE      inpioC
  2542.     CMP     AH,0FBh
  2543.     JE      inpFB
  2544.     RET
  2545.  
  2546. UpdatePIOA:
  2547.     BT      [WORD PTR control8255],4
  2548.     JNC     UPIA_Ret
  2549.     BT      [WORD PTR port8255c],7
  2550.     JC      UPIA_Ret
  2551.     PUSH    AX
  2552.     CALL    readpsg
  2553.     MOV     [port8255a],AL
  2554.     POP     AX
  2555. UPIA_Ret:
  2556.     RET
  2557.  
  2558. inpioA: ;MOV     AL,[port8255c]
  2559.     ;BT      AX,7
  2560.     ;JNC     readpsg
  2561.     CALL    UpdatePIOA
  2562.     MOV     AL,[port8255a]
  2563.     RET
  2564.  
  2565. readpsg:
  2566.     CMP     [psgregnum],14
  2567.     JE      readpsgext
  2568.     MOVZX   BP,[psgregnum]
  2569.     MOV     AL,[BYTE PTR BP+psgregs]
  2570.     RET
  2571.  
  2572. readpsgext:
  2573.     PUSH    BX                           ; *?*
  2574.     MOV     BL,[port8255c]
  2575.     AND     BX,15
  2576.     MOV     AL,[BX+KeyMatrix]
  2577.     CMP     BL,9
  2578.     JNE     rpex_nojoy0
  2579.     MOV     BH,AL
  2580.     AND     BH,12
  2581.     JNE     rpex_jhok0
  2582.     OR      AL,12
  2583. rpex_jhok0:
  2584.     MOV     BH,AL
  2585.     AND     BH,3
  2586.     JNE     rpex_jvok0
  2587.     OR      AL,3
  2588. rpex_jvok0:
  2589. rpex_nojoy0:
  2590.     CMP     BL,6
  2591.     JNE     rpex_nojoy1
  2592.     MOV     BH,AL
  2593.     AND     BH,12
  2594.     JNE     rpex_jhok1
  2595.     OR      AL,12
  2596. rpex_jhok1:
  2597.     MOV     BH,AL
  2598.     AND     BH,3
  2599.     JNE     rpex_jvok1
  2600.     OR      AL,3
  2601. rpex_jvok1:
  2602. rpex_nojoy1:
  2603.     POP     BX
  2604.     RET
  2605.  
  2606. inpioB: MOV     AL,01Eh     ; Firmenname: AMSTRAD, Freq: 50HZ
  2607.     OR      AL,[BYTE PTR ffly]
  2608.     PUSH    AX
  2609.     CMP     [clearff],0
  2610.     JE      inpioB_end
  2611.     MOV     AX,[ffly_dec]
  2612.     OR      AX,AX
  2613.     JE      inpiob_end
  2614.     DEC     AX
  2615.     MOV     [ffly_dec],AX
  2616.     JNE     inpiob_end
  2617.     MOV     [ffly],0
  2618. inpiob_end:
  2619.     POP     AX
  2620.     OR      AL,[prtstate]
  2621.     RET
  2622.  
  2623. UpdatePIOC:
  2624.     MOV     AL,[port8255c]
  2625.     BT      [WORD PTR control8255],0
  2626.     JC      inpioc_lowok
  2627.     AND     AL,240
  2628.     OR      AL,0
  2629. inpioc_lowok:
  2630.     BT      [WORD PTR control8255],3
  2631.     JC      inpioc_hiok
  2632.     AND     AL,15
  2633.     OR      AL,0
  2634. inpioc_hiok:
  2635.     MOV     [port8255c],AL
  2636.     RET
  2637. inpioC:
  2638.     MOV     AL,[port8255c]
  2639.     RET
  2640.  
  2641. RethinkMode:
  2642.     PUSHAW
  2643.     MOV     BP,[WORD PTR sysstat]
  2644.     AND     BP,3
  2645.     MOV     AL,[MoTable+BP]
  2646.     CMP     [permitmm],0
  2647.     JNE     RTM_MultiModePoss
  2648.     CMP     AL,[videomode]
  2649.     JE      RTM_End
  2650.     MOV     [RedrawCount],1
  2651.     OR      [intflag],1
  2652.     MOV     [newvidmode],AL
  2653.     JMP     RTM_End
  2654. RTM_MultiModePoss:
  2655.     CMP     [multimodeon],0
  2656.     JE      RTM_NoMultiModeOn
  2657.     CMP     AL,[videomode]
  2658.     JE      RTM_End
  2659.     MOV     [videomode],AL
  2660.     MOV     [newvidmode],AL
  2661.     MOVZX   AX,[BYTE PTR ffcount]
  2662.     MOVZX   AX,[EAX+OFFSET modeffoff]
  2663.     MOV     DL,[EAX+OFFSET modezones]
  2664.     CMP     [modezochgd],0
  2665.     JNE     RTM_ModeZonesChgd
  2666.     CMP     [mmintsignal],0
  2667.     JNE     RTM_ModeZonesChgd
  2668.     CMP     [mozoctdn],0
  2669.     JNE     RTM_ModeZonesChgd
  2670.     CMP     [videomode],DL
  2671.     JE      RTM_End
  2672. RTM_ModeZonesChgd:
  2673.     MOV     [modezochgd],0                  ; acknowledged
  2674.     MOV     DL,[videomode]
  2675.     MOV     [EAX+modezones],DL
  2676.     MOV     AX,[WORD PTR modezones]
  2677.     CMP     AX,[WORD PTR oldmzones]
  2678.     JNZ     RTM_DefinitelyChanged
  2679.     MOV     AX,[WORD PTR modezones+2]
  2680.     CMP     AX,[WORD PTR oldmzones+2]
  2681.     JNZ     RTM_DefinitelyChanged
  2682.     MOV     AX,[WORD PTR modezones+4]
  2683.     CMP     AX,[WORD PTR oldmzones+4]
  2684.     JNZ     RTM_DefinitelyChanged
  2685.     MOV     [mozoctdn],0
  2686.     MOV     [mmintsignal],0
  2687.     JMP     RTM_End
  2688. RTM_DefinitelyChanged:
  2689.     CMP     [mmintsignal],0
  2690.     JE      RTM_ActivateInt
  2691.     MOV     [mmintsignal],0
  2692.     MOV     [RedrawCount],20
  2693.     OR      [intflag],1
  2694.     OR      [multimodeon],40h
  2695.     JMP     RTM_End
  2696. RTM_ActivateInt:
  2697.     CMP     [mozoctdn],0
  2698.     JNE     RTM_End
  2699.     MOV     [mozoctdn],18
  2700.     JMP     RTM_End
  2701. RTM_NoMultiModeOn:
  2702.     CMP     AL,[newvidmode]
  2703.     JE      RTM_End
  2704.     CMP     [lastmodechg],6
  2705.     JC      RTM_SwitchToMulti
  2706.     MOV     [newvidmode],AL
  2707.     MOV     [lastmodechg],0
  2708.     JMP     RTM_End
  2709. RTM_SwitchToMulti:
  2710.     MOV     AH,[newvidmode]
  2711.     MOV     [modezones],AH
  2712.     MOV     [modezones+1],AH
  2713.     MOV     [modezones+2],AH
  2714.     MOV     [modezones+3],AH
  2715.     MOV     [modezones+4],AH
  2716.     MOV     [modezones+5],AH
  2717.     MOV     [multimodeon],41h
  2718.     OR      [intflag],1
  2719.     MOV     [videomode],AL
  2720.     MOV     sFree,[ffcount]
  2721.     MOVZX   sFree,[modeffoff+sFree]
  2722.     MOV     [modezones+sFree],AL    ; could be improved
  2723.     MOV     [RedrawCount],1
  2724. RTM_End:
  2725.     POPAW
  2726.     RET
  2727.  
  2728. OpenScr:
  2729.     CMP     [scrtype],1
  2730.     JE      OS_DontReopen
  2731.     CMP     [scrtype],2
  2732.     JNE     OS_OpenIt
  2733.     CMP     [PCRTC_MODE],0
  2734.     JNE     OS_DontReopen
  2735. OS_OpenIt:
  2736.     MOV     [scrtype],1
  2737.     MOV     AX,0Eh
  2738.     CALL    Video
  2739.     MOV     [doublelinmode],1
  2740.  
  2741.     CLI
  2742.     MOV     DX,3ceh
  2743.     MOV     AL,6
  2744.     OUT     DX,AL
  2745.     INC     DX
  2746.     IN      AL,DX
  2747.     AND     AL,3
  2748.     OUT     DX,AL
  2749.  
  2750.     MOV     DX,3d4h
  2751.     MOV     AL,11h
  2752.     OUT     DX,AL
  2753.     INC     DX
  2754.     IN      AL,DX
  2755.     AND     AL,7fh
  2756.     OUT     DX,AL
  2757.     STI
  2758.  
  2759.     CALL    SetColors
  2760.     CALL    SetEGAregs
  2761.     CALL    GenLatchTables
  2762.     CALL    RedrawScreen
  2763. OS_DontReopen:
  2764.     CMP     [PCRTC_MODE],0
  2765.     JE      OS_Ret
  2766.     MOV     [scrtype],2
  2767.     PUSH    DX
  2768.  
  2769.     CLI
  2770.     MOV     DX,3d4h
  2771.     MOV     AL,6h
  2772.     OUT     DX,AL
  2773.     INC     DX
  2774.     MOV     AX,[PCRTC_VT1]
  2775.     OUT     DX,AL
  2776.  
  2777.     MOV     DX,3d4h
  2778.     MOV     AL,7h
  2779.     OUT     DX,AL
  2780.     INC     DX
  2781.     MOV     AL,0BAh
  2782.     OUT     DX,AL
  2783.  
  2784.     MOV     DX,3d4h
  2785.     MOV     AL,11h
  2786.     OUT     DX,AL
  2787.     INC     DX
  2788.     IN      AL,DX
  2789.     MOV     AH,AL
  2790.     AND     AH,0F0h
  2791.     AND     AL,00Fh
  2792.     SUB     AL,2
  2793.     JNC     OS_VREndOK
  2794.     XOR     AL,AL
  2795. OS_VREndOK:
  2796.     OR      AL,AH
  2797.     OUT     DX,AL
  2798.  
  2799.     MOV     DX,3d4h
  2800.     MOV     AL,0h
  2801.     OUT     DX,AL
  2802.     INC     DX
  2803.     MOV     AL,62h
  2804.     OUT     DX,AL
  2805.  
  2806.     MOV     DX,3d4h
  2807.     MOV     AL,16h
  2808.     OUT     DX,AL
  2809.     INC     DX
  2810.     MOV     AL,10h
  2811.     OUT     DX,AL
  2812.  
  2813.     POP     DX
  2814. OS_Ret:
  2815.     STI
  2816.     RET
  2817.  
  2818. OpenLongScr:
  2819.     CMP     [scrtype],3
  2820.     JE      OLS_Ret
  2821.     MOV     [scrtype],3
  2822.     MOV     AX,[lsmode]
  2823.     CALL    Video
  2824.     CALL    SetColors
  2825.     CALL    SetEGAregs
  2826.     CALL    GenLatchTables
  2827.     CALL    RedrawScreen
  2828.  
  2829.     MOV     DX,3d4h
  2830.     MOV     AL,11h
  2831.     OUT     DX,AL
  2832.     INC     DX
  2833.     IN      AL,DX
  2834.     AND     AL,7fh
  2835.     OUT     DX,AL
  2836.  
  2837.     MOV     AX,[doublelin]
  2838.     MOV     [doublelinmode],AX
  2839.     CMP     AX,0
  2840.     JE      OLS_Ret
  2841.     CLI
  2842.     MOV     DX,3d4h
  2843.     MOV     AL,9h
  2844.     OUT     DX,AL
  2845.     INC     DX
  2846.     IN      AL,DX
  2847.     OR      AL,80h
  2848.     OUT     DX,AL
  2849. OLS_Ret:
  2850.     STI
  2851.     RET
  2852.  
  2853. GenLatchTables:
  2854.     PUSHAW
  2855.     MOV     DX,03CEh
  2856.     MOV     AX,0            ; Latch 2 & 3 auf 0 setzen
  2857.     OUT     DX,AX
  2858.     MOV     AX,0001h
  2859.     OUT     DX,AX
  2860.     MOV     AX,0003h
  2861.     OUT     DX,AX     ; Funktionsauswahl: Bits ersetzen
  2862.     MOV     AX,0205h  ; Schreibmodus
  2863.     OUT     DX,AX
  2864.  
  2865.     MOV     AX,0A000h
  2866.     MOV     FS,AX
  2867.     MOV     SI,255
  2868.     MOV     BX,SI
  2869.     ADD     BX,[WORD PTR scradd]
  2870. GLAT_Loop0:
  2871.     MOV     CL,[SI+m0cols]
  2872.     MOV     AL,[FS:BX]
  2873.     MOV     AX,00F08h
  2874.     OUT     DX,AX     ; Bitmaske C0
  2875.     MOV     [FS:BX],CL
  2876.     MOV     AL,[FS:BX]
  2877.     SHR     CL,4
  2878.     MOV     AX,0F008h
  2879.     OUT     DX,AX
  2880.     MOV     [FS:BX],CL
  2881.     DEC     BX
  2882.     DEC     SI
  2883.     JNS     GLAT_Loop0
  2884.  
  2885.     MOV     DX,03CEh
  2886.     MOV     AX,0            ; Latch 2 & 3 auf 0 setzen
  2887.     OUT     DX,AX
  2888.     MOV     AX,0C01h
  2889.     OUT     DX,AX
  2890.     MOV     AX,0003h
  2891.     OUT     DX,AX     ; Funktionsauswahl: Bits ersetzen
  2892.     MOV     AX,0205h  ; Schreibmodus
  2893.     OUT     DX,AX
  2894.  
  2895.     MOV     SI,255
  2896.     MOV     BX,SI
  2897.     ADD     BX,[WORD PTR scradd]
  2898.     ADD     BX,256
  2899. GLAT_Loop1:
  2900.     MOV     CX,[WORD PTR ESI*2+m1cols]
  2901.     MOV     AL,[FS:BX]
  2902.     MOV     AX,03008h
  2903.     OUT     DX,AX     ; Bitmaske C0
  2904.     MOV     [FS:BX],CL
  2905.  
  2906.     MOV     AL,[FS:BX]
  2907.     SHR     CX,4
  2908.     MOV     AX,0C008h
  2909.     OUT     DX,AX
  2910.     MOV     [FS:BX],CL
  2911.  
  2912.     MOV     AL,[FS:BX]
  2913.     SHR     CX,4
  2914.     MOV     AX,00308h
  2915.     OUT     DX,AX
  2916.     MOV     [FS:BX],CL
  2917.  
  2918.     MOV     AL,[FS:BX]
  2919.     SHR     CX,4
  2920.     MOV     AX,00C08h
  2921.     OUT     DX,AX
  2922.     MOV     [FS:BX],CL
  2923.  
  2924.     DEC     BX
  2925.     DEC     SI
  2926.     JNS     GLAT_Loop1
  2927.  
  2928.     MOV     DX,03CEh
  2929.     MOV     AX,0003h
  2930.     OUT     DX,AX     ; Funktionsauswahl: Bits ersetzen
  2931.     MOV     AX,0
  2932.     OUT     DX,AX
  2933.     MOV     AX,0E01h
  2934.     OUT     DX,AX
  2935.     MOV     AX,0FF08h
  2936.     OUT     DX,AX
  2937.     MOV     AX,00005h
  2938.     OUT     DX,AX
  2939.  
  2940.     MOV     SI,255
  2941.     MOV     BX,SI
  2942.     ADD     BX,[WORD PTR scradd]
  2943.     ADD     BX,512
  2944. GLAT_Loop2:
  2945.     MOV     AX,SI
  2946.  ;      MOV     AH,[FS:BX]
  2947.     MOV     [FS:BX],AL
  2948.     DEC     BX
  2949.     DEC     SI
  2950.     JNS     GLAT_Loop2
  2951.  
  2952.     MOV     AX,0105h
  2953.     OUT     DX,AX
  2954.     POPAW
  2955.     RET
  2956.  
  2957.  ; ******************************************************** printer support
  2958.  
  2959. OpenPrinter:
  2960.     MOV     DX,[lptnum]
  2961.     DEC     DX
  2962.     JS      OPPR_End
  2963.     MOV     AH,1
  2964.     INT     17h
  2965. ;        MOV     [prinha],0ffffh
  2966. ;        MOV     DX,OFFSET lptname
  2967. ;        MOV     AX,[lptnum]
  2968. ;        ADD     AL,'0'
  2969. ;        MOV     [EDX+3],AL
  2970. ;        MOV     AX,3d01h
  2971. ;        INT     21h
  2972. ;        JC      OPPR_End
  2973. ;        MOV     [prinha],AX
  2974. OPPR_End:
  2975.     RET
  2976.  
  2977. ClosePrinter:
  2978. ;        MOV     BX,[prinha]
  2979. ;        CMP     BX,0ffffh
  2980. ;        JE      CLPR_End
  2981. ;        MOV     AH,3eh
  2982. ;        INT     21h
  2983. ;CLPR_End:
  2984.     RET
  2985.  
  2986. outPrinter:
  2987.     PUSHAW
  2988.     TEST    AL,80h
  2989.     JZ      PRIN_Oops
  2990.     AND     AL,7fh
  2991.     MOV     DX,[lptnum]
  2992.     DEC     DX
  2993.     JS      PRIN_Oops
  2994.     MOV     AH,0
  2995.     INT     17h
  2996.     CALL    GetPrtState
  2997. PRIN_Oops:
  2998.     POPAW
  2999.     RET
  3000.  
  3001. GetPrtState:
  3002.     PUSHAW
  3003.     MOV     AH,2
  3004.     MOV     DX,[lptnum]
  3005.     DEC     DX
  3006.     JS      GPRS_NoPrinter
  3007.     INT     17h
  3008.     SHR     AH,1
  3009.     AND     AH,40h
  3010.     XOR     AH,40h
  3011.     MOV     [prtstate],AH
  3012.     POPAW
  3013.     RET
  3014.  
  3015. GPRS_NoPrinter:
  3016.     MOV     [prtstate],40h
  3017.     MOV     [lptnum],0
  3018.     POPAW
  3019.     RET
  3020.  
  3021.  ; ******************************************************** RAM banking
  3022.  
  3023. InitRAMSegs:
  3024.     PUSH    ES
  3025.     MOV     [haveEMM],0
  3026.     CMP     [useems],0
  3027.     JE      IRAS_noEMS
  3028.     MOV     AX,3567h
  3029.     INT     21h
  3030.     CMP     [DWORD PTR ES:10],'XMME'
  3031.     JNE     IRAS_noEMS
  3032.     CMP     [DWORD PTR ES:14],'0XXX'
  3033.     JNE     IRAS_noEMS
  3034.     MOV     AH,41h
  3035.     INT     67h
  3036.     CMP     AH,0
  3037.     JNE     IRAS_noEMS
  3038.     MOV     [normramseg],BX
  3039.     MOV     AH,43h
  3040.     MOV     BX,8
  3041.     INT     67h
  3042.     CMP     AH,0
  3043.     JNE     IRAS_noEMS
  3044.     MOV     [haveEMM],1
  3045.     MOV     [emmha],DX
  3046.     MOV     BX,0
  3047.     MOV     AX,4400h
  3048.     INT     67h
  3049.     MOV     BX,1
  3050.     MOV     AX,4401h
  3051.     INT     67h
  3052.     MOV     BX,2
  3053.     MOV     AX,4402h
  3054.     INT     67h
  3055.     MOV     BX,3
  3056.     MOV     AX,4403h
  3057.     INT     67h
  3058.     JMP     IRAS_End
  3059. IRAS_noEMS:
  3060.     MOV     [normramseg],SEG rambase
  3061. IRAS_End:
  3062.     POP     ES
  3063.     RET
  3064.  
  3065. CleanupEMM:
  3066.     CMP     [haveEMM],0
  3067.     JE      CEMM_Ret
  3068.     MOV     AH,45h
  3069.     MOV     DX,[emmha]
  3070.     INT     67h
  3071. CEMM_Ret:
  3072.     RET
  3073.  
  3074. ResetRAMState:
  3075.     PUSH    EAX
  3076.     MOV     EAX,[DWORD PTR ramstatetab]
  3077.     MOV     [DWORD PTR ramstate],EAX
  3078.     MOV     EAX,[DWORD PTR ramstatetab+4]
  3079.     MOV     [DWORD PTR ramstate+4],EAX
  3080.     POP     EAX
  3081.     RET
  3082.  
  3083. RethinkRamState:
  3084.     CMP     [haveEMM],0
  3085.     JNE     RTRS_EMM
  3086.     PUSHAD
  3087.     PUSH    ES
  3088.  
  3089.     MOV     AL,[BYTE PTR sysstat+1]
  3090.     AND     AX,7
  3091.     MOV     [BYTE PTR sysstat+1],AL
  3092.     ADD     AX,AX
  3093.     ADD     AX,AX
  3094.     ADD     AX,AX
  3095.     MOV     SI,AX
  3096.     ADD     SI,OFFSET ramstatetab
  3097.     MOV     DI,OFFSET ramstate
  3098.     MOV     CX,8
  3099. RTRS_Loop:
  3100.     LODSB
  3101.     CMP     AL,[DI]
  3102.     JE      RTRS_Equal
  3103.     MOV     AH,[DI]
  3104.     CALL    ExBanks
  3105. RTRS_Equal:
  3106.     INC     DI
  3107.     LOOP    RTRS_Loop
  3108.     POP     ES
  3109.     POPAD
  3110.     CALL    GenWriteVGAoff
  3111.     RET
  3112. RTRS_EMM:
  3113.     PUSHAW
  3114.     MOV     [doingems],1
  3115.     MOV     AL,[BYTE PTR sysstat+1]
  3116.     AND     AX,7
  3117.     MOV     [BYTE PTR sysstat+1],AL
  3118.     ADD     AX,AX
  3119.     ADD     AX,AX
  3120.     ADD     AX,AX
  3121.     MOV     SI,AX
  3122.     ADD     SI,OFFSET ramstatetab
  3123.     MOV     DI,OFFSET ramstate
  3124.  
  3125.     XOR     BH,BH
  3126.     MOV     BL,[SI]
  3127.     MOV     AX,4400h
  3128.     MOV     DX,[emmha]
  3129.     PUSH    SI
  3130.     INT     67h
  3131.     POP     SI
  3132.  
  3133.     XOR     BH,BH
  3134.     MOV     BL,[SI+1]
  3135.     MOV     AX,4401h
  3136.     MOV     DX,[emmha]
  3137.     PUSH    SI
  3138.     INT     67h
  3139.     POP     SI
  3140.  
  3141.     XOR     BH,BH
  3142.     MOV     BL,[SI+2]
  3143.     MOV     AX,4402h
  3144.     MOV     DX,[emmha]
  3145.     PUSH    SI
  3146.     INT     67h
  3147.     POP     SI
  3148.  
  3149.     XOR     BH,BH
  3150.     MOV     BL,[SI+3]
  3151.     MOV     AX,4403h
  3152.     MOV     DX,[emmha]
  3153.     PUSH    SI
  3154.     INT     67h
  3155.     POP     SI
  3156.  
  3157.     LODSD
  3158.     MOV     [DS:DI],EAX
  3159.     LODSD
  3160.     MOV     [DS:DI+4],EAX
  3161.     XOR     EAX,EAX
  3162.     POPAW
  3163.     CALL    GenWriteVGAoff
  3164.     MOV     [omitnextint],2
  3165.     MOV     [doingems],0
  3166.     RET
  3167.  
  3168. ExBanks:                ; IN: AL = Bank1, AH = Bank2 / corrects RamState
  3169.     PUSH    SI
  3170.     PUSH    DI
  3171.     PUSH    CX
  3172.     CALL    GetBankAddr
  3173.     XCHG    AL,AH
  3174.     PUSH    ES
  3175.     POP     FS
  3176.     MOV     SI,DI
  3177.     CALL    GetBankAddr
  3178.     MOV     CX,1000h
  3179.     PUSH    EAX
  3180.     PUSH    DX
  3181.     MOV     DX,4
  3182. EXBA_ExLoop:
  3183.     MOV     EAX,[ES:DI]
  3184.     XCHG    EAX,[FS:SI]
  3185.     STOSD
  3186.     ADD     SI,DX
  3187.     LOOP    EXBA_ExLoop
  3188.     POP     DX
  3189.     POP     EAX
  3190.     MOV     CX,8
  3191.     MOV     SI,OFFSET ramstate
  3192. EXBA_Correct:
  3193.     CMP     [SI],AL
  3194.     JNE     EXBA_NotAL
  3195.     MOV     [SI],AH
  3196.     JMP     EXBA_CorrectL
  3197. EXBA_NotAL:
  3198.     CMP     [SI],AH
  3199.     JNE     EXBA_CorrectL
  3200.     MOV     [SI],AL
  3201. EXBA_CorrectL:
  3202.     INC     SI
  3203.     LOOP    EXBA_Correct
  3204.     POP     CX
  3205.     POP     DI
  3206.     POP     SI
  3207.     RET
  3208.  
  3209. GetBankAddr:            ; IN: AL = Bank / OUT: ES:DI Bankaddr
  3210.     PUSH    DS
  3211.     POP     ES
  3212.     PUSH    CX
  3213.     MOV     DI,OFFSET ramstate
  3214.     MOV     CX,8
  3215.     REPNE   SCASB
  3216.     SUB     DI,OFFSET ramstate+1
  3217.     CMP     DI,4
  3218.     JC      GBAD_Lo
  3219.     AND     DI,3
  3220.     ROR     DI,2
  3221.     PUSH    SEG hiram
  3222.     POP     ES
  3223.     JMP     GBAD_End
  3224. GBAD_Lo:
  3225.     ROR     DI,2
  3226.     PUSH    SEG rambase
  3227.     POP     ES
  3228. GBAD_End:
  3229.     POP     CX
  3230.     RET
  3231.  
  3232. RethinkMemMap:
  3233.     MOV     BP,[normramseg]
  3234.     BT      [sysstat],2
  3235.     JC      RMM_LOK
  3236.     MOV     BP,SEG amsdos
  3237. RMM_LOK:
  3238.     MOV     [memmap],BP
  3239. RMM_TestUpper:
  3240.     MOV     BP,[normramseg]
  3241.     MOV     [memmap+2],BP
  3242.     MOV     [memmap+4],BP
  3243.  
  3244.     BT      [sysstat],3
  3245.     JC      RMM_UOK
  3246.     CMP     [romnum],7
  3247.     JE      RMM_SetFloppy
  3248.     MOV     BP,SEG basic
  3249.     SUB     BP,0C00h
  3250.     JMP     RMM_UOK
  3251. RMM_SetFloppy:
  3252.     MOV     BP,SEG rom7
  3253.     SUB     BP,0C00h
  3254. RMM_UOK:
  3255.     MOV     [memmap+6],BP
  3256.  
  3257.     RET
  3258.  
  3259.  ; **************************************************************** Snapshots
  3260.  
  3261. LoadSnap:
  3262.     PUSHAD
  3263.     MOV     [snapha],0ffffh
  3264.     MOV     DX,OFFSET snapdir
  3265.     MOV     AX,3d02h
  3266.     INT     21h
  3267.     JC      LOSN_End
  3268.     MOV     [snapha],AX
  3269.  
  3270.     MOV     BX,AX
  3271.     MOV     AH,3fh
  3272.     MOV     CX,256
  3273.     MOV     DX,OFFSET SnapBuffer
  3274.     INT     21h
  3275.     JC      LOSN_Close
  3276.     CMP     [DWORD PTR SnapBuffer+4],'ANS ' ; check file id
  3277.     JNE     LOSN_Close
  3278.     CMP     [DWORD PTR SnapBuffer],'- VM'
  3279.     JNE     LOSN_Close
  3280.     CMP     [BYTE PTR SnapBuffer+10h],1   ; snapshot version (1/2)?
  3281.     JE      LOSN_Ver1
  3282.     CMP     [BYTE PTR SnapBuffer+10h],2
  3283.     JE      LOSN_Ver2
  3284.     JMP     LOSN_Close
  3285.  
  3286. LOSN_Ver2:
  3287.  
  3288. LOSN_Ver1:
  3289.     CALL    reset
  3290.  
  3291.     POPAD                                 ; read Z80 registers
  3292.     MOV     AX,[SnapBuffer+11h]
  3293.     ROL     AX,8
  3294.     MOV     sBC,[SnapBuffer+13h]
  3295.     MOV     sDE,[SnapBuffer+15h]
  3296.     MOV     nsHL,[SnapBuffer+17h]
  3297.     MOV     sPC,[SnapBuffer+23h]
  3298.     PUSHAD
  3299.  
  3300.     MOV     AL,[BYTE PTR SnapBuffer+19h]
  3301.     MOV     [BYTE PTR srF],AL
  3302.     AND     AL,80h
  3303.     MOV     [BYTE PTR srFhi],AL
  3304.     MOV     AL,[BYTE PTR SnapBuffer+1Ah]
  3305.     MOV     [BYTE PTR srI],AL
  3306.     MOV     AL,[BYTE PTR SnapBuffer+1Bh]
  3307.     MOV     [sIFF1],AL
  3308.     MOV     AL,[BYTE PTR SnapBuffer+1Ch]
  3309.     MOV     [sIFF2],AL
  3310.     MOV     AX,[SnapBuffer+1Dh]
  3311.     MOV     [ix],AX
  3312.     MOV     AX,[SnapBuffer+1Fh]
  3313.     MOV     [iy],AX
  3314.     MOV     AX,[SnapBuffer+21h]
  3315.     MOV     [simstack],AX
  3316.     MOVZX   AX,[BYTE PTR SnapBuffer+25h]
  3317.     MOV     [imode],AX
  3318.     MOV     AX,[SnapBuffer+26h]
  3319.     ROL     AX,8
  3320.     MOV     [sAFx],AX
  3321.     MOV     AX,[SnapBuffer+28h]
  3322.     MOV     [sBCx],AX
  3323.     MOV     AX,[SnapBuffer+2Ah]
  3324.     MOV     [sDEx],AX
  3325.     MOV     AX,[SnapBuffer+2Ch]
  3326.     MOV     [sHLx],AX
  3327.  
  3328.     MOV     BX,0                            ; set gary
  3329. LOSN_SetCols:
  3330.     MOV     AL,[BYTE PTR EBX+SnapBuffer+2Fh]
  3331.     MOV     [BYTE PTR rgsgarr],BL
  3332.     MOV     [BYTE PTR rgsgarr+1],AL
  3333.     CALL    ga_setcol
  3334.     INC     BX
  3335.     CMP     BX,17
  3336.     JNE     LOSN_SetCols
  3337.     MOV     AL,[BYTE PTR SnapBuffer+2eh]
  3338.     MOV     [BYTE PTR rgsgarr],AL
  3339.     MOV     AL,[BYTE PTR SnapBuffer+40h]
  3340.     MOV     [BYTE PTR rgsgarr+2],AL
  3341.     MOV     AL,[BYTE PTR SnapBuffer+41h]
  3342.     MOV     [BYTE PTR rgsgarr+3],AL
  3343.  
  3344.     MOV     AL,[BYTE PTR SnapBuffer+42h]             ; set CRTC
  3345.     MOV     [CRTCregnum],AL
  3346.     PUSH    ES
  3347.     PUSH    DS
  3348.     POP     ES
  3349.     MOV     SI,OFFSET SnapBuffer+43h
  3350.     MOV     DI,OFFSET CRTCregs
  3351.     MOV     CX,9
  3352.     REP     MOVSW
  3353.  
  3354.     MOV     AL,[BYTE PTR SnapBuffer+55h]
  3355.     MOV     [BYTE PTR romnum],AL
  3356.     MOV     AL,[BYTE PTR SnapBuffer+56h]
  3357.     MOV     [port8255a],AL
  3358.     MOV     AL,[BYTE PTR SnapBuffer+57h]
  3359.     MOV     [port8255b],AL
  3360.     MOV     AL,[BYTE PTR SnapBuffer+58h]
  3361.     MOV     [port8255c],AL
  3362.     MOV     AL,[BYTE PTR SnapBuffer+59h]
  3363.     MOV     [control8255],AL
  3364.     MOV     AL,[BYTE PTR SnapBuffer+5Ah]
  3365.     MOV     [psgregnum],AL
  3366.     MOV     SI,OFFSET SnapBuffer+5Bh
  3367.     MOV     DI,OFFSET PSGregs
  3368.     MOV     CX,8
  3369.     REP     MOVSW
  3370.     POP     ES
  3371.  
  3372.     MOV     BX,[snapha]                     ; read the RAM
  3373.     PUSH    DS
  3374.     PUSH    [normramseg]
  3375.     POP     DS
  3376.     MOV     DX,OFFSET rambase
  3377.     MOV     CX,32768
  3378.     MOV     AH,3fh
  3379.     INT     21h
  3380.     ADD     DX,CX
  3381.     MOV     AH,3fh
  3382.     INT     21h
  3383.     POP     DS
  3384.  
  3385.     MOV     BP,0                            ; now we can use all the new
  3386. LOSN_SetPSG:                                    ; values
  3387.     PUSH    BP
  3388.     CALL    DoSound
  3389.     POP     BP
  3390.     INC     BP
  3391.     CMP     BP,14
  3392.     JNE     LOSN_SetPSG
  3393.  
  3394.     CALL    RethinkMemMap
  3395.     CALL    RethinkRamState
  3396.     POPAD
  3397.     InitPCSeg
  3398.     PUSHAD
  3399.     MOV     [multimodeon],0
  3400.     MOV     AL,[BYTE PTR sysstat]
  3401.     AND     AX,3
  3402.     MOV     AL,[EAX+MoTable]
  3403.     MOV     [videomode],AL
  3404.     MOV     [spcrtcflag],2
  3405.     CALL    RethinkCRTC
  3406.     CALL    GenByteMode
  3407.     MOV     [scrtype],0ffffh
  3408.     MOV     [omitnextint],2
  3409.     MOV     [intflag],0
  3410. LOSN_Close:
  3411.     MOV     BX,[snapha]
  3412.     MOV     AH,3Eh
  3413.     INT     21h
  3414. LOSN_End:
  3415.     POPAD
  3416.     RET
  3417.  
  3418. SaveSnap:
  3419.         PUSH    ES
  3420.     PUSHAD
  3421.         CALL    GetSaveSnapName
  3422.  
  3423.         CMP     [snaname],0
  3424.         JE      SASN_End
  3425.  
  3426.     MOV     [snapha],0ffffh
  3427.     MOV     DX,OFFSET snapdir
  3428.     MOV     AX,3c00h
  3429.     XOR     CX,CX
  3430.     INT     21h
  3431.     JC      SASN_End
  3432.     MOV     [snapha],AX
  3433.  
  3434.     MOV     DX,OFFSET SnapBuffer
  3435.     MOV     [DWORD PTR EDX],'- VM'
  3436.     MOV     [DWORD PTR EDX+4],'ANS '
  3437.     MOV     [BYTE PTR EDX+10h],1    ; snapshot version must be 1
  3438.  
  3439.     POPAD
  3440.     ROL     AX,8                              ; read Z80 registers
  3441.     MOV     [SnapBuffer+11h],AX
  3442.     ROL     AX,8
  3443.     MOV     [SnapBuffer+13h],sBC
  3444.     MOV     [SnapBuffer+15h],sDE
  3445.     MOV     [SnapBuffer+17h],nsHL
  3446.     MOV     [SnapBuffer+23h],sPC
  3447.     PUSHAD
  3448.  
  3449.     MOV     AL,[BYTE PTR srF]
  3450.     AND     AL,7fh
  3451.     OR      AL,[BYTE PTR srFhi]
  3452.     MOV     [BYTE PTR SnapBuffer+19h],AL
  3453.     MOV     AL,[BYTE PTR srI]
  3454.     MOV     [BYTE PTR SnapBuffer+1Ah],AL
  3455.  
  3456.     MOV     AL,[sIFF1]
  3457.     MOV     [BYTE PTR SnapBuffer+1Bh],AL
  3458.     MOV     AL,[sIFF2]
  3459.     MOV     [BYTE PTR SnapBuffer+1Ch],AL
  3460.     MOV     AX,[ix]
  3461.     MOV     [SnapBuffer+1Dh],AX
  3462.     MOV     AX,[iy]
  3463.     MOV     [SnapBuffer+1Fh],AX
  3464.     MOV     AX,[simstack]
  3465.     MOV     [SnapBuffer+21h],AX
  3466.     MOV     AX,[imode]
  3467.     MOV     [BYTE PTR SnapBuffer+25h],AL
  3468.     MOV     AX,[sAFx]
  3469.     ROL     AX,8
  3470.     MOV     [SnapBuffer+26h],AX
  3471.     MOV     AX,[sBCx]
  3472.     MOV     [SnapBuffer+28h],AX
  3473.     MOV     AX,[sDEx]
  3474.     MOV     [SnapBuffer+2Ah],AX
  3475.     MOV     AX,[sHLx]
  3476.     MOV     [SnapBuffer+2Ch],AX
  3477.  
  3478.     MOV     BX,0                            ; set gary
  3479. SASN_SetCols:
  3480.     MOV     AL,[BYTE PTR EBX+garrcols]
  3481.     MOV     [BYTE PTR EBX+SnapBuffer+02Fh],AL
  3482.     INC     BX
  3483.     CMP     BX,17
  3484.     JNE     SASN_SetCols
  3485.     MOV     AL,[BYTE PTR rgsgarr]
  3486.     MOV     [BYTE PTR SnapBuffer+2eh],AL
  3487.     MOV     AL,[BYTE PTR rgsgarr+2]
  3488.     MOV     [BYTE PTR SnapBuffer+40h],AL
  3489.     MOV     AL,[BYTE PTR rgsgarr+3]
  3490.     MOV     [BYTE PTR SnapBuffer+41h],AL
  3491.  
  3492.     MOV     AL,[CRTCregnum]
  3493.     MOV     [BYTE PTR SnapBuffer+42h],AL             ; set CRTC
  3494.     PUSH    ES
  3495.     PUSH    DS
  3496.     POP     ES
  3497.     MOV     DI,OFFSET SnapBuffer+43h
  3498.     MOV     SI,OFFSET CRTCregs
  3499.     MOV     CX,9
  3500.     REP     MOVSW
  3501.  
  3502.     MOV     AL,[BYTE PTR romnum]
  3503.     MOV     [BYTE PTR SnapBuffer+55h],AL
  3504.     MOV     AL,[port8255a]
  3505.     MOV     [BYTE PTR SnapBuffer+56h],AL
  3506.     MOV     AL,[port8255b]
  3507.     MOV     [BYTE PTR SnapBuffer+57h],AL
  3508.     MOV     AL,[port8255c]
  3509.     MOV     [BYTE PTR SnapBuffer+58h],AL
  3510.     MOV     AL,[control8255]
  3511.     MOV     [BYTE PTR SnapBuffer+59h],AL
  3512.     MOV     AL,[psgregnum]
  3513.     MOV     [BYTE PTR SnapBuffer+5Ah],AL
  3514.     MOV     DI,OFFSET SnapBuffer+5Bh
  3515.     MOV     SI,OFFSET PSGregs
  3516.     MOV     CX,8
  3517.     REP     MOVSW
  3518.     POP     ES
  3519.  
  3520.     MOV     [SnapBuffer+06bh],64
  3521.     MOV     [SnapBuffer+06ch],0
  3522.  
  3523.     MOV     BX,[snapha]
  3524.     MOV     CX,256
  3525.     MOV     DX,OFFSET SnapBuffer
  3526.     MOV     AX,4000h
  3527.     INT     21h
  3528.  
  3529.     PUSH    DS
  3530.     PUSH    [normramseg]
  3531.     POP     DS
  3532.     MOV     DX,OFFSET rambase
  3533.     MOV     CX,32768
  3534.     MOV     AH,40h
  3535.     INT     21h
  3536.     ADD     DX,CX
  3537.     MOV     AH,40h
  3538.     INT     21h
  3539.     POP     DS
  3540.  
  3541.     MOV     BX,[snapha]
  3542.     MOV     AH,3Eh
  3543.     INT     21h
  3544. SASN_End:
  3545.     POPAD
  3546.         POP     ES
  3547.     CALL    GetSnapDir
  3548.     RET
  3549. ENDS
  3550.  
  3551. SEGMENT _data PAGE PUBLIC 'DATA'
  3552.  
  3553. prefname db 'prefs.cpe',0
  3554.  
  3555. SnapBuffer dw 256 DUP (?)
  3556.  
  3557. LABEL MenuScr BYTE
  3558.     db '               CPE Preferences                                                  '
  3559.     db '                                                                                '
  3560.     db '  Green monitor                                                                 '
  3561.     db '  Use sound card                                                                '
  3562.     db '  Use Soundblaster noise generator                                              '
  3563.     db '  German keyboard                                                               '
  3564.     db '  Use joystick                                                                  '
  3565.     db '  Real-time CPC                                                                 '
  3566.     db '  Frame fly asynchronous to vertical retrace                                    '
  3567.     db '  Clear frame fly bit after read                                                '
  3568.     db '  Emulate R register                                                            '
  3569.     db '  Permit double buffering                                                       '
  3570.     db '  Double buffering: Exchange pages                                              '
  3571.     db '  Exact interrupts                                                              '
  3572.     db '  Permit VGA scrolling                                                          '
  3573.     db '  Permit multimode                                                              '
  3574.     db '  Try slowdown for exact realtime (experimental)                                '
  3575.     db 80 DUP (' ')
  3576.     db 80 DUP (' ')
  3577.     db 80 DUP (' ')
  3578.     db 80 DUP (' ')
  3579.     db 80 DUP (' ')
  3580.     db 80 DUP (' ')
  3581.     db 80 DUP (' ')
  3582.     db 80 DUP (' ')
  3583.     db 80 DUP (' ')
  3584.     db 80 DUP (' ')
  3585.     db 80 DUP (' ')
  3586.     db 80 DUP (' ')
  3587.     db 80 DUP (' ')
  3588.     db 80 DUP (' ')
  3589.     db 80 DUP (' ')
  3590.  
  3591. MenuItems   dw 15
  3592.  
  3593. LABEL CPEPrefs WORD
  3594. sbdelay     dw 23h
  3595. lsmode      dw 52h
  3596. doublelin   dw 1
  3597. SBInstalled dw 0ffffh
  3598. SBport      dw 220h
  3599. lptnum      dw 1
  3600. PCRTC_VT1   dw 62h                   ; cpc zones moving down
  3601. cpctype     dw 3
  3602. bogoval     dw 0
  3603. bogoval2    dw 0
  3604. bogoval3    dw 0
  3605. bogoval4    dw 0
  3606. useems      dw 0ffffh
  3607. gusint      dw 0bh
  3608. quietcas    dw 0
  3609. bogoval5    dw 0
  3610.  
  3611. LABEL MenuVars WORD
  3612. colmode     dw 0
  3613. usesound    dw 0ffffh
  3614. noisy       dw 0
  3615. germkey     dw 0ffffh
  3616. usejoy      dw 0
  3617. realtime    dw 0
  3618. asyncff     dw 0
  3619. clearff     dw 0
  3620. emulr       dw 0ffffh
  3621. permitdbuf  dw 0ffffh
  3622. xchgdbuf    dw 0
  3623. exactint    dw 0ffffh
  3624. useVGAroll  dw 0ffffh
  3625. permitMM    dw 0ffffh
  3626. fancyrlt    dw 0
  3627.  
  3628. PCRTC_VR1    dw   1e0h
  3629. PCRTC_MODE   db   0
  3630. PCRTC_HITVB  db   0
  3631. PCRTC_VR2CNT db   0
  3632. tssavedmode  db   0
  3633.  
  3634. LABEL joystuff WORD
  3635. joyr        dw 0
  3636. joyu        dw 0
  3637. joyl        dw 0
  3638. joyd        dw 0
  3639.  
  3640. havejoy     dw 0f00bh
  3641.  
  3642. MoTable db 0,1,2,0
  3643.  
  3644. LABEL m1cols BYTE
  3645.  
  3646.  DB 0,0,0,2,0,32,0,34,2,0,2,2,2,32,2,34
  3647.  DB 32,0,32,2,32,32,32,34,34,0,34,2,34,32,34,34
  3648.  DB 0,1,0,3,0,33,0,35,2,1,2,3,2,33,2,35
  3649.  DB 32,1,32,3,32,33,32,35,34,1,34,3,34,33,34,35
  3650.  DB 0,16,0,18,0,48,0,50,2,16,2,18,2,48,2,50
  3651.  DB 32,16,32,18,32,48,32,50,34,16,34,18,34,48,34,50
  3652.  DB 0,17,0,19,0,49,0,51,2,17,2,19,2,49,2,51
  3653.  DB 32,17,32,19,32,49,32,51,34,17,34,19,34,49,34,51
  3654.  DB 1,0,1,2,1,32,1,34,3,0,3,2,3,32,3,34
  3655.  DB 33,0,33,2,33,32,33,34,35,0,35,2,35,32,35,34
  3656.  DB 1,1,1,3,1,33,1,35,3,1,3,3,3,33,3,35
  3657.  DB 33,1,33,3,33,33,33,35,35,1,35,3,35,33,35,35
  3658.  DB 1,16,1,18,1,48,1,50,3,16,3,18,3,48,3,50
  3659.  DB 33,16,33,18,33,48,33,50,35,16,35,18,35,48,35,50
  3660.  DB 1,17,1,19,1,49,1,51,3,17,3,19,3,49,3,51
  3661.  DB 33,17,33,19,33,49,33,51,35,17,35,19,35,49,35,51
  3662.  DB 16,0,16,2,16,32,16,34,18,0,18,2,18,32,18,34
  3663.  DB 48,0,48,2,48,32,48,34,50,0,50,2,50,32,50,34
  3664.  DB 16,1,16,3,16,33,16,35,18,1,18,3,18,33,18,35
  3665.  DB 48,1,48,3,48,33,48,35,50,1,50,3,50,33,50,35
  3666.  DB 16,16,16,18,16,48,16,50,18,16,18,18,18,48,18,50
  3667.  DB 48,16,48,18,48,48,48,50,50,16,50,18,50,48,50,50
  3668.  DB 16,17,16,19,16,49,16,51,18,17,18,19,18,49,18,51
  3669.  DB 48,17,48,19,48,49,48,51,50,17,50,19,50,49,50,51
  3670.  DB 17,0,17,2,17,32,17,34,19,0,19,2,19,32,19,34
  3671.  DB 49,0,49,2,49,32,49,34,51,0,51,2,51,32,51,34
  3672.  DB 17,1,17,3,17,33,17,35,19,1,19,3,19,33,19,35
  3673.  DB 49,1,49,3,49,33,49,35,51,1,51,3,51,33,51,35
  3674.  DB 17,16,17,18,17,48,17,50,19,16,19,18,19,48,19,50
  3675.  DB 49,16,49,18,49,48,49,50,51,16,51,18,51,48,51,50
  3676.  DB 17,17,17,19,17,49,17,51,19,17,19,19,19,49,19,51
  3677.  DB 49,17,49,19,49,49,49,51,51,17,51,19,51,49,51,51
  3678.  
  3679.  DB 0,0,0,1,0,16,0,17,1,0,1,1,1,16,1,17
  3680.  DB 16,0,16,1,16,16,16,17,17,0,17,1,17,16,17,17
  3681.  DB 0,2,0,3,0,18,0,19,1,2,1,3,1,18,1,19
  3682.  DB 16,2,16,3,16,18,16,19,17,2,17,3,17,18,17,19
  3683.  DB 0,32,0,33,0,48,0,49,1,32,1,33,1,48,1,49
  3684.  DB 16,32,16,33,16,48,16,49,17,32,17,33,17,48,17,49
  3685.  DB 0,34,0,35,0,50,0,51,1,34,1,35,1,50,1,51
  3686.  DB 16,34,16,35,16,50,16,51,17,34,17,35,17,50,17,51
  3687.  DB 2,0,2,1,2,16,2,17,3,0,3,1,3,16,3,17
  3688.  DB 18,0,18,1,18,16,18,17,19,0,19,1,19,16,19,17
  3689.  DB 2,2,2,3,2,18,2,19,3,2,3,3,3,18,3,19
  3690.  DB 18,2,18,3,18,18,18,19,19,2,19,3,19,18,19,19
  3691.  DB 2,32,2,33,2,48,2,49,3,32,3,33,3,48,3,49
  3692.  DB 18,32,18,33,18,48,18,49,19,32,19,33,19,48,19,49
  3693.  DB 2,34,2,35,2,50,2,51,3,34,3,35,3,50,3,51
  3694.  DB 18,34,18,35,18,50,18,51,19,34,19,35,19,50,19,51
  3695.  DB 32,0,32,1,32,16,32,17,33,0,33,1,33,16,33,17
  3696.  DB 48,0,48,1,48,16,48,17,49,0,49,1,49,16,49,17
  3697.  DB 32,2,32,3,32,18,32,19,33,2,33,3,33,18,33,19
  3698.  DB 48,2,48,3,48,18,48,19,49,2,49,3,49,18,49,19
  3699.  DB 32,32,32,33,32,48,32,49,33,32,33,33,33,48,33,49
  3700.  DB 48,32,48,33,48,48,48,49,49,32,49,33,49,48,49,49
  3701.  DB 32,34,32,35,32,50,32,51,33,34,33,35,33,50,33,51
  3702.  DB 48,34,48,35,48,50,48,51,49,34,49,35,49,50,49,51
  3703.  DB 34,0,34,1,34,16,34,17,35,0,35,1,35,16,35,17
  3704.  DB 50,0,50,1,50,16,50,17,51,0,51,1,51,16,51,17
  3705.  DB 34,2,34,3,34,18,34,19,35,2,35,3,35,18,35,19
  3706.  DB 50,2,50,3,50,18,50,19,51,2,51,3,51,18,51,19
  3707.  DB 34,32,34,33,34,48,34,49,35,32,35,33,35,48,35,49
  3708.  DB 50,32,50,33,50,48,50,49,51,32,51,33,51,48,51,49
  3709.  DB 34,34,34,35,34,50,34,51,35,34,35,35,35,50,35,51
  3710.  DB 50,34,50,35,50,50,50,51,51,34,51,35,51,50,51,51
  3711.  
  3712. LABEL m0cols BYTE
  3713.  DB 0,8,128,136,2,10,130,138,32,40,160,168,34,42,162,170
  3714.  DB 4,12,132,140,6,14,134,142,36,44,164,172,38,46,166,174
  3715.  DB 64,72,192,200,66,74,194,202,96,104,224,232,98,106,226,234
  3716.  DB 68,76,196,204,70,78,198,206,100,108,228,236,102,110,230,238
  3717.  DB 1,9,129,137,3,11,131,139,33,41,161,169,35,43,163,171
  3718.  DB 5,13,133,141,7,15,135,143,37,45,165,173,39,47,167,175
  3719.  DB 65,73,193,201,67,75,195,203,97,105,225,233,99,107,227,235
  3720.  DB 69,77,197,205,71,79,199,207,101,109,229,237,103,111,231,239
  3721.  DB 16,24,144,152,18,26,146,154,48,56,176,184,50,58,178,186
  3722.  DB 20,28,148,156,22,30,150,158,52,60,180,188,54,62,182,190
  3723.  DB 80,88,208,216,82,90,210,218,112,120,240,248,114,122,242,250
  3724.  DB 84,92,212,220,86,94,214,222,116,124,244,252,118,126,246,254
  3725.  DB 17,25,145,153,19,27,147,155,49,57,177,185,51,59,179,187
  3726.  DB 21,29,149,157,23,31,151,159,53,61,181,189,55,63,183,191
  3727.  DB 81,89,209,217,83,91,211,219,113,121,241,249,115,123,243,251
  3728.  DB 85,93,213,221,87,95,215,223,117,125,245,253,119,127,247,255
  3729.  
  3730.     EVEN
  3731.  
  3732.  ; CPC-Ports
  3733.  ; ************************************************ CRTC 6845
  3734.         EVEN
  3735. CRTCregnum  db    ?,?           ; BCxx
  3736. CRTCregs    dw    9 DUP (?)     ; BDxx/BFxx 18 regs of video controller
  3737. crtccareful dw    0             ; set for over-overscan (bytes twice on screen)
  3738. crtcscrwidth db   ?             ; copy of CRTC reg 1
  3739. crtcscrheight db  ?             ; copy of CRTC reg 6
  3740. crtcmaxslin db    ?             ; copy of CRTC reg 9
  3741. crtcsyncpos db    ?             ; copy OF CRTC reg 7
  3742. crtcvgaoff  dw    0ffffh,0ffffh,0ffffh,0h ; which CPC bank goes to which VGA bank
  3743. writevgaoff dw    0ffffh,0ffffh,0ffffh,0ffffh ; same thing, but reflecting RAM banking
  3744. lastdbuf    dw    0             ; to disable double buffering after, say, 10 interrupts or so
  3745. scrbase     dw    0C000h        ; extract from CRTC regs 12/13
  3746. scroff      dw    0             ;  "       "    "    "     "
  3747. oldscroff   dw    0             ; used for scrolling in RethinkCRTC
  3748. scrtype     dw    0             ; 1,2: normal/normal 50Hz; 3: extended
  3749. doublelinmode dw  0             ; active screen uses double lines
  3750. spcrtcflag  dw    0             ;
  3751. CRTCkyfo    dw    0             ; Keep Your Fingers Off - don't modify regs during int
  3752. vgascroll   dw    0             ; circular VGA scroll offset
  3753.  
  3754. videomode   db    0             ; CPC mode 0,1,2 - for fullscr modes only
  3755. newvidmode  db    0             ; change that has not been brought to the screen
  3756. lastmodechg db    0             ; count ints since last mdchg
  3757. multimodeon db    0             ; flag for no multimode set
  3758. modezochgd  dw    0
  3759. modezones   db    0,0,0,0,0,0   ; which mode is active in which zone?
  3760. oldmzones   db    0,0,0,0,0,0
  3761. modeffoff   db    4,3,2,1,0,5
  3762. modeinprogr dw    0
  3763. scradd      dd    0a000fd00h
  3764. mozoctdn    dw    0
  3765. mmintsignal dw    0
  3766.  
  3767. SNSBRedraw  dw    0             ; redraw after setnewscreenbase
  3768.  
  3769.  ; ************************************************ 8255, PSG
  3770.         EVEN
  3771. port8255a   db    ?   ; F4
  3772. port8255b   db    ?   ; F5
  3773. port8255c   db    ?   ; F6
  3774. control8255 db    ?   ; F7
  3775.  
  3776. po8255a     db    ?
  3777. po8255c     db    ?
  3778.  
  3779. psgregnum   db    ?,?
  3780. psgregs     dw    128 DUP (?)
  3781. psgregmod   dw    128 DUP (?)
  3782. PSGcount    dw    0
  3783.  
  3784. prtstate    db    0,0
  3785.  
  3786.  ; ************************************************ GATE ARRAY
  3787.         EVEN
  3788. romnum      dw    ?             ; this is the DFxx port
  3789. rgsgarr     dw    ?             ; 7Fxx 4  regs of gate array
  3790. sysstat     dw    ?   ; 7Fxx this and the last line MUST be kept together
  3791. memstate    db    0,0
  3792. ramstate    db    0,1,2,3,4,5,6,7
  3793.  
  3794. ramstatetab db    0,1,2,3,4,5,6,7
  3795.         db    0,1,2,7,4,5,6,3
  3796.         db    4,5,6,7,0,1,2,3
  3797.         db    0,3,2,7,4,5,6,1
  3798.         db    0,4,2,3,1,5,6,7
  3799.         db    0,5,2,3,4,1,6,7
  3800.         db    0,6,2,3,4,5,1,7
  3801.         db    0,7,2,3,4,5,6,1
  3802.  
  3803. memmap      dw    SEG amsdos,SEG rambase,SEG rambase,SEG rambase
  3804.  
  3805. haveEMM     dw    0
  3806. normramseg  dw    0
  3807. emmha       dw    0
  3808. doingems    dw    0
  3809.  
  3810. garrcols    dw    10 DUP (?)
  3811.  
  3812. CMap        dd    34 DUP (?)
  3813.  
  3814.  ; ************************************************ Interrupts
  3815.         EVEN
  3816. intcount    dw    ?
  3817. intreq      dw    ?
  3818. ffly        dw    ?
  3819. ffcount     dw    ?
  3820. omitnextint dw    0
  3821. resetting   dw    0
  3822. ReDrawCount dw    ?
  3823.  
  3824.  ; ************************************************ cleanup area
  3825. oldintadd   dw    0             ; 86 interrupt torture
  3826. oldintseg   dw    0
  3827. oldnoiadd   dw    0
  3828. oldnoiseg   dw    0
  3829. timercount  dw    0
  3830. timerval    dw    0f84h
  3831. OldVideo    dw    3
  3832.  
  3833. ffly_dec_std dw   2
  3834. ffly_dec     dw   0
  3835.  
  3836. ENDS
  3837.  
  3838. SEGMENT _stack PARA STACK 'STACK'
  3839.  
  3840. TapeBuffer  dw    800h DUP (?)
  3841. TapeLoadBuf dw    800h DUP (?)
  3842.  
  3843. stck    dw 1000 dup (?)
  3844. stckend dw ?
  3845.  
  3846. ENDS
  3847.  
  3848. SEGMENT SEGSCROFF PRIVATE PARA
  3849. Scrofftab dw    4000H DUP (?)
  3850. ENDS
  3851. SEGMENT SEGRAM PRIVATE PARA USE32
  3852. rambase db      65536 DUP (?)
  3853. ENDS
  3854. SEGMENT SEGHIRAM PRIVATE PARA USE32
  3855. hiram   db      65536 DUP (?)
  3856. ENDS
  3857. SEGMENT SEGLOROM PRIVATE PARA
  3858. amsdos  db      16386 DUP (?)
  3859. ENDS
  3860. SEGMENT SEGBASIC PRIVATE PARA
  3861. basic   db      16386 DUP (?)
  3862. ENDS
  3863. SEGMENT SEGROM7 PRIVATE PARA
  3864. rom7    db      16386 DUP (?)
  3865. ENDS
  3866.  
  3867. SEGMENT SEGADCONV PRIVATE PARA
  3868. ScrAdConv dw 4000H DUP (?)
  3869. ByteMode  dw 4000H DUP (?)
  3870. ENDS
  3871.  
  3872. SEGMENT SEGADLIST PRIVATE PARA
  3873. ScrAdList dw 800H DUP (?)
  3874. ENDS
  3875.     END
  3876.